{"version":3,"file":"modelRouter.cjs","names":["z","decider","initChatModel","createMiddleware","HumanMessage"],"sources":["../../../../../src/agents/middleware/provider/openai/modelRouter.ts"],"sourcesContent":["import { z } from \"zod/v4\";\nimport { HumanMessage } from \"@langchain/core/messages\";\nimport { createMiddleware } from \"../../../middleware.js\";\nimport { initChatModel } from \"../../../../chat_models/universal.js\";\nimport type { AgentLanguageModelLike } from \"../../../model.js\";\nimport type { ModelChoice } from \"../../modelRouter.js\";\nimport { decider, type OpenAIDecisionsLike } from \"./decisions.js\";\n\nexport interface OpenAIModelRouterMiddlewareOptions {\n  /** Named models and the criterion for choosing each. */\n  choices: Record<string, ModelChoice & { criteria: string }>;\n  /** The routing question, e.g. \"Choose the least costly model for the task.\" */\n  instructions: string;\n  /** An `OpenAIDecisions` instance from `@langchain/openai`. */\n  model: OpenAIDecisionsLike;\n}\n\nconst routeSchema = z.object({\n  choice: z.string(),\n  confidence: z.number(),\n  probabilities: z.array(\n    z.object({ value: z.string(), probability: z.number() })\n  ),\n});\n\n/**\n * Routes each agent run to one of several models with the OpenAI Decisions API\n * (beta).\n *\n * Classifies the latest human message once per run and stores the answer in\n * `modelRoute`, then uses the chosen model for every model call in that run. With\n * no human message, or a refusal, the agent's own model is used.\n */\nexport function openAIModelRouterMiddleware(\n  options: OpenAIModelRouterMiddlewareOptions\n) {\n  const routes = Object.keys(options.choices);\n  if (!routes.length)\n    throw new Error(\n      \"openAIModelRouterMiddleware requires at least one choice.\"\n    );\n  if (!options.instructions.trim())\n    throw new Error(\n      \"openAIModelRouterMiddleware instructions must not be empty.\"\n    );\n  const decide = decider(options.model, {\n    model_route: {\n      type: \"choice\",\n      instructions: options.instructions,\n      choices: Object.fromEntries(\n        routes.map((route) => [route, options.choices[route].criteria])\n      ),\n    },\n  });\n  const models = new Map<string, Promise<AgentLanguageModelLike>>();\n  const modelFor = (route: string) => {\n    if (!Object.hasOwn(options.choices, route))\n      throw new Error(`Unknown model route \"${route}\".`);\n    if (!models.has(route)) {\n      const choice = options.choices[route];\n      const pending = Promise.resolve(\n        typeof choice.model === \"string\"\n          ? initChatModel(choice.model)\n          : choice.model\n      );\n      pending.catch(() => models.delete(route));\n      models.set(route, pending);\n    }\n    return models.get(route)!;\n  };\n\n  return createMiddleware({\n    name: \"OpenAIModelRouterMiddleware\",\n    stateSchema: z.object({ modelRoute: routeSchema.nullable().optional() }),\n    async beforeAgent(state, runtime) {\n      const message = [...state.messages]\n        .reverse()\n        .find((message) => HumanMessage.isInstance(message));\n      if (!message) return { modelRoute: null };\n      const answer = await decide(message, runtime.signal);\n      if (answer?.type !== \"choice\") return { modelRoute: null };\n      if (!Object.hasOwn(options.choices, answer.choice))\n        throw new Error(\n          `OpenAI Decisions selected unknown model route \"${answer.choice}\".`\n        );\n      const { choice, confidence, probabilities } = answer;\n      return { modelRoute: { choice, confidence, probabilities } };\n    },\n    async wrapModelCall(request, handler) {\n      const route = request.state.modelRoute;\n      if (!route) return handler(request);\n      return handler({ ...request, model: await modelFor(route.choice) });\n    },\n  });\n}\n"],"mappings":";;;;;;AAiBA,MAAM,cAAcA,OAAAA,EAAE,OAAO;CAC3B,QAAQA,OAAAA,EAAE,OAAO;CACjB,YAAYA,OAAAA,EAAE,OAAO;CACrB,eAAeA,OAAAA,EAAE,MACfA,OAAAA,EAAE,OAAO;EAAE,OAAOA,OAAAA,EAAE,OAAO;EAAG,aAAaA,OAAAA,EAAE,OAAO;CAAE,CAAC,CACzD;AACF,CAAC;;;;;;;;;AAUD,SAAgB,4BACd,SACA;CACA,MAAM,SAAS,OAAO,KAAK,QAAQ,OAAO;CAC1C,IAAI,CAAC,OAAO,QACV,MAAM,IAAI,MACR,2DACF;CACF,IAAI,CAAC,QAAQ,aAAa,KAAK,GAC7B,MAAM,IAAI,MACR,6DACF;CACF,MAAM,SAASC,kBAAAA,QAAQ,QAAQ,OAAO,EACpC,aAAa;EACX,MAAM;EACN,cAAc,QAAQ;EACtB,SAAS,OAAO,YACd,OAAO,KAAK,UAAU,CAAC,OAAO,QAAQ,QAAQ,MAAM,CAAC,QAAQ,CAAC,CAChE;CACF,EACF,CAAC;CACD,MAAM,yBAAS,IAAI,IAA6C;CAChE,MAAM,YAAY,UAAkB;EAClC,IAAI,CAAC,OAAO,OAAO,QAAQ,SAAS,KAAK,GACvC,MAAM,IAAI,MAAM,wBAAwB,MAAM,GAAG;EACnD,IAAI,CAAC,OAAO,IAAI,KAAK,GAAG;GACtB,MAAM,SAAS,QAAQ,QAAQ;GAC/B,MAAM,UAAU,QAAQ,QACtB,OAAO,OAAO,UAAU,WACpBC,8BAAAA,cAAc,OAAO,KAAK,IAC1B,OAAO,KACb;GACA,QAAQ,YAAY,OAAO,OAAO,KAAK,CAAC;GACxC,OAAO,IAAI,OAAO,OAAO;EAC3B;EACA,OAAO,OAAO,IAAI,KAAK;CACzB;CAEA,OAAOC,mBAAAA,iBAAiB;EACtB,MAAM;EACN,aAAaH,OAAAA,EAAE,OAAO,EAAE,YAAY,YAAY,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC;EACvE,MAAM,YAAY,OAAO,SAAS;GAChC,MAAM,UAAU,CAAC,GAAG,MAAM,QAAQ,CAAC,CAChC,QAAQ,CAAC,CACT,MAAM,YAAYI,yBAAAA,aAAa,WAAW,OAAO,CAAC;GACrD,IAAI,CAAC,SAAS,OAAO,EAAE,YAAY,KAAK;GACxC,MAAM,SAAS,MAAM,OAAO,SAAS,QAAQ,MAAM;GACnD,IAAI,QAAQ,SAAS,UAAU,OAAO,EAAE,YAAY,KAAK;GACzD,IAAI,CAAC,OAAO,OAAO,QAAQ,SAAS,OAAO,MAAM,GAC/C,MAAM,IAAI,MACR,kDAAkD,OAAO,OAAO,GAClE;GACF,MAAM,EAAE,QAAQ,YAAY,kBAAkB;GAC9C,OAAO,EAAE,YAAY;IAAE;IAAQ;IAAY;GAAc,EAAE;EAC7D;EACA,MAAM,cAAc,SAAS,SAAS;GACpC,MAAM,QAAQ,QAAQ,MAAM;GAC5B,IAAI,CAAC,OAAO,OAAO,QAAQ,OAAO;GAClC,OAAO,QAAQ;IAAE,GAAG;IAAS,OAAO,MAAM,SAAS,MAAM,MAAM;GAAE,CAAC;EACpE;CACF,CAAC;AACH"}