illuma-agents 1.0.17 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/agents/AgentContext.cjs +3 -1
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +18 -9
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +5 -3
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +10 -1
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +7 -8
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +2 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +11 -6
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +2 -2
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +2 -1
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/tools.cjs +2 -2
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/stream.cjs +29 -16
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +209 -47
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +1 -1
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +3 -1
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/utils/contextAnalytics.cjs +7 -5
- package/dist/cjs/utils/contextAnalytics.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/cjs/utils/toonFormat.cjs +42 -12
- package/dist/cjs/utils/toonFormat.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +3 -1
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +18 -9
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +5 -3
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +10 -1
- package/dist/esm/llm/openrouter/index.mjs.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/main.mjs +1 -1
- package/dist/esm/messages/cache.mjs +11 -6
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +2 -2
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +2 -1
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/tools.mjs +2 -2
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/stream.mjs +29 -16
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +208 -48
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +1 -1
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +3 -1
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/utils/contextAnalytics.mjs +7 -5
- package/dist/esm/utils/contextAnalytics.mjs.map +1 -1
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/esm/utils/toonFormat.mjs +42 -12
- package/dist/esm/utils/toonFormat.mjs.map +1 -1
- package/dist/types/tools/ProgrammaticToolCalling.d.ts +19 -0
- package/dist/types/types/tools.d.ts +3 -1
- package/package.json +2 -2
- package/src/agents/AgentContext.ts +28 -20
- package/src/graphs/Graph.ts +76 -37
- package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +495 -473
- package/src/llm/bedrock/index.ts +47 -35
- package/src/llm/openrouter/index.ts +11 -1
- package/src/llm/vertexai/index.ts +9 -10
- package/src/messages/cache.ts +104 -55
- package/src/messages/core.ts +5 -3
- package/src/messages/format.ts +6 -2
- package/src/messages/tools.ts +2 -2
- package/src/scripts/simple.ts +1 -1
- package/src/specs/emergency-prune.test.ts +407 -355
- package/src/stream.ts +28 -20
- package/src/tools/ProgrammaticToolCalling.ts +246 -52
- package/src/tools/ToolNode.ts +4 -4
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +155 -0
- package/src/tools/search/jina-reranker.test.ts +32 -28
- package/src/tools/search/search.ts +3 -1
- package/src/tools/search/tool.ts +16 -7
- package/src/types/tools.ts +3 -1
- package/src/utils/contextAnalytics.ts +103 -95
- package/src/utils/llmConfig.ts +8 -1
- package/src/utils/run.ts +5 -4
- package/src/utils/toonFormat.ts +475 -437
|
@@ -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 'IllumaVertexAI';
|
|
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(): 'IllumaVertexAI' {\n return 'IllumaVertexAI';\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,gBAAgB;;AAGzB,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(): 'IllumaVertexAI' {\n return 'IllumaVertexAI';\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,gBAAgB;;AAGzB,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/main.cjs
CHANGED
|
@@ -83,10 +83,12 @@ exports.imageExtRegex = CodeExecutor.imageExtRegex;
|
|
|
83
83
|
exports.createProgrammaticToolCallingTool = ProgrammaticToolCalling.createProgrammaticToolCallingTool;
|
|
84
84
|
exports.executeTools = ProgrammaticToolCalling.executeTools;
|
|
85
85
|
exports.extractUsedToolNames = ProgrammaticToolCalling.extractUsedToolNames;
|
|
86
|
+
exports.fetchSessionFiles = ProgrammaticToolCalling.fetchSessionFiles;
|
|
86
87
|
exports.filterToolsByUsage = ProgrammaticToolCalling.filterToolsByUsage;
|
|
87
88
|
exports.formatCompletedResponse = ProgrammaticToolCalling.formatCompletedResponse;
|
|
88
89
|
exports.makeRequest = ProgrammaticToolCalling.makeRequest;
|
|
89
90
|
exports.normalizeToPythonIdentifier = ProgrammaticToolCalling.normalizeToPythonIdentifier;
|
|
91
|
+
exports.unwrapToolResponse = ProgrammaticToolCalling.unwrapToolResponse;
|
|
90
92
|
exports.countNestedGroups = ToolSearchRegex.countNestedGroups;
|
|
91
93
|
exports.createToolSearchRegexTool = ToolSearchRegex.createToolSearchRegexTool;
|
|
92
94
|
exports.escapeRegexSpecialChars = ToolSearchRegex.escapeRegexSpecialChars;
|
package/dist/cjs/main.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -138,11 +138,13 @@ function stripBedrockCacheControl(messages) {
|
|
|
138
138
|
*/
|
|
139
139
|
function addBedrockCacheControl(messages) {
|
|
140
140
|
if (!Array.isArray(messages) || messages.length < 1) {
|
|
141
|
-
debugCache('addBedrockCacheControl: Skipping - no messages', {
|
|
141
|
+
debugCache('addBedrockCacheControl: Skipping - no messages', {
|
|
142
|
+
count: messages.length,
|
|
143
|
+
});
|
|
142
144
|
return messages;
|
|
143
145
|
}
|
|
144
146
|
debugCache('addBedrockCacheControl: Processing messages with stable prefix strategy', {
|
|
145
|
-
count: messages.length
|
|
147
|
+
count: messages.length,
|
|
146
148
|
});
|
|
147
149
|
const updatedMessages = messages.slice();
|
|
148
150
|
// First pass: Remove ALL existing cache points to ensure clean state
|
|
@@ -170,7 +172,7 @@ function addBedrockCacheControl(messages) {
|
|
|
170
172
|
const type = block.type;
|
|
171
173
|
// Check for all reasoning/thinking block types:
|
|
172
174
|
// - reasoning_content: Bedrock Anthropic extended thinking
|
|
173
|
-
// - reasoning: Generic reasoning format
|
|
175
|
+
// - reasoning: Generic reasoning format
|
|
174
176
|
// - thinking: Anthropic direct API thinking
|
|
175
177
|
// - redacted_thinking: Anthropic redacted thinking blocks
|
|
176
178
|
if (type === 'reasoning_content' ||
|
|
@@ -211,7 +213,9 @@ function addBedrockCacheControl(messages) {
|
|
|
211
213
|
}
|
|
212
214
|
}
|
|
213
215
|
// Log message summary
|
|
214
|
-
debugCache(`📨 Messages | total=${updatedMessages.length} | ${Object.entries(messageTypes)
|
|
216
|
+
debugCache(`📨 Messages | total=${updatedMessages.length} | ${Object.entries(messageTypes)
|
|
217
|
+
.map(([k, v]) => `${k}:${v}`)
|
|
218
|
+
.join(' ')} | skippedReasoning=${skippedWithReasoning}`);
|
|
215
219
|
// If no suitable assistant message found, skip conversation caching
|
|
216
220
|
// (System and Tools caching are still handled separately)
|
|
217
221
|
if (lastAssistantIndex === -1) {
|
|
@@ -232,7 +236,8 @@ function addBedrockCacheControl(messages) {
|
|
|
232
236
|
contentLength: content.length,
|
|
233
237
|
});
|
|
234
238
|
}
|
|
235
|
-
else if (Array.isArray(assistantMessage.content) &&
|
|
239
|
+
else if (Array.isArray(assistantMessage.content) &&
|
|
240
|
+
assistantMessage.content.length > 0) {
|
|
236
241
|
// Double-check: If this message has reasoning blocks, skip adding cache point entirely
|
|
237
242
|
// This handles edge cases where the initial skip check might have missed it
|
|
238
243
|
if (hasReasoningBlock(assistantMessage)) {
|
|
@@ -249,7 +254,7 @@ function addBedrockCacheControl(messages) {
|
|
|
249
254
|
const type = block.type;
|
|
250
255
|
if (type === _enum.ContentTypes.TEXT || type === 'text') {
|
|
251
256
|
const text = block.text;
|
|
252
|
-
if (text && text !== '') {
|
|
257
|
+
if (text != null && text !== '') {
|
|
253
258
|
assistantMessage.content.splice(j + 1, 0, {
|
|
254
259
|
cachePoint: { type: 'default' },
|
|
255
260
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.cjs","sources":["../../../src/messages/cache.ts"],"sourcesContent":["import { BaseMessage, MessageContentComplex } from '@langchain/core/messages';\nimport type { AnthropicMessage } from '@/types/messages';\nimport type Anthropic from '@anthropic-ai/sdk';\nimport { ContentTypes } from '@/common/enum';\n\ntype MessageWithContent = {\n content?: string | MessageContentComplex[];\n};\n\n/** Debug logger for cache operations - set ILLUMA_DEBUG_CACHE=true to enable */\nconst debugCache = (message: string, data?: unknown) => {\n if (process.env.ILLUMA_DEBUG_CACHE === 'true') {\n // eslint-disable-next-line no-console\n console.log(`[Cache] ${message}`, data !== undefined ? JSON.stringify(data, null, 2) : '');\n }\n};\n\n/**\n * Anthropic API: Adds cache control to the appropriate user messages in the payload.\n * Strips ALL existing cache control (both Anthropic and Bedrock formats) from all messages,\n * then adds fresh cache control to the last 2 user messages in a single backward pass.\n * This ensures we don't accumulate stale cache points across multiple turns.\n * @param messages - The array of message objects.\n * @returns - The updated array of message objects with cache control added.\n */\nexport function addCacheControl<T extends AnthropicMessage | BaseMessage>(\n messages: T[]\n): T[] {\n if (!Array.isArray(messages) || messages.length < 2) {\n return messages;\n }\n\n const updatedMessages = [...messages];\n let userMessagesModified = 0;\n\n for (let i = updatedMessages.length - 1; i >= 0; i--) {\n const message = updatedMessages[i];\n const isUserMessage =\n ('getType' in message && message.getType() === 'human') ||\n ('role' in message && message.role === 'user');\n\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (block) => !isCachePoint(block as MessageContentComplex)\n ) as typeof message.content;\n\n for (let j = 0; j < message.content.length; j++) {\n const block = message.content[j] as Record<string, unknown>;\n if ('cache_control' in block) {\n delete block.cache_control;\n }\n }\n }\n\n if (userMessagesModified >= 2 || !isUserMessage) {\n continue;\n }\n\n if (typeof message.content === 'string') {\n message.content = [\n {\n type: 'text',\n text: message.content,\n cache_control: { type: 'ephemeral' },\n },\n ];\n userMessagesModified++;\n } else if (Array.isArray(message.content)) {\n for (let j = message.content.length - 1; j >= 0; j--) {\n const contentPart = message.content[j];\n if ('type' in contentPart && contentPart.type === 'text') {\n (contentPart as Anthropic.TextBlockParam).cache_control = {\n type: 'ephemeral',\n };\n userMessagesModified++;\n break;\n }\n }\n }\n }\n\n return updatedMessages;\n}\n\n/**\n * Checks if a content block is a cache point\n */\nfunction isCachePoint(block: MessageContentComplex): boolean {\n return 'cachePoint' in block && !('type' in block);\n}\n\n/**\n * Removes all Anthropic cache_control fields from messages\n * Used when switching from Anthropic to Bedrock provider\n */\nexport function stripAnthropicCacheControl<T extends MessageWithContent>(\n messages: T[]\n): T[] {\n if (!Array.isArray(messages)) {\n return messages;\n }\n\n const updatedMessages = [...messages];\n\n for (let i = 0; i < updatedMessages.length; i++) {\n const message = updatedMessages[i];\n const content = message.content;\n\n if (Array.isArray(content)) {\n for (let j = 0; j < content.length; j++) {\n const block = content[j] as Record<string, unknown>;\n if ('cache_control' in block) {\n delete block.cache_control;\n }\n }\n }\n }\n\n return updatedMessages;\n}\n\n/**\n * Removes all Bedrock cachePoint blocks from messages\n * Used when switching from Bedrock to Anthropic provider\n */\nexport function stripBedrockCacheControl<T extends MessageWithContent>(\n messages: T[]\n): T[] {\n if (!Array.isArray(messages)) {\n return messages;\n }\n\n const updatedMessages = [...messages];\n\n for (let i = 0; i < updatedMessages.length; i++) {\n const message = updatedMessages[i];\n const content = message.content;\n\n if (Array.isArray(content)) {\n message.content = content.filter(\n (block) => !isCachePoint(block as MessageContentComplex)\n ) as typeof content;\n }\n }\n\n return updatedMessages;\n}\n\n/**\n * Adds Bedrock Converse API cache points using \"Stable Prefix Caching\" strategy.\n * \n * STRATEGY: Place cache point after the LAST ASSISTANT message only.\n * This ensures the prefix (everything before the cache point) remains STABLE\n * as the conversation grows, maximizing cache hits.\n * \n * Why this works:\n * - System message has its own cachePoint (added in AgentContext)\n * - Tools have their own cachePoint (added in CustomChatBedrockConverse)\n * - Conversation history grows, but the PREFIX stays the same\n * - Only the NEW user message is uncached (it's always different)\n * \n * Example conversation flow:\n * Request 1: [System+cachePoint][Tools+cachePoint][User1] → No conversation cache yet\n * Request 2: [System][Tools][User1][Assistant1+cachePoint][User2] → Cache User1+Assistant1\n * Request 3: [System][Tools][User1][Assistant1][User2][Assistant2+cachePoint][User3]\n * → Cache reads User1+A1+User2+A2, cache writes new portion\n * \n * Claude's \"Simplified Cache Management\" automatically looks back up to 20 content\n * blocks from the cache checkpoint to find the longest matching prefix.\n * \n * @param messages - The array of message objects (excluding system message).\n * @returns - The updated array with a single cache point after the last assistant message.\n */\nexport function addBedrockCacheControl<\n T extends Partial<BaseMessage> & MessageWithContent,\n>(messages: T[]): T[] {\n if (!Array.isArray(messages) || messages.length < 1) {\n debugCache('addBedrockCacheControl: Skipping - no messages', { count: messages?.length });\n return messages;\n }\n\n debugCache('addBedrockCacheControl: Processing messages with stable prefix strategy', { \n count: messages.length \n });\n \n const updatedMessages: T[] = messages.slice();\n \n // First pass: Remove ALL existing cache points to ensure clean state\n // This prevents accumulation of stale cache points\n for (const message of updatedMessages) {\n const content = message.content;\n if (Array.isArray(content)) {\n message.content = content.filter(\n (block) => !isCachePoint(block)\n ) as typeof content;\n\n // Also remove Anthropic-style cache_control\n for (let j = 0; j < message.content.length; j++) {\n const block = message.content[j] as Record<string, unknown>;\n if ('cache_control' in block) {\n delete block.cache_control;\n }\n }\n }\n }\n\n // Helper function to check if a message contains reasoning/thinking blocks\n const hasReasoningBlock = (message: T): boolean => {\n const content = message.content;\n if (!Array.isArray(content)) {\n return false;\n }\n for (const block of content) {\n const type = (block as { type?: string }).type;\n // Check for all reasoning/thinking block types:\n // - reasoning_content: Bedrock Anthropic extended thinking\n // - reasoning: Generic reasoning format \n // - thinking: Anthropic direct API thinking\n // - redacted_thinking: Anthropic redacted thinking blocks\n if (\n type === 'reasoning_content' ||\n type === 'reasoning' ||\n type === 'thinking' ||\n type === 'redacted_thinking'\n ) {\n return true;\n }\n }\n return false;\n };\n\n // Second pass: Find the LAST assistant message WITHOUT reasoning blocks and add a cache point there\n // Messages with reasoning/thinking blocks cannot have cache points after them (Bedrock limitation)\n let lastAssistantIndex = -1;\n let skippedWithReasoning = 0;\n \n // Count message types for logging\n const messageTypes: Record<string, number> = {};\n for (const message of updatedMessages) {\n const msgType = 'getType' in message && typeof message.getType === 'function' \n ? message.getType() \n : 'unknown';\n messageTypes[msgType] = (messageTypes[msgType] || 0) + 1;\n }\n \n for (let i = updatedMessages.length - 1; i >= 0; i--) {\n const message = updatedMessages[i];\n const messageType = 'getType' in message && typeof message.getType === 'function' \n ? message.getType() \n : 'unknown';\n \n if (messageType === 'ai') {\n // Skip assistant messages with reasoning blocks - cache points not allowed after them\n if (hasReasoningBlock(message)) {\n skippedWithReasoning++;\n debugCache('addBedrockCacheControl: Skipping assistant message with reasoning block', { index: i });\n continue;\n }\n lastAssistantIndex = i;\n break;\n }\n }\n\n // Log message summary\n debugCache(`📨 Messages | total=${updatedMessages.length} | ${Object.entries(messageTypes).map(([k,v]) => `${k}:${v}`).join(' ')} | skippedReasoning=${skippedWithReasoning}`);\n\n // If no suitable assistant message found, skip conversation caching\n // (System and Tools caching are still handled separately)\n if (lastAssistantIndex === -1) {\n debugCache('📨 Messages | No suitable assistant message for cachePoint (first turn or all have reasoning)');\n return updatedMessages;\n }\n\n // Add cache point to the last assistant message (without reasoning blocks)\n const assistantMessage = updatedMessages[lastAssistantIndex];\n const content = assistantMessage.content;\n\n if (typeof content === 'string' && content !== '') {\n assistantMessage.content = [\n { type: ContentTypes.TEXT, text: content },\n { cachePoint: { type: 'default' } },\n ] as MessageContentComplex[];\n debugCache(`📍 Message cachePoint at index ${lastAssistantIndex} (string, ${content.length} chars)`);\n debugCache('addBedrockCacheControl: Added cachePoint to assistant message (string content)', {\n index: lastAssistantIndex,\n contentLength: content.length,\n });\n } else if (Array.isArray(assistantMessage.content) && assistantMessage.content.length > 0) {\n // Double-check: If this message has reasoning blocks, skip adding cache point entirely\n // This handles edge cases where the initial skip check might have missed it\n if (hasReasoningBlock(assistantMessage)) {\n debugCache(`⚠️ Message cachePoint SKIPPED at index ${lastAssistantIndex} (has reasoning blocks)`);\n debugCache('addBedrockCacheControl: Skipping - assistant message has reasoning blocks (safety check)', {\n index: lastAssistantIndex,\n });\n return updatedMessages;\n }\n \n // Find the last text block and insert cache point after it\n let inserted = false;\n for (let j = assistantMessage.content.length - 1; j >= 0; j--) {\n const block = assistantMessage.content[j] as MessageContentComplex;\n const type = (block as { type?: string }).type;\n if (type === ContentTypes.TEXT || type === 'text') {\n const text = (block as { text?: string }).text;\n if (text && text !== '') {\n assistantMessage.content.splice(j + 1, 0, {\n cachePoint: { type: 'default' },\n } as MessageContentComplex);\n inserted = true;\n debugCache(`📍 Message cachePoint at index ${lastAssistantIndex} (array, block ${j}, ${text.length} chars)`);\n debugCache('addBedrockCacheControl: Added cachePoint after text block in assistant message', {\n index: lastAssistantIndex,\n textBlockIndex: j,\n contentLength: text.length,\n });\n break;\n }\n }\n }\n \n // If no text block found, don't append cache point as the message structure is unexpected\n if (!inserted) {\n const contentTypes = assistantMessage.content.map((b) => (b as { type?: string }).type);\n debugCache(`⚠️ Message cachePoint SKIPPED at index ${lastAssistantIndex} (no text block, types: ${contentTypes.join(',')})`);\n debugCache('addBedrockCacheControl: No suitable text block found, skipping cache point', {\n index: lastAssistantIndex,\n contentTypes,\n });\n }\n }\n\n debugCache('addBedrockCacheControl: Complete - stable prefix caching applied', { \n lastAssistantIndex,\n totalMessages: updatedMessages.length,\n });\n\n return updatedMessages;\n}\n"],"names":["ContentTypes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cache.cjs","sources":["../../../src/messages/cache.ts"],"sourcesContent":["import { BaseMessage, MessageContentComplex } from '@langchain/core/messages';\nimport type { AnthropicMessage } from '@/types/messages';\nimport type Anthropic from '@anthropic-ai/sdk';\nimport { ContentTypes } from '@/common/enum';\n\ntype MessageWithContent = {\n content?: string | MessageContentComplex[];\n};\n\n/** Debug logger for cache operations - set ILLUMA_DEBUG_CACHE=true to enable */\nconst debugCache = (message: string, data?: unknown): void => {\n if (process.env.ILLUMA_DEBUG_CACHE === 'true') {\n // eslint-disable-next-line no-console\n console.log(\n `[Cache] ${message}`,\n data !== undefined ? JSON.stringify(data, null, 2) : ''\n );\n }\n};\n\n/**\n * Anthropic API: Adds cache control to the appropriate user messages in the payload.\n * Strips ALL existing cache control (both Anthropic and Bedrock formats) from all messages,\n * then adds fresh cache control to the last 2 user messages in a single backward pass.\n * This ensures we don't accumulate stale cache points across multiple turns.\n * @param messages - The array of message objects.\n * @returns - The updated array of message objects with cache control added.\n */\nexport function addCacheControl<T extends AnthropicMessage | BaseMessage>(\n messages: T[]\n): T[] {\n if (!Array.isArray(messages) || messages.length < 2) {\n return messages;\n }\n\n const updatedMessages = [...messages];\n let userMessagesModified = 0;\n\n for (let i = updatedMessages.length - 1; i >= 0; i--) {\n const message = updatedMessages[i];\n const isUserMessage =\n ('getType' in message && message.getType() === 'human') ||\n ('role' in message && message.role === 'user');\n\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (block) => !isCachePoint(block as MessageContentComplex)\n ) as typeof message.content;\n\n for (let j = 0; j < message.content.length; j++) {\n const block = message.content[j] as Record<string, unknown>;\n if ('cache_control' in block) {\n delete block.cache_control;\n }\n }\n }\n\n if (userMessagesModified >= 2 || !isUserMessage) {\n continue;\n }\n\n if (typeof message.content === 'string') {\n message.content = [\n {\n type: 'text',\n text: message.content,\n cache_control: { type: 'ephemeral' },\n },\n ];\n userMessagesModified++;\n } else if (Array.isArray(message.content)) {\n for (let j = message.content.length - 1; j >= 0; j--) {\n const contentPart = message.content[j];\n if ('type' in contentPart && contentPart.type === 'text') {\n (contentPart as Anthropic.TextBlockParam).cache_control = {\n type: 'ephemeral',\n };\n userMessagesModified++;\n break;\n }\n }\n }\n }\n\n return updatedMessages;\n}\n\n/**\n * Checks if a content block is a cache point\n */\nfunction isCachePoint(block: MessageContentComplex): boolean {\n return 'cachePoint' in block && !('type' in block);\n}\n\n/**\n * Removes all Anthropic cache_control fields from messages\n * Used when switching from Anthropic to Bedrock provider\n */\nexport function stripAnthropicCacheControl<T extends MessageWithContent>(\n messages: T[]\n): T[] {\n if (!Array.isArray(messages)) {\n return messages;\n }\n\n const updatedMessages = [...messages];\n\n for (let i = 0; i < updatedMessages.length; i++) {\n const message = updatedMessages[i];\n const content = message.content;\n\n if (Array.isArray(content)) {\n for (let j = 0; j < content.length; j++) {\n const block = content[j] as Record<string, unknown>;\n if ('cache_control' in block) {\n delete block.cache_control;\n }\n }\n }\n }\n\n return updatedMessages;\n}\n\n/**\n * Removes all Bedrock cachePoint blocks from messages\n * Used when switching from Bedrock to Anthropic provider\n */\nexport function stripBedrockCacheControl<T extends MessageWithContent>(\n messages: T[]\n): T[] {\n if (!Array.isArray(messages)) {\n return messages;\n }\n\n const updatedMessages = [...messages];\n\n for (let i = 0; i < updatedMessages.length; i++) {\n const message = updatedMessages[i];\n const content = message.content;\n\n if (Array.isArray(content)) {\n message.content = content.filter(\n (block) => !isCachePoint(block as MessageContentComplex)\n ) as typeof content;\n }\n }\n\n return updatedMessages;\n}\n\n/**\n * Adds Bedrock Converse API cache points using \"Stable Prefix Caching\" strategy.\n *\n * STRATEGY: Place cache point after the LAST ASSISTANT message only.\n * This ensures the prefix (everything before the cache point) remains STABLE\n * as the conversation grows, maximizing cache hits.\n *\n * Why this works:\n * - System message has its own cachePoint (added in AgentContext)\n * - Tools have their own cachePoint (added in CustomChatBedrockConverse)\n * - Conversation history grows, but the PREFIX stays the same\n * - Only the NEW user message is uncached (it's always different)\n *\n * Example conversation flow:\n * Request 1: [System+cachePoint][Tools+cachePoint][User1] → No conversation cache yet\n * Request 2: [System][Tools][User1][Assistant1+cachePoint][User2] → Cache User1+Assistant1\n * Request 3: [System][Tools][User1][Assistant1][User2][Assistant2+cachePoint][User3]\n * → Cache reads User1+A1+User2+A2, cache writes new portion\n *\n * Claude's \"Simplified Cache Management\" automatically looks back up to 20 content\n * blocks from the cache checkpoint to find the longest matching prefix.\n *\n * @param messages - The array of message objects (excluding system message).\n * @returns - The updated array with a single cache point after the last assistant message.\n */\nexport function addBedrockCacheControl<\n T extends Partial<BaseMessage> & MessageWithContent,\n>(messages: T[]): T[] {\n if (!Array.isArray(messages) || messages.length < 1) {\n debugCache('addBedrockCacheControl: Skipping - no messages', {\n count: messages.length,\n });\n return messages;\n }\n\n debugCache(\n 'addBedrockCacheControl: Processing messages with stable prefix strategy',\n {\n count: messages.length,\n }\n );\n\n const updatedMessages: T[] = messages.slice();\n\n // First pass: Remove ALL existing cache points to ensure clean state\n // This prevents accumulation of stale cache points\n for (const message of updatedMessages) {\n const content = message.content;\n if (Array.isArray(content)) {\n message.content = content.filter(\n (block) => !isCachePoint(block)\n ) as typeof content;\n\n // Also remove Anthropic-style cache_control\n for (let j = 0; j < message.content.length; j++) {\n const block = message.content[j] as Record<string, unknown>;\n if ('cache_control' in block) {\n delete block.cache_control;\n }\n }\n }\n }\n\n // Helper function to check if a message contains reasoning/thinking blocks\n const hasReasoningBlock = (message: T): boolean => {\n const content = message.content;\n if (!Array.isArray(content)) {\n return false;\n }\n for (const block of content) {\n const type = (block as { type?: string }).type;\n // Check for all reasoning/thinking block types:\n // - reasoning_content: Bedrock Anthropic extended thinking\n // - reasoning: Generic reasoning format\n // - thinking: Anthropic direct API thinking\n // - redacted_thinking: Anthropic redacted thinking blocks\n if (\n type === 'reasoning_content' ||\n type === 'reasoning' ||\n type === 'thinking' ||\n type === 'redacted_thinking'\n ) {\n return true;\n }\n }\n return false;\n };\n\n // Second pass: Find the LAST assistant message WITHOUT reasoning blocks and add a cache point there\n // Messages with reasoning/thinking blocks cannot have cache points after them (Bedrock limitation)\n let lastAssistantIndex = -1;\n let skippedWithReasoning = 0;\n\n // Count message types for logging\n const messageTypes: Record<string, number> = {};\n for (const message of updatedMessages) {\n const msgType =\n 'getType' in message && typeof message.getType === 'function'\n ? message.getType()\n : 'unknown';\n messageTypes[msgType] = (messageTypes[msgType] || 0) + 1;\n }\n\n for (let i = updatedMessages.length - 1; i >= 0; i--) {\n const message = updatedMessages[i];\n const messageType =\n 'getType' in message && typeof message.getType === 'function'\n ? message.getType()\n : 'unknown';\n\n if (messageType === 'ai') {\n // Skip assistant messages with reasoning blocks - cache points not allowed after them\n if (hasReasoningBlock(message)) {\n skippedWithReasoning++;\n debugCache(\n 'addBedrockCacheControl: Skipping assistant message with reasoning block',\n { index: i }\n );\n continue;\n }\n lastAssistantIndex = i;\n break;\n }\n }\n\n // Log message summary\n debugCache(\n `📨 Messages | total=${updatedMessages.length} | ${Object.entries(\n messageTypes\n )\n .map(([k, v]) => `${k}:${v}`)\n .join(' ')} | skippedReasoning=${skippedWithReasoning}`\n );\n\n // If no suitable assistant message found, skip conversation caching\n // (System and Tools caching are still handled separately)\n if (lastAssistantIndex === -1) {\n debugCache(\n '📨 Messages | No suitable assistant message for cachePoint (first turn or all have reasoning)'\n );\n return updatedMessages;\n }\n\n // Add cache point to the last assistant message (without reasoning blocks)\n const assistantMessage = updatedMessages[lastAssistantIndex];\n const content = assistantMessage.content;\n\n if (typeof content === 'string' && content !== '') {\n assistantMessage.content = [\n { type: ContentTypes.TEXT, text: content },\n { cachePoint: { type: 'default' } },\n ] as MessageContentComplex[];\n debugCache(\n `📍 Message cachePoint at index ${lastAssistantIndex} (string, ${content.length} chars)`\n );\n debugCache(\n 'addBedrockCacheControl: Added cachePoint to assistant message (string content)',\n {\n index: lastAssistantIndex,\n contentLength: content.length,\n }\n );\n } else if (\n Array.isArray(assistantMessage.content) &&\n assistantMessage.content.length > 0\n ) {\n // Double-check: If this message has reasoning blocks, skip adding cache point entirely\n // This handles edge cases where the initial skip check might have missed it\n if (hasReasoningBlock(assistantMessage)) {\n debugCache(\n `⚠️ Message cachePoint SKIPPED at index ${lastAssistantIndex} (has reasoning blocks)`\n );\n debugCache(\n 'addBedrockCacheControl: Skipping - assistant message has reasoning blocks (safety check)',\n {\n index: lastAssistantIndex,\n }\n );\n return updatedMessages;\n }\n\n // Find the last text block and insert cache point after it\n let inserted = false;\n for (let j = assistantMessage.content.length - 1; j >= 0; j--) {\n const block = assistantMessage.content[j] as MessageContentComplex;\n const type = (block as { type?: string }).type;\n if (type === ContentTypes.TEXT || type === 'text') {\n const text = (block as { text?: string }).text;\n if (text != null && text !== '') {\n assistantMessage.content.splice(j + 1, 0, {\n cachePoint: { type: 'default' },\n } as MessageContentComplex);\n inserted = true;\n debugCache(\n `📍 Message cachePoint at index ${lastAssistantIndex} (array, block ${j}, ${text.length} chars)`\n );\n debugCache(\n 'addBedrockCacheControl: Added cachePoint after text block in assistant message',\n {\n index: lastAssistantIndex,\n textBlockIndex: j,\n contentLength: text.length,\n }\n );\n break;\n }\n }\n }\n\n // If no text block found, don't append cache point as the message structure is unexpected\n if (!inserted) {\n const contentTypes = assistantMessage.content.map(\n (b) => (b as { type?: string }).type\n );\n debugCache(\n `⚠️ Message cachePoint SKIPPED at index ${lastAssistantIndex} (no text block, types: ${contentTypes.join(',')})`\n );\n debugCache(\n 'addBedrockCacheControl: No suitable text block found, skipping cache point',\n {\n index: lastAssistantIndex,\n contentTypes,\n }\n );\n }\n }\n\n debugCache(\n 'addBedrockCacheControl: Complete - stable prefix caching applied',\n {\n lastAssistantIndex,\n totalMessages: updatedMessages.length,\n }\n );\n\n return updatedMessages;\n}\n"],"names":["ContentTypes"],"mappings":"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"}
|
|
@@ -263,7 +263,7 @@ function convertMessagesToContent(messages) {
|
|
|
263
263
|
function formatAnthropicArtifactContent(messages$1) {
|
|
264
264
|
const lastMessage = messages$1[messages$1.length - 1];
|
|
265
265
|
// Use getType() instead of instanceof to avoid module mismatch issues
|
|
266
|
-
if (lastMessage
|
|
266
|
+
if (lastMessage.getType() !== 'tool')
|
|
267
267
|
return;
|
|
268
268
|
const lastToolMessage = lastMessage;
|
|
269
269
|
// Find the latest AIMessage with tool_calls that this tool message belongs to
|
|
@@ -299,7 +299,7 @@ function formatAnthropicArtifactContent(messages$1) {
|
|
|
299
299
|
function formatArtifactPayload(messages$1) {
|
|
300
300
|
const lastMessageY = messages$1[messages$1.length - 1];
|
|
301
301
|
// Use getType() instead of instanceof to avoid module mismatch issues
|
|
302
|
-
if (lastMessageY
|
|
302
|
+
if (lastMessageY.getType() !== 'tool')
|
|
303
303
|
return;
|
|
304
304
|
const lastToolMessage = lastMessageY;
|
|
305
305
|
// Find the latest AIMessage with tool_calls that this tool message belongs to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.cjs","sources":["../../../src/messages/core.ts"],"sourcesContent":["// src/messages.ts\nimport {\n AIMessageChunk,\n HumanMessage,\n ToolMessage,\n AIMessage,\n BaseMessage,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type * as t from '@/types';\nimport { Providers, MessageTypes } from '@/common';\n\nexport function getConverseOverrideMessage({\n userMessage,\n lastMessageX,\n lastMessageY,\n}: {\n userMessage: string[];\n lastMessageX: AIMessageChunk | null;\n lastMessageY: ToolMessage;\n}): HumanMessage {\n const content = `\nUser: ${userMessage[1]}\n\n---\n# YOU HAVE ALREADY RESPONDED TO THE LATEST USER MESSAGE:\n\n# Observations:\n- ${lastMessageX?.content}\n\n# Tool Calls:\n- ${lastMessageX?.tool_calls?.join('\\n- ')}\n\n# Tool Responses:\n- ${lastMessageY.content}\n`;\n\n return new HumanMessage(content);\n}\n\nconst _allowedTypes = ['image_url', 'text', 'tool_use', 'tool_result'];\nconst allowedTypesByProvider: Record<string, string[]> = {\n default: _allowedTypes,\n [Providers.ANTHROPIC]: [..._allowedTypes, 'thinking'],\n [Providers.BEDROCK]: [..._allowedTypes, 'reasoning_content'],\n [Providers.OPENAI]: _allowedTypes,\n};\n\nconst modifyContent = ({\n provider,\n messageType,\n content,\n}: {\n provider: Providers;\n messageType: string;\n content: t.ExtendedMessageContent[];\n}): t.ExtendedMessageContent[] => {\n const allowedTypes =\n allowedTypesByProvider[provider] ?? allowedTypesByProvider.default;\n return content.map((item) => {\n if (\n item &&\n typeof item === 'object' &&\n 'type' in item &&\n item.type != null &&\n item.type\n ) {\n let newType = item.type;\n if (newType.endsWith('_delta')) {\n newType = newType.replace('_delta', '');\n }\n if (!allowedTypes.includes(newType)) {\n newType = 'text';\n }\n\n /* Handle the edge case for empty object 'tool_use' input in AI messages */\n if (\n messageType === 'ai' &&\n newType === 'tool_use' &&\n 'input' in item &&\n item.input === ''\n ) {\n return { ...item, type: newType, input: '{}' };\n }\n\n return { ...item, type: newType };\n }\n return item;\n });\n};\n\ntype ContentBlock =\n | Partial<t.BedrockReasoningContentText>\n | t.MessageDeltaUpdate;\n\nfunction reduceBlocks(blocks: ContentBlock[]): ContentBlock[] {\n const reduced: ContentBlock[] = [];\n\n for (const block of blocks) {\n const lastBlock = reduced[reduced.length - 1] as ContentBlock | undefined;\n\n // Merge consecutive 'reasoning_content'\n if (\n block.type === 'reasoning_content' &&\n lastBlock?.type === 'reasoning_content'\n ) {\n // append text if exists\n if (block.reasoningText?.text != null && block.reasoningText.text) {\n (\n lastBlock.reasoningText as t.BedrockReasoningContentText['reasoningText']\n ).text =\n (lastBlock.reasoningText?.text ?? '') + block.reasoningText.text;\n }\n // preserve the signature if exists\n if (\n block.reasoningText?.signature != null &&\n block.reasoningText.signature\n ) {\n (\n lastBlock.reasoningText as t.BedrockReasoningContentText['reasoningText']\n ).signature = block.reasoningText.signature;\n }\n }\n // Merge consecutive 'text'\n else if (block.type === 'text' && lastBlock?.type === 'text') {\n lastBlock.text += block.text;\n }\n // add a new block as it's a different type or first element\n else {\n // deep copy to avoid mutation of original\n reduced.push(JSON.parse(JSON.stringify(block)));\n }\n }\n\n return reduced;\n}\n\nexport function modifyDeltaProperties(\n provider: Providers,\n obj?: AIMessageChunk\n): AIMessageChunk | undefined {\n if (!obj || typeof obj !== 'object') return obj;\n\n const messageType = (obj as Partial<AIMessageChunk>)._getType\n ? obj._getType()\n : '';\n\n if (provider === Providers.BEDROCK && Array.isArray(obj.content)) {\n obj.content = reduceBlocks(obj.content as ContentBlock[]);\n }\n if (Array.isArray(obj.content)) {\n obj.content = modifyContent({\n provider,\n messageType,\n content: obj.content,\n });\n }\n if (\n (obj as Partial<AIMessageChunk>).lc_kwargs &&\n Array.isArray(obj.lc_kwargs.content)\n ) {\n obj.lc_kwargs.content = modifyContent({\n provider,\n messageType,\n content: obj.lc_kwargs.content,\n });\n }\n return obj;\n}\n\nexport function formatAnthropicMessage(message: AIMessageChunk): AIMessage {\n if (!message.tool_calls || message.tool_calls.length === 0) {\n return new AIMessage({ content: message.content });\n }\n\n const toolCallMap = new Map(message.tool_calls.map((tc) => [tc.id, tc]));\n let formattedContent: string | t.ExtendedMessageContent[];\n\n if (Array.isArray(message.content)) {\n formattedContent = message.content.reduce<t.ExtendedMessageContent[]>(\n (acc, item) => {\n if (typeof item === 'object') {\n const extendedItem = item as t.ExtendedMessageContent;\n if (\n extendedItem.type === 'text' &&\n extendedItem.text != null &&\n extendedItem.text\n ) {\n acc.push({ type: 'text', text: extendedItem.text });\n } else if (\n extendedItem.type === 'tool_use' &&\n extendedItem.id != null &&\n extendedItem.id\n ) {\n const toolCall = toolCallMap.get(extendedItem.id);\n if (toolCall) {\n acc.push({\n type: 'tool_use',\n id: extendedItem.id,\n name: toolCall.name,\n input: toolCall.args as unknown as string,\n });\n }\n } else if (\n 'input' in extendedItem &&\n extendedItem.input != null &&\n extendedItem.input\n ) {\n try {\n const parsedInput = JSON.parse(extendedItem.input);\n const toolCall = message.tool_calls?.find(\n (tc) => tc.args.input === parsedInput.input\n );\n if (toolCall) {\n acc.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.args as unknown as string,\n });\n }\n } catch {\n if (extendedItem.input) {\n acc.push({ type: 'text', text: extendedItem.input });\n }\n }\n }\n } else if (typeof item === 'string') {\n acc.push({ type: 'text', text: item });\n }\n return acc;\n },\n []\n );\n } else if (typeof message.content === 'string') {\n formattedContent = message.content;\n } else {\n formattedContent = [];\n }\n\n // const formattedToolCalls: ToolCall[] = message.tool_calls.map(toolCall => ({\n // id: toolCall.id ?? '',\n // name: toolCall.name,\n // args: toolCall.args,\n // type: 'tool_call',\n // }));\n\n const formattedToolCalls: t.AgentToolCall[] = message.tool_calls.map(\n (toolCall) => ({\n id: toolCall.id ?? '',\n type: 'function',\n function: {\n name: toolCall.name,\n arguments: toolCall.args,\n },\n })\n );\n\n return new AIMessage({\n content: formattedContent,\n tool_calls: formattedToolCalls as ToolCall[],\n additional_kwargs: {\n ...message.additional_kwargs,\n },\n });\n}\n\nexport function convertMessagesToContent(\n messages: BaseMessage[]\n): t.MessageContentComplex[] {\n const processedContent: t.MessageContentComplex[] = [];\n\n const addContentPart = (message: BaseMessage | null): void => {\n const content =\n message?.lc_kwargs.content != null\n ? message.lc_kwargs.content\n : message?.content;\n if (content === undefined) {\n return;\n }\n if (typeof content === 'string') {\n processedContent.push({\n type: 'text',\n text: content,\n });\n } else if (Array.isArray(content)) {\n const filteredContent = content.filter(\n (item) => item != null && item.type !== 'tool_use'\n );\n processedContent.push(...filteredContent);\n }\n };\n\n let currentAIMessageIndex = -1;\n const toolCallMap = new Map<string, t.CustomToolCall>();\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i] as BaseMessage | null;\n const messageType = message?._getType();\n\n if (\n messageType === 'ai' &&\n ((message as AIMessage).tool_calls?.length ?? 0) > 0\n ) {\n const tool_calls = (message as AIMessage).tool_calls || [];\n for (const tool_call of tool_calls) {\n if (tool_call.id == null || !tool_call.id) {\n continue;\n }\n\n toolCallMap.set(tool_call.id, tool_call);\n }\n\n addContentPart(message);\n currentAIMessageIndex = processedContent.length - 1;\n continue;\n } else if (\n messageType === 'tool' &&\n (message as ToolMessage).tool_call_id\n ) {\n const id = (message as ToolMessage).tool_call_id;\n const output = (message as ToolMessage).content;\n const tool_call = toolCallMap.get(id);\n if (currentAIMessageIndex === -1) {\n processedContent.push({ type: 'text', text: '' });\n currentAIMessageIndex = processedContent.length - 1;\n }\n const contentPart = processedContent[currentAIMessageIndex];\n processedContent.push({\n type: 'tool_call',\n tool_call: Object.assign({}, tool_call, { output }),\n });\n const tool_call_ids = contentPart.tool_call_ids || [];\n tool_call_ids.push(id);\n contentPart.tool_call_ids = tool_call_ids;\n continue;\n } else if (messageType !== 'ai') {\n continue;\n }\n\n addContentPart(message);\n }\n\n return processedContent;\n}\n\nexport function formatAnthropicArtifactContent(messages: BaseMessage[]): void {\n const lastMessage = messages[messages.length - 1];\n // Use getType() instead of instanceof to avoid module mismatch issues\n if (lastMessage?.getType() !== 'tool') return;\n const lastToolMessage = lastMessage as ToolMessage;\n\n // Find the latest AIMessage with tool_calls that this tool message belongs to\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastToolMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return;\n\n // Check if any tool message after the AI message has array artifact content\n // Use getType() instead of instanceof to avoid module mismatch issues\n const hasArtifactContent = messages.some(\n (msg, i) =>\n i > latestAIParentIndex &&\n msg.getType() === MessageTypes.TOOL &&\n (msg as ToolMessage).artifact != null &&\n (msg as ToolMessage).artifact?.content != null &&\n Array.isArray((msg as ToolMessage).artifact.content)\n );\n\n if (!hasArtifactContent) return;\n\n const message = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = message.tool_calls?.map((tc) => tc.id) ?? [];\n\n for (let j = latestAIParentIndex + 1; j < messages.length; j++) {\n const msg = messages[j];\n // Use getType() instead of instanceof to avoid module mismatch issues\n if (\n msg.getType() === MessageTypes.TOOL &&\n toolCallIds.includes((msg as ToolMessage).tool_call_id) &&\n (msg as ToolMessage).artifact != null &&\n Array.isArray((msg as ToolMessage).artifact?.content) &&\n Array.isArray(msg.content)\n ) {\n msg.content = (msg.content as t.MessageContentComplex[]).concat((msg as ToolMessage).artifact.content);\n }\n }\n}\n\nexport function formatArtifactPayload(messages: BaseMessage[]): void {\n const lastMessageY = messages[messages.length - 1];\n // Use getType() instead of instanceof to avoid module mismatch issues\n if (lastMessageY?.getType() !== 'tool') return;\n const lastToolMessage = lastMessageY as ToolMessage;\n\n // Find the latest AIMessage with tool_calls that this tool message belongs to\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastToolMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return;\n\n // Check if any tool message after the AI message has array artifact content\n // Use getType() instead of instanceof to avoid module mismatch issues\n const hasArtifactContent = messages.some(\n (msg, i) =>\n i > latestAIParentIndex &&\n msg.getType() === MessageTypes.TOOL &&\n (msg as ToolMessage).artifact != null &&\n (msg as ToolMessage).artifact?.content != null &&\n Array.isArray((msg as ToolMessage).artifact.content)\n );\n\n if (!hasArtifactContent) return;\n\n // Collect all relevant tool messages and their artifacts\n // Use getType() instead of instanceof to avoid module mismatch issues\n const relevantMessages = messages\n .slice(latestAIParentIndex + 1)\n .filter((msg) => msg.getType() === MessageTypes.TOOL) as ToolMessage[];\n\n // Aggregate all content and artifacts\n const aggregatedContent: t.MessageContentComplex[] = [];\n\n relevantMessages.forEach((msg) => {\n if (!Array.isArray(msg.artifact?.content)) {\n return;\n }\n let currentContent = msg.content;\n if (!Array.isArray(currentContent)) {\n currentContent = [\n {\n type: 'text',\n text: msg.content,\n },\n ];\n }\n aggregatedContent.push(...currentContent);\n msg.content =\n 'Tool response is included in the next message as a Human message';\n aggregatedContent.push(...msg.artifact.content);\n });\n\n // Add single HumanMessage with all aggregated content\n if (aggregatedContent.length > 0) {\n messages.push(new HumanMessage({ content: aggregatedContent }));\n }\n}\n\nexport function findLastIndex<T>(\n array: T[],\n predicate: (value: T) => boolean\n): number {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n return i;\n }\n }\n return -1;\n}\n"],"names":["HumanMessage","Providers","AIMessage","messages","AIMessageChunk","MessageTypes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.cjs","sources":["../../../src/messages/core.ts"],"sourcesContent":["// src/messages.ts\nimport {\n AIMessageChunk,\n HumanMessage,\n ToolMessage,\n AIMessage,\n BaseMessage,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type * as t from '@/types';\nimport { Providers, MessageTypes } from '@/common';\n\nexport function getConverseOverrideMessage({\n userMessage,\n lastMessageX,\n lastMessageY,\n}: {\n userMessage: string[];\n lastMessageX: AIMessageChunk | null;\n lastMessageY: ToolMessage;\n}): HumanMessage {\n const content = `\nUser: ${userMessage[1]}\n\n---\n# YOU HAVE ALREADY RESPONDED TO THE LATEST USER MESSAGE:\n\n# Observations:\n- ${lastMessageX?.content}\n\n# Tool Calls:\n- ${lastMessageX?.tool_calls?.join('\\n- ')}\n\n# Tool Responses:\n- ${lastMessageY.content}\n`;\n\n return new HumanMessage(content);\n}\n\nconst _allowedTypes = ['image_url', 'text', 'tool_use', 'tool_result'];\nconst allowedTypesByProvider: Record<string, string[]> = {\n default: _allowedTypes,\n [Providers.ANTHROPIC]: [..._allowedTypes, 'thinking'],\n [Providers.BEDROCK]: [..._allowedTypes, 'reasoning_content'],\n [Providers.OPENAI]: _allowedTypes,\n};\n\nconst modifyContent = ({\n provider,\n messageType,\n content,\n}: {\n provider: Providers;\n messageType: string;\n content: t.ExtendedMessageContent[];\n}): t.ExtendedMessageContent[] => {\n const allowedTypes =\n allowedTypesByProvider[provider] ?? allowedTypesByProvider.default;\n return content.map((item) => {\n if (\n item &&\n typeof item === 'object' &&\n 'type' in item &&\n item.type != null &&\n item.type\n ) {\n let newType = item.type;\n if (newType.endsWith('_delta')) {\n newType = newType.replace('_delta', '');\n }\n if (!allowedTypes.includes(newType)) {\n newType = 'text';\n }\n\n /* Handle the edge case for empty object 'tool_use' input in AI messages */\n if (\n messageType === 'ai' &&\n newType === 'tool_use' &&\n 'input' in item &&\n item.input === ''\n ) {\n return { ...item, type: newType, input: '{}' };\n }\n\n return { ...item, type: newType };\n }\n return item;\n });\n};\n\ntype ContentBlock =\n | Partial<t.BedrockReasoningContentText>\n | t.MessageDeltaUpdate;\n\nfunction reduceBlocks(blocks: ContentBlock[]): ContentBlock[] {\n const reduced: ContentBlock[] = [];\n\n for (const block of blocks) {\n const lastBlock = reduced[reduced.length - 1] as ContentBlock | undefined;\n\n // Merge consecutive 'reasoning_content'\n if (\n block.type === 'reasoning_content' &&\n lastBlock?.type === 'reasoning_content'\n ) {\n // append text if exists\n if (block.reasoningText?.text != null && block.reasoningText.text) {\n (\n lastBlock.reasoningText as t.BedrockReasoningContentText['reasoningText']\n ).text =\n (lastBlock.reasoningText?.text ?? '') + block.reasoningText.text;\n }\n // preserve the signature if exists\n if (\n block.reasoningText?.signature != null &&\n block.reasoningText.signature\n ) {\n (\n lastBlock.reasoningText as t.BedrockReasoningContentText['reasoningText']\n ).signature = block.reasoningText.signature;\n }\n }\n // Merge consecutive 'text'\n else if (block.type === 'text' && lastBlock?.type === 'text') {\n lastBlock.text += block.text;\n }\n // add a new block as it's a different type or first element\n else {\n // deep copy to avoid mutation of original\n reduced.push(JSON.parse(JSON.stringify(block)));\n }\n }\n\n return reduced;\n}\n\nexport function modifyDeltaProperties(\n provider: Providers,\n obj?: AIMessageChunk\n): AIMessageChunk | undefined {\n if (!obj || typeof obj !== 'object') return obj;\n\n const messageType = (obj as Partial<AIMessageChunk>)._getType\n ? obj._getType()\n : '';\n\n if (provider === Providers.BEDROCK && Array.isArray(obj.content)) {\n obj.content = reduceBlocks(obj.content as ContentBlock[]);\n }\n if (Array.isArray(obj.content)) {\n obj.content = modifyContent({\n provider,\n messageType,\n content: obj.content,\n });\n }\n if (\n (obj as Partial<AIMessageChunk>).lc_kwargs &&\n Array.isArray(obj.lc_kwargs.content)\n ) {\n obj.lc_kwargs.content = modifyContent({\n provider,\n messageType,\n content: obj.lc_kwargs.content,\n });\n }\n return obj;\n}\n\nexport function formatAnthropicMessage(message: AIMessageChunk): AIMessage {\n if (!message.tool_calls || message.tool_calls.length === 0) {\n return new AIMessage({ content: message.content });\n }\n\n const toolCallMap = new Map(message.tool_calls.map((tc) => [tc.id, tc]));\n let formattedContent: string | t.ExtendedMessageContent[];\n\n if (Array.isArray(message.content)) {\n formattedContent = message.content.reduce<t.ExtendedMessageContent[]>(\n (acc, item) => {\n if (typeof item === 'object') {\n const extendedItem = item as t.ExtendedMessageContent;\n if (\n extendedItem.type === 'text' &&\n extendedItem.text != null &&\n extendedItem.text\n ) {\n acc.push({ type: 'text', text: extendedItem.text });\n } else if (\n extendedItem.type === 'tool_use' &&\n extendedItem.id != null &&\n extendedItem.id\n ) {\n const toolCall = toolCallMap.get(extendedItem.id);\n if (toolCall) {\n acc.push({\n type: 'tool_use',\n id: extendedItem.id,\n name: toolCall.name,\n input: toolCall.args as unknown as string,\n });\n }\n } else if (\n 'input' in extendedItem &&\n extendedItem.input != null &&\n extendedItem.input\n ) {\n try {\n const parsedInput = JSON.parse(extendedItem.input);\n const toolCall = message.tool_calls?.find(\n (tc) => tc.args.input === parsedInput.input\n );\n if (toolCall) {\n acc.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.args as unknown as string,\n });\n }\n } catch {\n if (extendedItem.input) {\n acc.push({ type: 'text', text: extendedItem.input });\n }\n }\n }\n } else if (typeof item === 'string') {\n acc.push({ type: 'text', text: item });\n }\n return acc;\n },\n []\n );\n } else if (typeof message.content === 'string') {\n formattedContent = message.content;\n } else {\n formattedContent = [];\n }\n\n // const formattedToolCalls: ToolCall[] = message.tool_calls.map(toolCall => ({\n // id: toolCall.id ?? '',\n // name: toolCall.name,\n // args: toolCall.args,\n // type: 'tool_call',\n // }));\n\n const formattedToolCalls: t.AgentToolCall[] = message.tool_calls.map(\n (toolCall) => ({\n id: toolCall.id ?? '',\n type: 'function',\n function: {\n name: toolCall.name,\n arguments: toolCall.args,\n },\n })\n );\n\n return new AIMessage({\n content: formattedContent,\n tool_calls: formattedToolCalls as ToolCall[],\n additional_kwargs: {\n ...message.additional_kwargs,\n },\n });\n}\n\nexport function convertMessagesToContent(\n messages: BaseMessage[]\n): t.MessageContentComplex[] {\n const processedContent: t.MessageContentComplex[] = [];\n\n const addContentPart = (message: BaseMessage | null): void => {\n const content =\n message?.lc_kwargs.content != null\n ? message.lc_kwargs.content\n : message?.content;\n if (content === undefined) {\n return;\n }\n if (typeof content === 'string') {\n processedContent.push({\n type: 'text',\n text: content,\n });\n } else if (Array.isArray(content)) {\n const filteredContent = content.filter(\n (item) => item != null && item.type !== 'tool_use'\n );\n processedContent.push(...filteredContent);\n }\n };\n\n let currentAIMessageIndex = -1;\n const toolCallMap = new Map<string, t.CustomToolCall>();\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i] as BaseMessage | null;\n const messageType = message?._getType();\n\n if (\n messageType === 'ai' &&\n ((message as AIMessage).tool_calls?.length ?? 0) > 0\n ) {\n const tool_calls = (message as AIMessage).tool_calls || [];\n for (const tool_call of tool_calls) {\n if (tool_call.id == null || !tool_call.id) {\n continue;\n }\n\n toolCallMap.set(tool_call.id, tool_call);\n }\n\n addContentPart(message);\n currentAIMessageIndex = processedContent.length - 1;\n continue;\n } else if (\n messageType === 'tool' &&\n (message as ToolMessage).tool_call_id\n ) {\n const id = (message as ToolMessage).tool_call_id;\n const output = (message as ToolMessage).content;\n const tool_call = toolCallMap.get(id);\n if (currentAIMessageIndex === -1) {\n processedContent.push({ type: 'text', text: '' });\n currentAIMessageIndex = processedContent.length - 1;\n }\n const contentPart = processedContent[currentAIMessageIndex];\n processedContent.push({\n type: 'tool_call',\n tool_call: Object.assign({}, tool_call, { output }),\n });\n const tool_call_ids = contentPart.tool_call_ids || [];\n tool_call_ids.push(id);\n contentPart.tool_call_ids = tool_call_ids;\n continue;\n } else if (messageType !== 'ai') {\n continue;\n }\n\n addContentPart(message);\n }\n\n return processedContent;\n}\n\nexport function formatAnthropicArtifactContent(messages: BaseMessage[]): void {\n const lastMessage = messages[messages.length - 1];\n // Use getType() instead of instanceof to avoid module mismatch issues\n if (lastMessage.getType() !== 'tool') return;\n const lastToolMessage = lastMessage as ToolMessage;\n\n // Find the latest AIMessage with tool_calls that this tool message belongs to\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastToolMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return;\n\n // Check if any tool message after the AI message has array artifact content\n // Use getType() instead of instanceof to avoid module mismatch issues\n const hasArtifactContent = messages.some(\n (msg, i) =>\n i > latestAIParentIndex &&\n msg.getType() === MessageTypes.TOOL &&\n (msg as ToolMessage).artifact != null &&\n (msg as ToolMessage).artifact?.content != null &&\n Array.isArray((msg as ToolMessage).artifact.content)\n );\n\n if (!hasArtifactContent) return;\n\n const message = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = message.tool_calls?.map((tc) => tc.id) ?? [];\n\n for (let j = latestAIParentIndex + 1; j < messages.length; j++) {\n const msg = messages[j];\n // Use getType() instead of instanceof to avoid module mismatch issues\n if (\n msg.getType() === MessageTypes.TOOL &&\n toolCallIds.includes((msg as ToolMessage).tool_call_id) &&\n (msg as ToolMessage).artifact != null &&\n Array.isArray((msg as ToolMessage).artifact?.content) &&\n Array.isArray(msg.content)\n ) {\n msg.content = (msg.content as t.MessageContentComplex[]).concat(\n (msg as ToolMessage).artifact.content\n );\n }\n }\n}\n\nexport function formatArtifactPayload(messages: BaseMessage[]): void {\n const lastMessageY = messages[messages.length - 1];\n // Use getType() instead of instanceof to avoid module mismatch issues\n if (lastMessageY.getType() !== 'tool') return;\n const lastToolMessage = lastMessageY as ToolMessage;\n\n // Find the latest AIMessage with tool_calls that this tool message belongs to\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastToolMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return;\n\n // Check if any tool message after the AI message has array artifact content\n // Use getType() instead of instanceof to avoid module mismatch issues\n const hasArtifactContent = messages.some(\n (msg, i) =>\n i > latestAIParentIndex &&\n msg.getType() === MessageTypes.TOOL &&\n (msg as ToolMessage).artifact != null &&\n (msg as ToolMessage).artifact?.content != null &&\n Array.isArray((msg as ToolMessage).artifact.content)\n );\n\n if (!hasArtifactContent) return;\n\n // Collect all relevant tool messages and their artifacts\n // Use getType() instead of instanceof to avoid module mismatch issues\n const relevantMessages = messages\n .slice(latestAIParentIndex + 1)\n .filter((msg) => msg.getType() === MessageTypes.TOOL) as ToolMessage[];\n\n // Aggregate all content and artifacts\n const aggregatedContent: t.MessageContentComplex[] = [];\n\n relevantMessages.forEach((msg) => {\n if (!Array.isArray(msg.artifact?.content)) {\n return;\n }\n let currentContent = msg.content;\n if (!Array.isArray(currentContent)) {\n currentContent = [\n {\n type: 'text',\n text: msg.content,\n },\n ];\n }\n aggregatedContent.push(...currentContent);\n msg.content =\n 'Tool response is included in the next message as a Human message';\n aggregatedContent.push(...msg.artifact.content);\n });\n\n // Add single HumanMessage with all aggregated content\n if (aggregatedContent.length > 0) {\n messages.push(new HumanMessage({ content: aggregatedContent }));\n }\n}\n\nexport function findLastIndex<T>(\n array: T[],\n predicate: (value: T) => boolean\n): number {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n return i;\n }\n }\n return -1;\n}\n"],"names":["HumanMessage","Providers","AIMessage","messages","AIMessageChunk","MessageTypes"],"mappings":"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"}
|
|
@@ -660,7 +660,8 @@ function ensureThinkingBlockInMessages(messages$1, _provider) {
|
|
|
660
660
|
// Look ahead for tool messages that belong to this AI message
|
|
661
661
|
// Use getType() instead of instanceof to avoid module mismatch issues
|
|
662
662
|
// where different copies of ToolMessage class might be loaded
|
|
663
|
-
while (j < messages$1.length &&
|
|
663
|
+
while (j < messages$1.length &&
|
|
664
|
+
messages$1[j].getType() === _enum.MessageTypes.TOOL) {
|
|
664
665
|
toolSequence.push(messages$1[j]);
|
|
665
666
|
j++;
|
|
666
667
|
}
|