feat: 添加联网搜索功能,更新相关配置和多语言支持

This commit is contained in:
EvanWu 2025-08-05 18:28:06 +08:00
parent 4e3f166d67
commit 044298e18a
26 changed files with 118 additions and 5 deletions

View File

@ -58,6 +58,7 @@ interface RequestParam {
top_p: number; top_p: number;
max_tokens?: number; max_tokens?: number;
tools?: FunctionToolItem[]; tools?: FunctionToolItem[];
enable_search?: boolean;
} }
interface RequestPayload { interface RequestPayload {
model: string; model: string;
@ -199,6 +200,7 @@ export class QwenApi implements LLMApi {
temperature: modelConfig.temperature, temperature: modelConfig.temperature,
// max_tokens: modelConfig.max_tokens, // max_tokens: modelConfig.max_tokens,
top_p: modelConfig.top_p === 1 ? 0.99 : modelConfig.top_p, // qwen top_p is should be < 1 top_p: modelConfig.top_p === 1 ? 0.99 : modelConfig.top_p, // qwen top_p is should be < 1
enable_search: modelConfig.enableNetWork,
}, },
}; };

View File

@ -48,6 +48,7 @@ import PluginIcon from "../icons/plugin.svg";
import ShortcutkeyIcon from "../icons/shortcutkey.svg"; import ShortcutkeyIcon from "../icons/shortcutkey.svg";
import McpToolIcon from "../icons/tool.svg"; import McpToolIcon from "../icons/tool.svg";
import HeadphoneIcon from "../icons/headphone.svg"; import HeadphoneIcon from "../icons/headphone.svg";
import NetWorkIcon from "../icons/network.svg";
import { import {
BOT_HELLO, BOT_HELLO,
ChatMessage, ChatMessage,
@ -75,6 +76,7 @@ import {
useMobileScreen, useMobileScreen,
selectOrCopy, selectOrCopy,
showPlugins, showPlugins,
canUseNetWork,
} from "../utils"; } from "../utils";
import { uploadImage as uploadImageRemote } from "@/app/utils/chat"; import { uploadImage as uploadImageRemote } from "@/app/utils/chat";
@ -510,6 +512,7 @@ export function ChatActions(props: {
// switch themes // switch themes
const theme = config.theme; const theme = config.theme;
const enableNetWork = config.modelConfig.enableNetWork;
function nextTheme() { function nextTheme() {
const themes = [Theme.Auto, Theme.Light, Theme.Dark]; const themes = [Theme.Auto, Theme.Light, Theme.Dark];
@ -519,6 +522,13 @@ export function ChatActions(props: {
config.update((config) => (config.theme = nextTheme)); config.update((config) => (config.theme = nextTheme));
} }
function nextNetWork() {
config.update(
(config) =>
(config.modelConfig.enableNetWork = !config.modelConfig.enableNetWork),
);
}
// stop all responses // stop all responses
const couldStop = ChatControllerPool.hasPending(); const couldStop = ChatControllerPool.hasPending();
const stopAll = () => ChatControllerPool.stopAll(); const stopAll = () => ChatControllerPool.stopAll();
@ -831,6 +841,16 @@ export function ChatActions(props: {
/> />
)} )}
{!isMobileScreen && <MCPAction />} {!isMobileScreen && <MCPAction />}
{canUseNetWork(currentModel) && (
<ChatAction
onClick={nextNetWork}
text={
Locale.Chat.InputActions.NetWork[enableNetWork ? "on" : "off"]
}
icon={<NetWorkIcon />}
/>
)}
</> </>
<div className={styles["chat-input-actions-end"]}> <div className={styles["chat-input-actions-end"]}>
{config.realtimeConfig.enable && ( {config.realtimeConfig.enable && (

1
app/icons/network.svg Normal file
View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1754388361314" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1734" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M522.666667 42.666667c3.776 0 7.530667 0.170667 11.242666 0.490666C782.954667 54.613333 981.333333 260.138667 981.333333 512c0 251.861333-198.4 457.386667-447.424 468.821333-3.712 0.341333-7.466667 0.512-11.242666 0.512l-3.285334-0.064C516.906667 981.333333 514.474667 981.333333 512 981.333333 252.8 981.333333 42.666667 771.2 42.666667 512S252.8 42.666667 512 42.666667l7.658667 0.042666L522.666667 42.666667zM490.666667 533.333333h-149.056c4.842667 191.082667 74.069333 342.08 149.056 376.576V533.333333z m213.056 0H554.666667v376.576c74.986667-34.517333 144.213333-185.514667 149.056-376.554666z m-426.133334 0H107.221333c8.746667 168.853333 120.853333 310.4 274.261334 362.517334-60.16-81.109333-100.394667-212.650667-103.893334-362.496z m639.189334 0h-149.034667c-3.349333 143.104-40.170667 269.504-95.872 351.253334C810.048 825.216 908.586667 691.221333 916.778667 533.333333zM381.482667 128.128c-146.986667 50.069333-255.936 181.909333-272.597334 341.226667h169.450667c6.634667-140.970667 45.866667-263.978667 103.146667-341.226667zM342.4 469.333333H490.666667V114.090667C418.496 147.285333 351.637333 288.426667 342.4 469.333333zM554.666667 114.090667L554.666667 469.333333h148.266666C693.674667 288.448 626.837333 147.306667 554.666667 114.090667z m117.184 25.322666l1.834666 2.730667c51.904 77.674667 87.04 194.474667 93.290667 327.189333h148.117333c-15.530667-148.565333-111.317333-273.237333-243.242666-329.92z" fill="#333333" p-id="1735"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -72,6 +72,10 @@ const ar: PartialLocaleType = {
light: "الوضع الفاتح", light: "الوضع الفاتح",
dark: "الوضع الداكن", dark: "الوضع الداكن",
}, },
NetWork: {
on: "تفعيل البحث عبر الإنترنت",
off: "إيقاف البحث عبر الإنترنت",
},
Prompt: "الأوامر السريعة", Prompt: "الأوامر السريعة",
Masks: "جميع الأقنعة", Masks: "جميع الأقنعة",
Clear: "مسح الدردشة", Clear: "مسح الدردشة",

View File

@ -72,6 +72,10 @@ const bn: PartialLocaleType = {
light: "আলোর মোড", light: "আলোর মোড",
dark: "অন্ধকার মোড", dark: "অন্ধকার মোড",
}, },
NetWork: {
on: "ওয়েব অনুসন্ধান সক্রিয় করুন",
off: "ওয়েব অনুসন্ধান নিষ্ক্রিয় করুন",
},
Prompt: "সংক্ষিপ্ত নির্দেশনা", Prompt: "সংক্ষিপ্ত নির্দেশনা",
Masks: "সমস্ত মাস্ক", Masks: "সমস্ত মাস্ক",
Clear: "চ্যাট পরিষ্কার করুন", Clear: "চ্যাট পরিষ্কার করুন",

View File

@ -76,6 +76,10 @@ const cn = {
light: "亮色模式", light: "亮色模式",
dark: "深色模式", dark: "深色模式",
}, },
NetWork: {
on: "开启联网搜索",
off: "关闭联网搜索",
},
Prompt: "快捷指令", Prompt: "快捷指令",
Masks: "所有面具", Masks: "所有面具",
Clear: "清除聊天", Clear: "清除聊天",

View File

@ -72,6 +72,10 @@ const cs: PartialLocaleType = {
light: "Světelný režim", light: "Světelný režim",
dark: "Tmavý režim", dark: "Tmavý režim",
}, },
NetWork: {
on: "Povolit webové vyhledávání",
off: "Zakázat webové vyhledávání",
},
Prompt: "Rychlé příkazy", Prompt: "Rychlé příkazy",
Masks: "Všechny masky", Masks: "Všechny masky",
Clear: "Vymazat konverzaci", Clear: "Vymazat konverzaci",

View File

@ -74,6 +74,10 @@ const da: PartialLocaleType = {
light: "Lyst tema", light: "Lyst tema",
dark: "Mørkt tema", dark: "Mørkt tema",
}, },
NetWork: {
on: "Aktivér web-søgning",
off: "Deaktivér web-søgning",
},
Prompt: "Prompts", Prompt: "Prompts",
Masks: "Personaer", Masks: "Personaer",
Clear: "Ryd kontekst", Clear: "Ryd kontekst",

View File

@ -73,6 +73,10 @@ const de: PartialLocaleType = {
light: "Helles Thema", light: "Helles Thema",
dark: "Dunkles Thema", dark: "Dunkles Thema",
}, },
NetWork: {
on: "Web-Suche aktivieren",
off: "Web-Suche deaktivieren",
},
Prompt: "Schnellbefehle", Prompt: "Schnellbefehle",
Masks: "Alle Masken", Masks: "Alle Masken",
Clear: "Chat löschen", Clear: "Chat löschen",
@ -437,7 +441,8 @@ const de: PartialLocaleType = {
AI302: { AI302: {
ApiKey: { ApiKey: {
Title: "Schnittstellenschlüssel", Title: "Schnittstellenschlüssel",
SubTitle: "Verwenden Sie einen benutzerdefinierten 302.AI API-Schlüssel", SubTitle:
"Verwenden Sie einen benutzerdefinierten 302.AI API-Schlüssel",
Placeholder: "302.AI API-Schlüssel", Placeholder: "302.AI API-Schlüssel",
}, },
Endpoint: { Endpoint: {

View File

@ -77,6 +77,10 @@ const en: LocaleType = {
light: "Light Theme", light: "Light Theme",
dark: "Dark Theme", dark: "Dark Theme",
}, },
NetWork: {
on: "Enable Web Search",
off: "Disable Web Search",
},
Prompt: "Prompts", Prompt: "Prompts",
Masks: "Masks", Masks: "Masks",
Clear: "Clear Context", Clear: "Clear Context",

View File

@ -74,6 +74,10 @@ const es: PartialLocaleType = {
light: "Modo claro", light: "Modo claro",
dark: "Modo oscuro", dark: "Modo oscuro",
}, },
NetWork: {
on: "Habilitar búsqueda web",
off: "Deshabilitar búsqueda web",
},
Prompt: "Comandos rápidos", Prompt: "Comandos rápidos",
Masks: "Todas las máscaras", Masks: "Todas las máscaras",
Clear: "Limpiar chat", Clear: "Limpiar chat",

View File

@ -73,6 +73,10 @@ const fr: PartialLocaleType = {
light: "Mode clair", light: "Mode clair",
dark: "Mode sombre", dark: "Mode sombre",
}, },
NetWork: {
on: "Activer la recherche web",
off: "Désactiver la recherche web",
},
Prompt: "Commandes rapides", Prompt: "Commandes rapides",
Masks: "Tous les masques", Masks: "Tous les masques",
Clear: "Effacer la discussion", Clear: "Effacer la discussion",

View File

@ -72,6 +72,10 @@ const id: PartialLocaleType = {
light: "Mode Terang", light: "Mode Terang",
dark: "Mode Gelap", dark: "Mode Gelap",
}, },
NetWork: {
on: "Aktifkan pencarian web",
off: "Nonaktifkan pencarian web",
},
Prompt: "Perintah Cepat", Prompt: "Perintah Cepat",
Masks: "Semua Masker", Masks: "Semua Masker",
Clear: "Hapus Obrolan", Clear: "Hapus Obrolan",

View File

@ -73,6 +73,10 @@ const it: PartialLocaleType = {
light: "Tema chiaro", light: "Tema chiaro",
dark: "Tema scuro", dark: "Tema scuro",
}, },
NetWork: {
on: "Abilita ricerca web",
off: "Disabilita ricerca web",
},
Prompt: "Comandi rapidi", Prompt: "Comandi rapidi",
Masks: "Tutte le maschere", Masks: "Tutte le maschere",
Clear: "Pulisci chat", Clear: "Pulisci chat",

