| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package billingexpr
- import (
- "crypto/sha256"
- "fmt"
- )
- type RequestInput struct {
- Headers map[string]string
- Body []byte
- }
- // TokenParams holds all token dimensions passed into an Expr evaluation.
- // Fields beyond P and C are optional — when absent they default to 0,
- // which means cache-unaware expressions keep working unchanged.
- type TokenParams struct {
- P float64 // prompt tokens (text)
- C float64 // completion tokens (text)
- CR float64 // cache read (hit) tokens
- CC float64 // cache creation tokens (5-min TTL for Claude, generic for others)
- CC1h float64 // cache creation tokens — 1-hour TTL (Claude only)
- Img float64 // image input tokens
- ImgO float64 // image output tokens
- AI float64 // audio input tokens
- AO float64 // audio output tokens
- }
- // TraceResult holds side-channel info captured by the tier() function
- // during Expr execution. This replaces the old Breakdown mechanism —
- // the Expr itself is the single source of truth for billing logic.
- type TraceResult struct {
- MatchedTier string `json:"matched_tier"`
- Cost float64 `json:"cost"`
- }
- // BillingSnapshot captures the billing rule state frozen at pre-consume time.
- // It is fully serializable and contains no compiled program pointers.
- type BillingSnapshot struct {
- BillingMode string `json:"billing_mode"`
- ModelName string `json:"model_name"`
- ExprString string `json:"expr_string"`
- ExprHash string `json:"expr_hash"`
- GroupRatio float64 `json:"group_ratio"`
- EstimatedPromptTokens int `json:"estimated_prompt_tokens"`
- EstimatedCompletionTokens int `json:"estimated_completion_tokens"`
- EstimatedQuotaBeforeGroup float64 `json:"estimated_quota_before_group"`
- EstimatedQuotaAfterGroup int `json:"estimated_quota_after_group"`
- EstimatedTier string `json:"estimated_tier"`
- QuotaPerUnit float64 `json:"quota_per_unit"`
- ExprVersion int `json:"expr_version"`
- }
- // TieredResult holds everything needed after running tiered settlement.
- type TieredResult struct {
- ActualQuotaBeforeGroup float64 `json:"actual_quota_before_group"`
- ActualQuotaAfterGroup int `json:"actual_quota_after_group"`
- MatchedTier string `json:"matched_tier"`
- CrossedTier bool `json:"crossed_tier"`
- }
- // ExprHashString returns the SHA-256 hex digest of an expression string.
- func ExprHashString(expr string) string {
- h := sha256.Sum256([]byte(expr))
- return fmt.Sprintf("%x", h)
- }
|