@dvina/agents 0.3.7 → 0.5.0
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/chunk-NHWEEBN2.mjs +159 -0
- package/dist/chunk-NHWEEBN2.mjs.map +1 -0
- package/dist/eval/index.d.mts +117 -0
- package/dist/eval/index.d.ts +117 -0
- package/dist/eval/index.js +643 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/index.mjs +483 -0
- package/dist/eval/index.mjs.map +1 -0
- package/dist/index.d.mts +4 -138
- package/dist/index.d.ts +4 -138
- package/dist/index.js +74 -42
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -125
- package/dist/index.mjs.map +1 -1
- package/dist/model-resolver-U0J9x1a6.d.mts +158 -0
- package/dist/model-resolver-U0J9x1a6.d.ts +158 -0
- package/package.json +33 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/eval/config.ts","../../src/eval/suite.ts","../../src/eval/target.ts","../../src/eval/expectations.ts","../../src/eval/evaluators/language.ts","../../src/eval/evaluators/response-content.ts","../../src/eval/evaluators/no-tool-calls.ts"],"sourcesContent":["import type { Agent, ToolDefinition } from '../core/agent.interface';\nimport type { LangchainModelConfig } from '../runtime/langchain/model-resolver';\n\n/** Factory that creates a fresh Agent per test case. Receives extra suite-level tools as ToolDefinition[]. */\nexport type CreateTargetFn = (extraTools: ToolDefinition[]) => Agent | Promise<Agent>;\n\nexport interface EvalConfig {\n\t/** Required for model-based target and LLM evaluators (respondsInLanguage, llmJudge). */\n\tmodelConfig: LangchainModelConfig;\n\t/** Required for model-based target. Also used as fallback for evaluatorModel. */\n\tmodel?: string;\n\t/** Model for evaluators needing LLM calls (language detection, LLM-as-judge). */\n\tevaluatorModel: string;\n\t/** System prompt for model-based target. Ignored when createTarget is used. Can be overridden per-suite or per-case. */\n\tsystemPrompt?: string;\n\t/** Factory that creates a fresh Agent per test case. When set, this is the default target. */\n\tcreateTarget?: CreateTargetFn;\n}\n\nlet _config: EvalConfig | null = null;\n\nexport function configureEvals(config: EvalConfig): void {\n\t_config = config;\n}\n\nexport function getEvalConfig(): EvalConfig {\n\tif (!_config) {\n\t\tthrow new Error('Evals not configured. Call configureEvals() in your vitest setupFiles.');\n\t}\n\treturn _config;\n}\n\n","import * as ls from 'langsmith/vitest';\nimport { BaseMessage } from '@langchain/core/messages';\nimport { createEvalTarget, runAgentTarget, type MockToolDef } from './target';\nimport { type Expectation } from './expectations';\nimport { getEvalConfig, type CreateTargetFn } from './config';\nimport {\n\ttype Message,\n\ttype HumanMessage,\n\ttype AiMessage,\n\ttype ToolMessage,\n\ttype ToolSpec,\n} from '../core/agent.interface';\n\n// ── Message builders ─────────────────────────────────────────────────\n\nexport function human(content: string): HumanMessage {\n\treturn { role: 'human', content: [{ type: 'text', text: content }] };\n}\n\nexport function ai(content: string, toolCalls?: string[]): AiMessage {\n\treturn { role: 'ai', content, ...(toolCalls ? { toolCalls: toolCalls.map((name) => ({ name })) } : {}) };\n}\n\nexport function toolResult(name: string, output: string): ToolMessage {\n\treturn { role: 'tool', name, output };\n}\n\nexport interface ToolDef {\n\tdescription: string;\n\t/** A plain key→description record, or a ZodObject passed through from a ToolSpec. */\n\tschema?: Record<string, string> | import('zod').ZodObject<any>;\n\t/** Auto-stringified if not a string or function. */\n\tresponse: unknown | ((input: Record<string, unknown>, callCount: number) => string);\n}\n\nexport interface TestCase {\n\t/** Test name. Defaults to the last human message content if omitted. */\n\tname?: string;\n\tmessages: Message[];\n\tsystemPrompt?: string;\n\t/** Override suite-level tools for this case. */\n\ttools?: Record<string, ToolDef>;\n\texpect: Expectation[];\n}\n\ntype TargetFn = (inputs: { systemPrompt?: string; messages: Message[]; tools: MockToolDef[] }) => Promise<{ messages: BaseMessage[] }>;\n\nexport interface SuiteConfig {\n\t/** Custom target function, or model string override. Auto-created from global config if omitted. */\n\ttarget?: TargetFn | string;\n\t/** Factory that creates a fresh Agent per test case. Overrides global createTarget. */\n\tcreateTarget?: CreateTargetFn;\n\t/** System prompt for all cases in this suite. Overrides the global prompt; can be overridden per-case. */\n\tsystemPrompt?: string;\n\ttools?: Record<string, ToolDef>;\n\tcases: TestCase[];\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\n/**\n * Converts a `ToolSpec[]` (from a real tool provider) into the\n * `Record<string, ToolDef>` that `defineSuite` expects.\n *\n * `responses` maps tool names to canned mock responses. Tools without an\n * entry in `responses` default to `''`.\n */\nexport function fromToolSpecs(\n\tspecs: ToolSpec[],\n\tresponses: Record<string, ToolDef['response']> = {},\n): Record<string, ToolDef> {\n\treturn Object.fromEntries(\n\t\tspecs.map((spec) => [\n\t\t\tspec.name,\n\t\t\t{\n\t\t\t\tdescription: spec.description,\n\t\t\t\tschema: spec.inputSchema,\n\t\t\t\tresponse: responses[spec.name] ?? '',\n\t\t\t} satisfies ToolDef,\n\t\t]),\n\t);\n}\n\nfunction toMockTools(defs: Record<string, ToolDef>): MockToolDef[] {\n\treturn Object.entries(defs).map(([name, def]) => ({\n\t\tname,\n\t\tdescription: def.description,\n\t\tschema: def.schema ?? {},\n\t\tresponse:\n\t\t\ttypeof def.response === 'function'\n\t\t\t\t? (def.response as MockToolDef['response'])\n\t\t\t\t: typeof def.response === 'string'\n\t\t\t\t\t? def.response\n\t\t\t\t\t: JSON.stringify(def.response),\n\t}));\n}\n\n/** Strip function responses and ZodObjects so the object is JSON-serialisable for langsmith hashing. */\nfunction toSerializableTools(tools: MockToolDef[]): Record<string, unknown>[] {\n\treturn tools.map((t) => ({\n\t\t...t,\n\t\tschema: t.schema instanceof Object && 'shape' in t.schema ? '<ZodObject>' : t.schema,\n\t\tresponse: typeof t.response === 'function' ? '<function>' : t.response,\n\t}));\n}\n\nfunction lastHumanContent(messages: Message[]): string {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role === 'human') {\n\t\t\tconst textBlock = msg.content.find((c) => c.type === 'text');\n\t\t\treturn textBlock ? textBlock.text : '';\n\t\t}\n\t}\n\treturn '';\n}\n\n// ── Main entry point ─────────────────────────────────────────────────\n\n/**\n * Defines an eval suite. Internally registers `ls.describe` / `ls.test`\n * so vitest discovers the tests — eval files only need to call this function.\n */\nfunction resolveModelTarget(config: SuiteConfig): TargetFn {\n\tif (typeof config.target === 'function') return config.target;\n\tconst evalConfig = getEvalConfig();\n\tif (!evalConfig.model && typeof config.target !== 'string') {\n\t\tthrow new Error('model is required for model-based target. Add it to your configureEvals() call.');\n\t}\n\tconst model = typeof config.target === 'string' ? config.target : evalConfig.model!;\n\treturn createEvalTarget(evalConfig.modelConfig, model);\n}\n\nfunction resolveCreateTarget(config: SuiteConfig): CreateTargetFn | undefined {\n\treturn config.createTarget ?? getEvalConfig().createTarget;\n}\n\nexport function defineSuite(name: string, config: SuiteConfig): void {\n\tconst suiteTools = config.tools ?? {};\n\tconst createTarget = config.target ? undefined : resolveCreateTarget(config);\n\n\tls.describe(name, () => {\n\t\tfor (const tc of config.cases) {\n\t\t\tconst testName = tc.name ?? lastHumanContent(tc.messages);\n\t\t\tconst caseToolDefs = tc.tools ?? suiteTools;\n\t\t\tconst tools = toMockTools(caseToolDefs);\n\t\t\tconst ctx = { message: lastHumanContent(tc.messages) };\n\n\t\t\tconst resolved = tc.expect.map((exp) => exp(ctx));\n\t\t\tconst evaluators = resolved.map((r) => r.evaluator);\n\t\t\tconst referenceOutputs = Object.assign({}, ...resolved.map((r) => r.referenceOutputs));\n\n\t\t\tls.test(\n\t\t\t\ttestName,\n\t\t\t\t{\n\t\t\t\t\tinputs: {\n\t\t\t\t\t\tmessages: tc.messages,\n\t\t\t\t\t\ttools: toSerializableTools(tools),\n\t\t\t\t\t},\n\t\t\t\t\treferenceOutputs,\n\t\t\t\t},\n\t\t\t\tasync ({ referenceOutputs: refOut }) => {\n\t\t\t\t\tlet output: { messages: BaseMessage[] };\n\n\t\t\t\t\tif (createTarget) {\n\t\t\t\t\t\t// Agent mode: create a fresh agent per test, run it, convert result\n\t\t\t\t\t\toutput = await runAgentTarget(createTarget, tc.messages, caseToolDefs);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Model mode: use model-based target with mock tools\n\t\t\t\t\t\tconst target = resolveModelTarget(config);\n\t\t\t\t\t\tconst globalPrompt = getEvalConfig().systemPrompt;\n\t\t\t\t\t\tconst systemPrompt = tc.systemPrompt ?? config.systemPrompt ?? globalPrompt;\n\t\t\t\t\t\toutput = await target({\n\t\t\t\t\t\t\tmessages: tc.messages,\n\t\t\t\t\t\t\ttools,\n\t\t\t\t\t\t\t...(systemPrompt ? { systemPrompt } : {}),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tls.logOutputs(output);\n\t\t\t\t\tfor (const evaluator of evaluators) {\n\t\t\t\t\t\tawait evaluator({ outputs: output, referenceOutputs: refOut ?? {} });\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t});\n}\n","import { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { tool } from '@langchain/core/tools';\nimport { AIMessage, BaseMessage, SystemMessage, ToolMessage } from '@langchain/core/messages';\nimport { z } from 'zod';\nimport { LangchainModelResolver, type LangchainModelConfig } from '../runtime/langchain/model-resolver';\nimport { type CreateTargetFn, getEvalConfig } from './config';\nimport type { AgentResult, Message as AgentMessage, ToolCallContentBlock, ToolDefinition } from '../core/agent.interface';\nimport { convertToLangchainMessages } from '../runtime/langchain/utils';\nimport type { ToolDef } from './suite';\n\nexport interface MockToolDef {\n\tname: string;\n\tdescription: string;\n\tschema: z.ZodObject<any> | Record<string, unknown>;\n\t/**\n\t * Canned response the mock tool returns.\n\t * Can be a static string, or a function that receives input and returns a response.\n\t * If a function is provided, it receives the full invocation count as a second arg\n\t * to support scenarios like \"first call fails, second call succeeds\".\n\t */\n\tresponse: string | ((input: Record<string, unknown>, callCount: number) => string);\n}\n\nexport interface EvalTargetInput {\n\tsystemPrompt?: string;\n\tmessages: AgentMessage[];\n\ttools: MockToolDef[];\n}\n\nconst MAX_AGENT_LOOPS = 10;\n\n/**\n * Creates a LangSmith-compatible target function that runs an agentic loop\n * with mock tools and returns the full message trajectory.\n */\nexport function createEvalTarget(modelConfig?: LangchainModelConfig, modelString?: string) {\n\treturn async (inputs: EvalTargetInput): Promise<{ messages: BaseMessage[] }> => {\n\t\tconst config = modelConfig && modelString ? { modelConfig, model: modelString } : getEvalConfig();\n\t\tif (!config.model) {\n\t\t\tthrow new Error('model is required for model-based target. Add it to your configureEvals() call.');\n\t\t}\n\t\tconst resolver = new LangchainModelResolver(config.modelConfig);\n\t\tconst model = resolver.resolve(config.model) as BaseChatModel;\n\n\t\t// Track invocation counts per tool for stateful mock responses\n\t\tconst toolCallCounts: Record<string, number> = {};\n\n\t\t// Create langchain tools from mock definitions\n\t\tconst langchainTools = inputs.tools.map((mockTool) => {\n\t\t\ttoolCallCounts[mockTool.name] = 0;\n\n\t\t\treturn tool(\n\t\t\t\tasync (toolInput: Record<string, unknown>) => {\n\t\t\t\t\ttoolCallCounts[mockTool.name]++;\n\t\t\t\t\tif (typeof mockTool.response === 'function') {\n\t\t\t\t\t\treturn mockTool.response(toolInput, toolCallCounts[mockTool.name]);\n\t\t\t\t\t}\n\t\t\t\t\treturn mockTool.response;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: mockTool.name,\n\t\t\t\t\tdescription: mockTool.description,\n\t\t\t\t\tschema:\n\t\t\t\t\t\tmockTool.schema instanceof z.ZodObject\n\t\t\t\t\t\t\t? mockTool.schema\n\t\t\t\t\t\t\t: z.object(\n\t\t\t\t\t\t\t\t\tObject.fromEntries(\n\t\t\t\t\t\t\t\t\t\tObject.entries(mockTool.schema).map(([key, val]) => {\n\t\t\t\t\t\t\t\t\t\t\tif (typeof val === 'string') return [key, z.string().describe(val)];\n\t\t\t\t\t\t\t\t\t\t\tif (typeof val === 'number') return [key, z.number().describe(String(val))];\n\t\t\t\t\t\t\t\t\t\t\treturn [key, z.any()];\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\tconst boundModel = langchainTools.length > 0 ? model.bindTools!(langchainTools) : model;\n\n\t\tconst messages: BaseMessage[] = [];\n\n\t\tif (inputs.systemPrompt) {\n\t\t\tmessages.push(new SystemMessage(inputs.systemPrompt));\n\t\t}\n\n\t\t// Convert and push all messages (history + final human)\n\t\tmessages.push(...convertToLangchainMessages(inputs.messages));\n\n\t\t// Agentic loop: keep calling model until it stops making tool calls\n\t\tlet loopCount = 0;\n\t\twhile (loopCount < MAX_AGENT_LOOPS) {\n\t\t\tloopCount++;\n\n\t\t\tconst response = await boundModel.invoke(messages);\n\t\t\tmessages.push(response as BaseMessage);\n\n\t\t\tconst aiMessage = response as AIMessage;\n\t\t\tif (!aiMessage.tool_calls || aiMessage.tool_calls.length === 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Execute tool calls and add results\n\t\t\tfor (const tc of aiMessage.tool_calls) {\n\t\t\t\tconst mockTool = langchainTools.find((t) => t.name === tc.name);\n\t\t\t\tif (mockTool) {\n\t\t\t\t\tconst result = await mockTool.invoke(tc.args);\n\t\t\t\t\tmessages.push(\n\t\t\t\t\t\tnew ToolMessage({\n\t\t\t\t\t\t\tcontent: typeof result === 'string' ? result : JSON.stringify(result),\n\t\t\t\t\t\t\ttool_call_id: tc.id!,\n\t\t\t\t\t\t\tname: tc.name,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tmessages.push(\n\t\t\t\t\t\tnew ToolMessage({\n\t\t\t\t\t\t\tcontent: `Tool \"${tc.name}\" not found`,\n\t\t\t\t\t\t\ttool_call_id: tc.id!,\n\t\t\t\t\t\t\tname: tc.name,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { messages };\n\t};\n}\n\n// ── Agent-based target ──────────────────────────────────────────────\n\n/**\n * Converts an `AgentResult` (from `Agent.run()`) into LangChain `BaseMessage[]`\n * so existing evaluators (trajectory match, no-tool-calls, response-content, language) work unchanged.\n *\n * Consecutive `tool_call` content blocks are grouped into a single `AIMessage` with `tool_calls`,\n * followed by one `ToolMessage` per call.\n */\nexport function agentResultToMessages(inputMessages: AgentMessage[], result: AgentResult): BaseMessage[] {\n\t// Include input messages for trajectory context\n\tconst messages: BaseMessage[] = convertToLangchainMessages(inputMessages);\n\n\t// Group content blocks into BaseMessages\n\tlet pendingToolCalls: { id: string; name: string; args: Record<string, unknown>; output: string }[] = [];\n\n\tfor (const block of result.content) {\n\t\tif (block.type === 'tool_call') {\n\t\t\tconst tc = block as ToolCallContentBlock;\n\t\t\tpendingToolCalls.push({\n\t\t\t\tid: tc.toolCallId,\n\t\t\t\tname: tc.name,\n\t\t\t\targs: tc.input ? JSON.parse(tc.input) : {},\n\t\t\t\toutput: tc.output,\n\t\t\t});\n\t\t} else if (block.type === 'text') {\n\t\t\t// Flush any pending tool calls before the text block\n\t\t\tif (pendingToolCalls.length > 0) {\n\t\t\t\tmessages.push(\n\t\t\t\t\tnew AIMessage({\n\t\t\t\t\t\tcontent: '',\n\t\t\t\t\t\ttool_calls: pendingToolCalls.map((tc) => ({ id: tc.id, name: tc.name, args: tc.args })),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tfor (const tc of pendingToolCalls) {\n\t\t\t\t\tmessages.push(new ToolMessage({ content: tc.output, tool_call_id: tc.id, name: tc.name }));\n\t\t\t\t}\n\t\t\t\tpendingToolCalls = [];\n\t\t\t}\n\t\t\tmessages.push(new AIMessage(block.output));\n\t\t}\n\t}\n\n\t// Flush remaining tool calls (agent ended mid-tool-use, unlikely but safe)\n\tif (pendingToolCalls.length > 0) {\n\t\tmessages.push(\n\t\t\tnew AIMessage({\n\t\t\t\tcontent: '',\n\t\t\t\ttool_calls: pendingToolCalls.map((tc) => ({ id: tc.id, name: tc.name, args: tc.args })),\n\t\t\t}),\n\t\t);\n\t\tfor (const tc of pendingToolCalls) {\n\t\t\tmessages.push(new ToolMessage({ content: tc.output, tool_call_id: tc.id, name: tc.name }));\n\t\t}\n\t}\n\n\treturn messages;\n}\n\n/**\n * Converts eval `Record<string, ToolDef>` into `ToolDefinition[]` with mock `exec` functions,\n * suitable for passing to an `AgentFactory.createAgent()` call.\n */\nexport function toolDefsToDefinitions(defs: Record<string, ToolDef>): ToolDefinition[] {\n\tconst callCounts: Record<string, number> = {};\n\n\treturn Object.entries(defs).map(([name, def]) => {\n\t\tcallCounts[name] = 0;\n\n\t\treturn {\n\t\t\tname,\n\t\t\ttoolKit: 'eval-mock',\n\t\t\tdescription: def.description,\n\t\t\tinputSchema:\n\t\t\t\tdef.schema instanceof z.ZodObject\n\t\t\t\t\t? def.schema\n\t\t\t\t\t: z.object(\n\t\t\t\t\t\t\tObject.fromEntries(\n\t\t\t\t\t\t\t\tObject.entries(def.schema ?? {}).map(([key, val]) => {\n\t\t\t\t\t\t\t\t\tif (typeof val === 'string') return [key, z.string().describe(val)];\n\t\t\t\t\t\t\t\t\treturn [key, z.any()];\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\texec: async (input: Record<string, unknown>) => {\n\t\t\t\tcallCounts[name]++;\n\t\t\t\tif (typeof def.response === 'function') {\n\t\t\t\t\treturn (def.response as (input: Record<string, unknown>, callCount: number) => string)(\n\t\t\t\t\t\tinput,\n\t\t\t\t\t\tcallCounts[name],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn typeof def.response === 'string' ? def.response : JSON.stringify(def.response);\n\t\t\t},\n\t\t} satisfies ToolDefinition;\n\t});\n}\n\n/**\n * Runs a real `Agent` as the eval target. Creates a fresh agent per invocation via the factory,\n * sends human messages, and converts the `AgentResult` to `{ messages: BaseMessage[] }`.\n */\nexport async function runAgentTarget(\n\tcreateTarget: CreateTargetFn,\n\tevalMessages: AgentMessage[],\n\textraToolDefs: Record<string, ToolDef>,\n): Promise<{ messages: BaseMessage[] }> {\n\tconst extraTools = Object.keys(extraToolDefs).length > 0 ? toolDefsToDefinitions(extraToolDefs) : [];\n\tconst agent = await createTarget(extraTools);\n\n\tconst result = await agent.run({\n\t\tthreadId: `eval_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n\t\tmessages: evalMessages,\n\t});\n\n\treturn { messages: agentResultToMessages(evalMessages, result) };\n}\n","import * as ls from 'langsmith/vitest';\nimport {\n\tcreateTrajectoryMatchEvaluator,\n\tcreateTrajectoryLLMAsJudge,\n\tTRAJECTORY_ACCURACY_PROMPT,\n} from 'agentevals';\nimport { createLanguageEvaluator } from './evaluators/language';\nimport { createResponseContentEvaluator } from './evaluators/response-content';\nimport { createNoToolCallsEvaluator } from './evaluators/no-tool-calls';\nimport { getEvalConfig } from './config';\n\n// ── Types ────────────────────────────────────────────────────────────\n\ntype EvaluatorFn = (args: {\n\toutputs: Record<string, any>;\n\treferenceOutputs: Record<string, any>;\n}) => Promise<any>;\n\ninterface ResolvedExpectation {\n\tevaluator: EvaluatorFn;\n\treferenceOutputs: Record<string, unknown>;\n}\n\n/** A factory that receives test context and returns an evaluator + its referenceOutputs. */\nexport type Expectation = (ctx: { message: string }) => ResolvedExpectation;\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction withTrajectoryGuard(evaluator: any, key: string): EvaluatorFn {\n\treturn async ({ outputs, referenceOutputs }) => {\n\t\tif (!referenceOutputs?.referenceTrajectory) {\n\t\t\treturn { key, score: true, comment: 'No referenceTrajectory specified, skipping' };\n\t\t}\n\t\treturn evaluator({ outputs, referenceOutputs: referenceOutputs.referenceTrajectory });\n\t};\n}\n\nfunction buildTrajectory(message: string, toolNames: string[]): Record<string, unknown>[] {\n\tconst trajectory: Record<string, unknown>[] = [];\n\tlet tcIdx = 0;\n\n\ttrajectory.push({ role: 'user', content: message });\n\n\tfor (const name of toolNames) {\n\t\tconst id = `tc${++tcIdx}`;\n\t\ttrajectory.push({\n\t\t\trole: 'assistant',\n\t\t\tcontent: '',\n\t\t\ttool_calls: [{ function: { name, arguments: '{}' }, id, type: 'function' }],\n\t\t});\n\t\ttrajectory.push({ role: 'tool', content: '...', tool_call_id: id });\n\t}\n\n\ttrajectory.push({ role: 'assistant', content: '...' });\n\n\treturn trajectory;\n}\n\n// ── Expectation functions ────────────────────────────────────────────\n\n/**\n * Expect the agent to call tools in order (superset trajectory match).\n * Empty `[]` means the agent should answer directly without calling any tools.\n */\nexport function toolsCalled(tools: string[]): Expectation {\n\treturn (ctx) => ({\n\t\tevaluator: ls.wrapEvaluator(\n\t\t\twithTrajectoryGuard(\n\t\t\t\tcreateTrajectoryMatchEvaluator({ trajectoryMatchMode: 'superset', toolArgsMatchMode: 'ignore' }) as any,\n\t\t\t\t'trajectory_match',\n\t\t\t),\n\t\t),\n\t\treferenceOutputs: { referenceTrajectory: buildTrajectory(ctx.message, tools) },\n\t});\n}\n\n/**\n * Run an LLM-as-judge evaluator on the trajectory.\n * Requires `toolsCalled` in the same expect array.\n * Uses the globally configured evaluator model.\n */\nexport function llmJudge(): Expectation {\n\treturn () => {\n\t\tconst config = getEvalConfig();\n\t\tconst model = config.evaluatorModel;\n\t\treturn {\n\t\t\tevaluator: ls.wrapEvaluator(\n\t\t\t\twithTrajectoryGuard(\n\t\t\t\t\tcreateTrajectoryLLMAsJudge({ prompt: TRAJECTORY_ACCURACY_PROMPT, model }) as any,\n\t\t\t\t\t'trajectory_llm_judge',\n\t\t\t\t),\n\t\t\t),\n\t\t\treferenceOutputs: {},\n\t\t};\n\t};\n}\n\n/** Assert the agent made zero tool calls. */\nexport function noTools(): Expectation {\n\treturn () => ({\n\t\tevaluator: ls.wrapEvaluator(createNoToolCallsEvaluator()),\n\t\treferenceOutputs: { expectNoToolCalls: true },\n\t});\n}\n\n/**\n * Assert the response is in the given language (ISO 639-1 code).\n * Uses the globally configured evaluator model for language detection.\n * @param code - ISO 639-1 language code (e.g. 'en', 'tr', 'de').\n */\nexport function respondsInLanguage(code: string): Expectation {\n\treturn () => {\n\t\tconst config = getEvalConfig();\n\t\tconst model = config.evaluatorModel;\n\t\treturn {\n\t\t\tevaluator: ls.wrapEvaluator(createLanguageEvaluator(config.modelConfig, model)),\n\t\t\treferenceOutputs: { expectedLanguage: code },\n\t\t};\n\t};\n}\n\n/** Assert the response contains all given strings. */\nexport function contains(strings: string[]): Expectation {\n\treturn () => ({\n\t\tevaluator: ls.wrapEvaluator(createResponseContentEvaluator()),\n\t\treferenceOutputs: { responseContains: strings },\n\t});\n}\n\n/** Assert the response does not contain any of the given strings. */\nexport function notContains(strings: string[]): Expectation {\n\treturn () => ({\n\t\tevaluator: ls.wrapEvaluator(createResponseContentEvaluator()),\n\t\treferenceOutputs: { responseMustNotContain: strings },\n\t});\n}\n","import { AIMessage, BaseMessage } from '@langchain/core/messages';\nimport { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { LangchainModelResolver, type LangchainModelConfig } from '../../runtime/langchain/model-resolver';\n\n/**\n * Creates a custom evaluator that checks whether the agent's final response\n * is in the expected language. Uses a cheap LLM call for language detection.\n */\nexport function createLanguageEvaluator(modelConfig: LangchainModelConfig, model: string) {\n\tconst resolver = new LangchainModelResolver(modelConfig);\n\tconst judge = resolver.resolve(model) as BaseChatModel;\n\n\treturn async ({\n\t\toutputs,\n\t\treferenceOutputs,\n\t}: {\n\t\toutputs: Record<string, any>;\n\t\treferenceOutputs?: Record<string, any>;\n\t}) => {\n\t\tconst expectedLanguage = referenceOutputs?.expectedLanguage;\n\t\tif (!expectedLanguage) {\n\t\t\treturn { key: 'language_match', score: true, comment: 'No expected language specified, skipping' };\n\t\t}\n\n\t\t// Extract the last AI message text from the trajectory\n\t\tconst messages: BaseMessage[] = outputs.messages || [];\n\t\tconst lastAiMessage = [...messages].reverse().find((m) => m instanceof AIMessage);\n\n\t\tif (!lastAiMessage) {\n\t\t\treturn { key: 'language_match', score: false, comment: 'No AI message found in trajectory' };\n\t\t}\n\n\t\tconst responseText = typeof lastAiMessage.content === 'string' ? lastAiMessage.content : JSON.stringify(lastAiMessage.content);\n\n\t\t// Use LLM to detect the language\n\t\tconst detection = await judge.invoke([\n\t\t\t{\n\t\t\t\trole: 'system',\n\t\t\t\tcontent: 'You are a language detection tool. Respond with ONLY the ISO 639-1 language code (e.g., \"en\", \"tr\", \"de\", \"fr\") of the text provided. Nothing else.',\n\t\t\t},\n\t\t\t{\n\t\t\t\trole: 'user',\n\t\t\t\tcontent: responseText,\n\t\t\t},\n\t\t]);\n\n\t\tconst detectedLanguage = (typeof detection.content === 'string' ? detection.content : '').trim().toLowerCase();\n\n\t\tconst matches = detectedLanguage === expectedLanguage.toLowerCase();\n\n\t\treturn {\n\t\t\tkey: 'language_match',\n\t\t\tscore: matches,\n\t\t\tcomment: matches\n\t\t\t\t? `Response language matches expected: ${expectedLanguage}`\n\t\t\t\t: `Expected \"${expectedLanguage}\" but detected \"${detectedLanguage}\"`,\n\t\t};\n\t};\n}\n","import { AIMessage, BaseMessage } from '@langchain/core/messages';\n\n/**\n * Creates a custom evaluator that checks whether the agent's final response\n * contains expected strings and doesn't contain forbidden strings.\n */\nexport function createResponseContentEvaluator() {\n\treturn async ({\n\t\toutputs,\n\t\treferenceOutputs,\n\t}: {\n\t\toutputs: Record<string, any>;\n\t\treferenceOutputs?: Record<string, any>;\n\t}) => {\n\t\tconst mustContain: string[] = referenceOutputs?.responseContains || [];\n\t\tconst mustNotContain: string[] = referenceOutputs?.responseMustNotContain || [];\n\n\t\tif (mustContain.length === 0 && mustNotContain.length === 0) {\n\t\t\treturn { key: 'response_content', score: true, comment: 'No content assertions specified, skipping' };\n\t\t}\n\n\t\t// Extract the last AI message text from the trajectory\n\t\tconst messages: BaseMessage[] = outputs.messages || [];\n\t\tconst lastAiMessage = [...messages].reverse().find((m) => m instanceof AIMessage);\n\n\t\tif (!lastAiMessage) {\n\t\t\treturn { key: 'response_content', score: false, comment: 'No AI message found in trajectory' };\n\t\t}\n\n\t\tconst responseText = (typeof lastAiMessage.content === 'string' ? lastAiMessage.content : JSON.stringify(lastAiMessage.content)).toLowerCase();\n\n\t\tconst failures: string[] = [];\n\n\t\tfor (const expected of mustContain) {\n\t\t\tif (!responseText.includes(expected.toLowerCase())) {\n\t\t\t\tfailures.push(`Missing expected text: \"${expected}\"`);\n\t\t\t}\n\t\t}\n\n\t\tfor (const forbidden of mustNotContain) {\n\t\t\tif (responseText.includes(forbidden.toLowerCase())) {\n\t\t\t\tfailures.push(`Contains forbidden text: \"${forbidden}\"`);\n\t\t\t}\n\t\t}\n\n\t\tconst passed = failures.length === 0;\n\n\t\treturn {\n\t\t\tkey: 'response_content',\n\t\t\tscore: passed,\n\t\t\tcomment: passed ? 'All content assertions passed' : failures.join('; '),\n\t\t};\n\t};\n}\n","import { AIMessage, BaseMessage } from '@langchain/core/messages';\n\n/**\n * Creates a custom evaluator that asserts the agent made zero tool calls.\n * Useful for scenarios like greetings where the agent should just respond with text.\n */\nexport function createNoToolCallsEvaluator() {\n\treturn async ({\n\t\toutputs,\n\t\treferenceOutputs,\n\t}: {\n\t\toutputs: Record<string, any>;\n\t\treferenceOutputs?: Record<string, any>;\n\t}) => {\n\t\t// Only run this evaluator if the reference explicitly expects no tool calls\n\t\tif (referenceOutputs?.maxToolCalls !== 0 && referenceOutputs?.expectNoToolCalls !== true) {\n\t\t\treturn { key: 'no_tool_calls', score: true, comment: 'No tool call restriction specified, skipping' };\n\t\t}\n\n\t\tconst messages: BaseMessage[] = outputs.messages || [];\n\n\t\tconst toolCalls = messages\n\t\t\t.filter((m) => m instanceof AIMessage)\n\t\t\t.flatMap((m) => (m as AIMessage).tool_calls || []);\n\n\t\tconst passed = toolCalls.length === 0;\n\n\t\treturn {\n\t\t\tkey: 'no_tool_calls',\n\t\t\tscore: passed,\n\t\t\tcomment: passed\n\t\t\t\t? 'No tool calls made (as expected)'\n\t\t\t\t: `Agent made ${toolCalls.length} tool call(s): ${toolCalls.map((tc) => tc.name).join(', ')}`,\n\t\t};\n\t};\n}\n"],"mappings":";;;;;;AAmBA,IAAI,UAA6B;AAE1B,SAAS,eAAe,QAA0B;AACxD,YAAU;AACX;AAEO,SAAS,gBAA4B;AAC3C,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,wEAAwE;AAAA,EACzF;AACA,SAAO;AACR;;;AC9BA,YAAY,QAAQ;;;ACCpB,SAAS,YAAY;AACrB,SAAS,WAAwB,eAAe,mBAAmB;AACnE,SAAS,SAAS;AA0BlB,IAAM,kBAAkB;AAMjB,SAAS,iBAAiB,aAAoC,aAAsB;AAC1F,SAAO,OAAO,WAAkE;AAC/E,UAAM,SAAS,eAAe,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,cAAc;AAChG,QAAI,CAAC,OAAO,OAAO;AAClB,YAAM,IAAI,MAAM,iFAAiF;AAAA,IAClG;AACA,UAAM,WAAW,IAAI,uBAAuB,OAAO,WAAW;AAC9D,UAAM,QAAQ,SAAS,QAAQ,OAAO,KAAK;AAG3C,UAAM,iBAAyC,CAAC;AAGhD,UAAM,iBAAiB,OAAO,MAAM,IAAI,CAAC,aAAa;AACrD,qBAAe,SAAS,IAAI,IAAI;AAEhC,aAAO;AAAA,QACN,OAAO,cAAuC;AAC7C,yBAAe,SAAS,IAAI;AAC5B,cAAI,OAAO,SAAS,aAAa,YAAY;AAC5C,mBAAO,SAAS,SAAS,WAAW,eAAe,SAAS,IAAI,CAAC;AAAA,UAClE;AACA,iBAAO,SAAS;AAAA,QACjB;AAAA,QACA;AAAA,UACC,MAAM,SAAS;AAAA,UACf,aAAa,SAAS;AAAA,UACtB,QACC,SAAS,kBAAkB,EAAE,YAC1B,SAAS,SACT,EAAE;AAAA,YACF,OAAO;AAAA,cACN,OAAO,QAAQ,SAAS,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;AACnD,oBAAI,OAAO,QAAQ,SAAU,QAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG,CAAC;AAClE,oBAAI,OAAO,QAAQ,SAAU,QAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,OAAO,GAAG,CAAC,CAAC;AAC1E,uBAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AAAA,cACrB,CAAC;AAAA,YACF;AAAA,UACD;AAAA,QACJ;AAAA,MACD;AAAA,IACD,CAAC;AAED,UAAM,aAAa,eAAe,SAAS,IAAI,MAAM,UAAW,cAAc,IAAI;AAElF,UAAM,WAA0B,CAAC;AAEjC,QAAI,OAAO,cAAc;AACxB,eAAS,KAAK,IAAI,cAAc,OAAO,YAAY,CAAC;AAAA,IACrD;AAGA,aAAS,KAAK,GAAG,2BAA2B,OAAO,QAAQ,CAAC;AAG5D,QAAI,YAAY;AAChB,WAAO,YAAY,iBAAiB;AACnC;AAEA,YAAM,WAAW,MAAM,WAAW,OAAO,QAAQ;AACjD,eAAS,KAAK,QAAuB;AAErC,YAAM,YAAY;AAClB,UAAI,CAAC,UAAU,cAAc,UAAU,WAAW,WAAW,GAAG;AAC/D;AAAA,MACD;AAGA,iBAAW,MAAM,UAAU,YAAY;AACtC,cAAM,WAAW,eAAe,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;AAC9D,YAAI,UAAU;AACb,gBAAM,SAAS,MAAM,SAAS,OAAO,GAAG,IAAI;AAC5C,mBAAS;AAAA,YACR,IAAI,YAAY;AAAA,cACf,SAAS,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM;AAAA,cACpE,cAAc,GAAG;AAAA,cACjB,MAAM,GAAG;AAAA,YACV,CAAC;AAAA,UACF;AAAA,QACD,OAAO;AACN,mBAAS;AAAA,YACR,IAAI,YAAY;AAAA,cACf,SAAS,SAAS,GAAG,IAAI;AAAA,cACzB,cAAc,GAAG;AAAA,cACjB,MAAM,GAAG;AAAA,YACV,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,WAAO,EAAE,SAAS;AAAA,EACnB;AACD;AAWO,SAAS,sBAAsB,eAA+B,QAAoC;AAExG,QAAM,WAA0B,2BAA2B,aAAa;AAGxE,MAAI,mBAAkG,CAAC;AAEvG,aAAW,SAAS,OAAO,SAAS;AACnC,QAAI,MAAM,SAAS,aAAa;AAC/B,YAAM,KAAK;AACX,uBAAiB,KAAK;AAAA,QACrB,IAAI,GAAG;AAAA,QACP,MAAM,GAAG;AAAA,QACT,MAAM,GAAG,QAAQ,KAAK,MAAM,GAAG,KAAK,IAAI,CAAC;AAAA,QACzC,QAAQ,GAAG;AAAA,MACZ,CAAC;AAAA,IACF,WAAW,MAAM,SAAS,QAAQ;AAEjC,UAAI,iBAAiB,SAAS,GAAG;AAChC,iBAAS;AAAA,UACR,IAAI,UAAU;AAAA,YACb,SAAS;AAAA,YACT,YAAY,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,MAAM,GAAG,MAAM,MAAM,GAAG,KAAK,EAAE;AAAA,UACvF,CAAC;AAAA,QACF;AACA,mBAAW,MAAM,kBAAkB;AAClC,mBAAS,KAAK,IAAI,YAAY,EAAE,SAAS,GAAG,QAAQ,cAAc,GAAG,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,QAC1F;AACA,2BAAmB,CAAC;AAAA,MACrB;AACA,eAAS,KAAK,IAAI,UAAU,MAAM,MAAM,CAAC;AAAA,IAC1C;AAAA,EACD;AAGA,MAAI,iBAAiB,SAAS,GAAG;AAChC,aAAS;AAAA,MACR,IAAI,UAAU;AAAA,QACb,SAAS;AAAA,QACT,YAAY,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,MAAM,GAAG,MAAM,MAAM,GAAG,KAAK,EAAE;AAAA,MACvF,CAAC;AAAA,IACF;AACA,eAAW,MAAM,kBAAkB;AAClC,eAAS,KAAK,IAAI,YAAY,EAAE,SAAS,GAAG,QAAQ,cAAc,GAAG,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,IAC1F;AAAA,EACD;AAEA,SAAO;AACR;AAMO,SAAS,sBAAsB,MAAiD;AACtF,QAAM,aAAqC,CAAC;AAE5C,SAAO,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM;AAChD,eAAW,IAAI,IAAI;AAEnB,WAAO;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,aAAa,IAAI;AAAA,MACjB,aACC,IAAI,kBAAkB,EAAE,YACrB,IAAI,SACJ,EAAE;AAAA,QACF,OAAO;AAAA,UACN,OAAO,QAAQ,IAAI,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;AACpD,gBAAI,OAAO,QAAQ,SAAU,QAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG,CAAC;AAClE,mBAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AAAA,UACrB,CAAC;AAAA,QACF;AAAA,MACD;AAAA,MACH,MAAM,OAAO,UAAmC;AAC/C,mBAAW,IAAI;AACf,YAAI,OAAO,IAAI,aAAa,YAAY;AACvC,iBAAQ,IAAI;AAAA,YACX;AAAA,YACA,WAAW,IAAI;AAAA,UAChB;AAAA,QACD;AACA,eAAO,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW,KAAK,UAAU,IAAI,QAAQ;AAAA,MACrF;AAAA,IACD;AAAA,EACD,CAAC;AACF;AAMA,eAAsB,eACrB,cACA,cACA,eACuC;AACvC,QAAM,aAAa,OAAO,KAAK,aAAa,EAAE,SAAS,IAAI,sBAAsB,aAAa,IAAI,CAAC;AACnG,QAAM,QAAQ,MAAM,aAAa,UAAU;AAE3C,QAAM,SAAS,MAAM,MAAM,IAAI;AAAA,IAC9B,UAAU,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,IACnE,UAAU;AAAA,EACX,CAAC;AAED,SAAO,EAAE,UAAU,sBAAsB,cAAc,MAAM,EAAE;AAChE;;;ADvOO,SAAS,MAAM,SAA+B;AACpD,SAAO,EAAE,MAAM,SAAS,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC,EAAE;AACpE;AAEO,SAAS,GAAG,SAAiB,WAAiC;AACpE,SAAO,EAAE,MAAM,MAAM,SAAS,GAAI,YAAY,EAAE,WAAW,UAAU,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,EAAG;AACxG;AAEO,SAAS,WAAW,MAAc,QAA6B;AACrE,SAAO,EAAE,MAAM,QAAQ,MAAM,OAAO;AACrC;AA0CO,SAAS,cACf,OACA,YAAiD,CAAC,GACxB;AAC1B,SAAO,OAAO;AAAA,IACb,MAAM,IAAI,CAAC,SAAS;AAAA,MACnB,KAAK;AAAA,MACL;AAAA,QACC,aAAa,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,UAAU,UAAU,KAAK,IAAI,KAAK;AAAA,MACnC;AAAA,IACD,CAAC;AAAA,EACF;AACD;AAEA,SAAS,YAAY,MAA8C;AAClE,SAAO,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO;AAAA,IACjD;AAAA,IACA,aAAa,IAAI;AAAA,IACjB,QAAQ,IAAI,UAAU,CAAC;AAAA,IACvB,UACC,OAAO,IAAI,aAAa,aACpB,IAAI,WACL,OAAO,IAAI,aAAa,WACvB,IAAI,WACJ,KAAK,UAAU,IAAI,QAAQ;AAAA,EACjC,EAAE;AACH;AAGA,SAAS,oBAAoB,OAAiD;AAC7E,SAAO,MAAM,IAAI,CAAC,OAAO;AAAA,IACxB,GAAG;AAAA,IACH,QAAQ,EAAE,kBAAkB,UAAU,WAAW,EAAE,SAAS,gBAAgB,EAAE;AAAA,IAC9E,UAAU,OAAO,EAAE,aAAa,aAAa,eAAe,EAAE;AAAA,EAC/D,EAAE;AACH;AAEA,SAAS,iBAAiB,UAA6B;AACtD,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC9C,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,IAAI,SAAS,SAAS;AACzB,YAAM,YAAY,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAC3D,aAAO,YAAY,UAAU,OAAO;AAAA,IACrC;AAAA,EACD;AACA,SAAO;AACR;AAQA,SAAS,mBAAmB,QAA+B;AAC1D,MAAI,OAAO,OAAO,WAAW,WAAY,QAAO,OAAO;AACvD,QAAM,aAAa,cAAc;AACjC,MAAI,CAAC,WAAW,SAAS,OAAO,OAAO,WAAW,UAAU;AAC3D,UAAM,IAAI,MAAM,iFAAiF;AAAA,EAClG;AACA,QAAM,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,WAAW;AAC7E,SAAO,iBAAiB,WAAW,aAAa,KAAK;AACtD;AAEA,SAAS,oBAAoB,QAAiD;AAC7E,SAAO,OAAO,gBAAgB,cAAc,EAAE;AAC/C;AAEO,SAAS,YAAY,MAAc,QAA2B;AACpE,QAAM,aAAa,OAAO,SAAS,CAAC;AACpC,QAAM,eAAe,OAAO,SAAS,SAAY,oBAAoB,MAAM;AAE3E,EAAG,YAAS,MAAM,MAAM;AACvB,eAAW,MAAM,OAAO,OAAO;AAC9B,YAAM,WAAW,GAAG,QAAQ,iBAAiB,GAAG,QAAQ;AACxD,YAAM,eAAe,GAAG,SAAS;AACjC,YAAM,QAAQ,YAAY,YAAY;AACtC,YAAM,MAAM,EAAE,SAAS,iBAAiB,GAAG,QAAQ,EAAE;AAErD,YAAM,WAAW,GAAG,OAAO,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;AAChD,YAAM,aAAa,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS;AAClD,YAAM,mBAAmB,OAAO,OAAO,CAAC,GAAG,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAErF,MAAG;AAAA,QACF;AAAA,QACA;AAAA,UACC,QAAQ;AAAA,YACP,UAAU,GAAG;AAAA,YACb,OAAO,oBAAoB,KAAK;AAAA,UACjC;AAAA,UACA;AAAA,QACD;AAAA,QACA,OAAO,EAAE,kBAAkB,OAAO,MAAM;AACvC,cAAI;AAEJ,cAAI,cAAc;AAEjB,qBAAS,MAAM,eAAe,cAAc,GAAG,UAAU,YAAY;AAAA,UACtE,OAAO;AAEN,kBAAM,SAAS,mBAAmB,MAAM;AACxC,kBAAM,eAAe,cAAc,EAAE;AACrC,kBAAM,eAAe,GAAG,gBAAgB,OAAO,gBAAgB;AAC/D,qBAAS,MAAM,OAAO;AAAA,cACrB,UAAU,GAAG;AAAA,cACb;AAAA,cACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,YACxC,CAAC;AAAA,UACF;AAEA,UAAG,cAAW,MAAM;AACpB,qBAAW,aAAa,YAAY;AACnC,kBAAM,UAAU,EAAE,SAAS,QAAQ,kBAAkB,UAAU,CAAC,EAAE,CAAC;AAAA,UACpE;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD,CAAC;AACF;;;AE3LA,YAAYA,SAAQ;AACpB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;;;ACLP,SAAS,aAAAC,kBAA8B;AAQhC,SAAS,wBAAwB,aAAmC,OAAe;AACzF,QAAM,WAAW,IAAI,uBAAuB,WAAW;AACvD,QAAM,QAAQ,SAAS,QAAQ,KAAK;AAEpC,SAAO,OAAO;AAAA,IACb;AAAA,IACA;AAAA,EACD,MAGM;AACL,UAAM,mBAAmB,kBAAkB;AAC3C,QAAI,CAAC,kBAAkB;AACtB,aAAO,EAAE,KAAK,kBAAkB,OAAO,MAAM,SAAS,2CAA2C;AAAA,IAClG;AAGA,UAAM,WAA0B,QAAQ,YAAY,CAAC;AACrD,UAAM,gBAAgB,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,aAAaC,UAAS;AAEhF,QAAI,CAAC,eAAe;AACnB,aAAO,EAAE,KAAK,kBAAkB,OAAO,OAAO,SAAS,oCAAoC;AAAA,IAC5F;AAEA,UAAM,eAAe,OAAO,cAAc,YAAY,WAAW,cAAc,UAAU,KAAK,UAAU,cAAc,OAAO;AAG7H,UAAM,YAAY,MAAM,MAAM,OAAO;AAAA,MACpC;AAAA,QACC,MAAM;AAAA,QACN,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,SAAS;AAAA,MACV;AAAA,IACD,CAAC;AAED,UAAM,oBAAoB,OAAO,UAAU,YAAY,WAAW,UAAU,UAAU,IAAI,KAAK,EAAE,YAAY;AAE7G,UAAM,UAAU,qBAAqB,iBAAiB,YAAY;AAElE,WAAO;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,MACP,SAAS,UACN,uCAAuC,gBAAgB,KACvD,aAAa,gBAAgB,mBAAmB,gBAAgB;AAAA,IACpE;AAAA,EACD;AACD;;;AC1DA,SAAS,aAAAC,kBAA8B;AAMhC,SAAS,iCAAiC;AAChD,SAAO,OAAO;AAAA,IACb;AAAA,IACA;AAAA,EACD,MAGM;AACL,UAAM,cAAwB,kBAAkB,oBAAoB,CAAC;AACrE,UAAM,iBAA2B,kBAAkB,0BAA0B,CAAC;AAE9E,QAAI,YAAY,WAAW,KAAK,eAAe,WAAW,GAAG;AAC5D,aAAO,EAAE,KAAK,oBAAoB,OAAO,MAAM,SAAS,4CAA4C;AAAA,IACrG;AAGA,UAAM,WAA0B,QAAQ,YAAY,CAAC;AACrD,UAAM,gBAAgB,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,aAAaA,UAAS;AAEhF,QAAI,CAAC,eAAe;AACnB,aAAO,EAAE,KAAK,oBAAoB,OAAO,OAAO,SAAS,oCAAoC;AAAA,IAC9F;AAEA,UAAM,gBAAgB,OAAO,cAAc,YAAY,WAAW,cAAc,UAAU,KAAK,UAAU,cAAc,OAAO,GAAG,YAAY;AAE7I,UAAM,WAAqB,CAAC;AAE5B,eAAW,YAAY,aAAa;AACnC,UAAI,CAAC,aAAa,SAAS,SAAS,YAAY,CAAC,GAAG;AACnD,iBAAS,KAAK,2BAA2B,QAAQ,GAAG;AAAA,MACrD;AAAA,IACD;AAEA,eAAW,aAAa,gBAAgB;AACvC,UAAI,aAAa,SAAS,UAAU,YAAY,CAAC,GAAG;AACnD,iBAAS,KAAK,6BAA6B,SAAS,GAAG;AAAA,MACxD;AAAA,IACD;AAEA,UAAM,SAAS,SAAS,WAAW;AAEnC,WAAO;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,MACP,SAAS,SAAS,kCAAkC,SAAS,KAAK,IAAI;AAAA,IACvE;AAAA,EACD;AACD;;;ACrDA,SAAS,aAAAC,kBAA8B;AAMhC,SAAS,6BAA6B;AAC5C,SAAO,OAAO;AAAA,IACb;AAAA,IACA;AAAA,EACD,MAGM;AAEL,QAAI,kBAAkB,iBAAiB,KAAK,kBAAkB,sBAAsB,MAAM;AACzF,aAAO,EAAE,KAAK,iBAAiB,OAAO,MAAM,SAAS,+CAA+C;AAAA,IACrG;AAEA,UAAM,WAA0B,QAAQ,YAAY,CAAC;AAErD,UAAM,YAAY,SAChB,OAAO,CAAC,MAAM,aAAaA,UAAS,EACpC,QAAQ,CAAC,MAAO,EAAgB,cAAc,CAAC,CAAC;AAElD,UAAM,SAAS,UAAU,WAAW;AAEpC,WAAO;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,MACP,SAAS,SACN,qCACA,cAAc,UAAU,MAAM,kBAAkB,UAAU,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAC7F;AAAA,EACD;AACD;;;AHPA,SAAS,oBAAoB,WAAgB,KAA0B;AACtE,SAAO,OAAO,EAAE,SAAS,iBAAiB,MAAM;AAC/C,QAAI,CAAC,kBAAkB,qBAAqB;AAC3C,aAAO,EAAE,KAAK,OAAO,MAAM,SAAS,6CAA6C;AAAA,IAClF;AACA,WAAO,UAAU,EAAE,SAAS,kBAAkB,iBAAiB,oBAAoB,CAAC;AAAA,EACrF;AACD;AAEA,SAAS,gBAAgB,SAAiB,WAAgD;AACzF,QAAM,aAAwC,CAAC;AAC/C,MAAI,QAAQ;AAEZ,aAAW,KAAK,EAAE,MAAM,QAAQ,SAAS,QAAQ,CAAC;AAElD,aAAW,QAAQ,WAAW;AAC7B,UAAM,KAAK,KAAK,EAAE,KAAK;AACvB,eAAW,KAAK;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY,CAAC,EAAE,UAAU,EAAE,MAAM,WAAW,KAAK,GAAG,IAAI,MAAM,WAAW,CAAC;AAAA,IAC3E,CAAC;AACD,eAAW,KAAK,EAAE,MAAM,QAAQ,SAAS,OAAO,cAAc,GAAG,CAAC;AAAA,EACnE;AAEA,aAAW,KAAK,EAAE,MAAM,aAAa,SAAS,MAAM,CAAC;AAErD,SAAO;AACR;AAQO,SAAS,YAAY,OAA8B;AACzD,SAAO,CAAC,SAAS;AAAA,IAChB,WAAc;AAAA,MACb;AAAA,QACC,+BAA+B,EAAE,qBAAqB,YAAY,mBAAmB,SAAS,CAAC;AAAA,QAC/F;AAAA,MACD;AAAA,IACD;AAAA,IACA,kBAAkB,EAAE,qBAAqB,gBAAgB,IAAI,SAAS,KAAK,EAAE;AAAA,EAC9E;AACD;AAOO,SAAS,WAAwB;AACvC,SAAO,MAAM;AACZ,UAAM,SAAS,cAAc;AAC7B,UAAM,QAAQ,OAAO;AACrB,WAAO;AAAA,MACN,WAAc;AAAA,QACb;AAAA,UACC,2BAA2B,EAAE,QAAQ,4BAA4B,MAAM,CAAC;AAAA,UACxE;AAAA,QACD;AAAA,MACD;AAAA,MACA,kBAAkB,CAAC;AAAA,IACpB;AAAA,EACD;AACD;AAGO,SAAS,UAAuB;AACtC,SAAO,OAAO;AAAA,IACb,WAAc,kBAAc,2BAA2B,CAAC;AAAA,IACxD,kBAAkB,EAAE,mBAAmB,KAAK;AAAA,EAC7C;AACD;AAOO,SAAS,mBAAmB,MAA2B;AAC7D,SAAO,MAAM;AACZ,UAAM,SAAS,cAAc;AAC7B,UAAM,QAAQ,OAAO;AACrB,WAAO;AAAA,MACN,WAAc,kBAAc,wBAAwB,OAAO,aAAa,KAAK,CAAC;AAAA,MAC9E,kBAAkB,EAAE,kBAAkB,KAAK;AAAA,IAC5C;AAAA,EACD;AACD;AAGO,SAAS,SAAS,SAAgC;AACxD,SAAO,OAAO;AAAA,IACb,WAAc,kBAAc,+BAA+B,CAAC;AAAA,IAC5D,kBAAkB,EAAE,kBAAkB,QAAQ;AAAA,EAC/C;AACD;AAGO,SAAS,YAAY,SAAgC;AAC3D,SAAO,OAAO;AAAA,IACb,WAAc,kBAAc,+BAA+B,CAAC;AAAA,IAC5D,kBAAkB,EAAE,wBAAwB,QAAQ;AAAA,EACrD;AACD;","names":["ls","AIMessage","AIMessage","AIMessage","AIMessage"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,126 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
run(input: AgentRunInput): Promise<AgentResult>;
|
|
5
|
-
stream(input: AgentRunInput): AsyncGenerator<StreamEvent>;
|
|
6
|
-
}
|
|
7
|
-
interface BaseStreamEvent {
|
|
8
|
-
type: string;
|
|
9
|
-
}
|
|
10
|
-
interface MessageStartEvent extends BaseStreamEvent {
|
|
11
|
-
type: 'message_start';
|
|
12
|
-
}
|
|
13
|
-
interface MessageEndEvent extends BaseStreamEvent {
|
|
14
|
-
type: 'message_end';
|
|
15
|
-
}
|
|
16
|
-
interface ChatTitleEvent extends BaseStreamEvent {
|
|
17
|
-
type: 'chat_title';
|
|
18
|
-
title: string;
|
|
19
|
-
}
|
|
20
|
-
interface AudioEvent extends BaseStreamEvent {
|
|
21
|
-
type: 'audio';
|
|
22
|
-
data: string;
|
|
23
|
-
duration: number;
|
|
24
|
-
}
|
|
25
|
-
interface TextBlockEvent extends BaseStreamEvent {
|
|
26
|
-
type: 'text_block';
|
|
27
|
-
text: string;
|
|
28
|
-
}
|
|
29
|
-
interface TextDeltaEvent extends BaseStreamEvent {
|
|
30
|
-
type: 'text_delta';
|
|
31
|
-
delta: string;
|
|
32
|
-
}
|
|
33
|
-
interface ToolStartEvent extends BaseStreamEvent {
|
|
34
|
-
type: 'tool_start';
|
|
35
|
-
name: string;
|
|
36
|
-
toolKit: string;
|
|
37
|
-
toolKitIconUrl?: string;
|
|
38
|
-
index: number;
|
|
39
|
-
toolCallId: string;
|
|
40
|
-
}
|
|
41
|
-
interface ToolInputDeltaEvent extends BaseStreamEvent {
|
|
42
|
-
type: 'tool_input_delta';
|
|
43
|
-
name: string;
|
|
44
|
-
args: string;
|
|
45
|
-
index: number;
|
|
46
|
-
toolCallId: string;
|
|
47
|
-
}
|
|
48
|
-
interface ToolResultEvent extends BaseStreamEvent {
|
|
49
|
-
type: 'tool_result';
|
|
50
|
-
name: string;
|
|
51
|
-
toolKit: string;
|
|
52
|
-
toolKitIconUrl?: string;
|
|
53
|
-
input: string;
|
|
54
|
-
output: string;
|
|
55
|
-
index: number;
|
|
56
|
-
toolCallId: string;
|
|
57
|
-
}
|
|
58
|
-
interface ReasoningEvent extends BaseStreamEvent {
|
|
59
|
-
type: 'reasoning';
|
|
60
|
-
delta: string;
|
|
61
|
-
}
|
|
62
|
-
interface FinalContentEvent extends BaseStreamEvent {
|
|
63
|
-
type: 'final_content';
|
|
64
|
-
content: ContentBlock[];
|
|
65
|
-
usage: UsageMeta;
|
|
66
|
-
}
|
|
67
|
-
type StreamEvent = MessageStartEvent | MessageEndEvent | ChatTitleEvent | AudioEvent | TextBlockEvent | TextDeltaEvent | ToolStartEvent | ToolResultEvent | ReasoningEvent | ToolInputDeltaEvent | FinalContentEvent;
|
|
68
|
-
interface ToolSpec {
|
|
69
|
-
toolKit: string;
|
|
70
|
-
name: string;
|
|
71
|
-
description: string;
|
|
72
|
-
inputSchema: ZodObject;
|
|
73
|
-
toolKitIconUrl?: string;
|
|
74
|
-
}
|
|
75
|
-
interface ToolDefinition extends ToolSpec {
|
|
76
|
-
exec: (input: any) => Promise<unknown> | unknown;
|
|
77
|
-
}
|
|
78
|
-
interface ToolCall {
|
|
79
|
-
id: string;
|
|
80
|
-
name: string;
|
|
81
|
-
input: unknown;
|
|
82
|
-
output?: unknown;
|
|
83
|
-
}
|
|
84
|
-
type ToolCallContentBlock = {
|
|
85
|
-
type: 'tool_call';
|
|
86
|
-
name: string;
|
|
87
|
-
toolKit: string;
|
|
88
|
-
toolKitIconUrl?: string;
|
|
89
|
-
input: string | null;
|
|
90
|
-
output: string;
|
|
91
|
-
toolCallId: string;
|
|
92
|
-
};
|
|
93
|
-
type TextContentBlock = {
|
|
94
|
-
type: 'text';
|
|
95
|
-
output: string;
|
|
96
|
-
};
|
|
97
|
-
type ContentBlock = ToolCallContentBlock | TextContentBlock;
|
|
98
|
-
interface AgentResult {
|
|
99
|
-
content: ContentBlock[];
|
|
100
|
-
toolCalls: ToolCall[];
|
|
101
|
-
usage: UsageMeta;
|
|
102
|
-
}
|
|
103
|
-
interface AgentRunInput {
|
|
104
|
-
threadId: string;
|
|
105
|
-
messages: Message[];
|
|
106
|
-
}
|
|
107
|
-
interface UsageMeta {
|
|
108
|
-
promptTokens: number;
|
|
109
|
-
completionTokens: number;
|
|
110
|
-
totalTokens: number;
|
|
111
|
-
cachedPromptTokens?: number;
|
|
112
|
-
}
|
|
113
|
-
type Message = HumanMessage;
|
|
114
|
-
interface HumanMessage {
|
|
115
|
-
content: InputContentBlock[];
|
|
116
|
-
}
|
|
117
|
-
type InputContentBlock = {
|
|
118
|
-
type: 'text';
|
|
119
|
-
text: string;
|
|
120
|
-
} | {
|
|
121
|
-
type: 'image';
|
|
122
|
-
url: string;
|
|
123
|
-
};
|
|
1
|
+
import { T as ToolDefinition, A as Agent, L as LangchainModelConfig, a as ToolSpec } from './model-resolver-U0J9x1a6.mjs';
|
|
2
|
+
export { b as AgentResult, c as AgentRunInput, d as AiMessage, C as ContentBlock, H as HumanMessage, M as Message, S as StreamEvent, e as ToolCall, f as ToolMessage, U as UsageMeta } from './model-resolver-U0J9x1a6.mjs';
|
|
3
|
+
import 'zod';
|
|
124
4
|
|
|
125
5
|
type AgentHandoff = {
|
|
126
6
|
name: string;
|
|
@@ -160,20 +40,6 @@ interface AgentFactory {
|
|
|
160
40
|
createAgent(options: CreateAgentOptions): Promise<Agent> | Agent;
|
|
161
41
|
}
|
|
162
42
|
|
|
163
|
-
type LangchainOpenAIConfig = {
|
|
164
|
-
apiKey: string;
|
|
165
|
-
};
|
|
166
|
-
type LangchainAzureConfig = {
|
|
167
|
-
model: string;
|
|
168
|
-
apiKey: string;
|
|
169
|
-
endpoint: string;
|
|
170
|
-
apiVersion: string;
|
|
171
|
-
};
|
|
172
|
-
type LangchainModelConfig = {
|
|
173
|
-
openai?: Record<string, LangchainOpenAIConfig>;
|
|
174
|
-
azure?: Record<string, LangchainAzureConfig>;
|
|
175
|
-
};
|
|
176
|
-
|
|
177
43
|
interface PostgresSaverConfig {
|
|
178
44
|
connString: string;
|
|
179
45
|
schema: string;
|
|
@@ -246,4 +112,4 @@ declare class ToolRegistry<TContext> {
|
|
|
246
112
|
private getToolKitSpecs;
|
|
247
113
|
}
|
|
248
114
|
|
|
249
|
-
export {
|
|
115
|
+
export { Agent, type AgentFactory, type AgentHandoff, type CreateAgentOptions, InMemoryToolCache, LangchainAgentFactory, LangchainModelConfig, RedisToolCache, type ToolCache, ToolDefinition, type ToolProvider, ToolRegistry, ToolSpec };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,126 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
run(input: AgentRunInput): Promise<AgentResult>;
|
|
5
|
-
stream(input: AgentRunInput): AsyncGenerator<StreamEvent>;
|
|
6
|
-
}
|
|
7
|
-
interface BaseStreamEvent {
|
|
8
|
-
type: string;
|
|
9
|
-
}
|
|
10
|
-
interface MessageStartEvent extends BaseStreamEvent {
|
|
11
|
-
type: 'message_start';
|
|
12
|
-
}
|
|
13
|
-
interface MessageEndEvent extends BaseStreamEvent {
|
|
14
|
-
type: 'message_end';
|
|
15
|
-
}
|
|
16
|
-
interface ChatTitleEvent extends BaseStreamEvent {
|
|
17
|
-
type: 'chat_title';
|
|
18
|
-
title: string;
|
|
19
|
-
}
|
|
20
|
-
interface AudioEvent extends BaseStreamEvent {
|
|
21
|
-
type: 'audio';
|
|
22
|
-
data: string;
|
|
23
|
-
duration: number;
|
|
24
|
-
}
|
|
25
|
-
interface TextBlockEvent extends BaseStreamEvent {
|
|
26
|
-
type: 'text_block';
|
|
27
|
-
text: string;
|
|
28
|
-
}
|
|
29
|
-
interface TextDeltaEvent extends BaseStreamEvent {
|
|
30
|
-
type: 'text_delta';
|
|
31
|
-
delta: string;
|
|
32
|
-
}
|
|
33
|
-
interface ToolStartEvent extends BaseStreamEvent {
|
|
34
|
-
type: 'tool_start';
|
|
35
|
-
name: string;
|
|
36
|
-
toolKit: string;
|
|
37
|
-
toolKitIconUrl?: string;
|
|
38
|
-
index: number;
|
|
39
|
-
toolCallId: string;
|
|
40
|
-
}
|
|
41
|
-
interface ToolInputDeltaEvent extends BaseStreamEvent {
|
|
42
|
-
type: 'tool_input_delta';
|
|
43
|
-
name: string;
|
|
44
|
-
args: string;
|
|
45
|
-
index: number;
|
|
46
|
-
toolCallId: string;
|
|
47
|
-
}
|
|
48
|
-
interface ToolResultEvent extends BaseStreamEvent {
|
|
49
|
-
type: 'tool_result';
|
|
50
|
-
name: string;
|
|
51
|
-
toolKit: string;
|
|
52
|
-
toolKitIconUrl?: string;
|
|
53
|
-
input: string;
|
|
54
|
-
output: string;
|
|
55
|
-
index: number;
|
|
56
|
-
toolCallId: string;
|
|
57
|
-
}
|
|
58
|
-
interface ReasoningEvent extends BaseStreamEvent {
|
|
59
|
-
type: 'reasoning';
|
|
60
|
-
delta: string;
|
|
61
|
-
}
|
|
62
|
-
interface FinalContentEvent extends BaseStreamEvent {
|
|
63
|
-
type: 'final_content';
|
|
64
|
-
content: ContentBlock[];
|
|
65
|
-
usage: UsageMeta;
|
|
66
|
-
}
|
|
67
|
-
type StreamEvent = MessageStartEvent | MessageEndEvent | ChatTitleEvent | AudioEvent | TextBlockEvent | TextDeltaEvent | ToolStartEvent | ToolResultEvent | ReasoningEvent | ToolInputDeltaEvent | FinalContentEvent;
|
|
68
|
-
interface ToolSpec {
|
|
69
|
-
toolKit: string;
|
|
70
|
-
name: string;
|
|
71
|
-
description: string;
|
|
72
|
-
inputSchema: ZodObject;
|
|
73
|
-
toolKitIconUrl?: string;
|
|
74
|
-
}
|
|
75
|
-
interface ToolDefinition extends ToolSpec {
|
|
76
|
-
exec: (input: any) => Promise<unknown> | unknown;
|
|
77
|
-
}
|
|
78
|
-
interface ToolCall {
|
|
79
|
-
id: string;
|
|
80
|
-
name: string;
|
|
81
|
-
input: unknown;
|
|
82
|
-
output?: unknown;
|
|
83
|
-
}
|
|
84
|
-
type ToolCallContentBlock = {
|
|
85
|
-
type: 'tool_call';
|
|
86
|
-
name: string;
|
|
87
|
-
toolKit: string;
|
|
88
|
-
toolKitIconUrl?: string;
|
|
89
|
-
input: string | null;
|
|
90
|
-
output: string;
|
|
91
|
-
toolCallId: string;
|
|
92
|
-
};
|
|
93
|
-
type TextContentBlock = {
|
|
94
|
-
type: 'text';
|
|
95
|
-
output: string;
|
|
96
|
-
};
|
|
97
|
-
type ContentBlock = ToolCallContentBlock | TextContentBlock;
|
|
98
|
-
interface AgentResult {
|
|
99
|
-
content: ContentBlock[];
|
|
100
|
-
toolCalls: ToolCall[];
|
|
101
|
-
usage: UsageMeta;
|
|
102
|
-
}
|
|
103
|
-
interface AgentRunInput {
|
|
104
|
-
threadId: string;
|
|
105
|
-
messages: Message[];
|
|
106
|
-
}
|
|
107
|
-
interface UsageMeta {
|
|
108
|
-
promptTokens: number;
|
|
109
|
-
completionTokens: number;
|
|
110
|
-
totalTokens: number;
|
|
111
|
-
cachedPromptTokens?: number;
|
|
112
|
-
}
|
|
113
|
-
type Message = HumanMessage;
|
|
114
|
-
interface HumanMessage {
|
|
115
|
-
content: InputContentBlock[];
|
|
116
|
-
}
|
|
117
|
-
type InputContentBlock = {
|
|
118
|
-
type: 'text';
|
|
119
|
-
text: string;
|
|
120
|
-
} | {
|
|
121
|
-
type: 'image';
|
|
122
|
-
url: string;
|
|
123
|
-
};
|
|
1
|
+
import { T as ToolDefinition, A as Agent, L as LangchainModelConfig, a as ToolSpec } from './model-resolver-U0J9x1a6.js';
|
|
2
|
+
export { b as AgentResult, c as AgentRunInput, d as AiMessage, C as ContentBlock, H as HumanMessage, M as Message, S as StreamEvent, e as ToolCall, f as ToolMessage, U as UsageMeta } from './model-resolver-U0J9x1a6.js';
|
|
3
|
+
import 'zod';
|
|
124
4
|
|
|
125
5
|
type AgentHandoff = {
|
|
126
6
|
name: string;
|
|
@@ -160,20 +40,6 @@ interface AgentFactory {
|
|
|
160
40
|
createAgent(options: CreateAgentOptions): Promise<Agent> | Agent;
|
|
161
41
|
}
|
|
162
42
|
|
|
163
|
-
type LangchainOpenAIConfig = {
|
|
164
|
-
apiKey: string;
|
|
165
|
-
};
|
|
166
|
-
type LangchainAzureConfig = {
|
|
167
|
-
model: string;
|
|
168
|
-
apiKey: string;
|
|
169
|
-
endpoint: string;
|
|
170
|
-
apiVersion: string;
|
|
171
|
-
};
|
|
172
|
-
type LangchainModelConfig = {
|
|
173
|
-
openai?: Record<string, LangchainOpenAIConfig>;
|
|
174
|
-
azure?: Record<string, LangchainAzureConfig>;
|
|
175
|
-
};
|
|
176
|
-
|
|
177
43
|
interface PostgresSaverConfig {
|
|
178
44
|
connString: string;
|
|
179
45
|
schema: string;
|
|
@@ -246,4 +112,4 @@ declare class ToolRegistry<TContext> {
|
|
|
246
112
|
private getToolKitSpecs;
|
|
247
113
|
}
|
|
248
114
|
|
|
249
|
-
export {
|
|
115
|
+
export { Agent, type AgentFactory, type AgentHandoff, type CreateAgentOptions, InMemoryToolCache, LangchainAgentFactory, LangchainModelConfig, RedisToolCache, type ToolCache, ToolDefinition, type ToolProvider, ToolRegistry, ToolSpec };
|
package/dist/index.js
CHANGED
|
@@ -21101,12 +21101,64 @@ var AgentMemoryStateSchema = import_zod.z.object({
|
|
|
21101
21101
|
var MAX_SKILL_FILE_SIZE$1 = 10 * 1024 * 1024;
|
|
21102
21102
|
|
|
21103
21103
|
// src/runtime/langchain/factory.ts
|
|
21104
|
-
var
|
|
21104
|
+
var import_langchain4 = require("langchain");
|
|
21105
21105
|
|
|
21106
21106
|
// src/runtime/langchain/agent.ts
|
|
21107
21107
|
var import_messages2 = require("@langchain/core/messages");
|
|
21108
21108
|
var import_langgraph2 = require("@langchain/langgraph");
|
|
21109
|
+
var import_langchain3 = require("langchain");
|
|
21110
|
+
|
|
21111
|
+
// src/runtime/langchain/utils.ts
|
|
21109
21112
|
var import_langchain2 = require("langchain");
|
|
21113
|
+
function convertToLangchainMessages(messages) {
|
|
21114
|
+
const result = [];
|
|
21115
|
+
let tcIdx = 0;
|
|
21116
|
+
let pendingToolCallIds = [];
|
|
21117
|
+
for (const msg of messages) {
|
|
21118
|
+
if (msg.role === "human") {
|
|
21119
|
+
result.push(
|
|
21120
|
+
new import_langchain2.HumanMessage({
|
|
21121
|
+
content: msg.content.map((c) => {
|
|
21122
|
+
if (c.type === "image") {
|
|
21123
|
+
return { type: "image_url", image_url: { url: c.url } };
|
|
21124
|
+
}
|
|
21125
|
+
return c;
|
|
21126
|
+
})
|
|
21127
|
+
})
|
|
21128
|
+
);
|
|
21129
|
+
} else if (msg.role === "ai") {
|
|
21130
|
+
if (msg.toolCalls && msg.toolCalls.length > 0) {
|
|
21131
|
+
pendingToolCallIds = msg.toolCalls.map(() => `tc_${++tcIdx}`);
|
|
21132
|
+
result.push(
|
|
21133
|
+
new import_langchain2.AIMessage({
|
|
21134
|
+
content: msg.content,
|
|
21135
|
+
tool_calls: msg.toolCalls.map((tc, i) => ({
|
|
21136
|
+
id: pendingToolCallIds[i],
|
|
21137
|
+
name: tc.name,
|
|
21138
|
+
args: tc.input ? JSON.parse(tc.input) : {}
|
|
21139
|
+
}))
|
|
21140
|
+
})
|
|
21141
|
+
);
|
|
21142
|
+
} else {
|
|
21143
|
+
result.push(new import_langchain2.AIMessage(msg.content));
|
|
21144
|
+
}
|
|
21145
|
+
} else if (msg.role === "tool") {
|
|
21146
|
+
const toolCallId = pendingToolCallIds.shift();
|
|
21147
|
+
if (!toolCallId)
|
|
21148
|
+
throw new Error(`ToolMessage for "${msg.name}" without a preceding AiMessage with toolCalls`);
|
|
21149
|
+
result.push(
|
|
21150
|
+
new import_langchain2.ToolMessage({
|
|
21151
|
+
content: msg.output,
|
|
21152
|
+
tool_call_id: toolCallId,
|
|
21153
|
+
name: msg.name
|
|
21154
|
+
})
|
|
21155
|
+
);
|
|
21156
|
+
}
|
|
21157
|
+
}
|
|
21158
|
+
return result;
|
|
21159
|
+
}
|
|
21160
|
+
|
|
21161
|
+
// src/runtime/langchain/agent.ts
|
|
21110
21162
|
var ENABLE_STREAM_DEBUG_LOGS = false;
|
|
21111
21163
|
function debugLogStream(type, text) {
|
|
21112
21164
|
if (!ENABLE_STREAM_DEBUG_LOGS) return;
|
|
@@ -21120,7 +21172,7 @@ var LangchainAgent = class {
|
|
|
21120
21172
|
if (!params.disableToolReportingFor) params.disableToolReportingFor = [];
|
|
21121
21173
|
if (!params.disableToolStreamingFor) params.disableToolStreamingFor = [];
|
|
21122
21174
|
let middlewares = [
|
|
21123
|
-
(0,
|
|
21175
|
+
(0, import_langchain3.createMiddleware)({
|
|
21124
21176
|
name: "toolCallsReporter",
|
|
21125
21177
|
wrapToolCall: async (request, handler) => {
|
|
21126
21178
|
try {
|
|
@@ -21169,21 +21221,10 @@ var LangchainAgent = class {
|
|
|
21169
21221
|
messageCountBefore = stateBefore?.values?.messages?.length || 0;
|
|
21170
21222
|
} catch {
|
|
21171
21223
|
}
|
|
21224
|
+
const messages = convertToLangchainMessages(input.messages);
|
|
21172
21225
|
const result = await this.deepAgent.invoke(
|
|
21173
21226
|
{
|
|
21174
|
-
messages
|
|
21175
|
-
(m) => new import_langchain2.HumanMessage({
|
|
21176
|
-
content: m.content.map((c) => {
|
|
21177
|
-
if (c.type === "image") {
|
|
21178
|
-
return {
|
|
21179
|
-
type: "image_url",
|
|
21180
|
-
image_url: { url: c.url }
|
|
21181
|
-
};
|
|
21182
|
-
}
|
|
21183
|
-
return c;
|
|
21184
|
-
})
|
|
21185
|
-
})
|
|
21186
|
-
)
|
|
21227
|
+
messages
|
|
21187
21228
|
},
|
|
21188
21229
|
{
|
|
21189
21230
|
configurable: {
|
|
@@ -21255,19 +21296,7 @@ var LangchainAgent = class {
|
|
|
21255
21296
|
totalTokens: 0,
|
|
21256
21297
|
cachedPromptTokens: 0
|
|
21257
21298
|
};
|
|
21258
|
-
const messages = input.messages
|
|
21259
|
-
(m) => new import_langchain2.HumanMessage({
|
|
21260
|
-
content: m.content.map((c) => {
|
|
21261
|
-
if (c.type === "image") {
|
|
21262
|
-
return {
|
|
21263
|
-
type: "image_url",
|
|
21264
|
-
image_url: { url: c.url }
|
|
21265
|
-
};
|
|
21266
|
-
}
|
|
21267
|
-
return c;
|
|
21268
|
-
})
|
|
21269
|
-
})
|
|
21270
|
-
);
|
|
21299
|
+
const messages = convertToLangchainMessages(input.messages);
|
|
21271
21300
|
debugLogStream("message_start", "");
|
|
21272
21301
|
yield { type: "message_start" };
|
|
21273
21302
|
const stream = await this.deepAgent.stream(
|
|
@@ -21435,7 +21464,7 @@ var LangchainAgent = class {
|
|
|
21435
21464
|
};
|
|
21436
21465
|
}
|
|
21437
21466
|
isToolCallMessage(message) {
|
|
21438
|
-
if (!(message instanceof
|
|
21467
|
+
if (!(message instanceof import_langchain3.AIMessageChunk)) return false;
|
|
21439
21468
|
const toolCallChunks = message.tool_call_chunks;
|
|
21440
21469
|
if (!toolCallChunks) return false;
|
|
21441
21470
|
if (toolCallChunks.length == 0) return false;
|
|
@@ -21497,18 +21526,21 @@ var LangchainModelResolver = class {
|
|
|
21497
21526
|
tags
|
|
21498
21527
|
});
|
|
21499
21528
|
}
|
|
21500
|
-
resolveAzure(
|
|
21501
|
-
const
|
|
21502
|
-
if (!
|
|
21503
|
-
throw new Error(`
|
|
21529
|
+
resolveAzure(resourceName, modelName, tags) {
|
|
21530
|
+
const resource = this.config.azure?.[resourceName];
|
|
21531
|
+
if (!resource) {
|
|
21532
|
+
throw new Error(`Resource "${resourceName}" for provider "azure" is missing`);
|
|
21533
|
+
}
|
|
21534
|
+
const modelEntry = resource.models.find((m) => m.model === modelName);
|
|
21535
|
+
if (!modelEntry) {
|
|
21536
|
+
throw new Error(`Model "${modelName}" not found in Azure resource "${resourceName}"`);
|
|
21504
21537
|
}
|
|
21505
21538
|
return new import_openai.AzureChatOpenAI({
|
|
21506
|
-
model:
|
|
21507
|
-
|
|
21508
|
-
|
|
21509
|
-
|
|
21510
|
-
|
|
21511
|
-
azureOpenAIApiVersion: providerConfig.apiVersion,
|
|
21539
|
+
model: modelEntry.model,
|
|
21540
|
+
azureOpenAIApiKey: resource.apiKey,
|
|
21541
|
+
azureOpenAIApiInstanceName: this.extractInstanceName(resource.endpoint),
|
|
21542
|
+
azureOpenAIApiDeploymentName: modelEntry.deploymentName,
|
|
21543
|
+
azureOpenAIApiVersion: modelEntry.apiVersion,
|
|
21512
21544
|
tags
|
|
21513
21545
|
});
|
|
21514
21546
|
}
|
|
@@ -21608,7 +21640,7 @@ ${memorySystemPrompt}` : memorySystemPrompt;
|
|
|
21608
21640
|
}
|
|
21609
21641
|
if (options.tools) {
|
|
21610
21642
|
deepAgentOptions.tools = options.tools.tools.map(
|
|
21611
|
-
(t) => (0,
|
|
21643
|
+
(t) => (0, import_langchain4.tool)(
|
|
21612
21644
|
async (input, options2) => {
|
|
21613
21645
|
try {
|
|
21614
21646
|
const res = await t.exec(input);
|
|
@@ -21631,7 +21663,7 @@ ${memorySystemPrompt}` : memorySystemPrompt;
|
|
|
21631
21663
|
)
|
|
21632
21664
|
);
|
|
21633
21665
|
middlewares.push(
|
|
21634
|
-
(0,
|
|
21666
|
+
(0, import_langchain4.llmToolSelectorMiddleware)({
|
|
21635
21667
|
model: this.modelResolver.resolve(options.tools.model, ["tool-selector"]),
|
|
21636
21668
|
maxTools: 128,
|
|
21637
21669
|
alwaysInclude: options.tools.alwaysIncludeTools ?? void 0
|
|
@@ -21641,7 +21673,7 @@ ${memorySystemPrompt}` : memorySystemPrompt;
|
|
|
21641
21673
|
}
|
|
21642
21674
|
if (options.summarization)
|
|
21643
21675
|
middlewares.push(
|
|
21644
|
-
(0,
|
|
21676
|
+
(0, import_langchain4.summarizationMiddleware)({
|
|
21645
21677
|
model: this.modelResolver.resolve(options.summarization.model),
|
|
21646
21678
|
trigger: {
|
|
21647
21679
|
tokens: options.summarization.triggerAtTokens
|