fix: 对照 API 文档修复 3 个 Adapter 的 8 个实现差异

通过逐接口对比 DeepSeek/AgnesAI/Ollama 官方文档与实现代码,发现并修复:

DeepSeek (4 fix):
- temperature 默认值: 错误发送 0(API默认=1),改为 undefined 让 API 用默认值
- thinking 禁用: API 默认 enabled,不传=开启。改为显式发送 {type:disabled}
- reasoning_effort: 补充 xhigh→max 映射(文档规定)
- stream 请求: 补充 AbortSignal.timeout 超时控制

Agnes AI (2 fix):
- temperature 默认值: 同上
- 图片 image_url: 移除文档未提及的 detail 字段

Ollama (3 fix):
- temperature 默认值: 同上(Ollama默认≈0.8)
- tool_calls arguments: 从对象改为 JSON 字符串(REST API 要求)
- finishReason: 使用 done_reason 字段正确映射(之前始终返回 STOP)
This commit is contained in:
thzxx
2026-06-27 21:48:15 +08:00
parent 7f975de20e
commit aa0dd464ac
3 changed files with 32 additions and 9 deletions
+23 -4
View File
@@ -370,10 +370,10 @@ export class OllamaAdapter extends BaseAdapter {
? m.toolResult.result
: JSON.stringify(m.toolResult.result);
}
// assistant 工具调用
// assistant 工具调用Ollama REST API 要求 arguments 为 JSON 字符串)
if (m.role === 'assistant' && m.toolCalls?.length) {
msg.tool_calls = m.toolCalls.map((tc) => ({
function: { name: tc.name, arguments: tc.args },
function: { name: tc.name, arguments: JSON.stringify(tc.args) },
}));
}
return msg;
@@ -384,7 +384,7 @@ export class OllamaAdapter extends BaseAdapter {
model: this.config.defaultModel,
messages,
options: {
temperature: request.params.temperature ?? 0,
temperature: request.params.temperature,
num_predict: request.params.maxTokens,
top_p: request.params.topP,
stop: request.params.stopSequences,
@@ -448,7 +448,26 @@ export class OllamaAdapter extends BaseAdapter {
outputTokens: (data.eval_count as number) ?? 0,
totalTokens: ((data.prompt_eval_count as number) ?? 0) + ((data.eval_count as number) ?? 0),
},
finishReason: data.done ? MetonaFinishReason.STOP : MetonaFinishReason.LENGTH,
finishReason: mapOllamaDoneReason(data.done_reason as string | undefined, !!message?.tool_calls),
};
}
}
/**
* 映射 Ollama done_reason → MetonaFinishReason
*
* @see apis/ollama-api-docs-20260518.html — /api/chat 响应字段
*/
function mapOllamaDoneReason(
reason: string | undefined,
hasToolCalls: boolean,
): MetonaFinishReason {
if (hasToolCalls) return MetonaFinishReason.TOOL_CALLS;
switch (reason) {
case 'stop': return MetonaFinishReason.STOP;
case 'length': return MetonaFinishReason.LENGTH;
case 'load': return MetonaFinishReason.ERROR;
case 'unload': return MetonaFinishReason.ERROR;
default: return MetonaFinishReason.STOP;
}
}