{"version":3,"file":"modelFallback.cjs","names":["createMiddleware","initChatModel"],"sources":["../../../src/agents/middleware/modelFallback.ts"],"sourcesContent":["import type { AgentLanguageModelLike as LanguageModelLike } from \"../model.js\";\nimport { initChatModel } from \"../../chat_models/universal.js\";\nimport { createMiddleware } from \"../middleware.js\";\n\n/**\n * Middleware that provides automatic model fallback on errors.\n *\n * This middleware attempts to retry failed model calls with alternative models\n * in sequence. When a model call fails, it tries the next model in the fallback\n * list until either a call succeeds or all models have been exhausted.\n *\n * @example\n * ```ts\n * import { createAgent, modelFallbackMiddleware } from \"langchain\";\n *\n * // Create middleware with fallback models (not including primary)\n * const fallback = modelFallbackMiddleware(\n *   \"openai:gpt-4o-mini\",  // First fallback\n *   \"anthropic:claude-sonnet-4-5-20250929\",  // Second fallback\n * );\n *\n * const agent = createAgent({\n *   model: \"openai:gpt-4o\",  // Primary model\n *   middleware: [fallback],\n *   tools: [],\n * });\n *\n * // If gpt-4o fails, automatically tries gpt-4o-mini, then claude\n * const result = await agent.invoke({\n *   messages: [{ role: \"user\", content: \"Hello\" }]\n * });\n * ```\n *\n * @param fallbackModels - The fallback models to try, in order.\n * @returns A middleware instance that handles model failures with fallbacks\n */\nexport function modelFallbackMiddleware(\n  /**\n   * The fallback models to try, in order.\n   */\n  ...fallbackModels: (string | LanguageModelLike)[]\n) {\n  return createMiddleware({\n    name: \"modelFallbackMiddleware\",\n    wrapModelCall: async (request, handler) => {\n      /**\n       * Try the primary model first\n       */\n      try {\n        return await handler(request);\n      } catch (error) {\n        /**\n         * If primary model fails, try fallback models in sequence\n         */\n        for (let i = 0; i < fallbackModels.length; i++) {\n          try {\n            const fallbackModel = fallbackModels[i];\n            const model =\n              typeof fallbackModel === \"string\"\n                ? await initChatModel(fallbackModel)\n                : fallbackModel;\n\n            return await handler({\n              ...request,\n              model,\n            });\n          } catch (fallbackError) {\n            /**\n             * If this is the last fallback, throw the error\n             */\n            if (i === fallbackModels.length - 1) {\n              throw fallbackError;\n            }\n            // Otherwise, continue to next fallback\n          }\n        }\n        /**\n         * If no fallbacks were provided, re-throw the original error\n         */\n        throw error;\n      }\n    },\n  });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,wBAId,GAAG,gBACH;AACA,QAAOA,mBAAAA,iBAAiB;EACtB,MAAM;EACN,eAAe,OAAO,SAAS,YAAY;;;;AAIzC,OAAI;AACF,WAAO,MAAM,QAAQ,QAAQ;YACtB,OAAO;;;;AAId,SAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,IACzC,KAAI;KACF,MAAM,gBAAgB,eAAe;KACrC,MAAM,QACJ,OAAO,kBAAkB,WACrB,MAAMC,8BAAAA,cAAc,cAAc,GAClC;AAEN,YAAO,MAAM,QAAQ;MACnB,GAAG;MACH;MACD,CAAC;aACK,eAAe;;;;AAItB,SAAI,MAAM,eAAe,SAAS,EAChC,OAAM;;;;;AAQZ,UAAM;;;EAGX,CAAC"}