@assistant-ui/react-ag-ui 0.0.69 → 0.0.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/runtime/AgUiThreadRuntimeCore.d.ts +6 -3
- package/dist/runtime/AgUiThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtime/AgUiThreadRuntimeCore.js +77 -10
- package/dist/runtime/AgUiThreadRuntimeCore.js.map +1 -1
- package/dist/runtime/adapter/conversions.d.ts +5 -0
- package/dist/runtime/adapter/conversions.d.ts.map +1 -1
- package/dist/runtime/adapter/conversions.js +104 -15
- package/dist/runtime/adapter/conversions.js.map +1 -1
- package/dist/runtime/adapter/run-aggregator.d.ts +3 -0
- package/dist/runtime/adapter/run-aggregator.d.ts.map +1 -1
- package/dist/runtime/adapter/run-aggregator.js +4 -2
- package/dist/runtime/adapter/run-aggregator.js.map +1 -1
- package/dist/runtime/types.d.ts +18 -2
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/useAgUiRuntime.d.ts.map +1 -1
- package/dist/useAgUiRuntime.js +4 -0
- package/dist/useAgUiRuntime.js.map +1 -1
- package/package.json +5 -5
- package/src/runtime/AgUiThreadRuntimeCore.interrupt-cancel.test.ts +202 -0
- package/src/runtime/AgUiThreadRuntimeCore.ts +143 -8
- package/src/runtime/adapter/conversions.metadata.test.ts +400 -0
- package/src/runtime/adapter/conversions.ts +170 -28
- package/src/runtime/adapter/run-aggregator.approval.test.ts +4 -4
- package/src/runtime/adapter/run-aggregator.ts +13 -2
- package/src/runtime/types.ts +20 -1
- package/src/useAgUiRuntime.context.test.tsx +227 -0
- package/src/useAgUiRuntime.external-store.test.tsx +39 -0
- package/src/useAgUiRuntime.ts +4 -0
package/README.md
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import type { AddToolResultOptions, AppendMessage, CreateAppendMessage, AssistantRuntime, ChatModelRunOptions, ChatModelRunResult, ExportedMessageRepository, RespondToToolApprovalOptions, ThreadHistoryAdapter, ThreadMessage, Unstable_ToolInteraction } from "@assistant-ui/core";
|
|
1
|
+
import type { AddToolResultOptions, AppendMessage, CreateAppendMessage, AssistantRuntime, ChatModelRunOptions, ChatModelRunResult, ExportedMessageRepository, RespondToToolApprovalOptions, RunConfig, ThreadHistoryAdapter, ThreadMessage, Unstable_ToolInteraction } from "@assistant-ui/core";
|
|
2
2
|
import type { AbstractAgent } from "@ag-ui/client";
|
|
3
3
|
import type { Logger } from "./logger.js";
|
|
4
|
-
import type { AgUiInterrupt, AgUiResumeEntry, AgUiResumeTranscript } from "./types.js";
|
|
4
|
+
import type { AgUiInterrupt, AgUiResumeEntry, AgUiResumeTranscript, UseAgUiRuntimeOptions } from "./types.js";
|
|
5
5
|
import type { ReadonlyJSONValue } from "assistant-stream/utils";
|
|
6
|
-
type RunConfig = NonNullable<AppendMessage["runConfig"]>;
|
|
7
6
|
type ResumeStream = (options: ChatModelRunOptions) => AsyncGenerator<ChatModelRunResult, void, unknown>;
|
|
8
7
|
type ResumeRunConfig = {
|
|
9
8
|
parentId: string | null;
|
|
@@ -15,6 +14,8 @@ type CoreOptions = {
|
|
|
15
14
|
agent: AbstractAgent;
|
|
16
15
|
logger: Logger;
|
|
17
16
|
showThinking: boolean;
|
|
17
|
+
joinStrategy?: UseAgUiRuntimeOptions["joinStrategy"];
|
|
18
|
+
getRunContext?: UseAgUiRuntimeOptions["getRunContext"];
|
|
18
19
|
resumeTranscript?: AgUiResumeTranscript | undefined;
|
|
19
20
|
autoCancelPendingToolCalls?: boolean | undefined;
|
|
20
21
|
onError?: (error: Error) => void;
|
|
@@ -26,6 +27,8 @@ export declare class AgUiThreadRuntimeCore {
|
|
|
26
27
|
private agent;
|
|
27
28
|
private logger;
|
|
28
29
|
private showThinking;
|
|
30
|
+
private joinStrategy;
|
|
31
|
+
private getRunContext;
|
|
29
32
|
private resumeTranscript;
|
|
30
33
|
private autoCancelPendingToolCalls;
|
|
31
34
|
private onError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgUiThreadRuntimeCore.d.ts","sourceRoot":"","sources":["../../src/runtime/AgUiThreadRuntimeCore.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EAEzB,4BAA4B,
|
|
1
|
+
{"version":3,"file":"AgUiThreadRuntimeCore.d.ts","sourceRoot":"","sources":["../../src/runtime/AgUiThreadRuntimeCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,8 @@ var AgUiThreadRuntimeCore = class {
|
|
|
38
38
|
agent;
|
|
39
39
|
logger;
|
|
40
40
|
showThinking;
|
|
41
|
+
joinStrategy;
|
|
42
|
+
getRunContext;
|
|
41
43
|
resumeTranscript;
|
|
42
44
|
autoCancelPendingToolCalls;
|
|
43
45
|
onError;
|
|
@@ -83,6 +85,8 @@ var AgUiThreadRuntimeCore = class {
|
|
|
83
85
|
this.agent = options.agent;
|
|
84
86
|
this.logger = options.logger;
|
|
85
87
|
this.showThinking = options.showThinking;
|
|
88
|
+
this.joinStrategy = options.joinStrategy;
|
|
89
|
+
this.getRunContext = options.getRunContext;
|
|
86
90
|
this.resumeTranscript = options.resumeTranscript ?? "full";
|
|
87
91
|
this.autoCancelPendingToolCalls = options.autoCancelPendingToolCalls;
|
|
88
92
|
this.onError = options.onError;
|
|
@@ -108,6 +112,8 @@ var AgUiThreadRuntimeCore = class {
|
|
|
108
112
|
this.agent = options.agent;
|
|
109
113
|
this.logger = options.logger;
|
|
110
114
|
this.showThinking = options.showThinking;
|
|
115
|
+
this.joinStrategy = options.joinStrategy;
|
|
116
|
+
this.getRunContext = options.getRunContext;
|
|
111
117
|
this.resumeTranscript = options.resumeTranscript ?? "full";
|
|
112
118
|
this.autoCancelPendingToolCalls = options.autoCancelPendingToolCalls;
|
|
113
119
|
this.onError = options.onError;
|
|
@@ -752,6 +758,8 @@ var AgUiThreadRuntimeCore = class {
|
|
|
752
758
|
const shouldEagerlyInsertAssistant = parentId !== null && parent !== void 0 && parentId !== this.session.headId;
|
|
753
759
|
const historicalMessages = [...shouldEagerlyInsertAssistant ? this.session.tryGetMessages(parentId) ?? this.session.getMessages() : this.session.getMessages()];
|
|
754
760
|
const runStartMessageIds = new Set(this.getMessageRepository().messages.map(({ message }) => message.id));
|
|
761
|
+
const joinStrategy = this.joinStrategy;
|
|
762
|
+
const hasRunUserBoundary = parent?.message.role === "user" && !resume;
|
|
755
763
|
let pendingError = null;
|
|
756
764
|
const assistantParentId = parent ? parentId : this.session.headId;
|
|
757
765
|
let assistantMessageId;
|
|
@@ -803,6 +811,7 @@ var AgUiThreadRuntimeCore = class {
|
|
|
803
811
|
const abortSignal = abortController.signal;
|
|
804
812
|
const aggregator = new RunAggregator({
|
|
805
813
|
showThinking: this.showThinking,
|
|
814
|
+
joinStrategy,
|
|
806
815
|
logger: this.logger,
|
|
807
816
|
emit: applyUpdate,
|
|
808
817
|
onServerMessageId: (serverId) => {
|
|
@@ -814,7 +823,7 @@ var AgUiThreadRuntimeCore = class {
|
|
|
814
823
|
const dispatch = (event) => {
|
|
815
824
|
if (this.abortController !== abortController) return;
|
|
816
825
|
if (event.type === "RUN_FINISHED") runFinished = true;
|
|
817
|
-
const nextAssistantMessageId = this.handleEvent(aggregator, event, assistantMessageId);
|
|
826
|
+
const nextAssistantMessageId = this.handleEvent(aggregator, event, assistantMessageId, joinStrategy, runStartMessageIds, hasRunUserBoundary);
|
|
818
827
|
if (event.type === "MESSAGES_SNAPSHOT") assistantMessageId = nextAssistantMessageId;
|
|
819
828
|
};
|
|
820
829
|
this.abortController = abortController;
|
|
@@ -955,29 +964,40 @@ var AgUiThreadRuntimeCore = class {
|
|
|
955
964
|
} });
|
|
956
965
|
}
|
|
957
966
|
buildRunInput(runId, runConfig, historyMessages, resume) {
|
|
967
|
+
const pendingA2uiAction = this.pendingA2uiAction;
|
|
968
|
+
this.pendingA2uiAction = void 0;
|
|
958
969
|
const threadId = this.agent.threadId || "main";
|
|
959
970
|
const messages = toAgUiMessages(this.selectRunMessages(historyMessages ?? this.session.getMessages(), resume));
|
|
960
971
|
const context = this.runtime?.thread.getModelContext();
|
|
961
|
-
|
|
972
|
+
let hostContext = [];
|
|
973
|
+
try {
|
|
974
|
+
hostContext = this.getRunContext?.({
|
|
975
|
+
messages,
|
|
976
|
+
runConfig
|
|
977
|
+
}) ?? [];
|
|
978
|
+
} catch (error) {
|
|
979
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
980
|
+
this.logger.error("[agui] getRunContext failed", err);
|
|
981
|
+
invokeRuntimeCallback("onError", this.onError, err);
|
|
982
|
+
}
|
|
983
|
+
return {
|
|
962
984
|
threadId,
|
|
963
985
|
runId,
|
|
964
986
|
state: this.stateSnapshot ?? null,
|
|
965
987
|
messages,
|
|
966
988
|
tools: toAgUiTools(context?.tools),
|
|
967
|
-
context: context?.system ? [{
|
|
989
|
+
context: [...context?.system ? [{
|
|
968
990
|
description: "system",
|
|
969
991
|
value: context.system
|
|
970
|
-
}] : [],
|
|
992
|
+
}] : [], ...hostContext],
|
|
971
993
|
forwardedProps: {
|
|
972
994
|
...context?.callSettings ?? {},
|
|
973
995
|
...context?.config ?? {},
|
|
974
996
|
...runConfig?.custom ? { runConfig: runConfig.custom } : {},
|
|
975
|
-
...
|
|
997
|
+
...pendingA2uiAction ? { a2uiAction: { userAction: pendingA2uiAction } } : {}
|
|
976
998
|
},
|
|
977
999
|
...resume !== void 0 ? { resume: resume.entries } : {}
|
|
978
1000
|
};
|
|
979
|
-
this.pendingA2uiAction = void 0;
|
|
980
|
-
return input;
|
|
981
1001
|
}
|
|
982
1002
|
/**
|
|
983
1003
|
* An anchor the thread no longer carries falls back to the whole transcript.
|
|
@@ -1220,7 +1240,7 @@ var AgUiThreadRuntimeCore = class {
|
|
|
1220
1240
|
custom: incoming.custom ? mergeAgUiNamespace(current.custom, incoming.custom) : current.custom
|
|
1221
1241
|
};
|
|
1222
1242
|
}
|
|
1223
|
-
handleEvent(aggregator, event, activeAssistantId) {
|
|
1243
|
+
handleEvent(aggregator, event, activeAssistantId, joinStrategy, runStartMessageIds, hasRunUserBoundary) {
|
|
1224
1244
|
switch (event.type) {
|
|
1225
1245
|
case "STATE_SNAPSHOT":
|
|
1226
1246
|
this.stateSnapshot = event.snapshot;
|
|
@@ -1241,7 +1261,7 @@ var AgUiThreadRuntimeCore = class {
|
|
|
1241
1261
|
const previousHeadId = this.session.headId;
|
|
1242
1262
|
const activeAssistant = activeAssistantId === void 0 ? void 0 : this.session.tryGetMessage(activeAssistantId)?.message;
|
|
1243
1263
|
const hasActiveText = activeAssistant?.role === "assistant" && activeAssistant.content.some((part) => part.type === "text");
|
|
1244
|
-
this.importMessagesSnapshot(event.messages, activeAssistantId);
|
|
1264
|
+
this.importMessagesSnapshot(event.messages, activeAssistantId, joinStrategy, runStartMessageIds, hasRunUserBoundary);
|
|
1245
1265
|
const headId = this.session.headId;
|
|
1246
1266
|
if (hasActiveText && headId !== previousHeadId) activeAssistantId = (headId === null ? void 0 : this.session.tryGetMessage(headId)?.message)?.role === "assistant" ? headId ?? void 0 : void 0;
|
|
1247
1267
|
this.updateActiveAssistantState(activeAssistantId);
|
|
@@ -1366,7 +1386,7 @@ var AgUiThreadRuntimeCore = class {
|
|
|
1366
1386
|
this.publishUpdate();
|
|
1367
1387
|
this.maybeCompleteAfterToolResults(messageId);
|
|
1368
1388
|
}
|
|
1369
|
-
importMessagesSnapshot(rawMessages, activeAssistantId) {
|
|
1389
|
+
importMessagesSnapshot(rawMessages, activeAssistantId, joinStrategy, runStartMessageIds, hasRunUserBoundary) {
|
|
1370
1390
|
try {
|
|
1371
1391
|
const activeAssistantItem = activeAssistantId ? this.session.tryGetMessage(activeAssistantId) : void 0;
|
|
1372
1392
|
const activeMessage = activeAssistantItem?.message;
|
|
@@ -1389,6 +1409,53 @@ var AgUiThreadRuntimeCore = class {
|
|
|
1389
1409
|
content: this.mergeSnapshotAssistantContent(existing.content, convertedMessage.content, snapshotHasReasoning, snapshotHasActivity)
|
|
1390
1410
|
};
|
|
1391
1411
|
}
|
|
1412
|
+
if (joinStrategy === "concat-content") {
|
|
1413
|
+
const activeIndex = converted.findIndex((message) => message.id === activeAssistantId);
|
|
1414
|
+
const lastKnownIndex = converted.findLastIndex((message) => runStartMessageIds.has(message.id));
|
|
1415
|
+
const lastUserIndex = hasRunUserBoundary ? converted.findLastIndex((message) => message.role === "user") : -1;
|
|
1416
|
+
const startIndex = activeIndex >= 0 ? activeIndex : lastKnownIndex >= 0 || lastUserIndex >= 0 ? Math.max(lastKnownIndex, lastUserIndex) + 1 : -1;
|
|
1417
|
+
if (startIndex >= 0 && converted[startIndex]?.role === "assistant") {
|
|
1418
|
+
let endIndex = startIndex + 1;
|
|
1419
|
+
while (converted[endIndex]?.role === "assistant") endIndex++;
|
|
1420
|
+
const runMessages = converted.slice(startIndex, endIndex);
|
|
1421
|
+
const includesStreamedPrefix = activeIndex < 0 && activeAssistant?.content.some((part) => part.type !== "data");
|
|
1422
|
+
if (includesStreamedPrefix && activeAssistant) runMessages.unshift(activeAssistant);
|
|
1423
|
+
if (runMessages.length > 1) {
|
|
1424
|
+
const [first, ...rest] = runMessages;
|
|
1425
|
+
let content = runMessages.flatMap((message) => message.content);
|
|
1426
|
+
if (includesStreamedPrefix) {
|
|
1427
|
+
content = [...first.content];
|
|
1428
|
+
let cursor = 0;
|
|
1429
|
+
const keyOf = (part) => part.type === "tool-call" ? `tool:${part.toolCallId}` : part.type === "text" || part.type === "reasoning" ? `${part.type}:${part.text}` : void 0;
|
|
1430
|
+
for (const message of rest) for (const part of message.content) {
|
|
1431
|
+
const key = keyOf(part);
|
|
1432
|
+
const match = key === void 0 ? -1 : content.findIndex((previous, index) => index >= cursor && keyOf(previous) === key);
|
|
1433
|
+
if (match < 0) {
|
|
1434
|
+
content.push(part);
|
|
1435
|
+
cursor = content.length;
|
|
1436
|
+
} else {
|
|
1437
|
+
if (part.type === "tool-call") content[match] = this.preserveToolResults([content[match]], [part])[0];
|
|
1438
|
+
cursor = match + 1;
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
converted.splice(startIndex, endIndex - startIndex, {
|
|
1443
|
+
...first,
|
|
1444
|
+
content,
|
|
1445
|
+
status: rest.at(-1).status,
|
|
1446
|
+
metadata: rest.reduce((metadata, message) => ({
|
|
1447
|
+
...metadata,
|
|
1448
|
+
...message.metadata,
|
|
1449
|
+
unstable_state: message.metadata.unstable_state,
|
|
1450
|
+
unstable_annotations: [...metadata.unstable_annotations, ...message.metadata.unstable_annotations],
|
|
1451
|
+
unstable_data: [...metadata.unstable_data, ...message.metadata.unstable_data],
|
|
1452
|
+
steps: [...metadata.steps, ...message.metadata.steps],
|
|
1453
|
+
custom: mergeAgUiNamespace(metadata.custom, message.metadata.custom)
|
|
1454
|
+
}), first.metadata)
|
|
1455
|
+
});
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1392
1459
|
const snapshotContainsActiveAssistant = converted.some((message) => message.id === activeAssistant?.id);
|
|
1393
1460
|
const preservesActiveAssistant = activeAssistant !== void 0 && !snapshotContainsActiveAssistant && (activeAssistant.metadata.isOptimistic !== true || converted.at(-1)?.role !== "assistant" || activeAssistantParentId !== void 0 && converted.at(-1)?.id === activeAssistantParentId);
|
|
1394
1461
|
if (preservesActiveAssistant) converted.push(activeAssistant);
|