From 7c632f8901d9d66796dea2a053f211fe3742c464 Mon Sep 17 00:00:00 2001 From: zuisong Date: Wed, 27 Nov 2024 22:16:52 +0800 Subject: [PATCH] apply gemini changes Gemini models now support two consecutive user messages. --- dist/main_bun.mjs | 8 +----- dist/main_cloudflare-workers.mjs | 8 +----- dist/main_deno.mjs | 8 +----- dist/main_node.mjs | 8 +----- src/utils.ts | 42 ++++++++++++-------------------- 5 files changed, 20 insertions(+), 54 deletions(-) diff --git a/dist/main_bun.mjs b/dist/main_bun.mjs index bc40735..bf99168 100644 --- a/dist/main_bun.mjs +++ b/dist/main_bun.mjs @@ -86,8 +86,7 @@ function openAiMessageToGeminiMessage(messages) { const result = messages.flatMap(({ role, content }) => { if (role === "system") { return [ - { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] }, - { role: "model", parts: [{ text: "OK" }] } + { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] } ]; } const parts = content == null || typeof content === "string" ? [{ text: content?.toString() ?? "" }] : content.map((item) => { @@ -96,11 +95,6 @@ function openAiMessageToGeminiMessage(messages) { return { text: "OK" }; }); return [{ role: "user" === role ? "user" : "model", parts }]; - }).flatMap((item, idx, arr) => { - if (item.role === arr.at(idx + 1)?.role && item.role === "user") { - return [item, { role: "model", parts: [{ text: "" }] }]; - } - return [item]; }); return result; } diff --git a/dist/main_cloudflare-workers.mjs b/dist/main_cloudflare-workers.mjs index 63f9f71..80f2d26 100644 --- a/dist/main_cloudflare-workers.mjs +++ b/dist/main_cloudflare-workers.mjs @@ -86,8 +86,7 @@ function openAiMessageToGeminiMessage(messages) { const result = messages.flatMap(({ role, content }) => { if (role === "system") { return [ - { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] }, - { role: "model", parts: [{ text: "OK" }] } + { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] } ]; } const parts = content == null || typeof content === "string" ? [{ text: content?.toString() ?? "" }] : content.map((item) => { @@ -96,11 +95,6 @@ function openAiMessageToGeminiMessage(messages) { return { text: "OK" }; }); return [{ role: "user" === role ? "user" : "model", parts }]; - }).flatMap((item, idx, arr) => { - if (item.role === arr.at(idx + 1)?.role && item.role === "user") { - return [item, { role: "model", parts: [{ text: "" }] }]; - } - return [item]; }); return result; } diff --git a/dist/main_deno.mjs b/dist/main_deno.mjs index dc21018..52aa8c0 100644 --- a/dist/main_deno.mjs +++ b/dist/main_deno.mjs @@ -86,8 +86,7 @@ function openAiMessageToGeminiMessage(messages) { const result = messages.flatMap(({ role, content }) => { if (role === "system") { return [ - { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] }, - { role: "model", parts: [{ text: "OK" }] } + { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] } ]; } const parts = content == null || typeof content === "string" ? [{ text: content?.toString() ?? "" }] : content.map((item) => { @@ -96,11 +95,6 @@ function openAiMessageToGeminiMessage(messages) { return { text: "OK" }; }); return [{ role: "user" === role ? "user" : "model", parts }]; - }).flatMap((item, idx, arr) => { - if (item.role === arr.at(idx + 1)?.role && item.role === "user") { - return [item, { role: "model", parts: [{ text: "" }] }]; - } - return [item]; }); return result; } diff --git a/dist/main_node.mjs b/dist/main_node.mjs index 1cb4f4f..7a4a131 100644 --- a/dist/main_node.mjs +++ b/dist/main_node.mjs @@ -531,8 +531,7 @@ function openAiMessageToGeminiMessage(messages) { const result = messages.flatMap(({ role, content }) => { if (role === "system") { return [ - { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] }, - { role: "model", parts: [{ text: "OK" }] } + { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] } ]; } const parts = content == null || typeof content === "string" ? [{ text: content?.toString() ?? "" }] : content.map((item) => { @@ -541,11 +540,6 @@ function openAiMessageToGeminiMessage(messages) { return { text: "OK" }; }); return [{ role: "user" === role ? "user" : "model", parts }]; - }).flatMap((item, idx, arr) => { - if (item.role === arr.at(idx + 1)?.role && item.role === "user") { - return [item, { role: "model", parts: [{ text: "" }] }]; - } - return [item]; }); return result; } diff --git a/src/utils.ts b/src/utils.ts index 10dc03b..54f9f38 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -47,32 +47,22 @@ function parseBase64(base64: string): Part { } export function openAiMessageToGeminiMessage(messages: OpenAI.Chat.ChatCompletionMessageParam[]): Content[] { - const result: Content[] = messages - .flatMap(({ role, content }) => { - if (role === "system") { - return [ - { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] }, - { role: "model", parts: [{ text: "OK" }] }, - ] satisfies Content[] as Content[] - } - - const parts: Part[] = - content == null || typeof content === "string" - ? [{ text: content?.toString() ?? "" }] - : content.map((item) => { - if (item.type === "text") return { text: item.text } - if (item.type === "image_url") return parseBase64(item.image_url.url) - return { text: "OK" } - }) - - return [{ role: "user" === role ? "user" : "model", parts: parts }] - }) - .flatMap((item, idx, arr) => { - if (item.role === arr.at(idx + 1)?.role && item.role === "user") { - return [item, { role: "model", parts: [{ text: "" }] }] - } - return [item] - }) + const result: Content[] = messages.flatMap(({ role, content }) => { + if (role === "system") { + return [ + { role: "user", parts: typeof content !== "string" ? content : [{ text: content }] }, + ] satisfies Content[] as Content[] + } + const parts: Part[] = + content == null || typeof content === "string" + ? [{ text: content?.toString() ?? "" }] + : content.map((item) => { + if (item.type === "text") return { text: item.text } + if (item.type === "image_url") return parseBase64(item.image_url.url) + return { text: "OK" } + }) + return [{ role: "user" === role ? "user" : "model", parts: parts }] + }) return result }