@librechat/agents 3.0.51 → 3.0.53
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/cjs/llm/vertexai/index.cjs +7 -8
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/stream.cjs +12 -1
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +7 -8
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/stream.mjs +12 -1
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/types/types/stream.d.ts +2 -0
- package/package.json +2 -1
- package/src/llm/vertexai/index.ts +9 -10
- package/src/scripts/multi-agent-parallel-start.ts +232 -0
- package/src/stream.ts +16 -1
- package/src/types/stream.ts +4 -0
- package/src/utils/llmConfig.ts +5 -0
|
@@ -6,9 +6,12 @@ var googleCommon = require('@langchain/google-common');
|
|
|
6
6
|
class CustomChatConnection extends googleCommon.ChatConnection {
|
|
7
7
|
async formatData(input, parameters) {
|
|
8
8
|
const formattedData = (await super.formatData(input, parameters));
|
|
9
|
-
if (formattedData.generationConfig?.thinkingConfig?.thinkingBudget === -1
|
|
10
|
-
|
|
11
|
-
formattedData.generationConfig.thinkingConfig.includeThoughts
|
|
9
|
+
if (formattedData.generationConfig?.thinkingConfig?.thinkingBudget === -1) {
|
|
10
|
+
// -1 means "let the model decide" - delete the property so the API doesn't receive an invalid value
|
|
11
|
+
if (formattedData.generationConfig.thinkingConfig.includeThoughts === false) {
|
|
12
|
+
formattedData.generationConfig.thinkingConfig.includeThoughts = true;
|
|
13
|
+
}
|
|
14
|
+
delete formattedData.generationConfig.thinkingConfig.thinkingBudget;
|
|
12
15
|
}
|
|
13
16
|
return formattedData;
|
|
14
17
|
}
|
|
@@ -302,11 +305,7 @@ class ChatVertexAI extends googleGauth.ChatGoogle {
|
|
|
302
305
|
return 'LibreChatVertexAI';
|
|
303
306
|
}
|
|
304
307
|
constructor(fields) {
|
|
305
|
-
|
|
306
|
-
if (fields?.thinkingBudget === -1) {
|
|
307
|
-
dynamicThinkingBudget = true;
|
|
308
|
-
fields.thinkingBudget = 1;
|
|
309
|
-
}
|
|
308
|
+
const dynamicThinkingBudget = fields?.thinkingBudget === -1;
|
|
310
309
|
super({
|
|
311
310
|
...fields,
|
|
312
311
|
platformType: 'gcp',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/llm/vertexai/index.ts"],"sourcesContent":["import { ChatGoogle } from '@langchain/google-gauth';\nimport { ChatConnection } from '@langchain/google-common';\nimport type {\n GeminiRequest,\n GoogleAIModelRequestParams,\n GoogleAbstractedClient,\n} from '@langchain/google-common';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { VertexAIClientOptions } from '@/types';\n\nclass CustomChatConnection extends ChatConnection<VertexAIClientOptions> {\n async formatData(\n input: BaseMessage[],\n parameters: GoogleAIModelRequestParams\n ): Promise<unknown> {\n const formattedData = (await super.formatData(\n input,\n parameters\n )) as GeminiRequest;\n if (\n formattedData.generationConfig?.thinkingConfig?.thinkingBudget === -1 &&\n formattedData.generationConfig.thinkingConfig.includeThoughts === false\n ) {\n formattedData.generationConfig.thinkingConfig.includeThoughts = true;\n }\n return formattedData;\n }\n}\n\n/**\n * Integration with Google Vertex AI chat models.\n *\n * Setup:\n * Install `@langchain/google-vertexai` and set your stringified\n * Vertex AI credentials as an environment variable named `GOOGLE_APPLICATION_CREDENTIALS`.\n *\n * ```bash\n * npm install @langchain/google-vertexai\n * export GOOGLE_APPLICATION_CREDENTIALS=\"path/to/credentials\"\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/_langchain_google_vertexai.index.ChatVertexAI.html#constructor.new_ChatVertexAI)\n *\n * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_google_common_types.GoogleAIBaseLanguageModelCallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.withConfig`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.withConfig`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.withConfig({\n * stop: [\"\\n\"],\n * tools: [...],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n * [...],\n * {\n * tool_choice: \"auto\",\n * }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { ChatVertexAI } from '@langchain/google-vertexai';\n *\n * const llm = new ChatVertexAI({\n * model: \"gemini-1.5-pro\",\n * temperature: 0,\n * // other params...\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"J'adore programmer\\\" \\n\\nHere's why this is the best translation:\\n\\n* **J'adore** means \\\"I love\\\" and conveys a strong passion.\\n* **Programmer** is the French verb for \\\"to program.\\\"\\n\\nThis translation is natural and idiomatic in French. \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 63,\n * \"total_tokens\": 72\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n * console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"J'adore programmer\\\" \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {\n * \"finishReason\": \"stop\"\n * },\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 8,\n * \"total_tokens\": 17\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n * full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"J'adore programmer\\\" \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {\n * \"finishReason\": \"stop\"\n * },\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 8,\n * \"total_tokens\": 17\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const GetWeather = {\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const GetPopulation = {\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const llmWithTools = llm.bindTools([GetWeather, GetPopulation]);\n * const aiMsg = await llmWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n * {\n * name: 'GetPopulation',\n * args: { location: 'New York City, NY' },\n * id: '33c1c1f47e2f492799c77d2800a43912',\n * type: 'tool_call'\n * }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const Joke = z.object({\n * setup: z.string().describe(\"The setup of the joke\"),\n * punchline: z.string().describe(\"The punchline to the joke\"),\n * rating: z.number().optional().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llm.withStructuredOutput(Joke, { name: \"Joke\" });\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n * setup: 'What do you call a cat that loves to bowl?',\n * punchline: 'An alley cat!'\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Usage Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForMetadata = await llm.invoke(input);\n * console.log(aiMsgForMetadata.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 9, output_tokens: 8, total_tokens: 17 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Stream Usage Metadata</strong></summary>\n *\n * ```typescript\n * const streamForMetadata = await llm.stream(\n * input,\n * {\n * streamUsage: true\n * }\n * );\n * let fullForMetadata: AIMessageChunk | undefined;\n * for await (const chunk of streamForMetadata) {\n * fullForMetadata = !fullForMetadata ? chunk : concat(fullForMetadata, chunk);\n * }\n * console.log(fullForMetadata?.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 9, output_tokens: 8, total_tokens: 17 }\n * ```\n * </details>\n *\n * <br />\n */\nexport class ChatVertexAI extends ChatGoogle {\n lc_namespace = ['langchain', 'chat_models', 'vertexai'];\n dynamicThinkingBudget = false;\n\n static lc_name(): 'LibreChatVertexAI' {\n return 'LibreChatVertexAI';\n }\n\n constructor(fields?: VertexAIClientOptions) {\n let dynamicThinkingBudget = false;\n if (fields?.thinkingBudget === -1) {\n dynamicThinkingBudget = true;\n fields.thinkingBudget = 1;\n }\n super({\n ...fields,\n platformType: 'gcp',\n });\n this.dynamicThinkingBudget = dynamicThinkingBudget;\n }\n invocationParams(\n options?: this['ParsedCallOptions'] | undefined\n ): GoogleAIModelRequestParams {\n const params = super.invocationParams(options);\n if (this.dynamicThinkingBudget) {\n params.maxReasoningTokens = -1;\n }\n return params;\n }\n\n buildConnection(\n fields: VertexAIClientOptions,\n client: GoogleAbstractedClient\n ): void {\n this.connection = new CustomChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n false\n );\n\n this.streamedConnection = new CustomChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n true\n );\n }\n}\n"],"names":["ChatConnection","ChatGoogle"],"mappings":";;;;;AAUA,MAAM,oBAAqB,SAAQA,2BAAqC,CAAA;AACtE,IAAA,MAAM,UAAU,CACd,KAAoB,EACpB,UAAsC,EAAA;AAEtC,QAAA,MAAM,aAAa,IAAI,MAAM,KAAK,CAAC,UAAU,CAC3C,KAAK,EACL,UAAU,CACX,CAAkB;QACnB,IACE,aAAa,CAAC,gBAAgB,EAAE,cAAc,EAAE,cAAc,KAAK,EAAE;YACrE,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,eAAe,KAAK,KAAK,EACvE;YACA,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI;;AAEtE,QAAA,OAAO,aAAa;;AAEvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyRG;AACG,MAAO,YAAa,SAAQC,sBAAU,CAAA;IAC1C,YAAY,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,UAAU,CAAC;IACvD,qBAAqB,GAAG,KAAK;AAE7B,IAAA,OAAO,OAAO,GAAA;AACZ,QAAA,OAAO,mBAAmB;;AAG5B,IAAA,WAAA,CAAY,MAA8B,EAAA;QACxC,IAAI,qBAAqB,GAAG,KAAK;AACjC,QAAA,IAAI,MAAM,EAAE,cAAc,KAAK,EAAE,EAAE;YACjC,qBAAqB,GAAG,IAAI;AAC5B,YAAA,MAAM,CAAC,cAAc,GAAG,CAAC;;AAE3B,QAAA,KAAK,CAAC;AACJ,YAAA,GAAG,MAAM;AACT,YAAA,YAAY,EAAE,KAAK;AACpB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB;;AAEpD,IAAA,gBAAgB,CACd,OAA+C,EAAA;QAE/C,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAC9C,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,MAAM,CAAC,kBAAkB,GAAG,EAAE;;AAEhC,QAAA,OAAO,MAAM;;IAGf,eAAe,CACb,MAA6B,EAC7B,MAA8B,EAAA;QAE9B,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAoB,CACxC,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,EACtB,IAAI,CAAC,MAAM,EACX,MAAM,EACN,KAAK,CACN;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,oBAAoB,CAChD,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,EACtB,IAAI,CAAC,MAAM,EACX,MAAM,EACN,IAAI,CACL;;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/llm/vertexai/index.ts"],"sourcesContent":["import { ChatGoogle } from '@langchain/google-gauth';\nimport { ChatConnection } from '@langchain/google-common';\nimport type {\n GeminiRequest,\n GoogleAIModelRequestParams,\n GoogleAbstractedClient,\n} from '@langchain/google-common';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { VertexAIClientOptions } from '@/types';\n\nclass CustomChatConnection extends ChatConnection<VertexAIClientOptions> {\n async formatData(\n input: BaseMessage[],\n parameters: GoogleAIModelRequestParams\n ): Promise<unknown> {\n const formattedData = (await super.formatData(\n input,\n parameters\n )) as GeminiRequest;\n if (formattedData.generationConfig?.thinkingConfig?.thinkingBudget === -1) {\n // -1 means \"let the model decide\" - delete the property so the API doesn't receive an invalid value\n if (\n formattedData.generationConfig.thinkingConfig.includeThoughts === false\n ) {\n formattedData.generationConfig.thinkingConfig.includeThoughts = true;\n }\n delete formattedData.generationConfig.thinkingConfig.thinkingBudget;\n }\n return formattedData;\n }\n}\n\n/**\n * Integration with Google Vertex AI chat models.\n *\n * Setup:\n * Install `@langchain/google-vertexai` and set your stringified\n * Vertex AI credentials as an environment variable named `GOOGLE_APPLICATION_CREDENTIALS`.\n *\n * ```bash\n * npm install @langchain/google-vertexai\n * export GOOGLE_APPLICATION_CREDENTIALS=\"path/to/credentials\"\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/_langchain_google_vertexai.index.ChatVertexAI.html#constructor.new_ChatVertexAI)\n *\n * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_google_common_types.GoogleAIBaseLanguageModelCallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.withConfig`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.withConfig`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.withConfig({\n * stop: [\"\\n\"],\n * tools: [...],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n * [...],\n * {\n * tool_choice: \"auto\",\n * }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { ChatVertexAI } from '@langchain/google-vertexai';\n *\n * const llm = new ChatVertexAI({\n * model: \"gemini-1.5-pro\",\n * temperature: 0,\n * // other params...\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"J'adore programmer\\\" \\n\\nHere's why this is the best translation:\\n\\n* **J'adore** means \\\"I love\\\" and conveys a strong passion.\\n* **Programmer** is the French verb for \\\"to program.\\\"\\n\\nThis translation is natural and idiomatic in French. \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 63,\n * \"total_tokens\": 72\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n * console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"J'adore programmer\\\" \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {\n * \"finishReason\": \"stop\"\n * },\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 8,\n * \"total_tokens\": 17\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n * full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"J'adore programmer\\\" \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {\n * \"finishReason\": \"stop\"\n * },\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 8,\n * \"total_tokens\": 17\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const GetWeather = {\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const GetPopulation = {\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const llmWithTools = llm.bindTools([GetWeather, GetPopulation]);\n * const aiMsg = await llmWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n * {\n * name: 'GetPopulation',\n * args: { location: 'New York City, NY' },\n * id: '33c1c1f47e2f492799c77d2800a43912',\n * type: 'tool_call'\n * }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const Joke = z.object({\n * setup: z.string().describe(\"The setup of the joke\"),\n * punchline: z.string().describe(\"The punchline to the joke\"),\n * rating: z.number().optional().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llm.withStructuredOutput(Joke, { name: \"Joke\" });\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n * setup: 'What do you call a cat that loves to bowl?',\n * punchline: 'An alley cat!'\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Usage Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForMetadata = await llm.invoke(input);\n * console.log(aiMsgForMetadata.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 9, output_tokens: 8, total_tokens: 17 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Stream Usage Metadata</strong></summary>\n *\n * ```typescript\n * const streamForMetadata = await llm.stream(\n * input,\n * {\n * streamUsage: true\n * }\n * );\n * let fullForMetadata: AIMessageChunk | undefined;\n * for await (const chunk of streamForMetadata) {\n * fullForMetadata = !fullForMetadata ? chunk : concat(fullForMetadata, chunk);\n * }\n * console.log(fullForMetadata?.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 9, output_tokens: 8, total_tokens: 17 }\n * ```\n * </details>\n *\n * <br />\n */\nexport class ChatVertexAI extends ChatGoogle {\n lc_namespace = ['langchain', 'chat_models', 'vertexai'];\n dynamicThinkingBudget = false;\n\n static lc_name(): 'LibreChatVertexAI' {\n return 'LibreChatVertexAI';\n }\n\n constructor(fields?: VertexAIClientOptions) {\n const dynamicThinkingBudget = fields?.thinkingBudget === -1;\n super({\n ...fields,\n platformType: 'gcp',\n });\n this.dynamicThinkingBudget = dynamicThinkingBudget;\n }\n invocationParams(\n options?: this['ParsedCallOptions'] | undefined\n ): GoogleAIModelRequestParams {\n const params = super.invocationParams(options);\n if (this.dynamicThinkingBudget) {\n params.maxReasoningTokens = -1;\n }\n return params;\n }\n\n buildConnection(\n fields: VertexAIClientOptions,\n client: GoogleAbstractedClient\n ): void {\n this.connection = new CustomChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n false\n );\n\n this.streamedConnection = new CustomChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n true\n );\n }\n}\n"],"names":["ChatConnection","ChatGoogle"],"mappings":";;;;;AAUA,MAAM,oBAAqB,SAAQA,2BAAqC,CAAA;AACtE,IAAA,MAAM,UAAU,CACd,KAAoB,EACpB,UAAsC,EAAA;AAEtC,QAAA,MAAM,aAAa,IAAI,MAAM,KAAK,CAAC,UAAU,CAC3C,KAAK,EACL,UAAU,CACX,CAAkB;QACnB,IAAI,aAAa,CAAC,gBAAgB,EAAE,cAAc,EAAE,cAAc,KAAK,EAAE,EAAE;;YAEzE,IACE,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,eAAe,KAAK,KAAK,EACvE;gBACA,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI;;AAEtE,YAAA,OAAO,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,cAAc;;AAErE,QAAA,OAAO,aAAa;;AAEvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyRG;AACG,MAAO,YAAa,SAAQC,sBAAU,CAAA;IAC1C,YAAY,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,UAAU,CAAC;IACvD,qBAAqB,GAAG,KAAK;AAE7B,IAAA,OAAO,OAAO,GAAA;AACZ,QAAA,OAAO,mBAAmB;;AAG5B,IAAA,WAAA,CAAY,MAA8B,EAAA;QACxC,MAAM,qBAAqB,GAAG,MAAM,EAAE,cAAc,KAAK,EAAE;AAC3D,QAAA,KAAK,CAAC;AACJ,YAAA,GAAG,MAAM;AACT,YAAA,YAAY,EAAE,KAAK;AACpB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB;;AAEpD,IAAA,gBAAgB,CACd,OAA+C,EAAA;QAE/C,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAC9C,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,MAAM,CAAC,kBAAkB,GAAG,EAAE;;AAEhC,QAAA,OAAO,MAAM;;IAGf,eAAe,CACb,MAA6B,EAC7B,MAA8B,EAAA;QAE9B,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAoB,CACxC,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,EACtB,IAAI,CAAC,MAAM,EACX,MAAM,EACN,KAAK,CACN;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,oBAAoB,CAChD,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,EACtB,IAAI,CAAC,MAAM,EACX,MAAM,EACN,IAAI,CACL;;AAEJ;;;;"}
|
package/dist/cjs/stream.cjs
CHANGED
|
@@ -337,6 +337,8 @@ function createContentAggregator() {
|
|
|
337
337
|
const contentParts = [];
|
|
338
338
|
const stepMap = new Map();
|
|
339
339
|
const toolCallIdMap = new Map();
|
|
340
|
+
// Track agentId for each content index (for parallel agent attribution)
|
|
341
|
+
const contentAgentMap = new Map();
|
|
340
342
|
const updateContent = (index, contentPart, finalUpdate = false) => {
|
|
341
343
|
if (!contentPart) {
|
|
342
344
|
console.warn('No content part found in \'updateContent\'');
|
|
@@ -437,11 +439,20 @@ function createContentAggregator() {
|
|
|
437
439
|
tool_call: newToolCall,
|
|
438
440
|
};
|
|
439
441
|
}
|
|
442
|
+
// Apply agentId to content part for parallel execution attribution
|
|
443
|
+
const agentId = contentAgentMap.get(index);
|
|
444
|
+
if (agentId !== undefined) {
|
|
445
|
+
contentParts[index].agentId = agentId;
|
|
446
|
+
}
|
|
440
447
|
};
|
|
441
448
|
const aggregateContent = ({ event, data, }) => {
|
|
442
449
|
if (event === _enum.GraphEvents.ON_RUN_STEP) {
|
|
443
450
|
const runStep = data;
|
|
444
451
|
stepMap.set(runStep.id, runStep);
|
|
452
|
+
// Track agentId for this content index (for parallel execution)
|
|
453
|
+
if (runStep.agentId != null && runStep.agentId !== '') {
|
|
454
|
+
contentAgentMap.set(runStep.index, runStep.agentId);
|
|
455
|
+
}
|
|
445
456
|
// Store tool call IDs if present
|
|
446
457
|
if (runStep.stepDetails.type === _enum.StepTypes.TOOL_CALLS &&
|
|
447
458
|
runStep.stepDetails.tool_calls) {
|
|
@@ -536,7 +547,7 @@ function createContentAggregator() {
|
|
|
536
547
|
updateContent(runStep.index, contentPart, true);
|
|
537
548
|
}
|
|
538
549
|
};
|
|
539
|
-
return { contentParts, aggregateContent, stepMap };
|
|
550
|
+
return { contentParts, aggregateContent, stepMap, contentAgentMap };
|
|
540
551
|
}
|
|
541
552
|
|
|
542
553
|
exports.ChatModelStreamHandler = ChatModelStreamHandler;
|
package/dist/cjs/stream.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.cjs","sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport type { ChatOpenAIReasoningSummary } from '@langchain/openai';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { StandardGraph } from '@/graphs';\nimport type * as t from '@/types';\nimport {\n ToolCallTypes,\n ContentTypes,\n GraphEvents,\n StepTypes,\n Providers,\n} from '@/common';\nimport {\n handleServerToolResult,\n handleToolCallChunks,\n handleToolCalls,\n} from '@/tools/handlers';\nimport { getMessageId } from '@/messages';\n\n/**\n * Parses content to extract thinking sections enclosed in <think> tags using string operations\n * @param content The content to parse\n * @returns An object with separated text and thinking content\n */\nfunction parseThinkingContent(content: string): {\n text: string;\n thinking: string;\n} {\n // If no think tags, return the original content as text\n if (!content.includes('<think>')) {\n return { text: content, thinking: '' };\n }\n\n let textResult = '';\n const thinkingResult: string[] = [];\n let position = 0;\n\n while (position < content.length) {\n const thinkStart = content.indexOf('<think>', position);\n\n if (thinkStart === -1) {\n // No more think tags, add the rest and break\n textResult += content.slice(position);\n break;\n }\n\n // Add text before the think tag\n textResult += content.slice(position, thinkStart);\n\n const thinkEnd = content.indexOf('</think>', thinkStart);\n if (thinkEnd === -1) {\n // Malformed input, no closing tag\n textResult += content.slice(thinkStart);\n break;\n }\n\n // Add the thinking content\n const thinkContent = content.slice(thinkStart + 7, thinkEnd);\n thinkingResult.push(thinkContent);\n\n // Move position to after the think tag\n position = thinkEnd + 8; // 8 is the length of '</think>'\n }\n\n return {\n text: textResult.trim(),\n thinking: thinkingResult.join('\\n').trim(),\n };\n}\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport function getChunkContent({\n chunk,\n provider,\n reasoningKey,\n}: {\n chunk?: Partial<AIMessageChunk>;\n provider?: Providers;\n reasoningKey: 'reasoning_content' | 'reasoning';\n}): string | t.MessageContentComplex[] | undefined {\n if (\n (provider === Providers.OPENAI || provider === Providers.AZURE) &&\n (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text != null &&\n ((\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text?.length ?? 0) > 0\n ) {\n return (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text;\n }\n /**\n * For OpenRouter, reasoning is stored in additional_kwargs.reasoning (not reasoning_content).\n * NOTE: We intentionally do NOT extract text from reasoning_details here.\n * The reasoning_details array contains the FULL accumulated reasoning text (set only on final chunk),\n * but individual reasoning tokens are already streamed via additional_kwargs.reasoning.\n * Extracting from reasoning_details would cause duplication.\n * The reasoning_details is only used for:\n * 1. Detecting reasoning mode in handleReasoning()\n * 2. Final message storage (for thought signatures)\n */\n if (provider === Providers.OPENROUTER) {\n // Content presence signals end of reasoning phase - prefer content over reasoning\n // This handles transitional chunks that may have both reasoning and content\n if (typeof chunk?.content === 'string' && chunk.content !== '') {\n return chunk.content;\n }\n const reasoning = chunk?.additional_kwargs?.reasoning as string | undefined;\n if (reasoning != null && reasoning !== '') {\n return reasoning;\n }\n return chunk?.content;\n }\n return (\n ((chunk?.additional_kwargs?.[reasoningKey] as string | undefined) ?? '') ||\n chunk?.content\n );\n}\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n async handle(\n event: string,\n data: t.StreamEventData,\n metadata?: Record<string, unknown>,\n graph?: StandardGraph\n ): Promise<void> {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const agentContext = graph.getAgentContext(metadata);\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n const content = getChunkContent({\n chunk,\n reasoningKey: agentContext.reasoningKey,\n provider: agentContext.provider,\n });\n const skipHandling = await handleServerToolResult({\n graph,\n content,\n metadata,\n agentContext,\n });\n if (skipHandling) {\n return;\n }\n this.handleReasoning(chunk, agentContext);\n let hasToolCalls = false;\n if (\n chunk.tool_calls &&\n chunk.tool_calls.length > 0 &&\n chunk.tool_calls.every(\n (tc) =>\n tc.id != null &&\n tc.id !== '' &&\n (tc as Partial<ToolCall>).name != null &&\n tc.name !== ''\n )\n ) {\n hasToolCalls = true;\n await handleToolCalls(chunk.tool_calls, metadata, graph);\n }\n\n const hasToolCallChunks =\n (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const isEmptyContent =\n typeof content === 'undefined' ||\n !content.length ||\n (typeof content === 'string' && !content);\n\n /** Set a preliminary message ID if found in empty chunk */\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n if (\n isEmptyChunk &&\n (chunk.id ?? '') !== '' &&\n !graph.prelimMessageIdsByStepKey.has(chunk.id ?? '')\n ) {\n const stepKey = graph.getStepKey(metadata);\n graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id ?? '');\n } else if (isEmptyChunk) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n\n if (\n hasToolCallChunks &&\n chunk.tool_call_chunks &&\n chunk.tool_call_chunks.length &&\n typeof chunk.tool_call_chunks[0]?.index === 'number'\n ) {\n await handleToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n metadata,\n });\n }\n\n if (isEmptyContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n }\n\n const stepId = graph.getStepIdByKey(stepKey);\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (\n hasToolCallChunks &&\n (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)\n ) {\n return;\n } else if (typeof content === 'string') {\n if (agentContext.currentTokenType === ContentTypes.TEXT) {\n await graph.dispatchMessageDelta(stepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n });\n } else if (agentContext.currentTokenType === 'think_and_text') {\n const { text, thinking } = parseThinkingContent(content);\n if (thinking) {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: thinking,\n },\n ],\n });\n }\n if (text) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n const newStepKey = graph.getStepKey(metadata);\n const message_id = getMessageId(newStepKey, graph) ?? '';\n await graph.dispatchRunStep(\n newStepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n\n const newStepId = graph.getStepIdByKey(newStepKey);\n await graph.dispatchMessageDelta(newStepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: text,\n },\n ],\n });\n }\n } else {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n });\n }\n } else if (\n content.every((c) => c.type?.startsWith(ContentTypes.TEXT) ?? false)\n ) {\n await graph.dispatchMessageDelta(stepId, {\n content,\n });\n } else if (\n content.every(\n (c) =>\n (c.type?.startsWith(ContentTypes.THINKING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false)\n )\n ) {\n await graph.dispatchReasoningDelta(stepId, {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think:\n (c as t.ThinkingContentText).thinking ??\n (c as Partial<t.GoogleReasoningContentText>).reasoning ??\n (c as Partial<t.BedrockReasoningContentText>).reasoningText?.text ??\n '',\n })),\n });\n }\n }\n handleReasoning(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n ): void {\n let reasoning_content = chunk.additional_kwargs?.[\n agentContext.reasoningKey\n ] as string | Partial<ChatOpenAIReasoningSummary> | undefined;\n if (\n Array.isArray(chunk.content) &&\n (chunk.content[0]?.type === ContentTypes.THINKING ||\n chunk.content[0]?.type === ContentTypes.REASONING ||\n chunk.content[0]?.type === ContentTypes.REASONING_CONTENT)\n ) {\n reasoning_content = 'valid';\n } else if (\n (agentContext.provider === Providers.OPENAI ||\n agentContext.provider === Providers.AZURE) &&\n reasoning_content != null &&\n typeof reasoning_content !== 'string' &&\n reasoning_content.summary?.[0]?.text != null &&\n reasoning_content.summary[0].text\n ) {\n reasoning_content = 'valid';\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n // Only set reasoning as valid if content is NOT present (content signals end of reasoning)\n (chunk.content == null || chunk.content === '') &&\n // Check for reasoning_details (final chunk) OR reasoning string (intermediate chunks)\n ((chunk.additional_kwargs?.reasoning_details != null &&\n Array.isArray(chunk.additional_kwargs.reasoning_details) &&\n chunk.additional_kwargs.reasoning_details.length > 0) ||\n (typeof chunk.additional_kwargs?.reasoning === 'string' &&\n chunk.additional_kwargs.reasoning !== ''))\n ) {\n reasoning_content = 'valid';\n }\n if (\n reasoning_content != null &&\n reasoning_content !== '' &&\n (chunk.content == null ||\n chunk.content === '' ||\n reasoning_content === 'valid')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n return;\n } else if (\n agentContext.tokenTypeSwitch === 'reasoning' &&\n agentContext.currentTokenType !== ContentTypes.TEXT &&\n ((chunk.content != null && chunk.content !== '') ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0)\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>') &&\n chunk.content.includes('</think>')\n ) {\n agentContext.currentTokenType = 'think_and_text';\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n agentContext.lastToken != null &&\n agentContext.lastToken.includes('</think>')\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n agentContext.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n\n const updateContent = (\n index: number,\n contentPart?: t.MessageContentComplex,\n finalUpdate = false\n ): void => {\n if (!contentPart) {\n console.warn('No content part found in \\'updateContent\\'');\n return;\n }\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index]) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.AGENT_UPDATE) &&\n ContentTypes.AGENT_UPDATE in contentPart &&\n contentPart.agent_update != null\n ) {\n const update: t.AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE,\n agent_update: contentPart.agent_update,\n };\n\n contentParts[index] = update;\n } else if (\n partType === ContentTypes.IMAGE_URL &&\n 'image_url' in contentPart\n ) {\n const currentContent = contentParts[index] as {\n type: 'image_url';\n image_url: string;\n };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (\n partType === ContentTypes.TOOL_CALL &&\n 'tool_call' in contentPart\n ) {\n const incomingName = contentPart.tool_call.name;\n const incomingId = contentPart.tool_call.id;\n const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;\n\n // When we receive a tool call with a name, it's the complete tool call\n // Consolidate with any previously accumulated args from chunks\n const hasValidName = incomingName != null && incomingName !== '';\n\n // Only process if incoming has a valid name (complete tool call)\n // or if we're doing a final update with complete data\n if (!hasValidName && !finalUpdate) {\n return;\n }\n\n const existingContent = contentParts[index] as\n | (Omit<t.ToolCallContent, 'tool_call'> & {\n tool_call?: t.ToolCallPart;\n })\n | undefined;\n\n /** When args are a valid object, they are likely already invoked */\n let args =\n finalUpdate ||\n typeof existingContent?.tool_call?.args === 'object' ||\n typeof toolCallArgs === 'object'\n ? contentPart.tool_call.args\n : (existingContent?.tool_call?.args ?? '') + (toolCallArgs ?? '');\n if (\n finalUpdate &&\n args == null &&\n existingContent?.tool_call?.args != null\n ) {\n args = existingContent.tool_call.args;\n }\n\n const id =\n getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ??\n '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n };\n\n const aggregateContent = ({\n event,\n data,\n }: {\n event: GraphEvents;\n data:\n | t.RunStep\n | t.AgentUpdate\n | t.MessageDeltaEvent\n | t.RunStepDeltaEvent\n | { result: t.ToolEndEvent };\n }): void => {\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Store tool call IDs if present\n if (\n runStep.stepDetails.type === StepTypes.TOOL_CALLS &&\n runStep.stepDetails.tool_calls\n ) {\n (runStep.stepDetails.tool_calls as ToolCall[]).forEach((toolCall) => {\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCall.args,\n name: toolCall.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n if (messageDelta.delta.content) {\n const contentPart = Array.isArray(messageDelta.delta.content)\n ? messageDelta.delta.content[0]\n : messageDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (\n event === GraphEvents.ON_AGENT_UPDATE &&\n (data as t.AgentUpdate | undefined)?.agent_update\n ) {\n const contentPart = data as t.AgentUpdate | undefined;\n if (!contentPart) {\n return;\n }\n updateContent(contentPart.agent_update.index, contentPart);\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n if (reasoningDelta.delta.content) {\n const contentPart = Array.isArray(reasoningDelta.delta.content)\n ? reasoningDelta.delta.content[0]\n : reasoningDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n const toolCallId = toolCallIdMap.get(runStepDelta.id);\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as { result: t.ToolEndEvent };\n\n const { id: stepId } = result;\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn(\n 'No run step or runId found for completed tool call event'\n );\n return;\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: result.tool_call,\n };\n\n updateContent(runStep.index, contentPart, true);\n }\n };\n\n return { contentParts, aggregateContent, stepMap };\n}\n"],"names":["Providers","handleServerToolResult","handleToolCalls","handleToolCallChunks","getMessageId","StepTypes","ContentTypes","ToolCallTypes","GraphEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.cjs","sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport type { ChatOpenAIReasoningSummary } from '@langchain/openai';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { StandardGraph } from '@/graphs';\nimport type * as t from '@/types';\nimport {\n ToolCallTypes,\n ContentTypes,\n GraphEvents,\n StepTypes,\n Providers,\n} from '@/common';\nimport {\n handleServerToolResult,\n handleToolCallChunks,\n handleToolCalls,\n} from '@/tools/handlers';\nimport { getMessageId } from '@/messages';\n\n/**\n * Parses content to extract thinking sections enclosed in <think> tags using string operations\n * @param content The content to parse\n * @returns An object with separated text and thinking content\n */\nfunction parseThinkingContent(content: string): {\n text: string;\n thinking: string;\n} {\n // If no think tags, return the original content as text\n if (!content.includes('<think>')) {\n return { text: content, thinking: '' };\n }\n\n let textResult = '';\n const thinkingResult: string[] = [];\n let position = 0;\n\n while (position < content.length) {\n const thinkStart = content.indexOf('<think>', position);\n\n if (thinkStart === -1) {\n // No more think tags, add the rest and break\n textResult += content.slice(position);\n break;\n }\n\n // Add text before the think tag\n textResult += content.slice(position, thinkStart);\n\n const thinkEnd = content.indexOf('</think>', thinkStart);\n if (thinkEnd === -1) {\n // Malformed input, no closing tag\n textResult += content.slice(thinkStart);\n break;\n }\n\n // Add the thinking content\n const thinkContent = content.slice(thinkStart + 7, thinkEnd);\n thinkingResult.push(thinkContent);\n\n // Move position to after the think tag\n position = thinkEnd + 8; // 8 is the length of '</think>'\n }\n\n return {\n text: textResult.trim(),\n thinking: thinkingResult.join('\\n').trim(),\n };\n}\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport function getChunkContent({\n chunk,\n provider,\n reasoningKey,\n}: {\n chunk?: Partial<AIMessageChunk>;\n provider?: Providers;\n reasoningKey: 'reasoning_content' | 'reasoning';\n}): string | t.MessageContentComplex[] | undefined {\n if (\n (provider === Providers.OPENAI || provider === Providers.AZURE) &&\n (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text != null &&\n ((\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text?.length ?? 0) > 0\n ) {\n return (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text;\n }\n /**\n * For OpenRouter, reasoning is stored in additional_kwargs.reasoning (not reasoning_content).\n * NOTE: We intentionally do NOT extract text from reasoning_details here.\n * The reasoning_details array contains the FULL accumulated reasoning text (set only on final chunk),\n * but individual reasoning tokens are already streamed via additional_kwargs.reasoning.\n * Extracting from reasoning_details would cause duplication.\n * The reasoning_details is only used for:\n * 1. Detecting reasoning mode in handleReasoning()\n * 2. Final message storage (for thought signatures)\n */\n if (provider === Providers.OPENROUTER) {\n // Content presence signals end of reasoning phase - prefer content over reasoning\n // This handles transitional chunks that may have both reasoning and content\n if (typeof chunk?.content === 'string' && chunk.content !== '') {\n return chunk.content;\n }\n const reasoning = chunk?.additional_kwargs?.reasoning as string | undefined;\n if (reasoning != null && reasoning !== '') {\n return reasoning;\n }\n return chunk?.content;\n }\n return (\n ((chunk?.additional_kwargs?.[reasoningKey] as string | undefined) ?? '') ||\n chunk?.content\n );\n}\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n async handle(\n event: string,\n data: t.StreamEventData,\n metadata?: Record<string, unknown>,\n graph?: StandardGraph\n ): Promise<void> {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const agentContext = graph.getAgentContext(metadata);\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n const content = getChunkContent({\n chunk,\n reasoningKey: agentContext.reasoningKey,\n provider: agentContext.provider,\n });\n const skipHandling = await handleServerToolResult({\n graph,\n content,\n metadata,\n agentContext,\n });\n if (skipHandling) {\n return;\n }\n this.handleReasoning(chunk, agentContext);\n let hasToolCalls = false;\n if (\n chunk.tool_calls &&\n chunk.tool_calls.length > 0 &&\n chunk.tool_calls.every(\n (tc) =>\n tc.id != null &&\n tc.id !== '' &&\n (tc as Partial<ToolCall>).name != null &&\n tc.name !== ''\n )\n ) {\n hasToolCalls = true;\n await handleToolCalls(chunk.tool_calls, metadata, graph);\n }\n\n const hasToolCallChunks =\n (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const isEmptyContent =\n typeof content === 'undefined' ||\n !content.length ||\n (typeof content === 'string' && !content);\n\n /** Set a preliminary message ID if found in empty chunk */\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n if (\n isEmptyChunk &&\n (chunk.id ?? '') !== '' &&\n !graph.prelimMessageIdsByStepKey.has(chunk.id ?? '')\n ) {\n const stepKey = graph.getStepKey(metadata);\n graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id ?? '');\n } else if (isEmptyChunk) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n\n if (\n hasToolCallChunks &&\n chunk.tool_call_chunks &&\n chunk.tool_call_chunks.length &&\n typeof chunk.tool_call_chunks[0]?.index === 'number'\n ) {\n await handleToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n metadata,\n });\n }\n\n if (isEmptyContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n }\n\n const stepId = graph.getStepIdByKey(stepKey);\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (\n hasToolCallChunks &&\n (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)\n ) {\n return;\n } else if (typeof content === 'string') {\n if (agentContext.currentTokenType === ContentTypes.TEXT) {\n await graph.dispatchMessageDelta(stepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n });\n } else if (agentContext.currentTokenType === 'think_and_text') {\n const { text, thinking } = parseThinkingContent(content);\n if (thinking) {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: thinking,\n },\n ],\n });\n }\n if (text) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n const newStepKey = graph.getStepKey(metadata);\n const message_id = getMessageId(newStepKey, graph) ?? '';\n await graph.dispatchRunStep(\n newStepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n\n const newStepId = graph.getStepIdByKey(newStepKey);\n await graph.dispatchMessageDelta(newStepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: text,\n },\n ],\n });\n }\n } else {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n });\n }\n } else if (\n content.every((c) => c.type?.startsWith(ContentTypes.TEXT) ?? false)\n ) {\n await graph.dispatchMessageDelta(stepId, {\n content,\n });\n } else if (\n content.every(\n (c) =>\n (c.type?.startsWith(ContentTypes.THINKING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false)\n )\n ) {\n await graph.dispatchReasoningDelta(stepId, {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think:\n (c as t.ThinkingContentText).thinking ??\n (c as Partial<t.GoogleReasoningContentText>).reasoning ??\n (c as Partial<t.BedrockReasoningContentText>).reasoningText?.text ??\n '',\n })),\n });\n }\n }\n handleReasoning(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n ): void {\n let reasoning_content = chunk.additional_kwargs?.[\n agentContext.reasoningKey\n ] as string | Partial<ChatOpenAIReasoningSummary> | undefined;\n if (\n Array.isArray(chunk.content) &&\n (chunk.content[0]?.type === ContentTypes.THINKING ||\n chunk.content[0]?.type === ContentTypes.REASONING ||\n chunk.content[0]?.type === ContentTypes.REASONING_CONTENT)\n ) {\n reasoning_content = 'valid';\n } else if (\n (agentContext.provider === Providers.OPENAI ||\n agentContext.provider === Providers.AZURE) &&\n reasoning_content != null &&\n typeof reasoning_content !== 'string' &&\n reasoning_content.summary?.[0]?.text != null &&\n reasoning_content.summary[0].text\n ) {\n reasoning_content = 'valid';\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n // Only set reasoning as valid if content is NOT present (content signals end of reasoning)\n (chunk.content == null || chunk.content === '') &&\n // Check for reasoning_details (final chunk) OR reasoning string (intermediate chunks)\n ((chunk.additional_kwargs?.reasoning_details != null &&\n Array.isArray(chunk.additional_kwargs.reasoning_details) &&\n chunk.additional_kwargs.reasoning_details.length > 0) ||\n (typeof chunk.additional_kwargs?.reasoning === 'string' &&\n chunk.additional_kwargs.reasoning !== ''))\n ) {\n reasoning_content = 'valid';\n }\n if (\n reasoning_content != null &&\n reasoning_content !== '' &&\n (chunk.content == null ||\n chunk.content === '' ||\n reasoning_content === 'valid')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n return;\n } else if (\n agentContext.tokenTypeSwitch === 'reasoning' &&\n agentContext.currentTokenType !== ContentTypes.TEXT &&\n ((chunk.content != null && chunk.content !== '') ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0)\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>') &&\n chunk.content.includes('</think>')\n ) {\n agentContext.currentTokenType = 'think_and_text';\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n agentContext.lastToken != null &&\n agentContext.lastToken.includes('</think>')\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n agentContext.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n // Track agentId for each content index (for parallel agent attribution)\n const contentAgentMap = new Map<number, string>();\n\n const updateContent = (\n index: number,\n contentPart?: t.MessageContentComplex,\n finalUpdate = false\n ): void => {\n if (!contentPart) {\n console.warn('No content part found in \\'updateContent\\'');\n return;\n }\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index]) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.AGENT_UPDATE) &&\n ContentTypes.AGENT_UPDATE in contentPart &&\n contentPart.agent_update != null\n ) {\n const update: t.AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE,\n agent_update: contentPart.agent_update,\n };\n\n contentParts[index] = update;\n } else if (\n partType === ContentTypes.IMAGE_URL &&\n 'image_url' in contentPart\n ) {\n const currentContent = contentParts[index] as {\n type: 'image_url';\n image_url: string;\n };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (\n partType === ContentTypes.TOOL_CALL &&\n 'tool_call' in contentPart\n ) {\n const incomingName = contentPart.tool_call.name;\n const incomingId = contentPart.tool_call.id;\n const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;\n\n // When we receive a tool call with a name, it's the complete tool call\n // Consolidate with any previously accumulated args from chunks\n const hasValidName = incomingName != null && incomingName !== '';\n\n // Only process if incoming has a valid name (complete tool call)\n // or if we're doing a final update with complete data\n if (!hasValidName && !finalUpdate) {\n return;\n }\n\n const existingContent = contentParts[index] as\n | (Omit<t.ToolCallContent, 'tool_call'> & {\n tool_call?: t.ToolCallPart;\n })\n | undefined;\n\n /** When args are a valid object, they are likely already invoked */\n let args =\n finalUpdate ||\n typeof existingContent?.tool_call?.args === 'object' ||\n typeof toolCallArgs === 'object'\n ? contentPart.tool_call.args\n : (existingContent?.tool_call?.args ?? '') + (toolCallArgs ?? '');\n if (\n finalUpdate &&\n args == null &&\n existingContent?.tool_call?.args != null\n ) {\n args = existingContent.tool_call.args;\n }\n\n const id =\n getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ??\n '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n\n // Apply agentId to content part for parallel execution attribution\n const agentId = contentAgentMap.get(index);\n if (agentId !== undefined) {\n (\n contentParts[index] as t.MessageContentComplex & { agentId?: string }\n ).agentId = agentId;\n }\n };\n\n const aggregateContent = ({\n event,\n data,\n }: {\n event: GraphEvents;\n data:\n | t.RunStep\n | t.AgentUpdate\n | t.MessageDeltaEvent\n | t.RunStepDeltaEvent\n | { result: t.ToolEndEvent };\n }): void => {\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Track agentId for this content index (for parallel execution)\n if (runStep.agentId != null && runStep.agentId !== '') {\n contentAgentMap.set(runStep.index, runStep.agentId);\n }\n\n // Store tool call IDs if present\n if (\n runStep.stepDetails.type === StepTypes.TOOL_CALLS &&\n runStep.stepDetails.tool_calls\n ) {\n (runStep.stepDetails.tool_calls as ToolCall[]).forEach((toolCall) => {\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCall.args,\n name: toolCall.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n if (messageDelta.delta.content) {\n const contentPart = Array.isArray(messageDelta.delta.content)\n ? messageDelta.delta.content[0]\n : messageDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (\n event === GraphEvents.ON_AGENT_UPDATE &&\n (data as t.AgentUpdate | undefined)?.agent_update\n ) {\n const contentPart = data as t.AgentUpdate | undefined;\n if (!contentPart) {\n return;\n }\n updateContent(contentPart.agent_update.index, contentPart);\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n if (reasoningDelta.delta.content) {\n const contentPart = Array.isArray(reasoningDelta.delta.content)\n ? reasoningDelta.delta.content[0]\n : reasoningDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n const toolCallId = toolCallIdMap.get(runStepDelta.id);\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as { result: t.ToolEndEvent };\n\n const { id: stepId } = result;\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn(\n 'No run step or runId found for completed tool call event'\n );\n return;\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: result.tool_call,\n };\n\n updateContent(runStep.index, contentPart, true);\n }\n };\n\n return { contentParts, aggregateContent, stepMap, contentAgentMap };\n}\n"],"names":["Providers","handleServerToolResult","handleToolCalls","handleToolCallChunks","getMessageId","StepTypes","ContentTypes","ToolCallTypes","GraphEvents"],"mappings":"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"}
|
|
@@ -4,9 +4,12 @@ import { ChatConnection } from '@langchain/google-common';
|
|
|
4
4
|
class CustomChatConnection extends ChatConnection {
|
|
5
5
|
async formatData(input, parameters) {
|
|
6
6
|
const formattedData = (await super.formatData(input, parameters));
|
|
7
|
-
if (formattedData.generationConfig?.thinkingConfig?.thinkingBudget === -1
|
|
8
|
-
|
|
9
|
-
formattedData.generationConfig.thinkingConfig.includeThoughts
|
|
7
|
+
if (formattedData.generationConfig?.thinkingConfig?.thinkingBudget === -1) {
|
|
8
|
+
// -1 means "let the model decide" - delete the property so the API doesn't receive an invalid value
|
|
9
|
+
if (formattedData.generationConfig.thinkingConfig.includeThoughts === false) {
|
|
10
|
+
formattedData.generationConfig.thinkingConfig.includeThoughts = true;
|
|
11
|
+
}
|
|
12
|
+
delete formattedData.generationConfig.thinkingConfig.thinkingBudget;
|
|
10
13
|
}
|
|
11
14
|
return formattedData;
|
|
12
15
|
}
|
|
@@ -300,11 +303,7 @@ class ChatVertexAI extends ChatGoogle {
|
|
|
300
303
|
return 'LibreChatVertexAI';
|
|
301
304
|
}
|
|
302
305
|
constructor(fields) {
|
|
303
|
-
|
|
304
|
-
if (fields?.thinkingBudget === -1) {
|
|
305
|
-
dynamicThinkingBudget = true;
|
|
306
|
-
fields.thinkingBudget = 1;
|
|
307
|
-
}
|
|
306
|
+
const dynamicThinkingBudget = fields?.thinkingBudget === -1;
|
|
308
307
|
super({
|
|
309
308
|
...fields,
|
|
310
309
|
platformType: 'gcp',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/llm/vertexai/index.ts"],"sourcesContent":["import { ChatGoogle } from '@langchain/google-gauth';\nimport { ChatConnection } from '@langchain/google-common';\nimport type {\n GeminiRequest,\n GoogleAIModelRequestParams,\n GoogleAbstractedClient,\n} from '@langchain/google-common';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { VertexAIClientOptions } from '@/types';\n\nclass CustomChatConnection extends ChatConnection<VertexAIClientOptions> {\n async formatData(\n input: BaseMessage[],\n parameters: GoogleAIModelRequestParams\n ): Promise<unknown> {\n const formattedData = (await super.formatData(\n input,\n parameters\n )) as GeminiRequest;\n if (\n formattedData.generationConfig?.thinkingConfig?.thinkingBudget === -1 &&\n formattedData.generationConfig.thinkingConfig.includeThoughts === false\n ) {\n formattedData.generationConfig.thinkingConfig.includeThoughts = true;\n }\n return formattedData;\n }\n}\n\n/**\n * Integration with Google Vertex AI chat models.\n *\n * Setup:\n * Install `@langchain/google-vertexai` and set your stringified\n * Vertex AI credentials as an environment variable named `GOOGLE_APPLICATION_CREDENTIALS`.\n *\n * ```bash\n * npm install @langchain/google-vertexai\n * export GOOGLE_APPLICATION_CREDENTIALS=\"path/to/credentials\"\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/_langchain_google_vertexai.index.ChatVertexAI.html#constructor.new_ChatVertexAI)\n *\n * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_google_common_types.GoogleAIBaseLanguageModelCallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.withConfig`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.withConfig`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.withConfig({\n * stop: [\"\\n\"],\n * tools: [...],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n * [...],\n * {\n * tool_choice: \"auto\",\n * }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { ChatVertexAI } from '@langchain/google-vertexai';\n *\n * const llm = new ChatVertexAI({\n * model: \"gemini-1.5-pro\",\n * temperature: 0,\n * // other params...\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"J'adore programmer\\\" \\n\\nHere's why this is the best translation:\\n\\n* **J'adore** means \\\"I love\\\" and conveys a strong passion.\\n* **Programmer** is the French verb for \\\"to program.\\\"\\n\\nThis translation is natural and idiomatic in French. \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 63,\n * \"total_tokens\": 72\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n * console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"J'adore programmer\\\" \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {\n * \"finishReason\": \"stop\"\n * },\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 8,\n * \"total_tokens\": 17\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n * full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"J'adore programmer\\\" \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {\n * \"finishReason\": \"stop\"\n * },\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 8,\n * \"total_tokens\": 17\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const GetWeather = {\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const GetPopulation = {\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const llmWithTools = llm.bindTools([GetWeather, GetPopulation]);\n * const aiMsg = await llmWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n * {\n * name: 'GetPopulation',\n * args: { location: 'New York City, NY' },\n * id: '33c1c1f47e2f492799c77d2800a43912',\n * type: 'tool_call'\n * }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const Joke = z.object({\n * setup: z.string().describe(\"The setup of the joke\"),\n * punchline: z.string().describe(\"The punchline to the joke\"),\n * rating: z.number().optional().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llm.withStructuredOutput(Joke, { name: \"Joke\" });\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n * setup: 'What do you call a cat that loves to bowl?',\n * punchline: 'An alley cat!'\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Usage Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForMetadata = await llm.invoke(input);\n * console.log(aiMsgForMetadata.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 9, output_tokens: 8, total_tokens: 17 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Stream Usage Metadata</strong></summary>\n *\n * ```typescript\n * const streamForMetadata = await llm.stream(\n * input,\n * {\n * streamUsage: true\n * }\n * );\n * let fullForMetadata: AIMessageChunk | undefined;\n * for await (const chunk of streamForMetadata) {\n * fullForMetadata = !fullForMetadata ? chunk : concat(fullForMetadata, chunk);\n * }\n * console.log(fullForMetadata?.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 9, output_tokens: 8, total_tokens: 17 }\n * ```\n * </details>\n *\n * <br />\n */\nexport class ChatVertexAI extends ChatGoogle {\n lc_namespace = ['langchain', 'chat_models', 'vertexai'];\n dynamicThinkingBudget = false;\n\n static lc_name(): 'LibreChatVertexAI' {\n return 'LibreChatVertexAI';\n }\n\n constructor(fields?: VertexAIClientOptions) {\n let dynamicThinkingBudget = false;\n if (fields?.thinkingBudget === -1) {\n dynamicThinkingBudget = true;\n fields.thinkingBudget = 1;\n }\n super({\n ...fields,\n platformType: 'gcp',\n });\n this.dynamicThinkingBudget = dynamicThinkingBudget;\n }\n invocationParams(\n options?: this['ParsedCallOptions'] | undefined\n ): GoogleAIModelRequestParams {\n const params = super.invocationParams(options);\n if (this.dynamicThinkingBudget) {\n params.maxReasoningTokens = -1;\n }\n return params;\n }\n\n buildConnection(\n fields: VertexAIClientOptions,\n client: GoogleAbstractedClient\n ): void {\n this.connection = new CustomChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n false\n );\n\n this.streamedConnection = new CustomChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n true\n );\n }\n}\n"],"names":[],"mappings":";;;AAUA,MAAM,oBAAqB,SAAQ,cAAqC,CAAA;AACtE,IAAA,MAAM,UAAU,CACd,KAAoB,EACpB,UAAsC,EAAA;AAEtC,QAAA,MAAM,aAAa,IAAI,MAAM,KAAK,CAAC,UAAU,CAC3C,KAAK,EACL,UAAU,CACX,CAAkB;QACnB,IACE,aAAa,CAAC,gBAAgB,EAAE,cAAc,EAAE,cAAc,KAAK,EAAE;YACrE,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,eAAe,KAAK,KAAK,EACvE;YACA,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI;;AAEtE,QAAA,OAAO,aAAa;;AAEvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyRG;AACG,MAAO,YAAa,SAAQ,UAAU,CAAA;IAC1C,YAAY,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,UAAU,CAAC;IACvD,qBAAqB,GAAG,KAAK;AAE7B,IAAA,OAAO,OAAO,GAAA;AACZ,QAAA,OAAO,mBAAmB;;AAG5B,IAAA,WAAA,CAAY,MAA8B,EAAA;QACxC,IAAI,qBAAqB,GAAG,KAAK;AACjC,QAAA,IAAI,MAAM,EAAE,cAAc,KAAK,EAAE,EAAE;YACjC,qBAAqB,GAAG,IAAI;AAC5B,YAAA,MAAM,CAAC,cAAc,GAAG,CAAC;;AAE3B,QAAA,KAAK,CAAC;AACJ,YAAA,GAAG,MAAM;AACT,YAAA,YAAY,EAAE,KAAK;AACpB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB;;AAEpD,IAAA,gBAAgB,CACd,OAA+C,EAAA;QAE/C,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAC9C,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,MAAM,CAAC,kBAAkB,GAAG,EAAE;;AAEhC,QAAA,OAAO,MAAM;;IAGf,eAAe,CACb,MAA6B,EAC7B,MAA8B,EAAA;QAE9B,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAoB,CACxC,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,EACtB,IAAI,CAAC,MAAM,EACX,MAAM,EACN,KAAK,CACN;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,oBAAoB,CAChD,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,EACtB,IAAI,CAAC,MAAM,EACX,MAAM,EACN,IAAI,CACL;;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/llm/vertexai/index.ts"],"sourcesContent":["import { ChatGoogle } from '@langchain/google-gauth';\nimport { ChatConnection } from '@langchain/google-common';\nimport type {\n GeminiRequest,\n GoogleAIModelRequestParams,\n GoogleAbstractedClient,\n} from '@langchain/google-common';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { VertexAIClientOptions } from '@/types';\n\nclass CustomChatConnection extends ChatConnection<VertexAIClientOptions> {\n async formatData(\n input: BaseMessage[],\n parameters: GoogleAIModelRequestParams\n ): Promise<unknown> {\n const formattedData = (await super.formatData(\n input,\n parameters\n )) as GeminiRequest;\n if (formattedData.generationConfig?.thinkingConfig?.thinkingBudget === -1) {\n // -1 means \"let the model decide\" - delete the property so the API doesn't receive an invalid value\n if (\n formattedData.generationConfig.thinkingConfig.includeThoughts === false\n ) {\n formattedData.generationConfig.thinkingConfig.includeThoughts = true;\n }\n delete formattedData.generationConfig.thinkingConfig.thinkingBudget;\n }\n return formattedData;\n }\n}\n\n/**\n * Integration with Google Vertex AI chat models.\n *\n * Setup:\n * Install `@langchain/google-vertexai` and set your stringified\n * Vertex AI credentials as an environment variable named `GOOGLE_APPLICATION_CREDENTIALS`.\n *\n * ```bash\n * npm install @langchain/google-vertexai\n * export GOOGLE_APPLICATION_CREDENTIALS=\"path/to/credentials\"\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/_langchain_google_vertexai.index.ChatVertexAI.html#constructor.new_ChatVertexAI)\n *\n * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_google_common_types.GoogleAIBaseLanguageModelCallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.withConfig`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.withConfig`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.withConfig({\n * stop: [\"\\n\"],\n * tools: [...],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n * [...],\n * {\n * tool_choice: \"auto\",\n * }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { ChatVertexAI } from '@langchain/google-vertexai';\n *\n * const llm = new ChatVertexAI({\n * model: \"gemini-1.5-pro\",\n * temperature: 0,\n * // other params...\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"J'adore programmer\\\" \\n\\nHere's why this is the best translation:\\n\\n* **J'adore** means \\\"I love\\\" and conveys a strong passion.\\n* **Programmer** is the French verb for \\\"to program.\\\"\\n\\nThis translation is natural and idiomatic in French. \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 63,\n * \"total_tokens\": 72\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n * console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"J'adore programmer\\\" \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": []\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {\n * \"finishReason\": \"stop\"\n * },\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 8,\n * \"total_tokens\": 17\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n * full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\\\"J'adore programmer\\\" \\n\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {\n * \"finishReason\": \"stop\"\n * },\n * \"tool_calls\": [],\n * \"tool_call_chunks\": [],\n * \"invalid_tool_calls\": [],\n * \"usage_metadata\": {\n * \"input_tokens\": 9,\n * \"output_tokens\": 8,\n * \"total_tokens\": 17\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const GetWeather = {\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const GetPopulation = {\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const llmWithTools = llm.bindTools([GetWeather, GetPopulation]);\n * const aiMsg = await llmWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n * {\n * name: 'GetPopulation',\n * args: { location: 'New York City, NY' },\n * id: '33c1c1f47e2f492799c77d2800a43912',\n * type: 'tool_call'\n * }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const Joke = z.object({\n * setup: z.string().describe(\"The setup of the joke\"),\n * punchline: z.string().describe(\"The punchline to the joke\"),\n * rating: z.number().optional().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llm.withStructuredOutput(Joke, { name: \"Joke\" });\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n * setup: 'What do you call a cat that loves to bowl?',\n * punchline: 'An alley cat!'\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Usage Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForMetadata = await llm.invoke(input);\n * console.log(aiMsgForMetadata.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 9, output_tokens: 8, total_tokens: 17 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Stream Usage Metadata</strong></summary>\n *\n * ```typescript\n * const streamForMetadata = await llm.stream(\n * input,\n * {\n * streamUsage: true\n * }\n * );\n * let fullForMetadata: AIMessageChunk | undefined;\n * for await (const chunk of streamForMetadata) {\n * fullForMetadata = !fullForMetadata ? chunk : concat(fullForMetadata, chunk);\n * }\n * console.log(fullForMetadata?.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 9, output_tokens: 8, total_tokens: 17 }\n * ```\n * </details>\n *\n * <br />\n */\nexport class ChatVertexAI extends ChatGoogle {\n lc_namespace = ['langchain', 'chat_models', 'vertexai'];\n dynamicThinkingBudget = false;\n\n static lc_name(): 'LibreChatVertexAI' {\n return 'LibreChatVertexAI';\n }\n\n constructor(fields?: VertexAIClientOptions) {\n const dynamicThinkingBudget = fields?.thinkingBudget === -1;\n super({\n ...fields,\n platformType: 'gcp',\n });\n this.dynamicThinkingBudget = dynamicThinkingBudget;\n }\n invocationParams(\n options?: this['ParsedCallOptions'] | undefined\n ): GoogleAIModelRequestParams {\n const params = super.invocationParams(options);\n if (this.dynamicThinkingBudget) {\n params.maxReasoningTokens = -1;\n }\n return params;\n }\n\n buildConnection(\n fields: VertexAIClientOptions,\n client: GoogleAbstractedClient\n ): void {\n this.connection = new CustomChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n false\n );\n\n this.streamedConnection = new CustomChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n true\n );\n }\n}\n"],"names":[],"mappings":";;;AAUA,MAAM,oBAAqB,SAAQ,cAAqC,CAAA;AACtE,IAAA,MAAM,UAAU,CACd,KAAoB,EACpB,UAAsC,EAAA;AAEtC,QAAA,MAAM,aAAa,IAAI,MAAM,KAAK,CAAC,UAAU,CAC3C,KAAK,EACL,UAAU,CACX,CAAkB;QACnB,IAAI,aAAa,CAAC,gBAAgB,EAAE,cAAc,EAAE,cAAc,KAAK,EAAE,EAAE;;YAEzE,IACE,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,eAAe,KAAK,KAAK,EACvE;gBACA,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI;;AAEtE,YAAA,OAAO,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,cAAc;;AAErE,QAAA,OAAO,aAAa;;AAEvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyRG;AACG,MAAO,YAAa,SAAQ,UAAU,CAAA;IAC1C,YAAY,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,UAAU,CAAC;IACvD,qBAAqB,GAAG,KAAK;AAE7B,IAAA,OAAO,OAAO,GAAA;AACZ,QAAA,OAAO,mBAAmB;;AAG5B,IAAA,WAAA,CAAY,MAA8B,EAAA;QACxC,MAAM,qBAAqB,GAAG,MAAM,EAAE,cAAc,KAAK,EAAE;AAC3D,QAAA,KAAK,CAAC;AACJ,YAAA,GAAG,MAAM;AACT,YAAA,YAAY,EAAE,KAAK;AACpB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB;;AAEpD,IAAA,gBAAgB,CACd,OAA+C,EAAA;QAE/C,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAC9C,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,MAAM,CAAC,kBAAkB,GAAG,EAAE;;AAEhC,QAAA,OAAO,MAAM;;IAGf,eAAe,CACb,MAA6B,EAC7B,MAA8B,EAAA;QAE9B,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAoB,CACxC,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,EACtB,IAAI,CAAC,MAAM,EACX,MAAM,EACN,KAAK,CACN;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,oBAAoB,CAChD,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,EACtB,IAAI,CAAC,MAAM,EACX,MAAM,EACN,IAAI,CACL;;AAEJ;;;;"}
|
package/dist/esm/stream.mjs
CHANGED
|
@@ -335,6 +335,8 @@ function createContentAggregator() {
|
|
|
335
335
|
const contentParts = [];
|
|
336
336
|
const stepMap = new Map();
|
|
337
337
|
const toolCallIdMap = new Map();
|
|
338
|
+
// Track agentId for each content index (for parallel agent attribution)
|
|
339
|
+
const contentAgentMap = new Map();
|
|
338
340
|
const updateContent = (index, contentPart, finalUpdate = false) => {
|
|
339
341
|
if (!contentPart) {
|
|
340
342
|
console.warn('No content part found in \'updateContent\'');
|
|
@@ -435,11 +437,20 @@ function createContentAggregator() {
|
|
|
435
437
|
tool_call: newToolCall,
|
|
436
438
|
};
|
|
437
439
|
}
|
|
440
|
+
// Apply agentId to content part for parallel execution attribution
|
|
441
|
+
const agentId = contentAgentMap.get(index);
|
|
442
|
+
if (agentId !== undefined) {
|
|
443
|
+
contentParts[index].agentId = agentId;
|
|
444
|
+
}
|
|
438
445
|
};
|
|
439
446
|
const aggregateContent = ({ event, data, }) => {
|
|
440
447
|
if (event === GraphEvents.ON_RUN_STEP) {
|
|
441
448
|
const runStep = data;
|
|
442
449
|
stepMap.set(runStep.id, runStep);
|
|
450
|
+
// Track agentId for this content index (for parallel execution)
|
|
451
|
+
if (runStep.agentId != null && runStep.agentId !== '') {
|
|
452
|
+
contentAgentMap.set(runStep.index, runStep.agentId);
|
|
453
|
+
}
|
|
443
454
|
// Store tool call IDs if present
|
|
444
455
|
if (runStep.stepDetails.type === StepTypes.TOOL_CALLS &&
|
|
445
456
|
runStep.stepDetails.tool_calls) {
|
|
@@ -534,7 +545,7 @@ function createContentAggregator() {
|
|
|
534
545
|
updateContent(runStep.index, contentPart, true);
|
|
535
546
|
}
|
|
536
547
|
};
|
|
537
|
-
return { contentParts, aggregateContent, stepMap };
|
|
548
|
+
return { contentParts, aggregateContent, stepMap, contentAgentMap };
|
|
538
549
|
}
|
|
539
550
|
|
|
540
551
|
export { ChatModelStreamHandler, createContentAggregator, getChunkContent };
|
package/dist/esm/stream.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.mjs","sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport type { ChatOpenAIReasoningSummary } from '@langchain/openai';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { StandardGraph } from '@/graphs';\nimport type * as t from '@/types';\nimport {\n ToolCallTypes,\n ContentTypes,\n GraphEvents,\n StepTypes,\n Providers,\n} from '@/common';\nimport {\n handleServerToolResult,\n handleToolCallChunks,\n handleToolCalls,\n} from '@/tools/handlers';\nimport { getMessageId } from '@/messages';\n\n/**\n * Parses content to extract thinking sections enclosed in <think> tags using string operations\n * @param content The content to parse\n * @returns An object with separated text and thinking content\n */\nfunction parseThinkingContent(content: string): {\n text: string;\n thinking: string;\n} {\n // If no think tags, return the original content as text\n if (!content.includes('<think>')) {\n return { text: content, thinking: '' };\n }\n\n let textResult = '';\n const thinkingResult: string[] = [];\n let position = 0;\n\n while (position < content.length) {\n const thinkStart = content.indexOf('<think>', position);\n\n if (thinkStart === -1) {\n // No more think tags, add the rest and break\n textResult += content.slice(position);\n break;\n }\n\n // Add text before the think tag\n textResult += content.slice(position, thinkStart);\n\n const thinkEnd = content.indexOf('</think>', thinkStart);\n if (thinkEnd === -1) {\n // Malformed input, no closing tag\n textResult += content.slice(thinkStart);\n break;\n }\n\n // Add the thinking content\n const thinkContent = content.slice(thinkStart + 7, thinkEnd);\n thinkingResult.push(thinkContent);\n\n // Move position to after the think tag\n position = thinkEnd + 8; // 8 is the length of '</think>'\n }\n\n return {\n text: textResult.trim(),\n thinking: thinkingResult.join('\\n').trim(),\n };\n}\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport function getChunkContent({\n chunk,\n provider,\n reasoningKey,\n}: {\n chunk?: Partial<AIMessageChunk>;\n provider?: Providers;\n reasoningKey: 'reasoning_content' | 'reasoning';\n}): string | t.MessageContentComplex[] | undefined {\n if (\n (provider === Providers.OPENAI || provider === Providers.AZURE) &&\n (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text != null &&\n ((\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text?.length ?? 0) > 0\n ) {\n return (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text;\n }\n /**\n * For OpenRouter, reasoning is stored in additional_kwargs.reasoning (not reasoning_content).\n * NOTE: We intentionally do NOT extract text from reasoning_details here.\n * The reasoning_details array contains the FULL accumulated reasoning text (set only on final chunk),\n * but individual reasoning tokens are already streamed via additional_kwargs.reasoning.\n * Extracting from reasoning_details would cause duplication.\n * The reasoning_details is only used for:\n * 1. Detecting reasoning mode in handleReasoning()\n * 2. Final message storage (for thought signatures)\n */\n if (provider === Providers.OPENROUTER) {\n // Content presence signals end of reasoning phase - prefer content over reasoning\n // This handles transitional chunks that may have both reasoning and content\n if (typeof chunk?.content === 'string' && chunk.content !== '') {\n return chunk.content;\n }\n const reasoning = chunk?.additional_kwargs?.reasoning as string | undefined;\n if (reasoning != null && reasoning !== '') {\n return reasoning;\n }\n return chunk?.content;\n }\n return (\n ((chunk?.additional_kwargs?.[reasoningKey] as string | undefined) ?? '') ||\n chunk?.content\n );\n}\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n async handle(\n event: string,\n data: t.StreamEventData,\n metadata?: Record<string, unknown>,\n graph?: StandardGraph\n ): Promise<void> {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const agentContext = graph.getAgentContext(metadata);\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n const content = getChunkContent({\n chunk,\n reasoningKey: agentContext.reasoningKey,\n provider: agentContext.provider,\n });\n const skipHandling = await handleServerToolResult({\n graph,\n content,\n metadata,\n agentContext,\n });\n if (skipHandling) {\n return;\n }\n this.handleReasoning(chunk, agentContext);\n let hasToolCalls = false;\n if (\n chunk.tool_calls &&\n chunk.tool_calls.length > 0 &&\n chunk.tool_calls.every(\n (tc) =>\n tc.id != null &&\n tc.id !== '' &&\n (tc as Partial<ToolCall>).name != null &&\n tc.name !== ''\n )\n ) {\n hasToolCalls = true;\n await handleToolCalls(chunk.tool_calls, metadata, graph);\n }\n\n const hasToolCallChunks =\n (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const isEmptyContent =\n typeof content === 'undefined' ||\n !content.length ||\n (typeof content === 'string' && !content);\n\n /** Set a preliminary message ID if found in empty chunk */\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n if (\n isEmptyChunk &&\n (chunk.id ?? '') !== '' &&\n !graph.prelimMessageIdsByStepKey.has(chunk.id ?? '')\n ) {\n const stepKey = graph.getStepKey(metadata);\n graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id ?? '');\n } else if (isEmptyChunk) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n\n if (\n hasToolCallChunks &&\n chunk.tool_call_chunks &&\n chunk.tool_call_chunks.length &&\n typeof chunk.tool_call_chunks[0]?.index === 'number'\n ) {\n await handleToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n metadata,\n });\n }\n\n if (isEmptyContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n }\n\n const stepId = graph.getStepIdByKey(stepKey);\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (\n hasToolCallChunks &&\n (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)\n ) {\n return;\n } else if (typeof content === 'string') {\n if (agentContext.currentTokenType === ContentTypes.TEXT) {\n await graph.dispatchMessageDelta(stepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n });\n } else if (agentContext.currentTokenType === 'think_and_text') {\n const { text, thinking } = parseThinkingContent(content);\n if (thinking) {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: thinking,\n },\n ],\n });\n }\n if (text) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n const newStepKey = graph.getStepKey(metadata);\n const message_id = getMessageId(newStepKey, graph) ?? '';\n await graph.dispatchRunStep(\n newStepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n\n const newStepId = graph.getStepIdByKey(newStepKey);\n await graph.dispatchMessageDelta(newStepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: text,\n },\n ],\n });\n }\n } else {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n });\n }\n } else if (\n content.every((c) => c.type?.startsWith(ContentTypes.TEXT) ?? false)\n ) {\n await graph.dispatchMessageDelta(stepId, {\n content,\n });\n } else if (\n content.every(\n (c) =>\n (c.type?.startsWith(ContentTypes.THINKING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false)\n )\n ) {\n await graph.dispatchReasoningDelta(stepId, {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think:\n (c as t.ThinkingContentText).thinking ??\n (c as Partial<t.GoogleReasoningContentText>).reasoning ??\n (c as Partial<t.BedrockReasoningContentText>).reasoningText?.text ??\n '',\n })),\n });\n }\n }\n handleReasoning(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n ): void {\n let reasoning_content = chunk.additional_kwargs?.[\n agentContext.reasoningKey\n ] as string | Partial<ChatOpenAIReasoningSummary> | undefined;\n if (\n Array.isArray(chunk.content) &&\n (chunk.content[0]?.type === ContentTypes.THINKING ||\n chunk.content[0]?.type === ContentTypes.REASONING ||\n chunk.content[0]?.type === ContentTypes.REASONING_CONTENT)\n ) {\n reasoning_content = 'valid';\n } else if (\n (agentContext.provider === Providers.OPENAI ||\n agentContext.provider === Providers.AZURE) &&\n reasoning_content != null &&\n typeof reasoning_content !== 'string' &&\n reasoning_content.summary?.[0]?.text != null &&\n reasoning_content.summary[0].text\n ) {\n reasoning_content = 'valid';\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n // Only set reasoning as valid if content is NOT present (content signals end of reasoning)\n (chunk.content == null || chunk.content === '') &&\n // Check for reasoning_details (final chunk) OR reasoning string (intermediate chunks)\n ((chunk.additional_kwargs?.reasoning_details != null &&\n Array.isArray(chunk.additional_kwargs.reasoning_details) &&\n chunk.additional_kwargs.reasoning_details.length > 0) ||\n (typeof chunk.additional_kwargs?.reasoning === 'string' &&\n chunk.additional_kwargs.reasoning !== ''))\n ) {\n reasoning_content = 'valid';\n }\n if (\n reasoning_content != null &&\n reasoning_content !== '' &&\n (chunk.content == null ||\n chunk.content === '' ||\n reasoning_content === 'valid')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n return;\n } else if (\n agentContext.tokenTypeSwitch === 'reasoning' &&\n agentContext.currentTokenType !== ContentTypes.TEXT &&\n ((chunk.content != null && chunk.content !== '') ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0)\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>') &&\n chunk.content.includes('</think>')\n ) {\n agentContext.currentTokenType = 'think_and_text';\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n agentContext.lastToken != null &&\n agentContext.lastToken.includes('</think>')\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n agentContext.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n\n const updateContent = (\n index: number,\n contentPart?: t.MessageContentComplex,\n finalUpdate = false\n ): void => {\n if (!contentPart) {\n console.warn('No content part found in \\'updateContent\\'');\n return;\n }\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index]) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.AGENT_UPDATE) &&\n ContentTypes.AGENT_UPDATE in contentPart &&\n contentPart.agent_update != null\n ) {\n const update: t.AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE,\n agent_update: contentPart.agent_update,\n };\n\n contentParts[index] = update;\n } else if (\n partType === ContentTypes.IMAGE_URL &&\n 'image_url' in contentPart\n ) {\n const currentContent = contentParts[index] as {\n type: 'image_url';\n image_url: string;\n };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (\n partType === ContentTypes.TOOL_CALL &&\n 'tool_call' in contentPart\n ) {\n const incomingName = contentPart.tool_call.name;\n const incomingId = contentPart.tool_call.id;\n const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;\n\n // When we receive a tool call with a name, it's the complete tool call\n // Consolidate with any previously accumulated args from chunks\n const hasValidName = incomingName != null && incomingName !== '';\n\n // Only process if incoming has a valid name (complete tool call)\n // or if we're doing a final update with complete data\n if (!hasValidName && !finalUpdate) {\n return;\n }\n\n const existingContent = contentParts[index] as\n | (Omit<t.ToolCallContent, 'tool_call'> & {\n tool_call?: t.ToolCallPart;\n })\n | undefined;\n\n /** When args are a valid object, they are likely already invoked */\n let args =\n finalUpdate ||\n typeof existingContent?.tool_call?.args === 'object' ||\n typeof toolCallArgs === 'object'\n ? contentPart.tool_call.args\n : (existingContent?.tool_call?.args ?? '') + (toolCallArgs ?? '');\n if (\n finalUpdate &&\n args == null &&\n existingContent?.tool_call?.args != null\n ) {\n args = existingContent.tool_call.args;\n }\n\n const id =\n getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ??\n '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n };\n\n const aggregateContent = ({\n event,\n data,\n }: {\n event: GraphEvents;\n data:\n | t.RunStep\n | t.AgentUpdate\n | t.MessageDeltaEvent\n | t.RunStepDeltaEvent\n | { result: t.ToolEndEvent };\n }): void => {\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Store tool call IDs if present\n if (\n runStep.stepDetails.type === StepTypes.TOOL_CALLS &&\n runStep.stepDetails.tool_calls\n ) {\n (runStep.stepDetails.tool_calls as ToolCall[]).forEach((toolCall) => {\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCall.args,\n name: toolCall.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n if (messageDelta.delta.content) {\n const contentPart = Array.isArray(messageDelta.delta.content)\n ? messageDelta.delta.content[0]\n : messageDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (\n event === GraphEvents.ON_AGENT_UPDATE &&\n (data as t.AgentUpdate | undefined)?.agent_update\n ) {\n const contentPart = data as t.AgentUpdate | undefined;\n if (!contentPart) {\n return;\n }\n updateContent(contentPart.agent_update.index, contentPart);\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n if (reasoningDelta.delta.content) {\n const contentPart = Array.isArray(reasoningDelta.delta.content)\n ? reasoningDelta.delta.content[0]\n : reasoningDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n const toolCallId = toolCallIdMap.get(runStepDelta.id);\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as { result: t.ToolEndEvent };\n\n const { id: stepId } = result;\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn(\n 'No run step or runId found for completed tool call event'\n );\n return;\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: result.tool_call,\n };\n\n updateContent(runStep.index, contentPart, true);\n }\n };\n\n return { contentParts, aggregateContent, stepMap };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.mjs","sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport type { ChatOpenAIReasoningSummary } from '@langchain/openai';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { StandardGraph } from '@/graphs';\nimport type * as t from '@/types';\nimport {\n ToolCallTypes,\n ContentTypes,\n GraphEvents,\n StepTypes,\n Providers,\n} from '@/common';\nimport {\n handleServerToolResult,\n handleToolCallChunks,\n handleToolCalls,\n} from '@/tools/handlers';\nimport { getMessageId } from '@/messages';\n\n/**\n * Parses content to extract thinking sections enclosed in <think> tags using string operations\n * @param content The content to parse\n * @returns An object with separated text and thinking content\n */\nfunction parseThinkingContent(content: string): {\n text: string;\n thinking: string;\n} {\n // If no think tags, return the original content as text\n if (!content.includes('<think>')) {\n return { text: content, thinking: '' };\n }\n\n let textResult = '';\n const thinkingResult: string[] = [];\n let position = 0;\n\n while (position < content.length) {\n const thinkStart = content.indexOf('<think>', position);\n\n if (thinkStart === -1) {\n // No more think tags, add the rest and break\n textResult += content.slice(position);\n break;\n }\n\n // Add text before the think tag\n textResult += content.slice(position, thinkStart);\n\n const thinkEnd = content.indexOf('</think>', thinkStart);\n if (thinkEnd === -1) {\n // Malformed input, no closing tag\n textResult += content.slice(thinkStart);\n break;\n }\n\n // Add the thinking content\n const thinkContent = content.slice(thinkStart + 7, thinkEnd);\n thinkingResult.push(thinkContent);\n\n // Move position to after the think tag\n position = thinkEnd + 8; // 8 is the length of '</think>'\n }\n\n return {\n text: textResult.trim(),\n thinking: thinkingResult.join('\\n').trim(),\n };\n}\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport function getChunkContent({\n chunk,\n provider,\n reasoningKey,\n}: {\n chunk?: Partial<AIMessageChunk>;\n provider?: Providers;\n reasoningKey: 'reasoning_content' | 'reasoning';\n}): string | t.MessageContentComplex[] | undefined {\n if (\n (provider === Providers.OPENAI || provider === Providers.AZURE) &&\n (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text != null &&\n ((\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text?.length ?? 0) > 0\n ) {\n return (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text;\n }\n /**\n * For OpenRouter, reasoning is stored in additional_kwargs.reasoning (not reasoning_content).\n * NOTE: We intentionally do NOT extract text from reasoning_details here.\n * The reasoning_details array contains the FULL accumulated reasoning text (set only on final chunk),\n * but individual reasoning tokens are already streamed via additional_kwargs.reasoning.\n * Extracting from reasoning_details would cause duplication.\n * The reasoning_details is only used for:\n * 1. Detecting reasoning mode in handleReasoning()\n * 2. Final message storage (for thought signatures)\n */\n if (provider === Providers.OPENROUTER) {\n // Content presence signals end of reasoning phase - prefer content over reasoning\n // This handles transitional chunks that may have both reasoning and content\n if (typeof chunk?.content === 'string' && chunk.content !== '') {\n return chunk.content;\n }\n const reasoning = chunk?.additional_kwargs?.reasoning as string | undefined;\n if (reasoning != null && reasoning !== '') {\n return reasoning;\n }\n return chunk?.content;\n }\n return (\n ((chunk?.additional_kwargs?.[reasoningKey] as string | undefined) ?? '') ||\n chunk?.content\n );\n}\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n async handle(\n event: string,\n data: t.StreamEventData,\n metadata?: Record<string, unknown>,\n graph?: StandardGraph\n ): Promise<void> {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const agentContext = graph.getAgentContext(metadata);\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n const content = getChunkContent({\n chunk,\n reasoningKey: agentContext.reasoningKey,\n provider: agentContext.provider,\n });\n const skipHandling = await handleServerToolResult({\n graph,\n content,\n metadata,\n agentContext,\n });\n if (skipHandling) {\n return;\n }\n this.handleReasoning(chunk, agentContext);\n let hasToolCalls = false;\n if (\n chunk.tool_calls &&\n chunk.tool_calls.length > 0 &&\n chunk.tool_calls.every(\n (tc) =>\n tc.id != null &&\n tc.id !== '' &&\n (tc as Partial<ToolCall>).name != null &&\n tc.name !== ''\n )\n ) {\n hasToolCalls = true;\n await handleToolCalls(chunk.tool_calls, metadata, graph);\n }\n\n const hasToolCallChunks =\n (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const isEmptyContent =\n typeof content === 'undefined' ||\n !content.length ||\n (typeof content === 'string' && !content);\n\n /** Set a preliminary message ID if found in empty chunk */\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n if (\n isEmptyChunk &&\n (chunk.id ?? '') !== '' &&\n !graph.prelimMessageIdsByStepKey.has(chunk.id ?? '')\n ) {\n const stepKey = graph.getStepKey(metadata);\n graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id ?? '');\n } else if (isEmptyChunk) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n\n if (\n hasToolCallChunks &&\n chunk.tool_call_chunks &&\n chunk.tool_call_chunks.length &&\n typeof chunk.tool_call_chunks[0]?.index === 'number'\n ) {\n await handleToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n metadata,\n });\n }\n\n if (isEmptyContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n }\n\n const stepId = graph.getStepIdByKey(stepKey);\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (\n hasToolCallChunks &&\n (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)\n ) {\n return;\n } else if (typeof content === 'string') {\n if (agentContext.currentTokenType === ContentTypes.TEXT) {\n await graph.dispatchMessageDelta(stepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n });\n } else if (agentContext.currentTokenType === 'think_and_text') {\n const { text, thinking } = parseThinkingContent(content);\n if (thinking) {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: thinking,\n },\n ],\n });\n }\n if (text) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n const newStepKey = graph.getStepKey(metadata);\n const message_id = getMessageId(newStepKey, graph) ?? '';\n await graph.dispatchRunStep(\n newStepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n\n const newStepId = graph.getStepIdByKey(newStepKey);\n await graph.dispatchMessageDelta(newStepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: text,\n },\n ],\n });\n }\n } else {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n });\n }\n } else if (\n content.every((c) => c.type?.startsWith(ContentTypes.TEXT) ?? false)\n ) {\n await graph.dispatchMessageDelta(stepId, {\n content,\n });\n } else if (\n content.every(\n (c) =>\n (c.type?.startsWith(ContentTypes.THINKING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false)\n )\n ) {\n await graph.dispatchReasoningDelta(stepId, {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think:\n (c as t.ThinkingContentText).thinking ??\n (c as Partial<t.GoogleReasoningContentText>).reasoning ??\n (c as Partial<t.BedrockReasoningContentText>).reasoningText?.text ??\n '',\n })),\n });\n }\n }\n handleReasoning(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n ): void {\n let reasoning_content = chunk.additional_kwargs?.[\n agentContext.reasoningKey\n ] as string | Partial<ChatOpenAIReasoningSummary> | undefined;\n if (\n Array.isArray(chunk.content) &&\n (chunk.content[0]?.type === ContentTypes.THINKING ||\n chunk.content[0]?.type === ContentTypes.REASONING ||\n chunk.content[0]?.type === ContentTypes.REASONING_CONTENT)\n ) {\n reasoning_content = 'valid';\n } else if (\n (agentContext.provider === Providers.OPENAI ||\n agentContext.provider === Providers.AZURE) &&\n reasoning_content != null &&\n typeof reasoning_content !== 'string' &&\n reasoning_content.summary?.[0]?.text != null &&\n reasoning_content.summary[0].text\n ) {\n reasoning_content = 'valid';\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n // Only set reasoning as valid if content is NOT present (content signals end of reasoning)\n (chunk.content == null || chunk.content === '') &&\n // Check for reasoning_details (final chunk) OR reasoning string (intermediate chunks)\n ((chunk.additional_kwargs?.reasoning_details != null &&\n Array.isArray(chunk.additional_kwargs.reasoning_details) &&\n chunk.additional_kwargs.reasoning_details.length > 0) ||\n (typeof chunk.additional_kwargs?.reasoning === 'string' &&\n chunk.additional_kwargs.reasoning !== ''))\n ) {\n reasoning_content = 'valid';\n }\n if (\n reasoning_content != null &&\n reasoning_content !== '' &&\n (chunk.content == null ||\n chunk.content === '' ||\n reasoning_content === 'valid')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n return;\n } else if (\n agentContext.tokenTypeSwitch === 'reasoning' &&\n agentContext.currentTokenType !== ContentTypes.TEXT &&\n ((chunk.content != null && chunk.content !== '') ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0)\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>') &&\n chunk.content.includes('</think>')\n ) {\n agentContext.currentTokenType = 'think_and_text';\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n agentContext.lastToken != null &&\n agentContext.lastToken.includes('</think>')\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n agentContext.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n // Track agentId for each content index (for parallel agent attribution)\n const contentAgentMap = new Map<number, string>();\n\n const updateContent = (\n index: number,\n contentPart?: t.MessageContentComplex,\n finalUpdate = false\n ): void => {\n if (!contentPart) {\n console.warn('No content part found in \\'updateContent\\'');\n return;\n }\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index]) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.AGENT_UPDATE) &&\n ContentTypes.AGENT_UPDATE in contentPart &&\n contentPart.agent_update != null\n ) {\n const update: t.AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE,\n agent_update: contentPart.agent_update,\n };\n\n contentParts[index] = update;\n } else if (\n partType === ContentTypes.IMAGE_URL &&\n 'image_url' in contentPart\n ) {\n const currentContent = contentParts[index] as {\n type: 'image_url';\n image_url: string;\n };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (\n partType === ContentTypes.TOOL_CALL &&\n 'tool_call' in contentPart\n ) {\n const incomingName = contentPart.tool_call.name;\n const incomingId = contentPart.tool_call.id;\n const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;\n\n // When we receive a tool call with a name, it's the complete tool call\n // Consolidate with any previously accumulated args from chunks\n const hasValidName = incomingName != null && incomingName !== '';\n\n // Only process if incoming has a valid name (complete tool call)\n // or if we're doing a final update with complete data\n if (!hasValidName && !finalUpdate) {\n return;\n }\n\n const existingContent = contentParts[index] as\n | (Omit<t.ToolCallContent, 'tool_call'> & {\n tool_call?: t.ToolCallPart;\n })\n | undefined;\n\n /** When args are a valid object, they are likely already invoked */\n let args =\n finalUpdate ||\n typeof existingContent?.tool_call?.args === 'object' ||\n typeof toolCallArgs === 'object'\n ? contentPart.tool_call.args\n : (existingContent?.tool_call?.args ?? '') + (toolCallArgs ?? '');\n if (\n finalUpdate &&\n args == null &&\n existingContent?.tool_call?.args != null\n ) {\n args = existingContent.tool_call.args;\n }\n\n const id =\n getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ??\n '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n\n // Apply agentId to content part for parallel execution attribution\n const agentId = contentAgentMap.get(index);\n if (agentId !== undefined) {\n (\n contentParts[index] as t.MessageContentComplex & { agentId?: string }\n ).agentId = agentId;\n }\n };\n\n const aggregateContent = ({\n event,\n data,\n }: {\n event: GraphEvents;\n data:\n | t.RunStep\n | t.AgentUpdate\n | t.MessageDeltaEvent\n | t.RunStepDeltaEvent\n | { result: t.ToolEndEvent };\n }): void => {\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Track agentId for this content index (for parallel execution)\n if (runStep.agentId != null && runStep.agentId !== '') {\n contentAgentMap.set(runStep.index, runStep.agentId);\n }\n\n // Store tool call IDs if present\n if (\n runStep.stepDetails.type === StepTypes.TOOL_CALLS &&\n runStep.stepDetails.tool_calls\n ) {\n (runStep.stepDetails.tool_calls as ToolCall[]).forEach((toolCall) => {\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCall.args,\n name: toolCall.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n if (messageDelta.delta.content) {\n const contentPart = Array.isArray(messageDelta.delta.content)\n ? messageDelta.delta.content[0]\n : messageDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (\n event === GraphEvents.ON_AGENT_UPDATE &&\n (data as t.AgentUpdate | undefined)?.agent_update\n ) {\n const contentPart = data as t.AgentUpdate | undefined;\n if (!contentPart) {\n return;\n }\n updateContent(contentPart.agent_update.index, contentPart);\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n if (reasoningDelta.delta.content) {\n const contentPart = Array.isArray(reasoningDelta.delta.content)\n ? reasoningDelta.delta.content[0]\n : reasoningDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n const toolCallId = toolCallIdMap.get(runStepDelta.id);\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as { result: t.ToolEndEvent };\n\n const { id: stepId } = result;\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn(\n 'No run step or runId found for completed tool call event'\n );\n return;\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: result.tool_call,\n };\n\n updateContent(runStep.index, contentPart, true);\n }\n };\n\n return { contentParts, aggregateContent, stepMap, contentAgentMap };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -251,6 +251,7 @@ export type MessageContentComplex = (ToolResultContent | ThinkingContentText | A
|
|
|
251
251
|
type?: never;
|
|
252
252
|
})) & {
|
|
253
253
|
tool_call_ids?: string[];
|
|
254
|
+
agentId?: string;
|
|
254
255
|
};
|
|
255
256
|
export interface TMessage {
|
|
256
257
|
role?: string;
|
|
@@ -292,4 +293,5 @@ export type ContentAggregatorResult = {
|
|
|
292
293
|
stepMap: Map<string, RunStep | undefined>;
|
|
293
294
|
contentParts: Array<MessageContentComplex | undefined>;
|
|
294
295
|
aggregateContent: ContentAggregator;
|
|
296
|
+
contentAgentMap: Map<number, string>;
|
|
295
297
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@librechat/agents",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.53",
|
|
4
4
|
"main": "./dist/cjs/main.cjs",
|
|
5
5
|
"module": "./dist/esm/main.mjs",
|
|
6
6
|
"types": "./dist/types/index.d.ts",
|
|
@@ -69,6 +69,7 @@
|
|
|
69
69
|
"multi-agent-test": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-test.ts",
|
|
70
70
|
"test-tools-before-handoff": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-tools-before-handoff.ts",
|
|
71
71
|
"multi-agent-parallel": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-parallel.ts",
|
|
72
|
+
"multi-agent-parallel-start": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-parallel-start.ts",
|
|
72
73
|
"multi-agent-chain": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-chain.ts",
|
|
73
74
|
"multi-agent-sequence": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-sequence.ts",
|
|
74
75
|
"multi-agent-conditional": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-conditional.ts",
|
|
@@ -17,11 +17,14 @@ class CustomChatConnection extends ChatConnection<VertexAIClientOptions> {
|
|
|
17
17
|
input,
|
|
18
18
|
parameters
|
|
19
19
|
)) as GeminiRequest;
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
if (formattedData.generationConfig?.thinkingConfig?.thinkingBudget === -1) {
|
|
21
|
+
// -1 means "let the model decide" - delete the property so the API doesn't receive an invalid value
|
|
22
|
+
if (
|
|
23
|
+
formattedData.generationConfig.thinkingConfig.includeThoughts === false
|
|
24
|
+
) {
|
|
25
|
+
formattedData.generationConfig.thinkingConfig.includeThoughts = true;
|
|
26
|
+
}
|
|
27
|
+
delete formattedData.generationConfig.thinkingConfig.thinkingBudget;
|
|
25
28
|
}
|
|
26
29
|
return formattedData;
|
|
27
30
|
}
|
|
@@ -318,11 +321,7 @@ export class ChatVertexAI extends ChatGoogle {
|
|
|
318
321
|
}
|
|
319
322
|
|
|
320
323
|
constructor(fields?: VertexAIClientOptions) {
|
|
321
|
-
|
|
322
|
-
if (fields?.thinkingBudget === -1) {
|
|
323
|
-
dynamicThinkingBudget = true;
|
|
324
|
-
fields.thinkingBudget = 1;
|
|
325
|
-
}
|
|
324
|
+
const dynamicThinkingBudget = fields?.thinkingBudget === -1;
|
|
326
325
|
super({
|
|
327
326
|
...fields,
|
|
328
327
|
platformType: 'gcp',
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { config } from 'dotenv';
|
|
2
|
+
config();
|
|
3
|
+
|
|
4
|
+
import { HumanMessage, BaseMessage } from '@langchain/core/messages';
|
|
5
|
+
import type * as t from '@/types';
|
|
6
|
+
import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
|
|
7
|
+
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
8
|
+
import { Providers, GraphEvents } from '@/common';
|
|
9
|
+
import { sleep } from '@/utils/run';
|
|
10
|
+
import { Run } from '@/run';
|
|
11
|
+
|
|
12
|
+
const conversationHistory: BaseMessage[] = [];
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Example of parallel multi-agent system that starts with parallel execution immediately
|
|
16
|
+
*
|
|
17
|
+
* Graph structure:
|
|
18
|
+
* START -> [analyst1, analyst2] -> END (parallel from start, both run simultaneously)
|
|
19
|
+
*
|
|
20
|
+
* This demonstrates getting a parallel stream from the very beginning,
|
|
21
|
+
* with two agents running simultaneously. Useful for testing how different
|
|
22
|
+
* models respond to the same input.
|
|
23
|
+
*/
|
|
24
|
+
async function testParallelFromStart() {
|
|
25
|
+
console.log('Testing Parallel From Start Multi-Agent System...\n');
|
|
26
|
+
|
|
27
|
+
// Set up content aggregator
|
|
28
|
+
const { contentParts, aggregateContent } = createContentAggregator();
|
|
29
|
+
|
|
30
|
+
// Define two agents - both have NO incoming edges, so they run in parallel from the start
|
|
31
|
+
const agents: t.AgentInputs[] = [
|
|
32
|
+
{
|
|
33
|
+
agentId: 'analyst1',
|
|
34
|
+
provider: Providers.ANTHROPIC,
|
|
35
|
+
clientOptions: {
|
|
36
|
+
modelName: 'claude-haiku-4-5',
|
|
37
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
38
|
+
},
|
|
39
|
+
instructions: `You are a CREATIVE ANALYST. Analyze the user's query from a creative and innovative perspective. Focus on novel ideas, unconventional approaches, and imaginative possibilities. Keep your response concise (100-150 words). Start with "🎨 CREATIVE:"`,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
agentId: 'analyst2',
|
|
43
|
+
provider: Providers.ANTHROPIC,
|
|
44
|
+
clientOptions: {
|
|
45
|
+
modelName: 'claude-haiku-4-5',
|
|
46
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
47
|
+
},
|
|
48
|
+
instructions: `You are a PRACTICAL ANALYST. Analyze the user's query from a logical and practical perspective. Focus on feasibility, metrics, and actionable steps. Keep your response concise (100-150 words). Start with "📊 PRACTICAL:"`,
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
// No edges needed - both agents have no incoming edges, so both are start nodes
|
|
53
|
+
// They will run in parallel and end when both complete
|
|
54
|
+
const edges: t.GraphEdge[] = [];
|
|
55
|
+
|
|
56
|
+
// Track which agents are active and their timing
|
|
57
|
+
const activeAgents = new Set<string>();
|
|
58
|
+
const agentTimings: Record<string, { start?: number; end?: number }> = {};
|
|
59
|
+
const startTime = Date.now();
|
|
60
|
+
|
|
61
|
+
// Create custom handlers
|
|
62
|
+
const customHandlers = {
|
|
63
|
+
[GraphEvents.TOOL_END]: new ToolEndHandler(),
|
|
64
|
+
[GraphEvents.CHAT_MODEL_END]: {
|
|
65
|
+
handle: (
|
|
66
|
+
_event: string,
|
|
67
|
+
_data: t.StreamEventData,
|
|
68
|
+
metadata?: Record<string, unknown>
|
|
69
|
+
): void => {
|
|
70
|
+
const nodeName = metadata?.langgraph_node as string;
|
|
71
|
+
if (nodeName) {
|
|
72
|
+
const elapsed = Date.now() - startTime;
|
|
73
|
+
agentTimings[nodeName] = agentTimings[nodeName] || {};
|
|
74
|
+
agentTimings[nodeName].end = elapsed;
|
|
75
|
+
console.log(`⏱️ [${nodeName}] COMPLETED at ${elapsed}ms`);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
[GraphEvents.CHAT_MODEL_START]: {
|
|
80
|
+
handle: (
|
|
81
|
+
_event: string,
|
|
82
|
+
_data: t.StreamEventData,
|
|
83
|
+
metadata?: Record<string, unknown>
|
|
84
|
+
): void => {
|
|
85
|
+
const nodeName = metadata?.langgraph_node as string;
|
|
86
|
+
if (nodeName) {
|
|
87
|
+
const elapsed = Date.now() - startTime;
|
|
88
|
+
agentTimings[nodeName] = agentTimings[nodeName] || {};
|
|
89
|
+
agentTimings[nodeName].start = elapsed;
|
|
90
|
+
activeAgents.add(nodeName);
|
|
91
|
+
console.log(`⏱️ [${nodeName}] STARTED at ${elapsed}ms`);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
[GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
|
|
96
|
+
[GraphEvents.ON_RUN_STEP_COMPLETED]: {
|
|
97
|
+
handle: (
|
|
98
|
+
event: GraphEvents.ON_RUN_STEP_COMPLETED,
|
|
99
|
+
data: t.StreamEventData
|
|
100
|
+
): void => {
|
|
101
|
+
aggregateContent({
|
|
102
|
+
event,
|
|
103
|
+
data: data as unknown as { result: t.ToolEndEvent },
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
[GraphEvents.ON_RUN_STEP]: {
|
|
108
|
+
handle: (
|
|
109
|
+
event: GraphEvents.ON_RUN_STEP,
|
|
110
|
+
data: t.StreamEventData
|
|
111
|
+
): void => {
|
|
112
|
+
aggregateContent({ event, data: data as t.RunStep });
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
[GraphEvents.ON_RUN_STEP_DELTA]: {
|
|
116
|
+
handle: (
|
|
117
|
+
event: GraphEvents.ON_RUN_STEP_DELTA,
|
|
118
|
+
data: t.StreamEventData
|
|
119
|
+
): void => {
|
|
120
|
+
aggregateContent({ event, data: data as t.RunStepDeltaEvent });
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
[GraphEvents.ON_MESSAGE_DELTA]: {
|
|
124
|
+
handle: (
|
|
125
|
+
event: GraphEvents.ON_MESSAGE_DELTA,
|
|
126
|
+
data: t.StreamEventData
|
|
127
|
+
): void => {
|
|
128
|
+
console.dir(data, { depth: null });
|
|
129
|
+
aggregateContent({ event, data: data as t.MessageDeltaEvent });
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// Create multi-agent run configuration
|
|
135
|
+
const runConfig: t.RunConfig = {
|
|
136
|
+
runId: `parallel-start-${Date.now()}`,
|
|
137
|
+
graphConfig: {
|
|
138
|
+
type: 'multi-agent',
|
|
139
|
+
agents,
|
|
140
|
+
edges,
|
|
141
|
+
},
|
|
142
|
+
customHandlers,
|
|
143
|
+
returnContent: true,
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
// Create and execute the run
|
|
148
|
+
const run = await Run.create(runConfig);
|
|
149
|
+
|
|
150
|
+
// Debug: Log the graph structure
|
|
151
|
+
console.log('=== DEBUG: Graph Structure ===');
|
|
152
|
+
const graph = (run as any).Graph;
|
|
153
|
+
console.log('Graph exists:', !!graph);
|
|
154
|
+
if (graph) {
|
|
155
|
+
console.log('Graph type:', graph.constructor.name);
|
|
156
|
+
console.log('AgentContexts exists:', !!graph.agentContexts);
|
|
157
|
+
if (graph.agentContexts) {
|
|
158
|
+
console.log('AgentContexts size:', graph.agentContexts.size);
|
|
159
|
+
for (const [agentId, context] of graph.agentContexts) {
|
|
160
|
+
console.log(`\nAgent: ${agentId}`);
|
|
161
|
+
console.log(
|
|
162
|
+
`Tools: ${context.tools?.map((t: any) => t.name || 'unnamed').join(', ') || 'none'}`
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
console.log('=== END DEBUG ===\n');
|
|
168
|
+
|
|
169
|
+
const userMessage = `What are the best approaches to learning a new programming language?`;
|
|
170
|
+
conversationHistory.push(new HumanMessage(userMessage));
|
|
171
|
+
|
|
172
|
+
console.log('Invoking parallel-from-start multi-agent graph...\n');
|
|
173
|
+
console.log('Both analyst1 and analyst2 should start simultaneously!\n');
|
|
174
|
+
|
|
175
|
+
const config = {
|
|
176
|
+
configurable: {
|
|
177
|
+
thread_id: 'parallel-start-conversation-1',
|
|
178
|
+
},
|
|
179
|
+
streamMode: 'values',
|
|
180
|
+
version: 'v2' as const,
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// Process with streaming
|
|
184
|
+
const inputs = {
|
|
185
|
+
messages: conversationHistory,
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const finalContentParts = await run.processStream(inputs, config);
|
|
189
|
+
const finalMessages = run.getRunMessages();
|
|
190
|
+
|
|
191
|
+
if (finalMessages) {
|
|
192
|
+
conversationHistory.push(...finalMessages);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
console.log('\n\n========== TIMING SUMMARY ==========');
|
|
196
|
+
for (const [agent, timing] of Object.entries(agentTimings)) {
|
|
197
|
+
const duration =
|
|
198
|
+
timing.end && timing.start ? timing.end - timing.start : 'N/A';
|
|
199
|
+
console.log(
|
|
200
|
+
`${agent}: started=${timing.start}ms, ended=${timing.end}ms, duration=${duration}ms`
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Check if parallel
|
|
205
|
+
const agents = Object.keys(agentTimings);
|
|
206
|
+
if (agents.length >= 2) {
|
|
207
|
+
const [a1, a2] = agents;
|
|
208
|
+
const t1 = agentTimings[a1];
|
|
209
|
+
const t2 = agentTimings[a2];
|
|
210
|
+
if (t1.start && t2.start && t1.end && t2.end) {
|
|
211
|
+
const overlap = Math.min(t1.end, t2.end) - Math.max(t1.start, t2.start);
|
|
212
|
+
if (overlap > 0) {
|
|
213
|
+
console.log(
|
|
214
|
+
`\n✅ PARALLEL EXECUTION CONFIRMED: ${overlap}ms overlap`
|
|
215
|
+
);
|
|
216
|
+
} else {
|
|
217
|
+
console.log(`\n❌ SEQUENTIAL EXECUTION: no overlap`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
console.log('====================================\n');
|
|
222
|
+
|
|
223
|
+
console.log('Final content parts:', contentParts.length, 'parts');
|
|
224
|
+
console.dir(contentParts, { depth: null });
|
|
225
|
+
await sleep(3000);
|
|
226
|
+
} catch (error) {
|
|
227
|
+
console.error('Error in parallel-from-start multi-agent test:', error);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Run the test
|
|
232
|
+
testParallelFromStart();
|
package/src/stream.ts
CHANGED
|
@@ -442,6 +442,8 @@ export function createContentAggregator(): t.ContentAggregatorResult {
|
|
|
442
442
|
const contentParts: Array<t.MessageContentComplex | undefined> = [];
|
|
443
443
|
const stepMap = new Map<string, t.RunStep>();
|
|
444
444
|
const toolCallIdMap = new Map<string, string>();
|
|
445
|
+
// Track agentId for each content index (for parallel agent attribution)
|
|
446
|
+
const contentAgentMap = new Map<number, string>();
|
|
445
447
|
|
|
446
448
|
const updateContent = (
|
|
447
449
|
index: number,
|
|
@@ -578,6 +580,14 @@ export function createContentAggregator(): t.ContentAggregatorResult {
|
|
|
578
580
|
tool_call: newToolCall,
|
|
579
581
|
};
|
|
580
582
|
}
|
|
583
|
+
|
|
584
|
+
// Apply agentId to content part for parallel execution attribution
|
|
585
|
+
const agentId = contentAgentMap.get(index);
|
|
586
|
+
if (agentId !== undefined) {
|
|
587
|
+
(
|
|
588
|
+
contentParts[index] as t.MessageContentComplex & { agentId?: string }
|
|
589
|
+
).agentId = agentId;
|
|
590
|
+
}
|
|
581
591
|
};
|
|
582
592
|
|
|
583
593
|
const aggregateContent = ({
|
|
@@ -596,6 +606,11 @@ export function createContentAggregator(): t.ContentAggregatorResult {
|
|
|
596
606
|
const runStep = data as t.RunStep;
|
|
597
607
|
stepMap.set(runStep.id, runStep);
|
|
598
608
|
|
|
609
|
+
// Track agentId for this content index (for parallel execution)
|
|
610
|
+
if (runStep.agentId != null && runStep.agentId !== '') {
|
|
611
|
+
contentAgentMap.set(runStep.index, runStep.agentId);
|
|
612
|
+
}
|
|
613
|
+
|
|
599
614
|
// Store tool call IDs if present
|
|
600
615
|
if (
|
|
601
616
|
runStep.stepDetails.type === StepTypes.TOOL_CALLS &&
|
|
@@ -706,5 +721,5 @@ export function createContentAggregator(): t.ContentAggregatorResult {
|
|
|
706
721
|
}
|
|
707
722
|
};
|
|
708
723
|
|
|
709
|
-
return { contentParts, aggregateContent, stepMap };
|
|
724
|
+
return { contentParts, aggregateContent, stepMap, contentAgentMap };
|
|
710
725
|
}
|
package/src/types/stream.ts
CHANGED
|
@@ -332,6 +332,8 @@ export type MessageContentComplex = (
|
|
|
332
332
|
})
|
|
333
333
|
) & {
|
|
334
334
|
tool_call_ids?: string[];
|
|
335
|
+
// Optional agentId for parallel execution attribution
|
|
336
|
+
agentId?: string;
|
|
335
337
|
};
|
|
336
338
|
|
|
337
339
|
export interface TMessage {
|
|
@@ -399,4 +401,6 @@ export type ContentAggregatorResult = {
|
|
|
399
401
|
stepMap: Map<string, RunStep | undefined>;
|
|
400
402
|
contentParts: Array<MessageContentComplex | undefined>;
|
|
401
403
|
aggregateContent: ContentAggregator;
|
|
404
|
+
// Maps content index to agentId for parallel execution attribution
|
|
405
|
+
contentAgentMap: Map<number, string>;
|
|
402
406
|
};
|
package/src/utils/llmConfig.ts
CHANGED
|
@@ -147,9 +147,14 @@ export const llmConfigs: Record<string, t.LLMConfig | undefined> = {
|
|
|
147
147
|
[Providers.VERTEXAI]: {
|
|
148
148
|
provider: Providers.VERTEXAI,
|
|
149
149
|
model: 'gemini-2.5-flash',
|
|
150
|
+
// model: 'gemini-2.5-pro',
|
|
150
151
|
streaming: true,
|
|
151
152
|
streamUsage: true,
|
|
152
153
|
keyFile: process.env.VERTEXAI_KEY_FILE,
|
|
154
|
+
// maxRetries: 2,
|
|
155
|
+
// location: 'global',
|
|
156
|
+
// thinkingBudget: -1,
|
|
157
|
+
// includeThoughts: true,
|
|
153
158
|
} as t.VertexAIClientOptions & t.LLMConfig,
|
|
154
159
|
[Providers.GOOGLE]: {
|
|
155
160
|
provider: Providers.GOOGLE,
|