refactor(converters): 使用常量替换模型默认参数硬编码

将各模型转换器中的硬编码默认参数替换为统一的常量定义,提高代码可维护性
This commit is contained in:
hex2077 2025-12-13 17:30:04 +08:00
parent f851ac8bb2
commit 839fc2d9de
6 changed files with 315 additions and 105 deletions

View file

@ -8,7 +8,15 @@ import { BaseConverter } from '../BaseConverter.js';
import { import {
checkAndAssignOrDefault, checkAndAssignOrDefault,
cleanJsonSchemaProperties as cleanJsonSchema, cleanJsonSchemaProperties as cleanJsonSchema,
determineReasoningEffortFromBudget determineReasoningEffortFromBudget,
OPENAI_DEFAULT_MAX_TOKENS,
OPENAI_DEFAULT_TEMPERATURE,
OPENAI_DEFAULT_TOP_P,
GEMINI_DEFAULT_MAX_TOKENS,
GEMINI_DEFAULT_TEMPERATURE,
GEMINI_DEFAULT_TOP_P,
GEMINI_DEFAULT_INPUT_TOKEN_LIMIT,
GEMINI_DEFAULT_OUTPUT_TOKEN_LIMIT
} from '../utils.js'; } from '../utils.js';
import { MODEL_PROTOCOL_PREFIX } from '../../common.js'; import { MODEL_PROTOCOL_PREFIX } from '../../common.js';
import { import {
@ -202,9 +210,9 @@ export class ClaudeConverter extends BaseConverter {
const openaiRequest = { const openaiRequest = {
model: claudeRequest.model, model: claudeRequest.model,
messages: openaiMessages, messages: openaiMessages,
max_tokens: checkAndAssignOrDefault(claudeRequest.max_tokens, 8192), max_tokens: checkAndAssignOrDefault(claudeRequest.max_tokens, OPENAI_DEFAULT_MAX_TOKENS),
temperature: checkAndAssignOrDefault(claudeRequest.temperature, 1), temperature: checkAndAssignOrDefault(claudeRequest.temperature, OPENAI_DEFAULT_TEMPERATURE),
top_p: checkAndAssignOrDefault(claudeRequest.top_p, 0.95), top_p: checkAndAssignOrDefault(claudeRequest.top_p, OPENAI_DEFAULT_TOP_P),
stream: claudeRequest.stream, stream: claudeRequest.stream,
}; };
@ -619,8 +627,8 @@ export class ClaudeConverter extends BaseConverter {
version: m.version || "1.0.0", version: m.version || "1.0.0",
displayName: m.displayName || m.id || m.name, displayName: m.displayName || m.id || m.name,
description: m.description || `A generative model for text and chat generation. ID: ${m.id || m.name}`, description: m.description || `A generative model for text and chat generation. ID: ${m.id || m.name}`,
inputTokenLimit: m.inputTokenLimit || 32768, inputTokenLimit: m.inputTokenLimit || GEMINI_DEFAULT_INPUT_TOKEN_LIMIT,
outputTokenLimit: m.outputTokenLimit || 8192, outputTokenLimit: m.outputTokenLimit || GEMINI_DEFAULT_OUTPUT_TOKEN_LIMIT,
supportedGenerationMethods: m.supportedGenerationMethods || ["generateContent", "streamGenerateContent"] supportedGenerationMethods: m.supportedGenerationMethods || ["generateContent", "streamGenerateContent"]
})) }))
}; };
@ -788,9 +796,9 @@ export class ClaudeConverter extends BaseConverter {
// 添加生成配置 // 添加生成配置
const generationConfig = {}; const generationConfig = {};
generationConfig.maxOutputTokens = checkAndAssignOrDefault(claudeRequest.max_tokens, 65535); generationConfig.maxOutputTokens = checkAndAssignOrDefault(claudeRequest.max_tokens, GEMINI_DEFAULT_MAX_TOKENS);
generationConfig.temperature = checkAndAssignOrDefault(claudeRequest.temperature, 1); generationConfig.temperature = checkAndAssignOrDefault(claudeRequest.temperature, GEMINI_DEFAULT_TEMPERATURE);
generationConfig.topP = checkAndAssignOrDefault(claudeRequest.top_p, 0.95); generationConfig.topP = checkAndAssignOrDefault(claudeRequest.top_p, GEMINI_DEFAULT_TOP_P);
if (Object.keys(generationConfig).length > 0) { if (Object.keys(generationConfig).length > 0) {
geminiRequest.generationConfig = generationConfig; geminiRequest.generationConfig = generationConfig;
@ -1119,9 +1127,9 @@ export class ClaudeConverter extends BaseConverter {
// 转换为OpenAI Responses格式 // 转换为OpenAI Responses格式
const responsesRequest = { const responsesRequest = {
model: claudeRequest.model, model: claudeRequest.model,
max_tokens: checkAndAssignOrDefault(claudeRequest.max_tokens, 8192), max_tokens: checkAndAssignOrDefault(claudeRequest.max_tokens, OPENAI_DEFAULT_MAX_TOKENS),
temperature: checkAndAssignOrDefault(claudeRequest.temperature, 1), temperature: checkAndAssignOrDefault(claudeRequest.temperature, OPENAI_DEFAULT_TEMPERATURE),
top_p: checkAndAssignOrDefault(claudeRequest.top_p, 0.95), top_p: checkAndAssignOrDefault(claudeRequest.top_p, OPENAI_DEFAULT_TOP_P),
}; };
// 处理系统指令 // 处理系统指令

View file

@ -6,7 +6,13 @@
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { BaseConverter } from '../BaseConverter.js'; import { BaseConverter } from '../BaseConverter.js';
import { import {
checkAndAssignOrDefault checkAndAssignOrDefault,
OPENAI_DEFAULT_MAX_TOKENS,
OPENAI_DEFAULT_TEMPERATURE,
OPENAI_DEFAULT_TOP_P,
CLAUDE_DEFAULT_MAX_TOKENS,
CLAUDE_DEFAULT_TEMPERATURE,
CLAUDE_DEFAULT_TOP_P
} from '../utils.js'; } from '../utils.js';
import { MODEL_PROTOCOL_PREFIX } from '../../common.js'; import { MODEL_PROTOCOL_PREFIX } from '../../common.js';
import { import {
@ -102,9 +108,9 @@ export class GeminiConverter extends BaseConverter {
const openaiRequest = { const openaiRequest = {
messages: [], messages: [],
model: geminiRequest.model, model: geminiRequest.model,
max_tokens: checkAndAssignOrDefault(geminiRequest.max_tokens, 8192), max_tokens: checkAndAssignOrDefault(geminiRequest.max_tokens, OPENAI_DEFAULT_MAX_TOKENS),
temperature: checkAndAssignOrDefault(geminiRequest.temperature, 1), temperature: checkAndAssignOrDefault(geminiRequest.temperature, OPENAI_DEFAULT_TEMPERATURE),
top_p: checkAndAssignOrDefault(geminiRequest.top_p, 0.95), top_p: checkAndAssignOrDefault(geminiRequest.top_p, OPENAI_DEFAULT_TOP_P),
}; };
// 处理系统指令 // 处理系统指令
@ -373,9 +379,9 @@ export class GeminiConverter extends BaseConverter {
const claudeRequest = { const claudeRequest = {
model: geminiRequest.model || 'claude-3-opus', model: geminiRequest.model || 'claude-3-opus',
messages: [], messages: [],
max_tokens: checkAndAssignOrDefault(geminiRequest.generationConfig?.maxOutputTokens, 8192), max_tokens: checkAndAssignOrDefault(geminiRequest.generationConfig?.maxOutputTokens, CLAUDE_DEFAULT_MAX_TOKENS),
temperature: checkAndAssignOrDefault(geminiRequest.generationConfig?.temperature, 1), temperature: checkAndAssignOrDefault(geminiRequest.generationConfig?.temperature, CLAUDE_DEFAULT_TEMPERATURE),
top_p: checkAndAssignOrDefault(geminiRequest.generationConfig?.topP, 0.95), top_p: checkAndAssignOrDefault(geminiRequest.generationConfig?.topP, CLAUDE_DEFAULT_TOP_P),
}; };
// 处理系统指令 // 处理系统指令
@ -678,9 +684,9 @@ export class GeminiConverter extends BaseConverter {
toOpenAIResponsesRequest(geminiRequest) { toOpenAIResponsesRequest(geminiRequest) {
const responsesRequest = { const responsesRequest = {
model: geminiRequest.model, model: geminiRequest.model,
max_tokens: checkAndAssignOrDefault(geminiRequest.generationConfig?.maxOutputTokens, 8192), max_tokens: checkAndAssignOrDefault(geminiRequest.generationConfig?.maxOutputTokens, OPENAI_DEFAULT_MAX_TOKENS),
temperature: checkAndAssignOrDefault(geminiRequest.generationConfig?.temperature, 1), temperature: checkAndAssignOrDefault(geminiRequest.generationConfig?.temperature, OPENAI_DEFAULT_TEMPERATURE),
top_p: checkAndAssignOrDefault(geminiRequest.generationConfig?.topP, 0.95), top_p: checkAndAssignOrDefault(geminiRequest.generationConfig?.topP, OPENAI_DEFAULT_TOP_P),
}; };
// 处理系统指令 // 处理系统指令

View file

@ -7,6 +7,76 @@ import { v4 as uuidv4 } from 'uuid';
import { createHash } from 'crypto'; import { createHash } from 'crypto';
import { BaseConverter } from '../BaseConverter.js'; import { BaseConverter } from '../BaseConverter.js';
import { MODEL_PROTOCOL_PREFIX } from '../../common.js'; import { MODEL_PROTOCOL_PREFIX } from '../../common.js';
import {
OLLAMA_DEFAULT_CONTEXT_LENGTH,
OLLAMA_DEFAULT_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_DEFAULT_CONTEXT_LENGTH,
OLLAMA_CLAUDE_SONNET_45_CONTEXT_LENGTH,
OLLAMA_CLAUDE_SONNET_45_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_HAIKU_45_CONTEXT_LENGTH,
OLLAMA_CLAUDE_HAIKU_45_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_OPUS_41_CONTEXT_LENGTH,
OLLAMA_CLAUDE_OPUS_41_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_SONNET_40_CONTEXT_LENGTH,
OLLAMA_CLAUDE_SONNET_40_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_SONNET_37_CONTEXT_LENGTH,
OLLAMA_CLAUDE_SONNET_37_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_OPUS_40_CONTEXT_LENGTH,
OLLAMA_CLAUDE_OPUS_40_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_HAIKU_35_CONTEXT_LENGTH,
OLLAMA_CLAUDE_HAIKU_35_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_HAIKU_30_CONTEXT_LENGTH,
OLLAMA_CLAUDE_HAIKU_30_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_SONNET_35_CONTEXT_LENGTH,
OLLAMA_CLAUDE_SONNET_35_MAX_OUTPUT_TOKENS,
OLLAMA_CLAUDE_OPUS_30_CONTEXT_LENGTH,
OLLAMA_CLAUDE_OPUS_30_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_25_PRO_CONTEXT_LENGTH,
OLLAMA_GEMINI_25_PRO_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_25_FLASH_CONTEXT_LENGTH,
OLLAMA_GEMINI_25_FLASH_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_25_IMAGE_CONTEXT_LENGTH,
OLLAMA_GEMINI_25_IMAGE_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_25_LIVE_CONTEXT_LENGTH,
OLLAMA_GEMINI_25_LIVE_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_25_TTS_CONTEXT_LENGTH,
OLLAMA_GEMINI_25_TTS_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_20_FLASH_CONTEXT_LENGTH,
OLLAMA_GEMINI_20_FLASH_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_20_IMAGE_CONTEXT_LENGTH,
OLLAMA_GEMINI_20_IMAGE_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_15_PRO_CONTEXT_LENGTH,
OLLAMA_GEMINI_15_PRO_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_15_FLASH_CONTEXT_LENGTH,
OLLAMA_GEMINI_15_FLASH_MAX_OUTPUT_TOKENS,
OLLAMA_GEMINI_DEFAULT_CONTEXT_LENGTH,
OLLAMA_GEMINI_DEFAULT_MAX_OUTPUT_TOKENS,
OLLAMA_GPT4_TURBO_CONTEXT_LENGTH,
OLLAMA_GPT4_TURBO_MAX_OUTPUT_TOKENS,
OLLAMA_GPT4_32K_CONTEXT_LENGTH,
OLLAMA_GPT4_32K_MAX_OUTPUT_TOKENS,
OLLAMA_GPT4_BASE_CONTEXT_LENGTH,
OLLAMA_GPT4_BASE_MAX_OUTPUT_TOKENS,
OLLAMA_GPT35_16K_CONTEXT_LENGTH,
OLLAMA_GPT35_16K_MAX_OUTPUT_TOKENS,
OLLAMA_GPT35_BASE_CONTEXT_LENGTH,
OLLAMA_GPT35_BASE_MAX_OUTPUT_TOKENS,
OLLAMA_QWEN_CODER_PLUS_CONTEXT_LENGTH,
OLLAMA_QWEN_CODER_PLUS_MAX_OUTPUT_TOKENS,
OLLAMA_QWEN_VL_PLUS_CONTEXT_LENGTH,
OLLAMA_QWEN_VL_PLUS_MAX_OUTPUT_TOKENS,
OLLAMA_QWEN_CODER_FLASH_CONTEXT_LENGTH,
OLLAMA_QWEN_CODER_FLASH_MAX_OUTPUT_TOKENS,
OLLAMA_QWEN_DEFAULT_CONTEXT_LENGTH,
OLLAMA_QWEN_DEFAULT_MAX_OUTPUT_TOKENS,
OLLAMA_DEFAULT_FILE_TYPE,
OLLAMA_DEFAULT_QUANTIZATION_VERSION,
OLLAMA_DEFAULT_ROPE_FREQ_BASE,
OLLAMA_DEFAULT_TEMPERATURE,
OLLAMA_DEFAULT_TOP_P,
OLLAMA_DEFAULT_QUANTIZATION_LEVEL,
OLLAMA_SHOW_QUANTIZATION_LEVEL
} from '../utils.js';
@ -360,7 +430,7 @@ export class OllamaConverter extends BaseConverter {
family: modelOwner, // "Ollama" with capital O family: modelOwner, // "Ollama" with capital O
families: [modelOwner], families: [modelOwner],
parameter_size: '0B', // As in the old patch parameter_size: '0B', // As in the old patch
quantization_level: 'Q4_0' quantization_level: OLLAMA_DEFAULT_QUANTIZATION_LEVEL
} }
}); });
}); });
@ -374,8 +444,8 @@ export class OllamaConverter extends BaseConverter {
*/ */
toOllamaShowResponse(modelName) { toOllamaShowResponse(modelName) {
// Minimal implementation, as in the old patch // Minimal implementation, as in the old patch
let contextLength = 8192; let contextLength = OLLAMA_DEFAULT_CONTEXT_LENGTH;
let maxOutputTokens = 4096; let maxOutputTokens = OLLAMA_DEFAULT_MAX_OUTPUT_TOKENS;
let family = 'Ollama'; // ВАЖНО: С большой буквы, как ожидает Copilot! let family = 'Ollama'; // ВАЖНО: С большой буквы, как ожидает Copilot!
let architecture = 'transformer'; let architecture = 'transformer';
@ -385,62 +455,62 @@ export class OllamaConverter extends BaseConverter {
// Claude models // Claude models
if (lowerName.includes('claude')) { if (lowerName.includes('claude')) {
architecture = 'claude'; architecture = 'claude';
contextLength = 200000; // Default 200K contextLength = OLLAMA_CLAUDE_DEFAULT_CONTEXT_LENGTH; // Default 200K
// Claude Sonnet 4.5 // Claude Sonnet 4.5
if (lowerName.includes('sonnet-4-5') || lowerName.includes('sonnet-4.5')) { if (lowerName.includes('sonnet-4-5') || lowerName.includes('sonnet-4.5')) {
contextLength = 200000; // 200K (1M beta available) contextLength = OLLAMA_CLAUDE_SONNET_45_CONTEXT_LENGTH; // 200K (1M beta available)
maxOutputTokens = 64000; // 64K output maxOutputTokens = OLLAMA_CLAUDE_SONNET_45_MAX_OUTPUT_TOKENS; // 64K output
} }
// Claude Haiku 4.5 // Claude Haiku 4.5
else if (lowerName.includes('haiku-4-5') || lowerName.includes('haiku-4.5')) { else if (lowerName.includes('haiku-4-5') || lowerName.includes('haiku-4.5')) {
contextLength = 200000; // 200K contextLength = OLLAMA_CLAUDE_HAIKU_45_CONTEXT_LENGTH; // 200K
maxOutputTokens = 64000; // 64K output maxOutputTokens = OLLAMA_CLAUDE_HAIKU_45_MAX_OUTPUT_TOKENS; // 64K output
} }
// Claude Opus 4.1 // Claude Opus 4.1
else if (lowerName.includes('opus-4-1') || lowerName.includes('opus-4.1')) { else if (lowerName.includes('opus-4-1') || lowerName.includes('opus-4.1')) {
contextLength = 200000; // 200K contextLength = OLLAMA_CLAUDE_OPUS_41_CONTEXT_LENGTH; // 200K
maxOutputTokens = 32000; // 32K output maxOutputTokens = OLLAMA_CLAUDE_OPUS_41_MAX_OUTPUT_TOKENS; // 32K output
} }
// Claude Sonnet 4.0 (legacy) // Claude Sonnet 4.0 (legacy)
else if (lowerName.includes('sonnet-4-0') || lowerName.includes('sonnet-4.0') || lowerName.includes('sonnet-4-20')) { else if (lowerName.includes('sonnet-4-0') || lowerName.includes('sonnet-4.0') || lowerName.includes('sonnet-4-20')) {
contextLength = 200000; // 200K (1M beta available) contextLength = OLLAMA_CLAUDE_SONNET_40_CONTEXT_LENGTH; // 200K (1M beta available)
maxOutputTokens = 64000; // 64K output maxOutputTokens = OLLAMA_CLAUDE_SONNET_40_MAX_OUTPUT_TOKENS; // 64K output
} }
// Claude Sonnet 3.7 (legacy) // Claude Sonnet 3.7 (legacy)
else if (lowerName.includes('3-7') || lowerName.includes('3.7')) { else if (lowerName.includes('3-7') || lowerName.includes('3.7')) {
contextLength = 200000; // 200K contextLength = OLLAMA_CLAUDE_SONNET_37_CONTEXT_LENGTH; // 200K
maxOutputTokens = 64000; // 64K output (128K beta available) maxOutputTokens = OLLAMA_CLAUDE_SONNET_37_MAX_OUTPUT_TOKENS; // 64K output (128K beta available)
} }
// Claude Opus 4.0 (legacy) // Claude Opus 4.0 (legacy)
else if (lowerName.includes('opus-4-0') || lowerName.includes('opus-4.0') || lowerName.includes('opus-4-20')) { else if (lowerName.includes('opus-4-0') || lowerName.includes('opus-4.0') || lowerName.includes('opus-4-20')) {
contextLength = 200000; // 200K contextLength = OLLAMA_CLAUDE_OPUS_40_CONTEXT_LENGTH; // 200K
maxOutputTokens = 32000; // 32K output maxOutputTokens = OLLAMA_CLAUDE_OPUS_40_MAX_OUTPUT_TOKENS; // 32K output
} }
// Claude Haiku 3.5 (legacy) // Claude Haiku 3.5 (legacy)
else if (lowerName.includes('haiku-3-5') || lowerName.includes('haiku-3.5')) { else if (lowerName.includes('haiku-3-5') || lowerName.includes('haiku-3.5')) {
contextLength = 200000; // 200K contextLength = OLLAMA_CLAUDE_HAIKU_35_CONTEXT_LENGTH; // 200K
maxOutputTokens = 8192; // 8K output maxOutputTokens = OLLAMA_CLAUDE_HAIKU_35_MAX_OUTPUT_TOKENS; // 8K output
} }
// Claude Haiku 3.0 (legacy) // Claude Haiku 3.0 (legacy)
else if (lowerName.includes('haiku-3-0') || lowerName.includes('haiku-3.0') || lowerName.includes('haiku-20240307')) { else if (lowerName.includes('haiku-3-0') || lowerName.includes('haiku-3.0') || lowerName.includes('haiku-20240307')) {
contextLength = 200000; // 200K contextLength = OLLAMA_CLAUDE_HAIKU_30_CONTEXT_LENGTH; // 200K
maxOutputTokens = 4096; // 4K output maxOutputTokens = OLLAMA_CLAUDE_HAIKU_30_MAX_OUTPUT_TOKENS; // 4K output
} }
// Claude Sonnet 3.5 (legacy) // Claude Sonnet 3.5 (legacy)
else if (lowerName.includes('sonnet-3-5') || lowerName.includes('sonnet-3.5')) { else if (lowerName.includes('sonnet-3-5') || lowerName.includes('sonnet-3.5')) {
contextLength = 200000; // 200K contextLength = OLLAMA_CLAUDE_SONNET_35_CONTEXT_LENGTH; // 200K
maxOutputTokens = 8192; // 8K output maxOutputTokens = OLLAMA_CLAUDE_SONNET_35_MAX_OUTPUT_TOKENS; // 8K output
} }
// Claude Opus 3.0 (legacy) // Claude Opus 3.0 (legacy)
else if (lowerName.includes('opus-3-0') || lowerName.includes('opus-3.0') || lowerName.includes('opus') && lowerName.includes('20240229')) { else if (lowerName.includes('opus-3-0') || lowerName.includes('opus-3.0') || lowerName.includes('opus') && lowerName.includes('20240229')) {
contextLength = 200000; // 200K contextLength = OLLAMA_CLAUDE_OPUS_30_CONTEXT_LENGTH; // 200K
maxOutputTokens = 4096; // 4K output maxOutputTokens = OLLAMA_CLAUDE_OPUS_30_MAX_OUTPUT_TOKENS; // 4K output
} }
// Default for Claude // Default for Claude
else { else {
contextLength = 200000; // 200K contextLength = OLLAMA_CLAUDE_DEFAULT_CONTEXT_LENGTH; // 200K
maxOutputTokens = 8192; // 8K output maxOutputTokens = OLLAMA_CLAUDE_HAIKU_35_MAX_OUTPUT_TOKENS; // 8K output
} }
} }
// Gemini models // Gemini models
@ -449,53 +519,53 @@ export class OllamaConverter extends BaseConverter {
// Gemini 2.5 Pro // Gemini 2.5 Pro
if (lowerName.includes('2.5') && lowerName.includes('pro')) { if (lowerName.includes('2.5') && lowerName.includes('pro')) {
contextLength = 1048576; // 1M input tokens contextLength = OLLAMA_GEMINI_25_PRO_CONTEXT_LENGTH; // 1M input tokens
maxOutputTokens = 65536; // 65K output tokens maxOutputTokens = OLLAMA_GEMINI_25_PRO_MAX_OUTPUT_TOKENS; // 65K output tokens
} }
// Gemini 2.5 Flash / Flash-Lite // Gemini 2.5 Flash / Flash-Lite
else if (lowerName.includes('2.5') && (lowerName.includes('flash') || lowerName.includes('lite'))) { else if (lowerName.includes('2.5') && (lowerName.includes('flash') || lowerName.includes('lite'))) {
contextLength = 1048576; // 1M input tokens contextLength = OLLAMA_GEMINI_25_FLASH_CONTEXT_LENGTH; // 1M input tokens
maxOutputTokens = 65536; // 65K output tokens maxOutputTokens = OLLAMA_GEMINI_25_FLASH_MAX_OUTPUT_TOKENS; // 65K output tokens
} }
// Gemini 2.5 Flash Image // Gemini 2.5 Flash Image
else if (lowerName.includes('2.5') && lowerName.includes('image')) { else if (lowerName.includes('2.5') && lowerName.includes('image')) {
contextLength = 65536; // 65K input tokens contextLength = OLLAMA_GEMINI_25_IMAGE_CONTEXT_LENGTH; // 65K input tokens
maxOutputTokens = 32768; // 32K output tokens maxOutputTokens = OLLAMA_GEMINI_25_IMAGE_MAX_OUTPUT_TOKENS; // 32K output tokens
} }
// Gemini 2.5 Flash Live / Native Audio // Gemini 2.5 Flash Live / Native Audio
else if (lowerName.includes('2.5') && (lowerName.includes('live') || lowerName.includes('native-audio'))) { else if (lowerName.includes('2.5') && (lowerName.includes('live') || lowerName.includes('native-audio'))) {
contextLength = 131072; // 131K input tokens contextLength = OLLAMA_GEMINI_25_LIVE_CONTEXT_LENGTH; // 131K input tokens
maxOutputTokens = 8192; // 8K output tokens maxOutputTokens = OLLAMA_GEMINI_25_LIVE_MAX_OUTPUT_TOKENS; // 8K output tokens
} }
// Gemini 2.5 TTS // Gemini 2.5 TTS
else if (lowerName.includes('2.5') && lowerName.includes('tts')) { else if (lowerName.includes('2.5') && lowerName.includes('tts')) {
contextLength = 8192; // 8K input tokens contextLength = OLLAMA_GEMINI_25_TTS_CONTEXT_LENGTH; // 8K input tokens
maxOutputTokens = 16384; // 16K output tokens maxOutputTokens = OLLAMA_GEMINI_25_TTS_MAX_OUTPUT_TOKENS; // 16K output tokens
} }
// Gemini 2.0 Flash // Gemini 2.0 Flash
else if (lowerName.includes('2.0') && lowerName.includes('flash')) { else if (lowerName.includes('2.0') && lowerName.includes('flash')) {
contextLength = 1048576; // 1M input tokens contextLength = OLLAMA_GEMINI_20_FLASH_CONTEXT_LENGTH; // 1M input tokens
maxOutputTokens = 8192; // 8K output tokens maxOutputTokens = OLLAMA_GEMINI_20_FLASH_MAX_OUTPUT_TOKENS; // 8K output tokens
} }
// Gemini 2.0 Flash Image // Gemini 2.0 Flash Image
else if (lowerName.includes('2.0') && lowerName.includes('image')) { else if (lowerName.includes('2.0') && lowerName.includes('image')) {
contextLength = 32768; // 32K input tokens contextLength = OLLAMA_GEMINI_20_IMAGE_CONTEXT_LENGTH; // 32K input tokens
maxOutputTokens = 8192; // 8K output tokens maxOutputTokens = OLLAMA_GEMINI_20_IMAGE_MAX_OUTPUT_TOKENS; // 8K output tokens
} }
// Gemini 1.5 Pro (legacy) // Gemini 1.5 Pro (legacy)
else if (lowerName.includes('1.5') && lowerName.includes('pro')) { else if (lowerName.includes('1.5') && lowerName.includes('pro')) {
contextLength = 2097152; // 2M tokens contextLength = OLLAMA_GEMINI_15_PRO_CONTEXT_LENGTH; // 2M tokens
maxOutputTokens = 8192; maxOutputTokens = OLLAMA_GEMINI_15_PRO_MAX_OUTPUT_TOKENS;
} }
// Gemini 1.5 Flash (legacy) // Gemini 1.5 Flash (legacy)
else if (lowerName.includes('1.5') && lowerName.includes('flash')) { else if (lowerName.includes('1.5') && lowerName.includes('flash')) {
contextLength = 1048576; // 1M tokens contextLength = OLLAMA_GEMINI_15_FLASH_CONTEXT_LENGTH; // 1M tokens
maxOutputTokens = 8192; maxOutputTokens = OLLAMA_GEMINI_15_FLASH_MAX_OUTPUT_TOKENS;
} }
// Default for Gemini // Default for Gemini
else { else {
contextLength = 1048576; // 1M tokens contextLength = OLLAMA_GEMINI_DEFAULT_CONTEXT_LENGTH; // 1M tokens
maxOutputTokens = 8192; maxOutputTokens = OLLAMA_GEMINI_DEFAULT_MAX_OUTPUT_TOKENS;
} }
} }
// GPT-4 models // GPT-4 models
@ -503,14 +573,14 @@ export class OllamaConverter extends BaseConverter {
architecture = 'gpt'; architecture = 'gpt';
if (lowerName.includes('turbo') || lowerName.includes('preview')) { if (lowerName.includes('turbo') || lowerName.includes('preview')) {
contextLength = 128000; // GPT-4 Turbo contextLength = OLLAMA_GPT4_TURBO_CONTEXT_LENGTH; // GPT-4 Turbo
maxOutputTokens = 4096; maxOutputTokens = OLLAMA_GPT4_TURBO_MAX_OUTPUT_TOKENS;
} else if (lowerName.includes('32k')) { } else if (lowerName.includes('32k')) {
contextLength = 32768; contextLength = OLLAMA_GPT4_32K_CONTEXT_LENGTH;
maxOutputTokens = 4096; maxOutputTokens = OLLAMA_GPT4_32K_MAX_OUTPUT_TOKENS;
} else { } else {
contextLength = 8192; // GPT-4 base contextLength = OLLAMA_GPT4_BASE_CONTEXT_LENGTH; // GPT-4 base
maxOutputTokens = 4096; maxOutputTokens = OLLAMA_GPT4_BASE_MAX_OUTPUT_TOKENS;
} }
} }
// GPT-3.5 models // GPT-3.5 models
@ -518,11 +588,11 @@ export class OllamaConverter extends BaseConverter {
architecture = 'gpt'; architecture = 'gpt';
if (lowerName.includes('16k')) { if (lowerName.includes('16k')) {
contextLength = 16385; contextLength = OLLAMA_GPT35_16K_CONTEXT_LENGTH;
maxOutputTokens = 4096; maxOutputTokens = OLLAMA_GPT35_16K_MAX_OUTPUT_TOKENS;
} else { } else {
contextLength = 4096; contextLength = OLLAMA_GPT35_BASE_CONTEXT_LENGTH;
maxOutputTokens = 4096; maxOutputTokens = OLLAMA_GPT35_BASE_MAX_OUTPUT_TOKENS;
} }
} }
// Qwen models // Qwen models
@ -531,23 +601,23 @@ export class OllamaConverter extends BaseConverter {
// Qwen3 Coder Plus (coder-model) // Qwen3 Coder Plus (coder-model)
if (lowerName.includes('coder-plus') || lowerName.includes('coder_plus') || lowerName.includes('coder-model')) { if (lowerName.includes('coder-plus') || lowerName.includes('coder_plus') || lowerName.includes('coder-model')) {
contextLength = 128000; // 128K tokens contextLength = OLLAMA_QWEN_CODER_PLUS_CONTEXT_LENGTH; // 128K tokens
maxOutputTokens = 65536; // 65K output maxOutputTokens = OLLAMA_QWEN_CODER_PLUS_MAX_OUTPUT_TOKENS; // 65K output
} }
// Qwen3 VL Plus (vision-model) // Qwen3 VL Plus (vision-model)
else if (lowerName.includes('vl-plus') || lowerName.includes('vl_plus') || lowerName.includes('vision-model')) { else if (lowerName.includes('vl-plus') || lowerName.includes('vl_plus') || lowerName.includes('vision-model')) {
contextLength = 262144; // 256K tokens contextLength = OLLAMA_QWEN_VL_PLUS_CONTEXT_LENGTH; // 256K tokens
maxOutputTokens = 32768; // 32K output maxOutputTokens = OLLAMA_QWEN_VL_PLUS_MAX_OUTPUT_TOKENS; // 32K output
} }
// Qwen3 Coder Flash // Qwen3 Coder Flash
else if (lowerName.includes('coder-flash') || lowerName.includes('coder_flash')) { else if (lowerName.includes('coder-flash') || lowerName.includes('coder_flash')) {
contextLength = 128000; // 128K tokens contextLength = OLLAMA_QWEN_CODER_FLASH_CONTEXT_LENGTH; // 128K tokens
maxOutputTokens = 65536; // 65K output maxOutputTokens = OLLAMA_QWEN_CODER_FLASH_MAX_OUTPUT_TOKENS; // 65K output
} }
// Default for Qwen // Default for Qwen
else { else {
contextLength = 32768; // 32K tokens contextLength = OLLAMA_QWEN_DEFAULT_CONTEXT_LENGTH; // 32K tokens
maxOutputTokens = 8192; maxOutputTokens = OLLAMA_QWEN_DEFAULT_MAX_OUTPUT_TOKENS;
} }
} }
@ -557,7 +627,7 @@ export class OllamaConverter extends BaseConverter {
return { return {
license: '', license: '',
modelfile: `# Modelfile for ${modelName}\nFROM ${modelName}`, modelfile: `# Modelfile for ${modelName}\nFROM ${modelName}`,
parameters: `num_ctx ${contextLength}\nnum_predict ${maxOutputTokens}\ntemperature 0.7\ntop_p 0.9`, parameters: `num_ctx ${contextLength}\nnum_predict ${maxOutputTokens}\ntemperature ${OLLAMA_DEFAULT_TEMPERATURE}\ntop_p ${OLLAMA_DEFAULT_TOP_P}`,
template: '{{ if .System }}{{ .System }}\n{{ end }}{{ .Prompt }}', template: '{{ if .System }}{{ .System }}\n{{ end }}{{ .Prompt }}',
details: { details: {
parent_model: '', parent_model: '',
@ -565,16 +635,16 @@ export class OllamaConverter extends BaseConverter {
family: family, family: family,
families: [family], families: [family],
parameter_size: parameterSize, parameter_size: parameterSize,
quantization_level: 'Q4_K_M' quantization_level: OLLAMA_SHOW_QUANTIZATION_LEVEL
}, },
model_info: { model_info: {
'general.architecture': architecture, 'general.architecture': architecture,
'general.file_type': 2, 'general.file_type': OLLAMA_DEFAULT_FILE_TYPE,
'general.parameter_count': 0, 'general.parameter_count': 0,
'general.quantization_version': 2, 'general.quantization_version': OLLAMA_DEFAULT_QUANTIZATION_VERSION,
'general.context_length': contextLength, 'general.context_length': contextLength,
'llama.context_length': contextLength, 'llama.context_length': contextLength,
'llama.rope.freq_base': 10000.0 'llama.rope.freq_base': OLLAMA_DEFAULT_ROPE_FREQ_BASE
}, },
capabilities: ['tools', 'vision', 'completion'] // Indicate that the model supports tool calling capabilities: ['tools', 'vision', 'completion'] // Indicate that the model supports tool calling
}; };

View file

@ -12,7 +12,15 @@ import {
checkAndAssignOrDefault, checkAndAssignOrDefault,
extractThinkingFromOpenAIText, extractThinkingFromOpenAIText,
mapFinishReason, mapFinishReason,
cleanJsonSchemaProperties as cleanJsonSchema cleanJsonSchemaProperties as cleanJsonSchema,
CLAUDE_DEFAULT_MAX_TOKENS,
CLAUDE_DEFAULT_TEMPERATURE,
CLAUDE_DEFAULT_TOP_P,
GEMINI_DEFAULT_MAX_TOKENS,
GEMINI_DEFAULT_TEMPERATURE,
GEMINI_DEFAULT_TOP_P,
OPENAI_DEFAULT_INPUT_TOKEN_LIMIT,
OPENAI_DEFAULT_OUTPUT_TOKEN_LIMIT
} from '../utils.js'; } from '../utils.js';
import { MODEL_PROTOCOL_PREFIX } from '../../common.js'; import { MODEL_PROTOCOL_PREFIX } from '../../common.js';
import { import {
@ -225,9 +233,9 @@ export class OpenAIConverter extends BaseConverter {
const claudeRequest = { const claudeRequest = {
model: openaiRequest.model, model: openaiRequest.model,
messages: mergedClaudeMessages, messages: mergedClaudeMessages,
max_tokens: checkAndAssignOrDefault(openaiRequest.max_tokens, 8192), max_tokens: checkAndAssignOrDefault(openaiRequest.max_tokens, CLAUDE_DEFAULT_MAX_TOKENS),
temperature: checkAndAssignOrDefault(openaiRequest.temperature, 1), temperature: checkAndAssignOrDefault(openaiRequest.temperature, CLAUDE_DEFAULT_TEMPERATURE),
top_p: checkAndAssignOrDefault(openaiRequest.top_p, 0.95), top_p: checkAndAssignOrDefault(openaiRequest.top_p, CLAUDE_DEFAULT_TOP_P),
}; };
if (systemInstruction) { if (systemInstruction) {
@ -514,8 +522,8 @@ export class OpenAIConverter extends BaseConverter {
version: m.version || "1.0.0", version: m.version || "1.0.0",
displayName: m.displayName || m.id, displayName: m.displayName || m.id,
description: m.description || `A generative model for text and chat generation. ID: ${m.id}`, description: m.description || `A generative model for text and chat generation. ID: ${m.id}`,
inputTokenLimit: m.inputTokenLimit || 32768, inputTokenLimit: m.inputTokenLimit || OPENAI_DEFAULT_INPUT_TOKEN_LIMIT,
outputTokenLimit: m.outputTokenLimit || 8192, outputTokenLimit: m.outputTokenLimit || OPENAI_DEFAULT_OUTPUT_TOKEN_LIMIT,
supportedGenerationMethods: m.supportedGenerationMethods || ["generateContent", "streamGenerateContent"] supportedGenerationMethods: m.supportedGenerationMethods || ["generateContent", "streamGenerateContent"]
})) }))
}; };
@ -713,9 +721,9 @@ export class OpenAIConverter extends BaseConverter {
*/ */
buildGeminiGenerationConfig({ temperature, max_tokens, top_p, stop, tools, response_format }, model) { buildGeminiGenerationConfig({ temperature, max_tokens, top_p, stop, tools, response_format }, model) {
const config = {}; const config = {};
config.temperature = checkAndAssignOrDefault(temperature, 1); config.temperature = checkAndAssignOrDefault(temperature, GEMINI_DEFAULT_TEMPERATURE);
config.maxOutputTokens = checkAndAssignOrDefault(max_tokens, 65535); config.maxOutputTokens = checkAndAssignOrDefault(max_tokens, GEMINI_DEFAULT_MAX_TOKENS);
config.topP = checkAndAssignOrDefault(top_p, 0.95); config.topP = checkAndAssignOrDefault(top_p, GEMINI_DEFAULT_TOP_P);
if (stop !== undefined) config.stopSequences = Array.isArray(stop) ? stop : [stop]; if (stop !== undefined) config.stopSequences = Array.isArray(stop) ? stop : [stop];
// Handle response_format // Handle response_format

View file

@ -7,7 +7,10 @@ import { BaseConverter } from '../BaseConverter.js';
import { MODEL_PROTOCOL_PREFIX } from '../../common.js'; import { MODEL_PROTOCOL_PREFIX } from '../../common.js';
import { import {
extractAndProcessSystemMessages as extractSystemMessages, extractAndProcessSystemMessages as extractSystemMessages,
extractTextFromMessageContent as extractText extractTextFromMessageContent as extractText,
CLAUDE_DEFAULT_MAX_TOKENS,
GEMINI_DEFAULT_INPUT_TOKEN_LIMIT,
GEMINI_DEFAULT_OUTPUT_TOKEN_LIMIT
} from '../utils.js'; } from '../utils.js';
/** /**
@ -227,7 +230,7 @@ export class OpenAIResponsesConverter extends BaseConverter {
const claudeRequest = { const claudeRequest = {
model: responsesRequest.model, model: responsesRequest.model,
messages: [], messages: [],
max_tokens: responsesRequest.max_tokens || 4096, max_tokens: responsesRequest.max_tokens || CLAUDE_DEFAULT_MAX_TOKENS,
stream: responsesRequest.stream || false stream: responsesRequest.stream || false
}; };
@ -561,8 +564,8 @@ export class OpenAIResponsesConverter extends BaseConverter {
version: m.version || "1.0.0", version: m.version || "1.0.0",
displayName: m.displayName || m.id || m.name, displayName: m.displayName || m.id || m.name,
description: m.description || `A generative model for text and chat generation. ID: ${m.id || m.name}`, description: m.description || `A generative model for text and chat generation. ID: ${m.id || m.name}`,
inputTokenLimit: m.inputTokenLimit || 32768, inputTokenLimit: m.inputTokenLimit || GEMINI_DEFAULT_INPUT_TOKEN_LIMIT,
outputTokenLimit: m.outputTokenLimit || 8192, outputTokenLimit: m.outputTokenLimit || GEMINI_DEFAULT_OUTPUT_TOKEN_LIMIT,
supportedGenerationMethods: m.supportedGenerationMethods || ["generateContent", "streamGenerateContent"] supportedGenerationMethods: m.supportedGenerationMethods || ["generateContent", "streamGenerateContent"]
})) }))
}; };

View file

@ -9,11 +9,126 @@ import { v4 as uuidv4 } from 'uuid';
// 常量定义 // 常量定义
// ============================================================================= // =============================================================================
// 通用默认值
export const DEFAULT_MAX_TOKENS = 8192; export const DEFAULT_MAX_TOKENS = 8192;
export const DEFAULT_GEMINI_MAX_TOKENS = 65535;
export const DEFAULT_TEMPERATURE = 1; export const DEFAULT_TEMPERATURE = 1;
export const DEFAULT_TOP_P = 0.95; export const DEFAULT_TOP_P = 0.95;
// =============================================================================
// OpenAI 相关常量
// =============================================================================
export const OPENAI_DEFAULT_MAX_TOKENS = 64000;
export const OPENAI_DEFAULT_TEMPERATURE = 1;
export const OPENAI_DEFAULT_TOP_P = 0.95;
export const OPENAI_DEFAULT_INPUT_TOKEN_LIMIT = 32768;
export const OPENAI_DEFAULT_OUTPUT_TOKEN_LIMIT = 64000;
// =============================================================================
// Claude 相关常量
// =============================================================================
export const CLAUDE_DEFAULT_MAX_TOKENS = 64000;
export const CLAUDE_DEFAULT_TEMPERATURE = 1;
export const CLAUDE_DEFAULT_TOP_P = 0.95;
// =============================================================================
// Gemini 相关常量
// =============================================================================
export const GEMINI_DEFAULT_MAX_TOKENS = 65534;
export const GEMINI_DEFAULT_TEMPERATURE = 1;
export const GEMINI_DEFAULT_TOP_P = 0.95;
export const GEMINI_DEFAULT_INPUT_TOKEN_LIMIT = 32768;
export const GEMINI_DEFAULT_OUTPUT_TOKEN_LIMIT = 64000;
// =============================================================================
// OpenAI Responses 相关常量
// =============================================================================
export const OPENAI_RESPONSES_DEFAULT_MAX_TOKENS = 4096;
export const OPENAI_RESPONSES_DEFAULT_TEMPERATURE = 1;
export const OPENAI_RESPONSES_DEFAULT_TOP_P = 0.95;
export const OPENAI_RESPONSES_DEFAULT_INPUT_TOKEN_LIMIT = 32768;
export const OPENAI_RESPONSES_DEFAULT_OUTPUT_TOKEN_LIMIT = 64000;
// =============================================================================
// Ollama 相关常量
// =============================================================================
export const OLLAMA_DEFAULT_CONTEXT_LENGTH = 64000;
export const OLLAMA_DEFAULT_MAX_OUTPUT_TOKENS = 4096;
// Claude 模型上下文长度
export const OLLAMA_CLAUDE_DEFAULT_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_SONNET_45_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_SONNET_45_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_CLAUDE_HAIKU_45_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_HAIKU_45_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_CLAUDE_OPUS_41_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_OPUS_41_MAX_OUTPUT_TOKENS = 32000;
export const OLLAMA_CLAUDE_SONNET_40_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_SONNET_40_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_CLAUDE_SONNET_37_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_SONNET_37_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_CLAUDE_OPUS_40_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_OPUS_40_MAX_OUTPUT_TOKENS = 32000;
export const OLLAMA_CLAUDE_HAIKU_35_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_HAIKU_35_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_CLAUDE_HAIKU_30_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_HAIKU_30_MAX_OUTPUT_TOKENS = 4096;
export const OLLAMA_CLAUDE_SONNET_35_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_SONNET_35_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_CLAUDE_OPUS_30_CONTEXT_LENGTH = 200000;
export const OLLAMA_CLAUDE_OPUS_30_MAX_OUTPUT_TOKENS = 4096;
// Gemini 模型上下文长度
export const OLLAMA_GEMINI_25_PRO_CONTEXT_LENGTH = 1048576;
export const OLLAMA_GEMINI_25_PRO_MAX_OUTPUT_TOKENS = 65536;
export const OLLAMA_GEMINI_25_FLASH_CONTEXT_LENGTH = 1048576;
export const OLLAMA_GEMINI_25_FLASH_MAX_OUTPUT_TOKENS = 65536;
export const OLLAMA_GEMINI_25_IMAGE_CONTEXT_LENGTH = 65536;
export const OLLAMA_GEMINI_25_IMAGE_MAX_OUTPUT_TOKENS = 32768;
export const OLLAMA_GEMINI_25_LIVE_CONTEXT_LENGTH = 131072;
export const OLLAMA_GEMINI_25_LIVE_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_GEMINI_25_TTS_CONTEXT_LENGTH = 64000;
export const OLLAMA_GEMINI_25_TTS_MAX_OUTPUT_TOKENS = 16384;
export const OLLAMA_GEMINI_20_FLASH_CONTEXT_LENGTH = 1048576;
export const OLLAMA_GEMINI_20_FLASH_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_GEMINI_20_IMAGE_CONTEXT_LENGTH = 32768;
export const OLLAMA_GEMINI_20_IMAGE_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_GEMINI_15_PRO_CONTEXT_LENGTH = 2097152;
export const OLLAMA_GEMINI_15_PRO_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_GEMINI_15_FLASH_CONTEXT_LENGTH = 1048576;
export const OLLAMA_GEMINI_15_FLASH_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_GEMINI_DEFAULT_CONTEXT_LENGTH = 1048576;
export const OLLAMA_GEMINI_DEFAULT_MAX_OUTPUT_TOKENS = 64000;
// GPT 模型上下文长度
export const OLLAMA_GPT4_TURBO_CONTEXT_LENGTH = 128000;
export const OLLAMA_GPT4_TURBO_MAX_OUTPUT_TOKENS = 4096;
export const OLLAMA_GPT4_32K_CONTEXT_LENGTH = 32768;
export const OLLAMA_GPT4_32K_MAX_OUTPUT_TOKENS = 4096;
export const OLLAMA_GPT4_BASE_CONTEXT_LENGTH = 64000;
export const OLLAMA_GPT4_BASE_MAX_OUTPUT_TOKENS = 4096;
export const OLLAMA_GPT35_16K_CONTEXT_LENGTH = 16385;
export const OLLAMA_GPT35_16K_MAX_OUTPUT_TOKENS = 4096;
export const OLLAMA_GPT35_BASE_CONTEXT_LENGTH = 4096;
export const OLLAMA_GPT35_BASE_MAX_OUTPUT_TOKENS = 4096;
// Qwen 模型上下文长度
export const OLLAMA_QWEN_CODER_PLUS_CONTEXT_LENGTH = 128000;
export const OLLAMA_QWEN_CODER_PLUS_MAX_OUTPUT_TOKENS = 65536;
export const OLLAMA_QWEN_VL_PLUS_CONTEXT_LENGTH = 262144;
export const OLLAMA_QWEN_VL_PLUS_MAX_OUTPUT_TOKENS = 32768;
export const OLLAMA_QWEN_CODER_FLASH_CONTEXT_LENGTH = 128000;
export const OLLAMA_QWEN_CODER_FLASH_MAX_OUTPUT_TOKENS = 65536;
export const OLLAMA_QWEN_DEFAULT_CONTEXT_LENGTH = 32768;
export const OLLAMA_QWEN_DEFAULT_MAX_OUTPUT_TOKENS = 64000;
export const OLLAMA_DEFAULT_FILE_TYPE = 2;
export const OLLAMA_DEFAULT_QUANTIZATION_VERSION = 2;
export const OLLAMA_DEFAULT_ROPE_FREQ_BASE = 10000.0;
export const OLLAMA_DEFAULT_TEMPERATURE = 0.7;
export const OLLAMA_DEFAULT_TOP_P = 0.9;
export const OLLAMA_DEFAULT_QUANTIZATION_LEVEL = 'Q4_0';
export const OLLAMA_SHOW_QUANTIZATION_LEVEL = 'Q4_K_M';
// ============================================================================= // =============================================================================
// 通用辅助函数 // 通用辅助函数
// ============================================================================= // =============================================================================