Files
tutti/services/tuttid/api/daemon_agent_target_account_usage.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

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"),
),
),
}
}