@assistant-ui/react-langgraph 0.6.3 → 0.6.5
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/dist/appendLangChainChunk.js +4 -4
- package/dist/appendLangChainChunk.js.map +1 -1
- package/dist/convertLangChainMessages.d.ts.map +1 -1
- package/dist/convertLangChainMessages.js +3 -2
- package/dist/convertLangChainMessages.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +4 -4
- package/src/appendLangChainChunk.ts +4 -4
- package/src/convertLangChainMessages.ts +7 -4
- package/src/types.ts +1 -1
|
@@ -37,13 +37,13 @@ var appendLangChainChunk = (prev, curr) => {
|
|
|
37
37
|
}
|
|
38
38
|
const newToolCalls = [...prev.tool_calls ?? []];
|
|
39
39
|
for (const chunk of curr.tool_call_chunks ?? []) {
|
|
40
|
-
const existing = newToolCalls[chunk.index - 1] ?? {
|
|
41
|
-
const
|
|
40
|
+
const existing = newToolCalls[chunk.index - 1] ?? { partial_json: "" };
|
|
41
|
+
const partialJson = existing.partial_json + chunk.args;
|
|
42
42
|
newToolCalls[chunk.index - 1] = {
|
|
43
43
|
...chunk,
|
|
44
44
|
...existing,
|
|
45
|
-
|
|
46
|
-
args: parsePartialJsonObject(
|
|
45
|
+
partial_json: partialJson,
|
|
46
|
+
args: parsePartialJsonObject(partialJson) ?? ("args" in existing ? existing.args : {})
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
49
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/appendLangChainChunk.ts"],"sourcesContent":["import {\n LangChainMessage,\n LangChainMessageChunk,\n MessageContentText,\n} from \"./types\";\nimport { parsePartialJsonObject } from \"assistant-stream/utils\";\n\nexport const appendLangChainChunk = (\n prev: LangChainMessage | undefined,\n curr: LangChainMessage | LangChainMessageChunk,\n): LangChainMessage => {\n if (curr.type !== \"AIMessageChunk\") {\n return curr;\n }\n\n if (!prev || prev.type !== \"ai\") {\n return {\n ...curr,\n type: curr.type.replace(\"MessageChunk\", \"\").toLowerCase(),\n } as LangChainMessage;\n }\n\n const newContent =\n typeof prev.content === \"string\"\n ? [{ type: \"text\" as const, text: prev.content }]\n : [...prev.content];\n\n if (typeof curr?.content === \"string\") {\n const lastIndex = newContent.length - 1;\n if (newContent[lastIndex]?.type === \"text\") {\n (newContent[lastIndex] as MessageContentText).text =\n (newContent[lastIndex] as MessageContentText).text + curr.content;\n } else {\n newContent.push({ type: \"text\", text: curr.content });\n }\n } else if (Array.isArray(curr.content)) {\n const lastIndex = newContent.length - 1;\n for (const item of curr.content) {\n if (!(\"type\" in item)) {\n continue;\n }\n\n if (item.type === \"text\") {\n if (newContent[lastIndex]?.type === \"text\") {\n (newContent[lastIndex] as MessageContentText).text =\n (newContent[lastIndex] as MessageContentText).text + item.text;\n } else {\n newContent.push({ type: \"text\", text: item.text });\n }\n } else if (item.type === \"image_url\") {\n newContent.push(item);\n }\n }\n }\n\n const newToolCalls = [...(prev.tool_calls ?? [])];\n for (const chunk of curr.tool_call_chunks ?? []) {\n const existing = newToolCalls[chunk.index - 1] ?? {
|
|
1
|
+
{"version":3,"sources":["../src/appendLangChainChunk.ts"],"sourcesContent":["import {\n LangChainMessage,\n LangChainMessageChunk,\n MessageContentText,\n} from \"./types\";\nimport { parsePartialJsonObject } from \"assistant-stream/utils\";\n\nexport const appendLangChainChunk = (\n prev: LangChainMessage | undefined,\n curr: LangChainMessage | LangChainMessageChunk,\n): LangChainMessage => {\n if (curr.type !== \"AIMessageChunk\") {\n return curr;\n }\n\n if (!prev || prev.type !== \"ai\") {\n return {\n ...curr,\n type: curr.type.replace(\"MessageChunk\", \"\").toLowerCase(),\n } as LangChainMessage;\n }\n\n const newContent =\n typeof prev.content === \"string\"\n ? [{ type: \"text\" as const, text: prev.content }]\n : [...prev.content];\n\n if (typeof curr?.content === \"string\") {\n const lastIndex = newContent.length - 1;\n if (newContent[lastIndex]?.type === \"text\") {\n (newContent[lastIndex] as MessageContentText).text =\n (newContent[lastIndex] as MessageContentText).text + curr.content;\n } else {\n newContent.push({ type: \"text\", text: curr.content });\n }\n } else if (Array.isArray(curr.content)) {\n const lastIndex = newContent.length - 1;\n for (const item of curr.content) {\n if (!(\"type\" in item)) {\n continue;\n }\n\n if (item.type === \"text\") {\n if (newContent[lastIndex]?.type === \"text\") {\n (newContent[lastIndex] as MessageContentText).text =\n (newContent[lastIndex] as MessageContentText).text + item.text;\n } else {\n newContent.push({ type: \"text\", text: item.text });\n }\n } else if (item.type === \"image_url\") {\n newContent.push(item);\n }\n }\n }\n\n const newToolCalls = [...(prev.tool_calls ?? [])];\n for (const chunk of curr.tool_call_chunks ?? []) {\n const existing = newToolCalls[chunk.index - 1] ?? { partial_json: \"\" };\n const partialJson = existing.partial_json + chunk.args;\n newToolCalls[chunk.index - 1] = {\n ...chunk,\n ...existing,\n partial_json: partialJson,\n args:\n parsePartialJsonObject(partialJson) ??\n (\"args\" in existing ? existing.args : {}),\n };\n }\n\n return {\n ...prev,\n content: newContent,\n tool_calls: newToolCalls,\n };\n};\n"],"mappings":";AAKA,SAAS,8BAA8B;AAEhC,IAAM,uBAAuB,CAClC,MACA,SACqB;AACrB,MAAI,KAAK,SAAS,kBAAkB;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,KAAK,SAAS,MAAM;AAC/B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,KAAK,KAAK,QAAQ,gBAAgB,EAAE,EAAE,YAAY;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,aACJ,OAAO,KAAK,YAAY,WACpB,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,QAAQ,CAAC,IAC9C,CAAC,GAAG,KAAK,OAAO;AAEtB,MAAI,OAAO,MAAM,YAAY,UAAU;AACrC,UAAM,YAAY,WAAW,SAAS;AACtC,QAAI,WAAW,SAAS,GAAG,SAAS,QAAQ;AAC1C,MAAC,WAAW,SAAS,EAAyB,OAC3C,WAAW,SAAS,EAAyB,OAAO,KAAK;AAAA,IAC9D,OAAO;AACL,iBAAW,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,QAAQ,CAAC;AAAA,IACtD;AAAA,EACF,WAAW,MAAM,QAAQ,KAAK,OAAO,GAAG;AACtC,UAAM,YAAY,WAAW,SAAS;AACtC,eAAW,QAAQ,KAAK,SAAS;AAC/B,UAAI,EAAE,UAAU,OAAO;AACrB;AAAA,MACF;AAEA,UAAI,KAAK,SAAS,QAAQ;AACxB,YAAI,WAAW,SAAS,GAAG,SAAS,QAAQ;AAC1C,UAAC,WAAW,SAAS,EAAyB,OAC3C,WAAW,SAAS,EAAyB,OAAO,KAAK;AAAA,QAC9D,OAAO;AACL,qBAAW,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,QACnD;AAAA,MACF,WAAW,KAAK,SAAS,aAAa;AACpC,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,GAAI,KAAK,cAAc,CAAC,CAAE;AAChD,aAAW,SAAS,KAAK,oBAAoB,CAAC,GAAG;AAC/C,UAAM,WAAW,aAAa,MAAM,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG;AACrE,UAAM,cAAc,SAAS,eAAe,MAAM;AAClD,iBAAa,MAAM,QAAQ,CAAC,IAAI;AAAA,MAC9B,GAAG;AAAA,MACH,GAAG;AAAA,MACH,cAAc;AAAA,MACd,MACE,uBAAuB,WAAW,MACjC,UAAU,WAAW,SAAS,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertLangChainMessages.d.ts","sourceRoot":"","sources":["../src/convertLangChainMessages.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,2BAA2B,EAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"convertLangChainMessages.d.ts","sourceRoot":"","sources":["../src/convertLangChainMessages.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,2BAA2B,EAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAyD3C,eAAO,MAAM,wBAAwB,EAAE,2BAA2B,CAAC,QAAQ,CACzE,gBAAgB,CA+CjB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
// src/convertLangChainMessages.ts
|
|
4
|
+
import { parsePartialJsonObject } from "assistant-stream/utils";
|
|
4
5
|
var contentToParts = (content) => {
|
|
5
6
|
if (typeof content === "string")
|
|
6
7
|
return [{ type: "text", text: content }];
|
|
@@ -64,8 +65,8 @@ var convertLangChainMessages = (message) => {
|
|
|
64
65
|
type: "tool-call",
|
|
65
66
|
toolCallId: chunk.id,
|
|
66
67
|
toolName: chunk.name,
|
|
67
|
-
args: chunk.args,
|
|
68
|
-
argsText:
|
|
68
|
+
args: chunk.partial_json ? parsePartialJsonObject(chunk.partial_json) ?? {} : chunk.args,
|
|
69
|
+
argsText: chunk.partial_json ? chunk.partial_json : JSON.stringify(chunk.args)
|
|
69
70
|
})
|
|
70
71
|
) ?? []
|
|
71
72
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convertLangChainMessages.ts"],"sourcesContent":["\"use client\";\n\nimport {\n ThreadAssistantMessage,\n useExternalMessageConverter,\n} from \"@assistant-ui/react\";\nimport { LangChainMessage } from \"./types\";\nimport { ToolCallMessagePart } from \"@assistant-ui/react\";\nimport { ThreadUserMessage } from \"@assistant-ui/react\";\n\nconst contentToParts = (content: LangChainMessage[\"content\"]) => {\n if (typeof content === \"string\")\n return [{ type: \"text\" as const, text: content }];\n return content\n .map(\n (\n part,\n ):\n | (ThreadUserMessage | ThreadAssistantMessage)[\"content\"][number]\n | (ThreadUserMessage | ThreadAssistantMessage)[\"content\"][number][]\n | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n case \"text_delta\":\n return { type: \"text\", text: part.text };\n case \"image_url\":\n if (typeof part.image_url === \"string\") {\n return { type: \"image\", image: part.image_url };\n } else {\n return {\n type: \"image\",\n image: part.image_url.url,\n };\n }\n case \"thinking\":\n return { type: \"reasoning\", text: part.thinking };\n\n case \"reasoning\":\n return part.summary\n .map((s) => s.text)\n .map((text) => ({\n type: \"reasoning\",\n text,\n }));\n\n case \"tool_use\":\n return null;\n case \"input_json_delta\":\n return null;\n\n default:\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown message part type: ${_exhaustiveCheck}`);\n }\n },\n )\n .flat()\n .filter((a) => a !== null);\n};\n\nexport const convertLangChainMessages: useExternalMessageConverter.Callback<\n LangChainMessage\n> = (message) => {\n switch (message.type) {\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"human\":\n return {\n role: \"user\",\n id: message.id,\n content: contentToParts(message.content),\n };\n case \"ai\":\n return {\n role: \"assistant\",\n id: message.id,\n content: [\n ...contentToParts(message.content),\n ...(message.tool_calls?.map(\n (chunk): ToolCallMessagePart => ({\n type: \"tool-call\",\n toolCallId: chunk.id,\n toolName: chunk.name,\n args: chunk.
|
|
1
|
+
{"version":3,"sources":["../src/convertLangChainMessages.ts"],"sourcesContent":["\"use client\";\n\nimport {\n ThreadAssistantMessage,\n useExternalMessageConverter,\n} from \"@assistant-ui/react\";\nimport { LangChainMessage } from \"./types\";\nimport { ToolCallMessagePart } from \"@assistant-ui/react\";\nimport { ThreadUserMessage } from \"@assistant-ui/react\";\nimport { parsePartialJsonObject } from \"assistant-stream/utils\";\n\nconst contentToParts = (content: LangChainMessage[\"content\"]) => {\n if (typeof content === \"string\")\n return [{ type: \"text\" as const, text: content }];\n return content\n .map(\n (\n part,\n ):\n | (ThreadUserMessage | ThreadAssistantMessage)[\"content\"][number]\n | (ThreadUserMessage | ThreadAssistantMessage)[\"content\"][number][]\n | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n case \"text_delta\":\n return { type: \"text\", text: part.text };\n case \"image_url\":\n if (typeof part.image_url === \"string\") {\n return { type: \"image\", image: part.image_url };\n } else {\n return {\n type: \"image\",\n image: part.image_url.url,\n };\n }\n case \"thinking\":\n return { type: \"reasoning\", text: part.thinking };\n\n case \"reasoning\":\n return part.summary\n .map((s) => s.text)\n .map((text) => ({\n type: \"reasoning\",\n text,\n }));\n\n case \"tool_use\":\n return null;\n case \"input_json_delta\":\n return null;\n\n default:\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown message part type: ${_exhaustiveCheck}`);\n }\n },\n )\n .flat()\n .filter((a) => a !== null);\n};\n\nexport const convertLangChainMessages: useExternalMessageConverter.Callback<\n LangChainMessage\n> = (message) => {\n switch (message.type) {\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"human\":\n return {\n role: \"user\",\n id: message.id,\n content: contentToParts(message.content),\n };\n case \"ai\":\n return {\n role: \"assistant\",\n id: message.id,\n content: [\n ...contentToParts(message.content),\n ...(message.tool_calls?.map(\n (chunk): ToolCallMessagePart => ({\n type: \"tool-call\",\n toolCallId: chunk.id,\n toolName: chunk.name,\n args: chunk.partial_json\n ? (parsePartialJsonObject(chunk.partial_json) ?? {})\n : chunk.args,\n argsText: chunk.partial_json\n ? chunk.partial_json\n : JSON.stringify(chunk.args),\n }),\n ) ?? []),\n ],\n ...(message.status && { status: message.status }),\n };\n case \"tool\":\n return {\n role: \"tool\",\n toolName: message.name,\n toolCallId: message.tool_call_id,\n result: message.content,\n artifact: message.artifact,\n isError: message.status === \"error\",\n };\n }\n};\n"],"mappings":";;;AASA,SAAS,8BAA8B;AAEvC,IAAM,iBAAiB,CAAC,YAAyC;AAC/D,MAAI,OAAO,YAAY;AACrB,WAAO,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,CAAC;AAClD,SAAO,QACJ;AAAA,IACC,CACE,SAIU;AACV,YAAM,OAAO,KAAK;AAClB,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,iBAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,QACzC,KAAK;AACH,iBAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,QACzC,KAAK;AACH,cAAI,OAAO,KAAK,cAAc,UAAU;AACtC,mBAAO,EAAE,MAAM,SAAS,OAAO,KAAK,UAAU;AAAA,UAChD,OAAO;AACL,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO,KAAK,UAAU;AAAA,YACxB;AAAA,UACF;AAAA,QACF,KAAK;AACH,iBAAO,EAAE,MAAM,aAAa,MAAM,KAAK,SAAS;AAAA,QAElD,KAAK;AACH,iBAAO,KAAK,QACT,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,IAAI,CAAC,UAAU;AAAA,YACd,MAAM;AAAA,YACN;AAAA,UACF,EAAE;AAAA,QAEN,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QAET;AACE,gBAAM,mBAA0B;AAChC,gBAAM,IAAI,MAAM,8BAA8B,gBAAgB,EAAE;AAAA,MACpE;AAAA,IACF;AAAA,EACF,EACC,KAAK,EACL,OAAO,CAAC,MAAM,MAAM,IAAI;AAC7B;AAEO,IAAM,2BAET,CAAC,YAAY;AACf,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACnD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,SAAS,eAAe,QAAQ,OAAO;AAAA,MACzC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,SAAS;AAAA,UACP,GAAG,eAAe,QAAQ,OAAO;AAAA,UACjC,GAAI,QAAQ,YAAY;AAAA,YACtB,CAAC,WAAgC;AAAA,cAC/B,MAAM;AAAA,cACN,YAAY,MAAM;AAAA,cAClB,UAAU,MAAM;AAAA,cAChB,MAAM,MAAM,eACP,uBAAuB,MAAM,YAAY,KAAK,CAAC,IAChD,MAAM;AAAA,cACV,UAAU,MAAM,eACZ,MAAM,eACN,KAAK,UAAU,MAAM,IAAI;AAAA,YAC/B;AAAA,UACF,KAAK,CAAC;AAAA,QACR;AAAA,QACA,GAAI,QAAQ,UAAU,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACjD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,QAAQ;AAAA,QAClB,YAAY,QAAQ;AAAA,QACpB,QAAQ,QAAQ;AAAA,QAChB,UAAU,QAAQ;AAAA,QAClB,SAAS,QAAQ,WAAW;AAAA,MAC9B;AAAA,EACJ;AACF;","names":[]}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import { MessageStatus } from \"@assistant-ui/react\";\nimport { ReadonlyJSONObject } from \"assistant-stream/utils\";\n\nexport type LangChainToolCallChunk = {\n index: number;\n id: string;\n name: string;\n args: string;\n};\n\nexport type LangChainToolCall = {\n id: string;\n name: string;\n
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import { MessageStatus } from \"@assistant-ui/react\";\nimport { ReadonlyJSONObject } from \"assistant-stream/utils\";\n\nexport type LangChainToolCallChunk = {\n index: number;\n id: string;\n name: string;\n args: string;\n};\n\nexport type LangChainToolCall = {\n id: string;\n name: string;\n args: ReadonlyJSONObject;\n partial_json?: string;\n};\n\nexport type MessageContentText = {\n type: \"text\" | \"text_delta\";\n text: string;\n};\n\nexport type MessageContentImageUrl = {\n type: \"image_url\";\n image_url: string | { url: string };\n};\n\nexport type MessageContentThinking = {\n type: \"thinking\";\n thinking: string;\n};\n\nexport type MessageContentReasoningSummaryText = {\n type: \"summary_text\";\n text: string;\n};\n\nexport type MessageContentReasoning = {\n type: \"reasoning\";\n summary: MessageContentReasoningSummaryText[];\n};\n\ntype MessageContentToolUse = {\n type: \"tool_use\" | \"input_json_delta\";\n};\n\nexport enum LangGraphKnownEventTypes {\n Messages = \"messages\",\n MessagesPartial = \"messages/partial\",\n MessagesComplete = \"messages/complete\",\n Metadata = \"metadata\",\n Updates = \"updates\",\n Info = \"info\",\n Error = \"error\",\n}\n\ntype CustomEventType = string;\n\nexport type EventType = LangGraphKnownEventTypes | CustomEventType;\n\ntype UserMessageContentComplex = MessageContentText | MessageContentImageUrl;\ntype AssistantMessageContentComplex =\n | MessageContentText\n | MessageContentImageUrl\n | MessageContentToolUse\n | MessageContentReasoning\n | MessageContentThinking;\n\ntype UserMessageContent = string | UserMessageContentComplex[];\ntype AssistantMessageContent = string | AssistantMessageContentComplex[];\n\nexport type LangChainMessage =\n | {\n id?: string;\n type: \"system\";\n content: string;\n }\n | {\n id?: string;\n type: \"human\";\n content: UserMessageContent;\n }\n | {\n id?: string;\n type: \"tool\";\n content: string;\n tool_call_id: string;\n name: string;\n artifact?: any;\n status: \"success\" | \"error\";\n }\n | {\n id?: string;\n type: \"ai\";\n content: AssistantMessageContent;\n tool_call_chunks?: LangChainToolCallChunk[];\n tool_calls?: LangChainToolCall[];\n status?: MessageStatus;\n };\n\nexport type LangChainMessageChunk = {\n id?: string | undefined;\n type: \"AIMessageChunk\";\n content?: AssistantMessageContent | undefined;\n tool_call_chunks?: LangChainToolCallChunk[] | undefined;\n};\n\nexport type LangChainEvent = {\n event:\n | LangGraphKnownEventTypes.MessagesPartial\n | LangGraphKnownEventTypes.MessagesComplete;\n data: LangChainMessage[];\n};\n\ntype LangGraphTupleMetadata = Record<string, unknown>;\n\nexport type LangChainMessageTupleEvent = {\n event: LangGraphKnownEventTypes.Messages;\n data: [LangChainMessageChunk, LangGraphTupleMetadata];\n};\n\nexport type OnMetadataEventCallback = (\n metadata: unknown,\n) => void | Promise<void>;\nexport type OnInfoEventCallback = (info: unknown) => void | Promise<void>;\nexport type OnErrorEventCallback = (error: unknown) => void | Promise<void>;\nexport type OnCustomEventCallback = (\n type: string,\n data: unknown,\n) => void | Promise<void>;\n"],"mappings":";AA8CO,IAAK,2BAAL,kBAAKA,8BAAL;AACL,EAAAA,0BAAA,cAAW;AACX,EAAAA,0BAAA,qBAAkB;AAClB,EAAAA,0BAAA,sBAAmB;AACnB,EAAAA,0BAAA,cAAW;AACX,EAAAA,0BAAA,aAAU;AACV,EAAAA,0BAAA,UAAO;AACP,EAAAA,0BAAA,WAAQ;AAPE,SAAAA;AAAA,GAAA;","names":["LangGraphKnownEventTypes"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-langgraph",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
],
|
|
19
19
|
"sideEffects": false,
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"assistant-stream": "^0.2.
|
|
21
|
+
"assistant-stream": "^0.2.25",
|
|
22
22
|
"uuid": "^11.1.0",
|
|
23
23
|
"zod": "^4.0.17"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"@assistant-ui/react": "^0.11.
|
|
26
|
+
"@assistant-ui/react": "^0.11.6",
|
|
27
27
|
"@types/react": "*",
|
|
28
28
|
"react": "^18 || ^19 || ^19.0.0-rc"
|
|
29
29
|
},
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"react": "19.1.1",
|
|
45
45
|
"tsx": "^4.20.4",
|
|
46
46
|
"vitest": "^3.2.4",
|
|
47
|
-
"@assistant-ui/react": "0.11.
|
|
47
|
+
"@assistant-ui/react": "0.11.6",
|
|
48
48
|
"@assistant-ui/x-buildutils": "0.0.1"
|
|
49
49
|
},
|
|
50
50
|
"publishConfig": {
|
|
@@ -55,14 +55,14 @@ export const appendLangChainChunk = (
|
|
|
55
55
|
|
|
56
56
|
const newToolCalls = [...(prev.tool_calls ?? [])];
|
|
57
57
|
for (const chunk of curr.tool_call_chunks ?? []) {
|
|
58
|
-
const existing = newToolCalls[chunk.index - 1] ?? {
|
|
59
|
-
const
|
|
58
|
+
const existing = newToolCalls[chunk.index - 1] ?? { partial_json: "" };
|
|
59
|
+
const partialJson = existing.partial_json + chunk.args;
|
|
60
60
|
newToolCalls[chunk.index - 1] = {
|
|
61
61
|
...chunk,
|
|
62
62
|
...existing,
|
|
63
|
-
|
|
63
|
+
partial_json: partialJson,
|
|
64
64
|
args:
|
|
65
|
-
parsePartialJsonObject(
|
|
65
|
+
parsePartialJsonObject(partialJson) ??
|
|
66
66
|
("args" in existing ? existing.args : {}),
|
|
67
67
|
};
|
|
68
68
|
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
import { LangChainMessage } from "./types";
|
|
8
8
|
import { ToolCallMessagePart } from "@assistant-ui/react";
|
|
9
9
|
import { ThreadUserMessage } from "@assistant-ui/react";
|
|
10
|
+
import { parsePartialJsonObject } from "assistant-stream/utils";
|
|
10
11
|
|
|
11
12
|
const contentToParts = (content: LangChainMessage["content"]) => {
|
|
12
13
|
if (typeof content === "string")
|
|
@@ -87,10 +88,12 @@ export const convertLangChainMessages: useExternalMessageConverter.Callback<
|
|
|
87
88
|
type: "tool-call",
|
|
88
89
|
toolCallId: chunk.id,
|
|
89
90
|
toolName: chunk.name,
|
|
90
|
-
args: chunk.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
args: chunk.partial_json
|
|
92
|
+
? (parsePartialJsonObject(chunk.partial_json) ?? {})
|
|
93
|
+
: chunk.args,
|
|
94
|
+
argsText: chunk.partial_json
|
|
95
|
+
? chunk.partial_json
|
|
96
|
+
: JSON.stringify(chunk.args),
|
|
94
97
|
}),
|
|
95
98
|
) ?? []),
|
|
96
99
|
],
|
package/src/types.ts
CHANGED