mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-09-05 08:10:14 +00:00
115 lines
3.2 KiB
TypeScript
115 lines
3.2 KiB
TypeScript
import {
|
|
type ModelInfo,
|
|
type ProviderSettings,
|
|
ANTHROPIC_DEFAULT_MAX_TOKENS,
|
|
CLAUDE_CODE_DEFAULT_MAX_OUTPUT_TOKENS,
|
|
} from "@roo-code/types"
|
|
|
|
// ApiHandlerOptions
|
|
|
|
export type ApiHandlerOptions = Omit<ProviderSettings, "apiProvider">
|
|
|
|
// RouterName
|
|
|
|
const routerNames = ["openrouter", "requesty", "glama", "unbound", "litellm", "ollama", "lmstudio"] as const
|
|
|
|
export type RouterName = (typeof routerNames)[number]
|
|
|
|
export const isRouterName = (value: string): value is RouterName => routerNames.includes(value as RouterName)
|
|
|
|
export function toRouterName(value?: string): RouterName {
|
|
if (value && isRouterName(value)) {
|
|
return value
|
|
}
|
|
|
|
throw new Error(`Invalid router name: ${value}`)
|
|
}
|
|
|
|
// RouterModels
|
|
|
|
export type ModelRecord = Record<string, ModelInfo>
|
|
|
|
export type RouterModels = Record<RouterName, ModelRecord>
|
|
|
|
// Reasoning
|
|
|
|
export const shouldUseReasoningBudget = ({
|
|
model,
|
|
settings,
|
|
}: {
|
|
model: ModelInfo
|
|
settings?: ProviderSettings
|
|
}): boolean => !!model.requiredReasoningBudget || (!!model.supportsReasoningBudget && !!settings?.enableReasoningEffort)
|
|
|
|
export const shouldUseReasoningEffort = ({
|
|
model,
|
|
settings,
|
|
}: {
|
|
model: ModelInfo
|
|
settings?: ProviderSettings
|
|
}): boolean => (!!model.supportsReasoningEffort && !!settings?.reasoningEffort) || !!model.reasoningEffort
|
|
|
|
export const DEFAULT_HYBRID_REASONING_MODEL_MAX_TOKENS = 16_384
|
|
export const DEFAULT_HYBRID_REASONING_MODEL_THINKING_TOKENS = 8_192
|
|
|
|
// Max Tokens
|
|
|
|
export const getModelMaxOutputTokens = ({
|
|
modelId,
|
|
model,
|
|
settings,
|
|
format,
|
|
}: {
|
|
modelId: string
|
|
model: ModelInfo
|
|
settings?: ProviderSettings
|
|
format?: "anthropic" | "openai" | "gemini" | "openrouter"
|
|
}): number | undefined => {
|
|
// Check for Claude Code specific max output tokens setting
|
|
if (settings?.apiProvider === "claude-code") {
|
|
return settings.claudeCodeMaxOutputTokens || CLAUDE_CODE_DEFAULT_MAX_OUTPUT_TOKENS
|
|
}
|
|
|
|
if (shouldUseReasoningBudget({ model, settings })) {
|
|
return settings?.modelMaxTokens || DEFAULT_HYBRID_REASONING_MODEL_MAX_TOKENS
|
|
}
|
|
|
|
const isAnthropicContext =
|
|
modelId.includes("claude") ||
|
|
format === "anthropic" ||
|
|
(format === "openrouter" && modelId.startsWith("anthropic/"))
|
|
|
|
// For "Hybrid" reasoning models, discard the model's actual maxTokens for Anthropic contexts
|
|
if (model.supportsReasoningBudget && isAnthropicContext) {
|
|
return ANTHROPIC_DEFAULT_MAX_TOKENS
|
|
}
|
|
|
|
// For Anthropic contexts, always ensure a maxTokens value is set
|
|
if (isAnthropicContext && (!model.maxTokens || model.maxTokens === 0)) {
|
|
return ANTHROPIC_DEFAULT_MAX_TOKENS
|
|
}
|
|
|
|
// If model has explicit maxTokens and it's not the full context window, use it
|
|
if (model.maxTokens && model.maxTokens !== model.contextWindow) {
|
|
return model.maxTokens
|
|
}
|
|
|
|
// For non-Anthropic formats without explicit maxTokens, return undefined
|
|
if (format) {
|
|
return undefined
|
|
}
|
|
|
|
// Default fallback
|
|
return ANTHROPIC_DEFAULT_MAX_TOKENS
|
|
}
|
|
|
|
// GetModelsOptions
|
|
|
|
export type GetModelsOptions =
|
|
| { provider: "openrouter" }
|
|
| { provider: "glama" }
|
|
| { provider: "requesty"; apiKey?: string }
|
|
| { provider: "unbound"; apiKey?: string }
|
|
| { provider: "litellm"; apiKey: string; baseUrl: string }
|
|
| { provider: "ollama"; baseUrl?: string }
|
|
| { provider: "lmstudio"; baseUrl?: string }
|