mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 04:50:52 +08:00
117 lines
4.1 KiB
Go
117 lines
4.1 KiB
Go
// 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
|
|
)
|
|
|
|
// String returns the string representation of ThinkingMode.
|
|
func (m ThinkingMode) String() string {
|
|
switch m {
|
|
case ModeBudget:
|
|
return "budget"
|
|
case ModeLevel:
|
|
return "level"
|
|
case ModeNone:
|
|
return "none"
|
|
case ModeAuto:
|
|
return "auto"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|
|
|
|
// 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)
|
|
}
|