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
146 lines
5.7 KiB
Go
146 lines
5.7 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"strings"
|
|
|
|
tuttigenerated "github.com/tutti-os/tutti/services/tuttid/api/generated"
|
|
"github.com/tutti-os/tutti/services/tuttid/apierrors"
|
|
workspacedata "github.com/tutti-os/tutti/services/tuttid/data/workspace"
|
|
agentextensionservice "github.com/tutti-os/tutti/services/tuttid/service/agentextension"
|
|
)
|
|
|
|
type AgentTargetAccountUsageService interface {
|
|
Probe(context.Context, string) (agentextensionservice.AccountUsageResult, error)
|
|
}
|
|
|
|
func (api DaemonAPI) ProbeAgentTargetAccountUsage(
|
|
ctx context.Context,
|
|
request tuttigenerated.ProbeAgentTargetAccountUsageRequestObject,
|
|
) (tuttigenerated.ProbeAgentTargetAccountUsageResponseObject, error) {
|
|
if api.AgentTargetAccountUsage == nil {
|
|
return tuttigenerated.ProbeAgentTargetAccountUsage503JSONResponse{
|
|
ServiceUnavailableErrorJSONResponse: serviceUnavailableError(
|
|
apierrors.ServiceUnavailable(
|
|
"agent_target_account_usage_unavailable",
|
|
apierrors.WithDeveloperMessage("agent target account usage service is unavailable"),
|
|
),
|
|
),
|
|
}, nil
|
|
}
|
|
if strings.TrimSpace(request.AgentTargetID) == "" {
|
|
return invalidAgentTargetAccountUsageRequest(), nil
|
|
}
|
|
result, err := api.AgentTargetAccountUsage.Probe(ctx, request.AgentTargetID)
|
|
if err != nil {
|
|
switch {
|
|
case errors.Is(err, workspacedata.ErrAgentTargetNotFound):
|
|
return tuttigenerated.ProbeAgentTargetAccountUsage404JSONResponse{
|
|
AgentTargetNotFoundErrorJSONResponse: agentTargetNotFoundError(),
|
|
}, nil
|
|
case errors.Is(err, agentextensionservice.ErrInvalidAccountUsageTarget):
|
|
return invalidAgentTargetAccountUsageRequest(), nil
|
|
default:
|
|
return tuttigenerated.ProbeAgentTargetAccountUsage503JSONResponse{
|
|
ServiceUnavailableErrorJSONResponse: serviceUnavailableError(
|
|
apierrors.ServiceUnavailable(
|
|
"agent_target_account_usage_unavailable",
|
|
apierrors.WithCause(err),
|
|
),
|
|
),
|
|
}, nil
|
|
}
|
|
}
|
|
projected, err := projectAgentTargetAccountUsage(result)
|
|
if err != nil {
|
|
return tuttigenerated.ProbeAgentTargetAccountUsage503JSONResponse{
|
|
ServiceUnavailableErrorJSONResponse: serviceUnavailableError(
|
|
apierrors.ServiceUnavailable(
|
|
"agent_target_account_usage_projection_failed",
|
|
apierrors.WithCause(err),
|
|
),
|
|
),
|
|
}, nil
|
|
}
|
|
return tuttigenerated.ProbeAgentTargetAccountUsage200JSONResponse(projected), nil
|
|
}
|
|
|
|
func projectAgentTargetAccountUsage(
|
|
result agentextensionservice.AccountUsageResult,
|
|
) (tuttigenerated.AgentTargetAccountUsageProbeResult, error) {
|
|
var projected tuttigenerated.AgentTargetAccountUsageProbeResult
|
|
switch result.Outcome {
|
|
case "available":
|
|
quotas := make([]tuttigenerated.AgentTargetAccountUsageQuota, 0, len(result.Quotas))
|
|
for _, quota := range result.Quotas {
|
|
value := tuttigenerated.AgentTargetAccountUsageQuota{
|
|
QuotaType: tuttigenerated.AgentTargetAccountUsageQuotaType(quota.QuotaType),
|
|
PercentRemaining: float32(quota.PercentRemaining),
|
|
ResetsAtUnixMs: quota.ResetsAtUnixMS,
|
|
}
|
|
if quota.AmountRemaining != nil {
|
|
amountRemaining := *quota.AmountRemaining
|
|
value.AmountRemaining = &amountRemaining
|
|
}
|
|
if quota.AmountLimit != nil {
|
|
amountLimit := *quota.AmountLimit
|
|
value.AmountLimit = &amountLimit
|
|
}
|
|
if quota.AmountUnit != "" {
|
|
amountUnit := tuttigenerated.AgentTargetAccountUsageQuotaAmountUnit(quota.AmountUnit)
|
|
value.AmountUnit = &amountUnit
|
|
}
|
|
if quota.ModelName != "" {
|
|
modelName := quota.ModelName
|
|
value.ModelName = &modelName
|
|
}
|
|
quotas = append(quotas, value)
|
|
}
|
|
err := projected.FromAgentTargetAccountUsageAvailableResult(
|
|
tuttigenerated.AgentTargetAccountUsageAvailableResult{
|
|
SchemaVersion: tuttigenerated.AgentTargetAccountUsageAvailableResultSchemaVersion(agentextensionservice.AccountUsageSchemaVersion),
|
|
AgentTargetId: result.AgentTargetID, Provider: tuttigenerated.AgentTargetProvider(result.Provider),
|
|
Outcome: tuttigenerated.AgentTargetAccountUsageAvailableResultOutcomeAvailable,
|
|
CapturedAtUnixMs: result.CapturedAtUnixMS,
|
|
BillingMode: tuttigenerated.AgentTargetAccountUsageBillingMode(result.BillingMode),
|
|
QuotaState: tuttigenerated.AgentTargetAccountUsageQuotaState(result.QuotaState), Quotas: quotas,
|
|
},
|
|
)
|
|
return projected, err
|
|
case "unsupported":
|
|
err := projected.FromAgentTargetAccountUsageUnsupportedResult(
|
|
tuttigenerated.AgentTargetAccountUsageUnsupportedResult{
|
|
SchemaVersion: tuttigenerated.AgentTargetAccountUsageUnsupportedResultSchemaVersion(agentextensionservice.AccountUsageSchemaVersion),
|
|
AgentTargetId: result.AgentTargetID, Provider: tuttigenerated.AgentTargetProvider(result.Provider),
|
|
Outcome: tuttigenerated.Unsupported, CapturedAtUnixMs: result.CapturedAtUnixMS,
|
|
},
|
|
)
|
|
return projected, err
|
|
case "error":
|
|
err := projected.FromAgentTargetAccountUsageErrorResult(
|
|
tuttigenerated.AgentTargetAccountUsageErrorResult{
|
|
SchemaVersion: tuttigenerated.AgentTargetAccountUsageErrorResultSchemaVersion(agentextensionservice.AccountUsageSchemaVersion),
|
|
AgentTargetId: result.AgentTargetID, Provider: tuttigenerated.AgentTargetProvider(result.Provider),
|
|
Outcome: tuttigenerated.AgentTargetAccountUsageErrorResultOutcomeError,
|
|
CapturedAtUnixMs: result.CapturedAtUnixMS,
|
|
ErrorCode: tuttigenerated.AgentTargetAccountUsageErrorCode(result.ErrorCode),
|
|
},
|
|
)
|
|
return projected, err
|
|
default:
|
|
return projected, errors.New("account usage outcome is invalid")
|
|
}
|
|
}
|
|
|
|
func invalidAgentTargetAccountUsageRequest() tuttigenerated.ProbeAgentTargetAccountUsage400JSONResponse {
|
|
return tuttigenerated.ProbeAgentTargetAccountUsage400JSONResponse{
|
|
InvalidRequestErrorJSONResponse: invalidRequestError(
|
|
apierrors.InvalidRequest(
|
|
"invalid_agent_target_account_usage_request",
|
|
apierrors.WithDeveloperMessage("agent target id is required"),
|
|
),
|
|
),
|
|
}
|
|
}
|