
























@@ -1,3 +1,5 @@
1+import { createChatModelOverride } from "./chat-model-ref.ts";
2+import type { ChatModelOverride } from "./chat-model-ref.types.ts";
13import { formatUnknownText, truncateText } from "./format.ts";
24import { normalizeLowercaseStringOrEmpty } from "./string-coerce.ts";
35@@ -36,6 +38,7 @@ type ToolStreamHost = {
3638toolStreamOrder: string[];
3739chatToolMessages: Record<string, unknown>[];
3840toolStreamSyncTimer: number | null;
41+chatModelOverrides?: Record<string, ChatModelOverride | null>;
3942};
40434144function toTrimmedString(value: unknown): string | null {
@@ -175,6 +178,47 @@ function formatToolOutput(value: unknown): string | null {
175178return `${truncated.text}\n\n… truncated (${truncated.total} chars, showing first ${truncated.text.length}).`;
176179}
177180181+function readRecord(value: unknown): Record<string, unknown> | null {
182+return value && typeof value === "object" ? (value as Record<string, unknown>) : null;
183+}
184+185+function resolveSessionStatusModelOverride(result: unknown): ChatModelOverride | null | undefined {
186+const details = readRecord(readRecord(result)?.details);
187+if (!details || details.changedModel !== true) {
188+return undefined;
189+}
190+if (Object.hasOwn(details, "modelOverride")) {
191+const override = toTrimmedString(details.modelOverride);
192+return override ? createChatModelOverride(override) : null;
193+}
194+const model = toTrimmedString(details.model);
195+if (!model) {
196+return undefined;
197+}
198+const provider = toTrimmedString(details.modelProvider);
199+return createChatModelOverride(provider ? `${provider}/${model}` : model);
200+}
201+202+function syncSessionStatusModelOverride(host: ToolStreamHost, data: Record<string, unknown>) {
203+if (!host.chatModelOverrides) {
204+return;
205+}
206+const result = data.result;
207+const details = readRecord(readRecord(result)?.details);
208+const targetSessionKey = toTrimmedString(details?.sessionKey) ?? host.sessionKey;
209+if (targetSessionKey !== host.sessionKey) {
210+return;
211+}
212+const override = resolveSessionStatusModelOverride(result);
213+if (override === undefined) {
214+return;
215+}
216+host.chatModelOverrides = {
217+ ...host.chatModelOverrides,
218+[targetSessionKey]: override,
219+};
220+}
221+178222function buildToolStreamMessage(entry: ToolStreamEntry): Record<string, unknown> {
179223const content: Array<Record<string, unknown>> = [];
180224content.push({
@@ -495,6 +539,9 @@ export function handleAgentEvent(host: ToolStreamHost, payload?: AgentEventPaylo
495539 : phase === "result"
496540 ? formatToolOutput(data.result)
497541 : undefined;
542+if (name === "session_status" && phase === "result") {
543+syncSessionStatusModelOverride(host, data);
544+}
498545499546const now = Date.now();
500547let entry = host.toolStreamById.get(toolCallId);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。