UNPKG

@langchain/langgraph

Version:
1 lines 9.37 kB
{"version":3,"file":"retry.cjs","names":["patchConfigurable","runAttemptWithTimeout","isParentCommand","Command","getParentCheckpointNamespace","isGraphBubbleUp","CONFIG_KEY_RESUMING"],"sources":["../../src/pregel/retry.ts"],"sourcesContent":["import { Command, CONFIG_KEY_RESUMING } from \"../constants.js\";\nimport { isGraphBubbleUp, isParentCommand } from \"../errors.js\";\nimport type { LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { runAttemptWithTimeout } from \"./timeout.js\";\nimport { PregelExecutableTask } from \"./types.js\";\nimport { getParentCheckpointNamespace } from \"./utils/config.js\";\nimport { patchConfigurable, type RetryPolicy } from \"./utils/index.js\";\n\nexport const DEFAULT_INITIAL_INTERVAL = 500;\nexport const DEFAULT_BACKOFF_FACTOR = 2;\nexport const DEFAULT_MAX_INTERVAL = 128000;\nexport const DEFAULT_MAX_RETRIES = 3;\nexport const DEFAULT_JITTER = true;\n\nconst DEFAULT_STATUS_NO_RETRY = [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // Payment Required\n 403, // Forbidden\n 404, // Not Found\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 407, // Proxy Authentication Required\n 409, // Conflict\n];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst DEFAULT_RETRY_ON_HANDLER = (error: any) => {\n if (\n error.message.startsWith(\"Cancel\") ||\n error.message.startsWith(\"AbortError\") ||\n error.name === \"AbortError\"\n ) {\n return false;\n }\n\n // Thrown when interrupt is called without a checkpointer\n if (error.name === \"GraphValueError\") {\n return false;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((error as any)?.code === \"ECONNABORTED\") {\n return false;\n }\n\n const status =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any)?.response?.status ?? (error as any)?.status;\n if (status && DEFAULT_STATUS_NO_RETRY.includes(+status)) {\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((error as any)?.error?.code === \"insufficient_quota\") {\n return false;\n }\n return true;\n};\n\nexport type SettledPregelTask = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n task: PregelExecutableTask<any, any>;\n error: Error;\n signalAborted?: boolean;\n};\n\nexport async function _runWithRetry<\n N extends PropertyKey,\n C extends PropertyKey,\n>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pregelTask: PregelExecutableTask<N, C>,\n retryPolicy?: RetryPolicy,\n configurable?: Record<string, unknown>,\n signal?: AbortSignal\n): Promise<{\n task: PregelExecutableTask<N, C>;\n result: unknown;\n error: Error | undefined;\n signalAborted?: boolean;\n}> {\n const resolvedRetryPolicy = pregelTask.retry_policy ?? retryPolicy;\n let attempts = 0;\n let error;\n let result;\n\n let config: LangGraphRunnableConfig = pregelTask.config ?? {};\n if (configurable) {\n config = patchConfigurable(config, configurable);\n }\n config = { ...config, signal };\n\n const firstAttemptTime = Date.now();\n if (config.executionInfo != null) {\n config.executionInfo = {\n ...config.executionInfo,\n nodeFirstAttemptTime: firstAttemptTime,\n };\n }\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (signal?.aborted) {\n // no need to throw here - we'll throw from the runner, instead.\n // there's just no point in retrying if the user has requested an abort.\n break;\n }\n // Clear any writes from previous attempts\n pregelTask.writes.splice(0, pregelTask.writes.length);\n error = undefined;\n try {\n if (pregelTask.timeout !== undefined) {\n // Enforce a per-attempt timeout. The timer resets on each retry since\n // a fresh attempt scope is created here per iteration.\n result = await runAttemptWithTimeout(\n pregelTask as PregelExecutableTask<string, string>,\n config,\n pregelTask.timeout,\n (scopedConfig) =>\n pregelTask.proc.invoke(pregelTask.input, scopedConfig)\n );\n } else {\n result = await pregelTask.proc.invoke(pregelTask.input, config);\n }\n break;\n } catch (e: unknown) {\n error = e;\n (error as { pregelTaskId: string }).pregelTaskId = pregelTask.id;\n if (isParentCommand(error)) {\n const ns: string = config?.configurable?.checkpoint_ns;\n const cmd = error.command;\n if (cmd.graph === ns) {\n // this command is for the current graph, handle it\n for (const writer of pregelTask.writers) {\n await writer.invoke(cmd, config);\n }\n error = undefined;\n break;\n } else if (cmd.graph === Command.PARENT) {\n // this command is for the parent graph, assign it to the parent\n const parentNs = getParentCheckpointNamespace(ns);\n error.command = new Command({\n ...error.command,\n graph: parentNs,\n });\n }\n }\n if (isGraphBubbleUp(error)) {\n break;\n }\n if (resolvedRetryPolicy === undefined) {\n break;\n }\n attempts += 1;\n // check if we should give up\n if (\n attempts >= (resolvedRetryPolicy.maxAttempts ?? DEFAULT_MAX_RETRIES)\n ) {\n break;\n }\n const retryOn = resolvedRetryPolicy.retryOn ?? DEFAULT_RETRY_ON_HANDLER;\n if (!retryOn(error)) {\n break;\n }\n const initialInterval =\n resolvedRetryPolicy.initialInterval ?? DEFAULT_INITIAL_INTERVAL;\n const interval = Math.min(\n resolvedRetryPolicy.maxInterval ?? DEFAULT_MAX_INTERVAL,\n initialInterval *\n (resolvedRetryPolicy.backoffFactor ?? DEFAULT_BACKOFF_FACTOR) **\n (attempts - 1)\n );\n const sleepMs =\n (resolvedRetryPolicy.jitter ?? DEFAULT_JITTER)\n ? interval + Math.random() * 1000\n : interval;\n // sleep before retrying\n // eslint-disable-next-line no-promise-executor-return\n await new Promise((resolve) => setTimeout(resolve, sleepMs));\n // log the retry\n const errorName =\n (error as Error).name ??\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((error as Error).constructor as any).unminifiable_name ??\n (error as Error).constructor.name;\n if (resolvedRetryPolicy?.logWarning ?? true) {\n console.log(\n `Retrying task \"${String(pregelTask.name)}\" after ${sleepMs.toFixed(\n 2\n )}ms (attempt ${attempts}) after ${errorName}: ${error}`\n );\n }\n\n // signal subgraphs to resume (if available)\n config = patchConfigurable(config, { [CONFIG_KEY_RESUMING]: true });\n\n if (config.executionInfo != null) {\n config.executionInfo = {\n ...config.executionInfo,\n nodeAttempt: attempts + 1,\n nodeFirstAttemptTime: firstAttemptTime,\n };\n }\n }\n }\n return {\n task: pregelTask,\n result,\n error: error as Error | undefined,\n signalAborted: signal?.aborted,\n };\n}\n"],"mappings":"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"}