View File

@ -72,6 +72,10 @@ const jp: PartialLocaleType = {
light: "ライトモード", light: "ライトモード",
dark: "ダークモード", dark: "ダークモード",
}, },
NetWork: {
on: "ウェブ検索を有効化",
off: "ウェブ検索を無効化",
},
Prompt: "クイックコマンド", Prompt: "クイックコマンド",
Masks: "すべてのマスク", Masks: "すべてのマスク",
Clear: "チャットをクリア", Clear: "チャットをクリア",

View File

@ -76,6 +76,10 @@ const ko: PartialLocaleType = {
light: "라이트 모드", light: "라이트 모드",
dark: "다크 모드", dark: "다크 모드",
}, },
NetWork: {
on: "웹 검색 활성화",
off: "웹 검색 비활성화",
},
Prompt: "빠른 명령", Prompt: "빠른 명령",
Masks: "모든 마스크", Masks: "모든 마스크",
Clear: "채팅 지우기", Clear: "채팅 지우기",

View File

@ -74,6 +74,10 @@ const no: PartialLocaleType = {
light: "Lyst tema", light: "Lyst tema",
dark: "Mørkt tema", dark: "Mørkt tema",
}, },
NetWork: {
on: "Aktiver web-søk",
off: "Deaktiver web-søk",
},
Prompt: "Hurtigkommando", Prompt: "Hurtigkommando",
Masks: "Alle masker", Masks: "Alle masker",
Clear: "Rydd samtale", Clear: "Rydd samtale",

