fix: openai tool use convert
This commit is contained in:
parent
d1d7ead694
commit
9138aa273e
1 changed files with 48 additions and 4 deletions
|
|
@ -219,6 +219,13 @@ export class OpenAIConverter extends BaseConverter {
|
||||||
content.push({ type: 'text', text: `[Audio: ${audioUrl}]` });
|
content.push({ type: 'text', text: `[Audio: ${audioUrl}]` });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'input_audio':
|
||||||
|
// OpenAI 官方 input_audio 格式
|
||||||
|
if (item.input_audio) {
|
||||||
|
// Claude 不直接支持音频输入,转换为文本描述
|
||||||
|
content.push({ type: 'text', text: `[Audio Input: ${item.input_audio.format || 'audio'}]` });
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'tool_use':
|
case 'tool_use':
|
||||||
content.push({
|
content.push({
|
||||||
type: 'tool_use',
|
type: 'tool_use',
|
||||||
|
|
@ -629,8 +636,15 @@ export class OpenAIConverter extends BaseConverter {
|
||||||
const mapping = { auto: 'auto', none: 'none', required: 'any' };
|
const mapping = { auto: 'auto', none: 'none', required: 'any' };
|
||||||
return { type: mapping[toolChoice] };
|
return { type: mapping[toolChoice] };
|
||||||
}
|
}
|
||||||
if (typeof toolChoice === 'object' && toolChoice.function) {
|
if (typeof toolChoice === 'object') {
|
||||||
return { type: 'tool', name: toolChoice.function.name };
|
// Claude 原生格式:{ type, name }
|
||||||
|
if (toolChoice.type && toolChoice.name) {
|
||||||
|
return { type: toolChoice.type, name: toolChoice.name };
|
||||||
|
}
|
||||||
|
// OpenAI 格式:{ function: { name } }
|
||||||
|
if (toolChoice.function) {
|
||||||
|
return { type: 'tool', name: toolChoice.function.name };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
@ -692,7 +706,7 @@ export class OpenAIConverter extends BaseConverter {
|
||||||
const role = message.role;
|
const role = message.role;
|
||||||
const content = message.content;
|
const content = message.content;
|
||||||
|
|
||||||
if (role === 'system') {
|
if (role === 'system' || role === 'developer') {
|
||||||
// system -> system_instruction
|
// system -> system_instruction
|
||||||
if (messages.length > 1) {
|
if (messages.length > 1) {
|
||||||
if (typeof content === 'string') {
|
if (typeof content === 'string') {
|
||||||
|
|
@ -940,12 +954,40 @@ export class OpenAIConverter extends BaseConverter {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (toolNode.parts.length > 0) {
|
||||||
|
processedMessages.push(toolNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (role === 'tool') {
|
||||||
|
// 处理独立的 tool role 消息(OpenAI 格式)
|
||||||
|
// 转换为 Gemini 的 functionResponse 格式
|
||||||
|
const toolNode = { role: 'user', parts: [] };
|
||||||
|
|
||||||
|
// 从 tool_call_id 查找对应的函数名
|
||||||
|
const toolCallId = message.tool_call_id;
|
||||||
|
const functionName = tcID2Name[toolCallId];
|
||||||
|
|
||||||
|
if (functionName) {
|
||||||
|
let responseContent = message.content;
|
||||||
|
if (typeof responseContent !== 'string') {
|
||||||
|
responseContent = JSON.stringify(responseContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
toolNode.parts.push({
|
||||||
|
functionResponse: {
|
||||||
|
name: functionName,
|
||||||
|
response: {
|
||||||
|
result: responseContent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (toolNode.parts.length > 0) {
|
if (toolNode.parts.length > 0) {
|
||||||
processedMessages.push(toolNode);
|
processedMessages.push(toolNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// tool 消息已经在 assistant 的 tool_calls 处理中合并了,这里跳过
|
// 其他 role 类型跳过
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构建 Gemini 请求
|
// 构建 Gemini 请求
|
||||||
|
|
@ -1396,6 +1438,8 @@ export class OpenAIConverter extends BaseConverter {
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue