Feat update openai setting (#876)
* remove google ai * update openAI models * use custom models for openai
This commit is contained in:
@@ -87,7 +87,6 @@
|
||||
"@electron-forge/publisher-s3": "^7.4.0",
|
||||
"@hookform/resolvers": "^3.9.0",
|
||||
"@langchain/community": "^0.2.17",
|
||||
"@langchain/google-genai": "^0.0.21",
|
||||
"@mozilla/readability": "^0.5.0",
|
||||
"@radix-ui/react-accordion": "^1.2.0",
|
||||
"@radix-ui/react-alert-dialog": "^1.1.1",
|
||||
|
||||
@@ -398,9 +398,12 @@
|
||||
"openaiConfigSaved": "OpenAI config saved",
|
||||
"openaiKeyRequired": "OpenAI key required",
|
||||
"baseUrl": "baseURL",
|
||||
"customModels": "Custom models",
|
||||
"customModelsDescription": "Customize your LLM models. Split by comma.",
|
||||
"model": "model",
|
||||
"key": "key",
|
||||
"leaveEmptyToUseDefault": "Leave empty to use default",
|
||||
"openaiBaseUrlDescription": "Any endpoint that supports OpenAI style API.",
|
||||
"newConversation": "New conversation",
|
||||
"selectAiRole": "Select AI role",
|
||||
"chooseFromPresetGpts": "Choose from preset GPTs",
|
||||
|
||||
@@ -398,9 +398,12 @@
|
||||
"openaiConfigSaved": "OpenAI 配置已保存",
|
||||
"openaiKeyRequired": "未配置 OpenAI 密钥",
|
||||
"baseUrl": "接口地址",
|
||||
"customModels": "自定义模型",
|
||||
"customModelsDescription": "自定义模型,设置多个模型时用英文逗号隔开",
|
||||
"model": "模型",
|
||||
"key": "密钥",
|
||||
"leaveEmptyToUseDefault": "留空则使用默认值",
|
||||
"openaiBaseUrlDescription": "支持所有兼容 OpenAI 风格的 API",
|
||||
"newConversation": "新对话",
|
||||
"selectAiRole": "选择 AI 角色",
|
||||
"chooseFromPresetGpts": "从预设的 GPTs 中选择",
|
||||
|
||||
@@ -59,9 +59,7 @@ export const ConversationForm = (props: {
|
||||
|
||||
const conversationFormSchema = z.object({
|
||||
name: z.string().optional(),
|
||||
engine: z
|
||||
.enum(["enjoyai", "openai", "ollama", "googleGenerativeAi"])
|
||||
.default("openai"),
|
||||
engine: z.enum(["enjoyai", "openai", "ollama"]).default("openai"),
|
||||
configuration: z.object({
|
||||
type: z.enum(["gpt", "tts"]),
|
||||
model: z.string().optional(),
|
||||
@@ -69,7 +67,7 @@ export const ConversationForm = (props: {
|
||||
roleDefinition: z.string().optional(),
|
||||
temperature: z.number().min(0).max(1).default(0.2),
|
||||
numberOfChoices: z.number().min(1).default(1),
|
||||
maxTokens: z.number().min(-1).default(2000),
|
||||
maxTokens: z.number().min(-1).default(2048),
|
||||
presencePenalty: z.number().min(-2).max(2).default(0),
|
||||
frequencyPenalty: z.number().min(-2).max(2).default(0),
|
||||
historyBufferSize: z.number().min(0).default(10),
|
||||
@@ -102,6 +100,10 @@ export const ConversationForm = (props: {
|
||||
console.warn(`No ollama server found: ${e.message}`);
|
||||
}
|
||||
|
||||
if (openai.models) {
|
||||
providers["openai"].models = openai.models.split(",");
|
||||
}
|
||||
|
||||
setGptProviders({ ...providers });
|
||||
};
|
||||
|
||||
|
||||
@@ -53,18 +53,6 @@ export const GPT_PROVIDERS: { [key: string]: any } = {
|
||||
"tts",
|
||||
],
|
||||
},
|
||||
googleGenerativeAi: {
|
||||
name: "Google Generative AI",
|
||||
models: ["gemini-pro"],
|
||||
configurable: [
|
||||
"model",
|
||||
"roleDefinition",
|
||||
"temperature",
|
||||
"maxTokens",
|
||||
"historyBufferSize",
|
||||
"tts",
|
||||
],
|
||||
},
|
||||
ollama: {
|
||||
name: "Ollama",
|
||||
description: t("ensureYouHaveOllamaRunningLocallyAndHasAtLeastOneModel"),
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
import { t } from "i18next";
|
||||
import { Button, Input, Label, toast } from "@renderer/components/ui";
|
||||
import { AISettingsProviderContext } from "@renderer/context";
|
||||
import { useContext, useState, useRef, useEffect } from "react";
|
||||
|
||||
export const GoogleGenerativeAiSettings = () => {
|
||||
const { googleGenerativeAi, setGoogleGenerativeAi } = useContext(
|
||||
AISettingsProviderContext
|
||||
);
|
||||
const [editing, setEditing] = useState(false);
|
||||
const ref = useRef<HTMLInputElement>();
|
||||
|
||||
const handleSave = () => {
|
||||
if (!ref.current) return;
|
||||
|
||||
setGoogleGenerativeAi({
|
||||
key: ref.current.value,
|
||||
});
|
||||
setEditing(false);
|
||||
|
||||
toast.success(t("googleGenerativeAiKeySaved"));
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (editing) {
|
||||
ref.current?.focus();
|
||||
}
|
||||
}, [editing]);
|
||||
|
||||
return (
|
||||
<div className="flex items-start justify-between py-4">
|
||||
<div className="">
|
||||
<div className="mb-2">Google Generative AI</div>
|
||||
<div className="text-sm text-muted-foreground">
|
||||
<div className="flex items-center space-x-4">
|
||||
<Label className="min-w-max">{t("key")}:</Label>
|
||||
<Input
|
||||
ref={ref}
|
||||
type="password"
|
||||
defaultValue={googleGenerativeAi?.key}
|
||||
placeholder=""
|
||||
disabled={!editing}
|
||||
className="focus-visible:outline-0 focus-visible:ring-0 shadow-none"
|
||||
/>
|
||||
{editing && (
|
||||
<Button
|
||||
size="sm"
|
||||
className="min-w-max text-md"
|
||||
onClick={handleSave}
|
||||
>
|
||||
{t("save")}
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="">
|
||||
<Button
|
||||
variant={editing ? "outline" : "secondary"}
|
||||
size="sm"
|
||||
onClick={() => setEditing(!editing)}
|
||||
>
|
||||
{editing ? t("cancel") : t("edit")}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -14,7 +14,6 @@ export * from "./default-engine-settings";
|
||||
export * from "./openai-settings";
|
||||
export * from "./library-settings";
|
||||
export * from "./whisper-settings";
|
||||
export * from "./google-generative-ai-settings";
|
||||
|
||||
export * from "./user-settings";
|
||||
export * from "./email-settings";
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
FormMessage,
|
||||
Input,
|
||||
toast,
|
||||
FormDescription,
|
||||
} from "@renderer/components/ui";
|
||||
import { AISettingsProviderContext } from "@renderer/context";
|
||||
import { useContext, useState } from "react";
|
||||
@@ -22,6 +23,7 @@ export const OpenaiSettings = () => {
|
||||
const openAiConfigSchema = z.object({
|
||||
key: z.string().optional(),
|
||||
baseUrl: z.string().optional(),
|
||||
models: z.string().optional(),
|
||||
});
|
||||
|
||||
const form = useForm<z.infer<typeof openAiConfigSchema>>({
|
||||
@@ -29,6 +31,7 @@ export const OpenaiSettings = () => {
|
||||
values: {
|
||||
key: openai?.key,
|
||||
baseUrl: openai?.baseUrl,
|
||||
models: openai?.models,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -82,6 +85,32 @@ export const OpenaiSettings = () => {
|
||||
onChange={field.onChange}
|
||||
/>
|
||||
</div>
|
||||
<FormDescription>
|
||||
{t("openaiBaseUrlDescription")}
|
||||
</FormDescription>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="models"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<div className="flex items-center space-x-2">
|
||||
<FormLabel className="min-w-max">
|
||||
{t("customModels")}:
|
||||
</FormLabel>
|
||||
<Input
|
||||
disabled={!editing}
|
||||
placeholder={t("leaveEmptyToUseDefault")}
|
||||
value={field.value}
|
||||
onChange={field.onChange}
|
||||
/>
|
||||
</div>
|
||||
<FormDescription>
|
||||
{t("customModelsDescription")}
|
||||
</FormDescription>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
|
||||
@@ -12,7 +12,6 @@ import {
|
||||
WhisperSettings,
|
||||
OpenaiSettings,
|
||||
ProxySettings,
|
||||
GoogleGenerativeAiSettings,
|
||||
ResetSettings,
|
||||
ResetAllSettings,
|
||||
NativeLanguageSettings,
|
||||
@@ -42,8 +41,6 @@ export const Preferences = () => {
|
||||
<Separator />
|
||||
<OpenaiSettings />
|
||||
<Separator />
|
||||
<GoogleGenerativeAiSettings />
|
||||
<Separator />
|
||||
</div>
|
||||
),
|
||||
},
|
||||
|
||||
@@ -8,8 +8,6 @@ type AISettingsProviderState = {
|
||||
refreshWhisperConfig?: () => void;
|
||||
openai?: LlmProviderType;
|
||||
setOpenai?: (config: LlmProviderType) => void;
|
||||
googleGenerativeAi?: LlmProviderType;
|
||||
setGoogleGenerativeAi?: (config: LlmProviderType) => void;
|
||||
setGptEngine?: (engine: GptEngineSettingType) => void;
|
||||
currentEngine?: GptEngineSettingType;
|
||||
};
|
||||
@@ -31,8 +29,6 @@ export const AISettingsProvider = ({
|
||||
},
|
||||
});
|
||||
const [openai, setOpenai] = useState<LlmProviderType>(null);
|
||||
const [googleGenerativeAi, setGoogleGenerativeAi] =
|
||||
useState<LlmProviderType>(null);
|
||||
const [whisperConfig, setWhisperConfig] = useState<WhisperConfigType>(null);
|
||||
const { EnjoyApp, libraryPath, user, apiUrl } = useContext(
|
||||
AppSettingsProviderContext
|
||||
@@ -73,15 +69,6 @@ export const AISettingsProvider = ({
|
||||
setOpenai(Object.assign({ name: "openai" }, _openai));
|
||||
}
|
||||
|
||||
const _googleGenerativeAi = await EnjoyApp.settings.getLlm(
|
||||
"googleGenerativeAi"
|
||||
);
|
||||
if (_googleGenerativeAi) {
|
||||
setGoogleGenerativeAi(
|
||||
Object.assign({ name: "googleGenerativeAi" }, _googleGenerativeAi)
|
||||
);
|
||||
}
|
||||
|
||||
const _defaultEngine = await EnjoyApp.settings.getDefaultEngine();
|
||||
const _gptEngine = await EnjoyApp.settings.getGptEngine();
|
||||
if (_gptEngine) {
|
||||
@@ -131,11 +118,8 @@ export const AISettingsProvider = ({
|
||||
case "openai":
|
||||
setOpenai(Object.assign({ name: "openai" }, _config));
|
||||
break;
|
||||
case "googleGenerativeAi":
|
||||
setGoogleGenerativeAi(
|
||||
Object.assign({ name: "googleGenerativeAi" }, _config)
|
||||
);
|
||||
break;
|
||||
default:
|
||||
throw new Error("Unsupported LLM provider");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -152,6 +136,7 @@ export const AISettingsProvider = ({
|
||||
? Object.assign(gptEngine, {
|
||||
key: openai.key,
|
||||
baseUrl: openai.baseUrl,
|
||||
models: openai.models,
|
||||
})
|
||||
: Object.assign(gptEngine, {
|
||||
key: user?.accessToken,
|
||||
@@ -159,9 +144,6 @@ export const AISettingsProvider = ({
|
||||
}),
|
||||
openai,
|
||||
setOpenai: (config: LlmProviderType) => handleSetLlm("openai", config),
|
||||
googleGenerativeAi,
|
||||
setGoogleGenerativeAi: (config: LlmProviderType) =>
|
||||
handleSetLlm("googleGenerativeAi", config),
|
||||
whisperConfig,
|
||||
refreshWhisperConfig,
|
||||
setWhisperModel,
|
||||
|
||||
@@ -7,7 +7,6 @@ import { ChatMessageHistory, BufferMemory } from "langchain/memory/index";
|
||||
import { ConversationChain } from "langchain/chains";
|
||||
import { ChatOpenAI } from "@langchain/openai";
|
||||
import { ChatOllama } from "@langchain/community/chat_models/ollama";
|
||||
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
|
||||
import {
|
||||
ChatPromptTemplate,
|
||||
MessagesPlaceholder,
|
||||
@@ -22,7 +21,7 @@ export const useConversation = () => {
|
||||
const { EnjoyApp, webApi, user, apiUrl, learningLanguage } = useContext(
|
||||
AppSettingsProviderContext
|
||||
);
|
||||
const { openai, googleGenerativeAi, currentEngine } = useContext(
|
||||
const { openai, currentEngine } = useContext(
|
||||
AISettingsProviderContext
|
||||
);
|
||||
|
||||
@@ -76,17 +75,6 @@ export const useConversation = () => {
|
||||
presencePenalty,
|
||||
maxRetries: 2,
|
||||
});
|
||||
} else if (conversation.engine === "googleGenerativeAi") {
|
||||
if (!googleGenerativeAi)
|
||||
throw new Error("Google Generative AI API key is required");
|
||||
|
||||
return new ChatGoogleGenerativeAI({
|
||||
apiKey: googleGenerativeAi.key,
|
||||
modelName: model,
|
||||
temperature: temperature,
|
||||
maxOutputTokens: maxTokens,
|
||||
maxRetries: 2,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
2
enjoy/src/types/conversation.d.ts
vendored
2
enjoy/src/types/conversation.d.ts
vendored
@@ -1,7 +1,7 @@
|
||||
type ConversationType = {
|
||||
id: string;
|
||||
type: "gpt" | "tts";
|
||||
engine: "enjoyai" | "openai" | "ollama" | "googleGenerativeAi";
|
||||
engine: "enjoyai" | "openai" | "ollama";
|
||||
name: string;
|
||||
configuration: { [key: string]: any };
|
||||
model: string;
|
||||
|
||||
5
enjoy/src/types/index.d.ts
vendored
5
enjoy/src/types/index.d.ts
vendored
@@ -5,13 +5,14 @@ declare const MAIN_WINDOW_VITE_DEV_SERVER_URL: string;
|
||||
declare const MAIN_WINDOW_VITE_NAME: string;
|
||||
declare module "compromise-paragraphs";
|
||||
|
||||
type SupportedLlmProviderType = "enjoyai" | "openai" | "googleGenerativeAi";
|
||||
type SupportedLlmProviderType = "enjoyai" | "openai";
|
||||
|
||||
type LlmProviderType = {
|
||||
name?: "enjoyai" | "openai" | "googleGenerativeAi";
|
||||
name?: "enjoyai" | "openai";
|
||||
key?: string;
|
||||
model?: string;
|
||||
baseUrl?: string;
|
||||
models?: string;
|
||||
};
|
||||
|
||||
type DownloadStateType = {
|
||||
|
||||
21
yarn.lock
21
yarn.lock
@@ -3302,13 +3302,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@google/generative-ai@npm:^0.7.0":
|
||||
version: 0.7.1
|
||||
resolution: "@google/generative-ai@npm:0.7.1"
|
||||
checksum: 10c0/0632dc794fb6186a533381e99cba4d839d0032bdded42458a9c95d17e1c9c45494c8574ba50ec8a97da92e2213518ad811f882c55bbe18c70f660bf7796c4376
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@grpc/grpc-js@npm:^1.7.1":
|
||||
version: 1.10.9
|
||||
resolution: "@grpc/grpc-js@npm:1.10.9"
|
||||
@@ -4004,17 +3997,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@langchain/google-genai@npm:^0.0.21":
|
||||
version: 0.0.21
|
||||
resolution: "@langchain/google-genai@npm:0.0.21"
|
||||
dependencies:
|
||||
"@google/generative-ai": "npm:^0.7.0"
|
||||
"@langchain/core": "npm:>=0.2.9 <0.3.0"
|
||||
zod-to-json-schema: "npm:^3.22.4"
|
||||
checksum: 10c0/d9331b2bc3c919e2e4d1c7406986094fc38242471d6e7b6de1807179f9bcff3fcbd7fa360756782be63641451dd649d290ecf958b048e9a9f41ebea3b78311ce
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@langchain/openai@npm:>=0.1.0 <0.3.0":
|
||||
version: 0.2.0
|
||||
resolution: "@langchain/openai@npm:0.2.0"
|
||||
@@ -14307,7 +14289,6 @@ __metadata:
|
||||
"@electron/fuses": "npm:^1.8.0"
|
||||
"@hookform/resolvers": "npm:^3.9.0"
|
||||
"@langchain/community": "npm:^0.2.17"
|
||||
"@langchain/google-genai": "npm:^0.0.21"
|
||||
"@mozilla/readability": "npm:^0.5.0"
|
||||
"@playwright/test": "npm:^1.45.2"
|
||||
"@radix-ui/react-accordion": "npm:^1.2.0"
|
||||
@@ -27861,7 +27842,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"zod-to-json-schema@npm:^3.22.3, zod-to-json-schema@npm:^3.22.4, zod-to-json-schema@npm:^3.22.5":
|
||||
"zod-to-json-schema@npm:^3.22.3, zod-to-json-schema@npm:^3.22.5":
|
||||
version: 3.23.0
|
||||
resolution: "zod-to-json-schema@npm:3.23.0"
|
||||
peerDependencies:
|
||||
|
||||
Reference in New Issue
Block a user