View File

@ -72,6 +72,10 @@ const pt: PartialLocaleType = {
light: "Tema Claro", light: "Tema Claro",
dark: "Tema Escuro", dark: "Tema Escuro",
}, },
NetWork: {
on: "Ativar pesquisa web",
off: "Desativar pesquisa web",
},
Prompt: "Prompts", Prompt: "Prompts",
Masks: "Máscaras", Masks: "Máscaras",
Clear: "Limpar Contexto", Clear: "Limpar Contexto",

View File

@ -72,6 +72,10 @@ const ru: PartialLocaleType = {
light: "Светлая тема", light: "Светлая тема",
dark: "Темная тема", dark: "Темная тема",
}, },
NetWork: {
on: "Включить веб-поиск",
off: "Отключить веб-поиск",
},
Prompt: "Быстрая команда", Prompt: "Быстрая команда",
Masks: "Все маски", Masks: "Все маски",
Clear: "Очистить чат", Clear: "Очистить чат",

View File

@ -73,6 +73,10 @@ const sk: PartialLocaleType = {
light: "Svetlý motív", light: "Svetlý motív",
dark: "Tmavý motív", dark: "Tmavý motív",
}, },
NetWork: {
on: "Povoliť webové vyhľadávanie",
off: "Zakázať webové vyhľadávanie",
},
Prompt: "Výzvy", Prompt: "Výzvy",
Masks: "Masky", Masks: "Masky",
Clear: "Vymazať kontext", Clear: "Vymazať kontext",

