@agentscope-ai/agentscope 0.0.5 → 0.0.6
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/agent/index.d.mts +4 -4
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +34 -7
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/index.mjs +34 -7
- package/dist/agent/index.mjs.map +1 -1
- package/dist/{base-qmU135_k.d.ts → base-13VLaOvY.d.ts} +2 -2
- package/dist/{base-BI5s2ksj.d.mts → base-Bc3GkNS7.d.mts} +1 -1
- package/dist/{base-DHtZCg94.d.ts → base-CJkm56kB.d.ts} +1 -1
- package/dist/{base-CFDeoJRe.d.ts → base-Dfizi3RB.d.ts} +1 -1
- package/dist/{base-BDyDUIhj.d.mts → base-L72wZVx8.d.mts} +2 -2
- package/dist/{base-BB9eTlit.d.mts → base-Ps8E0j1_.d.mts} +1 -1
- package/dist/event/index.d.mts +2 -2
- package/dist/event/index.d.ts +2 -2
- package/dist/event/index.js.map +1 -1
- package/dist/event/index.mjs.map +1 -1
- package/dist/formatter/index.d.mts +2 -2
- package/dist/formatter/index.d.ts +2 -2
- package/dist/formatter/index.js +16 -0
- package/dist/formatter/index.js.map +1 -1
- package/dist/formatter/index.mjs +16 -0
- package/dist/formatter/index.mjs.map +1 -1
- package/dist/message/index.d.mts +1 -1
- package/dist/message/index.d.ts +1 -1
- package/dist/message/index.js +50 -14
- package/dist/message/index.js.map +1 -1
- package/dist/message/index.mjs +50 -14
- package/dist/message/index.mjs.map +1 -1
- package/dist/{message-D-LObC06.d.mts → message-COpNEf0G.d.mts} +10 -7
- package/dist/{message-DU0_qm3u.d.ts → message-DbCMy5tM.d.ts} +10 -7
- package/dist/model/index.d.mts +4 -4
- package/dist/model/index.d.ts +4 -4
- package/dist/model/index.js +16 -0
- package/dist/model/index.js.map +1 -1
- package/dist/model/index.mjs +16 -0
- package/dist/model/index.mjs.map +1 -1
- package/dist/storage/index.d.mts +2 -2
- package/dist/storage/index.d.ts +2 -2
- package/package.json +1 -1
- package/src/agent/agent.ts +20 -7
- package/src/event/index.ts +2 -2
- package/src/message/append-event.test.ts +17 -11
- package/src/message/message.test.ts +2 -2
- package/src/message/message.ts +77 -14
package/dist/message/index.mjs
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
// src/message/message.ts
|
|
2
|
+
function assertContentBlocksForRole(role, content) {
|
|
3
|
+
if (role === "user") {
|
|
4
|
+
for (const block of content) {
|
|
5
|
+
if (block.type !== "text" && block.type !== "data") {
|
|
6
|
+
throw new Error("User message can only contain text blocks or data blocks.");
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
} else if (role === "system") {
|
|
10
|
+
for (const block of content) {
|
|
11
|
+
if (block.type !== "text") {
|
|
12
|
+
throw new Error("System message can only contain text blocks.");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
2
17
|
function createMsg({
|
|
3
18
|
name,
|
|
4
19
|
content,
|
|
@@ -10,6 +25,7 @@ function createMsg({
|
|
|
10
25
|
usage
|
|
11
26
|
}) {
|
|
12
27
|
const contentBlocks = typeof content === "string" ? [{ id: crypto.randomUUID(), type: "text", text: content }] : content;
|
|
28
|
+
assertContentBlocksForRole(role, contentBlocks);
|
|
13
29
|
return { id, name, role, content: contentBlocks, metadata, created_at, finished_at, usage };
|
|
14
30
|
}
|
|
15
31
|
function UserMsg({
|
|
@@ -17,9 +33,18 @@ function UserMsg({
|
|
|
17
33
|
content,
|
|
18
34
|
metadata = {},
|
|
19
35
|
id = crypto.randomUUID(),
|
|
20
|
-
created_at = (/* @__PURE__ */ new Date()).toISOString()
|
|
36
|
+
created_at = (/* @__PURE__ */ new Date()).toISOString(),
|
|
37
|
+
finished_at
|
|
21
38
|
}) {
|
|
22
|
-
return createMsg({
|
|
39
|
+
return createMsg({
|
|
40
|
+
name,
|
|
41
|
+
content,
|
|
42
|
+
role: "user",
|
|
43
|
+
metadata,
|
|
44
|
+
id,
|
|
45
|
+
created_at,
|
|
46
|
+
finished_at: finished_at ?? created_at
|
|
47
|
+
});
|
|
23
48
|
}
|
|
24
49
|
function AssistantMsg({
|
|
25
50
|
name,
|
|
@@ -36,9 +61,18 @@ function SystemMsg({
|
|
|
36
61
|
content,
|
|
37
62
|
metadata = {},
|
|
38
63
|
id = crypto.randomUUID(),
|
|
39
|
-
created_at = (/* @__PURE__ */ new Date()).toISOString()
|
|
64
|
+
created_at = (/* @__PURE__ */ new Date()).toISOString(),
|
|
65
|
+
finished_at
|
|
40
66
|
}) {
|
|
41
|
-
return createMsg({
|
|
67
|
+
return createMsg({
|
|
68
|
+
name,
|
|
69
|
+
content,
|
|
70
|
+
role: "system",
|
|
71
|
+
metadata,
|
|
72
|
+
id,
|
|
73
|
+
created_at,
|
|
74
|
+
finished_at: finished_at ?? created_at
|
|
75
|
+
});
|
|
42
76
|
}
|
|
43
77
|
function getTextContent(msg, separator = "\n") {
|
|
44
78
|
const textBlocks = msg.content.filter((block) => block.type === "text");
|
|
@@ -103,7 +137,7 @@ function appendEvent(msg, event) {
|
|
|
103
137
|
const block = findBlock(msg, "data", event.block_id);
|
|
104
138
|
if (!block) {
|
|
105
139
|
console.warn(`DataBlock "${event.block_id}" not found, skipping.`);
|
|
106
|
-
} else {
|
|
140
|
+
} else if (event.data) {
|
|
107
141
|
block.source.data += event.data;
|
|
108
142
|
}
|
|
109
143
|
break;
|
|
@@ -152,7 +186,7 @@ function appendEvent(msg, event) {
|
|
|
152
186
|
if (!last || last.type !== "text") {
|
|
153
187
|
trb.output.push({
|
|
154
188
|
type: "text",
|
|
155
|
-
id:
|
|
189
|
+
id: crypto.randomUUID(),
|
|
156
190
|
text: event.delta
|
|
157
191
|
});
|
|
158
192
|
} else {
|
|
@@ -171,7 +205,11 @@ function appendEvent(msg, event) {
|
|
|
171
205
|
trb.output = [{ type: "text", id: crypto.randomUUID(), text: trb.output }];
|
|
172
206
|
}
|
|
173
207
|
const source = event.data != null ? { type: "base64", data: event.data, media_type: event.media_type } : { type: "url", url: event.url, media_type: event.media_type };
|
|
174
|
-
trb.output.push({
|
|
208
|
+
trb.output.push({
|
|
209
|
+
type: "data",
|
|
210
|
+
id: event.block_id ?? crypto.randomUUID(),
|
|
211
|
+
source
|
|
212
|
+
});
|
|
175
213
|
}
|
|
176
214
|
break;
|
|
177
215
|
}
|
|
@@ -186,12 +224,12 @@ function appendEvent(msg, event) {
|
|
|
186
224
|
}
|
|
187
225
|
case "MODEL_CALL_END" /* MODEL_CALL_END */:
|
|
188
226
|
if (msg.usage) {
|
|
189
|
-
msg.usage.
|
|
190
|
-
msg.usage.
|
|
227
|
+
msg.usage.input_tokens += event.input_tokens;
|
|
228
|
+
msg.usage.output_tokens += event.output_tokens;
|
|
191
229
|
} else {
|
|
192
230
|
msg.usage = {
|
|
193
|
-
|
|
194
|
-
|
|
231
|
+
input_tokens: event.input_tokens,
|
|
232
|
+
output_tokens: event.output_tokens
|
|
195
233
|
};
|
|
196
234
|
}
|
|
197
235
|
break;
|
|
@@ -200,9 +238,7 @@ function appendEvent(msg, event) {
|
|
|
200
238
|
const b = findBlock(msg, "tool_call", tc.id);
|
|
201
239
|
if (b) {
|
|
202
240
|
b.state = "asking";
|
|
203
|
-
|
|
204
|
-
b.suggested_rules = tc.suggested_rules;
|
|
205
|
-
}
|
|
241
|
+
b.suggested_rules = tc.suggested_rules || [];
|
|
206
242
|
}
|
|
207
243
|
}
|
|
208
244
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/message/message.ts","../../src/message/enums.ts"],"sourcesContent":["import { JSONSerializableObject } from '../type';\nimport {\n ContentBlock,\n TextBlock,\n ThinkingBlock,\n ToolResultBlock,\n ToolCallBlock,\n DataBlock,\n Base64Source,\n URLSource,\n} from './block';\nimport { AgentEvent, EventType } from '../event';\n\n/** A chat message exchanged between agents or between an agent and a model. */\nexport interface Msg {\n /** Unique identifier for the message. */\n id: string;\n /** Display name of the message sender. */\n name: string;\n /** Conversation role of the sender. */\n role: 'user' | 'assistant' | 'system';\n /** Message body. */\n content: ContentBlock[];\n /** Arbitrary key-value metadata attached to the message. */\n metadata: Record<string, JSONSerializableObject>;\n /** ISO-8601 creation timestamp. */\n created_at: string;\n /** ISO-8601 finished timestamp. */\n finished_at?: string | null;\n /** Usage information for the message, such as token counts. */\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\n/**\n * Create a new {@link Msg} object, filling in `id` and `created_at` when omitted.\n * A plain string `content` is automatically wrapped in a single {@link TextBlock}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.role\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.finished_at\n * @param root0.usage\n * @returns A Msg object.\n */\nexport function createMsg({\n name,\n content,\n role,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n finished_at,\n usage,\n}: Omit<Msg, 'id' | 'created_at' | 'metadata' | 'content'> &\n Partial<Pick<Msg, 'id' | 'created_at' | 'metadata'>> & {\n content: string | ContentBlock[];\n }): Msg {\n const contentBlocks: ContentBlock[] =\n typeof content === 'string'\n ? [{ id: crypto.randomUUID(), type: 'text', text: content } as TextBlock]\n : content;\n return { id, name, role, content: contentBlocks, metadata, created_at, finished_at, usage };\n}\n\n/**\n * Create a user {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @returns A Msg object with role 'user'.\n */\nexport function UserMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n}): Msg {\n return createMsg({ name, content, role: 'user', metadata, id, created_at });\n}\n\n/**\n * Create an assistant {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.usage\n * @returns A Msg object with role 'assistant'.\n */\nexport function AssistantMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n usage,\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n usage?: Msg['usage'];\n}): Msg {\n return createMsg({ name, content, role: 'assistant', metadata, id, created_at, usage });\n}\n\n/**\n * Create a system {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @returns A Msg object with role 'system'.\n */\nexport function SystemMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n}): Msg {\n return createMsg({ name, content, role: 'system', metadata, id, created_at });\n}\n\n/**\n * Extract the plain-text content from a message.\n *\n * When `content` is a string it is returned as-is. When it is an array of\n * content blocks, all {@link TextBlock} texts are joined with `separator`.\n *\n * @param msg - The message to read.\n * @param separator - String inserted between consecutive text blocks. Defaults to `'\\n'`.\n * @returns The concatenated text, or `null` when no text blocks are present.\n */\nexport function getTextContent(msg: Msg, separator: string = '\\n'): string | null {\n const textBlocks = msg.content.filter(block => block.type === 'text');\n if (textBlocks.length === 0) return null;\n return textBlocks.map(block => (block as TextBlock).text).join(separator);\n}\n\n/**\n * Return all content blocks from a message, regardless of type.\n *\n * When `content` is a plain string it is wrapped in a single {@link TextBlock}.\n *\n * @param msg - The message to read.\n * @returns An array of all {@link ContentBlock} objects.\n */\nexport function getContentBlocks(msg: Msg): ContentBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'text'): TextBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'thinking'): ThinkingBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'data'): DataBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'tool_call'): ToolCallBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'tool_result'): ToolResultBlock[];\nexport function getContentBlocks(\n msg: Msg,\n blockType?: 'text' | 'thinking' | 'data' | 'tool_call' | 'tool_result'\n): ContentBlock[] {\n if (!blockType) return msg.content;\n return msg.content.filter(block => block.type === blockType);\n}\n\n/**\n * Find a content block by type and id within a message.\n * @param msg\n * @param blockType\n * @param blockId\n * @returns The matching {@link ContentBlock}, or `undefined` if not found.\n */\nfunction findBlock(msg: Msg, blockType: string, blockId: string): ContentBlock | undefined {\n return msg.content.find(block => block.type === blockType && block.id === blockId);\n}\n\n/**\n * Apply a streaming {@link AgentEvent} to a {@link Msg}, mutating it in place.\n *\n * Only `content` and `finished_at` are ever modified. Events whose\n * `reply_id` does not match `msg.id` are skipped with a warning.\n * @param msg\n * @param event\n * @returns The mutated {@link Msg} object.\n */\nexport function appendEvent(msg: Msg, event: AgentEvent): Msg {\n if (!('reply_id' in event)) return msg;\n if (event.reply_id !== msg.id) {\n console.warn(\n `Event reply_id \"${event.reply_id}\" does not match message id \"${msg.id}\", skipping.`\n );\n return msg;\n }\n\n switch (event.type) {\n case EventType.REPLY_END:\n msg.finished_at = event.created_at;\n break;\n\n case EventType.TEXT_BLOCK_START:\n msg.content.push({ type: 'text', id: event.block_id, text: '' });\n break;\n\n case EventType.TEXT_BLOCK_DELTA: {\n const block = findBlock(msg, 'text', event.block_id);\n if (!block) {\n console.warn(`TextBlock \"${event.block_id}\" not found, skipping.`);\n } else {\n (block as TextBlock).text += event.delta;\n }\n break;\n }\n\n case EventType.TEXT_BLOCK_END:\n break;\n\n case EventType.THINKING_BLOCK_START:\n msg.content.push({ type: 'thinking', id: event.block_id, thinking: '' });\n break;\n\n case EventType.THINKING_BLOCK_DELTA: {\n const block = findBlock(msg, 'thinking', event.block_id);\n if (!block) {\n console.warn(`ThinkingBlock \"${event.block_id}\" not found, skipping.`);\n } else {\n (block as ThinkingBlock).thinking += event.delta;\n }\n break;\n }\n\n case EventType.THINKING_BLOCK_END:\n break;\n\n case EventType.DATA_BLOCK_START:\n msg.content.push({\n type: 'data',\n id: event.block_id,\n source: { type: 'base64', data: '', media_type: event.media_type },\n });\n break;\n\n case EventType.DATA_BLOCK_DELTA: {\n const block = findBlock(msg, 'data', event.block_id);\n if (!block) {\n console.warn(`DataBlock \"${event.block_id}\" not found, skipping.`);\n } else {\n ((block as DataBlock).source as Base64Source).data += event.data;\n }\n break;\n }\n\n case EventType.DATA_BLOCK_END:\n break;\n\n case EventType.TOOL_CALL_START:\n msg.content.push({\n type: 'tool_call',\n id: event.tool_call_id,\n name: event.tool_call_name,\n input: '',\n state: 'pending',\n });\n break;\n\n case EventType.TOOL_CALL_DELTA: {\n const block = findBlock(msg, 'tool_call', event.tool_call_id);\n if (!block) {\n console.warn(`ToolCallBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n (block as ToolCallBlock).input += event.delta;\n }\n break;\n }\n\n case EventType.TOOL_CALL_END:\n break;\n\n case EventType.TOOL_RESULT_START:\n msg.content.push({\n type: 'tool_result',\n id: event.tool_call_id,\n name: event.tool_call_name,\n output: [],\n state: 'running',\n });\n break;\n\n case EventType.TOOL_RESULT_TEXT_DELTA: {\n const block = findBlock(msg, 'tool_result', event.tool_call_id);\n if (!block) {\n console.warn(`ToolResultBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n const trb = block as ToolResultBlock;\n if (typeof trb.output === 'string') {\n trb.output = [{ type: 'text', id: crypto.randomUUID(), text: trb.output }];\n }\n const last = trb.output[trb.output.length - 1];\n if (!last || last.type !== 'text') {\n trb.output.push({\n type: 'text',\n id: event.block_id ?? crypto.randomUUID(),\n text: event.delta,\n });\n } else {\n (last as TextBlock).text += event.delta;\n }\n }\n break;\n }\n\n case EventType.TOOL_RESULT_DATA_DELTA: {\n const block = findBlock(msg, 'tool_result', event.tool_call_id);\n if (!block) {\n console.warn(`ToolResultBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n const trb = block as ToolResultBlock;\n if (typeof trb.output === 'string') {\n trb.output = [{ type: 'text', id: crypto.randomUUID(), text: trb.output }];\n }\n const source: Base64Source | URLSource =\n event.data != null\n ? { type: 'base64', data: event.data, media_type: event.media_type }\n : { type: 'url', url: event.url!, media_type: event.media_type };\n trb.output.push({ type: 'data', id: event.block_id, source });\n }\n break;\n }\n\n case EventType.TOOL_RESULT_END: {\n const block = findBlock(msg, 'tool_result', event.tool_call_id);\n if (!block) {\n console.warn(`ToolResultBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n (block as ToolResultBlock).state = event.state;\n }\n break;\n }\n\n case EventType.MODEL_CALL_END:\n // Accumulated the input and output tokens here.\n if (msg.usage) {\n msg.usage.inputTokens += event.input_tokens;\n msg.usage.outputTokens += event.output_tokens;\n } else {\n msg.usage = {\n inputTokens: event.input_tokens,\n outputTokens: event.output_tokens,\n };\n }\n break;\n\n case EventType.REQUIRE_USER_CONFIRM:\n for (const tc of event.tool_calls) {\n const b = findBlock(msg, 'tool_call', tc.id);\n if (b) {\n (b as ToolCallBlock).state = 'asking';\n if (tc.suggested_rules !== undefined) {\n (b as ToolCallBlock).suggested_rules = tc.suggested_rules;\n }\n }\n }\n break;\n\n case EventType.USER_CONFIRM_RESULT:\n for (const result of event.confirm_results) {\n const b = findBlock(msg, 'tool_call', result.tool_call.id);\n if (b) {\n (b as ToolCallBlock).state = result.confirmed ? 'allowed' : 'finished';\n }\n }\n break;\n\n case EventType.REQUIRE_EXTERNAL_EXECUTION:\n for (const tc of event.tool_calls) {\n const b = findBlock(msg, 'tool_call', tc.id);\n if (b) (b as ToolCallBlock).state = 'submitted';\n }\n break;\n\n case EventType.EXTERNAL_EXECUTION_RESULT:\n for (const result of event.execution_results) {\n msg.content.push(result);\n }\n break;\n }\n\n return msg;\n}\n","export enum GenerateReason {\n AWAITING_TOOL_RESULT = 'AWAITING_TOOL_RESULT',\n AWAITING_USER_CONFIRMATION = 'AWAITING_USER_CONFIRMATION',\n}\n"],"mappings":"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","names":["GenerateReason"]}
|
|
1
|
+
{"version":3,"sources":["../../src/message/message.ts","../../src/message/enums.ts"],"sourcesContent":["import { JSONSerializableObject } from '../type';\nimport {\n ContentBlock,\n TextBlock,\n ThinkingBlock,\n ToolResultBlock,\n ToolCallBlock,\n DataBlock,\n Base64Source,\n URLSource,\n} from './block';\nimport { AgentEvent, EventType } from '../event';\n\n/** A chat message exchanged between agents or between an agent and a model. */\nexport interface Msg {\n /** Unique identifier for the message. */\n id: string;\n /** Display name of the message sender. */\n name: string;\n /** Conversation role of the sender. */\n role: 'user' | 'assistant' | 'system';\n /** Message body. */\n content: ContentBlock[];\n /** Arbitrary key-value metadata attached to the message. */\n metadata: Record<string, JSONSerializableObject>;\n /** ISO-8601 creation timestamp. */\n created_at: string;\n /** ISO-8601 finished timestamp. */\n finished_at?: string | null;\n /** Usage information for the message, such as token counts. */\n usage?: {\n input_tokens: number;\n output_tokens: number;\n };\n}\n\n/**\n * Create a new {@link Msg} object, filling in `id` and `created_at` when omitted.\n * A plain string `content` is automatically wrapped in a single {@link TextBlock}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.role\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.finished_at\n * @param root0.usage\n * @returns A Msg object.\n */\n/**\n * Validate that content blocks are allowed for the given role.\n *\n * Mirrors the Python `_assert_user_content_blocks` / `_assert_system_content_blocks`\n * guards: user messages may only contain text or data blocks; system messages\n * may only contain text blocks; assistant messages accept any block type.\n * @param role\n * @param content\n */\nfunction assertContentBlocksForRole(role: Msg['role'], content: ContentBlock[]): void {\n if (role === 'user') {\n for (const block of content) {\n if (block.type !== 'text' && block.type !== 'data') {\n throw new Error('User message can only contain text blocks or data blocks.');\n }\n }\n } else if (role === 'system') {\n for (const block of content) {\n if (block.type !== 'text') {\n throw new Error('System message can only contain text blocks.');\n }\n }\n }\n}\n\n/**\n * createMsg is a low-level utility for constructing Msg objects with proper defaults and validation.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.role\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.finished_at\n * @param root0.usage\n * @returns A Msg object with the specified properties, and defaults for any omitted fields.\n */\nexport function createMsg({\n name,\n content,\n role,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n finished_at,\n usage,\n}: Omit<Msg, 'id' | 'created_at' | 'metadata' | 'content'> &\n Partial<Pick<Msg, 'id' | 'created_at' | 'metadata'>> & {\n content: string | ContentBlock[];\n }): Msg {\n const contentBlocks: ContentBlock[] =\n typeof content === 'string'\n ? [{ id: crypto.randomUUID(), type: 'text', text: content } as TextBlock]\n : content;\n assertContentBlocksForRole(role, contentBlocks);\n return { id, name, role, content: contentBlocks, metadata, created_at, finished_at, usage };\n}\n\n/**\n * Create a user {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.finished_at\n * @returns A Msg object with role 'user'.\n */\nexport function UserMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n finished_at,\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n finished_at?: string | null;\n}): Msg {\n return createMsg({\n name,\n content,\n role: 'user',\n metadata,\n id,\n created_at,\n finished_at: finished_at ?? created_at,\n });\n}\n\n/**\n * Create an assistant {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.usage\n * @returns A Msg object with role 'assistant'.\n */\nexport function AssistantMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n usage,\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n usage?: Msg['usage'];\n}): Msg {\n return createMsg({ name, content, role: 'assistant', metadata, id, created_at, usage });\n}\n\n/**\n * Create a system {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.finished_at\n * @returns A Msg object with role 'system'.\n */\nexport function SystemMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n finished_at,\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n finished_at?: string | null;\n}): Msg {\n return createMsg({\n name,\n content,\n role: 'system',\n metadata,\n id,\n created_at,\n finished_at: finished_at ?? created_at,\n });\n}\n\n/**\n * Extract the plain-text content from a message.\n *\n * When `content` is a string it is returned as-is. When it is an array of\n * content blocks, all {@link TextBlock} texts are joined with `separator`.\n *\n * @param msg - The message to read.\n * @param separator - String inserted between consecutive text blocks. Defaults to `'\\n'`.\n * @returns The concatenated text, or `null` when no text blocks are present.\n */\nexport function getTextContent(msg: Msg, separator: string = '\\n'): string | null {\n const textBlocks = msg.content.filter(block => block.type === 'text');\n if (textBlocks.length === 0) return null;\n return textBlocks.map(block => (block as TextBlock).text).join(separator);\n}\n\n/**\n * Return all content blocks from a message, regardless of type.\n *\n * When `content` is a plain string it is wrapped in a single {@link TextBlock}.\n *\n * @param msg - The message to read.\n * @returns An array of all {@link ContentBlock} objects.\n */\nexport function getContentBlocks(msg: Msg): ContentBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'text'): TextBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'thinking'): ThinkingBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'data'): DataBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'tool_call'): ToolCallBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'tool_result'): ToolResultBlock[];\nexport function getContentBlocks(\n msg: Msg,\n blockType?: 'text' | 'thinking' | 'data' | 'tool_call' | 'tool_result'\n): ContentBlock[] {\n if (!blockType) return msg.content;\n return msg.content.filter(block => block.type === blockType);\n}\n\n/**\n * Find a content block by type and id within a message.\n * @param msg\n * @param blockType\n * @param blockId\n * @returns The matching {@link ContentBlock}, or `undefined` if not found.\n */\nfunction findBlock(msg: Msg, blockType: string, blockId: string): ContentBlock | undefined {\n return msg.content.find(block => block.type === blockType && block.id === blockId);\n}\n\n/**\n * Apply a streaming {@link AgentEvent} to a {@link Msg}, mutating it in place.\n *\n * Only `content` and `finished_at` are ever modified. Events whose\n * `reply_id` does not match `msg.id` are skipped with a warning.\n * @param msg\n * @param event\n * @returns The mutated {@link Msg} object.\n */\nexport function appendEvent(msg: Msg, event: AgentEvent): Msg {\n if (!('reply_id' in event)) return msg;\n if (event.reply_id !== msg.id) {\n console.warn(\n `Event reply_id \"${event.reply_id}\" does not match message id \"${msg.id}\", skipping.`\n );\n return msg;\n }\n\n switch (event.type) {\n case EventType.REPLY_END:\n msg.finished_at = event.created_at;\n break;\n\n case EventType.TEXT_BLOCK_START:\n msg.content.push({ type: 'text', id: event.block_id, text: '' });\n break;\n\n case EventType.TEXT_BLOCK_DELTA: {\n const block = findBlock(msg, 'text', event.block_id);\n if (!block) {\n console.warn(`TextBlock \"${event.block_id}\" not found, skipping.`);\n } else {\n (block as TextBlock).text += event.delta;\n }\n break;\n }\n\n case EventType.TEXT_BLOCK_END:\n break;\n\n case EventType.THINKING_BLOCK_START:\n msg.content.push({ type: 'thinking', id: event.block_id, thinking: '' });\n break;\n\n case EventType.THINKING_BLOCK_DELTA: {\n const block = findBlock(msg, 'thinking', event.block_id);\n if (!block) {\n console.warn(`ThinkingBlock \"${event.block_id}\" not found, skipping.`);\n } else {\n (block as ThinkingBlock).thinking += event.delta;\n }\n break;\n }\n\n case EventType.THINKING_BLOCK_END:\n break;\n\n case EventType.DATA_BLOCK_START:\n msg.content.push({\n type: 'data',\n id: event.block_id,\n source: { type: 'base64', data: '', media_type: event.media_type },\n });\n break;\n\n case EventType.DATA_BLOCK_DELTA: {\n const block = findBlock(msg, 'data', event.block_id);\n if (!block) {\n console.warn(`DataBlock \"${event.block_id}\" not found, skipping.`);\n } else if (event.data) {\n ((block as DataBlock).source as Base64Source).data += event.data;\n }\n break;\n }\n\n case EventType.DATA_BLOCK_END:\n break;\n\n case EventType.TOOL_CALL_START:\n msg.content.push({\n type: 'tool_call',\n id: event.tool_call_id,\n name: event.tool_call_name,\n input: '',\n state: 'pending',\n });\n break;\n\n case EventType.TOOL_CALL_DELTA: {\n const block = findBlock(msg, 'tool_call', event.tool_call_id);\n if (!block) {\n console.warn(`ToolCallBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n (block as ToolCallBlock).input += event.delta;\n }\n break;\n }\n\n case EventType.TOOL_CALL_END:\n break;\n\n case EventType.TOOL_RESULT_START:\n msg.content.push({\n type: 'tool_result',\n id: event.tool_call_id,\n name: event.tool_call_name,\n output: [],\n state: 'running',\n });\n break;\n\n case EventType.TOOL_RESULT_TEXT_DELTA: {\n const block = findBlock(msg, 'tool_result', event.tool_call_id);\n if (!block) {\n console.warn(`ToolResultBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n const trb = block as ToolResultBlock;\n if (typeof trb.output === 'string') {\n trb.output = [{ type: 'text', id: crypto.randomUUID(), text: trb.output }];\n }\n const last = trb.output[trb.output.length - 1];\n if (!last || last.type !== 'text') {\n trb.output.push({\n type: 'text',\n id: crypto.randomUUID(),\n text: event.delta,\n });\n } else {\n (last as TextBlock).text += event.delta;\n }\n }\n break;\n }\n\n case EventType.TOOL_RESULT_DATA_DELTA: {\n const block = findBlock(msg, 'tool_result', event.tool_call_id);\n if (!block) {\n console.warn(`ToolResultBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n const trb = block as ToolResultBlock;\n if (typeof trb.output === 'string') {\n trb.output = [{ type: 'text', id: crypto.randomUUID(), text: trb.output }];\n }\n const source: Base64Source | URLSource =\n event.data != null\n ? { type: 'base64', data: event.data, media_type: event.media_type }\n : { type: 'url', url: event.url!, media_type: event.media_type };\n trb.output.push({\n type: 'data',\n id: event.block_id ?? crypto.randomUUID(),\n source,\n });\n }\n break;\n }\n\n case EventType.TOOL_RESULT_END: {\n const block = findBlock(msg, 'tool_result', event.tool_call_id);\n if (!block) {\n console.warn(`ToolResultBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n (block as ToolResultBlock).state = event.state;\n }\n break;\n }\n\n case EventType.MODEL_CALL_END:\n // Accumulated the input and output tokens here.\n if (msg.usage) {\n msg.usage.input_tokens += event.input_tokens;\n msg.usage.output_tokens += event.output_tokens;\n } else {\n msg.usage = {\n input_tokens: event.input_tokens,\n output_tokens: event.output_tokens,\n };\n }\n break;\n\n case EventType.REQUIRE_USER_CONFIRM:\n for (const tc of event.tool_calls) {\n const b = findBlock(msg, 'tool_call', tc.id);\n if (b) {\n (b as ToolCallBlock).state = 'asking';\n (b as ToolCallBlock).suggested_rules = tc.suggested_rules || [];\n }\n }\n break;\n\n case EventType.USER_CONFIRM_RESULT:\n for (const result of event.confirm_results) {\n const b = findBlock(msg, 'tool_call', result.tool_call.id);\n if (b) {\n (b as ToolCallBlock).state = result.confirmed ? 'allowed' : 'finished';\n }\n }\n break;\n\n case EventType.REQUIRE_EXTERNAL_EXECUTION:\n for (const tc of event.tool_calls) {\n const b = findBlock(msg, 'tool_call', tc.id);\n if (b) (b as ToolCallBlock).state = 'submitted';\n }\n break;\n\n case EventType.EXTERNAL_EXECUTION_RESULT:\n for (const result of event.execution_results) {\n msg.content.push(result);\n }\n break;\n }\n\n return msg;\n}\n","export enum GenerateReason {\n AWAITING_TOOL_RESULT = 'AWAITING_TOOL_RESULT',\n AWAITING_USER_CONFIRMATION = 'AWAITING_USER_CONFIRMATION',\n}\n"],"mappings":"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","names":["GenerateReason"]}
|
|
@@ -20,13 +20,12 @@ interface Msg {
|
|
|
20
20
|
finished_at?: string | null;
|
|
21
21
|
/** Usage information for the message, such as token counts. */
|
|
22
22
|
usage?: {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
input_tokens: number;
|
|
24
|
+
output_tokens: number;
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
29
|
-
* A plain string `content` is automatically wrapped in a single {@link TextBlock}.
|
|
28
|
+
* createMsg is a low-level utility for constructing Msg objects with proper defaults and validation.
|
|
30
29
|
* @param root0
|
|
31
30
|
* @param root0.name
|
|
32
31
|
* @param root0.content
|
|
@@ -36,7 +35,7 @@ interface Msg {
|
|
|
36
35
|
* @param root0.created_at
|
|
37
36
|
* @param root0.finished_at
|
|
38
37
|
* @param root0.usage
|
|
39
|
-
* @returns A Msg object.
|
|
38
|
+
* @returns A Msg object with the specified properties, and defaults for any omitted fields.
|
|
40
39
|
*/
|
|
41
40
|
declare function createMsg({ name, content, role, metadata, id, created_at, finished_at, usage, }: Omit<Msg, 'id' | 'created_at' | 'metadata' | 'content'> & Partial<Pick<Msg, 'id' | 'created_at' | 'metadata'>> & {
|
|
42
41
|
content: string | ContentBlock[];
|
|
@@ -49,14 +48,16 @@ declare function createMsg({ name, content, role, metadata, id, created_at, fini
|
|
|
49
48
|
* @param root0.metadata
|
|
50
49
|
* @param root0.id
|
|
51
50
|
* @param root0.created_at
|
|
51
|
+
* @param root0.finished_at
|
|
52
52
|
* @returns A Msg object with role 'user'.
|
|
53
53
|
*/
|
|
54
|
-
declare function UserMsg({ name, content, metadata, id, created_at, }: {
|
|
54
|
+
declare function UserMsg({ name, content, metadata, id, created_at, finished_at, }: {
|
|
55
55
|
name: string;
|
|
56
56
|
content: string | ContentBlock[];
|
|
57
57
|
metadata?: Record<string, JSONSerializableObject>;
|
|
58
58
|
id?: string;
|
|
59
59
|
created_at?: string;
|
|
60
|
+
finished_at?: string | null;
|
|
60
61
|
}): Msg;
|
|
61
62
|
/**
|
|
62
63
|
* Create an assistant {@link Msg}.
|
|
@@ -85,14 +86,16 @@ declare function AssistantMsg({ name, content, metadata, id, created_at, usage,
|
|
|
85
86
|
* @param root0.metadata
|
|
86
87
|
* @param root0.id
|
|
87
88
|
* @param root0.created_at
|
|
89
|
+
* @param root0.finished_at
|
|
88
90
|
* @returns A Msg object with role 'system'.
|
|
89
91
|
*/
|
|
90
|
-
declare function SystemMsg({ name, content, metadata, id, created_at, }: {
|
|
92
|
+
declare function SystemMsg({ name, content, metadata, id, created_at, finished_at, }: {
|
|
91
93
|
name: string;
|
|
92
94
|
content: string | ContentBlock[];
|
|
93
95
|
metadata?: Record<string, JSONSerializableObject>;
|
|
94
96
|
id?: string;
|
|
95
97
|
created_at?: string;
|
|
98
|
+
finished_at?: string | null;
|
|
96
99
|
}): Msg;
|
|
97
100
|
/**
|
|
98
101
|
* Extract the plain-text content from a message.
|
|
@@ -20,13 +20,12 @@ interface Msg {
|
|
|
20
20
|
finished_at?: string | null;
|
|
21
21
|
/** Usage information for the message, such as token counts. */
|
|
22
22
|
usage?: {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
input_tokens: number;
|
|
24
|
+
output_tokens: number;
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
29
|
-
* A plain string `content` is automatically wrapped in a single {@link TextBlock}.
|
|
28
|
+
* createMsg is a low-level utility for constructing Msg objects with proper defaults and validation.
|
|
30
29
|
* @param root0
|
|
31
30
|
* @param root0.name
|
|
32
31
|
* @param root0.content
|
|
@@ -36,7 +35,7 @@ interface Msg {
|
|
|
36
35
|
* @param root0.created_at
|
|
37
36
|
* @param root0.finished_at
|
|
38
37
|
* @param root0.usage
|
|
39
|
-
* @returns A Msg object.
|
|
38
|
+
* @returns A Msg object with the specified properties, and defaults for any omitted fields.
|
|
40
39
|
*/
|
|
41
40
|
declare function createMsg({ name, content, role, metadata, id, created_at, finished_at, usage, }: Omit<Msg, 'id' | 'created_at' | 'metadata' | 'content'> & Partial<Pick<Msg, 'id' | 'created_at' | 'metadata'>> & {
|
|
42
41
|
content: string | ContentBlock[];
|
|
@@ -49,14 +48,16 @@ declare function createMsg({ name, content, role, metadata, id, created_at, fini
|
|
|
49
48
|
* @param root0.metadata
|
|
50
49
|
* @param root0.id
|
|
51
50
|
* @param root0.created_at
|
|
51
|
+
* @param root0.finished_at
|
|
52
52
|
* @returns A Msg object with role 'user'.
|
|
53
53
|
*/
|
|
54
|
-
declare function UserMsg({ name, content, metadata, id, created_at, }: {
|
|
54
|
+
declare function UserMsg({ name, content, metadata, id, created_at, finished_at, }: {
|
|
55
55
|
name: string;
|
|
56
56
|
content: string | ContentBlock[];
|
|
57
57
|
metadata?: Record<string, JSONSerializableObject>;
|
|
58
58
|
id?: string;
|
|
59
59
|
created_at?: string;
|
|
60
|
+
finished_at?: string | null;
|
|
60
61
|
}): Msg;
|
|
61
62
|
/**
|
|
62
63
|
* Create an assistant {@link Msg}.
|
|
@@ -85,14 +86,16 @@ declare function AssistantMsg({ name, content, metadata, id, created_at, usage,
|
|
|
85
86
|
* @param root0.metadata
|
|
86
87
|
* @param root0.id
|
|
87
88
|
* @param root0.created_at
|
|
89
|
+
* @param root0.finished_at
|
|
88
90
|
* @returns A Msg object with role 'system'.
|
|
89
91
|
*/
|
|
90
|
-
declare function SystemMsg({ name, content, metadata, id, created_at, }: {
|
|
92
|
+
declare function SystemMsg({ name, content, metadata, id, created_at, finished_at, }: {
|
|
91
93
|
name: string;
|
|
92
94
|
content: string | ContentBlock[];
|
|
93
95
|
metadata?: Record<string, JSONSerializableObject>;
|
|
94
96
|
id?: string;
|
|
95
97
|
created_at?: string;
|
|
98
|
+
finished_at?: string | null;
|
|
96
99
|
}): Msg;
|
|
97
100
|
/**
|
|
98
101
|
* Extract the plain-text content from a message.
|
package/dist/model/index.d.mts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { C as ChatModelBase, c as ChatModelOptions, d as ChatModelRequestOptions, b as ChatResponse } from '../base-
|
|
2
|
-
export { a as ChatUsage } from '../base-
|
|
1
|
+
import { C as ChatModelBase, c as ChatModelOptions, d as ChatModelRequestOptions, b as ChatResponse } from '../base-L72wZVx8.mjs';
|
|
2
|
+
export { a as ChatUsage } from '../base-L72wZVx8.mjs';
|
|
3
3
|
import { a as ToolChoice, T as ToolSchema } from '../index-CAxQAkiP.mjs';
|
|
4
4
|
import { b as ToolCallBlock, T as TextBlock, a as ThinkingBlock } from '../block-BqWf-Qcb.mjs';
|
|
5
5
|
import { Ollama, AbortableAsyncIterator, ChatResponse as ChatResponse$1 } from 'ollama';
|
|
6
6
|
import { OpenAI } from 'openai';
|
|
7
7
|
import { ChatCompletionMessageParam, ChatCompletionToolChoiceOption } from 'openai/resources/chat/completions';
|
|
8
8
|
import 'zod';
|
|
9
|
-
import '../base-
|
|
10
|
-
import '../message-
|
|
9
|
+
import '../base-Bc3GkNS7.mjs';
|
|
10
|
+
import '../message-COpNEf0G.mjs';
|
|
11
11
|
import '../event/index.mjs';
|
|
12
12
|
|
|
13
13
|
interface DashScopeThinkingConfig {
|
package/dist/model/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { C as ChatModelBase, c as ChatModelOptions, d as ChatModelRequestOptions, b as ChatResponse } from '../base-
|
|
2
|
-
export { a as ChatUsage } from '../base-
|
|
1
|
+
import { C as ChatModelBase, c as ChatModelOptions, d as ChatModelRequestOptions, b as ChatResponse } from '../base-13VLaOvY.js';
|
|
2
|
+
export { a as ChatUsage } from '../base-13VLaOvY.js';
|
|
3
3
|
import { a as ToolChoice, T as ToolSchema } from '../index-CAxQAkiP.js';
|
|
4
4
|
import { b as ToolCallBlock, T as TextBlock, a as ThinkingBlock } from '../block-BqWf-Qcb.js';
|
|
5
5
|
import { Ollama, AbortableAsyncIterator, ChatResponse as ChatResponse$1 } from 'ollama';
|
|
6
6
|
import { OpenAI } from 'openai';
|
|
7
7
|
import { ChatCompletionMessageParam, ChatCompletionToolChoiceOption } from 'openai/resources/chat/completions';
|
|
8
8
|
import 'zod';
|
|
9
|
-
import '../base-
|
|
10
|
-
import '../message-
|
|
9
|
+
import '../base-Dfizi3RB.js';
|
|
10
|
+
import '../message-DbCMy5tM.js';
|
|
11
11
|
import '../event/index.js';
|
|
12
12
|
|
|
13
13
|
interface DashScopeThinkingConfig {
|
package/dist/model/index.js
CHANGED
|
@@ -29,6 +29,21 @@ __export(model_exports, {
|
|
|
29
29
|
module.exports = __toCommonJS(model_exports);
|
|
30
30
|
|
|
31
31
|
// src/message/message.ts
|
|
32
|
+
function assertContentBlocksForRole(role, content) {
|
|
33
|
+
if (role === "user") {
|
|
34
|
+
for (const block of content) {
|
|
35
|
+
if (block.type !== "text" && block.type !== "data") {
|
|
36
|
+
throw new Error("User message can only contain text blocks or data blocks.");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
} else if (role === "system") {
|
|
40
|
+
for (const block of content) {
|
|
41
|
+
if (block.type !== "text") {
|
|
42
|
+
throw new Error("System message can only contain text blocks.");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
32
47
|
function createMsg({
|
|
33
48
|
name,
|
|
34
49
|
content,
|
|
@@ -40,6 +55,7 @@ function createMsg({
|
|
|
40
55
|
usage
|
|
41
56
|
}) {
|
|
42
57
|
const contentBlocks = typeof content === "string" ? [{ id: crypto.randomUUID(), type: "text", text: content }] : content;
|
|
58
|
+
assertContentBlocksForRole(role, contentBlocks);
|
|
43
59
|
return { id, name, role, content: contentBlocks, metadata, created_at, finished_at, usage };
|
|
44
60
|
}
|
|
45
61
|
function getTextContent(msg, separator = "\n") {
|