// Package thinking provides unified thinking configuration processing. // // This package offers a unified interface for parsing, validating, and applying // thinking configurations across various AI providers (Claude, Gemini, OpenAI, iFlow). package thinking import "github.com/router-for-me/CLIProxyAPI/v6/internal/registry" // ThinkingMode represents the type of thinking configuration mode. type ThinkingMode int const ( // ModeBudget indicates using a numeric budget (corresponds to suffix "(1000)" etc.) ModeBudget ThinkingMode = iota // ModeLevel indicates using a discrete level (corresponds to suffix "(high)" etc.) ModeLevel // ModeNone indicates thinking is disabled (corresponds to suffix "(none)" or budget=0) ModeNone // ModeAuto indicates automatic/dynamic thinking (corresponds to suffix "(auto)" or budget=-1) ModeAuto ) // ThinkingLevel represents a discrete thinking level. type ThinkingLevel string const ( // LevelNone disables thinking LevelNone ThinkingLevel = "none" // LevelAuto enables automatic/dynamic thinking LevelAuto ThinkingLevel = "auto" // LevelMinimal sets minimal thinking effort LevelMinimal ThinkingLevel = "minimal" // LevelLow sets low thinking effort LevelLow ThinkingLevel = "low" // LevelMedium sets medium thinking effort LevelMedium ThinkingLevel = "medium" // LevelHigh sets high thinking effort LevelHigh ThinkingLevel = "high" // LevelXHigh sets extra-high thinking effort LevelXHigh ThinkingLevel = "xhigh" ) // ThinkingConfig represents a unified thinking configuration. // // This struct is used to pass thinking configuration information between components. // Depending on Mode, either Budget or Level field is effective: // - ModeNone: Budget=0, Level is ignored // - ModeAuto: Budget=-1, Level is ignored // - ModeBudget: Budget is a positive integer, Level is ignored // - ModeLevel: Budget is ignored, Level is a valid level type ThinkingConfig struct { // Mode specifies the configuration mode Mode ThinkingMode // Budget is the thinking budget (token count), only effective when Mode is ModeBudget. // Special values: 0 means disabled, -1 means automatic Budget int // Level is the thinking level, only effective when Mode is ModeLevel Level ThinkingLevel } // SuffixResult represents the result of parsing a model name for thinking suffix. // // A thinking suffix is specified in the format model-name(value), where value // can be a numeric budget (e.g., "16384") or a level name (e.g., "high"). type SuffixResult struct { // ModelName is the model name with the suffix removed. // If no suffix was found, this equals the original input. ModelName string // HasSuffix indicates whether a valid suffix was found. HasSuffix bool // RawSuffix is the content inside the parentheses, without the parentheses. // Empty string if HasSuffix is false. RawSuffix string } // ProviderApplier defines the interface for provider-specific thinking configuration application. // // Types implementing this interface are responsible for converting a unified ThinkingConfig // into provider-specific format and applying it to the request body. // // Implementation requirements: // - Apply method must be idempotent // - Must not modify the input config or modelInfo // - Returns a modified copy of the request body // - Returns appropriate ThinkingError for unsupported configurations type ProviderApplier interface { // Apply applies the thinking configuration to the request body. // // Parameters: // - body: Original request body JSON // - config: Unified thinking configuration // - modelInfo: Model registry information containing ThinkingSupport properties // // Returns: // - Modified request body JSON // - ThinkingError if the configuration is invalid or unsupported Apply(body []byte, config ThinkingConfig, modelInfo *registry.ModelInfo) ([]byte, error) }