illuma-agents 1.0.78 → 1.0.80

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.
Files changed (45) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +69 -0
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/graphs/Graph.cjs +89 -46
  4. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  5. package/dist/cjs/llm/openai/index.cjs +1 -1
  6. package/dist/cjs/main.cjs +4 -0
  7. package/dist/cjs/main.cjs.map +1 -1
  8. package/dist/cjs/schemas/validate.cjs +151 -0
  9. package/dist/cjs/schemas/validate.cjs.map +1 -1
  10. package/dist/cjs/tools/ToolNode.cjs +1 -1
  11. package/dist/cjs/types/graph.cjs +29 -0
  12. package/dist/cjs/types/graph.cjs.map +1 -0
  13. package/dist/cjs/utils/tokens.cjs +21 -8
  14. package/dist/cjs/utils/tokens.cjs.map +1 -1
  15. package/dist/esm/agents/AgentContext.mjs +69 -0
  16. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  17. package/dist/esm/graphs/Graph.mjs +89 -46
  18. package/dist/esm/graphs/Graph.mjs.map +1 -1
  19. package/dist/esm/llm/openai/index.mjs +1 -1
  20. package/dist/esm/main.mjs +2 -1
  21. package/dist/esm/main.mjs.map +1 -1
  22. package/dist/esm/schemas/validate.mjs +151 -1
  23. package/dist/esm/schemas/validate.mjs.map +1 -1
  24. package/dist/esm/tools/ToolNode.mjs +1 -1
  25. package/dist/esm/types/graph.mjs +26 -0
  26. package/dist/esm/types/graph.mjs.map +1 -0
  27. package/dist/esm/utils/tokens.mjs +21 -8
  28. package/dist/esm/utils/tokens.mjs.map +1 -1
  29. package/dist/types/agents/AgentContext.d.ts +16 -0
  30. package/dist/types/graphs/Graph.d.ts +7 -2
  31. package/dist/types/index.d.ts +1 -0
  32. package/dist/types/schemas/validate.d.ts +23 -0
  33. package/dist/types/types/graph.d.ts +25 -4
  34. package/dist/types/utils/tokens.d.ts +2 -1
  35. package/package.json +1 -1
  36. package/src/agents/AgentContext.ts +82 -0
  37. package/src/agents/__tests__/resolveStructuredOutputMode.test.ts +137 -0
  38. package/src/graphs/Graph.ts +106 -49
  39. package/src/graphs/__tests__/structured-output.integration.test.ts +809 -0
  40. package/src/graphs/__tests__/structured-output.test.ts +183 -0
  41. package/src/index.ts +1 -0
  42. package/src/schemas/schema-preparation.test.ts +500 -0
  43. package/src/schemas/validate.ts +216 -0
  44. package/src/types/graph.ts +35 -4
  45. package/src/utils/tokens.ts +23 -10
@@ -246,6 +246,75 @@ class AgentContext {
246
246
  }
247
247
  return schema;
248
248
  }
