feat(*): 插件中心与模型协议 - 完善声明式协议运行时并增加功能开放控制

This commit is contained in:
ddCat
2026-08-23 23:19:27 +08:00
parent 7cc6021f6e
commit 919037e5d9
106 changed files with 8817 additions and 500 deletions

View File

@@ -33,6 +33,40 @@ export function toResponseTool(tool: ResponseFunctionTool): ResponseApiToolDefin
};
}
export function toClaudeBody(config: AiConfig, messages: ResponseInputMessage[], tools: ResponseFunctionTool[] = []) {
const system = [config.systemPrompt.trim(), ...messages.flatMap((message) => !(("type" in message)) && message.role === "system" ? [String(message.content || "")] : [])].filter(Boolean).join("\n\n");
const bodyMessages: Array<Record<string, unknown>> = [];
for (const message of messages) {
if ("type" in message) {
bodyMessages.push({ role: "assistant", content: [{ type: "tool_use", id: message.call_id, name: message.name, input: jsonObject(message.arguments) }] });
} else if (message.role === "system") {
continue;
} else if (message.role === "tool") {
bodyMessages.push({ role: "user", content: [{ type: "tool_result", tool_use_id: message.tool_call_id, content: message.content }] });
} else {
bodyMessages.push({ role: message.role === "assistant" ? "assistant" : "user", content: toClaudeContent(message.content) });
}
}
return {
model: config.model,
max_tokens: 4096,
messages: bodyMessages,
...(system ? { system } : {}),
...(tools.length ? { tools: tools.map((tool) => ({ name: tool.function.name, description: tool.function.description, input_schema: tool.function.parameters })) } : {}),
};
}
function toClaudeContent(content: ResponseMessageContent): unknown {
if (!Array.isArray(content)) return String(content || "");
return content.map((item) => {
if (item.type === "text") return { type: "text", text: item.text };
const value = item.type === "image_url" ? item.image_url.url : item.file_url.url;
const match = value.match(/^data:([^;,]+);base64,(.+)$/);
if (match) return { type: "image", source: { type: "base64", media_type: match[1], data: match[2] } };
return item.type === "image_url" ? { type: "image", source: { type: "url", url: value } } : { type: "text", text: `${item.file_url.name}: ${value}` };
});
}
export function toChatCompletionMessages(messages: ResponseInputMessage[]) {
const result: Array<Record<string, unknown>> = [];
for (let index = 0; index < messages.length;) {