diff --git a/.env.template b/.env.template index c7cf0bcdd..cf02aeedc 100644 --- a/.env.template +++ b/.env.template @@ -14,8 +14,8 @@ PROXY_URL=http://localhost:7890 GOOGLE_API_KEY= # (optional) -# Default: https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent -# Googel Gemini Pro API url, set if you want to customize Google Gemini Pro API url. +# Default: https://generativelanguage.googleapis.com/ +# Googel Gemini Pro API url without pathname, set if you want to customize Google Gemini Pro API url. GOOGLE_BASE_URL= # Override openai api request base url. (optional) diff --git a/README.md b/README.md index 45bf58baf..f07089d91 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
-icon +icon

ChatGPT Next Web LangChain

diff --git a/app/client/platforms/google.ts b/app/client/platforms/google.ts index 05de1f1e9..2f1924f50 100644 --- a/app/client/platforms/google.ts +++ b/app/client/platforms/google.ts @@ -13,7 +13,15 @@ import { LLMUsage, } from "../api"; import { useAccessStore, useAppConfig, useChatStore } from "@/app/store"; - +import { + EventStreamContentType, + fetchEventSource, +} from "@fortaine/fetch-event-source"; +import { prettyObject } from "@/app/utils/format"; +import { getClientConfig } from "@/app/config/client"; +import Locale from "../../locales"; +import { getServerSideConfig } from "@/app/config/server"; +import de from "@/app/locales/de"; export class GeminiProApi implements LLMApi { toolAgentChat(options: AgentChatOptions): Promise { throw new Error("Method not implemented."); @@ -66,6 +74,24 @@ export class GeminiProApi implements LLMApi { topP: modelConfig.top_p, // "topK": modelConfig.top_k, }, + safetySettings: [ + { + category: "HARM_CATEGORY_HARASSMENT", + threshold: "BLOCK_ONLY_HIGH", + }, + { + category: "HARM_CATEGORY_HATE_SPEECH", + threshold: "BLOCK_ONLY_HIGH", + }, + { + category: "HARM_CATEGORY_SEXUALLY_EXPLICIT", + threshold: "BLOCK_ONLY_HIGH", + }, + { + category: "HARM_CATEGORY_DANGEROUS_CONTENT", + threshold: "BLOCK_ONLY_HIGH", + }, + ], }; console.log("[Request] google payload: ", requestPayload); @@ -95,9 +121,11 @@ export class GeminiProApi implements LLMApi { "streamGenerateContent", ); let finished = false; + + let existingTexts: string[] = []; const finish = () => { finished = true; - options.onFinish(responseText + remainText); + options.onFinish(existingTexts.join("")); }; // animate response to make it looks smooth @@ -142,11 +170,26 @@ export class GeminiProApi implements LLMApi { try { let data = JSON.parse(ensureProperEnding(partialData)); - console.log(data); - let fetchText = apiClient.extractMessage(data[data.length - 1]); - console.log("[Response Animation] fetchText: ", fetchText); - remainText += fetchText; + + const textArray = data.reduce( + (acc: string[], item: { candidates: any[] }) => { + const texts = item.candidates.map((candidate) => + candidate.content.parts + .map((part: { text: any }) => part.text) + .join(""), + ); + return acc.concat(texts); + }, + [], + ); + + if (textArray.length > existingTexts.length) { + const deltaArray = textArray.slice(existingTexts.length); + existingTexts = textArray; + remainText += deltaArray.join(""); + } } catch (error) { + // console.log("[Response Animation] error: ", error,partialData); // skip error message when parsing json } diff --git a/app/constant.ts b/app/constant.ts index 43ad8f5cc..729ebf825 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -93,10 +93,8 @@ export const Azure = { }; export const Google = { - ExampleEndpoint: "https://generativelanguage.googleapis.com", - ChatPath: "v1/models/gemini-pro:generateContent", - - // /api/openai/v1/chat/completions + ExampleEndpoint: "https://generativelanguage.googleapis.com/", + ChatPath: "v1beta/models/gemini-pro:generateContent", }; export const DEFAULT_INPUT_TEMPLATE = `{{input}}`; // input / time / model / lang diff --git a/app/locales/cn.ts b/app/locales/cn.ts index fada008d0..97be3bbe0 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -323,7 +323,7 @@ const cn = { Endpoint: { Title: "接口地址", - SubTitle: "样例:", + SubTitle: "不包含请求路径,样例:", }, ApiVerion: { diff --git a/docs/images/head-cover.png b/docs/images/head-cover.png new file mode 100644 index 000000000..859d83b05 Binary files /dev/null and b/docs/images/head-cover.png differ diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index 700c48286..b191a58ac 100644 Binary files a/public/android-chrome-192x192.png and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png index e701ed2fb..c7e52c394 100644 Binary files a/public/android-chrome-512x512.png and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index 387303114..b0da95315 100644 Binary files a/public/apple-touch-icon.png and b/public/apple-touch-icon.png differ diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png index 92f53492f..3f8e0a535 100644 Binary files a/public/favicon-16x16.png and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png index f1f439e85..2fee10dfb 100644 Binary files a/public/favicon-32x32.png and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico index a3737b350..b5e8234cd 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/macos.png b/public/macos.png index f1bd0e69f..2eb110707 100644 Binary files a/public/macos.png and b/public/macos.png differ