package access import ( "context" "time" "sub2api-cn-relay-manager/internal/host/sub2api" ) const ( ModeSubscription = "subscription" ModeSelfService = "self_service" ProbeKeySourceRequestedProbeAPIKey = "requested_probe_api_key" ProbeKeySourceManagedSubscription = "managed_subscription" gatewayCompletionRetryAttempts = 3 gatewayCompletionRetryDelay = 300 * time.Millisecond ) type SubscriptionTarget struct { UserID string DurationDays int } type ClosureRequest struct { Mode string ProbeAPIKey string Subscriptions []SubscriptionTarget GroupID string AccountIDs []string ExpectedModel string Prompt string MaxTokens int ResponsesCapabilitySuspect bool } type Host interface { EnsureSubscriptionAccess(ctx context.Context, req sub2api.EnsureSubscriptionAccessRequest) (sub2api.SubscriptionAccessRef, error) AssignSubscription(ctx context.Context, req sub2api.AssignSubscriptionRequest) (sub2api.SubscriptionRef, error) CheckGatewayAccess(ctx context.Context, req sub2api.GatewayAccessCheckRequest) (sub2api.GatewayAccessResult, error) CheckGatewayCompletion(ctx context.Context, req sub2api.GatewayCompletionCheckRequest) (sub2api.GatewayCompletionResult, error) DisableOpenAIResponsesAPI(ctx context.Context, accountIDs []string) error ClearTempUnschedulable(ctx context.Context, accountIDs []string) error } type Service struct { host Host } func NewService(host Host) *Service { return &Service{host: host} }