drone/genai/genai.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:"pipeline_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/platform"
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
}