249
+ /**
250
+ * Resolves the structured output mode to a concrete method based on provider capabilities.
251
+ *
252
+ * Resolution logic:
253
+ * - 'native' or 'auto' + supported provider → native constrained decoding
254
+ * - 'native' + unsupported provider → fallback to 'functionCalling' with warning
255
+ * - 'provider' → LangChain's jsonMode (existing behavior)
256
+ * - 'tool' → function calling trick (existing behavior)
257
+ * - 'auto' + unsupported provider → 'functionCalling'
258
+ *
259
+ * @returns The resolved method for withStructuredOutput, or 'native' for direct API usage
260
+ */
261
+ resolveStructuredOutputMode() {
262
+ const mode = this.structuredOutput?.mode ?? 'auto';
263
+ const warnings = [];
264
+ // Providers that support native constrained decoding via LangChain
265
+ const nativeProviders = new Set([
266
+ _enum.Providers.ANTHROPIC,
267
+ _enum.Providers.OPENAI,
268
+ _enum.Providers.AZURE,
269
+ ]);
270
+ // Providers where LangChain supports jsonMode
271
+ const jsonModeProviders = new Set([
272
+ _enum.Providers.ANTHROPIC,
273
+ _enum.Providers.OPENAI,
274
+ _enum.Providers.AZURE,
275
+ ]);
276
+ switch (mode) {
277
+ case 'native': {
278
+ if (nativeProviders.has(this.provider)) {
279
+ if (this.provider === _enum.Providers.ANTHROPIC) {
280
+ return { method: 'jsonSchema', warnings };
281
+ }
282
+ // OpenAI/Azure
283
+ return { method: 'jsonSchema', warnings };
284
+ }
285
+ // Fallback for unsupported providers
286
+ warnings.push(`Native structured output is not supported for provider '${this.provider}'. Falling back to function calling.`);
287
+ return { method: 'functionCalling', warnings };
288
+ }
289
+ case 'auto': {
290
+ if (nativeProviders.has(this.provider)) {
291
+ if (this.provider === _enum.Providers.ANTHROPIC) {
292
+ return { method: 'jsonSchema', warnings };
293
+ }
294
+ // OpenAI/Azure
295
+ return { method: 'jsonSchema', warnings };
296
+ }
297
+ // Default to function calling for all other providers
298
+ return { method: undefined, warnings };
299
+ }
300
+ case 'provider': {
301
+ if (this.provider === _enum.Providers.BEDROCK) {
302
+ // Bedrock doesn't support jsonMode, fall back to functionCalling
303
+ return { method: 'functionCalling', warnings };
304
+ }
305
+ if (jsonModeProviders.has(this.provider)) {
306
+ return { method: 'jsonMode', warnings };
307
+ }
308
+ return { method: 'jsonMode', warnings };
309
+ }
310
+ case 'tool': {
311
+ return { method: 'functionCalling', warnings };
312
+ }
313
+ default: {
314
+ return { method: undefined, warnings };
315
+ }
316
+ }
317
+ }
249
318
  /**
250
319
  * Builds instructions text for tools that are ONLY callable via programmatic code execution.
251
320
  * These tools cannot be called directly by the LLM but are available through the
@@ -1 +1 @@
1
- {"version":3,"file":"AgentContext.cjs","sources":["../../../src/agents/AgentContext.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/agents/AgentContext.ts\nimport { SystemMessage } from '@langchain/core/messages';\nimport { RunnableLambda } from '@langchain/core/runnables';\nimport type {\n UsageMetadata,\n BaseMessage,\n BaseMessageFields,\n} from '@langchain/core/messages';\nimport type { RunnableConfig, Runnable } from '@langchain/core/runnables';\nimport type * as t from '@/types';\nimport type { createPruneMessages } from '@/messages';\nimport { createSchemaOnlyTools } from '@/tools/schema';\nimport { ContentTypes, Providers } from '@/common';\nimport { toJsonSchema } from '@/utils/schema';\n\n/**\n * Encapsulates agent-specific state that can vary between agents in a multi-agent system\n */\nexport class AgentContext {\n /**\n * Create an AgentContext from configuration with token accounting initialization\n */\n static fromConfig(\n agentConfig: t.AgentInputs,\n tokenCounter?: t.TokenCounter,\n indexTokenCountMap?: Record<string, number>\n ): AgentContext {\n const {\n agentId,\n name,\n provider,\n clientOptions,\n tools,\n toolMap,\n toolEnd,\n toolRegistry,\n toolDefinitions,\n instructions,\n additional_instructions,\n streamBuffer,\n maxContextTokens,\n reasoningKey,\n useLegacyContent,\n dynamicContext,\n structuredOutput: structuredOutputCamel,\n\n structured_output: structuredOutputSnake,\n discoveredTools,\n summarizeCallback,\n } = agentConfig;\n\n // Normalize structured output: support both camelCase and snake_case inputs\n // Priority: structuredOutput (camelCase) > structured_output (snake_case with enabled check)\n let structuredOutput: t.StructuredOutputConfig | undefined;\n if (structuredOutputCamel) {\n structuredOutput = structuredOutputCamel;\n } else if (structuredOutputSnake?.enabled && structuredOutputSnake.schema) {\n // Convert snake_case input to StructuredOutputConfig\n structuredOutput = {\n schema: structuredOutputSnake.schema,\n name: structuredOutputSnake.name,\n description: structuredOutputSnake.description,\n mode: structuredOutputSnake.mode,\n strict: structuredOutputSnake.strict,\n };\n }\n\n const agentContext = new AgentContext({\n agentId,\n name: name ?? agentId,\n provider,\n clientOptions,\n maxContextTokens,\n streamBuffer,\n tools,\n toolMap,\n toolRegistry,\n toolDefinitions,\n instructions,\n additionalInstructions: additional_instructions,\n reasoningKey,\n toolEnd,\n instructionTokens: 0,\n tokenCounter,\n useLegacyContent,\n dynamicContext,\n structuredOutput,\n discoveredTools,\n });\n\n if (summarizeCallback) {\n agentContext.summarizeCallback = summarizeCallback;\n }\n\n if (tokenCounter) {\n // Initialize system runnable BEFORE async tool token calculation\n // This ensures system message tokens are in instructionTokens before\n // updateTokenMapWithInstructions is called\n agentContext.initializeSystemRunnable();\n\n const tokenMap = indexTokenCountMap || {};\n agentContext.indexTokenCountMap = tokenMap;\n agentContext.tokenCalculationPromise = agentContext\n .calculateInstructionTokens(tokenCounter)\n .then(() => {\n // Update token map with instruction tokens (includes system + tool tokens)\n agentContext.updateTokenMapWithInstructions(tokenMap);\n })\n .catch((err) => {\n console.error('Error calculating instruction tokens:', err);\n });\n } else if (indexTokenCountMap) {\n agentContext.indexTokenCountMap = indexTokenCountMap;\n }\n\n return agentContext;\n }\n\n /** Agent identifier */\n agentId: string;\n /** Human-readable name for this agent (used in handoff context). Falls back to agentId if not provided. */\n name?: string;\n /** Provider for this specific agent */\n provider: Providers;\n /** Client options for this agent */\n clientOptions?: t.ClientOptions;\n /** Token count map indexed by message position */\n indexTokenCountMap: Record<string, number | undefined> = {};\n /** Maximum context tokens for this agent */\n maxContextTokens?: number;\n /** Current usage metadata for this agent */\n currentUsage?: Partial<UsageMetadata>;\n /** Prune messages function configured for this agent */\n pruneMessages?: ReturnType<typeof createPruneMessages>;\n /** Token counter function for this agent */\n tokenCounter?: t.TokenCounter;\n /** Instructions/system message token count */\n instructionTokens: number = 0;\n /** The amount of time that should pass before another consecutive API call */\n streamBuffer?: number;\n /** Last stream call timestamp for rate limiting */\n lastStreamCall?: number;\n /** Tools available to this agent */\n tools?: t.GraphTools;\n /** Tool map for this agent */\n toolMap?: t.ToolMap;\n /**\n * Tool definitions registry (includes deferred and programmatic tool metadata).\n * Used for tool search and programmatic tool calling.\n */\n toolRegistry?: t.LCToolRegistry;\n /**\n * Serializable tool definitions for event-driven execution.\n * When provided, ToolNode operates in event-driven mode.\n */\n toolDefinitions?: t.LCTool[];\n /** Set of tool names discovered via tool search (to be loaded) */\n discoveredToolNames: Set<string> = new Set();\n /** Instructions for this agent */\n instructions?: string;\n /** Additional instructions for this agent */\n additionalInstructions?: string;\n /**\n * Dynamic context that changes per-request (e.g., current time, user info).\n * This is NOT included in the system message to preserve cache.\n * Instead, it's injected as a user message at the start of the conversation.\n */\n dynamicContext?: string;\n /** Reasoning key for this agent */\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n /** Last token for reasoning detection */\n lastToken?: string;\n /** Token type switch state */\n tokenTypeSwitch?: 'reasoning' | 'content';\n /** Current token type being processed */\n currentTokenType: ContentTypes.TEXT | ContentTypes.THINK | 'think_and_text' =\n ContentTypes.TEXT;\n /** Whether tools should end the workflow */\n toolEnd: boolean = false;\n /** Cached system runnable (created lazily) */\n private cachedSystemRunnable?: Runnable<\n BaseMessage[],\n (BaseMessage | SystemMessage)[],\n RunnableConfig<Record<string, unknown>>\n >;\n /** Whether system runnable needs rebuild (set when discovered tools change) */\n private systemRunnableStale: boolean = true;\n /** Cached system message token count (separate from tool tokens) */\n private systemMessageTokens: number = 0;\n /** Promise for token calculation initialization */\n tokenCalculationPromise?: Promise<void>;\n /** Format content blocks as strings (for legacy compatibility) */\n useLegacyContent: boolean = false;\n /** Detailed per-tool token breakdown for admin tracking */\n private toolsDetail: Array<{ name: string; tokens: number }> = [];\n /** Total tool tokens (sum of all toolsDetail) */\n private toolTokensTotal: number = 0;\n /** Per-prompt token breakdown for detailed admin reporting */\n private promptBreakdown: {\n branding: number;\n toolRouting: number;\n agentInstructions: number;\n mcpInstructions: number;\n artifacts: number;\n memory: number;\n } = {\n branding: 0,\n toolRouting: 0,\n agentInstructions: 0,\n mcpInstructions: 0,\n artifacts: 0,\n memory: 0,\n };\n /**\n * Handoff context when this agent receives control via handoff.\n * Contains source and parallel execution info for system message context.\n */\n handoffContext?: {\n /** Source agent that transferred control */\n sourceAgentName: string;\n /** Names of sibling agents executing in parallel (empty if sequential) */\n parallelSiblings: string[];\n };\n /**\n * Structured output configuration.\n * When set, the agent will return a validated JSON response\n * instead of streaming text.\n */\n structuredOutput?: t.StructuredOutputConfig;\n /**\n * Optional callback for summarizing messages that were pruned from context.\n * When provided, discarded messages are summarized instead of silently dropped.\n */\n summarizeCallback?: (messagesToRefine: BaseMessage[]) => Promise<string | undefined>;\n\n constructor({\n agentId,\n name,\n provider,\n clientOptions,\n maxContextTokens,\n streamBuffer,\n tokenCounter,\n tools,\n toolMap,\n toolRegistry,\n toolDefinitions,\n instructions,\n additionalInstructions,\n dynamicContext,\n reasoningKey,\n toolEnd,\n instructionTokens,\n useLegacyContent,\n structuredOutput,\n discoveredTools,\n }: {\n agentId: string;\n name?: string;\n provider: Providers;\n clientOptions?: t.ClientOptions;\n maxContextTokens?: number;\n streamBuffer?: number;\n tokenCounter?: t.TokenCounter;\n tools?: t.GraphTools;\n toolMap?: t.ToolMap;\n toolRegistry?: t.LCToolRegistry;\n toolDefinitions?: t.LCTool[];\n instructions?: string;\n additionalInstructions?: string;\n dynamicContext?: string;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n toolEnd?: boolean;\n instructionTokens?: number;\n useLegacyContent?: boolean;\n structuredOutput?: t.StructuredOutputConfig;\n discoveredTools?: string[];\n }) {\n this.agentId = agentId;\n this.name = name;\n this.provider = provider;\n this.clientOptions = clientOptions;\n this.maxContextTokens = maxContextTokens;\n this.streamBuffer = streamBuffer;\n this.tokenCounter = tokenCounter;\n this.tools = tools;\n this.toolMap = toolMap;\n this.toolRegistry = toolRegistry;\n this.toolDefinitions = toolDefinitions;\n this.instructions = instructions;\n this.additionalInstructions = additionalInstructions;\n this.dynamicContext = dynamicContext;\n this.structuredOutput = structuredOutput;\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n if (toolEnd !== undefined) {\n this.toolEnd = toolEnd;\n }\n if (instructionTokens !== undefined) {\n this.instructionTokens = instructionTokens;\n }\n\n this.useLegacyContent = useLegacyContent ?? false;\n\n if (discoveredTools && discoveredTools.length > 0) {\n for (const toolName of discoveredTools) {\n this.discoveredToolNames.add(toolName);\n }\n }\n }\n\n /**\n * Checks if structured output mode is enabled for this agent.\n * When enabled, the agent will use model.invoke() instead of streaming\n * and return a validated JSON response.\n */\n get isStructuredOutputMode(): boolean {\n return (\n this.structuredOutput != null && this.structuredOutput.schema != null\n );\n }\n\n /**\n * Gets the structured output schema with normalized defaults.\n * Returns undefined if structured output is not configured.\n */\n getStructuredOutputSchema(): Record<string, unknown> | undefined {\n if (!this.structuredOutput?.schema) {\n return undefined;\n }\n\n const schema = { ...this.structuredOutput.schema };\n\n // Ensure type is set\n if (!schema.type && schema.properties) {\n schema.type = 'object';\n }\n\n // Add title from config name\n if (this.structuredOutput.name && !schema.title) {\n schema.title = this.structuredOutput.name;\n }\n\n // Add description from config\n if (this.structuredOutput.description && !schema.description) {\n schema.description = this.structuredOutput.description;\n }\n\n // Enable strict mode by default\n if (this.structuredOutput.strict !== false && schema.type === 'object') {\n schema.additionalProperties = schema.additionalProperties ?? false;\n }\n\n return schema;\n }\n\n /**\n * Builds instructions text for tools that are ONLY callable via programmatic code execution.\n * These tools cannot be called directly by the LLM but are available through the\n * run_tools_with_code tool.\n *\n * Includes:\n * - Code_execution-only tools that are NOT deferred\n * - Code_execution-only tools that ARE deferred but have been discovered via tool search\n */\n private buildProgrammaticOnlyToolsInstructions(): string {\n if (!this.toolRegistry) return '';\n\n const programmaticOnlyTools: t.LCTool[] = [];\n for (const [name, toolDef] of this.toolRegistry) {\n const allowedCallers = toolDef.allowed_callers ?? ['direct'];\n const isCodeExecutionOnly =\n allowedCallers.includes('code_execution') &&\n !allowedCallers.includes('direct');\n\n if (!isCodeExecutionOnly) continue;\n\n // Include if: not deferred OR deferred but discovered\n const isDeferred = toolDef.defer_loading === true;\n const isDiscovered = this.discoveredToolNames.has(name);\n if (!isDeferred || isDiscovered) {\n programmaticOnlyTools.push(toolDef);\n }\n }\n\n if (programmaticOnlyTools.length === 0) return '';\n\n const toolDescriptions = programmaticOnlyTools\n .map((tool) => {\n let desc = `- **${tool.name}**`;\n if (tool.description != null && tool.description !== '') {\n desc += `: ${tool.description}`;\n }\n if (tool.parameters) {\n desc += `\\n Parameters: ${JSON.stringify(tool.parameters, null, 2).replace(/\\n/g, '\\n ')}`;\n }\n return desc;\n })\n .join('\\n\\n');\n\n return (\n '\\n\\n## Programmatic-Only Tools\\n\\n' +\n 'The following tools are available exclusively through the `run_tools_with_code` tool. ' +\n 'You cannot call these tools directly; instead, use `run_tools_with_code` with Python code that invokes them.\\n\\n' +\n toolDescriptions\n );\n }\n\n /**\n * Gets the system runnable, creating it lazily if needed.\n * Includes instructions, additional instructions, and programmatic-only tools documentation.\n * Only rebuilds when marked stale (via markToolsAsDiscovered).\n */\n get systemRunnable():\n | Runnable<\n BaseMessage[],\n (BaseMessage | SystemMessage)[],\n RunnableConfig<Record<string, unknown>>\n >\n | undefined {\n // Return cached if not stale\n if (!this.systemRunnableStale && this.cachedSystemRunnable !== undefined) {\n return this.cachedSystemRunnable;\n }\n\n // Stale or first access - rebuild\n const instructionsString = this.buildInstructionsString();\n this.cachedSystemRunnable = this.buildSystemRunnable(instructionsString);\n this.systemRunnableStale = false;\n return this.cachedSystemRunnable;\n }\n\n /**\n * Explicitly initializes the system runnable.\n * Call this before async token calculation to ensure system message tokens are counted first.\n */\n initializeSystemRunnable(): void {\n if (this.systemRunnableStale || this.cachedSystemRunnable === undefined) {\n const instructionsString = this.buildInstructionsString();\n this.cachedSystemRunnable = this.buildSystemRunnable(instructionsString);\n this.systemRunnableStale = false;\n }\n }\n\n /**\n * Builds the raw instructions string (without creating SystemMessage).\n * Includes agent identity preamble and handoff context when available.\n */\n private buildInstructionsString(): string {\n const parts: string[] = [];\n\n /** Build agent identity and handoff context preamble */\n const identityPreamble = this.buildIdentityPreamble();\n if (identityPreamble) {\n parts.push(identityPreamble);\n }\n\n /** Add main instructions */\n if (this.instructions != null && this.instructions !== '') {\n parts.push(this.instructions);\n }\n\n /** Add additional instructions */\n if (\n this.additionalInstructions != null &&\n this.additionalInstructions !== ''\n ) {\n parts.push(this.additionalInstructions);\n }\n\n /** Add programmatic tools documentation */\n const programmaticToolsDoc = this.buildProgrammaticOnlyToolsInstructions();\n if (programmaticToolsDoc) {\n parts.push(programmaticToolsDoc);\n }\n\n return parts.join('\\n\\n');\n }\n\n /**\n * Builds the agent identity preamble including handoff context if present.\n * This helps the agent understand its role in the multi-agent workflow.\n */\n private buildIdentityPreamble(): string {\n if (!this.handoffContext) return '';\n\n const displayName = this.name ?? this.agentId;\n const { sourceAgentName, parallelSiblings } = this.handoffContext;\n const isParallel = parallelSiblings.length > 0;\n\n const lines: string[] = [];\n lines.push('## Multi-Agent Workflow');\n lines.push(\n `You are \"${displayName}\", transferred from \"${sourceAgentName}\".`\n );\n\n if (isParallel) {\n lines.push(`Running in parallel with: ${parallelSiblings.join(', ')}.`);\n }\n\n lines.push(\n 'Execute only tasks relevant to your role. Routing is already handled if requested, unless you can route further.'\n );\n\n return lines.join('\\n');\n }\n\n /**\n * Build system runnable from pre-built instructions string.\n * Only called when content has actually changed.\n */\n private buildSystemRunnable(\n instructionsString: string\n ):\n | Runnable<\n BaseMessage[],\n (BaseMessage | SystemMessage)[],\n RunnableConfig<Record<string, unknown>>\n >\n | undefined {\n if (!instructionsString) {\n // Remove previous tokens if we had a system message before\n this.instructionTokens -= this.systemMessageTokens;\n this.systemMessageTokens = 0;\n return undefined;\n }\n\n let finalInstructions: string | BaseMessageFields = instructionsString;\n\n // Handle Anthropic prompt caching (Direct API)\n if (this.provider === Providers.ANTHROPIC) {\n const anthropicOptions = this.clientOptions as\n | t.AnthropicClientOptions\n | undefined;\n if (anthropicOptions?.promptCache === true) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructionsString,\n cache_control: { type: 'ephemeral' },\n },\n ],\n };\n }\n }\n\n // Handle Bedrock prompt caching (Converse API)\n // Adds cachePoint block after text content for system message caching\n // NOTE: Both Claude and Nova models support cachePoint in system and messages\n // (Nova does NOT support cachePoint in tools - that check is in bedrock/index.ts)\n if (this.provider === Providers.BEDROCK) {\n const bedrockOptions = this.clientOptions as\n | t.BedrockAnthropicInput\n | undefined;\n const modelId = bedrockOptions?.model?.toLowerCase() ?? '';\n const supportsCaching =\n modelId.includes('claude') ||\n modelId.includes('anthropic') ||\n modelId.includes('nova');\n\n if (bedrockOptions?.promptCache === true && supportsCaching) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructionsString,\n },\n {\n cachePoint: { type: 'default' },\n },\n ],\n };\n }\n }\n\n const systemMessage = new SystemMessage(finalInstructions);\n\n // Update token counts (subtract old, add new)\n if (this.tokenCounter) {\n this.instructionTokens -= this.systemMessageTokens;\n this.systemMessageTokens = this.tokenCounter(systemMessage);\n this.instructionTokens += this.systemMessageTokens;\n }\n\n return RunnableLambda.from((messages: BaseMessage[]) => {\n return [systemMessage, ...messages];\n }).withConfig({ runName: 'prompt' });\n }\n\n /**\n * Reset context for a new run\n */\n reset(): void {\n this.instructionTokens = 0;\n this.systemMessageTokens = 0;\n this.toolsDetail = [];\n this.toolTokensTotal = 0;\n this.cachedSystemRunnable = undefined;\n this.systemRunnableStale = true;\n this.lastToken = undefined;\n this.indexTokenCountMap = {};\n this.currentUsage = undefined;\n this.pruneMessages = undefined;\n this.lastStreamCall = undefined;\n this.tokenTypeSwitch = undefined;\n this.currentTokenType = ContentTypes.TEXT;\n this.discoveredToolNames.clear();\n this.handoffContext = undefined;\n }\n\n /**\n * Update the token count map with instruction tokens\n */\n updateTokenMapWithInstructions(baseTokenMap: Record<string, number>): void {\n if (this.instructionTokens > 0) {\n // Shift all indices by the instruction token count\n const shiftedMap: Record<string, number> = {};\n for (const [key, value] of Object.entries(baseTokenMap)) {\n const index = parseInt(key, 10);\n if (!isNaN(index)) {\n shiftedMap[String(index)] =\n value + (index === 0 ? this.instructionTokens : 0);\n }\n }\n this.indexTokenCountMap = shiftedMap;\n } else {\n this.indexTokenCountMap = { ...baseTokenMap };\n }\n }\n\n /**\n * Calculate tool tokens and add to instruction tokens\n * Note: System message tokens are calculated during systemRunnable creation\n * Also tracks per-tool token breakdown for admin reporting\n */\n async calculateInstructionTokens(\n tokenCounter: t.TokenCounter\n ): Promise<void> {\n let toolTokens = 0;\n this.toolsDetail = []; // Reset per-tool breakdown\n\n if (this.tools && this.tools.length > 0) {\n for (const tool of this.tools) {\n const genericTool = tool as Record<string, unknown>;\n if (\n genericTool.schema != null &&\n typeof genericTool.schema === 'object'\n ) {\n const jsonSchema = toJsonSchema(\n genericTool.schema,\n (genericTool.name as string | undefined) ?? '',\n (genericTool.description as string | undefined) ?? ''\n );\n const toolName = (genericTool.name as string) || 'unknown';\n const tokens = tokenCounter(\n new SystemMessage(JSON.stringify(jsonSchema))\n );\n\n // Track per-tool breakdown\n this.toolsDetail.push({ name: toolName, tokens });\n toolTokens += tokens;\n }\n }\n }\n\n // Store total tool tokens for breakdown reporting\n this.toolTokensTotal = toolTokens;\n\n // Add tool tokens to existing instruction tokens (which may already include system message tokens)\n this.instructionTokens += toolTokens;\n }\n\n /**\n * Set the per-prompt token breakdown for detailed admin tracking.\n * Called by the client after assembling all prompt components.\n * @param breakdown - Object with token counts per prompt component\n */\n setPromptBreakdown(breakdown: {\n branding?: number;\n toolRouting?: number;\n agentInstructions?: number;\n mcpInstructions?: number;\n artifacts?: number;\n memory?: number;\n }): void {\n if (breakdown.branding !== undefined)\n this.promptBreakdown.branding = breakdown.branding;\n if (breakdown.toolRouting !== undefined)\n this.promptBreakdown.toolRouting = breakdown.toolRouting;\n if (breakdown.agentInstructions !== undefined)\n this.promptBreakdown.agentInstructions = breakdown.agentInstructions;\n if (breakdown.mcpInstructions !== undefined)\n this.promptBreakdown.mcpInstructions = breakdown.mcpInstructions;\n if (breakdown.artifacts !== undefined)\n this.promptBreakdown.artifacts = breakdown.artifacts;\n if (breakdown.memory !== undefined)\n this.promptBreakdown.memory = breakdown.memory;\n }\n\n /**\n * Get a detailed breakdown of context tokens for admin reporting.\n * This provides visibility into what's consuming the input token budget.\n * @returns ContextBreakdown object with per-component token counts\n */\n getContextBreakdown(): {\n instructions: number;\n artifacts: number;\n tools: number;\n toolCount: number;\n toolContext: number;\n total: number;\n toolsDetail: Array<{ name: string; tokens: number }>;\n toolContextDetail: Array<{ name: string; tokens: number }>;\n prompts?: {\n branding: number;\n toolRouting: number;\n agentInstructions: number;\n mcpInstructions: number;\n artifacts: number;\n memory: number;\n };\n } {\n // Calculate sum of prompt components\n const promptsTotal =\n this.promptBreakdown.branding +\n this.promptBreakdown.toolRouting +\n this.promptBreakdown.agentInstructions +\n this.promptBreakdown.mcpInstructions +\n this.promptBreakdown.artifacts +\n this.promptBreakdown.memory;\n\n return {\n // System message tokens (instructions + additional_instructions)\n instructions: this.systemMessageTokens,\n // Artifacts prompt tokens\n artifacts: this.promptBreakdown.artifacts,\n // Total tool definition tokens\n tools: this.toolTokensTotal,\n // Number of tools\n toolCount: this.toolsDetail.length,\n // Tool context/usage instructions (currently embedded in system message)\n toolContext: 0,\n // Total tracked context tokens\n total: this.instructionTokens,\n // Per-tool token breakdown\n toolsDetail: [...this.toolsDetail],\n // Tool context detail (currently not tracked separately)\n toolContextDetail: [],\n // Per-prompt breakdown (only include if any prompts were tracked)\n prompts: promptsTotal > 0 ? { ...this.promptBreakdown } : undefined,\n };\n }\n\n /**\n * Gets the tool registry for deferred tools (for tool search).\n * @param onlyDeferred If true, only returns tools with defer_loading=true\n * @returns LCToolRegistry with tool definitions\n */\n getDeferredToolRegistry(onlyDeferred: boolean = true): t.LCToolRegistry {\n const registry: t.LCToolRegistry = new Map();\n\n if (!this.toolRegistry) {\n return registry;\n }\n\n for (const [name, toolDef] of this.toolRegistry) {\n if (!onlyDeferred || toolDef.defer_loading === true) {\n registry.set(name, toolDef);\n }\n }\n\n return registry;\n }\n\n /**\n * Sets the handoff context for this agent.\n * Call this when the agent receives control via handoff from another agent.\n * Marks system runnable as stale to include handoff context in system message.\n * @param sourceAgentName - Name of the agent that transferred control\n * @param parallelSiblings - Names of other agents executing in parallel with this one\n */\n setHandoffContext(sourceAgentName: string, parallelSiblings: string[]): void {\n this.handoffContext = { sourceAgentName, parallelSiblings };\n this.systemRunnableStale = true;\n }\n\n /**\n * Clears any handoff context.\n * Call this when resetting the agent or when handoff context is no longer relevant.\n */\n clearHandoffContext(): void {\n if (this.handoffContext) {\n this.handoffContext = undefined;\n this.systemRunnableStale = true;\n }\n }\n\n /**\n * Marks tools as discovered via tool search.\n * Discovered tools will be included in the next model binding.\n * Only marks system runnable stale if NEW tools were actually added.\n * @param toolNames - Array of discovered tool names\n * @returns true if any new tools were discovered\n */\n markToolsAsDiscovered(toolNames: string[]): boolean {\n let hasNewDiscoveries = false;\n for (const name of toolNames) {\n if (!this.discoveredToolNames.has(name)) {\n this.discoveredToolNames.add(name);\n hasNewDiscoveries = true;\n }\n }\n if (hasNewDiscoveries) {\n this.systemRunnableStale = true;\n }\n return hasNewDiscoveries;\n }\n\n /**\n * Gets tools that should be bound to the LLM.\n * In event-driven mode (toolDefinitions present, tools empty), creates schema-only tools.\n * Otherwise filters tool instances based on:\n * 1. Non-deferred tools with allowed_callers: ['direct']\n * 2. Discovered tools (from tool search)\n * @returns Array of tools to bind to model\n */\n getToolsForBinding(): t.GraphTools | undefined {\n /** Event-driven mode: create schema-only tools from definitions */\n if (this.toolDefinitions && this.toolDefinitions.length > 0) {\n return this.getEventDrivenToolsForBinding();\n }\n\n /** Traditional mode: filter actual tool instances */\n if (!this.tools || !this.toolRegistry) {\n return this.tools;\n }\n\n return this.filterToolsForBinding(this.tools);\n }\n\n /** Creates schema-only tools from toolDefinitions for event-driven mode */\n private getEventDrivenToolsForBinding(): t.GraphTools {\n if (!this.toolDefinitions) {\n return [];\n }\n\n const defsToInclude = this.toolDefinitions.filter((def) => {\n const allowedCallers = def.allowed_callers ?? ['direct'];\n if (!allowedCallers.includes('direct')) {\n return false;\n }\n if (\n def.defer_loading === true &&\n !this.discoveredToolNames.has(def.name)\n ) {\n return false;\n }\n return true;\n });\n\n return createSchemaOnlyTools(defsToInclude) as t.GraphTools;\n }\n\n /** Filters tool instances for binding based on registry config */\n private filterToolsForBinding(tools: t.GraphTools): t.GraphTools {\n return tools.filter((tool) => {\n if (!('name' in tool)) {\n return true;\n }\n\n const toolDef = this.toolRegistry?.get(tool.name);\n if (!toolDef) {\n return true;\n }\n\n if (this.discoveredToolNames.has(tool.name)) {\n const allowedCallers = toolDef.allowed_callers ?? ['direct'];\n return allowedCallers.includes('direct');\n }\n\n const allowedCallers = toolDef.allowed_callers ?? ['direct'];\n return (\n allowedCallers.includes('direct') && toolDef.defer_loading !== true\n );\n });\n }\n}\n"],"names":["ContentTypes","Providers","SystemMessage","RunnableLambda","toJsonSchema","createSchemaOnlyTools"],"mappings":"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"}
1
+ {"version":3,"file":"AgentContext.cjs","sources":["../../../src/agents/AgentContext.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/agents/AgentContext.ts\nimport { SystemMessage } from '@langchain/core/messages';\nimport { RunnableLambda } from '@langchain/core/runnables';\nimport type {\n UsageMetadata,\n BaseMessage,\n BaseMessageFields,\n} from '@langchain/core/messages';\nimport type { RunnableConfig, Runnable } from '@langchain/core/runnables';\nimport type * as t from '@/types';\nimport type { createPruneMessages } from '@/messages';\nimport { createSchemaOnlyTools } from '@/tools/schema';\nimport { ContentTypes, Providers } from '@/common';\nimport { toJsonSchema } from '@/utils/schema';\n\n/**\n * Encapsulates agent-specific state that can vary between agents in a multi-agent system\n */\nexport class AgentContext {\n /**\n * Create an AgentContext from configuration with token accounting initialization\n */\n static fromConfig(\n agentConfig: t.AgentInputs,\n tokenCounter?: t.TokenCounter,\n indexTokenCountMap?: Record<string, number>\n ): AgentContext {\n const {\n agentId,\n name,\n provider,\n clientOptions,\n tools,\n toolMap,\n toolEnd,\n toolRegistry,\n toolDefinitions,\n instructions,\n additional_instructions,\n streamBuffer,\n maxContextTokens,\n reasoningKey,\n useLegacyContent,\n dynamicContext,\n structuredOutput: structuredOutputCamel,\n\n structured_output: structuredOutputSnake,\n discoveredTools,\n summarizeCallback,\n } = agentConfig;\n\n // Normalize structured output: support both camelCase and snake_case inputs\n // Priority: structuredOutput (camelCase) > structured_output (snake_case with enabled check)\n let structuredOutput: t.StructuredOutputConfig | undefined;\n if (structuredOutputCamel) {\n structuredOutput = structuredOutputCamel;\n } else if (structuredOutputSnake?.enabled && structuredOutputSnake.schema) {\n // Convert snake_case input to StructuredOutputConfig\n structuredOutput = {\n schema: structuredOutputSnake.schema,\n name: structuredOutputSnake.name,\n description: structuredOutputSnake.description,\n mode: structuredOutputSnake.mode,\n strict: structuredOutputSnake.strict,\n };\n }\n\n const agentContext = new AgentContext({\n agentId,\n name: name ?? agentId,\n provider,\n clientOptions,\n maxContextTokens,\n streamBuffer,\n tools,\n toolMap,\n toolRegistry,\n toolDefinitions,\n instructions,\n additionalInstructions: additional_instructions,\n reasoningKey,\n toolEnd,\n instructionTokens: 0,\n tokenCounter,\n useLegacyContent,\n dynamicContext,\n structuredOutput,\n discoveredTools,\n });\n\n if (summarizeCallback) {\n agentContext.summarizeCallback = summarizeCallback;\n }\n\n if (tokenCounter) {\n // Initialize system runnable BEFORE async tool token calculation\n // This ensures system message tokens are in instructionTokens before\n // updateTokenMapWithInstructions is called\n agentContext.initializeSystemRunnable();\n\n const tokenMap = indexTokenCountMap || {};\n agentContext.indexTokenCountMap = tokenMap;\n agentContext.tokenCalculationPromise = agentContext\n .calculateInstructionTokens(tokenCounter)\n .then(() => {\n // Update token map with instruction tokens (includes system + tool tokens)\n agentContext.updateTokenMapWithInstructions(tokenMap);\n })\n .catch((err) => {\n console.error('Error calculating instruction tokens:', err);\n });\n } else if (indexTokenCountMap) {\n agentContext.indexTokenCountMap = indexTokenCountMap;\n }\n\n return agentContext;\n }\n\n /** Agent identifier */\n agentId: string;\n /** Human-readable name for this agent (used in handoff context). Falls back to agentId if not provided. */\n name?: string;\n /** Provider for this specific agent */\n provider: Providers;\n /** Client options for this agent */\n clientOptions?: t.ClientOptions;\n /** Token count map indexed by message position */\n indexTokenCountMap: Record<string, number | undefined> = {};\n /** Maximum context tokens for this agent */\n maxContextTokens?: number;\n /** Current usage metadata for this agent */\n currentUsage?: Partial<UsageMetadata>;\n /** Prune messages function configured for this agent */\n pruneMessages?: ReturnType<typeof createPruneMessages>;\n /** Token counter function for this agent */\n tokenCounter?: t.TokenCounter;\n /** Instructions/system message token count */\n instructionTokens: number = 0;\n /** The amount of time that should pass before another consecutive API call */\n streamBuffer?: number;\n /** Last stream call timestamp for rate limiting */\n lastStreamCall?: number;\n /** Tools available to this agent */\n tools?: t.GraphTools;\n /** Tool map for this agent */\n toolMap?: t.ToolMap;\n /**\n * Tool definitions registry (includes deferred and programmatic tool metadata).\n * Used for tool search and programmatic tool calling.\n */\n toolRegistry?: t.LCToolRegistry;\n /**\n * Serializable tool definitions for event-driven execution.\n * When provided, ToolNode operates in event-driven mode.\n */\n toolDefinitions?: t.LCTool[];\n /** Set of tool names discovered via tool search (to be loaded) */\n discoveredToolNames: Set<string> = new Set();\n /** Instructions for this agent */\n instructions?: string;\n /** Additional instructions for this agent */\n additionalInstructions?: string;\n /**\n * Dynamic context that changes per-request (e.g., current time, user info).\n * This is NOT included in the system message to preserve cache.\n * Instead, it's injected as a user message at the start of the conversation.\n */\n dynamicContext?: string;\n /** Reasoning key for this agent */\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n /** Last token for reasoning detection */\n lastToken?: string;\n /** Token type switch state */\n tokenTypeSwitch?: 'reasoning' | 'content';\n /** Current token type being processed */\n currentTokenType: ContentTypes.TEXT | ContentTypes.THINK | 'think_and_text' =\n ContentTypes.TEXT;\n /** Whether tools should end the workflow */\n toolEnd: boolean = false;\n /** Cached system runnable (created lazily) */\n private cachedSystemRunnable?: Runnable<\n BaseMessage[],\n (BaseMessage | SystemMessage)[],\n RunnableConfig<Record<string, unknown>>\n >;\n /** Whether system runnable needs rebuild (set when discovered tools change) */\n private systemRunnableStale: boolean = true;\n /** Cached system message token count (separate from tool tokens) */\n private systemMessageTokens: number = 0;\n /** Promise for token calculation initialization */\n tokenCalculationPromise?: Promise<void>;\n /** Format content blocks as strings (for legacy compatibility) */\n useLegacyContent: boolean = false;\n /** Detailed per-tool token breakdown for admin tracking */\n private toolsDetail: Array<{ name: string; tokens: number }> = [];\n /** Total tool tokens (sum of all toolsDetail) */\n private toolTokensTotal: number = 0;\n /** Per-prompt token breakdown for detailed admin reporting */\n private promptBreakdown: {\n branding: number;\n toolRouting: number;\n agentInstructions: number;\n mcpInstructions: number;\n artifacts: number;\n memory: number;\n } = {\n branding: 0,\n toolRouting: 0,\n agentInstructions: 0,\n mcpInstructions: 0,\n artifacts: 0,\n memory: 0,\n };\n /**\n * Handoff context when this agent receives control via handoff.\n * Contains source and parallel execution info for system message context.\n */\n handoffContext?: {\n /** Source agent that transferred control */\n sourceAgentName: string;\n /** Names of sibling agents executing in parallel (empty if sequential) */\n parallelSiblings: string[];\n };\n /**\n * Structured output configuration.\n * When set, the agent will return a validated JSON response\n * instead of streaming text.\n */\n structuredOutput?: t.StructuredOutputConfig;\n /**\n * Optional callback for summarizing messages that were pruned from context.\n * When provided, discarded messages are summarized instead of silently dropped.\n */\n summarizeCallback?: (messagesToRefine: BaseMessage[]) => Promise<string | undefined>;\n\n constructor({\n agentId,\n name,\n provider,\n clientOptions,\n maxContextTokens,\n streamBuffer,\n tokenCounter,\n tools,\n toolMap,\n toolRegistry,\n toolDefinitions,\n instructions,\n additionalInstructions,\n dynamicContext,\n reasoningKey,\n toolEnd,\n instructionTokens,\n useLegacyContent,\n structuredOutput,\n discoveredTools,\n }: {\n agentId: string;\n name?: string;\n provider: Providers;\n clientOptions?: t.ClientOptions;\n maxContextTokens?: number;\n streamBuffer?: number;\n tokenCounter?: t.TokenCounter;\n tools?: t.GraphTools;\n toolMap?: t.ToolMap;\n toolRegistry?: t.LCToolRegistry;\n toolDefinitions?: t.LCTool[];\n instructions?: string;\n additionalInstructions?: string;\n dynamicContext?: string;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n toolEnd?: boolean;\n instructionTokens?: number;\n useLegacyContent?: boolean;\n structuredOutput?: t.StructuredOutputConfig;\n discoveredTools?: string[];\n }) {\n this.agentId = agentId;\n this.name = name;\n this.provider = provider;\n this.clientOptions = clientOptions;\n this.maxContextTokens = maxContextTokens;\n this.streamBuffer = streamBuffer;\n this.tokenCounter = tokenCounter;\n this.tools = tools;\n this.toolMap = toolMap;\n this.toolRegistry = toolRegistry;\n this.toolDefinitions = toolDefinitions;\n this.instructions = instructions;\n this.additionalInstructions = additionalInstructions;\n this.dynamicContext = dynamicContext;\n this.structuredOutput = structuredOutput;\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n if (toolEnd !== undefined) {\n this.toolEnd = toolEnd;\n }\n if (instructionTokens !== undefined) {\n this.instructionTokens = instructionTokens;\n }\n\n this.useLegacyContent = useLegacyContent ?? false;\n\n if (discoveredTools && discoveredTools.length > 0) {\n for (const toolName of discoveredTools) {\n this.discoveredToolNames.add(toolName);\n }\n }\n }\n\n /**\n * Checks if structured output mode is enabled for this agent.\n * When enabled, the agent will use model.invoke() instead of streaming\n * and return a validated JSON response.\n */\n get isStructuredOutputMode(): boolean {\n return (\n this.structuredOutput != null && this.structuredOutput.schema != null\n );\n }\n\n /**\n * Gets the structured output schema with normalized defaults.\n * Returns undefined if structured output is not configured.\n */\n getStructuredOutputSchema(): Record<string, unknown> | undefined {\n if (!this.structuredOutput?.schema) {\n return undefined;\n }\n\n const schema = { ...this.structuredOutput.schema };\n\n // Ensure type is set\n if (!schema.type && schema.properties) {\n schema.type = 'object';\n }\n\n // Add title from config name\n if (this.structuredOutput.name && !schema.title) {\n schema.title = this.structuredOutput.name;\n }\n\n // Add description from config\n if (this.structuredOutput.description && !schema.description) {\n schema.description = this.structuredOutput.description;\n }\n\n // Enable strict mode by default\n if (this.structuredOutput.strict !== false && schema.type === 'object') {\n schema.additionalProperties = schema.additionalProperties ?? false;\n }\n\n return schema;\n }\n\n /**\n * Resolves the structured output mode to a concrete method based on provider capabilities.\n *\n * Resolution logic:\n * - 'native' or 'auto' + supported provider → native constrained decoding\n * - 'native' + unsupported provider → fallback to 'functionCalling' with warning\n * - 'provider' → LangChain's jsonMode (existing behavior)\n * - 'tool' → function calling trick (existing behavior)\n * - 'auto' + unsupported provider → 'functionCalling'\n *\n * @returns The resolved method for withStructuredOutput, or 'native' for direct API usage\n */\n resolveStructuredOutputMode(): {\n method: t.ResolvedStructuredOutputMethod;\n warnings: string[];\n } {\n const mode = this.structuredOutput?.mode ?? 'auto';\n const warnings: string[] = [];\n\n // Providers that support native constrained decoding via LangChain\n const nativeProviders = new Set([\n Providers.ANTHROPIC,\n Providers.OPENAI,\n Providers.AZURE,\n ]);\n\n // Providers where LangChain supports jsonMode\n const jsonModeProviders = new Set([\n Providers.ANTHROPIC,\n Providers.OPENAI,\n Providers.AZURE,\n ]);\n\n switch (mode) {\n case 'native': {\n if (nativeProviders.has(this.provider)) {\n if (this.provider === Providers.ANTHROPIC) {\n return { method: 'jsonSchema', warnings };\n }\n // OpenAI/Azure\n return { method: 'jsonSchema', warnings };\n }\n // Fallback for unsupported providers\n warnings.push(\n `Native structured output is not supported for provider '${this.provider}'. Falling back to function calling.`\n );\n return { method: 'functionCalling', warnings };\n }\n\n case 'auto': {\n if (nativeProviders.has(this.provider)) {\n if (this.provider === Providers.ANTHROPIC) {\n return { method: 'jsonSchema', warnings };\n }\n // OpenAI/Azure\n return { method: 'jsonSchema', warnings };\n }\n // Default to function calling for all other providers\n return { method: undefined, warnings };\n }\n\n case 'provider': {\n if (this.provider === Providers.BEDROCK) {\n // Bedrock doesn't support jsonMode, fall back to functionCalling\n return { method: 'functionCalling', warnings };\n }\n if (jsonModeProviders.has(this.provider)) {\n return { method: 'jsonMode', warnings };\n }\n return { method: 'jsonMode', warnings };\n }\n\n case 'tool': {\n return { method: 'functionCalling', warnings };\n }\n\n default: {\n return { method: undefined, warnings };\n }\n }\n }\n\n /**\n * Builds instructions text for tools that are ONLY callable via programmatic code execution.\n * These tools cannot be called directly by the LLM but are available through the\n * run_tools_with_code tool.\n *\n * Includes:\n * - Code_execution-only tools that are NOT deferred\n * - Code_execution-only tools that ARE deferred but have been discovered via tool search\n */\n private buildProgrammaticOnlyToolsInstructions(): string {\n if (!this.toolRegistry) return '';\n\n const programmaticOnlyTools: t.LCTool[] = [];\n for (const [name, toolDef] of this.toolRegistry) {\n const allowedCallers = toolDef.allowed_callers ?? ['direct'];\n const isCodeExecutionOnly =\n allowedCallers.includes('code_execution') &&\n !allowedCallers.includes('direct');\n\n if (!isCodeExecutionOnly) continue;\n\n // Include if: not deferred OR deferred but discovered\n const isDeferred = toolDef.defer_loading === true;\n const isDiscovered = this.discoveredToolNames.has(name);\n if (!isDeferred || isDiscovered) {\n programmaticOnlyTools.push(toolDef);\n }\n }\n\n if (programmaticOnlyTools.length === 0) return '';\n\n const toolDescriptions = programmaticOnlyTools\n .map((tool) => {\n let desc = `- **${tool.name}**`;\n if (tool.description != null && tool.description !== '') {\n desc += `: ${tool.description}`;\n }\n if (tool.parameters) {\n desc += `\\n Parameters: ${JSON.stringify(tool.parameters, null, 2).replace(/\\n/g, '\\n ')}`;\n }\n return desc;\n })\n .join('\\n\\n');\n\n return (\n '\\n\\n## Programmatic-Only Tools\\n\\n' +\n 'The following tools are available exclusively through the `run_tools_with_code` tool. ' +\n 'You cannot call these tools directly; instead, use `run_tools_with_code` with Python code that invokes them.\\n\\n' +\n toolDescriptions\n );\n }\n\n /**\n * Gets the system runnable, creating it lazily if needed.\n * Includes instructions, additional instructions, and programmatic-only tools documentation.\n * Only rebuilds when marked stale (via markToolsAsDiscovered).\n */\n get systemRunnable():\n | Runnable<\n BaseMessage[],\n (BaseMessage | SystemMessage)[],\n RunnableConfig<Record<string, unknown>>\n >\n | undefined {\n // Return cached if not stale\n if (!this.systemRunnableStale && this.cachedSystemRunnable !== undefined) {\n return this.cachedSystemRunnable;\n }\n\n // Stale or first access - rebuild\n const instructionsString = this.buildInstructionsString();\n this.cachedSystemRunnable = this.buildSystemRunnable(instructionsString);\n this.systemRunnableStale = false;\n return this.cachedSystemRunnable;\n }\n\n /**\n * Explicitly initializes the system runnable.\n * Call this before async token calculation to ensure system message tokens are counted first.\n */\n initializeSystemRunnable(): void {\n if (this.systemRunnableStale || this.cachedSystemRunnable === undefined) {\n const instructionsString = this.buildInstructionsString();\n this.cachedSystemRunnable = this.buildSystemRunnable(instructionsString);\n this.systemRunnableStale = false;\n }\n }\n\n /**\n * Builds the raw instructions string (without creating SystemMessage).\n * Includes agent identity preamble and handoff context when available.\n */\n private buildInstructionsString(): string {\n const parts: string[] = [];\n\n /** Build agent identity and handoff context preamble */\n const identityPreamble = this.buildIdentityPreamble();\n if (identityPreamble) {\n parts.push(identityPreamble);\n }\n\n /** Add main instructions */\n if (this.instructions != null && this.instructions !== '') {\n parts.push(this.instructions);\n }\n\n /** Add additional instructions */\n if (\n this.additionalInstructions != null &&\n this.additionalInstructions !== ''\n ) {\n parts.push(this.additionalInstructions);\n }\n\n /** Add programmatic tools documentation */\n const programmaticToolsDoc = this.buildProgrammaticOnlyToolsInstructions();\n if (programmaticToolsDoc) {\n parts.push(programmaticToolsDoc);\n }\n\n return parts.join('\\n\\n');\n }\n\n /**\n * Builds the agent identity preamble including handoff context if present.\n * This helps the agent understand its role in the multi-agent workflow.\n */\n private buildIdentityPreamble(): string {\n if (!this.handoffContext) return '';\n\n const displayName = this.name ?? this.agentId;\n const { sourceAgentName, parallelSiblings } = this.handoffContext;\n const isParallel = parallelSiblings.length > 0;\n\n const lines: string[] = [];\n lines.push('## Multi-Agent Workflow');\n lines.push(\n `You are \"${displayName}\", transferred from \"${sourceAgentName}\".`\n );\n\n if (isParallel) {\n lines.push(`Running in parallel with: ${parallelSiblings.join(', ')}.`);\n }\n\n lines.push(\n 'Execute only tasks relevant to your role. Routing is already handled if requested, unless you can route further.'\n );\n\n return lines.join('\\n');\n }\n\n /**\n * Build system runnable from pre-built instructions string.\n * Only called when content has actually changed.\n */\n private buildSystemRunnable(\n instructionsString: string\n ):\n | Runnable<\n BaseMessage[],\n (BaseMessage | SystemMessage)[],\n RunnableConfig<Record<string, unknown>>\n >\n | undefined {\n if (!instructionsString) {\n // Remove previous tokens if we had a system message before\n this.instructionTokens -= this.systemMessageTokens;\n this.systemMessageTokens = 0;\n return undefined;\n }\n\n let finalInstructions: string | BaseMessageFields = instructionsString;\n\n // Handle Anthropic prompt caching (Direct API)\n if (this.provider === Providers.ANTHROPIC) {\n const anthropicOptions = this.clientOptions as\n | t.AnthropicClientOptions\n | undefined;\n if (anthropicOptions?.promptCache === true) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructionsString,\n cache_control: { type: 'ephemeral' },\n },\n ],\n };\n }\n }\n\n // Handle Bedrock prompt caching (Converse API)\n // Adds cachePoint block after text content for system message caching\n // NOTE: Both Claude and Nova models support cachePoint in system and messages\n // (Nova does NOT support cachePoint in tools - that check is in bedrock/index.ts)\n if (this.provider === Providers.BEDROCK) {\n const bedrockOptions = this.clientOptions as\n | t.BedrockAnthropicInput\n | undefined;\n const modelId = bedrockOptions?.model?.toLowerCase() ?? '';\n const supportsCaching =\n modelId.includes('claude') ||\n modelId.includes('anthropic') ||\n modelId.includes('nova');\n\n if (bedrockOptions?.promptCache === true && supportsCaching) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructionsString,\n },\n {\n cachePoint: { type: 'default' },\n },\n ],\n };\n }\n }\n\n const systemMessage = new SystemMessage(finalInstructions);\n\n // Update token counts (subtract old, add new)\n if (this.tokenCounter) {\n this.instructionTokens -= this.systemMessageTokens;\n this.systemMessageTokens = this.tokenCounter(systemMessage);\n this.instructionTokens += this.systemMessageTokens;\n }\n\n return RunnableLambda.from((messages: BaseMessage[]) => {\n return [systemMessage, ...messages];\n }).withConfig({ runName: 'prompt' });\n }\n\n /**\n * Reset context for a new run\n */\n reset(): void {\n this.instructionTokens = 0;\n this.systemMessageTokens = 0;\n this.toolsDetail = [];\n this.toolTokensTotal = 0;\n this.cachedSystemRunnable = undefined;\n this.systemRunnableStale = true;\n this.lastToken = undefined;\n this.indexTokenCountMap = {};\n this.currentUsage = undefined;\n this.pruneMessages = undefined;\n this.lastStreamCall = undefined;\n this.tokenTypeSwitch = undefined;\n this.currentTokenType = ContentTypes.TEXT;\n this.discoveredToolNames.clear();\n this.handoffContext = undefined;\n }\n\n /**\n * Update the token count map with instruction tokens\n */\n updateTokenMapWithInstructions(baseTokenMap: Record<string, number>): void {\n if (this.instructionTokens > 0) {\n // Shift all indices by the instruction token count\n const shiftedMap: Record<string, number> = {};\n for (const [key, value] of Object.entries(baseTokenMap)) {\n const index = parseInt(key, 10);\n if (!isNaN(index)) {\n shiftedMap[String(index)] =\n value + (index === 0 ? this.instructionTokens : 0);\n }\n }\n this.indexTokenCountMap = shiftedMap;\n } else {\n this.indexTokenCountMap = { ...baseTokenMap };\n }\n }\n\n /**\n * Calculate tool tokens and add to instruction tokens\n * Note: System message tokens are calculated during systemRunnable creation\n * Also tracks per-tool token breakdown for admin reporting\n */\n async calculateInstructionTokens(\n tokenCounter: t.TokenCounter\n ): Promise<void> {\n let toolTokens = 0;\n this.toolsDetail = []; // Reset per-tool breakdown\n\n if (this.tools && this.tools.length > 0) {\n for (const tool of this.tools) {\n const genericTool = tool as Record<string, unknown>;\n if (\n genericTool.schema != null &&\n typeof genericTool.schema === 'object'\n ) {\n const jsonSchema = toJsonSchema(\n genericTool.schema,\n (genericTool.name as string | undefined) ?? '',\n (genericTool.description as string | undefined) ?? ''\n );\n const toolName = (genericTool.name as string) || 'unknown';\n const tokens = tokenCounter(\n new SystemMessage(JSON.stringify(jsonSchema))\n );\n\n // Track per-tool breakdown\n this.toolsDetail.push({ name: toolName, tokens });\n toolTokens += tokens;\n }\n }\n }\n\n // Store total tool tokens for breakdown reporting\n this.toolTokensTotal = toolTokens;\n\n // Add tool tokens to existing instruction tokens (which may already include system message tokens)\n this.instructionTokens += toolTokens;\n }\n\n /**\n * Set the per-prompt token breakdown for detailed admin tracking.\n * Called by the client after assembling all prompt components.\n * @param breakdown - Object with token counts per prompt component\n */\n setPromptBreakdown(breakdown: {\n branding?: number;\n toolRouting?: number;\n agentInstructions?: number;\n mcpInstructions?: number;\n artifacts?: number;\n memory?: number;\n }): void {\n if (breakdown.branding !== undefined)\n this.promptBreakdown.branding = breakdown.branding;\n if (breakdown.toolRouting !== undefined)\n this.promptBreakdown.toolRouting = breakdown.toolRouting;\n if (breakdown.agentInstructions !== undefined)\n this.promptBreakdown.agentInstructions = breakdown.agentInstructions;\n if (breakdown.mcpInstructions !== undefined)\n this.promptBreakdown.mcpInstructions = breakdown.mcpInstructions;\n if (breakdown.artifacts !== undefined)\n this.promptBreakdown.artifacts = breakdown.artifacts;\n if (breakdown.memory !== undefined)\n this.promptBreakdown.memory = breakdown.memory;\n }\n\n /**\n * Get a detailed breakdown of context tokens for admin reporting.\n * This provides visibility into what's consuming the input token budget.\n * @returns ContextBreakdown object with per-component token counts\n */\n getContextBreakdown(): {\n instructions: number;\n artifacts: number;\n tools: number;\n toolCount: number;\n toolContext: number;\n total: number;\n toolsDetail: Array<{ name: string; tokens: number }>;\n toolContextDetail: Array<{ name: string; tokens: number }>;\n prompts?: {\n branding: number;\n toolRouting: number;\n agentInstructions: number;\n mcpInstructions: number;\n artifacts: number;\n memory: number;\n };\n } {\n // Calculate sum of prompt components\n const promptsTotal =\n this.promptBreakdown.branding +\n this.promptBreakdown.toolRouting +\n this.promptBreakdown.agentInstructions +\n this.promptBreakdown.mcpInstructions +\n this.promptBreakdown.artifacts +\n this.promptBreakdown.memory;\n\n return {\n // System message tokens (instructions + additional_instructions)\n instructions: this.systemMessageTokens,\n // Artifacts prompt tokens\n artifacts: this.promptBreakdown.artifacts,\n // Total tool definition tokens\n tools: this.toolTokensTotal,\n // Number of tools\n toolCount: this.toolsDetail.length,\n // Tool context/usage instructions (currently embedded in system message)\n toolContext: 0,\n // Total tracked context tokens\n total: this.instructionTokens,\n // Per-tool token breakdown\n toolsDetail: [...this.toolsDetail],\n // Tool context detail (currently not tracked separately)\n toolContextDetail: [],\n // Per-prompt breakdown (only include if any prompts were tracked)\n prompts: promptsTotal > 0 ? { ...this.promptBreakdown } : undefined,\n };\n }\n\n /**\n * Gets the tool registry for deferred tools (for tool search).\n * @param onlyDeferred If true, only returns tools with defer_loading=true\n * @returns LCToolRegistry with tool definitions\n */\n getDeferredToolRegistry(onlyDeferred: boolean = true): t.LCToolRegistry {\n const registry: t.LCToolRegistry = new Map();\n\n if (!this.toolRegistry) {\n return registry;\n }\n\n for (const [name, toolDef] of this.toolRegistry) {\n if (!onlyDeferred || toolDef.defer_loading === true) {\n registry.set(name, toolDef);\n }\n }\n\n return registry;\n }\n\n /**\n * Sets the handoff context for this agent.\n * Call this when the agent receives control via handoff from another agent.\n * Marks system runnable as stale to include handoff context in system message.\n * @param sourceAgentName - Name of the agent that transferred control\n * @param parallelSiblings - Names of other agents executing in parallel with this one\n */\n setHandoffContext(sourceAgentName: string, parallelSiblings: string[]): void {\n this.handoffContext = { sourceAgentName, parallelSiblings };\n this.systemRunnableStale = true;\n }\n\n /**\n * Clears any handoff context.\n * Call this when resetting the agent or when handoff context is no longer relevant.\n */\n clearHandoffContext(): void {\n if (this.handoffContext) {\n this.handoffContext = undefined;\n this.systemRunnableStale = true;\n }\n }\n\n /**\n * Marks tools as discovered via tool search.\n * Discovered tools will be included in the next model binding.\n * Only marks system runnable stale if NEW tools were actually added.\n * @param toolNames - Array of discovered tool names\n * @returns true if any new tools were discovered\n */\n markToolsAsDiscovered(toolNames: string[]): boolean {\n let hasNewDiscoveries = false;\n for (const name of toolNames) {\n if (!this.discoveredToolNames.has(name)) {\n this.discoveredToolNames.add(name);\n hasNewDiscoveries = true;\n }\n }\n if (hasNewDiscoveries) {\n this.systemRunnableStale = true;\n }\n return hasNewDiscoveries;\n }\n\n /**\n * Gets tools that should be bound to the LLM.\n * In event-driven mode (toolDefinitions present, tools empty), creates schema-only tools.\n * Otherwise filters tool instances based on:\n * 1. Non-deferred tools with allowed_callers: ['direct']\n * 2. Discovered tools (from tool search)\n * @returns Array of tools to bind to model\n */\n getToolsForBinding(): t.GraphTools | undefined {\n /** Event-driven mode: create schema-only tools from definitions */\n if (this.toolDefinitions && this.toolDefinitions.length > 0) {\n return this.getEventDrivenToolsForBinding();\n }\n\n /** Traditional mode: filter actual tool instances */\n if (!this.tools || !this.toolRegistry) {\n return this.tools;\n }\n\n return this.filterToolsForBinding(this.tools);\n }\n\n /** Creates schema-only tools from toolDefinitions for event-driven mode */\n private getEventDrivenToolsForBinding(): t.GraphTools {\n if (!this.toolDefinitions) {\n return [];\n }\n\n const defsToInclude = this.toolDefinitions.filter((def) => {\n const allowedCallers = def.allowed_callers ?? ['direct'];\n if (!allowedCallers.includes('direct')) {\n return false;\n }\n if (\n def.defer_loading === true &&\n !this.discoveredToolNames.has(def.name)\n ) {\n return false;\n }\n return true;\n });\n\n return createSchemaOnlyTools(defsToInclude) as t.GraphTools;\n }\n\n /** Filters tool instances for binding based on registry config */\n private filterToolsForBinding(tools: t.GraphTools): t.GraphTools {\n return tools.filter((tool) => {\n if (!('name' in tool)) {\n return true;\n }\n\n const toolDef = this.toolRegistry?.get(tool.name);\n if (!toolDef) {\n return true;\n }\n\n if (this.discoveredToolNames.has(tool.name)) {\n const allowedCallers = toolDef.allowed_callers ?? ['direct'];\n return allowedCallers.includes('direct');\n }\n\n const allowedCallers = toolDef.allowed_callers ?? ['direct'];\n return (\n allowedCallers.includes('direct') && toolDef.defer_loading !== true\n );\n });\n }\n}\n"],"names":["ContentTypes","Providers","SystemMessage","RunnableLambda","toJsonSchema","createSchemaOnlyTools"],"mappings":"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"}
@@ -16,7 +16,7 @@ var tools = require('../messages/tools.cjs');
16
16
  var graph = require('../utils/graph.cjs');
17
17
  var llm = require('../utils/llm.cjs');
18
18
  var run = require('../utils/run.cjs');
19
- require('js-tiktoken/lite');
19
+ require('js-tiktoken');
20
20
  require('../utils/toonFormat.cjs');
21
21
  var contextAnalytics = require('../utils/contextAnalytics.cjs');
22
22
  require('zod-to-json-schema');
@@ -25,7 +25,9 @@ var ToolNode = require('../tools/ToolNode.cjs');
25
25
  var index = require('../llm/openai/index.cjs');
26
26
  var events = require('../utils/events.cjs');
27
27
  var schema = require('../tools/schema.cjs');
28
+ var validate = require('../schemas/validate.cjs');
28
29
  var AgentContext = require('../agents/AgentContext.cjs');
30
+ var graph$1 = require('../types/graph.cjs');
29
31
  var fake = require('../llm/fake.cjs');
30
32
 
31
33
  /* eslint-disable no-console */
@@ -449,10 +451,15 @@ class StandardGraph extends Graph {
449
451
  }
450
452
  /**
451
453
  * Execute model invocation with structured output.
452
- * Uses withStructuredOutput to force the model to return JSON conforming to the schema.
453
- * Disables streaming and returns a validated JSON response.
454
+ * Uses native constrained decoding (jsonSchema method) for supported providers,
455
+ * or falls back to withStructuredOutput with functionCalling/jsonMode.
456
+ *
457
+ * Native mode uses provider APIs directly:
458
+ * - Anthropic: output_config.format via LangChain's method: 'json_schema'
459
+ * - OpenAI/Azure: response_format.json_schema via LangChain's method: 'jsonSchema'
460
+ * - Bedrock: falls back to functionCalling (LangChain doesn't support native yet)
454
461
  */
455
- async attemptStructuredInvoke({ currentModel, finalMessages, schema, structuredOutputConfig, provider, }, config) {
462
+ async attemptStructuredInvoke({ currentModel, finalMessages, schema, structuredOutputConfig, provider, agentContext, }, config) {
456
463
  const model = this.overrideModel ?? currentModel;
457
464
  if (!model) {
458
465
  throw new Error('No model found');
@@ -464,41 +471,44 @@ class StandardGraph extends Graph {
464
471
  `Please use a model that supports JSON schema output (e.g., OpenAI GPT-4, Anthropic Claude, Google Gemini) ` +
465
472
  `or disable structured output for this agent.`);
466
473
  }
467
- const { name = 'StructuredResponse', mode = 'auto', includeRaw: _includeRaw = false, handleErrors = true, maxRetries = 2, } = structuredOutputConfig;
468
- // Determine the method based on mode and provider
469
- // - 'tool' / 'functionCalling': Use tool calling (works with OpenAI, Bedrock)
470
- // - 'provider' / 'jsonMode': Use native JSON mode (OpenAI, Anthropic direct - NOT Bedrock)
471
- // - 'auto': Auto-detect based on provider
472
- // NOTE: ChatBedrockConverse does NOT support 'jsonMode' - it only supports tool-based structured output
474
+ const { name = 'StructuredResponse', includeRaw: _includeRaw = false, handleErrors = true, maxRetries = 2, } = structuredOutputConfig;
475
+ // Resolve the structured output method using AgentContext's provider-aware logic
473
476
  let method;
474
- if (mode === 'tool') {
475
- method = 'functionCalling';
477
+ if (agentContext) {
478
+ const resolved = agentContext.resolveStructuredOutputMode();
479
+ method = resolved.method;
480
+ if (resolved.warnings.length > 0) {
481
+ console.warn('[Graph] Structured output mode warnings:', resolved.warnings);
482
+ }
476
483
  }
477
- else if (mode === 'provider') {
478
- // Use native JSON mode - but NOT for Bedrock which doesn't support it
479
- if (provider === _enum.Providers.BEDROCK) {
480
- // Bedrock only supports function calling for structured output
484
+ else {
485
+ // Legacy fallback: use the old mode-based resolution
486
+ const mode = structuredOutputConfig.mode ?? 'auto';
487
+ if (mode === 'tool') {
481
488
  method = 'functionCalling';
482
489
  }
490
+ else if (mode === 'provider') {
491
+ method = provider === _enum.Providers.BEDROCK ? 'functionCalling' : 'jsonMode';
492
+ }
483
493
  else {
484
- method = 'jsonMode';
494
+ method = undefined;
485
495
  }
486
496
  }
487
- else {
488
- // Auto mode: use function calling for all providers
489
- // This is the most compatible approach
490
- // Bedrock: only supports functionCalling
491
- // Anthropic direct: supports both but functionCalling is more reliable
492
- // OpenAI/Azure: supports both, functionCalling is default
493
- // Google/Vertex: supports jsonMode but functionCalling works too
494
- method = undefined; // Let LangChain choose the default
497
+ // Prepare schema for provider-specific constraints when using native/jsonSchema mode
498
+ let preparedSchema = schema;
499
+ if (method === 'jsonSchema' && provider) {
500
+ const { schema: prepared, warnings } = validate.prepareSchemaForProvider(schema, provider, structuredOutputConfig.strict !== false);
501
+ preparedSchema = prepared;
502
+ if (warnings.length > 0) {
503
+ console.log('[Graph] Schema preparation warnings:', warnings);
504
+ }
495
505
  }
496
506
  // Use withStructuredOutput to bind the schema
497
507
  // Always use includeRaw: true internally so we can debug what's returned
498
508
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
499
- const structuredModel = model.withStructuredOutput(schema, {
509
+ const structuredModel = model.withStructuredOutput(preparedSchema, {
500
510
  name,
501
- method,
511
+ method: method === 'native' ? undefined : method,
502
512
  includeRaw: true, // Always true internally for debugging
503
513
  strict: structuredOutputConfig.strict !== false,
504
514
  });
@@ -506,7 +516,7 @@ class StandardGraph extends Graph {
506
516
  name,
507
517
  method,
508
518
  provider,
509
- schemaKeys: Object.keys(schema),
519
+ schemaKeys: Object.keys(preparedSchema),
510
520
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
511
521
  modelName: model.model || model.modelId || 'unknown',
512
522
  });
@@ -519,6 +529,7 @@ class StandardGraph extends Graph {
519
529
  const result = await structuredModel.invoke(finalMessages, config);
520
530
  // Debug: log what we got back
521
531
  console.log('[Graph] Structured output raw result type:', typeof result);
532
+ // Check for refusal or truncation in the raw message
522
533
  if (result?.raw) {
523
534
  const rawMsg = result.raw;
524
535
  console.log('[Graph] Raw message content type:', typeof rawMsg?.content);
@@ -526,6 +537,20 @@ class StandardGraph extends Graph {
526
537
  if (rawMsg?.content && typeof rawMsg.content === 'string' && rawMsg.content.length > 0) {
527
538
  console.log('[Graph] Raw message text content (first 200):', rawMsg.content.substring(0, 200));
528
539
  }
540
+ // Check stop reason for refusal or truncation
541
+ const responseMetadata = rawMsg.response_metadata ?? {};
542
+ const stopReason = responseMetadata.stop_reason ?? // Anthropic
543
+ responseMetadata.finish_reason ?? // OpenAI
544
+ responseMetadata.stopReason; // Bedrock
545
+ if (stopReason === 'max_tokens' || stopReason === 'length') {
546
+ throw new graph$1.StructuredOutputTruncatedError(stopReason);
547
+ }
548
+ // Check for Anthropic refusal (stop_reason won't be 'refusal' but content may indicate it)
549
+ // OpenAI uses message.refusal field
550
+ const refusal = rawMsg.refusal;
551
+ if (refusal) {
552
+ throw new graph$1.StructuredOutputRefusalError(refusal);
553
+ }
529
554
  }
530
555
  // Handle response - we always use includeRaw internally
531
556
  if (result?.raw && result?.parsed !== undefined) {
@@ -540,6 +565,11 @@ class StandardGraph extends Graph {
540
565
  };
541
566
  }
542
567
  catch (error) {
568
+ // Don't retry on refusal or truncation errors — they need user action
569
+ if (error instanceof graph$1.StructuredOutputRefusalError ||
570
+ error instanceof graph$1.StructuredOutputTruncatedError) {
571
+ throw error;
572
+ }
543
573
  lastError = error;
544
574
  attempts++;
545
575
  // If error handling is disabled, throw immediately
@@ -597,25 +627,37 @@ class StandardGraph extends Graph {
597
627
  // bindTools() returns RunnableBinding which lacks withStructuredOutput
598
628
  // Also disable thinking mode - Anthropic/Bedrock doesn't allow tool_choice with thinking enabled
599
629
  const structuredClientOptions = { ...agentContext.clientOptions };
600
- // Disable streaming for structured output
601
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
602
- structuredClientOptions.streaming = false;
603
- // Remove thinking configuration for Bedrock
604
- if (agentContext.provider === _enum.Providers.BEDROCK) {
605
- const bedrockOpts = structuredClientOptions;
606
- if (bedrockOpts.additionalModelRequestFields) {
607
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
608
- const additionalFields = Object.assign({}, bedrockOpts.additionalModelRequestFields);
609
- delete additionalFields.thinking;
610
- delete additionalFields.budgetTokens;
611
- bedrockOpts.additionalModelRequestFields = additionalFields;
630
+ // Determine if streaming is possible for this structured output mode
631
+ // Native/jsonSchema modes can stream; tool/functionCalling modes cannot (synthetic tool calls break UX)
632
+ const resolved = agentContext.resolveStructuredOutputMode();
633
+ const canStream = resolved.method === 'jsonSchema' || resolved.method === 'jsonMode';
634
+ if (!canStream) {
635
+ // Disable streaming for function calling mode (synthetic tool calls break streaming UX)
636
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
637
+ structuredClientOptions.streaming = false;
638
+ }
639
+ // For native/jsonSchema mode, Anthropic's constrained decoding works with thinking enabled
640
+ // (grammar only applies to final output, not thinking blocks). For function calling mode,
641
+ // thinking must be disabled because forced tool_choice is incompatible with thinking.
642
+ const needsThinkingDisabled = resolved.method !== 'jsonSchema';
643
+ if (needsThinkingDisabled) {
644
+ // Remove thinking configuration for Bedrock
645
+ if (agentContext.provider === _enum.Providers.BEDROCK) {
646
+ const bedrockOpts = structuredClientOptions;
647
+ if (bedrockOpts.additionalModelRequestFields) {
648
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
649
+ const additionalFields = Object.assign({}, bedrockOpts.additionalModelRequestFields);
650
+ delete additionalFields.thinking;
651
+ delete additionalFields.budgetTokens;
652
+ bedrockOpts.additionalModelRequestFields = additionalFields;
653
+ }
612
654
  }
613
- }
614
- // Remove thinking configuration for Anthropic direct API
615
- if (agentContext.provider === _enum.Providers.ANTHROPIC) {
616
- const anthropicOpts = structuredClientOptions;
617
- if (anthropicOpts.thinking) {
618
- delete anthropicOpts.thinking;
655
+ // Remove thinking configuration for Anthropic direct API
656
+ if (agentContext.provider === _enum.Providers.ANTHROPIC) {
657
+ const anthropicOpts = structuredClientOptions;
658
+ if (anthropicOpts.thinking) {
659
+ delete anthropicOpts.thinking;
660
+ }
619
661
  }
620
662
  }
621
663
  const structuredModel = this.getNewModel({
@@ -628,6 +670,7 @@ class StandardGraph extends Graph {
628
670
  schema,
629
671
  structuredOutputConfig: agentContext.structuredOutput,
630
672
  provider: agentContext.provider,
673
+ agentContext,
631
674
  }, config);
632
675
  // Emit structured output event
633
676
  await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_STRUCTURED_OUTPUT, {