View File

@ -72,6 +72,10 @@ const tr: PartialLocaleType = {
light: "Açık mod", light: "Açık mod",
dark: "Koyu mod", dark: "Koyu mod",
}, },
NetWork: {
on: "Web aramasını etkinleştir",
off: "Web aramasını devre dışı bırak",
},
Prompt: "Kısayol komutu", Prompt: "Kısayol komutu",
Masks: "Tüm maskeler", Masks: "Tüm maskeler",
Clear: "Sohbeti temizle", Clear: "Sohbeti temizle",

View File

@ -72,6 +72,10 @@ const tw = {
light: "亮色模式", light: "亮色模式",
dark: "深色模式", dark: "深色模式",
}, },
NetWork: {
on: "開啟網路搜尋",
off: "關閉網路搜尋",
},
Prompt: "快捷指令", Prompt: "快捷指令",
Masks: "所有角色範本", Masks: "所有角色範本",
Clear: "清除聊天", Clear: "清除聊天",

View File

@ -72,6 +72,10 @@ const vi: PartialLocaleType = {
light: "Chế độ sáng", light: "Chế độ sáng",
dark: "Chế độ tối", dark: "Chế độ tối",
}, },
NetWork: {
on: "Bật tìm kiếm web",
off: "Tắt tìm kiếm web",
},
Prompt: "Lệnh tắt", Prompt: "Lệnh tắt",
Masks: "Tất cả mặt nạ", Masks: "Tất cả mặt nạ",
Clear: "Xóa cuộc trò chuyện", Clear: "Xóa cuộc trò chuyện",

