@assistant-ui/core 0.2.17 → 0.2.18
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/adapters/thread-history.d.ts +2 -0
- package/dist/adapters/thread-history.d.ts.map +1 -1
- package/dist/runtime/utils/thread-message-like.d.ts +3 -0
- package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
- package/dist/runtime/utils/thread-message-like.js +3 -0
- package/dist/runtime/utils/thread-message-like.js.map +1 -1
- package/dist/utils/id.d.ts +3 -0
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +3 -0
- package/dist/utils/id.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/thread-history.ts +7 -1
- package/src/runtime/utils/thread-message-like.ts +3 -0
- package/src/utils/id.ts +3 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ChatModelRunOptions, ChatModelRunResult } from "../runtime/utils/chat-model-adapter.js";
|
|
2
2
|
import { ExportedMessageRepository, ExportedMessageRepositoryItem } from "../runtime/utils/message-repository.js";
|
|
3
|
+
import { ReadonlyJSONValue } from "assistant-stream/utils";
|
|
3
4
|
|
|
4
5
|
//#region src/adapters/thread-history.d.ts
|
|
5
6
|
interface MessageStorageEntry<TPayload> {
|
|
@@ -37,6 +38,7 @@ type GenericThreadHistoryAdapter<TMessage> = {
|
|
|
37
38
|
};
|
|
38
39
|
type ThreadHistoryAdapter = {
|
|
39
40
|
load(): Promise<ExportedMessageRepository & {
|
|
41
|
+
state?: ReadonlyJSONValue;
|
|
40
42
|
unstable_resume?: boolean;
|
|
41
43
|
}>;
|
|
42
44
|
resume?(options: ChatModelRunOptions): AsyncGenerator<ChatModelRunResult, void, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-history.d.ts","names":[],"sources":["../../src/adapters/thread-history.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"thread-history.d.ts","names":[],"sources":["../../src/adapters/thread-history.ts"],"mappings":";;;;;UAUiB,mBAAA;EACf,EAAA;EACA,SAAA;EACA,MAAA;EACA,OAAA,EAAS,QAAQ;AAAA;AAAA,UAGF,iBAAA;EACf,QAAA;EACA,OAAA,EAAS,QAAQ;AAAA;AAAA,UAGF,uBAAA;EACf,MAAA;EACA,QAAA,EAAU,iBAAiB,CAAC,QAAA;AAAA;AAAA,UAGb,oBAAA,kCAEQ,MAAA;EAEvB,MAAA;EACA,MAAA,CAAO,IAAA,EAAM,iBAAA,CAAkB,QAAA,IAAY,cAAA;EAC3C,MAAA,CACE,MAAA,EAAQ,mBAAA,CAAoB,cAAA,IAC3B,iBAAA,CAAkB,QAAA;EACrB,KAAA,CAAM,OAAA,EAAS,QAAA;AAAA;AAAA,KAGL,2BAAA;EACV,IAAA,IAAQ,OAAA,CAAQ,uBAAA,CAAwB,QAAA;EACxC,MAAA,CAAO,IAAA,EAAM,iBAAA,CAAkB,QAAA,IAAY,OAAA;EAC3C,MAAA,EACE,IAAA,EAAM,iBAAA,CAAkB,QAAA,GACxB,cAAA,WACC,OAAA;EACH,MAAA,EAAQ,KAAA,EAAO,iBAAA,CAAkB,QAAA,MAAc,OAAA;EAC/C,eAAA,EACE,KAAA,EAAO,iBAAA,CAAkB,QAAA,KACzB,OAAA;IACE,UAAA;IACA,cAAA;MAAmB,QAAA;MAAkB,MAAA;IAAA;EAAA;AAAA;AAAA,KAK/B,oBAAA;EACV,IAAA,IAAQ,OAAA,CACN,yBAAA;IACE,KAAA,GAAQ,iBAAA;IACR,eAAA;EAAA;EAGJ,MAAA,EACE,OAAA,EAAS,mBAAA,GACR,cAAA,CAAe,kBAAA;EAClB,MAAA,CAAO,IAAA,EAAM,6BAAA,GAAgC,OAAA;EAC7C,MAAA,EAAQ,KAAA,EAAO,6BAAA,KAAkC,OAAA,QAnCN;EAqC3C,UAAA,mCAA6C,MAAA,mBAC3C,aAAA,EAAe,oBAAA,CAAqB,QAAA,EAAU,cAAA,IAC7C,2BAAA,CAA4B,QAAA;AAAA"}
|
|
@@ -54,6 +54,9 @@ type ThreadMessageLike = {
|
|
|
54
54
|
readonly custom?: Record<string, unknown> | undefined;
|
|
55
55
|
} | undefined;
|
|
56
56
|
};
|
|
57
|
+
/**
|
|
58
|
+
* @deprecated This API is experimental and may change without notice.
|
|
59
|
+
*/
|
|
57
60
|
declare const fromThreadMessageLike: (like: ThreadMessageLike, fallbackId: string, fallbackStatus: MessageStatus) => ThreadMessage;
|
|
58
61
|
//#endregion
|
|
59
62
|
export { ThreadMessageLike, fromThreadMessageLike };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-message-like.d.ts","names":[],"sources":["../../../src/runtime/utils/thread-message-like.ts"],"mappings":";;;;;KA+BK,gBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGH,iBAAA;EAAA,SACD,IAAA;EAAA,SACA,OAAA,qBAGD,eAAA,GACA,oBAAA,GACA,iBAAA,GACA,gBAAA,GACA,eAAA,GACA,eAAA,GACA,uBAAA,GACA,yBAAA,GACA,gBAAA;IAAA,SAEW,IAAA;IAAA,SACA,UAAA;IAAA,SACA,QAAA;IAAA,SACA,IAAA,GAAO,kBAAA;IAAA,SACP,QAAA;IAAA,SACA,QAAA;IAAA,SACA,MAAA;IAAA,SACA,OAAA;IAAA,SACA,QAAA;IAAA,SACA,QAAA,YAAoB,aAAA;IAAA,SACpB,SAAA;MAAc,IAAA;MAAe,OAAA;IAAA;IAAA,SAC7B,MAAA,GAAS,cAAA;IAAA,SACT,QAAA;MAAA,SACE,EAAA;MAAA,SACA,QAAA;MAAA,SACA,MAAA;MAAA,SACA,WAAA;MAAA,SACA,OAAA,YAAmB,kBAAA;MAAA,SACnB,QAAA;MAAA,SACA,UAAA;IAAA;EAAA;EAAA,SAIZ,EAAA;EAAA,SACA,SAAA,GAAY,IAAA;EAAA,SACZ,MAAA,GAAS,aAAA;EAAA,SACT,WAAA,aACK,IAAA,CAAK,kBAAA;IAAA,SACJ,OAAA,YAAmB,qBAAA,GAAwB,gBAAA;EAAA;EAAA,SAGjD,QAAA;IAAA,SAEM,cAAA,GAAiB,iBAAA;IAAA,SACjB,oBAAA,YACI,iBAAA;IAAA,SAEJ,aAAA,YAAyB,iBAAA;IAAA,SACzB,KAAA,YAAiB,UAAA;IAAA,SACjB,MAAA,GAAS,aAAA;IAAA,SACT,iBAAA;MAAA,SAA+B,IAAA;IAAA;IAAA,SAC/B,YAAA;IAAA,SACA,MAAA,GAAS,MAAA;EAAA;AAAA
|
|
1
|
+
{"version":3,"file":"thread-message-like.d.ts","names":[],"sources":["../../../src/runtime/utils/thread-message-like.ts"],"mappings":";;;;;KA+BK,gBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGH,iBAAA;EAAA,SACD,IAAA;EAAA,SACA,OAAA,qBAGD,eAAA,GACA,oBAAA,GACA,iBAAA,GACA,gBAAA,GACA,eAAA,GACA,eAAA,GACA,uBAAA,GACA,yBAAA,GACA,gBAAA;IAAA,SAEW,IAAA;IAAA,SACA,UAAA;IAAA,SACA,QAAA;IAAA,SACA,IAAA,GAAO,kBAAA;IAAA,SACP,QAAA;IAAA,SACA,QAAA;IAAA,SACA,MAAA;IAAA,SACA,OAAA;IAAA,SACA,QAAA;IAAA,SACA,QAAA,YAAoB,aAAA;IAAA,SACpB,SAAA;MAAc,IAAA;MAAe,OAAA;IAAA;IAAA,SAC7B,MAAA,GAAS,cAAA;IAAA,SACT,QAAA;MAAA,SACE,EAAA;MAAA,SACA,QAAA;MAAA,SACA,MAAA;MAAA,SACA,WAAA;MAAA,SACA,OAAA,YAAmB,kBAAA;MAAA,SACnB,QAAA;MAAA,SACA,UAAA;IAAA;EAAA;EAAA,SAIZ,EAAA;EAAA,SACA,SAAA,GAAY,IAAA;EAAA,SACZ,MAAA,GAAS,aAAA;EAAA,SACT,WAAA,aACK,IAAA,CAAK,kBAAA;IAAA,SACJ,OAAA,YAAmB,qBAAA,GAAwB,gBAAA;EAAA;EAAA,SAGjD,QAAA;IAAA,SAEM,cAAA,GAAiB,iBAAA;IAAA,SACjB,oBAAA,YACI,iBAAA;IAAA,SAEJ,aAAA,YAAyB,iBAAA;IAAA,SACzB,KAAA,YAAiB,UAAA;IAAA,SACjB,MAAA,GAAS,aAAA;IAAA,SACT,iBAAA;MAAA,SAA+B,IAAA;IAAA;IAAA,SAC/B,YAAA;IAAA,SACA,MAAA,GAAS,MAAA;EAAA;AAAA;;;;cAgBb,qBAAA,GACX,IAAA,EAAM,iBAAA,EACN,UAAA,UACA,cAAA,EAAgB,aAAA,KACf,aAAA"}
|
|
@@ -9,6 +9,9 @@ const convertDataPrefixedPart = (type, data) => {
|
|
|
9
9
|
data
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated This API is experimental and may change without notice.
|
|
14
|
+
*/
|
|
12
15
|
const fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
|
|
13
16
|
const { role, id, createdAt, attachments, status, metadata } = like;
|
|
14
17
|
const common = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-message-like.js","names":["parsePartialJsonObject","generateId","ReasoningMessagePart","SourceMessagePart","ThreadStep","MessageStatus","ImageMessagePart","ThreadMessage","ThreadAssistantMessagePart","ThreadAssistantMessage","ThreadUserMessagePart","ThreadUserMessage","ThreadSystemMessage","FileMessagePart","DataMessagePart","GenerativeUIMessagePart","Unstable_AudioMessagePart","CompleteAttachment","MessageTiming","TextMessagePart","ToolApprovalOption","ToolCallTiming","ReadonlyJSONObject","ReadonlyJSONValue","DataPrefixedPart","type","data","ThreadMessageLike","role","content","toolCallId","toolName","args","argsText","artifact","result","isError","parentId","messages","interrupt","payload","timing","approval","id","approved","reason","isAutomatic","options","optionId","resolution","createdAt","Date","status","attachments","Omit","metadata","unstable_state","unstable_annotations","unstable_data","steps","submittedFeedback","isOptimistic","custom","Record","convertDataPrefixedPart","startsWith","undefined","name","substring","fromThreadMessageLike","like","fallbackId","fallbackStatus","common","const","text","sanitizeImageContent","image","rest","dataUri","match","test","console","warn","length","Error","map","part","trim","basePart","commonProps","JSON","stringify","converted","filter","c","att","unsupportedRole"],"sources":["../../../src/runtime/utils/thread-message-like.ts"],"sourcesContent":["import { parsePartialJsonObject } from \"assistant-stream/utils\";\nimport { generateId } from \"../../utils/id\";\nimport type {\n ReasoningMessagePart,\n SourceMessagePart,\n ThreadStep,\n MessageStatus,\n ImageMessagePart,\n ThreadMessage,\n ThreadAssistantMessagePart,\n ThreadAssistantMessage,\n ThreadUserMessagePart,\n ThreadUserMessage,\n ThreadSystemMessage,\n FileMessagePart,\n DataMessagePart,\n GenerativeUIMessagePart,\n Unstable_AudioMessagePart,\n} from \"../../types/message\";\nimport type { CompleteAttachment } from \"../../types/attachment\";\nimport type {\n MessageTiming,\n TextMessagePart,\n ToolApprovalOption,\n ToolCallTiming,\n} from \"../../types/message\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\n\ntype DataPrefixedPart = {\n readonly type: `data-${string}`;\n readonly data: any;\n};\n\nexport type ThreadMessageLike = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly content:\n | string\n | readonly (\n | TextMessagePart\n | ReasoningMessagePart\n | SourceMessagePart\n | ImageMessagePart\n | FileMessagePart\n | DataMessagePart\n | GenerativeUIMessagePart\n | Unstable_AudioMessagePart\n | DataPrefixedPart\n | {\n readonly type: \"tool-call\";\n readonly toolCallId?: string;\n readonly toolName: string;\n readonly args?: ReadonlyJSONObject;\n readonly argsText?: string;\n readonly artifact?: any;\n readonly result?: any | undefined;\n readonly isError?: boolean | undefined;\n readonly parentId?: string | undefined;\n readonly messages?: readonly ThreadMessage[] | undefined;\n readonly interrupt?: { type: \"human\"; payload: unknown };\n readonly timing?: ToolCallTiming;\n readonly approval?: {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n readonly options?: readonly ToolApprovalOption[];\n readonly optionId?: string;\n readonly resolution?: \"cancelled\" | \"expired\";\n };\n }\n )[];\n readonly id?: string | undefined;\n readonly createdAt?: Date | undefined;\n readonly status?: MessageStatus | undefined;\n readonly attachments?:\n | readonly (Omit<CompleteAttachment, \"content\"> & {\n readonly content: readonly (ThreadUserMessagePart | DataPrefixedPart)[];\n })[]\n | undefined;\n readonly metadata?:\n | {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations?:\n | readonly ReadonlyJSONValue[]\n | undefined;\n readonly unstable_data?: readonly ReadonlyJSONValue[] | undefined;\n readonly steps?: readonly ThreadStep[] | undefined;\n readonly timing?: MessageTiming | undefined;\n readonly submittedFeedback?: { readonly type: \"positive\" | \"negative\" };\n readonly isOptimistic?: boolean | undefined;\n readonly custom?: Record<string, unknown> | undefined;\n }\n | undefined;\n};\n\nconst convertDataPrefixedPart = (\n type: string,\n data: unknown,\n): DataMessagePart | undefined => {\n if (!type.startsWith(\"data-\")) return undefined;\n return { type: \"data\", name: type.substring(5), data };\n};\n\nexport const fromThreadMessageLike = (\n like: ThreadMessageLike,\n fallbackId: string,\n fallbackStatus: MessageStatus,\n): ThreadMessage => {\n const { role, id, createdAt, attachments, status, metadata } = like;\n const common = {\n id: id ?? fallbackId,\n createdAt: createdAt ?? new Date(),\n };\n\n const content =\n typeof like.content === \"string\"\n ? [{ type: \"text\" as const, text: like.content }]\n : like.content;\n\n const sanitizeImageContent = ({\n image,\n ...rest\n }: ImageMessagePart): ImageMessagePart | null => {\n const dataUri = image.match(\n /^data:image\\/(png|jpeg|jpg|gif|webp|svg\\+xml);base64,(.*)$/,\n );\n if (dataUri) {\n return { ...rest, image };\n }\n if (/^(https:\\/\\/|blob:)/.test(image)) {\n return { ...rest, image };\n }\n console.warn(`Invalid image data format detected`);\n return null;\n };\n\n if (role !== \"user\" && attachments?.length)\n throw new Error(\"attachments are only supported for user messages\");\n\n if (role !== \"assistant\" && status)\n throw new Error(\"status is only supported for assistant messages\");\n\n if (role !== \"assistant\" && metadata?.steps)\n throw new Error(\"metadata.steps is only supported for assistant messages\");\n\n switch (role) {\n case \"assistant\":\n return {\n ...common,\n role,\n content: content\n .map((part): ThreadAssistantMessagePart | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"reasoning\":\n if (part.text.trim().length === 0) return null;\n return part;\n\n case \"file\":\n case \"source\":\n return part;\n\n case \"image\":\n return sanitizeImageContent(part);\n\n case \"data\":\n return part;\n\n case \"generative-ui\":\n return part;\n\n case \"tool-call\": {\n const { parentId, messages, ...basePart } = part;\n const commonProps = {\n ...basePart,\n toolCallId: part.toolCallId ?? `tool-${generateId()}`,\n ...(parentId !== undefined && { parentId }),\n ...(messages !== undefined && { messages }),\n };\n\n if (part.args) {\n return {\n ...commonProps,\n args: part.args,\n argsText: part.argsText ?? JSON.stringify(part.args),\n };\n }\n return {\n ...commonProps,\n args: parsePartialJsonObject(part.argsText ?? \"\") ?? {},\n argsText: part.argsText ?? \"\",\n };\n }\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(\n `Unsupported assistant message part type: ${type}`,\n );\n }\n }\n })\n .filter((c) => !!c),\n status: status ?? fallbackStatus,\n metadata: {\n unstable_state: metadata?.unstable_state ?? null,\n unstable_annotations: metadata?.unstable_annotations ?? [],\n unstable_data: metadata?.unstable_data ?? [],\n custom: metadata?.custom ?? {},\n steps: metadata?.steps ?? [],\n ...(metadata?.timing && { timing: metadata.timing }),\n ...(metadata?.submittedFeedback && {\n submittedFeedback: metadata.submittedFeedback,\n }),\n ...(metadata?.isOptimistic && { isOptimistic: true }),\n },\n } satisfies ThreadAssistantMessage;\n\n case \"user\":\n return {\n ...common,\n role,\n content: content.map((part): ThreadUserMessagePart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"image\":\n case \"audio\":\n case \"file\":\n case \"data\":\n return part;\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(`Unsupported user message part type: ${type}`);\n }\n }\n }),\n attachments: (attachments ?? []).map((att) => ({\n ...att,\n content: att.content.map((part): ThreadUserMessagePart => {\n const converted = convertDataPrefixedPart(\n part.type,\n (part as DataPrefixedPart).data,\n );\n return converted ?? (part as ThreadUserMessagePart);\n }),\n })),\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadUserMessage;\n\n case \"system\":\n if (content.length !== 1 || content[0]!.type !== \"text\")\n throw new Error(\n \"System messages must have exactly one text message part.\",\n );\n\n return {\n ...common,\n role,\n content: content as [TextMessagePart],\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadSystemMessage;\n\n default: {\n const unsupportedRole: never = role;\n throw new Error(`Unknown message role: ${unsupportedRole}`);\n }\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thread-message-like.js","names":["parsePartialJsonObject","generateId","ReasoningMessagePart","SourceMessagePart","ThreadStep","MessageStatus","ImageMessagePart","ThreadMessage","ThreadAssistantMessagePart","ThreadAssistantMessage","ThreadUserMessagePart","ThreadUserMessage","ThreadSystemMessage","FileMessagePart","DataMessagePart","GenerativeUIMessagePart","Unstable_AudioMessagePart","CompleteAttachment","MessageTiming","TextMessagePart","ToolApprovalOption","ToolCallTiming","ReadonlyJSONObject","ReadonlyJSONValue","DataPrefixedPart","type","data","ThreadMessageLike","role","content","toolCallId","toolName","args","argsText","artifact","result","isError","parentId","messages","interrupt","payload","timing","approval","id","approved","reason","isAutomatic","options","optionId","resolution","createdAt","Date","status","attachments","Omit","metadata","unstable_state","unstable_annotations","unstable_data","steps","submittedFeedback","isOptimistic","custom","Record","convertDataPrefixedPart","startsWith","undefined","name","substring","fromThreadMessageLike","like","fallbackId","fallbackStatus","common","const","text","sanitizeImageContent","image","rest","dataUri","match","test","console","warn","length","Error","map","part","trim","basePart","commonProps","JSON","stringify","converted","filter","c","att","unsupportedRole"],"sources":["../../../src/runtime/utils/thread-message-like.ts"],"sourcesContent":["import { parsePartialJsonObject } from \"assistant-stream/utils\";\nimport { generateId } from \"../../utils/id\";\nimport type {\n ReasoningMessagePart,\n SourceMessagePart,\n ThreadStep,\n MessageStatus,\n ImageMessagePart,\n ThreadMessage,\n ThreadAssistantMessagePart,\n ThreadAssistantMessage,\n ThreadUserMessagePart,\n ThreadUserMessage,\n ThreadSystemMessage,\n FileMessagePart,\n DataMessagePart,\n GenerativeUIMessagePart,\n Unstable_AudioMessagePart,\n} from \"../../types/message\";\nimport type { CompleteAttachment } from \"../../types/attachment\";\nimport type {\n MessageTiming,\n TextMessagePart,\n ToolApprovalOption,\n ToolCallTiming,\n} from \"../../types/message\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\n\ntype DataPrefixedPart = {\n readonly type: `data-${string}`;\n readonly data: any;\n};\n\nexport type ThreadMessageLike = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly content:\n | string\n | readonly (\n | TextMessagePart\n | ReasoningMessagePart\n | SourceMessagePart\n | ImageMessagePart\n | FileMessagePart\n | DataMessagePart\n | GenerativeUIMessagePart\n | Unstable_AudioMessagePart\n | DataPrefixedPart\n | {\n readonly type: \"tool-call\";\n readonly toolCallId?: string;\n readonly toolName: string;\n readonly args?: ReadonlyJSONObject;\n readonly argsText?: string;\n readonly artifact?: any;\n readonly result?: any | undefined;\n readonly isError?: boolean | undefined;\n readonly parentId?: string | undefined;\n readonly messages?: readonly ThreadMessage[] | undefined;\n readonly interrupt?: { type: \"human\"; payload: unknown };\n readonly timing?: ToolCallTiming;\n readonly approval?: {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n readonly options?: readonly ToolApprovalOption[];\n readonly optionId?: string;\n readonly resolution?: \"cancelled\" | \"expired\";\n };\n }\n )[];\n readonly id?: string | undefined;\n readonly createdAt?: Date | undefined;\n readonly status?: MessageStatus | undefined;\n readonly attachments?:\n | readonly (Omit<CompleteAttachment, \"content\"> & {\n readonly content: readonly (ThreadUserMessagePart | DataPrefixedPart)[];\n })[]\n | undefined;\n readonly metadata?:\n | {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations?:\n | readonly ReadonlyJSONValue[]\n | undefined;\n readonly unstable_data?: readonly ReadonlyJSONValue[] | undefined;\n readonly steps?: readonly ThreadStep[] | undefined;\n readonly timing?: MessageTiming | undefined;\n readonly submittedFeedback?: { readonly type: \"positive\" | \"negative\" };\n readonly isOptimistic?: boolean | undefined;\n readonly custom?: Record<string, unknown> | undefined;\n }\n | undefined;\n};\n\nconst convertDataPrefixedPart = (\n type: string,\n data: unknown,\n): DataMessagePart | undefined => {\n if (!type.startsWith(\"data-\")) return undefined;\n return { type: \"data\", name: type.substring(5), data };\n};\n\n/**\n * @deprecated This API is experimental and may change without notice.\n */\nexport const fromThreadMessageLike = (\n like: ThreadMessageLike,\n fallbackId: string,\n fallbackStatus: MessageStatus,\n): ThreadMessage => {\n const { role, id, createdAt, attachments, status, metadata } = like;\n const common = {\n id: id ?? fallbackId,\n createdAt: createdAt ?? new Date(),\n };\n\n const content =\n typeof like.content === \"string\"\n ? [{ type: \"text\" as const, text: like.content }]\n : like.content;\n\n const sanitizeImageContent = ({\n image,\n ...rest\n }: ImageMessagePart): ImageMessagePart | null => {\n const dataUri = image.match(\n /^data:image\\/(png|jpeg|jpg|gif|webp|svg\\+xml);base64,(.*)$/,\n );\n if (dataUri) {\n return { ...rest, image };\n }\n if (/^(https:\\/\\/|blob:)/.test(image)) {\n return { ...rest, image };\n }\n console.warn(`Invalid image data format detected`);\n return null;\n };\n\n if (role !== \"user\" && attachments?.length)\n throw new Error(\"attachments are only supported for user messages\");\n\n if (role !== \"assistant\" && status)\n throw new Error(\"status is only supported for assistant messages\");\n\n if (role !== \"assistant\" && metadata?.steps)\n throw new Error(\"metadata.steps is only supported for assistant messages\");\n\n switch (role) {\n case \"assistant\":\n return {\n ...common,\n role,\n content: content\n .map((part): ThreadAssistantMessagePart | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"reasoning\":\n if (part.text.trim().length === 0) return null;\n return part;\n\n case \"file\":\n case \"source\":\n return part;\n\n case \"image\":\n return sanitizeImageContent(part);\n\n case \"data\":\n return part;\n\n case \"generative-ui\":\n return part;\n\n case \"tool-call\": {\n const { parentId, messages, ...basePart } = part;\n const commonProps = {\n ...basePart,\n toolCallId: part.toolCallId ?? `tool-${generateId()}`,\n ...(parentId !== undefined && { parentId }),\n ...(messages !== undefined && { messages }),\n };\n\n if (part.args) {\n return {\n ...commonProps,\n args: part.args,\n argsText: part.argsText ?? JSON.stringify(part.args),\n };\n }\n return {\n ...commonProps,\n args: parsePartialJsonObject(part.argsText ?? \"\") ?? {},\n argsText: part.argsText ?? \"\",\n };\n }\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(\n `Unsupported assistant message part type: ${type}`,\n );\n }\n }\n })\n .filter((c) => !!c),\n status: status ?? fallbackStatus,\n metadata: {\n unstable_state: metadata?.unstable_state ?? null,\n unstable_annotations: metadata?.unstable_annotations ?? [],\n unstable_data: metadata?.unstable_data ?? [],\n custom: metadata?.custom ?? {},\n steps: metadata?.steps ?? [],\n ...(metadata?.timing && { timing: metadata.timing }),\n ...(metadata?.submittedFeedback && {\n submittedFeedback: metadata.submittedFeedback,\n }),\n ...(metadata?.isOptimistic && { isOptimistic: true }),\n },\n } satisfies ThreadAssistantMessage;\n\n case \"user\":\n return {\n ...common,\n role,\n content: content.map((part): ThreadUserMessagePart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"image\":\n case \"audio\":\n case \"file\":\n case \"data\":\n return part;\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(`Unsupported user message part type: ${type}`);\n }\n }\n }),\n attachments: (attachments ?? []).map((att) => ({\n ...att,\n content: att.content.map((part): ThreadUserMessagePart => {\n const converted = convertDataPrefixedPart(\n part.type,\n (part as DataPrefixedPart).data,\n );\n return converted ?? (part as ThreadUserMessagePart);\n }),\n })),\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadUserMessage;\n\n case \"system\":\n if (content.length !== 1 || content[0]!.type !== \"text\")\n throw new Error(\n \"System messages must have exactly one text message part.\",\n );\n\n return {\n ...common,\n role,\n content: content as [TextMessagePart],\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadSystemMessage;\n\n default: {\n const unsupportedRole: never = role;\n throw new Error(`Unknown message role: ${unsupportedRole}`);\n }\n }\n};\n"],"mappings":"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"}
|
package/dist/utils/id.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
//#region src/utils/id.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* @deprecated This API is experimental and may change without notice.
|
|
4
|
+
*/
|
|
2
5
|
declare const generateId: (size?: number) => string;
|
|
3
6
|
declare const generateErrorMessageId: () => string;
|
|
4
7
|
declare const isErrorMessageId: (id: string) => boolean;
|
package/dist/utils/id.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.d.ts","names":[],"sources":["../../src/utils/id.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"id.d.ts","names":[],"sources":["../../src/utils/id.ts"],"mappings":";;AAKA;;cAAa,UAAA,GAAU,IAAA;AAAA,cAMV,sBAAA;AAAA,cACA,gBAAA,GAAoB,EAAU"}
|
package/dist/utils/id.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { customAlphabet } from "nanoid/non-secure";
|
|
2
2
|
//#region src/utils/id.ts
|
|
3
|
+
/**
|
|
4
|
+
* @deprecated This API is experimental and may change without notice.
|
|
5
|
+
*/
|
|
3
6
|
const generateId = customAlphabet("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 7);
|
|
4
7
|
const errorPrefix = "__error__";
|
|
5
8
|
const generateErrorMessageId = () => `${errorPrefix}${generateId()}`;
|
package/dist/utils/id.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.js","names":["customAlphabet","generateId","errorPrefix","generateErrorMessageId","isErrorMessageId","id","startsWith"],"sources":["../../src/utils/id.ts"],"sourcesContent":["import { customAlphabet } from \"nanoid/non-secure\";\n\nexport const generateId = customAlphabet(\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n 7,\n);\n\nconst errorPrefix = \"__error__\";\nexport const generateErrorMessageId = () => `${errorPrefix}${generateId()}`;\nexport const isErrorMessageId = (id: string) => id.startsWith(errorPrefix);\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"id.js","names":["customAlphabet","generateId","errorPrefix","generateErrorMessageId","isErrorMessageId","id","startsWith"],"sources":["../../src/utils/id.ts"],"sourcesContent":["import { customAlphabet } from \"nanoid/non-secure\";\n\n/**\n * @deprecated This API is experimental and may change without notice.\n */\nexport const generateId = customAlphabet(\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n 7,\n);\n\nconst errorPrefix = \"__error__\";\nexport const generateErrorMessageId = () => `${errorPrefix}${generateId()}`;\nexport const isErrorMessageId = (id: string) => id.startsWith(errorPrefix);\n"],"mappings":";;;;;AAKA,MAAaC,aAAaD,eACxB,kEACA,CACF;AAEA,MAAME,cAAc;AACpB,MAAaC,+BAA+B,GAAGD,cAAcD,WAAW;AACxE,MAAaG,oBAAoBC,OAAeA,GAAGC,WAAWJ,WAAW"}
|
package/package.json
CHANGED
|
@@ -6,6 +6,7 @@ import type {
|
|
|
6
6
|
ExportedMessageRepository,
|
|
7
7
|
ExportedMessageRepositoryItem,
|
|
8
8
|
} from "../runtime/utils/message-repository";
|
|
9
|
+
import type { ReadonlyJSONValue } from "assistant-stream/utils";
|
|
9
10
|
|
|
10
11
|
export interface MessageStorageEntry<TPayload> {
|
|
11
12
|
id: string;
|
|
@@ -54,7 +55,12 @@ export type GenericThreadHistoryAdapter<TMessage> = {
|
|
|
54
55
|
};
|
|
55
56
|
|
|
56
57
|
export type ThreadHistoryAdapter = {
|
|
57
|
-
load(): Promise<
|
|
58
|
+
load(): Promise<
|
|
59
|
+
ExportedMessageRepository & {
|
|
60
|
+
state?: ReadonlyJSONValue;
|
|
61
|
+
unstable_resume?: boolean;
|
|
62
|
+
}
|
|
63
|
+
>;
|
|
58
64
|
resume?(
|
|
59
65
|
options: ChatModelRunOptions,
|
|
60
66
|
): AsyncGenerator<ChatModelRunResult, void, unknown>;
|
|
@@ -104,6 +104,9 @@ const convertDataPrefixedPart = (
|
|
|
104
104
|
return { type: "data", name: type.substring(5), data };
|
|
105
105
|
};
|
|
106
106
|
|
|
107
|
+
/**
|
|
108
|
+
* @deprecated This API is experimental and may change without notice.
|
|
109
|
+
*/
|
|
107
110
|
export const fromThreadMessageLike = (
|
|
108
111
|
like: ThreadMessageLike,
|
|
109
112
|
fallbackId: string,
|
package/src/utils/id.ts
CHANGED