beeai-framework 0.1.22 → 0.1.24
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/a2a/agents/agent.d.cts +2 -2
- package/dist/adapters/a2a/agents/agent.d.ts +2 -2
- package/dist/adapters/a2a/agents/events.d.cts +1 -1
- package/dist/adapters/a2a/agents/events.d.ts +1 -1
- package/dist/adapters/a2a/agents/types.d.cts +2 -2
- package/dist/adapters/a2a/agents/types.d.ts +2 -2
- package/dist/adapters/a2a/serve/agent_executor.d.cts +3 -3
- package/dist/adapters/a2a/serve/agent_executor.d.ts +3 -3
- package/dist/adapters/a2a/serve/server.d.cts +2 -2
- package/dist/adapters/a2a/serve/server.d.ts +2 -2
- package/dist/adapters/acp/agents/agent.d.cts +2 -2
- package/dist/adapters/acp/agents/agent.d.ts +2 -2
- package/dist/adapters/acp/agents/events.d.cts +1 -1
- package/dist/adapters/acp/agents/events.d.ts +1 -1
- package/dist/adapters/agentstack/agents/agent.d.cts +2 -2
- package/dist/adapters/agentstack/agents/agent.d.ts +2 -2
- package/dist/adapters/agentstack/agents/events.d.cts +1 -1
- package/dist/adapters/agentstack/agents/events.d.ts +1 -1
- package/dist/adapters/amazon-bedrock/backend/chat.d.cts +4 -4
- package/dist/adapters/amazon-bedrock/backend/chat.d.ts +4 -4
- package/dist/adapters/amazon-bedrock/backend/embedding.d.cts +2 -2
- package/dist/adapters/amazon-bedrock/backend/embedding.d.ts +2 -2
- package/dist/adapters/anthropic/backend/chat.d.cts +5 -5
- package/dist/adapters/anthropic/backend/chat.d.ts +5 -5
- package/dist/adapters/anthropic/backend/embedding.d.cts +2 -2
- package/dist/adapters/anthropic/backend/embedding.d.ts +2 -2
- package/dist/adapters/azure-openai/backend/chat.d.cts +4 -4
- package/dist/adapters/azure-openai/backend/chat.d.ts +4 -4
- package/dist/adapters/azure-openai/backend/embedding.d.cts +2 -2
- package/dist/adapters/azure-openai/backend/embedding.d.ts +2 -2
- package/dist/adapters/dummy/backend/chat.d.cts +5 -4
- package/dist/adapters/dummy/backend/chat.d.ts +5 -4
- package/dist/adapters/dummy/backend/embedding.d.cts +2 -2
- package/dist/adapters/dummy/backend/embedding.d.ts +2 -2
- package/dist/adapters/google-vertex/backend/chat.d.cts +4 -4
- package/dist/adapters/google-vertex/backend/chat.d.ts +4 -4
- package/dist/adapters/google-vertex/backend/embedding.d.cts +2 -2
- package/dist/adapters/google-vertex/backend/embedding.d.ts +2 -2
- package/dist/adapters/groq/backend/chat.d.cts +4 -4
- package/dist/adapters/groq/backend/chat.d.ts +4 -4
- package/dist/adapters/groq/backend/embedding.d.cts +2 -2
- package/dist/adapters/groq/backend/embedding.d.ts +2 -2
- package/dist/adapters/langchain/backend/chat.d.cts +5 -4
- package/dist/adapters/langchain/backend/chat.d.ts +5 -4
- package/dist/adapters/langchain/backend/embedding.d.cts +2 -2
- package/dist/adapters/langchain/backend/embedding.d.ts +2 -2
- package/dist/adapters/langchain/tools.d.cts +1 -1
- package/dist/adapters/langchain/tools.d.ts +1 -1
- package/dist/adapters/ollama/backend/chat.cjs +1 -2
- package/dist/adapters/ollama/backend/chat.cjs.map +1 -1
- package/dist/adapters/ollama/backend/chat.d.cts +4 -5
- package/dist/adapters/ollama/backend/chat.d.ts +4 -5
- package/dist/adapters/ollama/backend/chat.js +1 -2
- package/dist/adapters/ollama/backend/chat.js.map +1 -1
- package/dist/adapters/ollama/backend/embedding.d.cts +2 -2
- package/dist/adapters/ollama/backend/embedding.d.ts +2 -2
- package/dist/adapters/openai/backend/chat.d.cts +4 -4
- package/dist/adapters/openai/backend/chat.d.ts +4 -4
- package/dist/adapters/openai/backend/embedding.d.cts +2 -2
- package/dist/adapters/openai/backend/embedding.d.ts +2 -2
- package/dist/adapters/vercel/backend/chat.cjs +77 -17
- package/dist/adapters/vercel/backend/chat.cjs.map +1 -1
- package/dist/adapters/vercel/backend/chat.d.cts +5 -4
- package/dist/adapters/vercel/backend/chat.d.ts +5 -4
- package/dist/adapters/vercel/backend/chat.js +77 -17
- package/dist/adapters/vercel/backend/chat.js.map +1 -1
- package/dist/adapters/vercel/backend/embedding.d.cts +2 -2
- package/dist/adapters/vercel/backend/embedding.d.ts +2 -2
- package/dist/adapters/vercel/backend/utils.cjs +17 -0
- package/dist/adapters/vercel/backend/utils.cjs.map +1 -1
- package/dist/adapters/vercel/backend/utils.d.cts +5 -4
- package/dist/adapters/vercel/backend/utils.d.ts +5 -4
- package/dist/adapters/vercel/backend/utils.js +17 -1
- package/dist/adapters/vercel/backend/utils.js.map +1 -1
- package/dist/adapters/watsonx/backend/chat.cjs +40 -13
- package/dist/adapters/watsonx/backend/chat.cjs.map +1 -1
- package/dist/adapters/watsonx/backend/chat.d.cts +7 -6
- package/dist/adapters/watsonx/backend/chat.d.ts +7 -6
- package/dist/adapters/watsonx/backend/chat.js +40 -13
- package/dist/adapters/watsonx/backend/chat.js.map +1 -1
- package/dist/adapters/watsonx/backend/embedding.d.cts +2 -2
- package/dist/adapters/watsonx/backend/embedding.d.ts +2 -2
- package/dist/adapters/xai/backend/chat.d.cts +4 -4
- package/dist/adapters/xai/backend/chat.d.ts +4 -4
- package/dist/{agent-BMfyig7X.d.cts → agent-Cy4QtsN8.d.cts} +4 -4
- package/dist/{agent-Dxw8AGWb.d.ts → agent-DHLEPXEA.d.ts} +4 -4
- package/dist/agents/base.d.cts +2 -2
- package/dist/agents/base.d.ts +2 -2
- package/dist/agents/experimental/replan/agent.d.cts +3 -3
- package/dist/agents/experimental/replan/agent.d.ts +3 -3
- package/dist/agents/experimental/replan/prompts.d.cts +1 -1
- package/dist/agents/experimental/replan/prompts.d.ts +1 -1
- package/dist/agents/experimental/streamlit/agent.d.cts +3 -3
- package/dist/agents/experimental/streamlit/agent.d.ts +3 -3
- package/dist/agents/react/agent.d.cts +4 -4
- package/dist/agents/react/agent.d.ts +4 -4
- package/dist/agents/react/prompts.d.cts +1 -1
- package/dist/agents/react/prompts.d.ts +1 -1
- package/dist/agents/react/runners/base.d.cts +4 -4
- package/dist/agents/react/runners/base.d.ts +4 -4
- package/dist/agents/react/runners/deep-think/prompts.d.cts +1 -1
- package/dist/agents/react/runners/deep-think/prompts.d.ts +1 -1
- package/dist/agents/react/runners/deep-think/runner.d.cts +5 -5
- package/dist/agents/react/runners/deep-think/runner.d.ts +5 -5
- package/dist/agents/react/runners/default/runner.d.cts +6 -6
- package/dist/agents/react/runners/default/runner.d.ts +6 -6
- package/dist/agents/react/runners/granite/prompts.d.cts +1 -1
- package/dist/agents/react/runners/granite/prompts.d.ts +1 -1
- package/dist/agents/react/runners/granite/runner.d.cts +5 -5
- package/dist/agents/react/runners/granite/runner.d.ts +5 -5
- package/dist/agents/react/types.d.cts +2 -2
- package/dist/agents/react/types.d.ts +2 -2
- package/dist/agents/requirement/agent.cjs +1 -1
- package/dist/agents/requirement/agent.cjs.map +1 -1
- package/dist/agents/requirement/agent.d.cts +4 -4
- package/dist/agents/requirement/agent.d.ts +4 -4
- package/dist/agents/requirement/agent.js +1 -1
- package/dist/agents/requirement/agent.js.map +1 -1
- package/dist/agents/requirement/prompts.d.cts +2 -2
- package/dist/agents/requirement/prompts.d.ts +2 -2
- package/dist/agents/requirement/requirements/conditional.d.cts +4 -4
- package/dist/agents/requirement/requirements/conditional.d.ts +4 -4
- package/dist/agents/requirement/requirements/requirement.d.cts +4 -4
- package/dist/agents/requirement/requirements/requirement.d.ts +4 -4
- package/dist/agents/requirement/requirements/utils.d.cts +1 -1
- package/dist/agents/requirement/requirements/utils.d.ts +1 -1
- package/dist/agents/requirement/runner.cjs +31 -15
- package/dist/agents/requirement/runner.cjs.map +1 -1
- package/dist/agents/requirement/runner.d.cts +13 -15
- package/dist/agents/requirement/runner.d.ts +13 -15
- package/dist/agents/requirement/runner.js +31 -15
- package/dist/agents/requirement/runner.js.map +1 -1
- package/dist/agents/requirement/types.d.cts +4 -4
- package/dist/agents/requirement/types.d.ts +4 -4
- package/dist/agents/requirement/utils/llm.d.cts +4 -4
- package/dist/agents/requirement/utils/llm.d.ts +4 -4
- package/dist/agents/requirement/utils/tool.cjs +2 -1
- package/dist/agents/requirement/utils/tool.cjs.map +1 -1
- package/dist/agents/requirement/utils/tool.d.cts +4 -4
- package/dist/agents/requirement/utils/tool.d.ts +4 -4
- package/dist/agents/requirement/utils/tool.js +2 -1
- package/dist/agents/requirement/utils/tool.js.map +1 -1
- package/dist/agents/toolCalling/agent.cjs +4 -1
- package/dist/agents/toolCalling/agent.cjs.map +1 -1
- package/dist/agents/toolCalling/agent.d.cts +6 -3
- package/dist/agents/toolCalling/agent.d.ts +6 -3
- package/dist/agents/toolCalling/agent.js +5 -2
- package/dist/agents/toolCalling/agent.js.map +1 -1
- package/dist/agents/toolCalling/types.d.cts +1 -1
- package/dist/agents/toolCalling/types.d.ts +1 -1
- package/dist/agents/types.d.cts +2 -2
- package/dist/agents/types.d.ts +2 -2
- package/dist/backend/backend.d.cts +2 -2
- package/dist/backend/backend.d.ts +2 -2
- package/dist/backend/chat.cjs +125 -5
- package/dist/backend/chat.cjs.map +1 -1
- package/dist/backend/chat.d.cts +3 -3
- package/dist/backend/chat.d.ts +3 -3
- package/dist/backend/chat.js +127 -7
- package/dist/backend/chat.js.map +1 -1
- package/dist/backend/core.d.cts +3 -3
- package/dist/backend/core.d.ts +3 -3
- package/dist/backend/embedding.d.cts +2 -2
- package/dist/backend/embedding.d.ts +2 -2
- package/dist/backend/message.cjs +20 -13
- package/dist/backend/message.cjs.map +1 -1
- package/dist/backend/message.d.cts +7 -3
- package/dist/backend/message.d.ts +7 -3
- package/dist/backend/message.js +20 -13
- package/dist/backend/message.js.map +1 -1
- package/dist/backend/utils.d.cts +2 -2
- package/dist/backend/utils.d.ts +2 -2
- package/dist/{base-BurRTBA7.d.ts → base-CyFx7BRL.d.ts} +2 -2
- package/dist/{base-v-PYIq5G.d.cts → base-XfWeXQ-S.d.cts} +2 -2
- package/dist/{chat-DB_cf15S.d.cts → chat-CC0s8z23.d.cts} +10 -9
- package/dist/{chat-BbCYMAdE.d.ts → chat-D8SVtw5Q.d.ts} +10 -9
- package/dist/context.d.cts +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/emitter/emitter.cjs +2 -1
- package/dist/emitter/emitter.cjs.map +1 -1
- package/dist/emitter/emitter.d.cts +1 -1
- package/dist/emitter/emitter.d.ts +1 -1
- package/dist/emitter/emitter.js +2 -1
- package/dist/emitter/emitter.js.map +1 -1
- package/dist/emitter/types.d.cts +1 -1
- package/dist/emitter/types.d.ts +1 -1
- package/dist/{emitter-CN7I4uSV.d.ts → emitter-36-9MnvA.d.ts} +2 -2
- package/dist/{emitter-CGKd_-kK.d.cts → emitter-jN55XZZq.d.cts} +2 -2
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/internals/fetcher.d.cts +1 -1
- package/dist/internals/fetcher.d.ts +1 -1
- package/dist/internals/helpers/object.cjs +18 -0
- package/dist/internals/helpers/object.cjs.map +1 -1
- package/dist/internals/helpers/object.d.cts +2 -1
- package/dist/internals/helpers/object.d.ts +2 -1
- package/dist/internals/helpers/object.js +18 -1
- package/dist/internals/helpers/object.js.map +1 -1
- package/dist/memory/summarizeMemory.d.cts +2 -2
- package/dist/memory/summarizeMemory.d.ts +2 -2
- package/dist/middleware/streamToolCall.cjs +138 -0
- package/dist/middleware/streamToolCall.cjs.map +1 -0
- package/dist/middleware/streamToolCall.d.cts +96 -0
- package/dist/middleware/streamToolCall.d.ts +96 -0
- package/dist/middleware/streamToolCall.js +136 -0
- package/dist/middleware/streamToolCall.js.map +1 -0
- package/dist/middleware/trajectory.cjs +14 -5
- package/dist/middleware/trajectory.cjs.map +1 -1
- package/dist/middleware/trajectory.d.cts +1 -1
- package/dist/middleware/trajectory.d.ts +1 -1
- package/dist/middleware/trajectory.js +13 -4
- package/dist/middleware/trajectory.js.map +1 -1
- package/dist/parsers/linePrefix.d.cts +1 -1
- package/dist/parsers/linePrefix.d.ts +1 -1
- package/dist/tools/arxiv.d.cts +1 -1
- package/dist/tools/arxiv.d.ts +1 -1
- package/dist/tools/base.d.cts +1 -1
- package/dist/tools/base.d.ts +1 -1
- package/dist/tools/calculator.d.cts +1 -1
- package/dist/tools/calculator.d.ts +1 -1
- package/dist/tools/custom.d.cts +2 -2
- package/dist/tools/custom.d.ts +2 -2
- package/dist/tools/database/elasticsearch.d.cts +1 -1
- package/dist/tools/database/elasticsearch.d.ts +1 -1
- package/dist/tools/database/milvus.d.cts +1 -1
- package/dist/tools/database/milvus.d.ts +1 -1
- package/dist/tools/database/qdrant.d.cts +1 -1
- package/dist/tools/database/qdrant.d.ts +1 -1
- package/dist/tools/database/sql.d.cts +1 -1
- package/dist/tools/database/sql.d.ts +1 -1
- package/dist/tools/handoff.cjs +68 -0
- package/dist/tools/handoff.cjs.map +1 -0
- package/dist/tools/handoff.d.cts +47 -0
- package/dist/tools/handoff.d.ts +47 -0
- package/dist/tools/handoff.js +66 -0
- package/dist/tools/handoff.js.map +1 -0
- package/dist/tools/llm.d.cts +2 -2
- package/dist/tools/llm.d.ts +2 -2
- package/dist/tools/mcp.d.cts +1 -1
- package/dist/tools/mcp.d.ts +1 -1
- package/dist/tools/openapi.d.cts +1 -1
- package/dist/tools/openapi.d.ts +1 -1
- package/dist/tools/python/output.d.cts +1 -1
- package/dist/tools/python/output.d.ts +1 -1
- package/dist/tools/python/python.d.cts +2 -2
- package/dist/tools/python/python.d.ts +2 -2
- package/dist/tools/search/base.d.cts +1 -1
- package/dist/tools/search/base.d.ts +1 -1
- package/dist/tools/search/duckDuckGoSearch.d.cts +1 -1
- package/dist/tools/search/duckDuckGoSearch.d.ts +1 -1
- package/dist/tools/search/googleSearch.d.cts +1 -1
- package/dist/tools/search/googleSearch.d.ts +1 -1
- package/dist/tools/search/searXNGSearch.d.cts +1 -1
- package/dist/tools/search/searXNGSearch.d.ts +1 -1
- package/dist/tools/search/wikipedia.d.cts +1 -1
- package/dist/tools/search/wikipedia.d.ts +1 -1
- package/dist/tools/similarity.d.cts +1 -1
- package/dist/tools/similarity.d.ts +1 -1
- package/dist/tools/think.d.cts +1 -1
- package/dist/tools/think.d.ts +1 -1
- package/dist/tools/weather/openMeteo.d.cts +1 -1
- package/dist/tools/weather/openMeteo.d.ts +1 -1
- package/dist/tools/web/webCrawler.d.cts +1 -1
- package/dist/tools/web/webCrawler.d.ts +1 -1
- package/dist/{types-Cx6f43du.d.cts → types-D9pn62yF.d.cts} +3 -3
- package/dist/{types-BXkkbABd.d.ts → types-Dyd4e1G6.d.ts} +3 -3
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/dist/workflows/agent.d.cts +40 -40
- package/dist/workflows/agent.d.ts +40 -40
- package/dist/workflows/workflow.d.cts +1 -1
- package/dist/workflows/workflow.d.ts +1 -1
- package/package.json +8 -8
package/dist/backend/chat.cjs
CHANGED
|
@@ -29,6 +29,7 @@ class ChatModel extends serializable_cjs.Serializable {
|
|
|
29
29
|
}
|
|
30
30
|
cache = new nullCache_cjs.NullCache();
|
|
31
31
|
parameters = {};
|
|
32
|
+
middlewares = [];
|
|
32
33
|
logger = logger_cjs.Logger.root.child({
|
|
33
34
|
name: this.constructor.name
|
|
34
35
|
});
|
|
@@ -42,6 +43,9 @@ class ChatModel extends serializable_cjs.Serializable {
|
|
|
42
43
|
modelSupportsToolCalling = true;
|
|
43
44
|
create(input) {
|
|
44
45
|
input = utils_cjs.shallowCopy(input);
|
|
46
|
+
if (input.stream === void 0) {
|
|
47
|
+
input.stream = this.parameters.stream;
|
|
48
|
+
}
|
|
45
49
|
return context_cjs.RunContext.enter(this, {
|
|
46
50
|
params: [
|
|
47
51
|
input
|
|
@@ -82,10 +86,20 @@ class ChatModel extends serializable_cjs.Serializable {
|
|
|
82
86
|
}
|
|
83
87
|
cacheEntry.resolve(chunks);
|
|
84
88
|
const result = ChatModelOutput.fromChunks(chunks);
|
|
89
|
+
for (const toolCall of result.getToolCalls()) {
|
|
90
|
+
if (remeda.isString(toolCall.input)) {
|
|
91
|
+
toolCall.input = JSON.parse(toolCall.input);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
85
94
|
if (forceToolCallViaResponseFormat && remeda.isEmpty(result.getToolCalls())) {
|
|
86
95
|
const lastMsg = result.messages.at(-1);
|
|
87
|
-
const toolCall = schema_cjs.parseBrokenJson(lastMsg.text
|
|
88
|
-
|
|
96
|
+
const toolCall = schema_cjs.parseBrokenJson(lastMsg.text, {
|
|
97
|
+
pair: [
|
|
98
|
+
"{",
|
|
99
|
+
"}"
|
|
100
|
+
]
|
|
101
|
+
});
|
|
102
|
+
if (!toolCall || !toolCall.name || !toolCall.parameters) {
|
|
89
103
|
throw new errors_cjs.ChatModelError(`Failed to produce a valid tool call. Generate output: ${lastMsg.text}`, [], {
|
|
90
104
|
isFatal: true,
|
|
91
105
|
isRetryable: false
|
|
@@ -120,7 +134,7 @@ class ChatModel extends serializable_cjs.Serializable {
|
|
|
120
134
|
} finally {
|
|
121
135
|
await run.emitter.emit("finish", null);
|
|
122
136
|
}
|
|
123
|
-
});
|
|
137
|
+
}).middleware(...this.middlewares);
|
|
124
138
|
}
|
|
125
139
|
createStructure(input) {
|
|
126
140
|
return context_cjs.RunContext.enter(this, {
|
|
@@ -143,7 +157,11 @@ class ChatModel extends serializable_cjs.Serializable {
|
|
|
143
157
|
static async fromName(name, options) {
|
|
144
158
|
const { providerId, modelId } = utils_cjs$1.parseModel(name);
|
|
145
159
|
const Target = await utils_cjs$1.loadModel(providerId, "chat");
|
|
146
|
-
|
|
160
|
+
const instance = new Target(modelId || void 0);
|
|
161
|
+
if (options) {
|
|
162
|
+
Object.assign(instance.parameters, options);
|
|
163
|
+
}
|
|
164
|
+
return instance;
|
|
147
165
|
}
|
|
148
166
|
async _createStructure(input, run) {
|
|
149
167
|
const { schema, ...options } = input;
|
|
@@ -220,6 +238,7 @@ Validation Errors: {{errors}}`
|
|
|
220
238
|
return {
|
|
221
239
|
cache: this.cache,
|
|
222
240
|
emitter: this.emitter,
|
|
241
|
+
middlewares: utils_cjs.shallowCopy(this.middlewares),
|
|
223
242
|
parameters: utils_cjs.shallowCopy(this.parameters),
|
|
224
243
|
logger: this.logger,
|
|
225
244
|
toolChoiceSupport: this.toolChoiceSupport.slice(),
|
|
@@ -277,6 +296,7 @@ class ChatModelOutput extends serializable_cjs.Serializable {
|
|
|
277
296
|
finishReason;
|
|
278
297
|
constructor(messages, usage, finishReason) {
|
|
279
298
|
super(), this.messages = messages, this.usage = usage, this.finishReason = finishReason;
|
|
299
|
+
this.dedupe();
|
|
280
300
|
}
|
|
281
301
|
static fromChunks(chunks) {
|
|
282
302
|
const final = new ChatModelOutput([]);
|
|
@@ -284,7 +304,11 @@ class ChatModelOutput extends serializable_cjs.Serializable {
|
|
|
284
304
|
return final;
|
|
285
305
|
}
|
|
286
306
|
merge(other) {
|
|
287
|
-
|
|
307
|
+
if (other.messages.length > 0) {
|
|
308
|
+
const clones = other.messages.map(cloneSync);
|
|
309
|
+
this.messages.push(...clones);
|
|
310
|
+
this.dedupe();
|
|
311
|
+
}
|
|
288
312
|
this.finishReason = other.finishReason;
|
|
289
313
|
if (this.usage && other.usage) {
|
|
290
314
|
this.usage = object_cjs.customMerge([
|
|
@@ -299,6 +323,89 @@ class ChatModelOutput extends serializable_cjs.Serializable {
|
|
|
299
323
|
this.usage = utils_cjs.shallowCopy(other.usage);
|
|
300
324
|
}
|
|
301
325
|
}
|
|
326
|
+
dedupe() {
|
|
327
|
+
if (this.messages.length > 1) {
|
|
328
|
+
const messagesById = /* @__PURE__ */ new Map();
|
|
329
|
+
const messagesByToolCallId = /* @__PURE__ */ new Map();
|
|
330
|
+
for (const msg of this.messages) {
|
|
331
|
+
const msgId = msg.id || "";
|
|
332
|
+
if (msg instanceof message_cjs.AssistantMessage && msg.getToolCalls().length > 0) {
|
|
333
|
+
const filteredChunks = [];
|
|
334
|
+
for (const chunk of msg.content) {
|
|
335
|
+
if (chunk.type !== "tool-call") {
|
|
336
|
+
filteredChunks.push(chunk);
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
if (!chunk.toolCallId && messagesByToolCallId.size > 0) {
|
|
340
|
+
const lastToolCallId = object_cjs.getLast(messagesByToolCallId.keys(), "");
|
|
341
|
+
if (lastToolCallId) {
|
|
342
|
+
chunk.toolCallId = lastToolCallId;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (chunk.toolCallId && messagesByToolCallId.has(chunk.toolCallId)) {
|
|
346
|
+
messagesByToolCallId.get(chunk.toolCallId).content.push(chunk);
|
|
347
|
+
} else if (chunk.toolCallId) {
|
|
348
|
+
messagesByToolCallId.set(chunk.toolCallId, msg);
|
|
349
|
+
filteredChunks.push(chunk);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
msg.content.length = 0;
|
|
353
|
+
msg.content.push(...filteredChunks);
|
|
354
|
+
if (filteredChunks.length === 0) {
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
if (!messagesById.has(msgId)) {
|
|
359
|
+
messagesById.set(msgId, [
|
|
360
|
+
msg
|
|
361
|
+
]);
|
|
362
|
+
} else {
|
|
363
|
+
messagesById.get(msgId).push(msg);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
this.messages.length = 0;
|
|
367
|
+
for (const messages of messagesById.values()) {
|
|
368
|
+
const main = messages.shift();
|
|
369
|
+
for (const other of messages) {
|
|
370
|
+
main.merge(other);
|
|
371
|
+
}
|
|
372
|
+
this.messages.push(main);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
for (const msg of this.messages) {
|
|
376
|
+
if (!(msg instanceof message_cjs.AssistantMessage)) {
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
const finalToolCalls = {};
|
|
380
|
+
let lastId = "";
|
|
381
|
+
const excludedIndexes = [];
|
|
382
|
+
msg.content.forEach((chunk, index) => {
|
|
383
|
+
if (chunk.type !== "tool-call") {
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
const id = chunk.toolCallId || lastId;
|
|
387
|
+
if (!(id in finalToolCalls)) {
|
|
388
|
+
finalToolCalls[id] = utils_cjs.shallowCopy(chunk);
|
|
389
|
+
msg.content[index] = finalToolCalls[id];
|
|
390
|
+
} else {
|
|
391
|
+
excludedIndexes.push(index);
|
|
392
|
+
const lastToolCall = finalToolCalls[id];
|
|
393
|
+
if (remeda.isString(lastToolCall.input) && remeda.isString(chunk.input)) {
|
|
394
|
+
lastToolCall.input += chunk.input;
|
|
395
|
+
} else {
|
|
396
|
+
throw new Error("Chunks cannot be merged.");
|
|
397
|
+
}
|
|
398
|
+
if (!lastToolCall.toolName) {
|
|
399
|
+
lastToolCall.toolName = chunk.toolName;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
lastId = id;
|
|
403
|
+
});
|
|
404
|
+
excludedIndexes.reverse().forEach((index) => {
|
|
405
|
+
msg.content.splice(index, 1);
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
}
|
|
302
409
|
getToolCalls() {
|
|
303
410
|
return this.messages.filter((r) => r instanceof message_cjs.AssistantMessage).flatMap((r) => r.getToolCalls()).filter(Boolean);
|
|
304
411
|
}
|
|
@@ -322,6 +429,19 @@ class ChatModelOutput extends serializable_cjs.Serializable {
|
|
|
322
429
|
Object.assign(this, snapshot);
|
|
323
430
|
}
|
|
324
431
|
}
|
|
432
|
+
function cloneSync(serializable) {
|
|
433
|
+
const snapshot = serializable.createSnapshot();
|
|
434
|
+
if (remeda.isPromise(snapshot)) {
|
|
435
|
+
throw new Error(`createSnapshot cannot be async`);
|
|
436
|
+
}
|
|
437
|
+
const target = Object.create(serializable.constructor.prototype);
|
|
438
|
+
const load = target.loadSnapshot(snapshot);
|
|
439
|
+
if (remeda.isPromise(load)) {
|
|
440
|
+
throw new Error(`loadSnapshot cannot be async`);
|
|
441
|
+
}
|
|
442
|
+
return target;
|
|
443
|
+
}
|
|
444
|
+
__name(cloneSync, "cloneSync");
|
|
325
445
|
|
|
326
446
|
exports.ChatModel = ChatModel;
|
|
327
447
|
exports.ChatModelOutput = ChatModelOutput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/backend/chat.ts"],"names":["ChatModel","Serializable","cache","NullCache","parameters","logger","Logger","root","child","name","toolChoiceSupport","toolCallFallbackViaResponseFormat","modelSupportsToolCalling","create","input","shallowCopy","RunContext","enter","params","signal","abortSignal","run","tools","forceToolCallViaResponseFormat","shouldForceToolCallViaResponseFormat","isEmpty","responseFormat","generateToolUnionSchema","filterToolsByToolChoice","toolChoice","undefined","isToolChoiceSupported","warn","cacheEntry","createCacheAccessor","emitter","emit","chunks","generator","value","stream","_createStream","toAsyncGenerator","_create","controller","AbortController","push","callbacks","abort","aborted","resolve","result","ChatModelOutput","fromChunks","getToolCalls","lastMsg","messages","at","toolCall","parseBrokenJson","text","ChatModelError","isFatal","isRetryable","content","length","type","toolCallId","randomString","toLowerCase","toolName","error","reject","createStructure","_createStructure","config","isFunction","fromName","options","providerId","modelId","parseModel","Target","loadModel","schema","jsonSchema","toJsonSchema","systemTemplate","systemPromptTemplate","PromptTemplate","z","object","string","min","template","SystemMessage","render","JSON","stringify","errorTemplate","errors","expected","received","Retryable","executor","response","textResponse","getTextContent","pair","validator","createSchemaValidator","success","context","UserMessage","output","maxRetries","get","createSnapshot","slice","destroy","_","key","ObjectHashKeyFn","Serializer","serialize","map","msg","toPlain","isNew","task","Task","set","delete","Boolean","toolChoiceSupported","choice","Tool","includes","usage","finishReason","final","forEach","cur","merge","other","customMerge","totalTokens","takeBigger","promptTokens","completionTokens","filter","r","AssistantMessage","flatMap","getTextMessages","join","toString","loadSnapshot","snapshot","Object","assign"],"mappings":"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","file":"chat.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { customMerge } from \"@/internals/helpers/object.js\";\nimport { takeBigger } from \"@/internals/helpers/number.js\";\nimport { Callback } from \"@/emitter/types.js\";\nimport { FrameworkError } from \"@/errors.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext, RunContext } from \"@/context.js\";\nimport { isEmpty, isFunction, randomString } from \"remeda\";\nimport { ObjectHashKeyFn } from \"@/cache/decoratorCache.js\";\nimport { Task } from \"promise-based-task\";\nimport { NullCache } from \"@/cache/nullCache.js\";\nimport { BaseCache } from \"@/cache/base.js\";\nimport {\n filterToolsByToolChoice,\n FullModelName,\n generateToolUnionSchema,\n loadModel,\n parseModel,\n} from \"@/backend/utils.js\";\nimport { ProviderName } from \"@/backend/constants.js\";\nimport { AnyTool, Tool } from \"@/tools/base.js\";\nimport { AssistantMessage, Message, SystemMessage, UserMessage } from \"@/backend/message.js\";\n\nimport { ChatModelError } from \"@/backend/errors.js\";\nimport { z, ZodSchema, ZodType } from \"zod\";\nimport {\n createSchemaValidator,\n parseBrokenJson,\n toJsonSchema,\n} from \"@/internals/helpers/schema.js\";\nimport { Retryable } from \"@/internals/helpers/retryable.js\";\nimport { SchemaObject, ValidateFunction } from \"ajv\";\nimport { PromptTemplate } from \"@/template.js\";\nimport { toAsyncGenerator } from \"@/internals/helpers/promise.js\";\nimport { Serializer } from \"@/serializer/serializer.js\";\nimport { Logger } from \"@/logger/logger.js\";\n\nexport interface ChatModelParameters {\n maxTokens?: number;\n topP?: number;\n frequencyPenalty?: number;\n temperature?: number;\n topK?: number;\n n?: number;\n presencePenalty?: number;\n seed?: number;\n stopSequences?: string[];\n}\n\ninterface ResponseObjectJson {\n type: \"object-json\";\n schema?: SchemaObject;\n name?: string;\n description?: string;\n}\n\nexport interface ChatModelObjectInput<T> extends ChatModelParameters {\n schema: z.ZodSchema<T, any, any> | ResponseObjectJson;\n systemPromptTemplate?: PromptTemplate<ZodType<{ schema: string }>>;\n messages: Message[];\n abortSignal?: AbortSignal;\n maxRetries?: number;\n}\n\nexport interface ChatModelObjectOutput<T> {\n object: T;\n output: ChatModelOutput;\n}\n\nexport type ChatModelToolChoice = \"auto\" | \"none\" | \"required\" | AnyTool;\n\nexport interface ChatModelInput extends ChatModelParameters {\n tools?: AnyTool[];\n abortSignal?: AbortSignal;\n stopSequences?: string[];\n responseFormat?: ZodSchema | ResponseObjectJson;\n toolChoice?: ChatModelToolChoice;\n messages: Message[];\n}\n\nexport type ChatModelFinishReason =\n | \"stop\"\n | \"length\"\n | \"content-filter\"\n | \"tool-calls\"\n | \"error\"\n | \"other\"\n | \"unknown\";\n\nexport interface ChatModelUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n reasoningTokens?: number;\n cachedPromptTokens?: number;\n}\n\nexport interface ChatModelEvents {\n newToken?: Callback<{ value: ChatModelOutput; callbacks: { abort: () => void } }>;\n success?: Callback<{ value: ChatModelOutput }>;\n start?: Callback<{ input: ChatModelInput }>;\n error?: Callback<{ input: ChatModelInput; error: FrameworkError }>;\n finish?: Callback<null>;\n}\n\nexport type ChatModelEmitter<A = Record<never, never>> = Emitter<\n ChatModelEvents & Omit<A, keyof ChatModelEvents>\n>;\n\nexport type ChatModelCache = BaseCache<Task<ChatModelOutput[]>>;\nexport type ConfigFn<T> = (value: T) => T;\nexport interface ChatConfig {\n cache?: ChatModelCache | ConfigFn<ChatModelCache>;\n parameters?: ChatModelParameters | ConfigFn<ChatModelParameters>;\n}\n\nexport type ChatModelToolChoiceSupport = \"required\" | \"none\" | \"single\" | \"auto\";\n\nexport abstract class ChatModel extends Serializable {\n public abstract readonly emitter: Emitter<ChatModelEvents>;\n public cache: ChatModelCache = new NullCache();\n public parameters: ChatModelParameters = {};\n protected readonly logger = Logger.root.child({\n name: this.constructor.name,\n });\n\n public readonly toolChoiceSupport: ChatModelToolChoiceSupport[] = [\n \"required\",\n \"none\",\n \"single\",\n \"auto\",\n ];\n public toolCallFallbackViaResponseFormat = true;\n public readonly modelSupportsToolCalling: boolean = true;\n\n abstract get modelId(): string;\n abstract get providerId(): string;\n\n create(input: ChatModelInput & { stream?: boolean }) {\n input = shallowCopy(input);\n\n return RunContext.enter(\n this,\n { params: [input] as const, signal: input?.abortSignal },\n async (run) => {\n if (!this.modelSupportsToolCalling) {\n input.tools = [];\n }\n\n const forceToolCallViaResponseFormat = this.shouldForceToolCallViaResponseFormat(input);\n if (forceToolCallViaResponseFormat && input.tools && !isEmpty(input.tools)) {\n input.responseFormat = await generateToolUnionSchema(\n filterToolsByToolChoice(input.tools, input.toolChoice),\n );\n input.toolChoice = undefined;\n }\n\n if (!this.isToolChoiceSupported(input.toolChoice)) {\n this.logger.warn(\n `The following tool choice value '${input.toolChoice}' is not supported. Ignoring.`,\n );\n input.toolChoice = undefined;\n }\n\n const cacheEntry = await this.createCacheAccessor(input);\n\n try {\n await run.emitter.emit(\"start\", { input });\n const chunks: ChatModelOutput[] = [];\n\n const generator =\n cacheEntry.value ??\n (input.stream\n ? this._createStream(input, run)\n : toAsyncGenerator(this._create(input, run)));\n\n const controller = new AbortController();\n for await (const value of generator) {\n chunks.push(value);\n await run.emitter.emit(\"newToken\", {\n value,\n callbacks: { abort: () => controller.abort() },\n });\n if (controller.signal.aborted) {\n break;\n }\n }\n\n cacheEntry.resolve(chunks);\n const result = ChatModelOutput.fromChunks(chunks);\n\n if (forceToolCallViaResponseFormat && isEmpty(result.getToolCalls())) {\n const lastMsg = result.messages.at(-1)!;\n const toolCall = parseBrokenJson(lastMsg.text);\n if (!toolCall) {\n throw new ChatModelError(\n `Failed to produce a valid tool call. Generate output: ${lastMsg.text}`,\n [],\n {\n isFatal: true,\n isRetryable: false,\n },\n );\n }\n lastMsg.content.length = 0;\n lastMsg.content.push({\n type: \"tool-call\",\n toolCallId: `call_${randomString(8).toLowerCase()}`,\n toolName: toolCall.name, // todo: add types\n input: toolCall.parameters,\n });\n }\n\n await run.emitter.emit(\"success\", { value: result });\n return result;\n } catch (error) {\n await run.emitter.emit(\"error\", { input, error });\n await cacheEntry.reject(error);\n if (error instanceof ChatModelError) {\n throw error;\n } else {\n throw new ChatModelError(`The Chat Model has encountered an error.`, [error]);\n }\n } finally {\n await run.emitter.emit(\"finish\", null);\n }\n },\n );\n }\n\n createStructure<T>(input: ChatModelObjectInput<T>) {\n return RunContext.enter(\n this,\n { params: [input] as const, signal: input?.abortSignal },\n async (run) => {\n return await this._createStructure<T>(input, run);\n },\n );\n }\n\n config({ cache, parameters }: ChatConfig): void {\n if (cache) {\n this.cache = isFunction(cache) ? cache(this.cache) : cache;\n }\n if (parameters) {\n this.parameters = isFunction(parameters) ? parameters(this.parameters) : parameters;\n }\n }\n\n static async fromName(name: FullModelName | ProviderName, options?: ChatModelParameters) {\n const { providerId, modelId } = parseModel(name);\n const Target = await loadModel<ChatModel>(providerId, \"chat\");\n return new Target(modelId || undefined, options);\n }\n\n protected abstract _create(\n input: ChatModelInput,\n run: GetRunContext<typeof this>,\n ): Promise<ChatModelOutput>;\n protected abstract _createStream(\n input: ChatModelInput,\n run: GetRunContext<typeof this>,\n ): AsyncGenerator<ChatModelOutput, void>;\n\n protected async _createStructure<T>(\n input: ChatModelObjectInput<T>,\n run: GetRunContext<typeof this>,\n ): Promise<ChatModelObjectOutput<T>> {\n const { schema, ...options } = input;\n const jsonSchema = toJsonSchema(schema);\n\n const systemTemplate =\n input.systemPromptTemplate ??\n new PromptTemplate({\n schema: z.object({\n schema: z.string().min(1),\n }),\n template: `You are a helpful assistant that generates only valid JSON adhering to the following JSON Schema.\n\n\\`\\`\\`\n{{schema}}\n\\`\\`\\`\n\nIMPORTANT: You MUST answer with a JSON object that matches the JSON schema above.`,\n });\n\n const messages: Message[] = [\n new SystemMessage(systemTemplate.render({ schema: JSON.stringify(jsonSchema, null, 2) })),\n ...input.messages,\n ];\n\n const errorTemplate = new PromptTemplate({\n schema: z.object({\n errors: z.string(),\n expected: z.string(),\n received: z.string(),\n }),\n template: `Generated object does not match the expected JSON schema!\n\nValidation Errors: {{errors}}`,\n });\n\n return new Retryable<ChatModelObjectOutput<T>>({\n executor: async () => {\n const response = await this._create(\n {\n ...options,\n messages,\n responseFormat: { type: \"object-json\" },\n },\n run,\n );\n\n const textResponse = response.getTextContent();\n const object: T = parseBrokenJson(textResponse, { pair: [\"{\", \"}\"] });\n const validator = createSchemaValidator(schema) as ValidateFunction<T>;\n\n const success = validator(object);\n if (!success) {\n const context = {\n expected: JSON.stringify(jsonSchema),\n received: textResponse,\n errors: JSON.stringify(validator.errors ?? []),\n };\n\n messages.push(new UserMessage(errorTemplate.render(context)));\n throw new ChatModelError(`LLM did not produce a valid output.`, [], {\n context,\n });\n }\n\n return {\n object,\n output: response,\n };\n },\n config: {\n signal: run.signal,\n maxRetries: input?.maxRetries || 1,\n },\n }).get();\n }\n\n createSnapshot() {\n return {\n cache: this.cache,\n emitter: this.emitter,\n parameters: shallowCopy(this.parameters),\n logger: this.logger,\n toolChoiceSupport: this.toolChoiceSupport.slice(),\n toolCallFallbackViaResponseFormat: this.toolCallFallbackViaResponseFormat,\n modelSupportsToolCalling: this.modelSupportsToolCalling,\n };\n }\n\n destroy() {\n this.emitter.destroy();\n }\n\n protected async createCacheAccessor({\n abortSignal: _,\n messages,\n tools = [],\n ...input\n }: ChatModelInput) {\n const key = ObjectHashKeyFn({\n ...input,\n messages: await Serializer.serialize(messages.map((msg) => msg.toPlain())),\n tools: await Serializer.serialize(tools),\n });\n const value = await this.cache.get(key);\n const isNew = value === undefined;\n\n let task: Task<ChatModelOutput[]> | null = null;\n if (isNew) {\n task = new Task();\n await this.cache.set(key, task);\n }\n\n return {\n key,\n value,\n resolve: <T2 extends ChatModelOutput>(value: T2[]) => {\n task?.resolve?.(value);\n },\n reject: async (error: Error) => {\n task?.reject?.(error);\n if (isNew) {\n await this.cache.delete(key);\n }\n },\n };\n }\n\n protected shouldForceToolCallViaResponseFormat({\n tools = [],\n toolChoice,\n responseFormat,\n }: ChatModelInput) {\n if (\n isEmpty(tools) ||\n !toolChoice ||\n toolChoice === \"none\" ||\n toolChoice === \"auto\" ||\n !this.toolCallFallbackViaResponseFormat ||\n Boolean(responseFormat)\n ) {\n return false;\n }\n\n const toolChoiceSupported = this.isToolChoiceSupported(toolChoice);\n return !this.modelSupportsToolCalling || !toolChoiceSupported;\n }\n\n protected isToolChoiceSupported(choice?: ChatModelToolChoice): boolean {\n return (\n !choice ||\n (choice instanceof Tool\n ? this.toolChoiceSupport.includes(\"single\")\n : this.toolChoiceSupport.includes(choice))\n );\n }\n}\n\nexport class ChatModelOutput extends Serializable {\n constructor(\n public readonly messages: Message[],\n public usage?: ChatModelUsage,\n public finishReason?: ChatModelFinishReason,\n ) {\n super();\n }\n\n static fromChunks(chunks: ChatModelOutput[]) {\n const final = new ChatModelOutput([]);\n chunks.forEach((cur) => final.merge(cur));\n return final;\n }\n\n merge(other: ChatModelOutput) {\n this.messages.push(...other.messages);\n this.finishReason = other.finishReason;\n if (this.usage && other.usage) {\n this.usage = customMerge([this.usage, other.usage], {\n totalTokens: takeBigger,\n promptTokens: takeBigger,\n completionTokens: takeBigger,\n });\n } else if (other.usage) {\n this.usage = shallowCopy(other.usage);\n }\n }\n\n getToolCalls() {\n return this.messages\n .filter((r) => r instanceof AssistantMessage)\n .flatMap((r) => r.getToolCalls())\n .filter(Boolean);\n }\n\n getTextMessages(): AssistantMessage[] {\n return this.messages.filter((r) => r instanceof AssistantMessage).filter((r) => r.text);\n }\n\n getTextContent(): string {\n return this.messages\n .filter((r) => r instanceof AssistantMessage)\n .flatMap((r) => r.text)\n .filter(Boolean)\n .join(\"\");\n }\n\n toString() {\n return this.getTextContent();\n }\n\n createSnapshot() {\n return {\n messages: shallowCopy(this.messages),\n usage: shallowCopy(this.usage),\n finishReason: this.finishReason,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/backend/chat.ts"],"names":["ChatModel","Serializable","cache","NullCache","parameters","middlewares","logger","Logger","root","child","name","toolChoiceSupport","toolCallFallbackViaResponseFormat","modelSupportsToolCalling","create","input","shallowCopy","stream","undefined","RunContext","enter","params","signal","abortSignal","run","tools","forceToolCallViaResponseFormat","shouldForceToolCallViaResponseFormat","isEmpty","responseFormat","generateToolUnionSchema","filterToolsByToolChoice","toolChoice","isToolChoiceSupported","warn","cacheEntry","createCacheAccessor","emitter","emit","chunks","generator","value","_createStream","toAsyncGenerator","_create","controller","AbortController","push","callbacks","abort","aborted","resolve","result","ChatModelOutput","fromChunks","toolCall","getToolCalls","isString","JSON","parse","lastMsg","messages","at","parseBrokenJson","text","pair","ChatModelError","isFatal","isRetryable","content","length","type","toolCallId","randomString","toLowerCase","toolName","error","reject","middleware","createStructure","_createStructure","config","isFunction","fromName","options","providerId","modelId","parseModel","Target","loadModel","instance","Object","assign","schema","jsonSchema","toJsonSchema","systemTemplate","systemPromptTemplate","PromptTemplate","z","object","string","min","template","SystemMessage","render","stringify","errorTemplate","errors","expected","received","Retryable","executor","response","textResponse","getTextContent","validator","createSchemaValidator","success","context","UserMessage","output","maxRetries","get","createSnapshot","slice","destroy","_","key","ObjectHashKeyFn","Serializer","serialize","map","msg","toPlain","isNew","task","Task","set","delete","Boolean","toolChoiceSupported","choice","Tool","includes","usage","finishReason","dedupe","final","forEach","cur","merge","other","clones","cloneSync","customMerge","totalTokens","takeBigger","promptTokens","completionTokens","messagesById","Map","messagesByToolCallId","msgId","id","AssistantMessage","filteredChunks","chunk","size","lastToolCallId","getLast","keys","has","values","main","shift","finalToolCalls","lastId","excludedIndexes","index","lastToolCall","Error","reverse","splice","filter","r","flatMap","getTextMessages","join","toString","loadSnapshot","snapshot","serializable","isPromise","target","prototype","load"],"mappings":"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","file":"chat.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { customMerge, getLast } from \"@/internals/helpers/object.js\";\nimport { takeBigger } from \"@/internals/helpers/number.js\";\nimport { Callback } from \"@/emitter/types.js\";\nimport { FrameworkError } from \"@/errors.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext, MiddlewareType, RunContext } from \"@/context.js\";\nimport { isEmpty, isFunction, isPromise, isString, randomString } from \"remeda\";\nimport { ObjectHashKeyFn } from \"@/cache/decoratorCache.js\";\nimport { Task } from \"promise-based-task\";\nimport { NullCache } from \"@/cache/nullCache.js\";\nimport { BaseCache } from \"@/cache/base.js\";\nimport {\n filterToolsByToolChoice,\n FullModelName,\n generateToolUnionSchema,\n loadModel,\n parseModel,\n} from \"@/backend/utils.js\";\nimport { ProviderName } from \"@/backend/constants.js\";\nimport { AnyTool, Tool } from \"@/tools/base.js\";\nimport { AssistantMessage, Message, SystemMessage, UserMessage } from \"@/backend/message.js\";\n\nimport { ChatModelError } from \"@/backend/errors.js\";\nimport { z, ZodSchema, ZodType } from \"zod\";\nimport {\n createSchemaValidator,\n parseBrokenJson,\n toJsonSchema,\n} from \"@/internals/helpers/schema.js\";\nimport { Retryable } from \"@/internals/helpers/retryable.js\";\nimport { SchemaObject, ValidateFunction } from \"ajv\";\nimport { PromptTemplate } from \"@/template.js\";\nimport { toAsyncGenerator } from \"@/internals/helpers/promise.js\";\nimport { Serializer } from \"@/serializer/serializer.js\";\nimport { Logger } from \"@/logger/logger.js\";\nimport { ToolCallPart } from \"ai\";\n\nexport interface ChatModelParameters {\n maxTokens?: number;\n topP?: number;\n frequencyPenalty?: number;\n temperature?: number;\n topK?: number;\n n?: number;\n presencePenalty?: number;\n seed?: number;\n stopSequences?: string[];\n stream?: boolean;\n}\n\ninterface ResponseObjectJson {\n type: \"object-json\";\n schema?: SchemaObject;\n name?: string;\n description?: string;\n}\n\nexport interface ChatModelObjectInput<T> extends ChatModelParameters {\n schema: z.ZodSchema<T, any, any> | ResponseObjectJson;\n systemPromptTemplate?: PromptTemplate<ZodType<{ schema: string }>>;\n messages: Message[];\n abortSignal?: AbortSignal;\n maxRetries?: number;\n}\n\nexport interface ChatModelObjectOutput<T> {\n object: T;\n output: ChatModelOutput;\n}\n\nexport type ChatModelToolChoice = \"auto\" | \"none\" | \"required\" | AnyTool;\n\nexport interface ChatModelInput extends ChatModelParameters {\n tools?: AnyTool[];\n abortSignal?: AbortSignal;\n stopSequences?: string[];\n responseFormat?: ZodSchema | ResponseObjectJson;\n toolChoice?: ChatModelToolChoice;\n messages: Message[];\n streamPartialToolCalls?: boolean;\n}\n\nexport type ChatModelFinishReason =\n | \"stop\"\n | \"length\"\n | \"content-filter\"\n | \"tool-calls\"\n | \"error\"\n | \"other\"\n | \"unknown\";\n\nexport interface ChatModelUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n reasoningTokens?: number;\n cachedPromptTokens?: number;\n}\n\nexport interface ChatModelEvents {\n newToken?: Callback<{ value: ChatModelOutput; callbacks: { abort: () => void } }>;\n success?: Callback<{ value: ChatModelOutput }>;\n start?: Callback<{ input: ChatModelInput }>;\n error?: Callback<{ input: ChatModelInput; error: FrameworkError }>;\n finish?: Callback<null>;\n}\n\nexport type ChatModelEmitter<A = Record<never, never>> = Emitter<\n ChatModelEvents & Omit<A, keyof ChatModelEvents>\n>;\n\nexport type ChatModelCache = BaseCache<Task<ChatModelOutput[]>>;\nexport type ConfigFn<T> = (value: T) => T;\nexport interface ChatConfig {\n cache?: ChatModelCache | ConfigFn<ChatModelCache>;\n parameters?: ChatModelParameters | ConfigFn<ChatModelParameters>;\n}\n\nexport type ChatModelToolChoiceSupport = \"required\" | \"none\" | \"single\" | \"auto\";\n\nexport abstract class ChatModel extends Serializable {\n public abstract readonly emitter: Emitter<ChatModelEvents>;\n public cache: ChatModelCache = new NullCache();\n public parameters: ChatModelParameters = {};\n public readonly middlewares: MiddlewareType<typeof this>[] = [];\n protected readonly logger = Logger.root.child({\n name: this.constructor.name,\n });\n\n public readonly toolChoiceSupport: ChatModelToolChoiceSupport[] = [\n \"required\",\n \"none\",\n \"single\",\n \"auto\",\n ];\n public toolCallFallbackViaResponseFormat = true;\n public readonly modelSupportsToolCalling: boolean = true;\n\n abstract get modelId(): string;\n abstract get providerId(): string;\n\n create(input: ChatModelInput) {\n input = shallowCopy(input);\n if (input.stream === undefined) {\n input.stream = this.parameters.stream;\n }\n\n return RunContext.enter(\n this,\n { params: [input] as const, signal: input?.abortSignal },\n async (run) => {\n if (!this.modelSupportsToolCalling) {\n input.tools = [];\n }\n\n const forceToolCallViaResponseFormat = this.shouldForceToolCallViaResponseFormat(input);\n if (forceToolCallViaResponseFormat && input.tools && !isEmpty(input.tools)) {\n input.responseFormat = await generateToolUnionSchema(\n filterToolsByToolChoice(input.tools, input.toolChoice),\n );\n input.toolChoice = undefined;\n }\n\n if (!this.isToolChoiceSupported(input.toolChoice)) {\n this.logger.warn(\n `The following tool choice value '${input.toolChoice}' is not supported. Ignoring.`,\n );\n input.toolChoice = undefined;\n }\n\n const cacheEntry = await this.createCacheAccessor(input);\n\n try {\n await run.emitter.emit(\"start\", { input });\n const chunks: ChatModelOutput[] = [];\n\n const generator =\n cacheEntry.value ??\n (input.stream\n ? this._createStream(input, run)\n : toAsyncGenerator(this._create(input, run)));\n\n const controller = new AbortController();\n for await (const value of generator) {\n chunks.push(value);\n await run.emitter.emit(\"newToken\", {\n value,\n callbacks: { abort: () => controller.abort() },\n });\n if (controller.signal.aborted) {\n break;\n }\n }\n\n cacheEntry.resolve(chunks);\n const result = ChatModelOutput.fromChunks(chunks);\n for (const toolCall of result.getToolCalls()) {\n if (isString(toolCall.input)) {\n toolCall.input = JSON.parse(toolCall.input);\n }\n }\n\n if (forceToolCallViaResponseFormat && isEmpty(result.getToolCalls())) {\n const lastMsg = result.messages.at(-1)!;\n const toolCall = parseBrokenJson(lastMsg.text, { pair: [\"{\", \"}\"] });\n if (!toolCall || !toolCall.name || !toolCall.parameters) {\n throw new ChatModelError(\n `Failed to produce a valid tool call. Generate output: ${lastMsg.text}`,\n [],\n {\n isFatal: true,\n isRetryable: false,\n },\n );\n }\n lastMsg.content.length = 0;\n lastMsg.content.push({\n type: \"tool-call\",\n toolCallId: `call_${randomString(8).toLowerCase()}`,\n toolName: toolCall.name, // todo: add types\n input: toolCall.parameters,\n });\n }\n\n await run.emitter.emit(\"success\", { value: result });\n return result;\n } catch (error) {\n await run.emitter.emit(\"error\", { input, error });\n await cacheEntry.reject(error);\n if (error instanceof ChatModelError) {\n throw error;\n } else {\n throw new ChatModelError(`The Chat Model has encountered an error.`, [error]);\n }\n } finally {\n await run.emitter.emit(\"finish\", null);\n }\n },\n ).middleware(...this.middlewares);\n }\n\n createStructure<T>(input: ChatModelObjectInput<T>) {\n return RunContext.enter(\n this,\n { params: [input] as const, signal: input?.abortSignal },\n async (run) => {\n return await this._createStructure<T>(input, run);\n },\n );\n }\n\n config({ cache, parameters }: ChatConfig): void {\n if (cache) {\n this.cache = isFunction(cache) ? cache(this.cache) : cache;\n }\n if (parameters) {\n this.parameters = isFunction(parameters) ? parameters(this.parameters) : parameters;\n }\n }\n\n static async fromName(name: FullModelName | ProviderName, options?: ChatModelParameters) {\n const { providerId, modelId } = parseModel(name);\n const Target = await loadModel<ChatModel>(providerId, \"chat\");\n const instance = new Target(modelId || undefined);\n if (options) {\n Object.assign(instance.parameters, options);\n }\n return instance;\n }\n\n protected abstract _create(\n input: ChatModelInput,\n run: GetRunContext<typeof this>,\n ): Promise<ChatModelOutput>;\n protected abstract _createStream(\n input: ChatModelInput,\n run: GetRunContext<typeof this>,\n ): AsyncGenerator<ChatModelOutput, void>;\n\n protected async _createStructure<T>(\n input: ChatModelObjectInput<T>,\n run: GetRunContext<typeof this>,\n ): Promise<ChatModelObjectOutput<T>> {\n const { schema, ...options } = input;\n const jsonSchema = toJsonSchema(schema);\n\n const systemTemplate =\n input.systemPromptTemplate ??\n new PromptTemplate({\n schema: z.object({\n schema: z.string().min(1),\n }),\n template: `You are a helpful assistant that generates only valid JSON adhering to the following JSON Schema.\n\n\\`\\`\\`\n{{schema}}\n\\`\\`\\`\n\nIMPORTANT: You MUST answer with a JSON object that matches the JSON schema above.`,\n });\n\n const messages: Message[] = [\n new SystemMessage(systemTemplate.render({ schema: JSON.stringify(jsonSchema, null, 2) })),\n ...input.messages,\n ];\n\n const errorTemplate = new PromptTemplate({\n schema: z.object({\n errors: z.string(),\n expected: z.string(),\n received: z.string(),\n }),\n template: `Generated object does not match the expected JSON schema!\n\nValidation Errors: {{errors}}`,\n });\n\n return new Retryable<ChatModelObjectOutput<T>>({\n executor: async () => {\n const response = await this._create(\n {\n ...options,\n messages,\n responseFormat: { type: \"object-json\" },\n },\n run,\n );\n\n const textResponse = response.getTextContent();\n const object: T = parseBrokenJson(textResponse, { pair: [\"{\", \"}\"] });\n const validator = createSchemaValidator(schema) as ValidateFunction<T>;\n\n const success = validator(object);\n if (!success) {\n const context = {\n expected: JSON.stringify(jsonSchema),\n received: textResponse,\n errors: JSON.stringify(validator.errors ?? []),\n };\n\n messages.push(new UserMessage(errorTemplate.render(context)));\n throw new ChatModelError(`LLM did not produce a valid output.`, [], {\n context,\n });\n }\n\n return {\n object,\n output: response,\n };\n },\n config: {\n signal: run.signal,\n maxRetries: input?.maxRetries || 1,\n },\n }).get();\n }\n\n createSnapshot() {\n return {\n cache: this.cache,\n emitter: this.emitter,\n middlewares: shallowCopy(this.middlewares) as MiddlewareType<any>[],\n parameters: shallowCopy(this.parameters),\n logger: this.logger,\n toolChoiceSupport: this.toolChoiceSupport.slice(),\n toolCallFallbackViaResponseFormat: this.toolCallFallbackViaResponseFormat,\n modelSupportsToolCalling: this.modelSupportsToolCalling,\n };\n }\n\n destroy() {\n this.emitter.destroy();\n }\n\n protected async createCacheAccessor({\n abortSignal: _,\n messages,\n tools = [],\n ...input\n }: ChatModelInput) {\n const key = ObjectHashKeyFn({\n ...input,\n messages: await Serializer.serialize(messages.map((msg) => msg.toPlain())),\n tools: await Serializer.serialize(tools),\n });\n const value = await this.cache.get(key);\n const isNew = value === undefined;\n\n let task: Task<ChatModelOutput[]> | null = null;\n if (isNew) {\n task = new Task();\n await this.cache.set(key, task);\n }\n\n return {\n key,\n value,\n resolve: <T2 extends ChatModelOutput>(value: T2[]) => {\n task?.resolve?.(value);\n },\n reject: async (error: Error) => {\n task?.reject?.(error);\n if (isNew) {\n await this.cache.delete(key);\n }\n },\n };\n }\n\n protected shouldForceToolCallViaResponseFormat({\n tools = [],\n toolChoice,\n responseFormat,\n }: ChatModelInput) {\n if (\n isEmpty(tools) ||\n !toolChoice ||\n toolChoice === \"none\" ||\n toolChoice === \"auto\" ||\n !this.toolCallFallbackViaResponseFormat ||\n Boolean(responseFormat)\n ) {\n return false;\n }\n\n const toolChoiceSupported = this.isToolChoiceSupported(toolChoice);\n return !this.modelSupportsToolCalling || !toolChoiceSupported;\n }\n\n protected isToolChoiceSupported(choice?: ChatModelToolChoice): boolean {\n return (\n !choice ||\n (choice instanceof Tool\n ? this.toolChoiceSupport.includes(\"single\")\n : this.toolChoiceSupport.includes(choice))\n );\n }\n}\n\nexport class ChatModelOutput extends Serializable {\n constructor(\n public readonly messages: Message[],\n public usage?: ChatModelUsage,\n public finishReason?: ChatModelFinishReason,\n ) {\n super();\n this.dedupe();\n }\n\n static fromChunks(chunks: ChatModelOutput[]) {\n const final = new ChatModelOutput([]);\n chunks.forEach((cur) => final.merge(cur));\n return final;\n }\n\n merge(other: ChatModelOutput) {\n if (other.messages.length > 0) {\n const clones = other.messages.map(cloneSync);\n this.messages.push(...clones);\n this.dedupe();\n }\n\n this.finishReason = other.finishReason;\n if (this.usage && other.usage) {\n this.usage = customMerge([this.usage, other.usage], {\n totalTokens: takeBigger,\n promptTokens: takeBigger,\n completionTokens: takeBigger,\n });\n } else if (other.usage) {\n this.usage = shallowCopy(other.usage);\n }\n }\n\n dedupe(): void {\n // Dedupe messages\n if (this.messages.length > 1) {\n const messagesById = new Map<string, Message[]>();\n const messagesByToolCallId = new Map<string, AssistantMessage>();\n\n for (const msg of this.messages) {\n const msgId = msg.id || \"\";\n\n if (msg instanceof AssistantMessage && msg.getToolCalls().length > 0) {\n const filteredChunks: AssistantMessage[\"content\"] = [];\n for (const chunk of msg.content) {\n if (chunk.type !== \"tool-call\") {\n filteredChunks.push(chunk);\n continue;\n }\n\n // Assume tool calls with no id refer to the most recent tool call\n if (!chunk.toolCallId && messagesByToolCallId.size > 0) {\n const lastToolCallId = getLast(messagesByToolCallId.keys(), \"\");\n if (lastToolCallId) {\n chunk.toolCallId = lastToolCallId;\n }\n }\n\n if (chunk.toolCallId && messagesByToolCallId.has(chunk.toolCallId)) {\n messagesByToolCallId.get(chunk.toolCallId)!.content.push(chunk);\n } else if (chunk.toolCallId) {\n messagesByToolCallId.set(chunk.toolCallId, msg);\n filteredChunks.push(chunk);\n }\n }\n\n msg.content.length = 0;\n msg.content.push(...filteredChunks);\n\n if (filteredChunks.length === 0) {\n continue; // nothing to process\n }\n }\n\n if (!messagesById.has(msgId)) {\n messagesById.set(msgId, [msg]);\n } else {\n messagesById.get(msgId)!.push(msg);\n }\n }\n\n this.messages.length = 0;\n\n for (const messages of messagesById.values()) {\n const main = messages.shift()!;\n for (const other of messages) {\n main.merge(other);\n }\n this.messages.push(main);\n }\n }\n\n // Dedupe tool calls\n for (const msg of this.messages) {\n if (!(msg instanceof AssistantMessage)) {\n continue;\n }\n\n const finalToolCalls: Record<string, ToolCallPart> = {};\n let lastId = \"\";\n\n const excludedIndexes: number[] = [];\n msg.content.forEach((chunk, index) => {\n if (chunk.type !== \"tool-call\") {\n return;\n }\n const id = chunk.toolCallId || lastId;\n if (!(id in finalToolCalls)) {\n finalToolCalls[id] = shallowCopy(chunk);\n msg.content[index] = finalToolCalls[id];\n } else {\n excludedIndexes.push(index);\n const lastToolCall = finalToolCalls[id];\n if (isString(lastToolCall.input) && isString(chunk.input)) {\n lastToolCall.input += chunk.input;\n } else {\n throw new Error(\"Chunks cannot be merged.\");\n }\n if (!lastToolCall.toolName) {\n lastToolCall.toolName = chunk.toolName;\n }\n }\n lastId = id;\n });\n excludedIndexes.reverse().forEach((index) => {\n msg.content.splice(index, 1);\n });\n }\n }\n\n getToolCalls() {\n return this.messages\n .filter((r) => r instanceof AssistantMessage)\n .flatMap((r) => r.getToolCalls())\n .filter(Boolean);\n }\n\n getTextMessages(): AssistantMessage[] {\n return this.messages.filter((r) => r instanceof AssistantMessage).filter((r) => r.text);\n }\n\n getTextContent(): string {\n return this.messages\n .filter((r) => r instanceof AssistantMessage)\n .flatMap((r) => r.text)\n .filter(Boolean)\n .join(\"\");\n }\n\n toString() {\n return this.getTextContent();\n }\n\n createSnapshot() {\n return {\n messages: shallowCopy(this.messages),\n usage: shallowCopy(this.usage),\n finishReason: this.finishReason,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n\nfunction cloneSync<T extends Serializable>(serializable: T): T {\n const snapshot = serializable.createSnapshot();\n if (isPromise(snapshot)) {\n throw new Error(`createSnapshot cannot be async`);\n }\n\n const target = Object.create(serializable.constructor.prototype) as T;\n const load = target.loadSnapshot(snapshot);\n if (isPromise(load)) {\n throw new Error(`loadSnapshot cannot be async`);\n }\n\n return target;\n}\n"]}
|
package/dist/backend/chat.d.cts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import './message.cjs';
|
|
2
|
-
import 'ai';
|
|
3
2
|
import '../context.cjs';
|
|
4
3
|
import '../internals/serializable.cjs';
|
|
5
|
-
import '../emitter-
|
|
4
|
+
import '../emitter-jN55XZZq.cjs';
|
|
6
5
|
import '../errors.cjs';
|
|
7
6
|
import 'promise-based-task';
|
|
8
7
|
import '../cache/base.cjs';
|
|
9
|
-
export { k as ChatConfig, m as ChatModel, i as ChatModelCache, h as ChatModelEmitter, g as ChatModelEvents, e as ChatModelFinishReason, d as ChatModelInput, a as ChatModelObjectInput, b as ChatModelObjectOutput, n as ChatModelOutput, C as ChatModelParameters, c as ChatModelToolChoice, l as ChatModelToolChoiceSupport, f as ChatModelUsage, j as ConfigFn } from '../chat-
|
|
8
|
+
export { k as ChatConfig, m as ChatModel, i as ChatModelCache, h as ChatModelEmitter, g as ChatModelEvents, e as ChatModelFinishReason, d as ChatModelInput, a as ChatModelObjectInput, b as ChatModelObjectOutput, n as ChatModelOutput, C as ChatModelParameters, c as ChatModelToolChoice, l as ChatModelToolChoiceSupport, f as ChatModelUsage, j as ConfigFn } from '../chat-CC0s8z23.cjs';
|
|
10
9
|
import './constants.cjs';
|
|
11
10
|
import '../tools/base.cjs';
|
|
12
11
|
import 'zod';
|
|
13
12
|
import 'ajv';
|
|
14
13
|
import '../template.cjs';
|
|
15
14
|
import '../logger/logger.cjs';
|
|
15
|
+
import 'ai';
|
|
16
16
|
import '../internals/types.cjs';
|
|
17
17
|
import '../internals/helpers/guards.cjs';
|
|
18
18
|
import '../internals/helpers/promise.cjs';
|
package/dist/backend/chat.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import './message.js';
|
|
2
|
-
import 'ai';
|
|
3
2
|
import '../context.js';
|
|
4
3
|
import '../internals/serializable.js';
|
|
5
|
-
import '../emitter-
|
|
4
|
+
import '../emitter-36-9MnvA.js';
|
|
6
5
|
import '../errors.js';
|
|
7
6
|
import 'promise-based-task';
|
|
8
7
|
import '../cache/base.js';
|
|
9
|
-
export { k as ChatConfig, m as ChatModel, i as ChatModelCache, h as ChatModelEmitter, g as ChatModelEvents, e as ChatModelFinishReason, d as ChatModelInput, a as ChatModelObjectInput, b as ChatModelObjectOutput, n as ChatModelOutput, C as ChatModelParameters, c as ChatModelToolChoice, l as ChatModelToolChoiceSupport, f as ChatModelUsage, j as ConfigFn } from '../chat-
|
|
8
|
+
export { k as ChatConfig, m as ChatModel, i as ChatModelCache, h as ChatModelEmitter, g as ChatModelEvents, e as ChatModelFinishReason, d as ChatModelInput, a as ChatModelObjectInput, b as ChatModelObjectOutput, n as ChatModelOutput, C as ChatModelParameters, c as ChatModelToolChoice, l as ChatModelToolChoiceSupport, f as ChatModelUsage, j as ConfigFn } from '../chat-D8SVtw5Q.js';
|
|
10
9
|
import './constants.js';
|
|
11
10
|
import '../tools/base.js';
|
|
12
11
|
import 'zod';
|
|
13
12
|
import 'ajv';
|
|
14
13
|
import '../template.js';
|
|
15
14
|
import '../logger/logger.js';
|
|
15
|
+
import 'ai';
|
|
16
16
|
import '../internals/types.js';
|
|
17
17
|
import '../internals/helpers/guards.js';
|
|
18
18
|
import '../internals/helpers/promise.js';
|
package/dist/backend/chat.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Serializable } from '../internals/serializable.js';
|
|
2
2
|
import { shallowCopy } from '../serializer/utils.js';
|
|
3
|
-
import { customMerge } from '../internals/helpers/object.js';
|
|
3
|
+
import { customMerge, getLast } from '../internals/helpers/object.js';
|
|
4
4
|
import { takeBigger } from '../internals/helpers/number.js';
|
|
5
5
|
import { RunContext } from '../context.js';
|
|
6
|
-
import { isEmpty, randomString, isFunction } from 'remeda';
|
|
6
|
+
import { isEmpty, isString, randomString, isFunction, isPromise } from 'remeda';
|
|
7
7
|
import { ObjectHashKeyFn } from '../cache/decoratorCache.js';
|
|
8
8
|
import { Task } from 'promise-based-task';
|
|
9
9
|
import { NullCache } from '../cache/nullCache.js';
|
|
@@ -27,6 +27,7 @@ class ChatModel extends Serializable {
|
|
|
27
27
|
}
|
|
28
28
|
cache = new NullCache();
|
|
29
29
|
parameters = {};
|
|
30
|
+
middlewares = [];
|
|
30
31
|
logger = Logger.root.child({
|
|
31
32
|
name: this.constructor.name
|
|
32
33
|
});
|
|
@@ -40,6 +41,9 @@ class ChatModel extends Serializable {
|
|
|
40
41
|
modelSupportsToolCalling = true;
|
|
41
42
|
create(input) {
|
|
42
43
|
input = shallowCopy(input);
|
|
44
|
+
if (input.stream === void 0) {
|
|
45
|
+
input.stream = this.parameters.stream;
|
|
46
|
+
}
|
|
43
47
|
return RunContext.enter(this, {
|
|
44
48
|
params: [
|
|
45
49
|
input
|
|
@@ -80,10 +84,20 @@ class ChatModel extends Serializable {
|
|
|
80
84
|
}
|
|
81
85
|
cacheEntry.resolve(chunks);
|
|
82
86
|
const result = ChatModelOutput.fromChunks(chunks);
|
|
87
|
+
for (const toolCall of result.getToolCalls()) {
|
|
88
|
+
if (isString(toolCall.input)) {
|
|
89
|
+
toolCall.input = JSON.parse(toolCall.input);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
83
92
|
if (forceToolCallViaResponseFormat && isEmpty(result.getToolCalls())) {
|
|
84
93
|
const lastMsg = result.messages.at(-1);
|
|
85
|
-
const toolCall = parseBrokenJson(lastMsg.text
|
|
86
|
-
|
|
94
|
+
const toolCall = parseBrokenJson(lastMsg.text, {
|
|
95
|
+
pair: [
|
|
96
|
+
"{",
|
|
97
|
+
"}"
|
|
98
|
+
]
|
|
99
|
+
});
|
|
100
|
+
if (!toolCall || !toolCall.name || !toolCall.parameters) {
|
|
87
101
|
throw new ChatModelError(`Failed to produce a valid tool call. Generate output: ${lastMsg.text}`, [], {
|
|
88
102
|
isFatal: true,
|
|
89
103
|
isRetryable: false
|
|
@@ -118,7 +132,7 @@ class ChatModel extends Serializable {
|
|
|
118
132
|
} finally {
|
|
119
133
|
await run.emitter.emit("finish", null);
|
|
120
134
|
}
|
|
121
|
-
});
|
|
135
|
+
}).middleware(...this.middlewares);
|
|
122
136
|
}
|
|
123
137
|
createStructure(input) {
|
|
124
138
|
return RunContext.enter(this, {
|
|
@@ -141,7 +155,11 @@ class ChatModel extends Serializable {
|
|
|
141
155
|
static async fromName(name, options) {
|
|
142
156
|
const { providerId, modelId } = parseModel(name);
|
|
143
157
|
const Target = await loadModel(providerId, "chat");
|
|
144
|
-
|
|
158
|
+
const instance = new Target(modelId || void 0);
|
|
159
|
+
if (options) {
|
|
160
|
+
Object.assign(instance.parameters, options);
|
|
161
|
+
}
|
|
162
|
+
return instance;
|
|
145
163
|
}
|
|
146
164
|
async _createStructure(input, run) {
|
|
147
165
|
const { schema, ...options } = input;
|
|
@@ -218,6 +236,7 @@ Validation Errors: {{errors}}`
|
|
|
218
236
|
return {
|
|
219
237
|
cache: this.cache,
|
|
220
238
|
emitter: this.emitter,
|
|
239
|
+
middlewares: shallowCopy(this.middlewares),
|
|
221
240
|
parameters: shallowCopy(this.parameters),
|
|
222
241
|
logger: this.logger,
|
|
223
242
|
toolChoiceSupport: this.toolChoiceSupport.slice(),
|
|
@@ -275,6 +294,7 @@ class ChatModelOutput extends Serializable {
|
|
|
275
294
|
finishReason;
|
|
276
295
|
constructor(messages, usage, finishReason) {
|
|
277
296
|
super(), this.messages = messages, this.usage = usage, this.finishReason = finishReason;
|
|
297
|
+
this.dedupe();
|
|
278
298
|
}
|
|
279
299
|
static fromChunks(chunks) {
|
|
280
300
|
const final = new ChatModelOutput([]);
|
|
@@ -282,7 +302,11 @@ class ChatModelOutput extends Serializable {
|
|
|
282
302
|
return final;
|
|
283
303
|
}
|
|
284
304
|
merge(other) {
|
|
285
|
-
|
|
305
|
+
if (other.messages.length > 0) {
|
|
306
|
+
const clones = other.messages.map(cloneSync);
|
|
307
|
+
this.messages.push(...clones);
|
|
308
|
+
this.dedupe();
|
|
309
|
+
}
|
|
286
310
|
this.finishReason = other.finishReason;
|
|
287
311
|
if (this.usage && other.usage) {
|
|
288
312
|
this.usage = customMerge([
|
|
@@ -297,6 +321,89 @@ class ChatModelOutput extends Serializable {
|
|
|
297
321
|
this.usage = shallowCopy(other.usage);
|
|
298
322
|
}
|
|
299
323
|
}
|
|
324
|
+
dedupe() {
|
|
325
|
+
if (this.messages.length > 1) {
|
|
326
|
+
const messagesById = /* @__PURE__ */ new Map();
|
|
327
|
+
const messagesByToolCallId = /* @__PURE__ */ new Map();
|
|
328
|
+
for (const msg of this.messages) {
|
|
329
|
+
const msgId = msg.id || "";
|
|
330
|
+
if (msg instanceof AssistantMessage && msg.getToolCalls().length > 0) {
|
|
331
|
+
const filteredChunks = [];
|
|
332
|
+
for (const chunk of msg.content) {
|
|
333
|
+
if (chunk.type !== "tool-call") {
|
|
334
|
+
filteredChunks.push(chunk);
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
if (!chunk.toolCallId && messagesByToolCallId.size > 0) {
|
|
338
|
+
const lastToolCallId = getLast(messagesByToolCallId.keys(), "");
|
|
339
|
+
if (lastToolCallId) {
|
|
340
|
+
chunk.toolCallId = lastToolCallId;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (chunk.toolCallId && messagesByToolCallId.has(chunk.toolCallId)) {
|
|
344
|
+
messagesByToolCallId.get(chunk.toolCallId).content.push(chunk);
|
|
345
|
+
} else if (chunk.toolCallId) {
|
|
346
|
+
messagesByToolCallId.set(chunk.toolCallId, msg);
|
|
347
|
+
filteredChunks.push(chunk);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
msg.content.length = 0;
|
|
351
|
+
msg.content.push(...filteredChunks);
|
|
352
|
+
if (filteredChunks.length === 0) {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (!messagesById.has(msgId)) {
|
|
357
|
+
messagesById.set(msgId, [
|
|
358
|
+
msg
|
|
359
|
+
]);
|
|
360
|
+
} else {
|
|
361
|
+
messagesById.get(msgId).push(msg);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
this.messages.length = 0;
|
|
365
|
+
for (const messages of messagesById.values()) {
|
|
366
|
+
const main = messages.shift();
|
|
367
|
+
for (const other of messages) {
|
|
368
|
+
main.merge(other);
|
|
369
|
+
}
|
|
370
|
+
this.messages.push(main);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
for (const msg of this.messages) {
|
|
374
|
+
if (!(msg instanceof AssistantMessage)) {
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
const finalToolCalls = {};
|
|
378
|
+
let lastId = "";
|
|
379
|
+
const excludedIndexes = [];
|
|
380
|
+
msg.content.forEach((chunk, index) => {
|
|
381
|
+
if (chunk.type !== "tool-call") {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const id = chunk.toolCallId || lastId;
|
|
385
|
+
if (!(id in finalToolCalls)) {
|
|
386
|
+
finalToolCalls[id] = shallowCopy(chunk);
|
|
387
|
+
msg.content[index] = finalToolCalls[id];
|
|
388
|
+
} else {
|
|
389
|
+
excludedIndexes.push(index);
|
|
390
|
+
const lastToolCall = finalToolCalls[id];
|
|
391
|
+
if (isString(lastToolCall.input) && isString(chunk.input)) {
|
|
392
|
+
lastToolCall.input += chunk.input;
|
|
393
|
+
} else {
|
|
394
|
+
throw new Error("Chunks cannot be merged.");
|
|
395
|
+
}
|
|
396
|
+
if (!lastToolCall.toolName) {
|
|
397
|
+
lastToolCall.toolName = chunk.toolName;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
lastId = id;
|
|
401
|
+
});
|
|
402
|
+
excludedIndexes.reverse().forEach((index) => {
|
|
403
|
+
msg.content.splice(index, 1);
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
300
407
|
getToolCalls() {
|
|
301
408
|
return this.messages.filter((r) => r instanceof AssistantMessage).flatMap((r) => r.getToolCalls()).filter(Boolean);
|
|
302
409
|
}
|
|
@@ -320,6 +427,19 @@ class ChatModelOutput extends Serializable {
|
|
|
320
427
|
Object.assign(this, snapshot);
|
|
321
428
|
}
|
|
322
429
|
}
|
|
430
|
+
function cloneSync(serializable) {
|
|
431
|
+
const snapshot = serializable.createSnapshot();
|
|
432
|
+
if (isPromise(snapshot)) {
|
|
433
|
+
throw new Error(`createSnapshot cannot be async`);
|
|
434
|
+
}
|
|
435
|
+
const target = Object.create(serializable.constructor.prototype);
|
|
436
|
+
const load = target.loadSnapshot(snapshot);
|
|
437
|
+
if (isPromise(load)) {
|
|
438
|
+
throw new Error(`loadSnapshot cannot be async`);
|
|
439
|
+
}
|
|
440
|
+
return target;
|
|
441
|
+
}
|
|
442
|
+
__name(cloneSync, "cloneSync");
|
|
323
443
|
|
|
324
444
|
export { ChatModel, ChatModelOutput };
|
|
325
445
|
//# sourceMappingURL=chat.js.map
|