View File

@ -6,7 +6,6 @@ import {
DEFAULT_MODELS, DEFAULT_MODELS,
DEFAULT_SIDEBAR_WIDTH, DEFAULT_SIDEBAR_WIDTH,
DEFAULT_TTS_ENGINE, DEFAULT_TTS_ENGINE,
DEFAULT_TTS_ENGINES,
DEFAULT_TTS_MODEL, DEFAULT_TTS_MODEL,
DEFAULT_TTS_MODELS, DEFAULT_TTS_MODELS,
DEFAULT_TTS_VOICE, DEFAULT_TTS_VOICE,
@ -82,6 +81,7 @@ export const DEFAULT_CONFIG = {
size: "1024x1024" as ModelSize, size: "1024x1024" as ModelSize,
quality: "standard" as DalleQuality, quality: "standard" as DalleQuality,
style: "vivid" as DalleStyle, style: "vivid" as DalleStyle,
enableNetWork: false,
}, },
ttsConfig: { ttsConfig: {

View File

@ -296,6 +296,15 @@ export function isDalle3(model: string) {
return "dall-e-3" === model; return "dall-e-3" === model;
} }
export function canUseNetWork(model: string) {
return (
model.includes("qwen-max") ||
model.includes("qwen-plus") ||
model.includes("qwen-turbo") ||
model.includes("qwq")
);
}
export function getTimeoutMSByModel(model: string) { export function getTimeoutMSByModel(model: string) {
model = model.toLowerCase(); model = model.toLowerCase();
if ( if (

View File

@ -2,16 +2,16 @@
{ {
"id": "dalle3", "id": "dalle3",
"name": "Dalle3", "name": "Dalle3",
"schema": "https://ghp.ci/https://raw.githubusercontent.com/ChatGPTNextWeb/NextChat-Awesome-Plugins/main/plugins/dalle/openapi.json" "schema": "https://raw.githubusercontent.com/ChatGPTNextWeb/NextChat-Awesome-Plugins/main/plugins/dalle/openapi.json"
}, },
{ {
"id": "arxivsearch", "id": "arxivsearch",
"name": "ArxivSearch", "name": "ArxivSearch",
"schema": "https://ghp.ci/https://raw.githubusercontent.com/ChatGPTNextWeb/NextChat-Awesome-Plugins/main/plugins/arxivsearch/openapi.json" "schema": "https://raw.githubusercontent.com/ChatGPTNextWeb/NextChat-Awesome-Plugins/main/plugins/arxivsearch/openapi.json"
}, },
{ {
"id": "duckduckgolite", "id": "duckduckgolite",
"name": "DuckDuckGoLiteSearch", "name": "DuckDuckGoLiteSearch",
"schema": "https://ghp.ci/https://raw.githubusercontent.com/ChatGPTNextWeb/NextChat-Awesome-Plugins/main/plugins/duckduckgolite/openapi.json" "schema": "https://raw.githubusercontent.com/ChatGPTNextWeb/NextChat-Awesome-Plugins/main/plugins/duckduckgolite/openapi.json"
} }
] ]