Files
tutti/services/tuttid/api/daemon_model_bindings.go
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

111 lines
4.8 KiB
Go

package api
import (
"context"
"errors"
tuttigenerated "github.com/tutti-os/tutti/services/tuttid/api/generated"
"github.com/tutti-os/tutti/services/tuttid/apierrors"
modelbindingbiz "github.com/tutti-os/tutti/services/tuttid/biz/modelbinding"
workspacedata "github.com/tutti-os/tutti/services/tuttid/data/workspace"
modelbindingservice "github.com/tutti-os/tutti/services/tuttid/service/modelbinding"
)
type AgentModelBindingService interface {
ListBindings(ctx context.Context, workspaceID string) ([]modelbindingbiz.Binding, error)
SetBinding(ctx context.Context, input modelbindingservice.SetBindingInput) (modelbindingbiz.Binding, error)
}
func (api DaemonAPI) ListAgentModelBindings(ctx context.Context, request tuttigenerated.ListAgentModelBindingsRequestObject) (tuttigenerated.ListAgentModelBindingsResponseObject, error) {
if api.AgentModelBindingService == nil {
return tuttigenerated.ListAgentModelBindings503JSONResponse{
ServiceUnavailableErrorJSONResponse: modelBindingServiceUnavailable(),
}, nil
}
bindings, err := api.AgentModelBindingService.ListBindings(ctx, request.WorkspaceID)
if err != nil {
return tuttigenerated.ListAgentModelBindings502JSONResponse{
WorkspaceOperationErrorJSONResponse: workspaceOperationError(apierrors.WorkspaceOperationFailed(apierrors.WithCause(err))),
}, nil
}
response := tuttigenerated.ListAgentModelBindingsResponse{Bindings: make([]tuttigenerated.AgentModelBinding, 0, len(bindings))}
for _, binding := range bindings {
response.Bindings = append(response.Bindings, generatedAgentModelBinding(binding))
}
return tuttigenerated.ListAgentModelBindings200JSONResponse(response), nil
}
func (api DaemonAPI) SetAgentModelBinding(ctx context.Context, request tuttigenerated.SetAgentModelBindingRequestObject) (tuttigenerated.SetAgentModelBindingResponseObject, error) {
if api.AgentModelBindingService == nil {
return tuttigenerated.SetAgentModelBinding503JSONResponse{
ServiceUnavailableErrorJSONResponse: modelBindingServiceUnavailable(),
}, nil
}
if request.Body == nil {
return tuttigenerated.SetAgentModelBinding400JSONResponse{
InvalidRequestErrorJSONResponse: invalidRequestError(apierrors.EmptyBody()),
}, nil
}
binding, err := api.AgentModelBindingService.SetBinding(ctx, modelbindingservice.SetBindingInput{
WorkspaceID: request.WorkspaceID,
AgentTargetID: request.AgentTargetID,
ModelPlanID: stringValue(request.Body.ModelPlanId),
DefaultModel: stringValue(request.Body.DefaultModel),
ModelPolicyID: stringValue(request.Body.ModelPolicyId),
})
if err != nil {
switch {
case errors.Is(err, workspacedata.ErrAgentTargetNotFound):
return tuttigenerated.SetAgentModelBinding404JSONResponse{
AgentTargetNotFoundErrorJSONResponse: agentTargetNotFoundError(),
}, nil
case errors.Is(err, modelbindingservice.ErrInvalidBindingInput),
errors.Is(err, modelbindingservice.ErrPlanNotUsable),
errors.Is(err, modelbindingservice.ErrModelNotInPlan),
errors.Is(err, modelbindingservice.ErrPolicyNotUsable),
errors.Is(err, modelbindingservice.ErrBindingReferenceUnusable):
return tuttigenerated.SetAgentModelBinding400JSONResponse{
InvalidRequestErrorJSONResponse: invalidRequestError(apierrors.InvalidRequest("invalid_agent_model_binding", apierrors.WithDeveloperMessage(err.Error()))),
}, nil
}
return tuttigenerated.SetAgentModelBinding502JSONResponse{
WorkspaceOperationErrorJSONResponse: workspaceOperationError(apierrors.WorkspaceOperationFailed(apierrors.WithCause(err))),
}, nil
}
return tuttigenerated.SetAgentModelBinding200JSONResponse(generatedAgentModelBinding(binding)), nil
}
func generatedAgentModelBinding(binding modelbindingbiz.Binding) tuttigenerated.AgentModelBinding {
result := tuttigenerated.AgentModelBinding{
WorkspaceId: binding.WorkspaceID,
AgentTargetId: binding.AgentTargetID,
}
if binding.ModelPlanID != "" {
result.ModelPlanId = stringPointer(binding.ModelPlanID)
}
if binding.DefaultModel != "" {
result.DefaultModel = stringPointer(binding.DefaultModel)
}
if binding.ModelPolicyID != "" {
result.ModelPolicyId = stringPointer(binding.ModelPolicyID)
}
if !binding.UpdatedAt.IsZero() {
updatedAt := binding.UpdatedAt
result.UpdatedAt = &updatedAt
}
return result
}
func agentTargetNotFoundError() tuttigenerated.AgentTargetNotFoundErrorJSONResponse {
return tuttigenerated.AgentTargetNotFoundErrorJSONResponse(protocolErrorResponse(
apierrors.New(404, tuttigenerated.AgentTargetNotFound, "agent_target_not_found", apierrors.WithDeveloperMessage("agent target not found")),
))
}
func modelBindingServiceUnavailable() tuttigenerated.ServiceUnavailableErrorJSONResponse {
return serviceUnavailableError(apierrors.ServiceUnavailable(
"agent_model_binding_service_unavailable",
apierrors.WithDeveloperMessage("agent model binding service is unavailable"),
))
}