mirror of https://github.com/harness/drone.git
115 lines
3.1 KiB
Go
115 lines
3.1 KiB
Go
// Copyright 2023 Harness, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package genai
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
|
|
capabilitiesctrl "github.com/harness/gitness/app/api/controller/capabilities"
|
|
capabilitieshandler "github.com/harness/gitness/app/api/handler/capabilities"
|
|
"github.com/harness/gitness/app/services/capabilities"
|
|
capabilities2 "github.com/harness/gitness/types/capabilities"
|
|
)
|
|
|
|
const (
|
|
AIFoundationServiceToken = "AI_FOUNDATION_SERVICE_TOKEN"
|
|
)
|
|
|
|
func GenerateAIContext(payloads ...capabilities2.AIContextPayload) []capabilities2.AIContext {
|
|
out := make([]capabilities2.AIContext, len(payloads))
|
|
for i := range payloads {
|
|
out[i] = capabilities2.AIContext{
|
|
Type: payloads[i].GetType(),
|
|
Payload: payloads[i],
|
|
Name: payloads[i].GetName(),
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
type PipelineContext struct {
|
|
Yaml string `json:"yaml"`
|
|
}
|
|
|
|
func (c PipelineContext) GetName() string {
|
|
return "pipeline_context"
|
|
}
|
|
|
|
const AIContextPayloadTypePipelineContext capabilities2.AIContextPayloadType = "other"
|
|
|
|
func (PipelineContext) GetType() capabilities2.AIContextPayloadType {
|
|
return AIContextPayloadTypePipelineContext
|
|
}
|
|
|
|
type RepoRef struct {
|
|
Ref string `json:"ref"`
|
|
}
|
|
|
|
func (r RepoRef) GetName() string {
|
|
return "repo_ref"
|
|
}
|
|
|
|
const AIContextPayloadTypeRepoRef capabilities2.AIContextPayloadType = "other"
|
|
|
|
func (RepoRef) GetType() capabilities2.AIContextPayloadType {
|
|
return AIContextPayloadTypeRepoRef
|
|
}
|
|
|
|
type ChatRequest struct {
|
|
Prompt string `json:"prompt"`
|
|
ConversationID string `json:"conversation_id"`
|
|
ConversationRaw string `json:"conversation_raw"`
|
|
Context []capabilities2.AIContext `json:"context"`
|
|
Capabilities []capabilities2.CapabilityReference `json:"capabilities"`
|
|
}
|
|
|
|
func CallAIFoundation(ctx context.Context, cr *capabilities.Registry,
|
|
req *ChatRequest) (*capabilitiesctrl.RunCapabilitiesRequest, error) {
|
|
url := "http://localhost:8000/chat/gitness"
|
|
|
|
jsonData, err := json.Marshal(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
newReq, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewBuffer(jsonData))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
newReq.Header.Add("Authorization", "Bearer "+os.Getenv(AIFoundationServiceToken))
|
|
|
|
client := http.DefaultClient
|
|
resp, err := client.Do(newReq)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
data, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
in, err := capabilitieshandler.UnmarshalRunCapabilitiesRequest(cr, data)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return in, nil
|
|
}
|