feat(web): 聊天请求携带行为模式 mode(A3) — useChat 读当前 mode 经 REST 发送
- api.ts chatStream 新增可选 mode,空则不写键(后端回落chat) - useChat.ts 发送时带上 useModeStore 当前 mode,使非chat模式消息在Web端真正落库 - 修正 docblock(移除虚构的WS chat回退描述)
This commit is contained in:
1 parent
b686d5fec8
commit
747b9ad414
2 files changed
+19
-10
No files matched your search
@@ -248,15 +248,24 @@ export function chatSync(
|
|||||||
* `image` (a base64 data: URI or URL) is attached for the vision path; the
|
* `image` (a base64 data: URI or URL) is attached for the vision path; the
|
||||||
* gateway's chat body currently has no image field, so an unconfigured backend
|
* gateway's chat body currently has no image field, so an unconfigured backend
|
||||||
* simply ignores it. `deviceId` mirrors the client's per-browser id onto the
|
* simply ignores it. `deviceId` mirrors the client's per-browser id onto the
|
||||||
* persisted message (design/16 §4.5). */
|
* persisted message (design/16 §4.5). `mode` is the behavior mode this turn is
|
||||||
|
* sent in (design/01 §3); omitted when empty so the backend falls back to chat. */
|
||||||
export function chatStream(
|
export function chatStream(
|
||||||
sessionId: string,
|
sessionId: string,
|
||||||
text: string,
|
text: string,
|
||||||
image?: string
|
image?: string,
|
||||||
|
mode?: Mode
|
||||||
): Promise<{ stream: true }> {
|
): Promise<{ stream: true }> {
|
||||||
return request<{ stream: true }>("/chat", {
|
return request<{ stream: true }>("/chat", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({ sessionId, text, image, stream: true, deviceId: getClientId() }),
|
body: JSON.stringify({
|
||||||
|
sessionId,
|
||||||
|
text,
|
||||||
|
image,
|
||||||
|
stream: true,
|
||||||
|
deviceId: getClientId(),
|
||||||
|
...(mode ? { mode } : {}),
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,13 +8,13 @@ import { now } from "./util";
|
|||||||
|
|
||||||
/** Drives one user turn: push the user bubble, blanket a streaming assistant
|
/** Drives one user turn: push the user bubble, blanket a streaming assistant
|
||||||
* bubble, trigger the backend loop over REST (`stream:true`), and let the WS
|
* bubble, trigger the backend loop over REST (`stream:true`), and let the WS
|
||||||
* stream render into that bubble. Falls back to the WS `chat` channel when the
|
* stream render into that bubble. If the REST trigger fails, the failure is
|
||||||
* REST trigger fails so the demo still works without a wired loop.
|
* surfaced inline on the bubble rather than left streaming forever.
|
||||||
*
|
*
|
||||||
* The behavior mode is NOT chosen by the user at send time — the agent / backend
|
* The behavior mode is chosen by the agent / backend hot-switch (design/01 §3);
|
||||||
* hot-switches it (design/01 §3), and each message carries its own mode, so the
|
* each message carries the mode in effect when the turn is sent, and the bubble
|
||||||
* bubble renders per that message's mode. Until the backend advertises a
|
* renders per that message's mode. We read the current UI mode here and pass it
|
||||||
* per-message mode, a new assistant bubble defaults to the current UI mode. */
|
* on the turn so the backend persists it alongside the message (A3). */
|
||||||
export function useSendChat(): {
|
export function useSendChat(): {
|
||||||
send: (text: string, image?: string) => Promise<void>;
|
send: (text: string, image?: string) => Promise<void>;
|
||||||
sending: boolean;
|
sending: boolean;
|
||||||
@@ -46,7 +46,7 @@ export function useSendChat(): {
|
|||||||
beginAssistant(mode, clientId);
|
beginAssistant(mode, clientId);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await chatStream(sessionId, prompt, image);
|
await chatStream(sessionId, prompt, image, mode);
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
// Backend loop not wired or gateway unreachable: show the failure inline
|
// Backend loop not wired or gateway unreachable: show the failure inline
|
||||||
// rather than leaving a permanently-streaming bubble.
|
// rather than leaving a permanently-streaming bubble.
|
||||||
|
|||||||
Reference in new issue
Block a user