Documentation
¶
Overview ¶
Package apiattempt defines Generic API execution contracts independently from the existing LLM attempt contracts.
Index ¶
Constants ¶
const ( APIProtocolHTTP = models.APIProtocolHTTP APIProtocolWebSocket = models.APIProtocolWebSocket MaxRateLimitHits = 64 MaxRateLimitHitNameBytes = models.MaxRateLimitHitNameBytes MaxRateLimitDimensionBytes = 64 MaxRateLimitBucketBytes = 256 MaxRateLimitReasonBytes = 256 MaxTraceBodyBytes = 16 * 1024 * 1024 MaxAPIErrorMessageBytes = 1024 )
Variables ¶
var ( ErrAPIResultTooLarge = errors.New("generic API execution result too large") ErrInvalidExecutionResult = errors.New("invalid generic API execution result") )
Functions ¶
func EncodeResultJSONWithin ¶
func EncodeResultJSONWithin(result APIExecutionResult, maxBytes int) ([]byte, error)
Types ¶
type APIAttemptMeta ¶
type APIAttemptMeta struct {
APIServiceID uint `json:"api_service_id"`
APIRouteID uint `json:"api_route_id"`
UserID uint `json:"user_id,omitempty"`
GroupID uint `json:"group_id,omitempty"`
TokenID uint `json:"token_id,omitempty"`
Protocol APIProtocol `json:"protocol"`
Method string `json:"method"`
Subpath string `json:"subpath,omitempty"`
RawQuery string `json:"raw_query,omitempty"`
RequestTrailerKeys []string `json:"request_trailer_keys,omitempty"`
TracePolicy APITracePolicy `json:"trace_policy,omitempty"`
}
type APIBodyCapture ¶
type APIBodyCapture struct {
Captured bool `json:"captured"`
Status string `json:"status,omitempty"`
SkipReason string `json:"skip_reason,omitempty"`
Data string `json:"data,omitempty"`
CapturedBytes int64 `json:"captured_bytes,omitempty"`
TotalBytes int64 `json:"total_bytes,omitempty"`
Truncated bool `json:"truncated,omitempty"`
}
type APIExecutionResult ¶
type APIExecutionResult struct {
APIUpstreamID uint `json:"api_upstream_id,omitempty"`
APIUpstreamName string `json:"api_upstream_name,omitempty"`
UpstreamStatus int `json:"upstream_status,omitempty"`
ProviderDispatchKnown bool `json:"provider_dispatch_known"`
ProviderDispatched bool `json:"provider_dispatched"`
RequestBytes int64 `json:"request_bytes,omitempty"`
ResponseBytes int64 `json:"response_bytes,omitempty"`
FirstByteMs int `json:"first_byte_ms,omitempty"`
WebSocketCloseCode int `json:"websocket_close_code,omitempty"`
ErrorStage string `json:"error_stage,omitempty"`
ErrorCode string `json:"error_code,omitempty"`
ErrorMessage string `json:"error_message,omitempty"`
RateLimitDecision string `json:"rate_limit_decision,omitempty"`
RateLimitWaitMs int `json:"rate_limit_wait_ms,omitempty"`
RateLimitReason string `json:"rate_limit_reason,omitempty"`
RateLimitHits []models.RateLimitHit `json:"rate_limit_hits,omitempty"`
RateLimitHitTotal int `json:"rate_limit_hit_total,omitempty"`
RateLimitHitsTruncated bool `json:"rate_limit_hits_truncated,omitempty"`
Trace *APIExecutionTrace `json:"trace,omitempty"`
}
func DecodeResultJSONWithin ¶
func DecodeResultJSONWithin(payload []byte, maxBytes int) (APIExecutionResult, error)
func NormalizeRateLimitResult ¶
func NormalizeRateLimitResult(result APIExecutionResult) APIExecutionResult
NormalizeRateLimitResult deep-clones, stably orders, and bounds limiter hits. Total counts every observed hit, including records omitted by the fixed cap.
func (APIExecutionResult) Slim ¶
func (result APIExecutionResult) Slim(maxBytes int) (APIExecutionResult, error)
Slim returns a deep-cloned result whose final JSON encoding fits maxBytes. It reduces body data before non-essential header values and never removes the top-level dispatch, error, byte, status, or correlation facts.
func (APIExecutionResult) Validate ¶
func (result APIExecutionResult) Validate() error
type APIExecutionTrace ¶
type APIExecutionTrace struct {
SourceRequestHeaders map[string][]string `json:"source_request_headers,omitempty"`
SourceRequestTrailers map[string][]string `json:"source_request_trailers,omitempty"`
SourceRequestHeadersTruncated bool `json:"source_request_headers_truncated,omitempty"`
SourceRequestTrailersTruncated bool `json:"source_request_trailers_truncated,omitempty"`
SourceRequestBody *APIBodyCapture `json:"source_request_body,omitempty"`
RequestHeaders map[string][]string `json:"request_headers,omitempty"`
RequestTrailers map[string][]string `json:"request_trailers,omitempty"`
ResponseHeaders map[string][]string `json:"response_headers,omitempty"`
ResponseTrailers map[string][]string `json:"response_trailers,omitempty"`
RequestHeadersTruncated bool `json:"request_headers_truncated,omitempty"`
RequestTrailersTruncated bool `json:"request_trailers_truncated,omitempty"`
ResponseHeadersTruncated bool `json:"response_headers_truncated,omitempty"`
ResponseTrailersTruncated bool `json:"response_trailers_truncated,omitempty"`
RequestBody *APIBodyCapture `json:"request_body,omitempty"`
ResponseBody *APIBodyCapture `json:"response_body,omitempty"`
}
APIExecutionTrace carries bounded Source-ingress and execution-side HTTP capture facts. Only the Source Agent may populate SourceRequest* fields.
type APIProtocol ¶
type APIProtocol = models.APIProtocol
type APITraceMode ¶
type APITraceMode string
const ( APITraceModeOff APITraceMode = "off" APITraceModeHeaders APITraceMode = "headers" APITraceModeFull APITraceMode = "full" )
type APITracePolicy ¶
type APITracePolicy struct {
Mode APITraceMode `json:"mode"`
MaxBodyBytes int `json:"max_body_bytes"`
}
APITracePolicy is frozen by the Source Agent before dispatch. The Execution Agent must consume this value directly and must not reload Token policy.
func (APITracePolicy) Valid ¶
func (policy APITracePolicy) Valid() bool