feat: web search

This commit is contained in:
Hk-Gosuto
2025-02-25 12:57:21 +08:00
parent 657e44b501
commit 59dd3213f8
34 changed files with 404 additions and 102 deletions

View File

@@ -142,6 +142,7 @@ const DEFAULT_ACCESS_STATE = {
defaultModel: "",
visionModels: "",
isEnableRAG: false,
isEnableWebSearch: false,
// tts config
edgeTTSVoiceName: "zh-CN-YunxiNeural",
@@ -191,6 +192,12 @@ export const useAccessStore = createPersistStore(
return get().isEnableRAG;
},
enableWebSearch() {
this.fetch();
return get().isEnableWebSearch;
},
isValidOpenAI() {
return ensure(get(), ["openaiApiKey"]);
},

View File

@@ -33,8 +33,9 @@ import { ModelConfig, ModelType, useAppConfig } from "./config";
import { useAccessStore } from "./access";
import { collectModelsWithDefaultModel } from "../utils/model";
import { createEmptyMask, Mask } from "./mask";
import { FileInfo } from "../client/platforms/utils";
import { FileInfo, WebApi } from "../client/platforms/utils";
import { usePluginStore } from "./plugin";
import { TavilySearchResponse } from "@tavily/core";
export interface ChatToolMessage {
toolName: string;
@@ -64,7 +65,7 @@ export type ChatMessage = RequestMessage & {
id: string;
model?: ModelType;
tools?: ChatMessageTool[];
audio_url?: string;
audioUrl?: string;
};
export function createMessage(override: Partial<ChatMessage>): ChatMessage {
@@ -383,9 +384,11 @@ export const useChatStore = createPersistStore(
content: string,
attachImages?: string[],
attachFiles?: FileInfo[],
webSearchReference?: TavilySearchResponse,
) {
const session = get().currentSession();
const modelConfig = session.mask.modelConfig;
const accessStore = useAccessStore.getState();
const userContent = fillTemplateWith(content, modelConfig);
console.log("[User Input] after template: ", userContent);
@@ -413,6 +416,7 @@ export const useChatStore = createPersistStore(
role: "user",
content: mContent,
fileInfos: attachFiles,
webSearchReferences: webSearchReference,
});
const botMessage: ChatMessage = createMessage({
@@ -534,6 +538,16 @@ export const useChatStore = createPersistStore(
};
agentCall();
} else {
if (session.mask.webSearch && accessStore.enableWebSearch()) {
botMessage.content = Locale.Chat.Searching;
get().updateTargetSession(session, (session) => {
session.messages = session.messages.concat();
});
const webApi = new WebApi();
const webSearchReference = await webApi.search(content);
userMessage.webSearchReferences = webSearchReference;
botMessage.webSearchReferences = webSearchReference;
}
// make request
api.llm.chat({
messages: sendMessages,

View File

@@ -18,6 +18,7 @@ export type Mask = {
lang: Lang;
builtin: boolean;
usePlugins?: boolean;
webSearch?: boolean;
// 上游插件业务参数
plugin?: string[];
enableArtifacts?: boolean;