drone/app/api/controller/capabilities/run_capabilities.go

78 lines
2.3 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 capabilities
import (
"context"
"fmt"
"github.com/harness/gitness/types/capabilities"
)
type ContextID string
type RunCapabilitiesRequest struct {
ConversationRaw string `json:"conversation_raw"`
ConversationID ContextID `json:"conversation_id"`
CapabilitiesToRun []CapabilityRunRequest `json:"capabilities_to_run"`
}
type CapabilityRunRequest struct {
CallID string `json:"call_id"`
Type capabilities.Type `json:"type"`
Input capabilities.Input `json:"input"`
}
type CapabilityExecution struct {
Type capabilities.Type `json:"capability_id"`
Result capabilities.Output `json:"result"`
ReturnToUser bool `json:"return_to_user"`
}
func (c CapabilityExecution) GetType() capabilities.AIContextPayloadType {
return "other"
}
type CapabilityRunResponse struct {
CapabilitiesRan []CapabilityExecution `json:"capabilities_ran"`
}
func (c *Controller) RunCapabilities(ctx context.Context, req *RunCapabilitiesRequest) (*CapabilityRunResponse, error) {
capOut := new(CapabilityRunResponse)
capOut.CapabilitiesRan = []CapabilityExecution{}
for _, value := range req.CapabilitiesToRun {
if !c.Capabilities.Exists(value.Type) {
return nil, fmt.Errorf("capability %s does not exist", value.Type)
}
resp, err := c.Capabilities.Execute(ctx, value.Type, value.Input)
if err != nil {
return nil, err
}
returnToUser, err := c.Capabilities.ReturnToUser(value.Type)
if err != nil {
return nil, err
}
capOut.CapabilitiesRan = append(capOut.CapabilitiesRan, CapabilityExecution{
Type: value.Type,
Result: resp,
ReturnToUser: returnToUser,
})
}
return capOut, nil
}