langchain 1.4.5 → 1.4.6-dev-1781485641139
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/agents/ReactAgent.cjs +5 -2
- package/dist/agents/ReactAgent.cjs.map +1 -1
- package/dist/agents/ReactAgent.d.cts +1 -1
- package/dist/agents/ReactAgent.d.cts.map +1 -1
- package/dist/agents/ReactAgent.d.ts +1 -1
- package/dist/agents/ReactAgent.d.ts.map +1 -1
- package/dist/agents/ReactAgent.js +4 -1
- package/dist/agents/ReactAgent.js.map +1 -1
- package/dist/agents/index.cjs +3 -1
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +3 -1
- package/dist/agents/index.d.cts.map +1 -1
- package/dist/agents/index.d.ts +3 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +3 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/transformers/index.cjs +2 -0
- package/dist/agents/transformers/index.d.cts +3 -0
- package/dist/agents/transformers/index.d.ts +3 -0
- package/dist/agents/transformers/index.js +3 -0
- package/dist/agents/transformers/subagent.cjs +205 -0
- package/dist/agents/transformers/subagent.cjs.map +1 -0
- package/dist/agents/transformers/subagent.d.cts +34 -0
- package/dist/agents/transformers/subagent.d.cts.map +1 -0
- package/dist/agents/transformers/subagent.d.ts +34 -0
- package/dist/agents/transformers/subagent.d.ts.map +1 -0
- package/dist/agents/transformers/subagent.js +204 -0
- package/dist/agents/transformers/subagent.js.map +1 -0
- package/dist/agents/{stream.cjs → transformers/tool-call.cjs} +3 -15
- package/dist/agents/transformers/tool-call.cjs.map +1 -0
- package/dist/agents/transformers/tool-call.d.cts +17 -0
- package/dist/agents/transformers/tool-call.d.cts.map +1 -0
- package/dist/agents/transformers/tool-call.d.ts +17 -0
- package/dist/agents/transformers/tool-call.d.ts.map +1 -0
- package/dist/agents/{stream.js → transformers/tool-call.js} +2 -14
- package/dist/agents/transformers/tool-call.js.map +1 -0
- package/dist/agents/{stream.d.ts → transformers/types.d.cts} +50 -20
- package/dist/agents/transformers/types.d.cts.map +1 -0
- package/dist/agents/{stream.d.cts → transformers/types.d.ts} +50 -20
- package/dist/agents/transformers/types.d.ts.map +1 -0
- package/dist/browser.cjs +6 -3
- package/dist/browser.d.cts +4 -2
- package/dist/browser.d.ts +4 -2
- package/dist/browser.js +4 -2
- package/dist/index.cjs +6 -3
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/package.json +1 -1
- package/chat_models/universal.cjs +0 -1
- package/chat_models/universal.d.cts +0 -1
- package/chat_models/universal.d.ts +0 -1
- package/chat_models/universal.js +0 -1
- package/dist/agents/stream.cjs.map +0 -1
- package/dist/agents/stream.d.cts.map +0 -1
- package/dist/agents/stream.d.ts.map +0 -1
- package/dist/agents/stream.js.map +0 -1
- package/hub/node.cjs +0 -1
- package/hub/node.d.cts +0 -1
- package/hub/node.d.ts +0 -1
- package/hub/node.js +0 -1
- package/hub.cjs +0 -1
- package/hub.d.cts +0 -1
- package/hub.d.ts +0 -1
- package/hub.js +0 -1
- package/load/serializable.cjs +0 -1
- package/load/serializable.d.cts +0 -1
- package/load/serializable.d.ts +0 -1
- package/load/serializable.js +0 -1
- package/load.cjs +0 -1
- package/load.d.cts +0 -1
- package/load.d.ts +0 -1
- package/load.js +0 -1
- package/storage/encoder_backed.cjs +0 -1
- package/storage/encoder_backed.d.cts +0 -1
- package/storage/encoder_backed.d.ts +0 -1
- package/storage/encoder_backed.js +0 -1
- package/storage/file_system.cjs +0 -1
- package/storage/file_system.d.cts +0 -1
- package/storage/file_system.d.ts +0 -1
- package/storage/file_system.js +0 -1
- package/storage/in_memory.cjs +0 -1
- package/storage/in_memory.d.cts +0 -1
- package/storage/in_memory.d.ts +0 -1
- package/storage/in_memory.js +0 -1
package/dist/agents/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/agents/index.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport type {\n InteropZodObject,\n InteropZodType,\n} from \"@langchain/core/utils/types\";\nimport type { ClientTool, ServerTool } from \"@langchain/core/tools\";\nimport type {\n StateDefinitionInit,\n StreamTransformer,\n} from \"@langchain/langgraph\";\n\nimport type { ResponseFormatUndefined } from \"./responses.js\";\nimport type {\n CreateAgentParams,\n AgentTypeConfig,\n CombineTools,\n CombineStreamTransformers,\n} from \"./types.js\";\nimport type {\n AnyAgentMiddleware,\n AnyAnnotationRoot,\n} from \"./middleware/types.js\";\nimport type { ExtractZodArrayTypes } from \"./types.js\";\nimport type { SerializableSchema } from \"@langchain/core/utils/standard_schema\";\nimport type {\n ToolStrategy,\n TypedToolStrategy,\n ProviderStrategy,\n ResponseFormat,\n JsonSchemaFormat,\n} from \"./responses.js\";\nimport { ReactAgent } from \"./ReactAgent.js\";\n\n/**\n * Creates a production-ready ReAct (Reasoning + Acting) agent that combines language models with tools\n * and middleware to create systems that can reason about tasks, decide which tools to use, and iteratively\n * work towards solutions.\n *\n * The agent follows the ReAct pattern, interleaving reasoning steps with tool calls to iteratively\n * work towards solutions. It can handle multiple tool calls in sequence or parallel, maintain state\n * across interactions, and provide auditable decision processes.\n *\n * ## Core Components\n *\n * ### Model\n * The reasoning engine can be specified as:\n * - **String identifier**: `\"openai:gpt-4o\"` for simple setup\n * - **Model instance**: Configured model object for full control\n * - **Dynamic function**: Select models at runtime based on state\n *\n * ### Tools\n * Tools give agents the ability to take actions:\n * - Pass an array of tools created with the `tool` function\n * - Or provide a configured `ToolNode` for custom error handling\n *\n * ### Prompt\n * Shape how your agent approaches tasks:\n * - String for simple instructions\n * - SystemMessage for structured prompts\n * - Function for dynamic prompts based on state\n *\n * ### Middleware\n * Middleware allows you to extend the agent's behavior:\n * - Add pre/post-model processing for context injection or validation\n * - Add dynamic control flows, e.g. terminate invocation or retries\n * - Add human-in-the-loop capabilities\n * - Add tool calls to the agent\n * - Add tool results to the agent\n *\n * ## Advanced Features\n *\n * - **Structured Output**: Use `responseFormat` with a Zod schema to get typed responses\n * - **Memory**: Extend the state schema to remember information across interactions\n * - **Streaming**: Get real-time updates as the agent processes\n *\n * @param options - Configuration options for the agent\n * @param options.llm - The language model as an instance of a chat model\n * @param options.model - The language model as a string identifier, see more in {@link https://docs.langchain.com/oss/javascript/langchain/models#basic-usage | Models}.\n * @param options.tools - Array of tools or configured ToolNode\n * @param options.prompt - System instructions (string, SystemMessage, or function)\n * @param options.responseFormat - Zod schema for structured output\n * @param options.stateSchema - Custom state schema for memory\n * @param options.middleware - Array of middleware for extending agent behavior, see more in {@link https://docs.langchain.com/oss/javascript/langchain/middleware | Middleware}.\n *\n * @returns A ReactAgent instance with `invoke` and `stream` methods\n *\n * @example Basic agent with tools\n * ```ts\n * import { createAgent, tool } from \"langchain\";\n * import { z } from \"zod\";\n *\n * const search = tool(\n * ({ query }) => `Results for: ${query}`,\n * {\n * name: \"search\",\n * description: \"Search for information\",\n * schema: z.object({\n * query: z.string().describe(\"The search query\"),\n * })\n * }\n * );\n *\n * const agent = createAgent({\n * llm: \"openai:gpt-4o\",\n * tools: [search],\n * });\n *\n * const result = await agent.invoke({\n * messages: [{ role: \"user\", content: \"Search for ReAct agents\" }],\n * });\n * ```\n *\n * @example Structured output\n * ```ts\n * import { createAgent } from \"langchain\";\n * import { z } from \"zod\";\n *\n * const ContactInfo = z.object({\n * name: z.string(),\n * email: z.string(),\n * phone: z.string(),\n * });\n *\n * const agent = createAgent({\n * llm: \"openai:gpt-4o\",\n * tools: [],\n * responseFormat: ContactInfo,\n * });\n *\n * const result = await agent.invoke({\n * messages: [{\n * role: \"user\",\n * content: \"Extract: John Doe, john@example.com, (555) 123-4567\"\n * }],\n * });\n *\n * console.log(result.structuredResponse);\n * // { name: 'John Doe', email: 'john@example.com', phone: '(555) 123-4567' }\n * ```\n *\n * @example Streaming responses\n * ```ts\n * const stream = await agent.stream(\n * { messages: [{ role: \"user\", content: \"What's the weather?\" }] },\n * { streamMode: \"values\" }\n * );\n *\n * for await (const chunk of stream) {\n * // ...\n * }\n * ```\n *\n * @example With StateSchema\n * ```ts\n * import { createAgent } from \"langchain\";\n * import { StateSchema, ReducedValue } from \"@langchain/langgraph\";\n * import { z } from \"zod\";\n *\n * const AgentState = new StateSchema({\n * userId: z.string(),\n * count: z.number().default(0),\n * history: new ReducedValue(\n * z.array(z.string()).default(() => []),\n * { inputSchema: z.string(), reducer: (c, n) => [...c, n] }\n * ),\n * });\n *\n * const agent = createAgent({\n * model: \"openai:gpt-4o\",\n * tools: [searchTool],\n * stateSchema: AgentState,\n * });\n * ```\n */\n// Overload 1: With responseFormat as single InteropZodType\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n InteropZodType<StructuredResponseFormat>\n > & {\n responseFormat: InteropZodType<StructuredResponseFormat>;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 2: With responseFormat as array of InteropZodTypes (infers union type)\nexport function createAgent<\n StructuredResponseFormat extends readonly InteropZodType<any>[],\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n ExtractZodArrayTypes<StructuredResponseFormat> extends Record<string, any>\n ? ExtractZodArrayTypes<StructuredResponseFormat>\n : Record<string, any>,\n TStateSchema,\n ContextSchema,\n StructuredResponseFormat\n > & {\n responseFormat: StructuredResponseFormat;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n ExtractZodArrayTypes<StructuredResponseFormat> extends Record<string, any>\n ? ExtractZodArrayTypes<StructuredResponseFormat>\n : Record<string, any>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 3: With responseFormat as JsonSchemaFormat (JSON schema object)\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n JsonSchemaFormat\n > & {\n responseFormat: JsonSchemaFormat;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 4: With responseFormat as array of JsonSchemaFormat (JSON schema objects)\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n JsonSchemaFormat[]\n > & {\n responseFormat: JsonSchemaFormat[];\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 5: With responseFormat as union of JsonSchemaFormat | JsonSchemaFormat[]\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n JsonSchemaFormat | JsonSchemaFormat[]\n > & {\n responseFormat: JsonSchemaFormat | JsonSchemaFormat[];\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 6: With responseFormat as single SerializableSchema\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n SerializableSchema\n > & {\n responseFormat: SerializableSchema;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 7: With responseFormat as array of SerializableSchema\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n SerializableSchema[]\n > & {\n responseFormat: SerializableSchema[];\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 8: With responseFormat as TypedToolStrategy (for union types from toolStrategy)\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TypedToolStrategy<StructuredResponseFormat>\n > & {\n responseFormat: TypedToolStrategy<StructuredResponseFormat>;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 9: With responseFormat as single ToolStrategy instance\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n ToolStrategy<StructuredResponseFormat>\n > & {\n responseFormat: ToolStrategy<StructuredResponseFormat>;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 10: With responseFormat as ProviderStrategy\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n ProviderStrategy<StructuredResponseFormat>\n > & {\n responseFormat: ProviderStrategy<StructuredResponseFormat>;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 11: Without responseFormat property at all - with proper middleware state typing\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: Omit<\n CreateAgentParams<\n ResponseFormatUndefined,\n TStateSchema,\n ContextSchema,\n never\n >,\n \"responseFormat\"\n > & {\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n ResponseFormatUndefined,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 12: With responseFormat explicitly undefined\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: Omit<\n CreateAgentParams<\n ResponseFormatUndefined,\n TStateSchema,\n ContextSchema,\n never\n >,\n \"responseFormat\"\n > & {\n responseFormat?: undefined;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n ResponseFormatUndefined,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 13: For other ResponseFormat values (failsafe)\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n ResponseFormat\n > & {\n responseFormat: ResponseFormat;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Implementation\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any>,\n TStateSchema extends StateDefinitionInit,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject,\n TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n TStreamTransformers extends ReadonlyArray<() => StreamTransformer<any>> =\n readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n any\n >\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n> {\n return new ReactAgent(params);\n}\n\n// Re-export types and utilities\nexport * from \"./types.js\";\nexport * from \"./errors.js\";\nexport * from \"./nodes/types.js\";\nexport type { JumpToTarget } from \"./constants.js\";\nexport type { Runtime } from \"./runtime.js\";\nexport {\n toolStrategy,\n providerStrategy,\n ToolStrategy,\n ProviderStrategy,\n type TypedToolStrategy,\n type ResponseFormat,\n type ResponseFormatUndefined,\n} from \"./responses.js\";\nexport { createMiddleware } from \"./middleware.js\";\nexport { MIDDLEWARE_BRAND } from \"./middleware/types.js\";\nexport type * from \"./middleware/types.js\";\nexport { FakeToolCallingModel } from \"./tests/utils.js\";\nexport type { ReactAgent } from \"./ReactAgent.js\";\nexport { createToolCallTransformer } from \"./stream.js\";\nexport type { AgentRunStream, ToolCallStreamUnion } from \"./stream.js\";\n"],"mappings":";;;;;;;;AA+pBA,SAAgB,YAad,QAeA;AACA,QAAO,IAAI,WAAW,OAAO"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/agents/index.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport type {\n InteropZodObject,\n InteropZodType,\n} from \"@langchain/core/utils/types\";\nimport type { ClientTool, ServerTool } from \"@langchain/core/tools\";\nimport type {\n StateDefinitionInit,\n StreamTransformer,\n} from \"@langchain/langgraph\";\n\nimport type { ResponseFormatUndefined } from \"./responses.js\";\nimport type {\n CreateAgentParams,\n AgentTypeConfig,\n CombineTools,\n CombineStreamTransformers,\n} from \"./types.js\";\nimport type {\n AnyAgentMiddleware,\n AnyAnnotationRoot,\n} from \"./middleware/types.js\";\nimport type { ExtractZodArrayTypes } from \"./types.js\";\nimport type { SerializableSchema } from \"@langchain/core/utils/standard_schema\";\nimport type {\n ToolStrategy,\n TypedToolStrategy,\n ProviderStrategy,\n ResponseFormat,\n JsonSchemaFormat,\n} from \"./responses.js\";\nimport { ReactAgent } from \"./ReactAgent.js\";\n\n/**\n * Creates a production-ready ReAct (Reasoning + Acting) agent that combines language models with tools\n * and middleware to create systems that can reason about tasks, decide which tools to use, and iteratively\n * work towards solutions.\n *\n * The agent follows the ReAct pattern, interleaving reasoning steps with tool calls to iteratively\n * work towards solutions. It can handle multiple tool calls in sequence or parallel, maintain state\n * across interactions, and provide auditable decision processes.\n *\n * ## Core Components\n *\n * ### Model\n * The reasoning engine can be specified as:\n * - **String identifier**: `\"openai:gpt-4o\"` for simple setup\n * - **Model instance**: Configured model object for full control\n * - **Dynamic function**: Select models at runtime based on state\n *\n * ### Tools\n * Tools give agents the ability to take actions:\n * - Pass an array of tools created with the `tool` function\n * - Or provide a configured `ToolNode` for custom error handling\n *\n * ### Prompt\n * Shape how your agent approaches tasks:\n * - String for simple instructions\n * - SystemMessage for structured prompts\n * - Function for dynamic prompts based on state\n *\n * ### Middleware\n * Middleware allows you to extend the agent's behavior:\n * - Add pre/post-model processing for context injection or validation\n * - Add dynamic control flows, e.g. terminate invocation or retries\n * - Add human-in-the-loop capabilities\n * - Add tool calls to the agent\n * - Add tool results to the agent\n *\n * ## Advanced Features\n *\n * - **Structured Output**: Use `responseFormat` with a Zod schema to get typed responses\n * - **Memory**: Extend the state schema to remember information across interactions\n * - **Streaming**: Get real-time updates as the agent processes\n *\n * @param options - Configuration options for the agent\n * @param options.llm - The language model as an instance of a chat model\n * @param options.model - The language model as a string identifier, see more in {@link https://docs.langchain.com/oss/javascript/langchain/models#basic-usage | Models}.\n * @param options.tools - Array of tools or configured ToolNode\n * @param options.prompt - System instructions (string, SystemMessage, or function)\n * @param options.responseFormat - Zod schema for structured output\n * @param options.stateSchema - Custom state schema for memory\n * @param options.middleware - Array of middleware for extending agent behavior, see more in {@link https://docs.langchain.com/oss/javascript/langchain/middleware | Middleware}.\n *\n * @returns A ReactAgent instance with `invoke` and `stream` methods\n *\n * @example Basic agent with tools\n * ```ts\n * import { createAgent, tool } from \"langchain\";\n * import { z } from \"zod\";\n *\n * const search = tool(\n * ({ query }) => `Results for: ${query}`,\n * {\n * name: \"search\",\n * description: \"Search for information\",\n * schema: z.object({\n * query: z.string().describe(\"The search query\"),\n * })\n * }\n * );\n *\n * const agent = createAgent({\n * llm: \"openai:gpt-4o\",\n * tools: [search],\n * });\n *\n * const result = await agent.invoke({\n * messages: [{ role: \"user\", content: \"Search for ReAct agents\" }],\n * });\n * ```\n *\n * @example Structured output\n * ```ts\n * import { createAgent } from \"langchain\";\n * import { z } from \"zod\";\n *\n * const ContactInfo = z.object({\n * name: z.string(),\n * email: z.string(),\n * phone: z.string(),\n * });\n *\n * const agent = createAgent({\n * llm: \"openai:gpt-4o\",\n * tools: [],\n * responseFormat: ContactInfo,\n * });\n *\n * const result = await agent.invoke({\n * messages: [{\n * role: \"user\",\n * content: \"Extract: John Doe, john@example.com, (555) 123-4567\"\n * }],\n * });\n *\n * console.log(result.structuredResponse);\n * // { name: 'John Doe', email: 'john@example.com', phone: '(555) 123-4567' }\n * ```\n *\n * @example Streaming responses\n * ```ts\n * const stream = await agent.stream(\n * { messages: [{ role: \"user\", content: \"What's the weather?\" }] },\n * { streamMode: \"values\" }\n * );\n *\n * for await (const chunk of stream) {\n * // ...\n * }\n * ```\n *\n * @example With StateSchema\n * ```ts\n * import { createAgent } from \"langchain\";\n * import { StateSchema, ReducedValue } from \"@langchain/langgraph\";\n * import { z } from \"zod\";\n *\n * const AgentState = new StateSchema({\n * userId: z.string(),\n * count: z.number().default(0),\n * history: new ReducedValue(\n * z.array(z.string()).default(() => []),\n * { inputSchema: z.string(), reducer: (c, n) => [...c, n] }\n * ),\n * });\n *\n * const agent = createAgent({\n * model: \"openai:gpt-4o\",\n * tools: [searchTool],\n * stateSchema: AgentState,\n * });\n * ```\n */\n// Overload 1: With responseFormat as single InteropZodType\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n InteropZodType<StructuredResponseFormat>\n > & {\n responseFormat: InteropZodType<StructuredResponseFormat>;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 2: With responseFormat as array of InteropZodTypes (infers union type)\nexport function createAgent<\n StructuredResponseFormat extends readonly InteropZodType<any>[],\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n ExtractZodArrayTypes<StructuredResponseFormat> extends Record<string, any>\n ? ExtractZodArrayTypes<StructuredResponseFormat>\n : Record<string, any>,\n TStateSchema,\n ContextSchema,\n StructuredResponseFormat\n > & {\n responseFormat: StructuredResponseFormat;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n ExtractZodArrayTypes<StructuredResponseFormat> extends Record<string, any>\n ? ExtractZodArrayTypes<StructuredResponseFormat>\n : Record<string, any>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 3: With responseFormat as JsonSchemaFormat (JSON schema object)\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n JsonSchemaFormat\n > & {\n responseFormat: JsonSchemaFormat;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 4: With responseFormat as array of JsonSchemaFormat (JSON schema objects)\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n JsonSchemaFormat[]\n > & {\n responseFormat: JsonSchemaFormat[];\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 5: With responseFormat as union of JsonSchemaFormat | JsonSchemaFormat[]\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n JsonSchemaFormat | JsonSchemaFormat[]\n > & {\n responseFormat: JsonSchemaFormat | JsonSchemaFormat[];\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 6: With responseFormat as single SerializableSchema\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n SerializableSchema\n > & {\n responseFormat: SerializableSchema;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 7: With responseFormat as array of SerializableSchema\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n SerializableSchema[]\n > & {\n responseFormat: SerializableSchema[];\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n Record<string, unknown>,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 8: With responseFormat as TypedToolStrategy (for union types from toolStrategy)\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TypedToolStrategy<StructuredResponseFormat>\n > & {\n responseFormat: TypedToolStrategy<StructuredResponseFormat>;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 9: With responseFormat as single ToolStrategy instance\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n ToolStrategy<StructuredResponseFormat>\n > & {\n responseFormat: ToolStrategy<StructuredResponseFormat>;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 10: With responseFormat as ProviderStrategy\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n ProviderStrategy<StructuredResponseFormat>\n > & {\n responseFormat: ProviderStrategy<StructuredResponseFormat>;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 11: Without responseFormat property at all - with proper middleware state typing\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: Omit<\n CreateAgentParams<\n ResponseFormatUndefined,\n TStateSchema,\n ContextSchema,\n never\n >,\n \"responseFormat\"\n > & {\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n ResponseFormatUndefined,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 12: With responseFormat explicitly undefined\nexport function createAgent<\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: Omit<\n CreateAgentParams<\n ResponseFormatUndefined,\n TStateSchema,\n ContextSchema,\n never\n >,\n \"responseFormat\"\n > & {\n responseFormat?: undefined;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n ResponseFormatUndefined,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Overload 13: For other ResponseFormat values (failsafe)\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any> = Record<string, any>,\n TStateSchema extends StateDefinitionInit | undefined = undefined,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject =\n AnyAnnotationRoot,\n const TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n const TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n const TStreamTransformers extends ReadonlyArray<\n () => StreamTransformer<any>\n > = readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n ResponseFormat\n > & {\n responseFormat: ResponseFormat;\n middleware?: TMiddleware;\n tools?: TTools;\n streamTransformers?: TStreamTransformers;\n }\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n>;\n\n// Implementation\nexport function createAgent<\n StructuredResponseFormat extends Record<string, any>,\n TStateSchema extends StateDefinitionInit,\n ContextSchema extends AnyAnnotationRoot | InteropZodObject,\n TMiddleware extends readonly AnyAgentMiddleware[] =\n readonly AnyAgentMiddleware[],\n TTools extends readonly (ClientTool | ServerTool)[] = readonly (\n | ClientTool\n | ServerTool\n )[],\n TStreamTransformers extends ReadonlyArray<() => StreamTransformer<any>> =\n readonly [],\n>(\n params: CreateAgentParams<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n any\n >\n): ReactAgent<\n AgentTypeConfig<\n StructuredResponseFormat,\n TStateSchema,\n ContextSchema,\n TMiddleware,\n CombineTools<TTools, TMiddleware>,\n CombineStreamTransformers<TStreamTransformers, TMiddleware>\n >\n> {\n return new ReactAgent(params);\n}\n\n// Re-export types and utilities\nexport * from \"./types.js\";\nexport * from \"./errors.js\";\nexport * from \"./nodes/types.js\";\nexport type { JumpToTarget } from \"./constants.js\";\nexport type { Runtime } from \"./runtime.js\";\nexport {\n toolStrategy,\n providerStrategy,\n ToolStrategy,\n ProviderStrategy,\n type TypedToolStrategy,\n type ResponseFormat,\n type ResponseFormatUndefined,\n} from \"./responses.js\";\nexport { createMiddleware } from \"./middleware.js\";\nexport { MIDDLEWARE_BRAND } from \"./middleware/types.js\";\nexport type * from \"./middleware/types.js\";\nexport { FakeToolCallingModel } from \"./tests/utils.js\";\nexport type { ReactAgent } from \"./ReactAgent.js\";\nexport {\n createToolCallTransformer,\n createSubagentTransformer,\n type AgentRunStream,\n type ToolCallStreamUnion,\n type SubagentRunStream,\n} from \"./transformers/index.js\";\n"],"mappings":";;;;;;;;;;AA+pBA,SAAgB,YAad,QAeA;AACA,QAAO,IAAI,WAAW,OAAO"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_tool_call = require("./tool-call.cjs");
|
|
3
|
+
let _langchain_langgraph = require("@langchain/langgraph");
|
|
4
|
+
//#region src/agents/transformers/subagent.ts
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
/** Stable string key for a namespace. */
|
|
9
|
+
function nsKey(ns) {
|
|
10
|
+
return ns.join("\0");
|
|
11
|
+
}
|
|
12
|
+
/** Tests whether `ns` starts with every segment in `prefix`. */
|
|
13
|
+
function hasPrefix(ns, prefix) {
|
|
14
|
+
if (prefix.length > ns.length) return false;
|
|
15
|
+
for (let i = 0; i < prefix.length; i += 1) if (ns[i] !== prefix[i]) return false;
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates a native transformer that surfaces nested named agents on
|
|
20
|
+
* `run.subagents`.
|
|
21
|
+
*
|
|
22
|
+
* It watches `tasks` events to record each namespace's `lc_agent_name` (set by
|
|
23
|
+
* `createAgent({ name })`) and the triggering tool call, then — for any nested
|
|
24
|
+
* run one level below {@link scope} that carries an `lc_agent_name` — emits a
|
|
25
|
+
* typed {@link SubagentRunStream} handle.
|
|
26
|
+
*
|
|
27
|
+
* Each handle is backed by its own per-subagent transformer instances
|
|
28
|
+
* ({@link createMessagesTransformer}, {@link createToolCallTransformer}, and a
|
|
29
|
+
* nested {@link createSubagentTransformer}) scoped to the subagent's namespace.
|
|
30
|
+
* Every event in the subtree is fed straight into those transformers, which
|
|
31
|
+
* self-filter by namespace; the subagent's final `output` is resolved from its
|
|
32
|
+
* last `values` snapshot when its `lifecycle` completes.
|
|
33
|
+
*
|
|
34
|
+
* Marked `__native: true` — the `subagents` projection lands directly on the
|
|
35
|
+
* `GraphRunStream` instance as `run.subagents`.
|
|
36
|
+
*
|
|
37
|
+
* @param scope - Namespace prefix this transformer is scoped to. The root agent
|
|
38
|
+
* uses `[]`; nested handles use their subagent's namespace, so grandchild
|
|
39
|
+
* subagents are discovered recursively.
|
|
40
|
+
*/
|
|
41
|
+
function createSubagentTransformer(scope = []) {
|
|
42
|
+
return () => {
|
|
43
|
+
const subagentsLog = _langchain_langgraph.StreamChannel.local();
|
|
44
|
+
/** `lc_agent_name` observed per namespace (first task event wins). */
|
|
45
|
+
const lcByNs = /* @__PURE__ */ new Map();
|
|
46
|
+
/** Triggering task id -> originating LLM `tool_call_id`. */
|
|
47
|
+
const pendingToolCalls = /* @__PURE__ */ new Map();
|
|
48
|
+
/**
|
|
49
|
+
* Namespace key -> the `tool_call_id` of the most recent tool to start
|
|
50
|
+
* executing there. A tool that invokes a subagent emits its `tool-started`
|
|
51
|
+
* at the tools-node namespace (`tools:<task_id>`) where the subagent then
|
|
52
|
+
* roots, so this is the tool call that caused the subagent.
|
|
53
|
+
*/
|
|
54
|
+
const activeToolCallByNs = /* @__PURE__ */ new Map();
|
|
55
|
+
const handles = /* @__PURE__ */ new Map();
|
|
56
|
+
const depth = scope.length;
|
|
57
|
+
function recordIdentity(ns, data) {
|
|
58
|
+
const key = nsKey(ns);
|
|
59
|
+
if (lcByNs.has(key)) return;
|
|
60
|
+
const lc = (isRecord(data) && isRecord(data.metadata) ? data.metadata : void 0)?.lc_agent_name;
|
|
61
|
+
lcByNs.set(key, typeof lc === "string" ? lc : void 0);
|
|
62
|
+
}
|
|
63
|
+
function recordPendingToolCalls(data) {
|
|
64
|
+
if (!isRecord(data)) return;
|
|
65
|
+
const taskId = data.id;
|
|
66
|
+
if (typeof taskId !== "string") return;
|
|
67
|
+
const input = data.input;
|
|
68
|
+
let toolCallId;
|
|
69
|
+
if (isRecord(input) && isRecord(input.tool_call)) {
|
|
70
|
+
const candidate = input.tool_call.id;
|
|
71
|
+
if (typeof candidate === "string") toolCallId = candidate;
|
|
72
|
+
} else if (Array.isArray(input)) {
|
|
73
|
+
for (const toolCall of input) if (isRecord(toolCall) && typeof toolCall.id === "string") {
|
|
74
|
+
toolCallId = toolCall.id;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (toolCallId != null) pendingToolCalls.set(taskId, toolCallId);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Derive the `toolCall` cause for a named-subagent namespace.
|
|
82
|
+
*
|
|
83
|
+
* Primary signal: the tool whose `tool-started` event fired at the
|
|
84
|
+
* subagent's own namespace (the tools node it roots under). Fallback: the
|
|
85
|
+
* namespace segment's task id (`node:<task_id>`) joined to a tool call
|
|
86
|
+
* harvested from a `tool_call_with_context`-shaped task input, so the
|
|
87
|
+
* derivation stays correct if that shape reaches the stream in the future.
|
|
88
|
+
*/
|
|
89
|
+
function deriveCause(ns) {
|
|
90
|
+
const active = activeToolCallByNs.get(nsKey(ns));
|
|
91
|
+
if (typeof active === "string" && active.length > 0) return {
|
|
92
|
+
type: "toolCall",
|
|
93
|
+
tool_call_id: active
|
|
94
|
+
};
|
|
95
|
+
const segment = ns[ns.length - 1];
|
|
96
|
+
const colon = segment.indexOf(":");
|
|
97
|
+
if (colon === -1) return void 0;
|
|
98
|
+
const triggerCallId = segment.slice(colon + 1);
|
|
99
|
+
if (triggerCallId.length === 0) return void 0;
|
|
100
|
+
const toolCallId = pendingToolCalls.get(triggerCallId);
|
|
101
|
+
if (typeof toolCallId !== "string" || toolCallId.length === 0) return;
|
|
102
|
+
return {
|
|
103
|
+
type: "toolCall",
|
|
104
|
+
tool_call_id: toolCallId
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function maybeStartSubagent(ns) {
|
|
108
|
+
if (ns.length !== depth + 1 || !hasPrefix(ns, scope)) return;
|
|
109
|
+
const key = nsKey(ns);
|
|
110
|
+
if (handles.has(key)) return;
|
|
111
|
+
const lc = lcByNs.get(key);
|
|
112
|
+
if (typeof lc !== "string" || lc.length === 0) return;
|
|
113
|
+
const messages = (0, _langchain_langgraph.createMessagesTransformer)(ns);
|
|
114
|
+
const messagesProjection = messages.init();
|
|
115
|
+
const toolCall = require_tool_call.createToolCallTransformer(ns)();
|
|
116
|
+
const toolCallProjection = toolCall.init();
|
|
117
|
+
const nested = createSubagentTransformer(ns)();
|
|
118
|
+
const nestedProjection = nested.init();
|
|
119
|
+
let resolveOutput;
|
|
120
|
+
let rejectOutput;
|
|
121
|
+
const output = new Promise((resolve, reject) => {
|
|
122
|
+
resolveOutput = resolve;
|
|
123
|
+
rejectOutput = reject;
|
|
124
|
+
});
|
|
125
|
+
handles.set(key, {
|
|
126
|
+
key,
|
|
127
|
+
path: ns,
|
|
128
|
+
name: lc,
|
|
129
|
+
messages,
|
|
130
|
+
toolCall,
|
|
131
|
+
nested,
|
|
132
|
+
resolveOutput,
|
|
133
|
+
rejectOutput,
|
|
134
|
+
latestValues: void 0,
|
|
135
|
+
done: false
|
|
136
|
+
});
|
|
137
|
+
subagentsLog.push({
|
|
138
|
+
name: lc,
|
|
139
|
+
cause: deriveCause(ns),
|
|
140
|
+
output,
|
|
141
|
+
messages: messagesProjection.messages,
|
|
142
|
+
toolCalls: toolCallProjection.toolCalls,
|
|
143
|
+
subagents: nestedProjection.subagents
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function finishHandle(handle, outcome) {
|
|
147
|
+
if (handle.done) return;
|
|
148
|
+
handle.done = true;
|
|
149
|
+
if (outcome.type === "resolve") handle.resolveOutput(handle.latestValues);
|
|
150
|
+
else handle.rejectOutput(outcome.error);
|
|
151
|
+
handle.messages.finalize?.();
|
|
152
|
+
handle.toolCall.finalize?.();
|
|
153
|
+
handle.nested.finalize?.();
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
__native: true,
|
|
157
|
+
init: () => ({ subagents: subagentsLog }),
|
|
158
|
+
process(event) {
|
|
159
|
+
const ns = event.params.namespace;
|
|
160
|
+
const data = event.params.data;
|
|
161
|
+
const isTaskResult = event.method === "tasks" && isRecord(data) && "result" in data;
|
|
162
|
+
if (event.method === "tools" && isRecord(data) && data.event === "tool-started" && typeof data.tool_call_id === "string" && data.tool_call_id.length > 0) activeToolCallByNs.set(nsKey(ns), data.tool_call_id);
|
|
163
|
+
if (event.method === "tasks" && !isTaskResult) {
|
|
164
|
+
recordIdentity(ns, data);
|
|
165
|
+
recordPendingToolCalls(data);
|
|
166
|
+
maybeStartSubagent(ns);
|
|
167
|
+
}
|
|
168
|
+
for (const handle of handles.values()) {
|
|
169
|
+
if (handle.done) continue;
|
|
170
|
+
if (!hasPrefix(ns, handle.path)) continue;
|
|
171
|
+
handle.messages.process(event);
|
|
172
|
+
handle.toolCall.process(event);
|
|
173
|
+
handle.nested.process(event);
|
|
174
|
+
if (nsKey(ns) === handle.key) {
|
|
175
|
+
if (event.method === "values" && isRecord(data)) handle.latestValues = data;
|
|
176
|
+
else if (event.method === "lifecycle" && isRecord(data)) {
|
|
177
|
+
const status = data.event;
|
|
178
|
+
if (status === "completed" || status === "interrupted") finishHandle(handle, { type: "resolve" });
|
|
179
|
+
else if (status === "failed") finishHandle(handle, {
|
|
180
|
+
type: "reject",
|
|
181
|
+
error: /* @__PURE__ */ new Error(`Subagent ${handle.name} failed`)
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return true;
|
|
187
|
+
},
|
|
188
|
+
finalize() {
|
|
189
|
+
for (const handle of handles.values()) finishHandle(handle, { type: "resolve" });
|
|
190
|
+
subagentsLog.close();
|
|
191
|
+
},
|
|
192
|
+
fail(err) {
|
|
193
|
+
for (const handle of handles.values()) finishHandle(handle, {
|
|
194
|
+
type: "reject",
|
|
195
|
+
error: err
|
|
196
|
+
});
|
|
197
|
+
subagentsLog.fail(err);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
//#endregion
|
|
203
|
+
exports.createSubagentTransformer = createSubagentTransformer;
|
|
204
|
+
|
|
205
|
+
//# sourceMappingURL=subagent.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.cjs","names":["StreamChannel","createToolCallTransformer"],"sources":["../../../src/agents/transformers/subagent.ts"],"sourcesContent":["import {\n StreamChannel,\n createMessagesTransformer,\n type NativeStreamTransformer,\n type ProtocolEvent,\n type Namespace,\n type LifecycleCause,\n} from \"@langchain/langgraph\";\n\nimport { createToolCallTransformer } from \"./tool-call.js\";\nimport type { SubagentRunStream } from \"./types.js\";\n\ninterface SubagentProjection {\n subagents: AsyncIterable<SubagentRunStream>;\n}\n\n/** Per-subagent transformer instances, driven manually by the parent. */\ntype MessagesTransformer = ReturnType<typeof createMessagesTransformer>;\ntype ToolCallTransformer = ReturnType<\n ReturnType<typeof createToolCallTransformer>\n>;\ntype NestedSubagentTransformer = ReturnType<\n ReturnType<typeof createSubagentTransformer>\n>;\n\ninterface SubagentHandle {\n readonly key: string;\n readonly path: Namespace;\n readonly name: string;\n readonly messages: MessagesTransformer;\n readonly toolCall: ToolCallTransformer;\n readonly nested: NestedSubagentTransformer;\n readonly resolveOutput: (value: unknown) => void;\n readonly rejectOutput: (error: unknown) => void;\n latestValues: Record<string, unknown> | undefined;\n done: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Stable string key for a namespace. */\nfunction nsKey(ns: Namespace): string {\n return ns.join(\"\\u0000\");\n}\n\n/** Tests whether `ns` starts with every segment in `prefix`. */\nfunction hasPrefix(ns: Namespace, prefix: Namespace): boolean {\n if (prefix.length > ns.length) return false;\n for (let i = 0; i < prefix.length; i += 1) {\n if (ns[i] !== prefix[i]) return false;\n }\n return true;\n}\n\n/**\n * Creates a native transformer that surfaces nested named agents on\n * `run.subagents`.\n *\n * It watches `tasks` events to record each namespace's `lc_agent_name` (set by\n * `createAgent({ name })`) and the triggering tool call, then — for any nested\n * run one level below {@link scope} that carries an `lc_agent_name` — emits a\n * typed {@link SubagentRunStream} handle.\n *\n * Each handle is backed by its own per-subagent transformer instances\n * ({@link createMessagesTransformer}, {@link createToolCallTransformer}, and a\n * nested {@link createSubagentTransformer}) scoped to the subagent's namespace.\n * Every event in the subtree is fed straight into those transformers, which\n * self-filter by namespace; the subagent's final `output` is resolved from its\n * last `values` snapshot when its `lifecycle` completes.\n *\n * Marked `__native: true` — the `subagents` projection lands directly on the\n * `GraphRunStream` instance as `run.subagents`.\n *\n * @param scope - Namespace prefix this transformer is scoped to. The root agent\n * uses `[]`; nested handles use their subagent's namespace, so grandchild\n * subagents are discovered recursively.\n */\nexport function createSubagentTransformer(\n scope: Namespace = []\n): () => NativeStreamTransformer<SubagentProjection> {\n return () => {\n const subagentsLog = StreamChannel.local<SubagentRunStream>();\n /** `lc_agent_name` observed per namespace (first task event wins). */\n const lcByNs = new Map<string, string | undefined>();\n /** Triggering task id -> originating LLM `tool_call_id`. */\n const pendingToolCalls = new Map<string, string>();\n /**\n * Namespace key -> the `tool_call_id` of the most recent tool to start\n * executing there. A tool that invokes a subagent emits its `tool-started`\n * at the tools-node namespace (`tools:<task_id>`) where the subagent then\n * roots, so this is the tool call that caused the subagent.\n */\n const activeToolCallByNs = new Map<string, string>();\n const handles = new Map<string, SubagentHandle>();\n const depth = scope.length;\n\n function recordIdentity(ns: Namespace, data: unknown): void {\n const key = nsKey(ns);\n if (lcByNs.has(key)) return;\n const metadata =\n isRecord(data) && isRecord(data.metadata) ? data.metadata : undefined;\n const lc = metadata?.lc_agent_name;\n lcByNs.set(key, typeof lc === \"string\" ? lc : undefined);\n }\n\n function recordPendingToolCalls(data: unknown): void {\n if (!isRecord(data)) return;\n const taskId = data.id;\n if (typeof taskId !== \"string\") return;\n const input = data.input;\n let toolCallId: string | undefined;\n if (isRecord(input) && isRecord(input.tool_call)) {\n const candidate = input.tool_call.id;\n if (typeof candidate === \"string\") toolCallId = candidate;\n } else if (Array.isArray(input)) {\n for (const toolCall of input) {\n if (isRecord(toolCall) && typeof toolCall.id === \"string\") {\n toolCallId = toolCall.id;\n break;\n }\n }\n }\n if (toolCallId != null) pendingToolCalls.set(taskId, toolCallId);\n }\n\n /**\n * Derive the `toolCall` cause for a named-subagent namespace.\n *\n * Primary signal: the tool whose `tool-started` event fired at the\n * subagent's own namespace (the tools node it roots under). Fallback: the\n * namespace segment's task id (`node:<task_id>`) joined to a tool call\n * harvested from a `tool_call_with_context`-shaped task input, so the\n * derivation stays correct if that shape reaches the stream in the future.\n */\n function deriveCause(ns: Namespace): LifecycleCause | undefined {\n const active = activeToolCallByNs.get(nsKey(ns));\n if (typeof active === \"string\" && active.length > 0) {\n return { type: \"toolCall\", tool_call_id: active } as LifecycleCause;\n }\n const segment = ns[ns.length - 1];\n const colon = segment.indexOf(\":\");\n if (colon === -1) return undefined;\n const triggerCallId = segment.slice(colon + 1);\n if (triggerCallId.length === 0) return undefined;\n const toolCallId = pendingToolCalls.get(triggerCallId);\n if (typeof toolCallId !== \"string\" || toolCallId.length === 0) {\n return undefined;\n }\n return { type: \"toolCall\", tool_call_id: toolCallId } as LifecycleCause;\n }\n\n function maybeStartSubagent(ns: Namespace): void {\n if (ns.length !== depth + 1 || !hasPrefix(ns, scope)) return;\n const key = nsKey(ns);\n if (handles.has(key)) return;\n const lc = lcByNs.get(key);\n // Only surface nested runs carrying an `lc_agent_name`; plain subgraphs\n // (no name) are excluded so `run.subagents` stays agent-only.\n if (typeof lc !== \"string\" || lc.length === 0) return;\n\n // Per-subagent transformers, each scoped to the subagent's namespace so\n // they pick out only the subagent's own model node / tools / nested\n // agents when fed the full event stream.\n const messages = createMessagesTransformer(ns);\n const messagesProjection = messages.init();\n const toolCall = createToolCallTransformer(ns)();\n const toolCallProjection = toolCall.init();\n const nested = createSubagentTransformer(ns)();\n const nestedProjection = nested.init();\n\n let resolveOutput!: (value: unknown) => void;\n let rejectOutput!: (error: unknown) => void;\n const output = new Promise<Record<string, unknown>>((resolve, reject) => {\n resolveOutput = resolve as (value: unknown) => void;\n rejectOutput = reject;\n });\n\n handles.set(key, {\n key,\n path: ns,\n name: lc,\n messages,\n toolCall,\n nested,\n resolveOutput,\n rejectOutput,\n latestValues: undefined,\n done: false,\n });\n\n subagentsLog.push({\n name: lc,\n cause: deriveCause(ns),\n output,\n messages: messagesProjection.messages,\n toolCalls: toolCallProjection.toolCalls,\n subagents: nestedProjection.subagents,\n });\n }\n\n function finishHandle(\n handle: SubagentHandle,\n outcome: { type: \"resolve\" } | { type: \"reject\"; error: unknown }\n ): void {\n if (handle.done) return;\n handle.done = true;\n if (outcome.type === \"resolve\") {\n handle.resolveOutput(handle.latestValues);\n } else {\n handle.rejectOutput(outcome.error);\n }\n handle.messages.finalize?.();\n handle.toolCall.finalize?.();\n handle.nested.finalize?.();\n }\n\n return {\n __native: true as const,\n\n init: () => ({ subagents: subagentsLog }),\n\n process(event: ProtocolEvent): boolean {\n const ns = event.params.namespace;\n const data = event.params.data;\n const isTaskResult =\n event.method === \"tasks\" && isRecord(data) && \"result\" in data;\n\n // Track the tool currently executing at each namespace. A subagent's\n // dispatching tool starts at the same namespace the subagent roots\n // under, so this records the cause before the subagent is discovered.\n if (\n event.method === \"tools\" &&\n isRecord(data) &&\n data.event === \"tool-started\" &&\n typeof data.tool_call_id === \"string\" &&\n data.tool_call_id.length > 0\n ) {\n activeToolCallByNs.set(nsKey(ns), data.tool_call_id);\n }\n\n // A task start: record identity / tool call, then discover a subagent\n // boundary *before* fanning out so the new handle receives its own\n // subtree events (which Pregel emits after the parent-namespace task).\n if (event.method === \"tasks\" && !isTaskResult) {\n recordIdentity(ns, data);\n recordPendingToolCalls(data);\n maybeStartSubagent(ns);\n }\n\n // Fan the event out to every active subagent whose subtree contains it.\n // The per-subagent transformers self-filter by namespace depth.\n for (const handle of handles.values()) {\n if (handle.done) continue;\n if (!hasPrefix(ns, handle.path)) continue;\n\n handle.messages.process(event);\n handle.toolCall.process(event);\n handle.nested.process(event);\n\n // Track the subagent's own (root-level) state and resolve its\n // `output` from the last snapshot when its lifecycle completes.\n if (nsKey(ns) === handle.key) {\n if (event.method === \"values\" && isRecord(data)) {\n handle.latestValues = data;\n } else if (event.method === \"lifecycle\" && isRecord(data)) {\n const status = data.event;\n if (status === \"completed\" || status === \"interrupted\") {\n finishHandle(handle, { type: \"resolve\" });\n } else if (status === \"failed\") {\n finishHandle(handle, {\n type: \"reject\",\n error: new Error(`Subagent ${handle.name} failed`),\n });\n }\n }\n }\n }\n\n return true;\n },\n\n finalize(): void {\n for (const handle of handles.values()) {\n finishHandle(handle, { type: \"resolve\" });\n }\n subagentsLog.close();\n },\n\n fail(err: unknown): void {\n for (const handle of handles.values()) {\n finishHandle(handle, { type: \"reject\", error: err });\n }\n subagentsLog.fail(err);\n },\n };\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SubagentRunStream } from "./types.cjs";
|
|
2
|
+
import { Namespace, NativeStreamTransformer } from "@langchain/langgraph";
|
|
3
|
+
|
|
4
|
+
//#region src/agents/transformers/subagent.d.ts
|
|
5
|
+
interface SubagentProjection {
|
|
6
|
+
subagents: AsyncIterable<SubagentRunStream>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Creates a native transformer that surfaces nested named agents on
|
|
10
|
+
* `run.subagents`.
|
|
11
|
+
*
|
|
12
|
+
* It watches `tasks` events to record each namespace's `lc_agent_name` (set by
|
|
13
|
+
* `createAgent({ name })`) and the triggering tool call, then — for any nested
|
|
14
|
+
* run one level below {@link scope} that carries an `lc_agent_name` — emits a
|
|
15
|
+
* typed {@link SubagentRunStream} handle.
|
|
16
|
+
*
|
|
17
|
+
* Each handle is backed by its own per-subagent transformer instances
|
|
18
|
+
* ({@link createMessagesTransformer}, {@link createToolCallTransformer}, and a
|
|
19
|
+
* nested {@link createSubagentTransformer}) scoped to the subagent's namespace.
|
|
20
|
+
* Every event in the subtree is fed straight into those transformers, which
|
|
21
|
+
* self-filter by namespace; the subagent's final `output` is resolved from its
|
|
22
|
+
* last `values` snapshot when its `lifecycle` completes.
|
|
23
|
+
*
|
|
24
|
+
* Marked `__native: true` — the `subagents` projection lands directly on the
|
|
25
|
+
* `GraphRunStream` instance as `run.subagents`.
|
|
26
|
+
*
|
|
27
|
+
* @param scope - Namespace prefix this transformer is scoped to. The root agent
|
|
28
|
+
* uses `[]`; nested handles use their subagent's namespace, so grandchild
|
|
29
|
+
* subagents are discovered recursively.
|
|
30
|
+
*/
|
|
31
|
+
declare function createSubagentTransformer(scope?: Namespace): () => NativeStreamTransformer<SubagentProjection>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { createSubagentTransformer };
|
|
34
|
+
//# sourceMappingURL=subagent.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.d.cts","names":[],"sources":["../../../src/agents/transformers/subagent.ts"],"mappings":";;;;UAYU,kBAAA;EACR,SAAA,EAAW,aAAA,CAAc,iBAAA;AAAA;;;;;;;;;AAkE3B;;;;;;;;;;;;;;;iBAAgB,yBAAA,CACd,KAAA,GAAO,SAAA,SACA,uBAAA,CAAwB,kBAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SubagentRunStream } from "./types.js";
|
|
2
|
+
import { Namespace, NativeStreamTransformer } from "@langchain/langgraph";
|
|
3
|
+
|
|
4
|
+
//#region src/agents/transformers/subagent.d.ts
|
|
5
|
+
interface SubagentProjection {
|
|
6
|
+
subagents: AsyncIterable<SubagentRunStream>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Creates a native transformer that surfaces nested named agents on
|
|
10
|
+
* `run.subagents`.
|
|
11
|
+
*
|
|
12
|
+
* It watches `tasks` events to record each namespace's `lc_agent_name` (set by
|
|
13
|
+
* `createAgent({ name })`) and the triggering tool call, then — for any nested
|
|
14
|
+
* run one level below {@link scope} that carries an `lc_agent_name` — emits a
|
|
15
|
+
* typed {@link SubagentRunStream} handle.
|
|
16
|
+
*
|
|
17
|
+
* Each handle is backed by its own per-subagent transformer instances
|
|
18
|
+
* ({@link createMessagesTransformer}, {@link createToolCallTransformer}, and a
|
|
19
|
+
* nested {@link createSubagentTransformer}) scoped to the subagent's namespace.
|
|
20
|
+
* Every event in the subtree is fed straight into those transformers, which
|
|
21
|
+
* self-filter by namespace; the subagent's final `output` is resolved from its
|
|
22
|
+
* last `values` snapshot when its `lifecycle` completes.
|
|
23
|
+
*
|
|
24
|
+
* Marked `__native: true` — the `subagents` projection lands directly on the
|
|
25
|
+
* `GraphRunStream` instance as `run.subagents`.
|
|
26
|
+
*
|
|
27
|
+
* @param scope - Namespace prefix this transformer is scoped to. The root agent
|
|
28
|
+
* uses `[]`; nested handles use their subagent's namespace, so grandchild
|
|
29
|
+
* subagents are discovered recursively.
|
|
30
|
+
*/
|
|
31
|
+
declare function createSubagentTransformer(scope?: Namespace): () => NativeStreamTransformer<SubagentProjection>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { createSubagentTransformer };
|
|
34
|
+
//# sourceMappingURL=subagent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.d.ts","names":[],"sources":["../../../src/agents/transformers/subagent.ts"],"mappings":";;;;UAYU,kBAAA;EACR,SAAA,EAAW,aAAA,CAAc,iBAAA;AAAA;;;;;;;;;AAkE3B;;;;;;;;;;;;;;;iBAAgB,yBAAA,CACd,KAAA,GAAO,SAAA,SACA,uBAAA,CAAwB,kBAAA"}
|