From f496546cc0d85608030b63bb052db5c468d01a6a Mon Sep 17 00:00:00 2001 From: ZyGuo Date: Thu, 4 Jun 2026 11:03:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=8Eiframe=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend-web/package.json | 1 + frontend-web/src/core/threads/hooks.ts | 66 ++++++++++--------- frontend-web/src/pages/IframeChatPage.tsx | 2 + .../src/pages/iframe-chat-submit.test.ts | 21 ++++++ frontend-web/src/pages/iframe-chat-submit.ts | 19 +++++- 5 files changed, 76 insertions(+), 33 deletions(-) diff --git a/frontend-web/package.json b/frontend-web/package.json index ee266aaa..f7eed944 100644 --- a/frontend-web/package.json +++ b/frontend-web/package.json @@ -63,6 +63,7 @@ "codemirror": "^6.0.2", "date-fns": "^4.1.0", "dayjs": "^1.11.21", + "dnd-kit": "^0.0.2", "docx": "^9.5.1", "dotenv": "^17.2.3", "embla-carousel-react": "^8.6.0", diff --git a/frontend-web/src/core/threads/hooks.ts b/frontend-web/src/core/threads/hooks.ts index 4ab0b2c2..67813451 100644 --- a/frontend-web/src/core/threads/hooks.ts +++ b/frontend-web/src/core/threads/hooks.ts @@ -621,10 +621,15 @@ export function useThreadStream({ lockThreadRagMode(threadId); } - await thread.submit( - { - messages: [ - { + const mergedContext = { + ...context, + ...extraContext, + }; + + await thread.submit( + { + messages: [ + { type: "human", content: [ { @@ -642,32 +647,33 @@ export function useThreadStream({ }, ], }, - { - threadId: threadId, - streamSubgraphs: true, - streamResumable: true, - config: { - recursion_limit: 1000, - }, - context: { - ...extraContext, - ...context, - thinking_enabled: context.mode !== "flash", - is_plan_mode: context.mode === "pro" || context.mode === "ultra", - subagent_enabled: context.mode === "ultra", - reasoning_effort: - context.reasoning_effort ?? - (context.mode === "ultra" - ? "high" - : context.mode === "pro" - ? "medium" - : context.mode === "thinking" - ? "low" - : undefined), - memory_injection_enabled: context.memory_injection_enabled ?? true, - rag_mode_enabled: ragModeEnabled, - thread_id: threadId, - }, + { + threadId: threadId, + streamSubgraphs: true, + streamResumable: true, + config: { + recursion_limit: 1000, + }, + context: { + ...mergedContext, + thinking_enabled: mergedContext.mode !== "flash", + is_plan_mode: + mergedContext.mode === "pro" || mergedContext.mode === "ultra", + subagent_enabled: mergedContext.mode === "ultra", + reasoning_effort: + mergedContext.reasoning_effort ?? + (mergedContext.mode === "ultra" + ? "high" + : mergedContext.mode === "pro" + ? "medium" + : mergedContext.mode === "thinking" + ? "low" + : undefined), + memory_injection_enabled: + mergedContext.memory_injection_enabled ?? true, + rag_mode_enabled: ragModeEnabled, + thread_id: threadId, + }, }, ); void queryClient.invalidateQueries({ queryKey: ["threads", "search"] }); diff --git a/frontend-web/src/pages/IframeChatPage.tsx b/frontend-web/src/pages/IframeChatPage.tsx index 770e86bf..c365a176 100644 --- a/frontend-web/src/pages/IframeChatPage.tsx +++ b/frontend-web/src/pages/IframeChatPage.tsx @@ -220,8 +220,10 @@ export default function IframeChatPage() { prompt: data.payload?.prompt, pageContext: data.payload?.pageContext, screenshot: data.payload?.screenshot, + model: data.payload?.model, requestId: data.requestId, filesCount: files.length, + iframeContext, }); if (!submitText && files.length === 0) return; diff --git a/frontend-web/src/pages/iframe-chat-submit.test.ts b/frontend-web/src/pages/iframe-chat-submit.test.ts index 517eab42..df236068 100644 --- a/frontend-web/src/pages/iframe-chat-submit.test.ts +++ b/frontend-web/src/pages/iframe-chat-submit.test.ts @@ -79,3 +79,24 @@ test("keeps screenshot-only iframe submissions in the conversation flow", () => assert.equal(result.files[0]?.filename, "shot.jpg"); assert.equal(result.files[0]?.mediaType, "image/jpeg"); }); + +test("maps iframe model selection into stream context model_name", () => { + const result = parseBrainyChatSubmitMessage({ + source: "brainy-extension", + type: "brainy:chat-submit", + requestId: "iframe-456", + payload: { + text: "帮我总结这个页面", + model: { + label: "Qwen3-32B: 效果与速度均衡(推荐)", + value: "OpenAI3", + }, + }, + }); + + assert.equal(result.submitText, "帮我总结这个页面"); + assert.deepEqual(result.iframeContext, { + brainy_request_id: "iframe-456", + model_name: "OpenAI3", + }); +}); diff --git a/frontend-web/src/pages/iframe-chat-submit.ts b/frontend-web/src/pages/iframe-chat-submit.ts index 2396a046..094e05f6 100644 --- a/frontend-web/src/pages/iframe-chat-submit.ts +++ b/frontend-web/src/pages/iframe-chat-submit.ts @@ -21,6 +21,11 @@ type BrainyScreenshot = { images?: BrainyScreenshotImage[]; }; +type BrainyModelSelection = { + label?: string; + value?: string; +}; + export type BrainyChatSubmitMessage = { source?: string; type?: string; @@ -29,6 +34,7 @@ export type BrainyChatSubmitMessage = { prompt?: string; pageContext?: BrainyPageContext; screenshot?: BrainyScreenshot; + model?: BrainyModelSelection; }; requestId?: string; }; @@ -261,13 +267,20 @@ export function parseBrainyChatSubmitMessage( hasAttachedImage: files.length > 0, }); const requestId = trimToUndefined(data.requestId); + const modelName = trimToUndefined(data.payload?.model?.value); + + const iframeContext: Record = {}; + if (requestId) { + iframeContext.brainy_request_id = requestId; + } + if (modelName) { + iframeContext.model_name = modelName; + } return { submitText, files, - ...(requestId - ? { iframeContext: { brainy_request_id: requestId } } - : {}), + ...(Object.keys(iframeContext).length > 0 ? { iframeContext } : {}), ...(promptPrefix ? { additionalKwargs: { prompt_prefix: promptPrefix } } : {}), }; }