mirror of
https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
synced 2025-11-14 13:03:49 +08:00
feat: web search
This commit is contained in:
@@ -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"]);
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -18,6 +18,7 @@ export type Mask = {
|
||||
lang: Lang;
|
||||
builtin: boolean;
|
||||
usePlugins?: boolean;
|
||||
webSearch?: boolean;
|
||||
// 上游插件业务参数
|
||||
plugin?: string[];
|
||||
enableArtifacts?: boolean;
|
||||
|
||||
Reference in New Issue
Block a user