From ef65d3cf8804f1a46b2f8c4ada8a1e89822dc7ff Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Wed, 20 Aug 2025 07:42:33 -0700 Subject: [PATCH 01/58] chore(cli): Update OpenAPI spec from LangGraph API v0.2.137 (#5967) This PR updates the OpenAPI specification with changes detected from the LangGraph API server. **Changes detected as of LangGraph API version 0.2.137** This update was automatically generated by the sync workflow in the langgraph-api repository. Co-authored-by: hinthornw --- docs/docs/cloud/reference/api/openapi.json | 539 ++++++++++++++++----- 1 file changed, 411 insertions(+), 128 deletions(-) diff --git a/docs/docs/cloud/reference/api/openapi.json b/docs/docs/cloud/reference/api/openapi.json index 7c3684811..212a65a74 100644 --- a/docs/docs/cloud/reference/api/openapi.json +++ b/docs/docs/cloud/reference/api/openapi.json @@ -41,7 +41,9 @@ "paths": { "/assistants": { "post": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Create Assistant", "description": "Create an assistant.\n\nAn initial version of the assistant will be created and the assistant is set to that version. To change versions, use the `POST /assistants/{assistant_id}/latest` endpoint.", "operationId": "create_assistant_assistants_post", @@ -101,7 +103,9 @@ }, "/assistants/search": { "post": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Search Assistants", "description": "Search for assistants.\n\nThis endpoint also functions as the endpoint to list all assistants.", "operationId": "search_assistants_assistants_search_post", @@ -155,7 +159,9 @@ }, "/assistants/count": { "post": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Count Assistants", "description": "Get the count of assistants matching the specified criteria.", "operationId": "count_assistants_assistants_count_post", @@ -206,7 +212,9 @@ }, "/assistants/{assistant_id}": { "get": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Get Assistant", "description": "Get an assistant by ID.", "operationId": "get_assistant_assistants__assistant_id__get", @@ -248,7 +256,9 @@ } }, "delete": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Delete Assistant", "description": "Delete an assistant by ID.\n\nAll versions of the assistant will be deleted as well.", "operationId": "delete_assistant_assistants__assistant_id__delete", @@ -298,7 +308,9 @@ } }, "patch": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Patch Assistant", "description": "Update an assistant.", "operationId": "patch_assistant_assistants__assistant_id__patch", @@ -362,7 +374,9 @@ }, "/assistants/{assistant_id}/graph": { "get": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Get Assistant Graph", "description": "Get an assistant by ID.", "operationId": "get_assistant_graph_assistants__assistant_id__graph_get", @@ -451,7 +465,9 @@ }, "/assistants/{assistant_id}/subgraphs": { "get": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Get Assistant Subgraphs", "description": "Get an assistant's subgraphs.", "operationId": "get_assistant_subgraphs_assistants__assistant_id__subgraphs_get", @@ -515,7 +531,9 @@ }, "/assistants/{assistant_id}/subgraphs/{namespace}": { "get": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Get Assistant Subgraphs by Namespace", "description": "Get an assistant's subgraphs filtered by namespace.", "operationId": "get_assistant_subgraphs_assistants__assistant_id__subgraphs__namespace__get", @@ -579,7 +597,9 @@ }, "/assistants/{assistant_id}/schemas": { "get": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Get Assistant Schemas", "description": "Get an assistant by ID.", "operationId": "get_assistant_schemas_assistants__assistant_id__schemas_get", @@ -633,7 +653,9 @@ }, "/assistants/{assistant_id}/versions": { "post": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Get Assistant Versions", "description": "Get all versions of an assistant.", "operationId": "get_assistant_versions_assistants__assistant_id__versions_get", @@ -681,7 +703,9 @@ }, "/assistants/{assistant_id}/latest": { "post": { - "tags": ["Assistants"], + "tags": [ + "Assistants" + ], "summary": "Set Latest Assistant Version", "description": "Set the latest version for an assistant.", "operationId": "set_latest_assistant_version_assistants__assistant_id__versions_post", @@ -746,7 +770,9 @@ }, "/threads": { "post": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Create Thread", "description": "Create a thread.", "operationId": "create_thread_threads_post", @@ -796,7 +822,9 @@ }, "/threads/search": { "post": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Search Threads", "description": "Search for threads.\n\nThis endpoint also functions as the endpoint to list all threads.", "operationId": "search_threads_threads_search_post", @@ -840,7 +868,9 @@ }, "/threads/count": { "post": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Count Threads", "description": "Get the count of threads matching the specified criteria.", "operationId": "count_threads_threads_count_post", @@ -891,7 +921,9 @@ }, "/threads/{thread_id}/state": { "get": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Get Thread State", "description": "Get state for a thread.\n\nThe latest state of the thread (i.e. latest checkpoint) is returned.", "operationId": "get_latest_thread_state_threads__thread_id__state_get", @@ -944,7 +976,9 @@ } }, "post": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Update Thread State", "description": "Add state to a thread.", "operationId": "update_thread_state_threads__thread_id__state_post", @@ -998,7 +1032,9 @@ }, "/threads/{thread_id}/state/{checkpoint_id}": { "get": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Get Thread State At Checkpoint", "description": "Get state for a thread at a specific checkpoint.", "operationId": "get_thread_state_at_checkpoint_threads__thread_id__state__checkpoint_id__get", @@ -1065,7 +1101,9 @@ }, "/threads/{thread_id}/state/checkpoint": { "post": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Get Thread State At Checkpoint", "description": "Get state for a thread at a specific checkpoint.", "operationId": "post_thread_state_at_checkpoint_threads__thread_id__state__checkpoint_id__get", @@ -1129,7 +1167,9 @@ }, "/threads/{thread_id}/history": { "get": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Get Thread History", "description": "Get all past states for a thread.", "operationId": "get_thread_history_threads__thread_id__history_get", @@ -1194,7 +1234,9 @@ } }, "post": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Get Thread History Post", "description": "Get all past states for a thread.", "operationId": "get_thread_history_post_threads__thread_id__history_post", @@ -1252,7 +1294,9 @@ }, "/threads/{thread_id}/copy": { "post": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Copy Thread", "description": "Create a new thread with a copy of the state and checkpoints from an existing thread.", "operationId": "copy_thread_post_threads__thread_id__copy_post", @@ -1306,7 +1350,9 @@ }, "/threads/{thread_id}": { "get": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Get Thread", "description": "Get a thread by ID.", "operationId": "get_thread_threads__thread_id__get", @@ -1358,7 +1404,9 @@ } }, "delete": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Delete Thread", "description": "Delete a thread by ID.", "operationId": "delete_thread_threads__thread_id__delete", @@ -1408,7 +1456,9 @@ } }, "patch": { - "tags": ["Threads"], + "tags": [ + "Threads" + ], "summary": "Patch Thread", "description": "Update a thread.", "operationId": "patch_thread_threads__thread_id__patch", @@ -1472,7 +1522,9 @@ }, "/threads/{thread_id}/runs": { "get": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "List Runs", "description": "List runs for a thread.", "operationId": "list_runs_http_threads__thread_id__runs_get", @@ -1513,7 +1565,13 @@ "required": false, "schema": { "type": "string", - "enum": ["pending", "error", "success", "timeout", "interrupted"] + "enum": [ + "pending", + "error", + "success", + "timeout", + "interrupted" + ] }, "name": "status", "in": "query" @@ -1580,7 +1638,9 @@ } }, "post": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "Create Background Run", "description": "Create a run in existing thread, return the run ID immediately. Don't wait for the final run output.", "operationId": "create_run_threads__thread_id__runs_post", @@ -1662,7 +1722,9 @@ }, "/threads/{thread_id}/runs/crons": { "post": { - "tags": ["Crons (Plus tier)"], + "tags": [ + "Crons (Plus tier)" + ], "summary": "Create Thread Cron", "description": "Create a cron to schedule runs on a thread.", "operationId": "create_thread_cron_threads__thread_id__runs_crons_post", @@ -1726,7 +1788,9 @@ }, "/threads/{thread_id}/runs/stream": { "post": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "Create Run, Stream Output", "description": "Create a run in existing thread. Stream the output.", "operationId": "stream_run_threads__thread_id__runs_stream_post", @@ -1809,7 +1873,9 @@ }, "/threads/{thread_id}/runs/wait": { "post": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "Create Run, Wait for Output", "description": "Create a run in existing thread. Wait for the final output and then return it.", "operationId": "wait_run_threads__thread_id__runs_wait_post", @@ -1889,7 +1955,9 @@ }, "/threads/{thread_id}/runs/{run_id}": { "get": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "Get Run", "description": "Get a run by ID.", "operationId": "get_run_http_threads__thread_id__runs__run_id__get", @@ -1953,7 +2021,9 @@ } }, "delete": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "Delete Run", "description": "Delete a run by ID.", "operationId": "delete_run_threads__thread_id__runs__run_id__delete", @@ -2017,7 +2087,9 @@ }, "/threads/{thread_id}/runs/{run_id}/join": { "get": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "Join Run", "description": "Wait for a run to finish.", "operationId": "join_run_http_threads__thread_id__runs__run_id__join_get", @@ -2092,7 +2164,9 @@ }, "/threads/{thread_id}/runs/{run_id}/stream": { "get": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "Join Run Stream", "description": "Join a run stream. This endpoint streams output in real-time from a run similar to the /threads/__THREAD_ID__/runs/stream endpoint. If the run has been created with `stream_resumable=true`, the stream can be resumed from the last seen event ID.", "operationId": "stream_run_http_threads__thread_id__runs__run_id__join_get", @@ -2190,7 +2264,9 @@ }, "/threads/{thread_id}/runs/{run_id}/cancel": { "post": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "Cancel Run", "operationId": "cancel_run_http_threads__thread_id__runs__run_id__cancel_post", "parameters": [ @@ -2233,7 +2309,10 @@ "required": false, "schema": { "type": "string", - "enum": ["interrupt", "rollback"], + "enum": [ + "interrupt", + "rollback" + ], "title": "Action", "default": "interrupt" }, @@ -2275,7 +2354,9 @@ }, "/runs/crons": { "post": { - "tags": ["Crons (Plus tier)"], + "tags": [ + "Crons (Plus tier)" + ], "summary": "Create Cron", "description": "Create a cron to schedule runs on new threads.", "operationId": "create_cron_runs_crons_post", @@ -2325,7 +2406,9 @@ }, "/runs/crons/search": { "post": { - "tags": ["Crons (Plus tier)"], + "tags": [ + "Crons (Plus tier)" + ], "summary": "Search Crons", "description": "Search all active crons", "operationId": "search_crons_runs_crons_post", @@ -2369,7 +2452,9 @@ }, "/runs/crons/count": { "post": { - "tags": ["Crons (Plus tier)"], + "tags": [ + "Crons (Plus tier)" + ], "summary": "Count Crons", "description": "Get the count of crons matching the specified criteria.", "operationId": "count_crons_runs_crons_count_post", @@ -2420,7 +2505,9 @@ }, "/runs/stream": { "post": { - "tags": ["Stateless Runs"], + "tags": [ + "Stateless Runs" + ], "summary": "Create Run, Stream Output", "description": "Create a run in a new thread, stream the output.", "operationId": "stream_run_stateless_runs_stream_post", @@ -2489,7 +2576,9 @@ }, "/runs/cancel": { "post": { - "tags": ["Thread Runs"], + "tags": [ + "Thread Runs" + ], "summary": "Cancel Runs", "description": "Cancel one or more runs. Can cancel runs by thread ID and run IDs, or by status filter.", "operationId": "cancel_runs_post", @@ -2499,7 +2588,10 @@ "required": false, "schema": { "type": "string", - "enum": ["interrupt", "rollback"], + "enum": [ + "interrupt", + "rollback" + ], "title": "Action", "default": "interrupt" }, @@ -2546,7 +2638,9 @@ }, "/runs/wait": { "post": { - "tags": ["Stateless Runs"], + "tags": [ + "Stateless Runs" + ], "summary": "Create Run, Wait for Output", "description": "Create a run in a new thread. Wait for the final output and then return it.", "operationId": "wait_run_stateless_runs_wait_post", @@ -2612,7 +2706,9 @@ }, "/runs": { "post": { - "tags": ["Stateless Runs"], + "tags": [ + "Stateless Runs" + ], "summary": "Create Background Run", "description": "Create a run in a new thread, return the run ID immediately. Don't wait for the final run output.", "operationId": "run_stateless_runs_post", @@ -2678,7 +2774,9 @@ }, "/runs/batch": { "post": { - "tags": ["Stateless Runs"], + "tags": [ + "Stateless Runs" + ], "summary": "Create Run Batch", "description": "Create a batch of runs in new threads, return immediately.", "operationId": "run_batch_stateless_runs_post", @@ -2736,7 +2834,9 @@ }, "/runs/crons/{cron_id}": { "delete": { - "tags": ["Crons (Plus tier)"], + "tags": [ + "Crons (Plus tier)" + ], "summary": "Delete Cron", "description": "Delete a cron by ID.", "operationId": "delete_cron_runs_crons__cron_id__delete", @@ -2786,7 +2886,9 @@ }, "/store/items": { "put": { - "tags": ["Store"], + "tags": [ + "Store" + ], "summary": "Store or update an item.", "operationId": "put_item", "requestBody": { @@ -2816,7 +2918,9 @@ } }, "delete": { - "tags": ["Store"], + "tags": [ + "Store" + ], "summary": "Delete an item.", "operationId": "delete_item", "requestBody": { @@ -2846,7 +2950,9 @@ } }, "get": { - "tags": ["Store"], + "tags": [ + "Store" + ], "summary": "Retrieve a single item.", "operationId": "get_item", "parameters": [ @@ -2906,7 +3012,9 @@ }, "/store/items/search": { "post": { - "tags": ["Store"], + "tags": [ + "Store" + ], "summary": "Search for items within a namespace prefix.", "operationId": "search_items", "requestBody": { @@ -2945,7 +3053,9 @@ }, "/store/namespaces": { "post": { - "tags": ["Store"], + "tags": [ + "Store" + ], "summary": "List namespaces with optional match conditions.", "operationId": "list_namespaces", "requestBody": { @@ -2994,7 +3104,9 @@ "required": true, "schema": { "type": "string", - "enum": ["application/json, text/event-stream"] + "enum": [ + "application/json, text/event-stream" + ] }, "description": "Accept header must include both 'application/json' and 'text/event-stream' media types." } @@ -3047,7 +3159,9 @@ "description": "Internal server error or unexpected failure." } }, - "tags": ["MCP"] + "tags": [ + "MCP" + ] }, "get": { "operationId": "get_mcp", @@ -3058,7 +3172,9 @@ "description": "GET method not allowed; streaming not supported." } }, - "tags": ["MCP"] + "tags": [ + "MCP" + ] }, "delete": { "operationId": "delete_mcp", @@ -3067,12 +3183,16 @@ "responses": { "404": {} }, - "tags": ["MCP"] + "tags": [ + "MCP" + ] } }, "/info": { "get": { - "tags": ["System"], + "tags": [ + "System" + ], "summary": "Server Information", "description": "Get server version information, feature flags, and metadata.", "operationId": "server_info_info_get", @@ -3105,12 +3225,7 @@ "description": "Server deployment metadata" } }, - "required": [ - "version", - "langgraph_py_version", - "flags", - "metadata" - ], + "required": ["version", "langgraph_py_version", "flags", "metadata"], "title": "ServerInfo" } } @@ -3121,7 +3236,9 @@ }, "/metrics": { "get": { - "tags": ["System"], + "tags": [ + "System" + ], "summary": "System Metrics", "description": "Get system metrics in Prometheus or JSON format for monitoring and observability.", "operationId": "system_metrics_metrics_get", @@ -3164,7 +3281,9 @@ }, "/ok": { "get": { - "tags": ["System"], + "tags": [ + "System" + ], "summary": "Health Check", "description": "Check the health status of the server. Optionally check database connectivity.", "operationId": "health_check_ok_get", @@ -3287,7 +3406,10 @@ "description": "The name of the assistant" }, "description": { - "type": ["string", "null"], + "type": [ + "string", + "null" + ], "title": "Assistant Description", "description": "The description of the assistant" } @@ -3333,7 +3455,10 @@ }, "if_exists": { "type": "string", - "enum": ["raise", "do_nothing"], + "enum": [ + "raise", + "do_nothing" + ], "title": "If Exists", "description": "How to handle duplicate creation. Must be either 'raise' (raise error if duplicate), or 'do_nothing' (return existing assistant).", "default": "raise" @@ -3344,13 +3469,18 @@ "description": "The name of the assistant. Defaults to 'Untitled'." }, "description": { - "type": ["string", "null"], + "type": [ + "string", + "null" + ], "title": "Description", "description": "The description of the assistant. Defaults to null." } }, "type": "object", - "required": ["graph_id"], + "required": [ + "graph_id" + ], "title": "AssistantCreate", "description": "Payload for creating an assistant." }, @@ -3588,7 +3718,9 @@ "anyOf": [ { "type": "string", - "enum": ["*"] + "enum": [ + "*" + ] }, { "items": { @@ -3604,7 +3736,9 @@ "anyOf": [ { "type": "string", - "enum": ["*"] + "enum": [ + "*" + ] }, { "items": { @@ -3618,14 +3752,22 @@ }, "multitask_strategy": { "type": "string", - "enum": ["reject", "rollback", "interrupt", "enqueue"], + "enum": [ + "reject", + "rollback", + "interrupt", + "enqueue" + ], "title": "Multitask Strategy", "description": "Multitask strategy to use. Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'.", "default": "enqueue" } }, "type": "object", - "required": ["assistant_id", "schedule"], + "required": [ + "assistant_id", + "schedule" + ], "title": "CronCreate", "description": "Payload for creating a cron job." }, @@ -3663,15 +3805,7 @@ "title": "Sort By", "description": "The field to sort by.", "default": "created_at", - "enum": [ - "cron_id", - "assistant_id", - "thread_id", - "next_run_date", - "end_time", - "created_at", - "updated_at" - ] + "enum": ["cron_id", "assistant_id", "thread_id", "next_run_date", "end_time", "created_at", "updated_at"] }, "sort_order": { "type": "string", @@ -3761,7 +3895,10 @@ } }, "type": "object", - "required": ["graph_id", "state_schema"], + "required": [ + "graph_id", + "state_schema" + ], "title": "GraphSchema", "description": "Defines the structure and properties of a graph." }, @@ -3794,7 +3931,11 @@ } }, "type": "object", - "required": ["input_schema", "output_schema", "state_schema"], + "required": [ + "input_schema", + "output_schema", + "state_schema" + ], "title": "GraphSchemaNoId", "description": "Defines the structure and properties of a graph without an ID." }, @@ -3862,7 +4003,12 @@ }, "multitask_strategy": { "type": "string", - "enum": ["reject", "rollback", "interrupt", "enqueue"], + "enum": [ + "reject", + "rollback", + "interrupt", + "enqueue" + ], "title": "Multitask Strategy", "description": "Strategy to handle concurrent runs on the same thread." } @@ -3892,12 +4038,22 @@ "description": "The node to send the message to." }, "input": { - "type": ["object", "array", "number", "string", "boolean", "null"], + "type": [ + "object", + "array", + "number", + "string", + "boolean", + "null" + ], "title": "Message", "description": "The message to send." } }, - "required": ["node", "input"] + "required": [ + "node", + "input" + ] }, "Command": { "type": "object", @@ -3905,12 +4061,23 @@ "description": "The command to run.", "properties": { "update": { - "type": ["object", "array", "null"], + "type": [ + "object", + "array", + "null" + ], "title": "Update", "description": "An update to the state." }, "resume": { - "type": ["object", "array", "number", "string", "boolean", "null"], + "type": [ + "object", + "array", + "number", + "string", + "boolean", + "null" + ], "title": "Resume", "description": "A value to pass to an interrupted node." }, @@ -4045,7 +4212,9 @@ "anyOf": [ { "type": "string", - "enum": ["*"] + "enum": [ + "*" + ] }, { "items": { @@ -4061,7 +4230,9 @@ "anyOf": [ { "type": "string", - "enum": ["*"] + "enum": [ + "*" + ] }, { "items": { @@ -4109,7 +4280,9 @@ ], "title": "Stream Mode", "description": "The stream mode(s) to use.", - "default": ["values"] + "default": [ + "values" + ] }, "stream_subgraphs": { "type": "boolean", @@ -4125,7 +4298,10 @@ }, "on_disconnect": { "type": "string", - "enum": ["cancel", "continue"], + "enum": [ + "cancel", + "continue" + ], "title": "On Disconnect", "description": "The disconnect mode to use. Must be one of 'cancel' or 'continue'.", "default": "cancel" @@ -4140,14 +4316,22 @@ }, "multitask_strategy": { "type": "string", - "enum": ["reject", "rollback", "interrupt", "enqueue"], + "enum": [ + "reject", + "rollback", + "interrupt", + "enqueue" + ], "title": "Multitask Strategy", "description": "Multitask strategy to use. Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'.", "default": "enqueue" }, "if_not_exists": { "type": "string", - "enum": ["create", "reject"], + "enum": [ + "create", + "reject" + ], "title": "If Not Exists", "description": "How to handle missing thread. Must be either 'reject' (raise error if missing), or 'create' (create new thread).", "default": "reject" @@ -4165,7 +4349,9 @@ } }, "type": "object", - "required": ["assistant_id"], + "required": [ + "assistant_id" + ], "title": "RunCreateStateful", "description": "Payload for creating a run." }, @@ -4274,7 +4460,9 @@ "anyOf": [ { "type": "string", - "enum": ["*"] + "enum": [ + "*" + ] }, { "items": { @@ -4290,7 +4478,9 @@ "anyOf": [ { "type": "string", - "enum": ["*"] + "enum": [ + "*" + ] }, { "items": { @@ -4338,7 +4528,9 @@ ], "title": "Stream Mode", "description": "The stream mode(s) to use.", - "default": ["values"] + "default": [ + "values" + ] }, "feedback_keys": { "items": { @@ -4362,14 +4554,20 @@ }, "on_completion": { "type": "string", - "enum": ["delete", "keep"], + "enum": [ + "delete", + "keep" + ], "title": "On Completion", "description": "Whether to delete or keep the thread created for a stateless run. Must be one of 'delete' or 'keep'.", "default": "delete" }, "on_disconnect": { "type": "string", - "enum": ["cancel", "continue"], + "enum": [ + "cancel", + "continue" + ], "title": "On Disconnect", "description": "The disconnect mode to use. Must be one of 'cancel' or 'continue'.", "default": "cancel" @@ -4387,7 +4585,9 @@ } }, "type": "object", - "required": ["assistant_id"], + "required": [ + "assistant_id" + ], "title": "RunCreateStateless", "description": "Payload for creating a run." }, @@ -4432,7 +4632,10 @@ }, "sort_order": { "type": "string", - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "title": "Sort Order", "description": "The order to sort by." }, @@ -4442,7 +4645,7 @@ "type": "string", "enum": [ "assistant_id", - "graph_id", + "graph_id", "name", "description", "config", @@ -4519,7 +4722,12 @@ }, "status": { "type": "string", - "enum": ["idle", "busy", "interrupted", "error"], + "enum": [ + "idle", + "busy", + "interrupted", + "error" + ], "title": "Status", "description": "Thread status to filter on." }, @@ -4540,13 +4748,21 @@ }, "sort_by": { "type": "string", - "enum": ["thread_id", "status", "created_at", "updated_at"], + "enum": [ + "thread_id", + "status", + "created_at", + "updated_at" + ], "title": "Sort By", "description": "Sort by field." }, "sort_order": { "type": "string", - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "title": "Sort Order", "description": "Sort order." }, @@ -4588,7 +4804,12 @@ }, "status": { "type": "string", - "enum": ["idle", "busy", "interrupted", "error"], + "enum": [ + "idle", + "busy", + "interrupted", + "error" + ], "title": "Status", "description": "Thread status to filter on." } @@ -4629,7 +4850,12 @@ }, "status": { "type": "string", - "enum": ["idle", "busy", "interrupted", "error"], + "enum": [ + "idle", + "busy", + "interrupted", + "error" + ], "title": "Status", "description": "The status of the thread." }, @@ -4669,7 +4895,10 @@ }, "if_exists": { "type": "string", - "enum": ["raise", "do_nothing"], + "enum": [ + "raise", + "do_nothing" + ], "title": "If Exists", "description": "How to handle duplicate creation. Must be either 'raise' (raise error if duplicate), or 'do_nothing' (return existing thread).", "default": "raise" @@ -4681,7 +4910,9 @@ "properties": { "strategy": { "type": "string", - "enum": ["delete"], + "enum": [ + "delete" + ], "description": "The TTL strategy. 'delete' removes the entire thread.", "default": "delete" }, @@ -4703,7 +4934,9 @@ } } }, - "required": ["updates"] + "required": [ + "updates" + ] } } }, @@ -4736,7 +4969,9 @@ "description": "Include subgraph states." } }, - "required": ["checkpoint"], + "required": [ + "checkpoint" + ], "type": "object", "title": "ThreadStateCheckpointRequest", "description": "Payload for getting the state of a thread at a checkpoint." @@ -4794,7 +5029,10 @@ "$ref": "#/components/schemas/ThreadState" } }, - "required": ["id", "name"] + "required": [ + "id", + "name" + ] }, "type": "array", "title": "Tasks" @@ -4823,7 +5061,13 @@ } }, "type": "object", - "required": ["values", "next", "checkpoint", "metadata", "created_at"], + "required": [ + "values", + "next", + "checkpoint", + "metadata", + "created_at" + ], "title": "ThreadState" }, "ThreadStateSearch": { @@ -4922,7 +5166,9 @@ "description": "Update the state as if this node had just executed." } }, - "required": ["as_node"], + "required": [ + "as_node" + ], "type": "object" }, "ThreadStateUpdateResponse": { @@ -4961,7 +5207,11 @@ }, "StorePutRequest": { "type": "object", - "required": ["namespace", "key", "value"], + "required": [ + "namespace", + "key", + "value" + ], "properties": { "namespace": { "type": "array", @@ -4987,7 +5237,9 @@ }, "StoreDeleteRequest": { "type": "object", - "required": ["key"], + "required": [ + "key" + ], "properties": { "namespace": { "type": "array", @@ -5010,7 +5262,10 @@ "type": "object", "properties": { "namespace_prefix": { - "type": ["array", "null"], + "type": [ + "array", + "null" + ], "items": { "type": "string" }, @@ -5018,7 +5273,10 @@ "description": "List of strings representing the namespace prefix." }, "filter": { - "type": ["object", "null"], + "type": [ + "object", + "null" + ], "additionalProperties": true, "title": "Filter", "description": "Optional dictionary of key-value pairs to filter results." @@ -5036,7 +5294,10 @@ "description": "Number of items to skip before returning results (default is 0)." }, "query": { - "type": ["string", "null"], + "type": [ + "string", + "null" + ], "title": "Query", "description": "Query string for semantic/vector search." } @@ -5084,7 +5345,13 @@ }, "Item": { "type": "object", - "required": ["namespace", "key", "value", "created_at", "updated_at"], + "required": [ + "namespace", + "key", + "value", + "created_at", + "updated_at" + ], "properties": { "namespace": { "type": "array", @@ -5121,7 +5388,11 @@ "properties": { "status": { "type": "string", - "enum": ["pending", "running", "all"], + "enum": [ + "pending", + "running", + "all" + ], "title": "Status", "description": "Filter runs by status to cancel. Must be one of 'pending', 'running', or 'all'." }, @@ -5143,16 +5414,23 @@ }, "oneOf": [ { - "required": ["status"] + "required": [ + "status" + ] }, { - "required": ["thread_id", "run_ids"] + "required": [ + "thread_id", + "run_ids" + ] } ] }, "SearchItemsResponse": { "type": "object", - "required": ["items"], + "required": [ + "items" + ], "properties": { "items": { "type": "array", @@ -5230,14 +5508,19 @@ "type": "object", "properties": { "id": { - "type": ["string", "null"] + "type": [ + "string", + "null" + ] }, "value": { "type": "object" } }, "title": "Interrupt", - "required": ["value"] + "required": [ + "value" + ] } } } From 998e194e82f5eb90f85ddcf9f69ce70262dae596 Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Wed, 20 Aug 2025 08:40:04 -0700 Subject: [PATCH 02/58] release(cli): Support bookworm, trixie, etc. (#5975) Also add support for pinning to a semantic version. --- .github/scripts/run_langgraph_cli_test.py | 212 +++++++++++++--------- .github/workflows/_integration_test.yml | 25 ++- .github/workflows/release.yml | 7 +- libs/cli/Makefile | 3 +- libs/cli/examples/.env.example | 7 - libs/cli/generate_schema.py | 9 +- libs/cli/langgraph_cli/__init__.py | 1 + libs/cli/langgraph_cli/config.py | 48 ++++- libs/cli/pyproject.toml | 9 +- libs/cli/schemas/schema.json | 32 +++- libs/cli/schemas/schema.v0.json | 32 +++- libs/cli/tests/unit_tests/cli/test_cli.py | 4 +- libs/cli/tests/unit_tests/test_config.py | 53 ++++-- libs/cli/uv.lock | 35 ++-- libs/langgraph/uv.lock | 5 +- 15 files changed, 308 insertions(+), 174 deletions(-) diff --git a/.github/scripts/run_langgraph_cli_test.py b/.github/scripts/run_langgraph_cli_test.py index 478a215ab..872b86f65 100644 --- a/.github/scripts/run_langgraph_cli_test.py +++ b/.github/scripts/run_langgraph_cli_test.py @@ -1,107 +1,145 @@ -import asyncio -import json -import os import pathlib import sys -import langgraph_cli -import langgraph_cli.docker -import langgraph_cli.config +import time +from urllib import request, error +import langgraph_cli +import langgraph_cli.config +import langgraph_cli.docker +from langgraph_cli.cli import prepare_args_and_stdin +from langgraph_cli.constants import DEFAULT_PORT from langgraph_cli.exec import Runner, subp_exec from langgraph_cli.progress import Progress -from langgraph_cli.constants import DEFAULT_PORT -def test( - config: pathlib.Path, - port: int, - tag: str, - verbose: bool, -): +def test(config: pathlib.Path, port: int, tag: str, verbose: bool): + """Spin up API with Postgres/Redis via docker compose and wait until ready.""" with Runner() as runner, Progress(message="Pulling...") as set: - # check docker available + # Detect docker/compose capabilities capabilities = langgraph_cli.docker.check_capabilities(runner) - # open config + + # Validate config and prepare compose stdin/args using built image config_json = langgraph_cli.config.validate_config_file(config) + args, stdin = prepare_args_and_stdin( + capabilities=capabilities, + config_path=config, + config=config_json, + docker_compose=None, + port=port, + watch=False, + debugger_port=None, + debugger_base_url=f"http://127.0.0.1:{port}", + postgres_uri=None, + api_version=None, + image=tag, + base_image=None, + ) - set("Running...") - args = [ - "run", - "--rm", - "-p", - f"{port}:8000", - ] - if isinstance(config_json["env"], str): - args.extend( - [ - "--env-file", - str(config.parent / config_json["env"]), - ] - ) - else: - for k, v in config_json["env"].items(): - args.extend( - [ - "-e", - f"{k}={v}", - ] - ) - if capabilities.healthcheck_start_interval: - args.extend( - [ - "--health-interval", - "5s", - "--health-retries", - "1", - "--health-start-period", - "10s", - "--health-start-interval", - "1s", - ] - ) - else: - args.extend( - [ - "--health-interval", - "5s", - "--health-retries", - "2", - ] - ) + # Compose up with wait (implies detach), similar to `langgraph up --wait` + args_up = [*args, "up", "--remove-orphans", "--wait"] - _task = None - - def on_stdout(line: str): - nonlocal _task - if "GET /ok" in line or "Uvicorn running on" in line: - set("") - sys.stdout.write( - f"""Ready! -- API: http://localhost:{port} -""" - ) - sys.stdout.flush() - _task.cancel() - return True - return False - - async def subp_exec_task(*args, **kwargs): - nonlocal _task - _task = asyncio.create_task(subp_exec(*args, **kwargs)) - await _task + compose_cmd = ["docker", "compose"] + if capabilities.compose_type == "standalone": + compose_cmd = ["docker-compose"] + set("Starting...") try: runner.run( - subp_exec_task( - "docker", - *args, - tag, + subp_exec( + *compose_cmd, + *args_up, + input=stdin, verbose=verbose, - on_stdout=on_stdout, ) ) - except asyncio.CancelledError: - pass + except Exception as e: # noqa: BLE001 + # On failure, show diagnostics then ensure clean teardown + sys.stderr.write(f"docker compose up failed: {e}\n") + try: + sys.stderr.write("\n== docker compose ps ==\n") + runner.run(subp_exec(*compose_cmd, *args, "ps", input=stdin, verbose=False)) + except Exception: + pass + try: + sys.stderr.write("\n== docker compose logs (api) ==\n") + runner.run( + subp_exec( + *compose_cmd, + *args, + "logs", + "langgraph-api", + input=stdin, + verbose=False, + ) + ) + except Exception: + pass + finally: + try: + runner.run( + subp_exec( + *compose_cmd, + *args, + "down", + "-v", + "--remove-orphans", + input=stdin, + verbose=False, + ) + ) + finally: + raise + + set("") + base_url = f"http://localhost:{port}" + ok_url = f"{base_url}/ok" + print(f"Waiting for {ok_url} to respond with 200...") + deadline = time.time() + 30 + last_err: Exception | None = None + while time.time() < deadline: + try: + with request.urlopen(ok_url, timeout=2) as resp: + if resp.status == 200: + sys.stdout.write( + f"""Ready!\n- API: {base_url}\n- /ok: 200 OK\n""" + ) + sys.stdout.flush() + break + else: + last_err = RuntimeError(f"Unexpected status: {resp.status}") + print(f"Unexpected status: {resp.status}") + except error.URLError as e: + last_err = e + except Exception as e: # noqa: BLE001 + last_err = e + time.sleep(0.5) + else: + # Bring stack down before raising + args_down = [*args, "down", "-v", "--remove-orphans"] + try: + runner.run( + subp_exec( + *compose_cmd, + *args_down, + input=stdin, + verbose=verbose, + ) + ) + finally: + raise SystemExit( + f"/ok did not return 202 within timeout. Last error: {last_err}" + ) + + # Clean up: bring compose stack down to free ports for next test + args_down = [*args, "down", "-v", "--remove-orphans"] + runner.run( + subp_exec( + *compose_cmd, + *args_down, + input=stdin, + verbose=verbose, + ) + ) if __name__ == "__main__": @@ -110,6 +148,6 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("-t", "--tag", type=str) parser.add_argument("-c", "--config", type=str, default="./langgraph.json") - parser.add_argument("-p", "--port", default=DEFAULT_PORT) + parser.add_argument("-p", "--port", type=int, default=DEFAULT_PORT) args = parser.parse_args() test(pathlib.Path(args.config), args.port, args.tag, verbose=True) diff --git a/.github/workflows/_integration_test.yml b/.github/workflows/_integration_test.yml index 5857609ec..f4aa57aa6 100644 --- a/.github/workflows/_integration_test.yml +++ b/.github/workflows/_integration_test.yml @@ -43,28 +43,43 @@ jobs: - name: Build and test service A if: steps.changed-files.outputs.all working-directory: libs/cli/examples + env: + LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }} run: | # The build-arg isn't used; just testing that we accept other args - langgraph build -t langgraph-test-a --base-image "langchain/langgraph-trial" - cp .env.example .envg + langgraph build -t langgraph-test-a + cp .env.example .env + if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi timeout 60 python ../../../.github/scripts/run_langgraph_cli_test.py -c langgraph.json -t langgraph-test-a - name: Build and test service B if: steps.changed-files.outputs.all working-directory: libs/cli/examples/graphs + env: + LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }} run: | - langgraph build -t langgraph-test-b --base-image "langchain/langgraph-trial" + langgraph build -t langgraph-test-b + cp ../.env.example .env + if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-b - name: Build and test service C if: steps.changed-files.outputs.all working-directory: libs/cli/examples/graphs_reqs_a + env: + LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }} run: | - langgraph build -t langgraph-test-c --base-image "langchain/langgraph-trial" + langgraph build -t langgraph-test-c + cp ../.env.example .env + if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-c - name: Build and test service D if: steps.changed-files.outputs.all working-directory: libs/cli/examples/graphs_reqs_b + env: + LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }} run: | - langgraph build -t langgraph-test-d --base-image "langchain/langgraph-trial" + langgraph build -t langgraph-test-d + cp ../.env.example .env + if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-d - name: Build JS service diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e654ee8f9..e739b064a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -62,9 +62,10 @@ jobs: working-directory: ${{ inputs.working-directory }} run: | PKG_NAME=$(grep -m 1 "^name = " pyproject.toml | cut -d '"' -f 2) - # sdk-py uses dynamic versioning from langgraph_sdk/__init__.py - if [ "$PKG_NAME" = "langgraph-sdk" ]; then - VERSION=$(grep -m 1 '^__version__' langgraph_sdk/__init__.py | cut -d '"' -f 2) + if grep -q 'dynamic.*=.*\[.*"version".*\]' pyproject.toml; then + # handle dynamic versioning + DIR_NAME=$(echo "$PKG_NAME" | tr '-' '_') + VERSION=$(grep -m 1 '^__version__' "${DIR_NAME}/__init__.py" | cut -d '"' -f 2) else VERSION=$(grep -m 1 "^version = " pyproject.toml | cut -d '"' -f 2) fi diff --git a/libs/cli/Makefile b/libs/cli/Makefile index 5efcc064f..0c3fcc7dc 100644 --- a/libs/cli/Makefile +++ b/libs/cli/Makefile @@ -4,8 +4,9 @@ # TESTING AND COVERAGE ###################### +TEST?= "tests/unit_tests" test: - uv run pytest tests/unit_tests + uv run pytest $(TEST) test-integration: uv run pytest tests/integration_tests diff --git a/libs/cli/examples/.env.example b/libs/cli/examples/.env.example index cc176486c..d9649108e 100644 --- a/libs/cli/examples/.env.example +++ b/libs/cli/examples/.env.example @@ -1,10 +1,3 @@ OPENAI_API_KEY=placeholder ANTHROPIC_API_KEY=placeholder TAVILY_API_KEY=placeholder -LANGCHAIN_TRACING_V2=false -LANGCHAIN_ENDPOINT=placeholder -LANGCHAIN_API_KEY=placeholder -LANGCHAIN_PROJECT=placeholder -LANGGRAPH_AUTH_TYPE=noop -LANGSMITH_AUTH_ENDPOINT=placeholder -LANGSMITH_TENANT_ID=placeholder \ No newline at end of file diff --git a/libs/cli/generate_schema.py b/libs/cli/generate_schema.py index 041012c61..ad6637a4a 100644 --- a/libs/cli/generate_schema.py +++ b/libs/cli/generate_schema.py @@ -163,14 +163,7 @@ def generate_schema(): # Add enum constraint for python_version if "python_version" in python_schema["properties"]: - python_schema["properties"]["python_version"]["enum"] = ["3.11", "3.12"] - - # Add enum constraint for image_distro - if "image_distro" in python_schema["properties"]: - python_schema["properties"]["image_distro"]["anyOf"] = [ - {"type": "string", "enum": ["debian", "wolfi"]}, - {"type": "null"}, - ] + python_schema["properties"]["python_version"]["enum"] = ["3.11", "3.12", "3.13"] # Create Node.js schema with node_version node_schema = { diff --git a/libs/cli/langgraph_cli/__init__.py b/libs/cli/langgraph_cli/__init__.py index e69de29bb..8879c6c77 100644 --- a/libs/cli/langgraph_cli/__init__.py +++ b/libs/cli/langgraph_cli/__init__.py @@ -0,0 +1 @@ +__version__ = "0.3.7" diff --git a/libs/cli/langgraph_cli/config.py b/libs/cli/langgraph_cli/config.py index 43a940afc..d631bc5f1 100644 --- a/libs/cli/langgraph_cli/config.py +++ b/libs/cli/langgraph_cli/config.py @@ -17,6 +17,9 @@ DEFAULT_PYTHON_VERSION = "3.11" DEFAULT_IMAGE_DISTRO = "debian" +Distros = Literal["debian", "wolfi", "bullseye", "bookworm"] + + class TTLConfig(TypedDict, total=False): """Configuration for TTL (time-to-live) behavior in the store.""" @@ -369,6 +372,13 @@ class Config(TypedDict, total=False): Must be >= 20 if provided. """ + api_version: Optional[str] + """Optional. Which semantic version of the LangGraph API server to use. + + Defaults to latest. Check the + [changelog](https://docs.langchain.com/langgraph-platform/langgraph-server-changelog) + for more information.""" + _INTERNAL_docker_tag: Optional[str] """Optional. Internal use only. """ @@ -378,10 +388,11 @@ class Config(TypedDict, total=False): Defaults to langchain/langgraph-api or langchain/langgraphjs-api.""" - image_distro: Optional[str] + image_distro: Optional[Distros] """Optional. Linux distribution for the base image. - Must be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'. + Must be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'. + If omitted, defaults to 'debian' ('latest'). """ pip_config_file: Optional[str] @@ -587,13 +598,28 @@ def validate_config(config: Config) -> Config: ) image_distro = config.get("image_distro", DEFAULT_IMAGE_DISTRO) + internal_docker_tag = config.get("_INTERNAL_docker_tag") + api_version = config.get("api_version") + if internal_docker_tag: + if api_version: + raise click.UsageError( + "Cannot specify both _INTERNAL_docker_tag and api_version." + ) + if api_version: + try: + parts = tuple(map(int, api_version.split("-")[0].split("."))) + if len(parts) > 3: + raise ValueError( + "Version must be major or major.minor or major.minor.patch." + ) + except TypeError: + raise click.UsageError(f"Invalid version format: {api_version}") from None config = { "node_version": node_version, "python_version": python_version, "pip_config_file": config.get("pip_config_file"), "pip_installer": config.get("pip_installer", "auto"), - "_INTERNAL_docker_tag": config.get("_INTERNAL_docker_tag"), "base_image": config.get("base_image"), "image_distro": image_distro, "dependencies": config.get("dependencies", []), @@ -608,6 +634,10 @@ def validate_config(config: Config) -> Config: "ui_config": config.get("ui_config"), "keep_pkg_tools": config.get("keep_pkg_tools"), } + if internal_docker_tag: + config["_INTERNAL_docker_tag"] = internal_docker_tag + if api_version: + config["api_version"] = api_version if config.get("node_version"): node_version = config["node_version"] @@ -644,17 +674,17 @@ def validate_config(config: Config) -> Config: "Add at least one dependency to 'dependencies' list." ) - if not config["graphs"]: + if not config.get("graphs"): raise click.UsageError( "No graphs found in config. Add at least one graph to 'graphs' dictionary." ) # Validate image_distro config if image_distro := config.get("image_distro"): - if image_distro not in ["debian", "wolfi"]: + if image_distro not in Distros.__args__: raise click.UsageError( f"Invalid image_distro: '{image_distro}'. " - "Must be either 'debian' or 'wolfi'." + "Must be one of 'debian', 'bullseye', or 'bookworm'." ) if pip_installer := config.get("pip_installer"): @@ -1465,6 +1495,7 @@ def docker_tag( base_image: Optional[str] = None, api_version: Optional[str] = None, ) -> str: + api_version = api_version or config.get("api_version") base_image = base_image or default_base_image(config) image_distro = config.get("image_distro") @@ -1473,9 +1504,6 @@ def docker_tag( if config.get("_INTERNAL_docker_tag"): return f"{base_image}:{config['_INTERNAL_docker_tag']}" - if "/langgraph-server" in base_image: - return f"{base_image}-py{config['python_version']}" - # Build the standard tag format language, version = None, None if config.get("node_version") and not config.get("python_version"): @@ -1488,6 +1516,8 @@ def docker_tag( # Prepend API version if provided if api_version: full_tag = f"{api_version}-{language}{version_distro_tag}" + elif "/langgraph-server" in base_image and version_distro_tag not in base_image: + return f"{base_image}-{language}{version_distro_tag}" else: full_tag = version_distro_tag diff --git a/libs/cli/pyproject.toml b/libs/cli/pyproject.toml index 4e3523ea8..2fcf7ba72 100644 --- a/libs/cli/pyproject.toml +++ b/libs/cli/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "langgraph-cli" -version = "0.3.6" +dynamic = ["version"] description = "CLI for interacting with LangGraph API" authors = [] requires-python = ">=3.9" @@ -15,11 +15,12 @@ dependencies = [ "click>=8.1.7", "langgraph-sdk>=0.1.0 ; python_version >= '3.11'", ] - +[tool.hatch.version] +path = "langgraph_cli/__init__.py" [project.optional-dependencies] inmem = [ - "langgraph-api>=0.2.67,<0.3.0 ; python_version >= '3.11'", - "langgraph-runtime-inmem>=0.6.0 ; python_version >= '3.11'", + "langgraph-api>=0.2.120,<0.3.0 ; python_version >= '3.11'", + "langgraph-runtime-inmem>=0.6.8 ; python_version >= '3.11'", "python-dotenv>=0.8.0", ] diff --git a/libs/cli/schemas/schema.json b/libs/cli/schemas/schema.json index e76e69826..b3de933a0 100644 --- a/libs/cli/schemas/schema.json +++ b/libs/cli/schemas/schema.json @@ -15,7 +15,8 @@ "description": "Optional. Python version in 'major.minor' format (e.g. '3.11').\nMust be at least 3.11 or greater for this deployment to function properly.\n", "enum": [ "3.11", - "3.12" + "3.12", + "3.13" ] }, "pip_config_file": { @@ -40,6 +41,17 @@ ], "description": "Optional. Internal use only.\n" }, + "api_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n" + }, "auth": { "anyOf": [ { @@ -122,8 +134,9 @@ "image_distro": { "anyOf": [ { - "type": "string", "enum": [ + "bookworm", + "bullseye", "debian", "wolfi" ] @@ -132,7 +145,7 @@ "type": "null" } ], - "description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n" + "description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n" }, "keep_pkg_tools": { "anyOf": [ @@ -221,6 +234,17 @@ ], "description": "Optional. Internal use only.\n" }, + "api_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n" + }, "auth": { "anyOf": [ { @@ -313,7 +337,7 @@ "type": "null" } ], - "description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n" + "description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n" }, "keep_pkg_tools": { "anyOf": [ diff --git a/libs/cli/schemas/schema.v0.json b/libs/cli/schemas/schema.v0.json index e76e69826..b3de933a0 100644 --- a/libs/cli/schemas/schema.v0.json +++ b/libs/cli/schemas/schema.v0.json @@ -15,7 +15,8 @@ "description": "Optional. Python version in 'major.minor' format (e.g. '3.11').\nMust be at least 3.11 or greater for this deployment to function properly.\n", "enum": [ "3.11", - "3.12" + "3.12", + "3.13" ] }, "pip_config_file": { @@ -40,6 +41,17 @@ ], "description": "Optional. Internal use only.\n" }, + "api_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n" + }, "auth": { "anyOf": [ { @@ -122,8 +134,9 @@ "image_distro": { "anyOf": [ { - "type": "string", "enum": [ + "bookworm", + "bullseye", "debian", "wolfi" ] @@ -132,7 +145,7 @@ "type": "null" } ], - "description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n" + "description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n" }, "keep_pkg_tools": { "anyOf": [ @@ -221,6 +234,17 @@ ], "description": "Optional. Internal use only.\n" }, + "api_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n" + }, "auth": { "anyOf": [ { @@ -313,7 +337,7 @@ "type": "null" } ], - "description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n" + "description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n" }, "keep_pkg_tools": { "anyOf": [ diff --git a/libs/cli/tests/unit_tests/cli/test_cli.py b/libs/cli/tests/unit_tests/cli/test_cli.py index 413a1f4bc..f0341dbad 100644 --- a/libs/cli/tests/unit_tests/cli/test_cli.py +++ b/libs/cli/tests/unit_tests/cli/test_cli.py @@ -381,7 +381,9 @@ def test_dockerfile_command_with_base_image() -> None: assert save_path.exists() with open(save_path) as f: dockerfile = f.read() - assert re.match("FROM langchain/langgraph-server:0.2-py3.*", dockerfile) + assert re.match("FROM langchain/langgraph-server:0.2-py3.*", dockerfile), ( + "\n".join(dockerfile.splitlines()[:3]) + ) def test_dockerfile_command_with_docker_compose() -> None: diff --git a/libs/cli/tests/unit_tests/test_config.py b/libs/cli/tests/unit_tests/test_config.py index 3f1ea7c06..fbc257e8b 100644 --- a/libs/cli/tests/unit_tests/test_config.py +++ b/libs/cli/tests/unit_tests/test_config.py @@ -38,7 +38,6 @@ def test_validate_config(): } actual_config = validate_config(expected_config) expected_config = { - "_INTERNAL_docker_tag": None, "base_image": None, "python_version": "3.11", "node_version": None, @@ -61,7 +60,6 @@ def test_validate_config(): # full config env = ".env" expected_config = { - "_INTERNAL_docker_tag": None, "base_image": None, "python_version": "3.12", "node_version": None, @@ -190,7 +188,6 @@ def test_validate_config_image_distro(): } ) assert "Invalid image_distro: 'ubuntu'" in str(exc_info.value) - assert "Must be either 'debian' or 'wolfi'" in str(exc_info.value) with pytest.raises(click.UsageError) as exc_info: validate_config( @@ -1339,19 +1336,22 @@ def test_docker_tag_different_node_versions_with_distro(): assert tag == expected_tag, f"Failed for Node.js {node_version}" -def test_docker_tag_with_api_version(): +@pytest.mark.parametrize("in_config", [False, True]) +def test_docker_tag_with_api_version(in_config: bool): """Test docker_tag function with api_version parameter.""" # Test 1: Python config with api_version and default distro + version = "0.2.74" config = validate_config( { "python_version": "3.11", "dependencies": ["."], "graphs": {"agent": "./agent.py:graph"}, + "api_version": version if in_config else None, } ) - tag = docker_tag(config, api_version="0.2.74") - assert tag == "langchain/langgraph-api:0.2.74-py3.11" + tag = docker_tag(config, api_version=version if not in_config else None) + assert tag == f"langchain/langgraph-api:{version}-py3.11" # Test 2: Python config with api_version and wolfi distro config = validate_config( @@ -1360,20 +1360,22 @@ def test_docker_tag_with_api_version(): "dependencies": ["."], "graphs": {"agent": "./agent.py:graph"}, "image_distro": "wolfi", + "api_version": version if in_config else None, } ) - tag = docker_tag(config, api_version="0.2.74") - assert tag == "langchain/langgraph-api:0.2.74-py3.12-wolfi" + tag = docker_tag(config, api_version=version if not in_config else None) + assert tag == f"langchain/langgraph-api:{version}-py3.12-wolfi" # Test 3: Node.js config with api_version and default distro config = validate_config( { "node_version": "20", "graphs": {"agent": "./agent.js:graph"}, + "api_version": version if in_config else None, } ) - tag = docker_tag(config, api_version="0.2.74") - assert tag == "langchain/langgraphjs-api:0.2.74-node20" + tag = docker_tag(config, api_version=version if not in_config else None) + assert tag == f"langchain/langgraphjs-api:{version}-node20" # Test 4: Node.js config with api_version and wolfi distro config = validate_config( @@ -1381,10 +1383,11 @@ def test_docker_tag_with_api_version(): "node_version": "20", "graphs": {"agent": "./agent.js:graph"}, "image_distro": "wolfi", + "api_version": version if in_config else None, } ) - tag = docker_tag(config, api_version="0.2.74") - assert tag == "langchain/langgraphjs-api:0.2.74-node20-wolfi" + tag = docker_tag(config, api_version=version if not in_config else None) + assert tag == f"langchain/langgraphjs-api:{version}-node20-wolfi" # Test 5: Custom base image with api_version config = validate_config( @@ -1393,10 +1396,15 @@ def test_docker_tag_with_api_version(): "dependencies": ["."], "graphs": {"agent": "./agent.py:graph"}, "base_image": "my-registry/custom-image", + "api_version": version if in_config else None, } ) - tag = docker_tag(config, base_image="my-registry/custom-image", api_version="1.0.0") - assert tag == "my-registry/custom-image:1.0.0-py3.11" + tag = docker_tag( + config, + base_image="my-registry/custom-image", + api_version=version if not in_config else None, + ) + assert tag == f"my-registry/custom-image:{version}-py3.11" # Test 6: api_version with different Python versions for python_version in ["3.11", "3.12", "3.13"]: @@ -1405,10 +1413,11 @@ def test_docker_tag_with_api_version(): "python_version": python_version, "dependencies": ["."], "graphs": {"agent": "./agent.py:graph"}, + "api_version": version if in_config else None, } ) - tag = docker_tag(config, api_version="0.2.74") - assert tag == f"langchain/langgraph-api:0.2.74-py{python_version}" + tag = docker_tag(config, api_version=version if not in_config else None) + assert tag == f"langchain/langgraph-api:{version}-py{python_version}" # Test 7: Without api_version should work as before config = validate_config( @@ -1428,10 +1437,11 @@ def test_docker_tag_with_api_version(): "node_version": "20", "dependencies": ["."], "graphs": {"python": "./agent.py:graph", "js": "./agent.js:graph"}, + "api_version": version if in_config else None, } ) - tag = docker_tag(config, api_version="0.2.74") - assert tag == "langchain/langgraph-api:0.2.74-py3.11" + tag = docker_tag(config, api_version=version if not in_config else None) + assert tag == f"langchain/langgraph-api:{version}-py3.11" # Test 9: api_version with _INTERNAL_docker_tag should ignore api_version config = validate_config( @@ -1451,12 +1461,15 @@ def test_docker_tag_with_api_version(): "python_version": "3.11", "dependencies": ["."], "graphs": {"agent": "./agent.py:graph"}, + "api_version": version if in_config else None, } ) tag = docker_tag( - config, base_image="langchain/langgraph-server:0.2", api_version="0.2.74" + config, + base_image="langchain/langgraph-server", + api_version=version if not in_config else None, ) - assert tag == "langchain/langgraph-server:0.2-py3.11" + assert tag == f"langchain/langgraph-server:{version}-py3.11" def test_config_to_docker_with_api_version(): diff --git a/libs/cli/uv.lock b/libs/cli/uv.lock index 62178a6f3..7b7bae16e 100644 --- a/libs/cli/uv.lock +++ b/libs/cli/uv.lock @@ -471,7 +471,7 @@ wheels = [ [[package]] name = "langgraph" -version = "0.5.3" +version = "0.6.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "python_full_version >= '3.11'" }, @@ -481,14 +481,14 @@ dependencies = [ { name = "pydantic", marker = "python_full_version >= '3.11'" }, { name = "xxhash", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/f4/f4ebb83dff589b31d4a11c0d3c9c39a55d41f2a722dfb78761f7ed95e96d/langgraph-0.5.3.tar.gz", hash = "sha256:36d4b67f984ff2649d447826fc99b1a2af3e97599a590058f20750048e4f548f", size = 442591, upload-time = "2025-07-14T20:10:02.907Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/2b/59f0b2985467ec84b006dd41ec31c0aae43a7f16722d5514292500b871c9/langgraph-0.6.6.tar.gz", hash = "sha256:e7d3cefacf356f8c01721b166b67b3bf581659d5361a3530f59ecd9b8448eca7", size = 465452, upload-time = "2025-08-20T04:02:13.915Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/2f/11be9302d3a213debcfe44355453a1e8fd7ee5e3138edeb8bd82b56bc8f6/langgraph-0.5.3-py3-none-any.whl", hash = "sha256:9819b88a6ef6134a0fa6d6121a81b202dc3d17b25cf7ea3fe4d7669b9b252b5d", size = 143774, upload-time = "2025-07-14T20:10:01.497Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ef/81fce0a80925cd89987aa641ff01573e3556a24f2d205112862a69df7fd3/langgraph-0.6.6-py3-none-any.whl", hash = "sha256:a2283a5236abba6c8307c1a485c04e8a0f0ffa2be770878782a7bf2deb8d7954", size = 153274, upload-time = "2025-08-20T04:02:12.251Z" }, ] [[package]] name = "langgraph-api" -version = "0.2.96" +version = "0.2.137" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cloudpickle", marker = "python_full_version >= '3.11'" }, @@ -511,9 +511,9 @@ dependencies = [ { name = "uvicorn", marker = "python_full_version >= '3.11'" }, { name = "watchfiles", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ee/4c/837c5ce4aab704b6b13f27c5dd6330dabaf2f25d198032cb18e5d5dcaa53/langgraph_api-0.2.96.tar.gz", hash = "sha256:c498b5542a952d194121cdbe5a4b04e2f48fbc37480141ea2b87ba39a132ddb1", size = 238776, upload-time = "2025-07-17T17:57:47.274Z" } +sdist = { url = "https://files.pythonhosted.org/packages/05/13/bb3601d76d35f285564ff4b963f3c946aaa854ebc910d89d5ed535a8e2e8/langgraph_api-0.2.137.tar.gz", hash = "sha256:7791bda6ae91e305b3bc95ece338c67dd89f3d5cf735e7ef1ffe381fc2629b44", size = 255804, upload-time = "2025-08-20T07:32:43.969Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/7f/dfae9bc0f85a98bbd96d00df2a39e8b8386977e8ce4a6199d1065bb3709d/langgraph_api-0.2.96-py3-none-any.whl", hash = "sha256:304d424d7a85735489fab1764b439e8219739619ad708b9465b8b8f421f17b37", size = 194393, upload-time = "2025-07-17T17:57:45.89Z" }, + { url = "https://files.pythonhosted.org/packages/1e/d3/bbf69e3443313a014cbe1365f21f7930dd86e2273b6d1aa1d75f03db5221/langgraph_api-0.2.137-py3-none-any.whl", hash = "sha256:42a914903a2722fc12e846f4607a2b5d9f39a084fe091036f3385d9b69c9c8e8", size = 206034, upload-time = "2025-08-20T07:32:42.498Z" }, ] [[package]] @@ -531,7 +531,6 @@ wheels = [ [[package]] name = "langgraph-cli" -version = "0.3.6" source = { editable = "." } dependencies = [ { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -561,8 +560,8 @@ dev = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.1.7" }, - { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.67,<0.3.0" }, - { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.0" }, + { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.3.0" }, + { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.8" }, { name = "langgraph-sdk", marker = "python_full_version >= '3.11'", specifier = ">=0.1.0" }, { name = "python-dotenv", marker = "extra == 'inmem'", specifier = ">=0.8.0" }, ] @@ -582,20 +581,20 @@ dev = [ [[package]] name = "langgraph-prebuilt" -version = "0.5.2" +version = "0.6.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "python_full_version >= '3.11'" }, { name = "langgraph-checkpoint", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/11/98134c47832fbde0caf0e06f1a104577da9215c358d7854093c1d835b272/langgraph_prebuilt-0.5.2.tar.gz", hash = "sha256:2c900a5be0d6a93ea2521e0d931697cad2b646f1fcda7aa5c39d8d7539772465", size = 117808, upload-time = "2025-06-30T19:52:48.307Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/21/9b198d11732101ee8cdf30af98d0b4f11254c768de15173e57f5260fd14b/langgraph_prebuilt-0.6.4.tar.gz", hash = "sha256:e9e53b906ee5df46541d1dc5303239e815d3ec551e52bb03dd6463acc79ec28f", size = 125695, upload-time = "2025-08-07T18:17:57.333Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/64/6bc45ab9e0e1112698ebff579fe21f5606ea65cd08266995a357e312a4d2/langgraph_prebuilt-0.5.2-py3-none-any.whl", hash = "sha256:1f4cd55deca49dffc3e5127eec12fcd244fc381321002f728afa88642d5ec59d", size = 23776, upload-time = "2025-06-30T19:52:47.494Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7f/973b0d9729d9693d6e5b4bc5f3ae41138d194cb7b16b0ed230020beeb13a/langgraph_prebuilt-0.6.4-py3-none-any.whl", hash = "sha256:819f31d88b84cb2729ff1b79db2d51e9506b8fb7aaacfc0d359d4fe16e717344", size = 28025, upload-time = "2025-08-07T18:17:56.493Z" }, ] [[package]] name = "langgraph-runtime-inmem" -version = "0.6.0" +version = "0.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "blockbuster", marker = "python_full_version >= '3.11'" }, @@ -605,22 +604,22 @@ dependencies = [ { name = "starlette", marker = "python_full_version >= '3.11'" }, { name = "structlog", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/0c/d145c6d83d36efda17b10812760711b77ec05f5bbe962c961d75b32e3c17/langgraph_runtime_inmem-0.6.0.tar.gz", hash = "sha256:b09675789a331be4a2b387c9c46de8772c4c8418e74c057b4ca24e85c25acae3", size = 77618, upload-time = "2025-07-17T16:51:01.504Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/94/02b58b1c137cfca6507f6c495e5794fd542b1f5269ef89fb662799be4b8c/langgraph_runtime_inmem-0.8.0.tar.gz", hash = "sha256:3082273f65650665b4a3875241721087fd51e675eb0227b18dc271839ce99594", size = 79510, upload-time = "2025-08-18T09:00:09.162Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/6a/9dc5769b5d2f97d1feacbbf93b180c359dff7462454b37dfef8aed4ebcf7/langgraph_runtime_inmem-0.6.0-py3-none-any.whl", hash = "sha256:312dab25bec6557f1edf95cb8bd7c8bb52f7f4bfeecaf66e7001662f095c9079", size = 29317, upload-time = "2025-07-17T16:51:00.622Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0e/b09c1aff0bcfdb1357be212b4a5d55f5b98644eae7fab6b115aa463e99fa/langgraph_runtime_inmem-0.8.0-py3-none-any.whl", hash = "sha256:85398321fc186618b0957c4d8629cc059fce2e7f57a4756ef83a75575791da1b", size = 31626, upload-time = "2025-08-18T09:00:08.256Z" }, ] [[package]] name = "langgraph-sdk" -version = "0.1.73" +version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "python_full_version >= '3.11'" }, { name = "orjson", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/e8/daf0271f91e93b10566533955c00ee16e471066755c2efd1ba9a887a7eab/langgraph_sdk-0.1.73.tar.gz", hash = "sha256:6e6dcdf66bcf8710739899616856527a72a605ce15beb76fbac7f4ce0e2ad080", size = 72157, upload-time = "2025-07-14T23:57:22.765Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/3a/ea929b5b3827615802f020abdaa6d4a6f9d59ab764f65559fa6f87a6dda6/langgraph_sdk-0.2.2.tar.gz", hash = "sha256:9484e8071953df75d7aaf9845d82db3595e485af7d5dcc235c9b32c52362e1fc", size = 77981, upload-time = "2025-08-18T19:25:42.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/86/56e01e715e5b0028cdaff1492a89e54fa12e18c21e03b805a10ea36ecd5a/langgraph_sdk-0.1.73-py3-none-any.whl", hash = "sha256:a60ac33f70688ad07051edff1d5ed8089c8f0de1f69dc900be46e095ca20eed8", size = 50222, upload-time = "2025-07-14T23:57:21.42Z" }, + { url = "https://files.pythonhosted.org/packages/01/0d/dfa633c6b85e973e7d4383e9b92603b7e910e89768411daeb7777bfbae04/langgraph_sdk-0.2.2-py3-none-any.whl", hash = "sha256:1afbec01ade166f8b6ce18782875415422eb70dcb82852aeaa373e6152db4b82", size = 52017, upload-time = "2025-08-18T19:25:40.567Z" }, ] [[package]] diff --git a/libs/langgraph/uv.lock b/libs/langgraph/uv.lock index 5ad1efc32..d49ec5a55 100644 --- a/libs/langgraph/uv.lock +++ b/libs/langgraph/uv.lock @@ -1474,7 +1474,6 @@ dev = [ [[package]] name = "langgraph-cli" -version = "0.3.6" source = { editable = "../cli" } dependencies = [ { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -1492,8 +1491,8 @@ inmem = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.1.7" }, - { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.67,<0.3.0" }, - { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.0" }, + { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.3.0" }, + { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.8" }, { name = "langgraph-sdk", marker = "python_full_version >= '3.11'", specifier = ">=0.1.0" }, { name = "python-dotenv", marker = "extra == 'inmem'", specifier = ">=0.8.0" }, ] From 501ba8be344865468303de6d453d6497b045c36d Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Wed, 20 Aug 2025 17:59:27 -0700 Subject: [PATCH 03/58] release(cli): Bump max bound of langgraph-api (#5978) --- libs/cli/langgraph_cli/__init__.py | 2 +- libs/cli/pyproject.toml | 2 +- libs/cli/uv.lock | 640 +++++++++++++++-------------- libs/langgraph/uv.lock | 2 +- 4 files changed, 340 insertions(+), 306 deletions(-) diff --git a/libs/cli/langgraph_cli/__init__.py b/libs/cli/langgraph_cli/__init__.py index 8879c6c77..4ad67eb7a 100644 --- a/libs/cli/langgraph_cli/__init__.py +++ b/libs/cli/langgraph_cli/__init__.py @@ -1 +1 @@ -__version__ = "0.3.7" +__version__ = "0.3.8" diff --git a/libs/cli/pyproject.toml b/libs/cli/pyproject.toml index 2fcf7ba72..3a48f5434 100644 --- a/libs/cli/pyproject.toml +++ b/libs/cli/pyproject.toml @@ -19,7 +19,7 @@ dependencies = [ path = "langgraph_cli/__init__.py" [project.optional-dependencies] inmem = [ - "langgraph-api>=0.2.120,<0.3.0 ; python_version >= '3.11'", + "langgraph-api>=0.2.120,<0.4.0 ; python_version >= '3.11'", "langgraph-runtime-inmem>=0.6.8 ; python_version >= '3.11'", "python-dotenv>=0.8.0", ] diff --git a/libs/cli/uv.lock b/libs/cli/uv.lock index 7b7bae16e..003499fcd 100644 --- a/libs/cli/uv.lock +++ b/libs/cli/uv.lock @@ -18,16 +18,16 @@ wheels = [ [[package]] name = "anyio" -version = "4.9.0" +version = "4.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna", marker = "python_full_version >= '3.11'" }, { name = "sniffio", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, + { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] [[package]] @@ -53,11 +53,11 @@ wheels = [ [[package]] name = "certifi" -version = "2025.7.14" +version = "2025.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" }, + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, ] [[package]] @@ -131,76 +131,77 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.2" +version = "3.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818, upload-time = "2025-05-02T08:31:46.725Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649, upload-time = "2025-05-02T08:31:48.889Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045, upload-time = "2025-05-02T08:31:50.757Z" }, - { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356, upload-time = "2025-05-02T08:31:52.634Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471, upload-time = "2025-05-02T08:31:56.207Z" }, - { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317, upload-time = "2025-05-02T08:31:57.613Z" }, - { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368, upload-time = "2025-05-02T08:31:59.468Z" }, - { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491, upload-time = "2025-05-02T08:32:01.219Z" }, - { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695, upload-time = "2025-05-02T08:32:03.045Z" }, - { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849, upload-time = "2025-05-02T08:32:04.651Z" }, - { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091, upload-time = "2025-05-02T08:32:06.719Z" }, - { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445, upload-time = "2025-05-02T08:32:08.66Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782, upload-time = "2025-05-02T08:32:10.46Z" }, - { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, - { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, - { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, - { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, - { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, - { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, - { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, - { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, - { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, - { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, - { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, - { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, - { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, - { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, - { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, - { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, - { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, - { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, - { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, - { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, - { url = "https://files.pythonhosted.org/packages/28/f8/dfb01ff6cc9af38552c69c9027501ff5a5117c4cc18dcd27cb5259fa1888/charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", size = 201671, upload-time = "2025-05-02T08:34:12.696Z" }, - { url = "https://files.pythonhosted.org/packages/32/fb/74e26ee556a9dbfe3bd264289b67be1e6d616329403036f6507bb9f3f29c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", size = 144744, upload-time = "2025-05-02T08:34:14.665Z" }, - { url = "https://files.pythonhosted.org/packages/ad/06/8499ee5aa7addc6f6d72e068691826ff093329fe59891e83b092ae4c851c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", size = 154993, upload-time = "2025-05-02T08:34:17.134Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a2/5e4c187680728219254ef107a6949c60ee0e9a916a5dadb148c7ae82459c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", size = 147382, upload-time = "2025-05-02T08:34:19.081Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fe/56aca740dda674f0cc1ba1418c4d84534be51f639b5f98f538b332dc9a95/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", size = 149536, upload-time = "2025-05-02T08:34:21.073Z" }, - { url = "https://files.pythonhosted.org/packages/53/13/db2e7779f892386b589173dd689c1b1e304621c5792046edd8a978cbf9e0/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", size = 151349, upload-time = "2025-05-02T08:34:23.193Z" }, - { url = "https://files.pythonhosted.org/packages/69/35/e52ab9a276186f729bce7a0638585d2982f50402046e4b0faa5d2c3ef2da/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", size = 146365, upload-time = "2025-05-02T08:34:25.187Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d8/af7333f732fc2e7635867d56cb7c349c28c7094910c72267586947561b4b/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", size = 154499, upload-time = "2025-05-02T08:34:27.359Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3d/a5b2e48acef264d71e036ff30bcc49e51bde80219bb628ba3e00cf59baac/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", size = 157735, upload-time = "2025-05-02T08:34:29.798Z" }, - { url = "https://files.pythonhosted.org/packages/85/d8/23e2c112532a29f3eef374375a8684a4f3b8e784f62b01da931186f43494/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", size = 154786, upload-time = "2025-05-02T08:34:31.858Z" }, - { url = "https://files.pythonhosted.org/packages/c7/57/93e0169f08ecc20fe82d12254a200dfaceddc1c12a4077bf454ecc597e33/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", size = 150203, upload-time = "2025-05-02T08:34:33.88Z" }, - { url = "https://files.pythonhosted.org/packages/2c/9d/9bf2b005138e7e060d7ebdec7503d0ef3240141587651f4b445bdf7286c2/charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", size = 98436, upload-time = "2025-05-02T08:34:35.907Z" }, - { url = "https://files.pythonhosted.org/packages/6d/24/5849d46cf4311bbf21b424c443b09b459f5b436b1558c04e45dbb7cc478b/charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", size = 105772, upload-time = "2025-05-02T08:34:37.935Z" }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/d6/98/f3b8013223728a99b908c9344da3aa04ee6e3fa235f19409033eda92fb78/charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", size = 207695, upload-time = "2025-08-09T07:55:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/21/40/5188be1e3118c82dcb7c2a5ba101b783822cfb413a0268ed3be0468532de/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", size = 147153, upload-time = "2025-08-09T07:55:38.467Z" }, + { url = "https://files.pythonhosted.org/packages/37/60/5d0d74bc1e1380f0b72c327948d9c2aca14b46a9efd87604e724260f384c/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", size = 160428, upload-time = "2025-08-09T07:55:40.072Z" }, + { url = "https://files.pythonhosted.org/packages/85/9a/d891f63722d9158688de58d050c59dc3da560ea7f04f4c53e769de5140f5/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", size = 157627, upload-time = "2025-08-09T07:55:41.706Z" }, + { url = "https://files.pythonhosted.org/packages/65/1a/7425c952944a6521a9cfa7e675343f83fd82085b8af2b1373a2409c683dc/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", size = 152388, upload-time = "2025-08-09T07:55:43.262Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c9/a2c9c2a355a8594ce2446085e2ec97fd44d323c684ff32042e2a6b718e1d/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", size = 150077, upload-time = "2025-08-09T07:55:44.903Z" }, + { url = "https://files.pythonhosted.org/packages/3b/38/20a1f44e4851aa1c9105d6e7110c9d020e093dfa5836d712a5f074a12bf7/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", size = 161631, upload-time = "2025-08-09T07:55:46.346Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fa/384d2c0f57edad03d7bec3ebefb462090d8905b4ff5a2d2525f3bb711fac/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", size = 159210, upload-time = "2025-08-09T07:55:47.539Z" }, + { url = "https://files.pythonhosted.org/packages/33/9e/eca49d35867ca2db336b6ca27617deed4653b97ebf45dfc21311ce473c37/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", size = 153739, upload-time = "2025-08-09T07:55:48.744Z" }, + { url = "https://files.pythonhosted.org/packages/2a/91/26c3036e62dfe8de8061182d33be5025e2424002125c9500faff74a6735e/charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", size = 99825, upload-time = "2025-08-09T07:55:50.305Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/f05db471f81af1fa01839d44ae2a8bfeec8d2a8b4590f16c4e7393afd323/charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", size = 107452, upload-time = "2025-08-09T07:55:51.461Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b5/991245018615474a60965a7c9cd2b4efbaabd16d582a5547c47ee1c7730b/charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", size = 204483, upload-time = "2025-08-09T07:55:53.12Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2a/ae245c41c06299ec18262825c1569c5d3298fc920e4ddf56ab011b417efd/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", size = 145520, upload-time = "2025-08-09T07:55:54.712Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/b3b6c76e7a635748c4421d2b92c7b8f90a432f98bda5082049af37ffc8e3/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", size = 158876, upload-time = "2025-08-09T07:55:56.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e6/63bb0e10f90a8243c5def74b5b105b3bbbfb3e7bb753915fe333fb0c11ea/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", size = 156083, upload-time = "2025-08-09T07:55:57.582Z" }, + { url = "https://files.pythonhosted.org/packages/87/df/b7737ff046c974b183ea9aa111b74185ac8c3a326c6262d413bd5a1b8c69/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", size = 150295, upload-time = "2025-08-09T07:55:59.147Z" }, + { url = "https://files.pythonhosted.org/packages/61/f1/190d9977e0084d3f1dc169acd060d479bbbc71b90bf3e7bf7b9927dec3eb/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", size = 148379, upload-time = "2025-08-09T07:56:00.364Z" }, + { url = "https://files.pythonhosted.org/packages/4c/92/27dbe365d34c68cfe0ca76f1edd70e8705d82b378cb54ebbaeabc2e3029d/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", size = 160018, upload-time = "2025-08-09T07:56:01.678Z" }, + { url = "https://files.pythonhosted.org/packages/99/04/baae2a1ea1893a01635d475b9261c889a18fd48393634b6270827869fa34/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", size = 157430, upload-time = "2025-08-09T07:56:02.87Z" }, + { url = "https://files.pythonhosted.org/packages/2f/36/77da9c6a328c54d17b960c89eccacfab8271fdaaa228305330915b88afa9/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", size = 151600, upload-time = "2025-08-09T07:56:04.089Z" }, + { url = "https://files.pythonhosted.org/packages/64/d4/9eb4ff2c167edbbf08cdd28e19078bf195762e9bd63371689cab5ecd3d0d/charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", size = 99616, upload-time = "2025-08-09T07:56:05.658Z" }, + { url = "https://files.pythonhosted.org/packages/f4/9c/996a4a028222e7761a96634d1820de8a744ff4327a00ada9c8942033089b/charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", size = 107108, upload-time = "2025-08-09T07:56:07.176Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload-time = "2025-08-09T07:56:08.475Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload-time = "2025-08-09T07:56:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload-time = "2025-08-09T07:56:11.326Z" }, + { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload-time = "2025-08-09T07:56:13.014Z" }, + { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload-time = "2025-08-09T07:56:14.428Z" }, + { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload-time = "2025-08-09T07:56:16.051Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload-time = "2025-08-09T07:56:17.314Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload-time = "2025-08-09T07:56:18.641Z" }, + { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload-time = "2025-08-09T07:56:20.289Z" }, + { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload-time = "2025-08-09T07:56:21.551Z" }, + { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload-time = "2025-08-09T07:56:23.115Z" }, + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ca/9a0983dd5c8e9733565cf3db4df2b0a2e9a82659fd8aa2a868ac6e4a991f/charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", size = 207520, upload-time = "2025-08-09T07:57:11.026Z" }, + { url = "https://files.pythonhosted.org/packages/39/c6/99271dc37243a4f925b09090493fb96c9333d7992c6187f5cfe5312008d2/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", size = 147307, upload-time = "2025-08-09T07:57:12.4Z" }, + { url = "https://files.pythonhosted.org/packages/e4/69/132eab043356bba06eb333cc2cc60c6340857d0a2e4ca6dc2b51312886b3/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", size = 160448, upload-time = "2025-08-09T07:57:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/04/9a/914d294daa4809c57667b77470533e65def9c0be1ef8b4c1183a99170e9d/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", size = 157758, upload-time = "2025-08-09T07:57:14.979Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a8/6f5bcf1bcf63cb45625f7c5cadca026121ff8a6c8a3256d8d8cd59302663/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", size = 152487, upload-time = "2025-08-09T07:57:16.332Z" }, + { url = "https://files.pythonhosted.org/packages/c4/72/d3d0e9592f4e504f9dea08b8db270821c909558c353dc3b457ed2509f2fb/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", size = 150054, upload-time = "2025-08-09T07:57:17.576Z" }, + { url = "https://files.pythonhosted.org/packages/20/30/5f64fe3981677fe63fa987b80e6c01042eb5ff653ff7cec1b7bd9268e54e/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", size = 161703, upload-time = "2025-08-09T07:57:20.012Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ef/dd08b2cac9284fd59e70f7d97382c33a3d0a926e45b15fc21b3308324ffd/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", size = 159096, upload-time = "2025-08-09T07:57:21.329Z" }, + { url = "https://files.pythonhosted.org/packages/45/8c/dcef87cfc2b3f002a6478f38906f9040302c68aebe21468090e39cde1445/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", size = 153852, upload-time = "2025-08-09T07:57:22.608Z" }, + { url = "https://files.pythonhosted.org/packages/63/86/9cbd533bd37883d467fcd1bd491b3547a3532d0fbb46de2b99feeebf185e/charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", size = 99840, upload-time = "2025-08-09T07:57:23.883Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d6/7e805c8e5c46ff9729c49950acc4ee0aeb55efb8b3a56687658ad10c3216/charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", size = 107438, upload-time = "2025-08-09T07:57:25.287Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, ] [[package]] @@ -453,7 +454,7 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.69" +version = "0.3.74" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch", marker = "python_full_version >= '3.11'" }, @@ -464,9 +465,9 @@ dependencies = [ { name = "tenacity", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/26/c4770d3933237cde2918d502e3b0a8b6ce100b296840b632658f3e59b341/langchain_core-0.3.69.tar.gz", hash = "sha256:c132961117cc7f0227a4c58dd3e209674a6dd5b7e74abc61a0df93b0d736e283", size = 563824, upload-time = "2025-07-15T21:19:56.626Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/c6/5d755a0f1f4857abbe5ea6f5907ed0e2b5df52bf4dde0a0fd768290e3084/langchain_core-0.3.74.tar.gz", hash = "sha256:ff604441aeade942fbcc0a3860a592daba7671345230c2078ba2eb5f82b6ba76", size = 569553, upload-time = "2025-08-07T20:47:05.094Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/7b/bb7b088440ff9cc55e9e6eba94162cbdcd3b1693c194e1ad4764acba29b9/langchain_core-0.3.69-py3-none-any.whl", hash = "sha256:383e9cb4919f7ef4b24bf8552ef42e4323c064924fea88b28dd5d7ddb740d3b8", size = 441556, upload-time = "2025-07-15T21:19:55.342Z" }, + { url = "https://files.pythonhosted.org/packages/4d/26/545283681ac0379d31c7ad0bac5f195e1982092d76c65ca048db9e3cec0e/langchain_core-0.3.74-py3-none-any.whl", hash = "sha256:088338b5bc2f6a66892f9afc777992c24ee3188f41cbc603d09181e34a228ce7", size = 443453, upload-time = "2025-08-07T20:47:03.853Z" }, ] [[package]] @@ -488,7 +489,7 @@ wheels = [ [[package]] name = "langgraph-api" -version = "0.2.137" +version = "0.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cloudpickle", marker = "python_full_version >= '3.11'" }, @@ -511,9 +512,9 @@ dependencies = [ { name = "uvicorn", marker = "python_full_version >= '3.11'" }, { name = "watchfiles", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/05/13/bb3601d76d35f285564ff4b963f3c946aaa854ebc910d89d5ed535a8e2e8/langgraph_api-0.2.137.tar.gz", hash = "sha256:7791bda6ae91e305b3bc95ece338c67dd89f3d5cf735e7ef1ffe381fc2629b44", size = 255804, upload-time = "2025-08-20T07:32:43.969Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/7c/37bd3f791dc00698b405288dc764e078ed143c7ecd65e2e72cc0e386d3f1/langgraph_api-0.3.0.tar.gz", hash = "sha256:b908c34ebb9c42c2f4fb17f3f3a71e39ee0dfb283b7028d73d4bc1f4681914e7", size = 255812, upload-time = "2025-08-21T00:49:28.347Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d3/bbf69e3443313a014cbe1365f21f7930dd86e2273b6d1aa1d75f03db5221/langgraph_api-0.2.137-py3-none-any.whl", hash = "sha256:42a914903a2722fc12e846f4607a2b5d9f39a084fe091036f3385d9b69c9c8e8", size = 206034, upload-time = "2025-08-20T07:32:42.498Z" }, + { url = "https://files.pythonhosted.org/packages/06/34/cdbb0b5abf603fd01c91a63c9436fbe733f56cae448f42c7a1c7e3f4508e/langgraph_api-0.3.0-py3-none-any.whl", hash = "sha256:b76a7ced3bb559560b42a8d8f3cc7cff638c2022d0881d476caa1d511fb36a2e", size = 206012, upload-time = "2025-08-21T00:49:26.917Z" }, ] [[package]] @@ -560,7 +561,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.1.7" }, - { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.3.0" }, + { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.4.0" }, { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.8" }, { name = "langgraph-sdk", marker = "python_full_version >= '3.11'", specifier = ">=0.1.0" }, { name = "python-dotenv", marker = "extra == 'inmem'", specifier = ">=0.8.0" }, @@ -624,7 +625,7 @@ wheels = [ [[package]] name = "langsmith" -version = "0.4.6" +version = "0.4.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "python_full_version >= '3.11'" }, @@ -635,9 +636,9 @@ dependencies = [ { name = "requests-toolbelt", marker = "python_full_version >= '3.11'" }, { name = "zstandard", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/9e/11536528c6e351820ad3fca0d2807f0e0f0619ff907529c78f68ba648497/langsmith-0.4.6.tar.gz", hash = "sha256:9189dbc9c60f2086ca3a1f0110cfe3aff6b0b7c2e0e3384f9572e70502e7933c", size = 352364, upload-time = "2025-07-15T19:43:18.541Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/7a/a17f61670bec8fea8194fb0fef79812d02fc7d2b9660eb2c9d2d514f265f/langsmith-0.4.15.tar.gz", hash = "sha256:c9a4ec4b7b0f5f70e7be204ee9c5b17db872cc3015cd04851e2703a0966b9ff1", size = 930330, upload-time = "2025-08-20T17:48:32.552Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/9b/f2be47db823e89448ea41bfd8fc5ce6a995556bd25be4c23e5b3bb5b6c9b/langsmith-0.4.6-py3-none-any.whl", hash = "sha256:900e83fe59ee672bcf2f75c8bb47cd012bf8154d92a99c0355fc38b6485cbd3e", size = 367901, upload-time = "2025-07-15T19:43:16.508Z" }, + { url = "https://files.pythonhosted.org/packages/07/05/fcd7ee91990399fb7e1042da4b196bc99174f5282c6cb266607770abe935/langsmith-0.4.15-py3-none-any.whl", hash = "sha256:633719f9fdafe4297459b0ab442f536d6c0734b36c186ded67343d335e5ea0b3", size = 375733, upload-time = "2025-08-20T17:48:30.254Z" }, ] [[package]] @@ -685,7 +686,7 @@ wheels = [ [[package]] name = "mypy" -version = "1.17.0" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, @@ -693,39 +694,45 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/e3/034322d5a779685218ed69286c32faa505247f1f096251ef66c8fd203b08/mypy-1.17.0.tar.gz", hash = "sha256:e5d7ccc08ba089c06e2f5629c660388ef1fee708444f1dee0b9203fa031dee03", size = 3352114, upload-time = "2025-07-14T20:34:30.181Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/22/ea637422dedf0bf36f3ef238eab4e455e2a0dcc3082b5cc067615347ab8e/mypy-1.17.1.tar.gz", hash = "sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01", size = 3352570, upload-time = "2025-07-31T07:54:19.204Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/31/e762baa3b73905c856d45ab77b4af850e8159dffffd86a52879539a08c6b/mypy-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8e08de6138043108b3b18f09d3f817a4783912e48828ab397ecf183135d84d6", size = 10998313, upload-time = "2025-07-14T20:33:24.519Z" }, - { url = "https://files.pythonhosted.org/packages/1c/c1/25b2f0d46fb7e0b5e2bee61ec3a47fe13eff9e3c2f2234f144858bbe6485/mypy-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce4a17920ec144647d448fc43725b5873548b1aae6c603225626747ededf582d", size = 10128922, upload-time = "2025-07-14T20:34:06.414Z" }, - { url = "https://files.pythonhosted.org/packages/02/78/6d646603a57aa8a2886df1b8881fe777ea60f28098790c1089230cd9c61d/mypy-1.17.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ff25d151cc057fdddb1cb1881ef36e9c41fa2a5e78d8dd71bee6e4dcd2bc05b", size = 11913524, upload-time = "2025-07-14T20:33:19.109Z" }, - { url = "https://files.pythonhosted.org/packages/4f/19/dae6c55e87ee426fb76980f7e78484450cad1c01c55a1dc4e91c930bea01/mypy-1.17.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93468cf29aa9a132bceb103bd8475f78cacde2b1b9a94fd978d50d4bdf616c9a", size = 12650527, upload-time = "2025-07-14T20:32:44.095Z" }, - { url = "https://files.pythonhosted.org/packages/86/e1/f916845a235235a6c1e4d4d065a3930113767001d491b8b2e1b61ca56647/mypy-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:98189382b310f16343151f65dd7e6867386d3e35f7878c45cfa11383d175d91f", size = 12897284, upload-time = "2025-07-14T20:33:38.168Z" }, - { url = "https://files.pythonhosted.org/packages/ae/dc/414760708a4ea1b096bd214d26a24e30ac5e917ef293bc33cdb6fe22d2da/mypy-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:c004135a300ab06a045c1c0d8e3f10215e71d7b4f5bb9a42ab80236364429937", size = 9506493, upload-time = "2025-07-14T20:34:01.093Z" }, - { url = "https://files.pythonhosted.org/packages/d4/24/82efb502b0b0f661c49aa21cfe3e1999ddf64bf5500fc03b5a1536a39d39/mypy-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d4fe5c72fd262d9c2c91c1117d16aac555e05f5beb2bae6a755274c6eec42be", size = 10914150, upload-time = "2025-07-14T20:31:51.985Z" }, - { url = "https://files.pythonhosted.org/packages/03/96/8ef9a6ff8cedadff4400e2254689ca1dc4b420b92c55255b44573de10c54/mypy-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96b196e5c16f41b4f7736840e8455958e832871990c7ba26bf58175e357ed61", size = 10039845, upload-time = "2025-07-14T20:32:30.527Z" }, - { url = "https://files.pythonhosted.org/packages/df/32/7ce359a56be779d38021d07941cfbb099b41411d72d827230a36203dbb81/mypy-1.17.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73a0ff2dd10337ceb521c080d4147755ee302dcde6e1a913babd59473904615f", size = 11837246, upload-time = "2025-07-14T20:32:01.28Z" }, - { url = "https://files.pythonhosted.org/packages/82/16/b775047054de4d8dbd668df9137707e54b07fe18c7923839cd1e524bf756/mypy-1.17.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24cfcc1179c4447854e9e406d3af0f77736d631ec87d31c6281ecd5025df625d", size = 12571106, upload-time = "2025-07-14T20:34:26.942Z" }, - { url = "https://files.pythonhosted.org/packages/a1/cf/fa33eaf29a606102c8d9ffa45a386a04c2203d9ad18bf4eef3e20c43ebc8/mypy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56f180ff6430e6373db7a1d569317675b0a451caf5fef6ce4ab365f5f2f6c3", size = 12759960, upload-time = "2025-07-14T20:33:42.882Z" }, - { url = "https://files.pythonhosted.org/packages/94/75/3f5a29209f27e739ca57e6350bc6b783a38c7621bdf9cac3ab8a08665801/mypy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:eafaf8b9252734400f9b77df98b4eee3d2eecab16104680d51341c75702cad70", size = 9503888, upload-time = "2025-07-14T20:32:34.392Z" }, - { url = "https://files.pythonhosted.org/packages/12/e9/e6824ed620bbf51d3bf4d6cbbe4953e83eaf31a448d1b3cfb3620ccb641c/mypy-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f986f1cab8dbec39ba6e0eaa42d4d3ac6686516a5d3dccd64be095db05ebc6bb", size = 11086395, upload-time = "2025-07-14T20:34:11.452Z" }, - { url = "https://files.pythonhosted.org/packages/ba/51/a4afd1ae279707953be175d303f04a5a7bd7e28dc62463ad29c1c857927e/mypy-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51e455a54d199dd6e931cd7ea987d061c2afbaf0960f7f66deef47c90d1b304d", size = 10120052, upload-time = "2025-07-14T20:33:09.897Z" }, - { url = "https://files.pythonhosted.org/packages/8a/71/19adfeac926ba8205f1d1466d0d360d07b46486bf64360c54cb5a2bd86a8/mypy-1.17.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3204d773bab5ff4ebbd1f8efa11b498027cd57017c003ae970f310e5b96be8d8", size = 11861806, upload-time = "2025-07-14T20:32:16.028Z" }, - { url = "https://files.pythonhosted.org/packages/0b/64/d6120eca3835baf7179e6797a0b61d6c47e0bc2324b1f6819d8428d5b9ba/mypy-1.17.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1051df7ec0886fa246a530ae917c473491e9a0ba6938cfd0ec2abc1076495c3e", size = 12744371, upload-time = "2025-07-14T20:33:33.503Z" }, - { url = "https://files.pythonhosted.org/packages/1f/dc/56f53b5255a166f5bd0f137eed960e5065f2744509dfe69474ff0ba772a5/mypy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f773c6d14dcc108a5b141b4456b0871df638eb411a89cd1c0c001fc4a9d08fc8", size = 12914558, upload-time = "2025-07-14T20:33:56.961Z" }, - { url = "https://files.pythonhosted.org/packages/69/ac/070bad311171badc9add2910e7f89271695a25c136de24bbafc7eded56d5/mypy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:1619a485fd0e9c959b943c7b519ed26b712de3002d7de43154a489a2d0fd817d", size = 9585447, upload-time = "2025-07-14T20:32:20.594Z" }, - { url = "https://files.pythonhosted.org/packages/be/7b/5f8ab461369b9e62157072156935cec9d272196556bdc7c2ff5f4c7c0f9b/mypy-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c41aa59211e49d717d92b3bb1238c06d387c9325d3122085113c79118bebb06", size = 11070019, upload-time = "2025-07-14T20:32:07.99Z" }, - { url = "https://files.pythonhosted.org/packages/9c/f8/c49c9e5a2ac0badcc54beb24e774d2499748302c9568f7f09e8730e953fa/mypy-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e69db1fb65b3114f98c753e3930a00514f5b68794ba80590eb02090d54a5d4a", size = 10114457, upload-time = "2025-07-14T20:33:47.285Z" }, - { url = "https://files.pythonhosted.org/packages/89/0c/fb3f9c939ad9beed3e328008b3fb90b20fda2cddc0f7e4c20dbefefc3b33/mypy-1.17.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03ba330b76710f83d6ac500053f7727270b6b8553b0423348ffb3af6f2f7b889", size = 11857838, upload-time = "2025-07-14T20:33:14.462Z" }, - { url = "https://files.pythonhosted.org/packages/4c/66/85607ab5137d65e4f54d9797b77d5a038ef34f714929cf8ad30b03f628df/mypy-1.17.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037bc0f0b124ce46bfde955c647f3e395c6174476a968c0f22c95a8d2f589bba", size = 12731358, upload-time = "2025-07-14T20:32:25.579Z" }, - { url = "https://files.pythonhosted.org/packages/73/d0/341dbbfb35ce53d01f8f2969facbb66486cee9804048bf6c01b048127501/mypy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38876106cb6132259683632b287238858bd58de267d80defb6f418e9ee50658", size = 12917480, upload-time = "2025-07-14T20:34:21.868Z" }, - { url = "https://files.pythonhosted.org/packages/64/63/70c8b7dbfc520089ac48d01367a97e8acd734f65bd07813081f508a8c94c/mypy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:d30ba01c0f151998f367506fab31c2ac4527e6a7b2690107c7a7f9e3cb419a9c", size = 9589666, upload-time = "2025-07-14T20:34:16.841Z" }, - { url = "https://files.pythonhosted.org/packages/9f/a0/6263dd11941231f688f0a8f2faf90ceac1dc243d148d314a089d2fe25108/mypy-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63e751f1b5ab51d6f3d219fe3a2fe4523eaa387d854ad06906c63883fde5b1ab", size = 10988185, upload-time = "2025-07-14T20:33:04.797Z" }, - { url = "https://files.pythonhosted.org/packages/02/13/b8f16d6b0dc80277129559c8e7dbc9011241a0da8f60d031edb0e6e9ac8f/mypy-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fb09d05e0f1c329a36dcd30e27564a3555717cde87301fae4fb542402ddfad", size = 10120169, upload-time = "2025-07-14T20:32:38.84Z" }, - { url = "https://files.pythonhosted.org/packages/14/ef/978ba79df0d65af680e20d43121363cf643eb79b04bf3880d01fc8afeb6f/mypy-1.17.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b72c34ce05ac3a1361ae2ebb50757fb6e3624032d91488d93544e9f82db0ed6c", size = 11918121, upload-time = "2025-07-14T20:33:52.328Z" }, - { url = "https://files.pythonhosted.org/packages/f4/10/55ef70b104151a0d8280474f05268ff0a2a79be8d788d5e647257d121309/mypy-1.17.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:434ad499ad8dde8b2f6391ddfa982f41cb07ccda8e3c67781b1bfd4e5f9450a8", size = 12648821, upload-time = "2025-07-14T20:32:59.631Z" }, - { url = "https://files.pythonhosted.org/packages/26/8c/7781fcd2e1eef48fbedd3a422c21fe300a8e03ed5be2eb4bd10246a77f4e/mypy-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f105f61a5eff52e137fd73bee32958b2add9d9f0a856f17314018646af838e97", size = 12896955, upload-time = "2025-07-14T20:32:49.543Z" }, - { url = "https://files.pythonhosted.org/packages/78/13/03ac759dabe86e98ca7b6681f114f90ee03f3ff8365a57049d311bd4a4e3/mypy-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:ba06254a5a22729853209550d80f94e28690d5530c661f9416a68ac097b13fc4", size = 9512957, upload-time = "2025-07-14T20:33:28.619Z" }, - { url = "https://files.pythonhosted.org/packages/e3/fc/ee058cc4316f219078464555873e99d170bde1d9569abd833300dbeb484a/mypy-1.17.0-py3-none-any.whl", hash = "sha256:15d9d0018237ab058e5de3d8fce61b6fa72cc59cc78fd91f1b474bce12abf496", size = 2283195, upload-time = "2025-07-14T20:31:54.753Z" }, + { url = "https://files.pythonhosted.org/packages/77/a9/3d7aa83955617cdf02f94e50aab5c830d205cfa4320cf124ff64acce3a8e/mypy-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3fbe6d5555bf608c47203baa3e72dbc6ec9965b3d7c318aa9a4ca76f465bd972", size = 11003299, upload-time = "2025-07-31T07:54:06.425Z" }, + { url = "https://files.pythonhosted.org/packages/83/e8/72e62ff837dd5caaac2b4a5c07ce769c8e808a00a65e5d8f94ea9c6f20ab/mypy-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80ef5c058b7bce08c83cac668158cb7edea692e458d21098c7d3bce35a5d43e7", size = 10125451, upload-time = "2025-07-31T07:53:52.974Z" }, + { url = "https://files.pythonhosted.org/packages/7d/10/f3f3543f6448db11881776f26a0ed079865926b0c841818ee22de2c6bbab/mypy-1.17.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a580f8a70c69e4a75587bd925d298434057fe2a428faaf927ffe6e4b9a98df", size = 11916211, upload-time = "2025-07-31T07:53:18.879Z" }, + { url = "https://files.pythonhosted.org/packages/06/bf/63e83ed551282d67bb3f7fea2cd5561b08d2bb6eb287c096539feb5ddbc5/mypy-1.17.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd86bb649299f09d987a2eebb4d52d10603224500792e1bee18303bbcc1ce390", size = 12652687, upload-time = "2025-07-31T07:53:30.544Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/68f2eeef11facf597143e85b694a161868b3b006a5fbad50e09ea117ef24/mypy-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a76906f26bd8d51ea9504966a9c25419f2e668f012e0bdf3da4ea1526c534d94", size = 12896322, upload-time = "2025-07-31T07:53:50.74Z" }, + { url = "https://files.pythonhosted.org/packages/a3/87/8e3e9c2c8bd0d7e071a89c71be28ad088aaecbadf0454f46a540bda7bca6/mypy-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:e79311f2d904ccb59787477b7bd5d26f3347789c06fcd7656fa500875290264b", size = 9507962, upload-time = "2025-07-31T07:53:08.431Z" }, + { url = "https://files.pythonhosted.org/packages/46/cf/eadc80c4e0a70db1c08921dcc220357ba8ab2faecb4392e3cebeb10edbfa/mypy-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58", size = 10921009, upload-time = "2025-07-31T07:53:23.037Z" }, + { url = "https://files.pythonhosted.org/packages/5d/c1/c869d8c067829ad30d9bdae051046561552516cfb3a14f7f0347b7d973ee/mypy-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5", size = 10047482, upload-time = "2025-07-31T07:53:26.151Z" }, + { url = "https://files.pythonhosted.org/packages/98/b9/803672bab3fe03cee2e14786ca056efda4bb511ea02dadcedde6176d06d0/mypy-1.17.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd", size = 11832883, upload-time = "2025-07-31T07:53:47.948Z" }, + { url = "https://files.pythonhosted.org/packages/88/fb/fcdac695beca66800918c18697b48833a9a6701de288452b6715a98cfee1/mypy-1.17.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b", size = 12566215, upload-time = "2025-07-31T07:54:04.031Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/a932da3d3dace99ee8eb2043b6ab03b6768c36eb29a02f98f46c18c0da0e/mypy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5", size = 12751956, upload-time = "2025-07-31T07:53:36.263Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cf/6438a429e0f2f5cab8bc83e53dbebfa666476f40ee322e13cac5e64b79e7/mypy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b", size = 9507307, upload-time = "2025-07-31T07:53:59.734Z" }, + { url = "https://files.pythonhosted.org/packages/17/a2/7034d0d61af8098ec47902108553122baa0f438df8a713be860f7407c9e6/mypy-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb", size = 11086295, upload-time = "2025-07-31T07:53:28.124Z" }, + { url = "https://files.pythonhosted.org/packages/14/1f/19e7e44b594d4b12f6ba8064dbe136505cec813549ca3e5191e40b1d3cc2/mypy-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403", size = 10112355, upload-time = "2025-07-31T07:53:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/5b/69/baa33927e29e6b4c55d798a9d44db5d394072eef2bdc18c3e2048c9ed1e9/mypy-1.17.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056", size = 11875285, upload-time = "2025-07-31T07:53:55.293Z" }, + { url = "https://files.pythonhosted.org/packages/90/13/f3a89c76b0a41e19490b01e7069713a30949d9a6c147289ee1521bcea245/mypy-1.17.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341", size = 12737895, upload-time = "2025-07-31T07:53:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/23/a1/c4ee79ac484241301564072e6476c5a5be2590bc2e7bfd28220033d2ef8f/mypy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb", size = 12931025, upload-time = "2025-07-31T07:54:17.125Z" }, + { url = "https://files.pythonhosted.org/packages/89/b8/7409477be7919a0608900e6320b155c72caab4fef46427c5cc75f85edadd/mypy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19", size = 9584664, upload-time = "2025-07-31T07:54:12.842Z" }, + { url = "https://files.pythonhosted.org/packages/5b/82/aec2fc9b9b149f372850291827537a508d6c4d3664b1750a324b91f71355/mypy-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7", size = 11075338, upload-time = "2025-07-31T07:53:38.873Z" }, + { url = "https://files.pythonhosted.org/packages/07/ac/ee93fbde9d2242657128af8c86f5d917cd2887584cf948a8e3663d0cd737/mypy-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81", size = 10113066, upload-time = "2025-07-31T07:54:14.707Z" }, + { url = "https://files.pythonhosted.org/packages/5a/68/946a1e0be93f17f7caa56c45844ec691ca153ee8b62f21eddda336a2d203/mypy-1.17.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6", size = 11875473, upload-time = "2025-07-31T07:53:14.504Z" }, + { url = "https://files.pythonhosted.org/packages/9f/0f/478b4dce1cb4f43cf0f0d00fba3030b21ca04a01b74d1cd272a528cf446f/mypy-1.17.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849", size = 12744296, upload-time = "2025-07-31T07:53:03.896Z" }, + { url = "https://files.pythonhosted.org/packages/ca/70/afa5850176379d1b303f992a828de95fc14487429a7139a4e0bdd17a8279/mypy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14", size = 12914657, upload-time = "2025-07-31T07:54:08.576Z" }, + { url = "https://files.pythonhosted.org/packages/53/f9/4a83e1c856a3d9c8f6edaa4749a4864ee98486e9b9dbfbc93842891029c2/mypy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a", size = 9593320, upload-time = "2025-07-31T07:53:01.341Z" }, + { url = "https://files.pythonhosted.org/packages/38/56/79c2fac86da57c7d8c48622a05873eaab40b905096c33597462713f5af90/mypy-1.17.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:15a83369400454c41ed3a118e0cc58bd8123921a602f385cb6d6ea5df050c733", size = 11040037, upload-time = "2025-07-31T07:54:10.942Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c3/adabe6ff53638e3cad19e3547268482408323b1e68bf082c9119000cd049/mypy-1.17.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55b918670f692fc9fba55c3298d8a3beae295c5cded0a55dccdc5bbead814acd", size = 10131550, upload-time = "2025-07-31T07:53:41.307Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c5/2e234c22c3bdeb23a7817af57a58865a39753bde52c74e2c661ee0cfc640/mypy-1.17.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:62761474061feef6f720149d7ba876122007ddc64adff5ba6f374fda35a018a0", size = 11872963, upload-time = "2025-07-31T07:53:16.878Z" }, + { url = "https://files.pythonhosted.org/packages/ab/26/c13c130f35ca8caa5f2ceab68a247775648fdcd6c9a18f158825f2bc2410/mypy-1.17.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c49562d3d908fd49ed0938e5423daed8d407774a479b595b143a3d7f87cdae6a", size = 12710189, upload-time = "2025-07-31T07:54:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/82/df/c7d79d09f6de8383fe800521d066d877e54d30b4fb94281c262be2df84ef/mypy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:397fba5d7616a5bc60b45c7ed204717eaddc38f826e3645402c426057ead9a91", size = 12900322, upload-time = "2025-07-31T07:53:10.551Z" }, + { url = "https://files.pythonhosted.org/packages/b8/98/3d5a48978b4f708c55ae832619addc66d677f6dc59f3ebad71bae8285ca6/mypy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:9d6b20b97d373f41617bd0708fd46aa656059af57f2ef72aa8c7d6a2b73b74ed", size = 9751879, upload-time = "2025-07-31T07:52:56.683Z" }, + { url = "https://files.pythonhosted.org/packages/29/cb/673e3d34e5d8de60b3a61f44f80150a738bff568cd6b7efb55742a605e98/mypy-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5d1092694f166a7e56c805caaf794e0585cabdbf1df36911c414e4e9abb62ae9", size = 10992466, upload-time = "2025-07-31T07:53:57.574Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d0/fe1895836eea3a33ab801561987a10569df92f2d3d4715abf2cfeaa29cb2/mypy-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79d44f9bfb004941ebb0abe8eff6504223a9c1ac51ef967d1263c6572bbebc99", size = 10117638, upload-time = "2025-07-31T07:53:34.256Z" }, + { url = "https://files.pythonhosted.org/packages/97/f3/514aa5532303aafb95b9ca400a31054a2bd9489de166558c2baaeea9c522/mypy-1.17.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b01586eed696ec905e61bd2568f48740f7ac4a45b3a468e6423a03d3788a51a8", size = 11915673, upload-time = "2025-07-31T07:52:59.361Z" }, + { url = "https://files.pythonhosted.org/packages/ab/c3/c0805f0edec96fe8e2c048b03769a6291523d509be8ee7f56ae922fa3882/mypy-1.17.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43808d9476c36b927fbcd0b0255ce75efe1b68a080154a38ae68a7e62de8f0f8", size = 12649022, upload-time = "2025-07-31T07:53:45.92Z" }, + { url = "https://files.pythonhosted.org/packages/45/3e/d646b5a298ada21a8512fa7e5531f664535a495efa672601702398cea2b4/mypy-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:feb8cc32d319edd5859da2cc084493b3e2ce5e49a946377663cc90f6c15fb259", size = 12895536, upload-time = "2025-07-31T07:53:06.17Z" }, + { url = "https://files.pythonhosted.org/packages/14/55/e13d0dcd276975927d1f4e9e2ec4fd409e199f01bdc671717e673cc63a22/mypy-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d7598cf74c3e16539d4e2f0b8d8c318e00041553d83d4861f87c7a72e95ac24d", size = 9512564, upload-time = "2025-07-31T07:53:12.346Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f3/8fcd2af0f5b806f6cf463efaffd3c9548a28f84220493ecd38d127b6b66d/mypy-1.17.1-py3-none-any.whl", hash = "sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9", size = 2283411, upload-time = "2025-07-31T07:53:24.664Z" }, ] [[package]] @@ -739,81 +746,92 @@ wheels = [ [[package]] name = "orjson" -version = "3.11.0" +version = "3.11.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/29/87/03ababa86d984952304ac8ce9fbd3a317afb4a225b9a81f9b606ac60c873/orjson-3.11.0.tar.gz", hash = "sha256:2e4c129da624f291bcc607016a99e7f04a353f6874f3bd8d9b47b88597d5f700", size = 5318246, upload-time = "2025-07-15T16:08:29.194Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/1d/5e0ae38788bdf0721326695e65fdf41405ed535f633eb0df0f06f57552fa/orjson-3.11.2.tar.gz", hash = "sha256:91bdcf5e69a8fd8e8bdb3de32b31ff01d2bd60c1e8d5fe7d5afabdcf19920309", size = 5470739, upload-time = "2025-08-12T15:12:28.626Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/aa/50818f480f0edcb33290c8f35eef6dd3a31e2ff7e1195f8b236ac7419811/orjson-3.11.0-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b8913baba9751f7400f8fa4ec18a8b618ff01177490842e39e47b66c1b04bc79", size = 240422, upload-time = "2025-07-15T16:06:23.029Z" }, - { url = "https://files.pythonhosted.org/packages/16/50/5235aff455fa76337493d21e68618e7cf53aa9db011aaeb06cf378f1344c/orjson-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d4d86910554de5c9c87bc560b3bdd315cc3988adbdc2acf5dda3797079407ed", size = 132473, upload-time = "2025-07-15T16:06:25.598Z" }, - { url = "https://files.pythonhosted.org/packages/23/93/bf1c4e77e7affc46cca13fb852842a86dca2dabbee1d91515ed17b1c21c4/orjson-3.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84ae3d329360cf18fb61b67c505c00dedb61b0ee23abfd50f377a58e7d7bed06", size = 127195, upload-time = "2025-07-15T16:06:27.001Z" }, - { url = "https://files.pythonhosted.org/packages/7e/2d/64b52c6827e43aa3d98def19e188e091a6c574ca13d9ecef5f3f3284fac6/orjson-3.11.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47a54e660414baacd71ebf41a69bb17ea25abb3c5b69ce9e13e43be7ac20e342", size = 128895, upload-time = "2025-07-15T16:06:28.641Z" }, - { url = "https://files.pythonhosted.org/packages/ca/5f/9d290bc7a88392f9f7dc2e92ceb2e3efbbebaaf56bbba655b5fe2e3d2ca3/orjson-3.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2560b740604751854be146169c1de7e7ee1e6120b00c1788ec3f3a012c6a243f", size = 132016, upload-time = "2025-07-15T16:06:32.576Z" }, - { url = "https://files.pythonhosted.org/packages/ef/8c/b2bdc34649bbb7b44827d487aef7ad4d6a96c53ebc490ddcc191d47bc3b9/orjson-3.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7f9cd995da9e46fbac0a371f0ff6e89a21d8ecb7a8a113c0acb147b0a32f73", size = 134251, upload-time = "2025-07-15T16:06:34.075Z" }, - { url = "https://files.pythonhosted.org/packages/33/be/b763b602976aa27407e6f75331ac581258c719f8abb70f66f2de962f649f/orjson-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cf728cb3a013bdf9f4132575404bf885aa773d8bb4205656575e1890fc91990", size = 128078, upload-time = "2025-07-15T16:06:35.408Z" }, - { url = "https://files.pythonhosted.org/packages/ac/24/1b0fed70392bf179ac8b5abe800f1102ed94f89ac4f889d83916947a2b4e/orjson-3.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c27de273320294121200440cd5002b6aeb922d3cb9dab3357087c69f04ca6934", size = 130734, upload-time = "2025-07-15T16:06:36.832Z" }, - { url = "https://files.pythonhosted.org/packages/05/d2/2d042bb4fe1da067692cb70d8c01a5ce2737e2f56444e6b2d716853ce8c3/orjson-3.11.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4430ec6ff1a1f4595dd7e0fad991bdb2fed65401ed294984c490ffa025926325", size = 404040, upload-time = "2025-07-15T16:06:38.259Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c5/54938ab416c0d19c93f0d6977a47bb2b3d121e150305380b783f7d6da185/orjson-3.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:325be41a8d7c227d460a9795a181511ba0e731cf3fee088c63eb47e706ea7559", size = 144808, upload-time = "2025-07-15T16:06:39.796Z" }, - { url = "https://files.pythonhosted.org/packages/6d/be/5ead422f396ee7c8941659ceee3da001e26998971f7d5fe0a38519c48aa5/orjson-3.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9760217b84d1aee393b4436fbe9c639e963ec7bc0f2c074581ce5fb3777e466", size = 132570, upload-time = "2025-07-15T16:06:41.209Z" }, - { url = "https://files.pythonhosted.org/packages/f6/01/db8352f7d0374d7eec25144e294991800aa85738b2dc7f19cc152ba1b254/orjson-3.11.0-cp310-cp310-win32.whl", hash = "sha256:fe36e5012f886ff91c68b87a499c227fa220e9668cea96335219874c8be5fab5", size = 134763, upload-time = "2025-07-15T16:06:42.524Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/1322b64d5836d92f0b0c119d959853b3c968b8aae23dd1e3c1bfa566823b/orjson-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:ebeecd5d5511b3ca9dc4e7db0ab95266afd41baf424cc2fad8c2d3a3cdae650a", size = 129506, upload-time = "2025-07-15T16:06:43.929Z" }, - { url = "https://files.pythonhosted.org/packages/f9/2c/0b71a763f0f5130aa2631ef79e2cd84d361294665acccbb12b7a9813194e/orjson-3.11.0-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1785df7ada75c18411ff7e20ac822af904a40161ea9dfe8c55b3f6b66939add6", size = 240007, upload-time = "2025-07-15T16:06:45.411Z" }, - { url = "https://files.pythonhosted.org/packages/f4/5a/f79ccd63d378b9c7c771d7a54c203d261b4c618fe3034ae95cd30f934f34/orjson-3.11.0-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:a57899bebbcea146616a2426d20b51b3562b4bc9f8039a3bd14fae361c23053d", size = 129320, upload-time = "2025-07-15T16:06:47.249Z" }, - { url = "https://files.pythonhosted.org/packages/7b/8a/63dafc147fa5ba945ad809c374b8f4ee692bb6b18aa6e161c3e6b69b594e/orjson-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fbc2fc825aff1456dd358c11a0ad7912a4cb4537d3db92e5334af7463a967", size = 132254, upload-time = "2025-07-15T16:06:48.597Z" }, - { url = "https://files.pythonhosted.org/packages/3c/11/4d1eb230483cc689a2f039c531bb2c980029c40ca5a9b5f64dce9786e955/orjson-3.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4305a638f4cf9bed3746ca3b7c242f14e05177d5baec2527026e0f9ee6c24fb7", size = 127003, upload-time = "2025-07-15T16:06:50.34Z" }, - { url = "https://files.pythonhosted.org/packages/4f/39/b6e96072946d908684e0f4b3de1639062fd5b32016b2929c035bd8e5c847/orjson-3.11.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1235fe7bbc37164f69302199d46f29cfb874018738714dccc5a5a44042c79c77", size = 128674, upload-time = "2025-07-15T16:06:51.659Z" }, - { url = "https://files.pythonhosted.org/packages/1e/dd/c77e3013f35b202ec2cc1f78a95fadf86b8c5a320d56eb1a0bbb965a87bb/orjson-3.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a640e3954e7b4fcb160097551e54cafbde9966be3991932155b71071077881aa", size = 131846, upload-time = "2025-07-15T16:06:53.359Z" }, - { url = "https://files.pythonhosted.org/packages/3f/7d/d83f0f96c2b142f9cdcf12df19052ea3767970989dc757598dc108db208f/orjson-3.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d750b97d22d5566955e50b02c622f3a1d32744d7a578c878b29a873190ccb7a", size = 134016, upload-time = "2025-07-15T16:06:54.691Z" }, - { url = "https://files.pythonhosted.org/packages/67/4f/d22f79a3c56dde563c4fbc12eebf9224a1b87af5e4ec61beb11f9b3eb499/orjson-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bfcfe498484161e011f8190a400591c52b026de96b3b3cbd3f21e8999b9dc0e", size = 127930, upload-time = "2025-07-15T16:06:56.001Z" }, - { url = "https://files.pythonhosted.org/packages/07/1e/26aede257db2163d974139fd4571f1e80f565216ccbd2c44ee1d43a63dcc/orjson-3.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:feaed3ed43a1d2df75c039798eb5ec92c350c7d86be53369bafc4f3700ce7df2", size = 130569, upload-time = "2025-07-15T16:06:57.275Z" }, - { url = "https://files.pythonhosted.org/packages/b4/bf/2cb57eac8d6054b555cba27203490489a7d3f5dca8c34382f22f2f0f17ba/orjson-3.11.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1120607ec8fc98acf8c54aac6fb0b7b003ba883401fa2d261833111e2fa071", size = 403844, upload-time = "2025-07-15T16:06:59.107Z" }, - { url = "https://files.pythonhosted.org/packages/76/34/36e859ccfc45464df7b35c438c0ecc7751c930b3ebbefb50db7e3a641eb7/orjson-3.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c4b48d9775b0cf1f0aca734f4c6b272cbfacfac38e6a455e6520662f9434afb7", size = 144613, upload-time = "2025-07-15T16:07:00.48Z" }, - { url = "https://files.pythonhosted.org/packages/31/c5/5aeb84cdd0b44dc3972668944a1312f7983c2a45fb6b0e5e32b2f9408540/orjson-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f018ed1986d79434ac712ff19f951cd00b4dfcb767444410fbb834ebec160abf", size = 132419, upload-time = "2025-07-15T16:07:01.927Z" }, - { url = "https://files.pythonhosted.org/packages/59/0c/95ee1e61a067ad24c4921609156b3beeca8b102f6f36dca62b08e1a7c7a8/orjson-3.11.0-cp311-cp311-win32.whl", hash = "sha256:08e191f8a55ac2c00be48e98a5d10dca004cbe8abe73392c55951bfda60fc123", size = 134620, upload-time = "2025-07-15T16:07:03.304Z" }, - { url = "https://files.pythonhosted.org/packages/94/3e/afd5e284db9387023803553061ea05c785c36fe7845e4fe25912424b343f/orjson-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:b5a4214ea59c8a3b56f8d484b28114af74e9fba0956f9be5c3ce388ae143bf1f", size = 129333, upload-time = "2025-07-15T16:07:04.973Z" }, - { url = "https://files.pythonhosted.org/packages/8b/a4/d29e9995d73f23f2444b4db299a99477a4f7e6f5bf8923b775ef43a4e660/orjson-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:57e8e7198a679ab21241ab3f355a7990c7447559e35940595e628c107ef23736", size = 126656, upload-time = "2025-07-15T16:07:06.288Z" }, - { url = "https://files.pythonhosted.org/packages/92/c9/241e304fb1e58ea70b720f1a9e5349c6bb7735ffac401ef1b94f422edd6d/orjson-3.11.0-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b4089f940c638bb1947d54e46c1cd58f4259072fcc97bc833ea9c78903150ac9", size = 240269, upload-time = "2025-07-15T16:07:08.173Z" }, - { url = "https://files.pythonhosted.org/packages/26/7c/289457cdf40be992b43f1d90ae213ebc03a31a8e2850271ecd79e79a3135/orjson-3.11.0-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:8335a0ba1c26359fb5c82d643b4c1abbee2bc62875e0f2b5bde6c8e9e25eb68c", size = 129276, upload-time = "2025-07-15T16:07:10.128Z" }, - { url = "https://files.pythonhosted.org/packages/66/de/5c0528d46ded965939b6b7f75b1fe93af42b9906b0039096fc92c9001c12/orjson-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63c1c9772dafc811d16d6a7efa3369a739da15d1720d6e58ebe7562f54d6f4a2", size = 131966, upload-time = "2025-07-15T16:07:11.509Z" }, - { url = "https://files.pythonhosted.org/packages/ad/74/39822f267b5935fb6fc961ccc443f4968a74d34fc9270b83caa44e37d907/orjson-3.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9457ccbd8b241fb4ba516417a4c5b95ba0059df4ac801309bcb4ec3870f45ad9", size = 127028, upload-time = "2025-07-15T16:07:13.023Z" }, - { url = "https://files.pythonhosted.org/packages/7c/e3/28f6ed7f03db69bddb3ef48621b2b05b394125188f5909ee0a43fcf4820e/orjson-3.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0846e13abe79daece94a00b92574f294acad1d362be766c04245b9b4dd0e47e1", size = 129105, upload-time = "2025-07-15T16:07:14.367Z" }, - { url = "https://files.pythonhosted.org/packages/cb/50/8867fd2fc92c0ab1c3e14673ec5d9d0191202e4ab8ba6256d7a1d6943ad3/orjson-3.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5587c85ae02f608a3f377b6af9eb04829606f518257cbffa8f5081c1aacf2e2f", size = 131902, upload-time = "2025-07-15T16:07:16.176Z" }, - { url = "https://files.pythonhosted.org/packages/13/65/c189deea10342afee08006331082ff67d11b98c2394989998b3ea060354a/orjson-3.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7a1964a71c1567b4570c932a0084ac24ad52c8cf6253d1881400936565ed438", size = 134042, upload-time = "2025-07-15T16:07:17.937Z" }, - { url = "https://files.pythonhosted.org/packages/2b/e4/cf23c3f4231d2a9a043940ab045f799f84a6df1b4fb6c9b4412cdc3ebf8c/orjson-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5a8243e73690cc6e9151c9e1dd046a8f21778d775f7d478fa1eb4daa4897c61", size = 128260, upload-time = "2025-07-15T16:07:19.651Z" }, - { url = "https://files.pythonhosted.org/packages/de/b9/2cb94d3a67edb918d19bad4a831af99cd96c3657a23daa239611bcf335d7/orjson-3.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51646f6d995df37b6e1b628f092f41c0feccf1d47e3452c6e95e2474b547d842", size = 130282, upload-time = "2025-07-15T16:07:21.022Z" }, - { url = "https://files.pythonhosted.org/packages/0b/96/df963cc973e689d4c56398647917b4ee95f47e5b6d2779338c09c015b23b/orjson-3.11.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:2fb8ca8f0b4e31b8aaec674c7540649b64ef02809410506a44dc68d31bd5647b", size = 403765, upload-time = "2025-07-15T16:07:25.469Z" }, - { url = "https://files.pythonhosted.org/packages/fb/92/71429ee1badb69f53281602dbb270fa84fc2e51c83193a814d0208bb63b0/orjson-3.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:64a6a3e94a44856c3f6557e6aa56a6686544fed9816ae0afa8df9077f5759791", size = 144779, upload-time = "2025-07-15T16:07:27.339Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ab/3678b2e5ff0c622a974cb8664ed7cdda5ed26ae2b9d71ba66ec36f32d6cf/orjson-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69f95d484938d8fab5963e09131bcf9fbbb81fa4ec132e316eb2fb9adb8ce78", size = 132797, upload-time = "2025-07-15T16:07:28.717Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/74509f715ff189d2aca90ebb0bd5af6658e0f9aa2512abbe6feca4c78208/orjson-3.11.0-cp312-cp312-win32.whl", hash = "sha256:8514f9f9c667ce7d7ef709ab1a73e7fcab78c297270e90b1963df7126d2b0e23", size = 134695, upload-time = "2025-07-15T16:07:30.034Z" }, - { url = "https://files.pythonhosted.org/packages/82/ba/ef25e3e223f452a01eac6a5b38d05c152d037508dcbf87ad2858cbb7d82e/orjson-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:41b38a894520b8cb5344a35ffafdf6ae8042f56d16771b2c5eb107798cee85ee", size = 129446, upload-time = "2025-07-15T16:07:31.412Z" }, - { url = "https://files.pythonhosted.org/packages/e3/cd/6f4d93867c5d81bb4ab2d4ac870d3d6e9ba34fa580a03b8d04bf1ce1d8ad/orjson-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:5579acd235dd134467340b2f8a670c1c36023b5a69c6a3174c4792af7502bd92", size = 126400, upload-time = "2025-07-15T16:07:34.143Z" }, - { url = "https://files.pythonhosted.org/packages/31/63/82d9b6b48624009d230bc6038e54778af8f84dfd54402f9504f477c5cfd5/orjson-3.11.0-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4a8ba9698655e16746fdf5266939427da0f9553305152aeb1a1cc14974a19cfb", size = 240125, upload-time = "2025-07-15T16:07:35.976Z" }, - { url = "https://files.pythonhosted.org/packages/16/3a/d557ed87c63237d4c97a7bac7ac054c347ab8c4b6da09748d162ca287175/orjson-3.11.0-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:67133847f9a35a5ef5acfa3325d4a2f7fe05c11f1505c4117bb086fc06f2a58f", size = 129189, upload-time = "2025-07-15T16:07:37.486Z" }, - { url = "https://files.pythonhosted.org/packages/69/5e/b2c9e22e2cd10aa7d76a629cee65d661e06a61fbaf4dc226386f5636dd44/orjson-3.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f797d57814975b78f5f5423acb003db6f9be5186b72d48bd97a1000e89d331d", size = 131953, upload-time = "2025-07-15T16:07:39.254Z" }, - { url = "https://files.pythonhosted.org/packages/e2/60/760fcd9b50eb44d1206f2b30c8d310b79714553b9d94a02f9ea3252ebe63/orjson-3.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:28acd19822987c5163b9e03a6e60853a52acfee384af2b394d11cb413b889246", size = 126922, upload-time = "2025-07-15T16:07:41.282Z" }, - { url = "https://files.pythonhosted.org/packages/6a/7a/8c46daa867ccc92da6de9567608be62052774b924a77c78382e30d50b579/orjson-3.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8d38d9e1e2cf9729658e35956cf01e13e89148beb4cb9e794c9c10c5cb252f8", size = 128787, upload-time = "2025-07-15T16:07:42.681Z" }, - { url = "https://files.pythonhosted.org/packages/f2/14/a2f1b123d85f11a19e8749f7d3f9ed6c9b331c61f7b47cfd3e9a1fedb9bc/orjson-3.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05f094edd2b782650b0761fd78858d9254de1c1286f5af43145b3d08cdacfd51", size = 131895, upload-time = "2025-07-15T16:07:44.519Z" }, - { url = "https://files.pythonhosted.org/packages/c8/10/362e8192df7528e8086ea712c5cb01355c8d4e52c59a804417ba01e2eb2d/orjson-3.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d09176a4a9e04a5394a4a0edd758f645d53d903b306d02f2691b97d5c736a9e", size = 133868, upload-time = "2025-07-15T16:07:46.227Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4e/ef43582ef3e3dfd2a39bc3106fa543364fde1ba58489841120219da6e22f/orjson-3.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a585042104e90a61eda2564d11317b6a304eb4e71cd33e839f5af6be56c34d3", size = 128234, upload-time = "2025-07-15T16:07:48.123Z" }, - { url = "https://files.pythonhosted.org/packages/d7/fa/02dabb2f1d605bee8c4bb1160cfc7467976b1ed359a62cc92e0681b53c45/orjson-3.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d2218629dbfdeeb5c9e0573d59f809d42f9d49ae6464d2f479e667aee14c3ef4", size = 130232, upload-time = "2025-07-15T16:07:50.197Z" }, - { url = "https://files.pythonhosted.org/packages/16/76/951b5619605c8d2ede80cc989f32a66abc954530d86e84030db2250c63a1/orjson-3.11.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:613e54a2b10b51b656305c11235a9c4a5c5491ef5c283f86483d4e9e123ed5e4", size = 403648, upload-time = "2025-07-15T16:07:52.136Z" }, - { url = "https://files.pythonhosted.org/packages/96/e2/5fa53bb411455a63b3713db90b588e6ca5ed2db59ad49b3fb8a0e94e0dda/orjson-3.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9dac7fbf3b8b05965986c5cfae051eb9a30fced7f15f1d13a5adc608436eb486", size = 144572, upload-time = "2025-07-15T16:07:54.004Z" }, - { url = "https://files.pythonhosted.org/packages/ad/d0/7d6f91e1e0f034258c3a3358f20b0c9490070e8a7ab8880085547274c7f9/orjson-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93b64b254414e2be55ac5257124b5602c5f0b4d06b80bd27d1165efe8f36e836", size = 132766, upload-time = "2025-07-15T16:07:55.936Z" }, - { url = "https://files.pythonhosted.org/packages/ff/f8/4d46481f1b3fb40dc826d62179f96c808eb470cdcc74b6593fb114d74af3/orjson-3.11.0-cp313-cp313-win32.whl", hash = "sha256:359cbe11bc940c64cb3848cf22000d2aef36aff7bfd09ca2c0b9cb309c387132", size = 134638, upload-time = "2025-07-15T16:07:57.343Z" }, - { url = "https://files.pythonhosted.org/packages/85/3f/544938dcfb7337d85ee1e43d7685cf8f3bfd452e0b15a32fe70cb4ca5094/orjson-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:0759b36428067dc777b202dd286fbdd33d7f261c6455c4238ea4e8474358b1e6", size = 129411, upload-time = "2025-07-15T16:07:58.852Z" }, - { url = "https://files.pythonhosted.org/packages/43/0c/f75015669d7817d222df1bb207f402277b77d22c4833950c8c8c7cf2d325/orjson-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:51cdca2f36e923126d0734efaf72ddbb5d6da01dbd20eab898bdc50de80d7b5a", size = 126349, upload-time = "2025-07-15T16:08:00.322Z" }, - { url = "https://files.pythonhosted.org/packages/6c/41/eac31c44ce001b3da8a6b5ebbb8a4fc2c3eaf479e2d068e36b2ea6ab7095/orjson-3.11.0-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d79c180cfb3ae68f13245d0ff551dca03d96258aa560830bf8a223bd68d8272c", size = 241023, upload-time = "2025-07-15T16:08:02.233Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d6/1edc258f3eff573af7416b2b8536032e6f4ed3759fa5773c5db95a28d2f2/orjson-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:105bca887532dc71ce4b05a5de95dea447a310409d7a8cf0cb1c4a120469e9ad", size = 132245, upload-time = "2025-07-15T16:08:04.734Z" }, - { url = "https://files.pythonhosted.org/packages/24/89/49236838cdc8d88b93f1c80f44531103f589307e4e783c855a6a63f28b45/orjson-3.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acf5a63ae9cdb88274126af85913ceae554d8fd71122effa24a53227abbeee16", size = 126981, upload-time = "2025-07-15T16:08:06.114Z" }, - { url = "https://files.pythonhosted.org/packages/80/78/8744b86efae7693344edcf255addc2a9f9e4f5552ccf71d9581d03c3e1aa/orjson-3.11.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:894635df36c0be32f1c8c8607e853b8865edb58e7618e57892e85d06418723eb", size = 128686, upload-time = "2025-07-15T16:08:07.843Z" }, - { url = "https://files.pythonhosted.org/packages/91/8c/4c45feee9fa52488e67be2e887eb966337d4ddb6675129471f0dab98587d/orjson-3.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02dd4f0a1a2be943a104ce5f3ec092631ee3e9f0b4bb9eeee3400430bd94ddef", size = 131830, upload-time = "2025-07-15T16:08:14.423Z" }, - { url = "https://files.pythonhosted.org/packages/47/15/9462308306650de38d042af226e186d2fe28ee8e44c5462e011e767e6e44/orjson-3.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:720b4bb5e1b971960a62c2fa254c2d2a14e7eb791e350d05df8583025aa59d15", size = 134004, upload-time = "2025-07-15T16:08:16.024Z" }, - { url = "https://files.pythonhosted.org/packages/db/1d/bfa55d7681cf704d73e9c6de8138535b2f41e06a49d88bf9bdf27c8d4d7b/orjson-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bf058105a8aed144e0d1cfe7ac4174748c3fc7203f225abaeac7f4121abccb0", size = 127893, upload-time = "2025-07-15T16:08:17.558Z" }, - { url = "https://files.pythonhosted.org/packages/1c/bb/e91aa9e63077d8754d1578787e8917078e5c6743579290bc454bbc609241/orjson-3.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a2788f741e5a0e885e5eaf1d91d0c9106e03cb9575b0c55ba36fd3d48b0b1e9b", size = 130546, upload-time = "2025-07-15T16:08:19.21Z" }, - { url = "https://files.pythonhosted.org/packages/9d/67/4c53a325ac9abf883e922da214707f63efcb8b4d54529984df0e6aff1d0b/orjson-3.11.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:c60c99fe1e15894367b0340b2ff16c7c69f9c3f3a54aa3961a58c102b292ad94", size = 403849, upload-time = "2025-07-15T16:08:21.025Z" }, - { url = "https://files.pythonhosted.org/packages/5a/64/a779341bd2231e28eb09cf6e6260d9f713a39ae5163b0f1228ab5175bfee/orjson-3.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:99d17aab984f4d029b8f3c307e6be3c63d9ee5ef55e30d761caf05e883009949", size = 144600, upload-time = "2025-07-15T16:08:22.701Z" }, - { url = "https://files.pythonhosted.org/packages/03/c1/fc36a6e3b40df3388ecf57b18a940f6584362652e6ee57464ccc5715b2e3/orjson-3.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e98f02e23611763c9e5dfcb83bd33219231091589f0d1691e721aea9c52bf329", size = 132416, upload-time = "2025-07-15T16:08:24.258Z" }, - { url = "https://files.pythonhosted.org/packages/3b/29/eb5ed777d7ea5d0fdee5981751e3a4e9de73f47e32bb20f1ea748b04b1d2/orjson-3.11.0-cp39-cp39-win32.whl", hash = "sha256:923301f33ea866b18f8836cf41d9c6d33e3b5cab8577d20fed34ec29f0e13a0d", size = 134617, upload-time = "2025-07-15T16:08:26.052Z" }, - { url = "https://files.pythonhosted.org/packages/72/40/feba627d9349bb1a91500e0047ae526d83bb1918545ff4dfee3e1bd7195e/orjson-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:475491bb78af2a0170f49e90013f1a0f1286527f3617491f8940d7e5da862da7", size = 129320, upload-time = "2025-07-15T16:08:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/a1/7b/7aebe925c6b1c46c8606a960fe1d6b681fccd4aaf3f37cd647c3309d6582/orjson-3.11.2-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d6b8a78c33496230a60dc9487118c284c15ebdf6724386057239641e1eb69761", size = 226896, upload-time = "2025-08-12T15:10:22.02Z" }, + { url = "https://files.pythonhosted.org/packages/7d/39/c952c9b0d51063e808117dd1e53668a2e4325cc63cfe7df453d853ee8680/orjson-3.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc04036eeae11ad4180d1f7b5faddb5dab1dee49ecd147cd431523869514873b", size = 111845, upload-time = "2025-08-12T15:10:24.963Z" }, + { url = "https://files.pythonhosted.org/packages/f5/dc/90b7f29be38745eeacc30903b693f29fcc1097db0c2a19a71ffb3e9f2a5f/orjson-3.11.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c04325839c5754c253ff301cee8aaed7442d974860a44447bb3be785c411c27", size = 116395, upload-time = "2025-08-12T15:10:26.314Z" }, + { url = "https://files.pythonhosted.org/packages/10/c2/fe84ba63164c22932b8d59b8810e2e58590105293a259e6dd1bfaf3422c9/orjson-3.11.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32769e04cd7fdc4a59854376211145a1bbbc0aea5e9d6c9755d3d3c301d7c0df", size = 118768, upload-time = "2025-08-12T15:10:27.605Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ce/d9748ec69b1a4c29b8e2bab8233e8c41c583c69f515b373f1fb00247d8c9/orjson-3.11.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ff285d14917ea1408a821786e3677c5261fa6095277410409c694b8e7720ae0", size = 120887, upload-time = "2025-08-12T15:10:29.153Z" }, + { url = "https://files.pythonhosted.org/packages/c1/66/b90fac8e4a76e83f981912d7f9524d402b31f6c1b8bff3e498aa321c326c/orjson-3.11.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2662f908114864b63ff75ffe6ffacf996418dd6cc25e02a72ad4bda81b1ec45a", size = 123650, upload-time = "2025-08-12T15:10:30.602Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/56143898d1689c7f915ac67703efb97e8f2f8d5805ce8c2c3fd0f2bb6e3d/orjson-3.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab463cf5d08ad6623a4dac1badd20e88a5eb4b840050c4812c782e3149fe2334", size = 121287, upload-time = "2025-08-12T15:10:31.868Z" }, + { url = "https://files.pythonhosted.org/packages/80/de/f9c6d00c127be766a3739d0d85b52a7c941e437d8dd4d573e03e98d0f89c/orjson-3.11.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:64414241bde943cbf3c00d45fcb5223dca6d9210148ba984aae6b5d63294502b", size = 119637, upload-time = "2025-08-12T15:10:33.078Z" }, + { url = "https://files.pythonhosted.org/packages/67/4c/ab70c7627022d395c1b4eb5badf6196b7144e82b46a3a17ed2354f9e592d/orjson-3.11.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:7773e71c0ae8c9660192ff144a3d69df89725325e3d0b6a6bb2c50e5ebaf9b84", size = 392478, upload-time = "2025-08-12T15:10:34.669Z" }, + { url = "https://files.pythonhosted.org/packages/77/91/d890b873b69311db4fae2624c5603c437df9c857fb061e97706dac550a77/orjson-3.11.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:652ca14e283b13ece35bf3a86503c25592f294dbcfc5bb91b20a9c9a62a3d4be", size = 134343, upload-time = "2025-08-12T15:10:35.978Z" }, + { url = "https://files.pythonhosted.org/packages/47/16/1aa248541b4830274a079c4aeb2aa5d1ff17c3f013b1d0d8d16d0848f3de/orjson-3.11.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:26e99e98df8990ecfe3772bbdd7361f602149715c2cbc82e61af89bfad9528a4", size = 123887, upload-time = "2025-08-12T15:10:37.601Z" }, + { url = "https://files.pythonhosted.org/packages/95/e4/7419833c55ac8b5f385d00c02685a260da1f391e900fc5c3e0b797e0d506/orjson-3.11.2-cp310-cp310-win32.whl", hash = "sha256:5814313b3e75a2be7fe6c7958201c16c4560e21a813dbad25920752cecd6ad66", size = 124560, upload-time = "2025-08-12T15:10:38.966Z" }, + { url = "https://files.pythonhosted.org/packages/74/f8/27ca7ef3e194c462af32ce1883187f5ec483650c559166f0de59c4c2c5f0/orjson-3.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:dc471ce2225ab4c42ca672f70600d46a8b8e28e8d4e536088c1ccdb1d22b35ce", size = 119700, upload-time = "2025-08-12T15:10:40.911Z" }, + { url = "https://files.pythonhosted.org/packages/78/7d/e295df1ac9920cbb19fb4c1afa800e86f175cb657143aa422337270a4782/orjson-3.11.2-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:888b64ef7eaeeff63f773881929434a5834a6a140a63ad45183d59287f07fc6a", size = 226502, upload-time = "2025-08-12T15:10:42.284Z" }, + { url = "https://files.pythonhosted.org/packages/65/21/ffb0f10ea04caf418fb4e7ad1fda4b9ab3179df9d7a33b69420f191aadd5/orjson-3.11.2-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:83387cc8b26c9fa0ae34d1ea8861a7ae6cff8fb3e346ab53e987d085315a728e", size = 115999, upload-time = "2025-08-12T15:10:43.738Z" }, + { url = "https://files.pythonhosted.org/packages/90/d5/8da1e252ac3353d92e6f754ee0c85027c8a2cda90b6899da2be0df3ef83d/orjson-3.11.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7e35f003692c216d7ee901b6b916b5734d6fc4180fcaa44c52081f974c08e17", size = 111563, upload-time = "2025-08-12T15:10:45.301Z" }, + { url = "https://files.pythonhosted.org/packages/4f/81/baabc32e52c570b0e4e1044b1bd2ccbec965e0de3ba2c13082255efa2006/orjson-3.11.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a0a4c29ae90b11d0c00bcc31533854d89f77bde2649ec602f512a7e16e00640", size = 116222, upload-time = "2025-08-12T15:10:46.92Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b7/da2ad55ad80b49b560dce894c961477d0e76811ee6e614b301de9f2f8728/orjson-3.11.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:585d712b1880f68370108bc5534a257b561672d1592fae54938738fe7f6f1e33", size = 118594, upload-time = "2025-08-12T15:10:48.488Z" }, + { url = "https://files.pythonhosted.org/packages/61/be/014f7eab51449f3c894aa9bbda2707b5340c85650cb7d0db4ec9ae280501/orjson-3.11.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d08e342a7143f8a7c11f1c4033efe81acbd3c98c68ba1b26b96080396019701f", size = 120700, upload-time = "2025-08-12T15:10:49.811Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ae/c217903a30c51341868e2d8c318c59a8413baa35af54d7845071c8ccd6fe/orjson-3.11.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c0f84fc50398773a702732c87cd622737bf11c0721e6db3041ac7802a686fb", size = 123433, upload-time = "2025-08-12T15:10:51.06Z" }, + { url = "https://files.pythonhosted.org/packages/57/c2/b3c346f78b1ff2da310dd300cb0f5d32167f872b4d3bb1ad122c889d97b0/orjson-3.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:140f84e3c8d4c142575898c91e3981000afebf0333df753a90b3435d349a5fe5", size = 121061, upload-time = "2025-08-12T15:10:52.381Z" }, + { url = "https://files.pythonhosted.org/packages/00/c8/c97798f6010327ffc75ad21dd6bca11ea2067d1910777e798c2849f1c68f/orjson-3.11.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96304a2b7235e0f3f2d9363ddccdbfb027d27338722fe469fe656832a017602e", size = 119410, upload-time = "2025-08-12T15:10:53.692Z" }, + { url = "https://files.pythonhosted.org/packages/37/fd/df720f7c0e35694617b7f95598b11a2cb0374661d8389703bea17217da53/orjson-3.11.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d7612bb227d5d9582f1f50a60bd55c64618fc22c4a32825d233a4f2771a428a", size = 392294, upload-time = "2025-08-12T15:10:55.079Z" }, + { url = "https://files.pythonhosted.org/packages/ba/52/0120d18f60ab0fe47531d520372b528a45c9a25dcab500f450374421881c/orjson-3.11.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a134587d18fe493befc2defffef2a8d27cfcada5696cb7234de54a21903ae89a", size = 134134, upload-time = "2025-08-12T15:10:56.568Z" }, + { url = "https://files.pythonhosted.org/packages/ec/10/1f967671966598366de42f07e92b0fc694ffc66eafa4b74131aeca84915f/orjson-3.11.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0b84455e60c4bc12c1e4cbaa5cfc1acdc7775a9da9cec040e17232f4b05458bd", size = 123745, upload-time = "2025-08-12T15:10:57.907Z" }, + { url = "https://files.pythonhosted.org/packages/43/eb/76081238671461cfd0f47e0c24f408ffa66184237d56ef18c33e86abb612/orjson-3.11.2-cp311-cp311-win32.whl", hash = "sha256:f0660efeac223f0731a70884e6914a5f04d613b5ae500744c43f7bf7b78f00f9", size = 124393, upload-time = "2025-08-12T15:10:59.267Z" }, + { url = "https://files.pythonhosted.org/packages/26/76/cc598c1811ba9ba935171267b02e377fc9177489efce525d478a2999d9cc/orjson-3.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:955811c8405251d9e09cbe8606ad8fdef49a451bcf5520095a5ed38c669223d8", size = 119561, upload-time = "2025-08-12T15:11:00.559Z" }, + { url = "https://files.pythonhosted.org/packages/d8/17/c48011750f0489006f7617b0a3cebc8230f36d11a34e7e9aca2085f07792/orjson-3.11.2-cp311-cp311-win_arm64.whl", hash = "sha256:2e4d423a6f838552e3a6d9ec734b729f61f88b1124fd697eab82805ea1a2a97d", size = 114186, upload-time = "2025-08-12T15:11:01.931Z" }, + { url = "https://files.pythonhosted.org/packages/40/02/46054ebe7996a8adee9640dcad7d39d76c2000dc0377efa38e55dc5cbf78/orjson-3.11.2-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:901d80d349d8452162b3aa1afb82cec5bee79a10550660bc21311cc61a4c5486", size = 226528, upload-time = "2025-08-12T15:11:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/6b6f0b4d8aea1137436546b990f71be2cd8bd870aa2f5aa14dba0fcc95dc/orjson-3.11.2-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:cf3bd3967a360e87ee14ed82cb258b7f18c710dacf3822fb0042a14313a673a1", size = 115931, upload-time = "2025-08-12T15:11:04.759Z" }, + { url = "https://files.pythonhosted.org/packages/ae/05/4205cc97c30e82a293dd0d149b1a89b138ebe76afeca66fc129fa2aa4e6a/orjson-3.11.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26693dde66910078229a943e80eeb99fdce6cd2c26277dc80ead9f3ab97d2131", size = 111382, upload-time = "2025-08-12T15:11:06.468Z" }, + { url = "https://files.pythonhosted.org/packages/50/c7/b8a951a93caa821f9272a7c917115d825ae2e4e8768f5ddf37968ec9de01/orjson-3.11.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ad4c8acb50a28211c33fc7ef85ddf5cb18d4636a5205fd3fa2dce0411a0e30c", size = 116271, upload-time = "2025-08-12T15:11:07.845Z" }, + { url = "https://files.pythonhosted.org/packages/17/03/1006c7f8782d5327439e26d9b0ec66500ea7b679d4bbb6b891d2834ab3ee/orjson-3.11.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:994181e7f1725bb5f2d481d7d228738e0743b16bf319ca85c29369c65913df14", size = 119086, upload-time = "2025-08-12T15:11:09.329Z" }, + { url = "https://files.pythonhosted.org/packages/44/61/57d22bc31f36a93878a6f772aea76b2184102c6993dea897656a66d18c74/orjson-3.11.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb79a0476393c07656b69c8e763c3cc925fa8e1d9e9b7d1f626901bb5025448", size = 120724, upload-time = "2025-08-12T15:11:10.674Z" }, + { url = "https://files.pythonhosted.org/packages/78/a9/4550e96b4c490c83aea697d5347b8f7eb188152cd7b5a38001055ca5b379/orjson-3.11.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191ed27a1dddb305083d8716af413d7219f40ec1d4c9b0e977453b4db0d6fb6c", size = 123577, upload-time = "2025-08-12T15:11:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/3a/86/09b8cb3ebd513d708ef0c92d36ac3eebda814c65c72137b0a82d6d688fc4/orjson-3.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0afb89f16f07220183fd00f5f297328ed0a68d8722ad1b0c8dcd95b12bc82804", size = 121195, upload-time = "2025-08-12T15:11:13.399Z" }, + { url = "https://files.pythonhosted.org/packages/37/68/7b40b39ac2c1c644d4644e706d0de6c9999764341cd85f2a9393cb387661/orjson-3.11.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ab6e6b4e93b1573a026b6ec16fca9541354dd58e514b62c558b58554ae04307", size = 119234, upload-time = "2025-08-12T15:11:15.134Z" }, + { url = "https://files.pythonhosted.org/packages/40/7c/bb6e7267cd80c19023d44d8cbc4ea4ed5429fcd4a7eb9950f50305697a28/orjson-3.11.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9cb23527efb61fb75527df55d20ee47989c4ee34e01a9c98ee9ede232abf6219", size = 392250, upload-time = "2025-08-12T15:11:16.604Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/6730ace05583dbca7c1b406d59f4266e48cd0d360566e71482420fb849fc/orjson-3.11.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a4dd1268e4035af21b8a09e4adf2e61f87ee7bf63b86d7bb0a237ac03fad5b45", size = 134572, upload-time = "2025-08-12T15:11:18.205Z" }, + { url = "https://files.pythonhosted.org/packages/96/0f/7d3e03a30d5aac0432882b539a65b8c02cb6dd4221ddb893babf09c424cc/orjson-3.11.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff8b155b145eaf5a9d94d2c476fbe18d6021de93cf36c2ae2c8c5b775763f14e", size = 123869, upload-time = "2025-08-12T15:11:19.554Z" }, + { url = "https://files.pythonhosted.org/packages/45/80/1513265eba6d4a960f078f4b1d2bff94a571ab2d28c6f9835e03dfc65cc6/orjson-3.11.2-cp312-cp312-win32.whl", hash = "sha256:ae3bb10279d57872f9aba68c9931aa71ed3b295fa880f25e68da79e79453f46e", size = 124430, upload-time = "2025-08-12T15:11:20.914Z" }, + { url = "https://files.pythonhosted.org/packages/fb/61/eadf057b68a332351eeb3d89a4cc538d14f31cd8b5ec1b31a280426ccca2/orjson-3.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:d026e1967239ec11a2559b4146a61d13914504b396f74510a1c4d6b19dfd8732", size = 119598, upload-time = "2025-08-12T15:11:22.372Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3f/7f4b783402143d965ab7e9a2fc116fdb887fe53bdce7d3523271cd106098/orjson-3.11.2-cp312-cp312-win_arm64.whl", hash = "sha256:59f8d5ad08602711af9589375be98477d70e1d102645430b5a7985fdbf613b36", size = 114052, upload-time = "2025-08-12T15:11:23.762Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/0dd6b4750eb556ae4e2c6a9cb3e219ec642e9c6d95f8ebe5dc9020c67204/orjson-3.11.2-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a079fdba7062ab396380eeedb589afb81dc6683f07f528a03b6f7aae420a0219", size = 226419, upload-time = "2025-08-12T15:11:25.517Z" }, + { url = "https://files.pythonhosted.org/packages/44/d5/e67f36277f78f2af8a4690e0c54da6b34169812f807fd1b4bfc4dbcf9558/orjson-3.11.2-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:6a5f62ebbc530bb8bb4b1ead103647b395ba523559149b91a6c545f7cd4110ad", size = 115803, upload-time = "2025-08-12T15:11:27.357Z" }, + { url = "https://files.pythonhosted.org/packages/24/37/ff8bc86e0dacc48f07c2b6e20852f230bf4435611bab65e3feae2b61f0ae/orjson-3.11.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7df6c7b8b0931feb3420b72838c3e2ba98c228f7aa60d461bc050cf4ca5f7b2", size = 111337, upload-time = "2025-08-12T15:11:28.805Z" }, + { url = "https://files.pythonhosted.org/packages/b9/25/37d4d3e8079ea9784ea1625029988e7f4594ce50d4738b0c1e2bf4a9e201/orjson-3.11.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6f59dfea7da1fced6e782bb3699718088b1036cb361f36c6e4dd843c5111aefe", size = 116222, upload-time = "2025-08-12T15:11:30.18Z" }, + { url = "https://files.pythonhosted.org/packages/b7/32/a63fd9c07fce3b4193dcc1afced5dd4b0f3a24e27556604e9482b32189c9/orjson-3.11.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edf49146520fef308c31aa4c45b9925fd9c7584645caca7c0c4217d7900214ae", size = 119020, upload-time = "2025-08-12T15:11:31.59Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b6/400792b8adc3079a6b5d649264a3224d6342436d9fac9a0ed4abc9dc4596/orjson-3.11.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50995bbeb5d41a32ad15e023305807f561ac5dcd9bd41a12c8d8d1d2c83e44e6", size = 120721, upload-time = "2025-08-12T15:11:33.035Z" }, + { url = "https://files.pythonhosted.org/packages/40/f3/31ab8f8c699eb9e65af8907889a0b7fef74c1d2b23832719a35da7bb0c58/orjson-3.11.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cc42960515076eb639b705f105712b658c525863d89a1704d984b929b0577d1", size = 123574, upload-time = "2025-08-12T15:11:34.433Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a6/ce4287c412dff81878f38d06d2c80845709c60012ca8daf861cb064b4574/orjson-3.11.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56777cab2a7b2a8ea687fedafb84b3d7fdafae382165c31a2adf88634c432fa", size = 121225, upload-time = "2025-08-12T15:11:36.133Z" }, + { url = "https://files.pythonhosted.org/packages/69/b0/7a881b2aef4fed0287d2a4fbb029d01ed84fa52b4a68da82bdee5e50598e/orjson-3.11.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:07349e88025b9b5c783077bf7a9f401ffbfb07fd20e86ec6fc5b7432c28c2c5e", size = 119201, upload-time = "2025-08-12T15:11:37.642Z" }, + { url = "https://files.pythonhosted.org/packages/cf/98/a325726b37f7512ed6338e5e65035c3c6505f4e628b09a5daf0419f054ea/orjson-3.11.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:45841fbb79c96441a8c58aa29ffef570c5df9af91f0f7a9572e5505e12412f15", size = 392193, upload-time = "2025-08-12T15:11:39.153Z" }, + { url = "https://files.pythonhosted.org/packages/cb/4f/a7194f98b0ce1d28190e0c4caa6d091a3fc8d0107ad2209f75c8ba398984/orjson-3.11.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13d8d8db6cd8d89d4d4e0f4161acbbb373a4d2a4929e862d1d2119de4aa324ac", size = 134548, upload-time = "2025-08-12T15:11:40.768Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/b84caa2986c3f472dc56343ddb0167797a708a8d5c3be043e1e2677b55df/orjson-3.11.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51da1ee2178ed09c00d09c1b953e45846bbc16b6420965eb7a913ba209f606d8", size = 123798, upload-time = "2025-08-12T15:11:42.164Z" }, + { url = "https://files.pythonhosted.org/packages/9c/5b/e398449080ce6b4c8fcadad57e51fa16f65768e1b142ba90b23ac5d10801/orjson-3.11.2-cp313-cp313-win32.whl", hash = "sha256:51dc033df2e4a4c91c0ba4f43247de99b3cbf42ee7a42ee2b2b2f76c8b2f2cb5", size = 124402, upload-time = "2025-08-12T15:11:44.036Z" }, + { url = "https://files.pythonhosted.org/packages/b3/66/429e4608e124debfc4790bfc37131f6958e59510ba3b542d5fc163be8e5f/orjson-3.11.2-cp313-cp313-win_amd64.whl", hash = "sha256:29d91d74942b7436f29b5d1ed9bcfc3f6ef2d4f7c4997616509004679936650d", size = 119498, upload-time = "2025-08-12T15:11:45.864Z" }, + { url = "https://files.pythonhosted.org/packages/7b/04/f8b5f317cce7ad3580a9ad12d7e2df0714dfa8a83328ecddd367af802f5b/orjson-3.11.2-cp313-cp313-win_arm64.whl", hash = "sha256:4ca4fb5ac21cd1e48028d4f708b1bb13e39c42d45614befd2ead004a8bba8535", size = 114051, upload-time = "2025-08-12T15:11:47.555Z" }, + { url = "https://files.pythonhosted.org/packages/74/83/2c363022b26c3c25b3708051a19d12f3374739bb81323f05b284392080c0/orjson-3.11.2-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3dcba7101ea6a8d4ef060746c0f2e7aa8e2453a1012083e1ecce9726d7554cb7", size = 226406, upload-time = "2025-08-12T15:11:49.445Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a7/aa3c973de0b33fc93b4bd71691665ffdfeae589ea9d0625584ab10a7d0f5/orjson-3.11.2-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:15d17bdb76a142e1f55d91913e012e6e6769659daa6bfef3ef93f11083137e81", size = 115788, upload-time = "2025-08-12T15:11:50.992Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/e45f233dfd09fdbb052ec46352363dca3906618e1a2b264959c18f809d0b/orjson-3.11.2-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:53c9e81768c69d4b66b8876ec3c8e431c6e13477186d0db1089d82622bccd19f", size = 111318, upload-time = "2025-08-12T15:11:52.495Z" }, + { url = "https://files.pythonhosted.org/packages/3e/23/cf5a73c4da6987204cbbf93167f353ff0c5013f7c5e5ef845d4663a366da/orjson-3.11.2-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d4f13af59a7b84c1ca6b8a7ab70d608f61f7c44f9740cd42409e6ae7b6c8d8b7", size = 121231, upload-time = "2025-08-12T15:11:53.941Z" }, + { url = "https://files.pythonhosted.org/packages/40/1d/47468a398ae68a60cc21e599144e786e035bb12829cb587299ecebc088f1/orjson-3.11.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bde64aa469b5ee46cc960ed241fae3721d6a8801dacb2ca3466547a2535951e4", size = 119204, upload-time = "2025-08-12T15:11:55.409Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d9/f99433d89b288b5bc8836bffb32a643f805e673cf840ef8bab6e73ced0d1/orjson-3.11.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:b5ca86300aeb383c8fa759566aca065878d3d98c3389d769b43f0a2e84d52c5f", size = 392237, upload-time = "2025-08-12T15:11:57.18Z" }, + { url = "https://files.pythonhosted.org/packages/d4/dc/1b9d80d40cebef603325623405136a29fb7d08c877a728c0943dd066c29a/orjson-3.11.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:24e32a558ebed73a6a71c8f1cbc163a7dd5132da5270ff3d8eeb727f4b6d1bc7", size = 134578, upload-time = "2025-08-12T15:11:58.844Z" }, + { url = "https://files.pythonhosted.org/packages/45/b3/72e7a4c5b6485ef4e83ef6aba7f1dd041002bad3eb5d1d106ca5b0fc02c6/orjson-3.11.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e36319a5d15b97e4344110517450396845cc6789aed712b1fbf83c1bd95792f6", size = 123799, upload-time = "2025-08-12T15:12:00.352Z" }, + { url = "https://files.pythonhosted.org/packages/c8/3e/a3d76b392e7acf9b34dc277171aad85efd6accc75089bb35b4c614990ea9/orjson-3.11.2-cp314-cp314-win32.whl", hash = "sha256:40193ada63fab25e35703454d65b6afc71dbc65f20041cb46c6d91709141ef7f", size = 124461, upload-time = "2025-08-12T15:12:01.854Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/75c6a596ff8df9e4a5894813ff56695f0a218e6ea99420b4a645c4f7795d/orjson-3.11.2-cp314-cp314-win_amd64.whl", hash = "sha256:7c8ac5f6b682d3494217085cf04dadae66efee45349ad4ee2a1da3c97e2305a8", size = 119494, upload-time = "2025-08-12T15:12:03.337Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3d/9e74742fc261c5ca473c96bb3344d03995869e1dc6402772c60afb97736a/orjson-3.11.2-cp314-cp314-win_arm64.whl", hash = "sha256:21cf261e8e79284242e4cb1e5924df16ae28255184aafeff19be1405f6d33f67", size = 114046, upload-time = "2025-08-12T15:12:04.87Z" }, + { url = "https://files.pythonhosted.org/packages/4f/08/8ebc6dcac0938376b7e61dff432c33958505ae4c185dda3fa1e6f46ac40b/orjson-3.11.2-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:957f10c7b5bce3d3f2ad577f3b307c784f5dabafcce3b836229c269c11841c86", size = 226498, upload-time = "2025-08-12T15:12:06.51Z" }, + { url = "https://files.pythonhosted.org/packages/ff/74/a97c8e2bc75a27dfeeb1b289645053f1889125447f3b7484a2e34ac55d2a/orjson-3.11.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a669e31ab8eb466c9142ac7a4be2bb2758ad236a31ef40dcd4cf8774ab40f33", size = 111529, upload-time = "2025-08-12T15:12:08.21Z" }, + { url = "https://files.pythonhosted.org/packages/78/c3/55121b5722a1a4e4610a411866cfeada5314dc498cd42435b590353009d2/orjson-3.11.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:adedf7d887416c51ad49de3c53b111887e0b63db36c6eb9f846a8430952303d8", size = 116213, upload-time = "2025-08-12T15:12:09.776Z" }, + { url = "https://files.pythonhosted.org/packages/54/d3/1c810fa36a749157f1ec68f825b09d5b6958ed5eaf66c7b89bc0f1656517/orjson-3.11.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ad8873979659ad98fc56377b9c5b93eb8059bf01e6412f7abf7dbb3d637a991", size = 118594, upload-time = "2025-08-12T15:12:11.363Z" }, + { url = "https://files.pythonhosted.org/packages/09/9c/052a6619857aba27899246c1ac9e1566fe976dbb48c2d2d177eb269e6d92/orjson-3.11.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9482ef83b2bf796157566dd2d2742a8a1e377045fe6065fa67acb1cb1d21d9a3", size = 120706, upload-time = "2025-08-12T15:12:13.265Z" }, + { url = "https://files.pythonhosted.org/packages/4b/91/ed0632b8bafa5534d40483ca14f4b7b7e8f27a016f52ff771420b3591574/orjson-3.11.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73cee7867c1fcbd1cc5b6688b3e13db067f968889242955780123a68b3d03316", size = 123412, upload-time = "2025-08-12T15:12:14.807Z" }, + { url = "https://files.pythonhosted.org/packages/90/3d/058184ae52a2035098939329f8864c5e28c3bbd660f80d4f687f4fd3e629/orjson-3.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465166773265f3cc25db10199f5d11c81898a309e26a2481acf33ddbec433fda", size = 121011, upload-time = "2025-08-12T15:12:16.352Z" }, + { url = "https://files.pythonhosted.org/packages/57/ab/70e7a2c26a29878ad81ac551f3d11e184efafeed92c2ea15301ac71e2b44/orjson-3.11.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc000190a7b1d2d8e36cba990b3209a1e15c0efb6c7750e87f8bead01afc0d46", size = 119387, upload-time = "2025-08-12T15:12:17.88Z" }, + { url = "https://files.pythonhosted.org/packages/6f/f1/532be344579590c2faa3d9926ec446e8e030d6d04359a8d6f9b3f4d18283/orjson-3.11.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:df3fdd8efa842ccbb81135d6f58a73512f11dba02ed08d9466261c2e9417af4e", size = 392280, upload-time = "2025-08-12T15:12:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/eb/90/dfb90d82ee7447ba0c5315b1012f36336d34a4b468f5896092926eb2921b/orjson-3.11.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3dacfc621be3079ec69e0d4cb32e3764067726e0ef5a5576428f68b6dc85b4f6", size = 134127, upload-time = "2025-08-12T15:12:22.053Z" }, + { url = "https://files.pythonhosted.org/packages/17/cb/d113d03dfaee4933b0f6e0f3d358886db1468302bb74f1f3c59d9229ce12/orjson-3.11.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9fdff73a029cde5f4a1cf5ec9dbc6acab98c9ddd69f5580c2b3f02ce43ba9f9f", size = 123722, upload-time = "2025-08-12T15:12:23.642Z" }, + { url = "https://files.pythonhosted.org/packages/55/78/a89748f500d7cf909fe0b30093ab87d256c279106048e985269a5530c0a1/orjson-3.11.2-cp39-cp39-win32.whl", hash = "sha256:b1efbdc479c6451138c3733e415b4d0e16526644e54e2f3689f699c4cda303bf", size = 124391, upload-time = "2025-08-12T15:12:25.143Z" }, + { url = "https://files.pythonhosted.org/packages/e8/50/e436f1356650cf96ff62c386dbfeb9ef8dd9cd30c4296103244e7fae2d15/orjson-3.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:c9ec0cc0d4308cad1e38a1ee23b64567e2ff364c2a3fe3d6cbc69cf911c45712", size = 119547, upload-time = "2025-08-12T15:12:26.77Z" }, ] [[package]] @@ -1162,7 +1180,7 @@ wheels = [ [[package]] name = "requests" -version = "2.32.4" +version = "2.32.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi", marker = "python_full_version >= '3.11'" }, @@ -1170,9 +1188,9 @@ dependencies = [ { name = "idna", marker = "python_full_version >= '3.11'" }, { name = "urllib3", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] [[package]] @@ -1189,27 +1207,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.12.4" +version = "0.12.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/ce/8d7dbedede481245b489b769d27e2934730791a9a82765cb94566c6e6abd/ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873", size = 5131435, upload-time = "2025-07-17T17:27:19.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/45/2e403fa7007816b5fbb324cb4f8ed3c7402a927a0a0cb2b6279879a8bfdc/ruff-0.12.9.tar.gz", hash = "sha256:fbd94b2e3c623f659962934e52c2bea6fc6da11f667a427a368adaf3af2c866a", size = 5254702, upload-time = "2025-08-14T16:08:55.2Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/9f/517bc5f61bad205b7f36684ffa5415c013862dee02f55f38a217bdbe7aa4/ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a", size = 10188824, upload-time = "2025-07-17T17:26:31.412Z" }, - { url = "https://files.pythonhosted.org/packages/28/83/691baae5a11fbbde91df01c565c650fd17b0eabed259e8b7563de17c6529/ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442", size = 10884521, upload-time = "2025-07-17T17:26:35.084Z" }, - { url = "https://files.pythonhosted.org/packages/d6/8d/756d780ff4076e6dd035d058fa220345f8c458391f7edfb1c10731eedc75/ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e", size = 10277653, upload-time = "2025-07-17T17:26:37.897Z" }, - { url = "https://files.pythonhosted.org/packages/8d/97/8eeee0f48ece153206dce730fc9e0e0ca54fd7f261bb3d99c0a4343a1892/ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586", size = 10485993, upload-time = "2025-07-17T17:26:40.68Z" }, - { url = "https://files.pythonhosted.org/packages/49/b8/22a43d23a1f68df9b88f952616c8508ea6ce4ed4f15353b8168c48b2d7e7/ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb", size = 10022824, upload-time = "2025-07-17T17:26:43.564Z" }, - { url = "https://files.pythonhosted.org/packages/cd/70/37c234c220366993e8cffcbd6cadbf332bfc848cbd6f45b02bade17e0149/ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c", size = 11524414, upload-time = "2025-07-17T17:26:46.219Z" }, - { url = "https://files.pythonhosted.org/packages/14/77/c30f9964f481b5e0e29dd6a1fae1f769ac3fd468eb76fdd5661936edd262/ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a", size = 12419216, upload-time = "2025-07-17T17:26:48.883Z" }, - { url = "https://files.pythonhosted.org/packages/6e/79/af7fe0a4202dce4ef62c5e33fecbed07f0178f5b4dd9c0d2fcff5ab4a47c/ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3", size = 11976756, upload-time = "2025-07-17T17:26:51.754Z" }, - { url = "https://files.pythonhosted.org/packages/09/d1/33fb1fc00e20a939c305dbe2f80df7c28ba9193f7a85470b982815a2dc6a/ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045", size = 11020019, upload-time = "2025-07-17T17:26:54.265Z" }, - { url = "https://files.pythonhosted.org/packages/64/f4/e3cd7f7bda646526f09693e2e02bd83d85fff8a8222c52cf9681c0d30843/ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57", size = 11277890, upload-time = "2025-07-17T17:26:56.914Z" }, - { url = "https://files.pythonhosted.org/packages/5e/d0/69a85fb8b94501ff1a4f95b7591505e8983f38823da6941eb5b6badb1e3a/ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184", size = 10348539, upload-time = "2025-07-17T17:26:59.381Z" }, - { url = "https://files.pythonhosted.org/packages/16/a0/91372d1cb1678f7d42d4893b88c252b01ff1dffcad09ae0c51aa2542275f/ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb", size = 10009579, upload-time = "2025-07-17T17:27:02.462Z" }, - { url = "https://files.pythonhosted.org/packages/23/1b/c4a833e3114d2cc0f677e58f1df6c3b20f62328dbfa710b87a1636a5e8eb/ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1", size = 10942982, upload-time = "2025-07-17T17:27:05.343Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ce/ce85e445cf0a5dd8842f2f0c6f0018eedb164a92bdf3eda51984ffd4d989/ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b", size = 11343331, upload-time = "2025-07-17T17:27:08.652Z" }, - { url = "https://files.pythonhosted.org/packages/35/cf/441b7fc58368455233cfb5b77206c849b6dfb48b23de532adcc2e50ccc06/ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93", size = 10267904, upload-time = "2025-07-17T17:27:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/ce/7e/20af4a0df5e1299e7368d5ea4350412226afb03d95507faae94c80f00afd/ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a", size = 11209038, upload-time = "2025-07-17T17:27:14.417Z" }, - { url = "https://files.pythonhosted.org/packages/11/02/8857d0dfb8f44ef299a5dfd898f673edefb71e3b533b3b9d2db4c832dd13/ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e", size = 10469336, upload-time = "2025-07-17T17:27:16.913Z" }, + { url = "https://files.pythonhosted.org/packages/ad/20/53bf098537adb7b6a97d98fcdebf6e916fcd11b2e21d15f8c171507909cc/ruff-0.12.9-py3-none-linux_armv6l.whl", hash = "sha256:fcebc6c79fcae3f220d05585229463621f5dbf24d79fdc4936d9302e177cfa3e", size = 11759705, upload-time = "2025-08-14T16:08:12.968Z" }, + { url = "https://files.pythonhosted.org/packages/20/4d/c764ee423002aac1ec66b9d541285dd29d2c0640a8086c87de59ebbe80d5/ruff-0.12.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aed9d15f8c5755c0e74467731a007fcad41f19bcce41cd75f768bbd687f8535f", size = 12527042, upload-time = "2025-08-14T16:08:16.54Z" }, + { url = "https://files.pythonhosted.org/packages/8b/45/cfcdf6d3eb5fc78a5b419e7e616d6ccba0013dc5b180522920af2897e1be/ruff-0.12.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5b15ea354c6ff0d7423814ba6d44be2807644d0c05e9ed60caca87e963e93f70", size = 11724457, upload-time = "2025-08-14T16:08:18.686Z" }, + { url = "https://files.pythonhosted.org/packages/72/e6/44615c754b55662200c48bebb02196dbb14111b6e266ab071b7e7297b4ec/ruff-0.12.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d596c2d0393c2502eaabfef723bd74ca35348a8dac4267d18a94910087807c53", size = 11949446, upload-time = "2025-08-14T16:08:21.059Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d1/9b7d46625d617c7df520d40d5ac6cdcdf20cbccb88fad4b5ecd476a6bb8d/ruff-0.12.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b15599931a1a7a03c388b9c5df1bfa62be7ede6eb7ef753b272381f39c3d0ff", size = 11566350, upload-time = "2025-08-14T16:08:23.433Z" }, + { url = "https://files.pythonhosted.org/packages/59/20/b73132f66f2856bc29d2d263c6ca457f8476b0bbbe064dac3ac3337a270f/ruff-0.12.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d02faa2977fb6f3f32ddb7828e212b7dd499c59eb896ae6c03ea5c303575756", size = 13270430, upload-time = "2025-08-14T16:08:25.837Z" }, + { url = "https://files.pythonhosted.org/packages/a2/21/eaf3806f0a3d4c6be0a69d435646fba775b65f3f2097d54898b0fd4bb12e/ruff-0.12.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:17d5b6b0b3a25259b69ebcba87908496e6830e03acfb929ef9fd4c58675fa2ea", size = 14264717, upload-time = "2025-08-14T16:08:27.907Z" }, + { url = "https://files.pythonhosted.org/packages/d2/82/1d0c53bd37dcb582b2c521d352fbf4876b1e28bc0d8894344198f6c9950d/ruff-0.12.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72db7521860e246adbb43f6ef464dd2a532ef2ef1f5dd0d470455b8d9f1773e0", size = 13684331, upload-time = "2025-08-14T16:08:30.352Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2f/1c5cf6d8f656306d42a686f1e207f71d7cebdcbe7b2aa18e4e8a0cb74da3/ruff-0.12.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a03242c1522b4e0885af63320ad754d53983c9599157ee33e77d748363c561ce", size = 12739151, upload-time = "2025-08-14T16:08:32.55Z" }, + { url = "https://files.pythonhosted.org/packages/47/09/25033198bff89b24d734e6479e39b1968e4c992e82262d61cdccaf11afb9/ruff-0.12.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc83e4e9751e6c13b5046d7162f205d0a7bac5840183c5beebf824b08a27340", size = 12954992, upload-time = "2025-08-14T16:08:34.816Z" }, + { url = "https://files.pythonhosted.org/packages/52/8e/d0dbf2f9dca66c2d7131feefc386523404014968cd6d22f057763935ab32/ruff-0.12.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:881465ed56ba4dd26a691954650de6ad389a2d1fdb130fe51ff18a25639fe4bb", size = 12899569, upload-time = "2025-08-14T16:08:36.852Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b614d7c08515b1428ed4d3f1d4e3d687deffb2479703b90237682586fa66/ruff-0.12.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:43f07a3ccfc62cdb4d3a3348bf0588358a66da756aa113e071b8ca8c3b9826af", size = 11751983, upload-time = "2025-08-14T16:08:39.314Z" }, + { url = "https://files.pythonhosted.org/packages/58/d6/383e9f818a2441b1a0ed898d7875f11273f10882f997388b2b51cb2ae8b5/ruff-0.12.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:07adb221c54b6bba24387911e5734357f042e5669fa5718920ee728aba3cbadc", size = 11538635, upload-time = "2025-08-14T16:08:41.297Z" }, + { url = "https://files.pythonhosted.org/packages/20/9c/56f869d314edaa9fc1f491706d1d8a47747b9d714130368fbd69ce9024e9/ruff-0.12.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f5cd34fabfdea3933ab85d72359f118035882a01bff15bd1d2b15261d85d5f66", size = 12534346, upload-time = "2025-08-14T16:08:43.39Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4b/d8b95c6795a6c93b439bc913ee7a94fda42bb30a79285d47b80074003ee7/ruff-0.12.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f6be1d2ca0686c54564da8e7ee9e25f93bdd6868263805f8c0b8fc6a449db6d7", size = 13017021, upload-time = "2025-08-14T16:08:45.889Z" }, + { url = "https://files.pythonhosted.org/packages/c7/c1/5f9a839a697ce1acd7af44836f7c2181cdae5accd17a5cb85fcbd694075e/ruff-0.12.9-py3-none-win32.whl", hash = "sha256:cc7a37bd2509974379d0115cc5608a1a4a6c4bff1b452ea69db83c8855d53f93", size = 11734785, upload-time = "2025-08-14T16:08:48.062Z" }, + { url = "https://files.pythonhosted.org/packages/fa/66/cdddc2d1d9a9f677520b7cfc490d234336f523d4b429c1298de359a3be08/ruff-0.12.9-py3-none-win_amd64.whl", hash = "sha256:6fb15b1977309741d7d098c8a3cb7a30bc112760a00fb6efb7abc85f00ba5908", size = 12840654, upload-time = "2025-08-14T16:08:50.158Z" }, + { url = "https://files.pythonhosted.org/packages/ac/fd/669816bc6b5b93b9586f3c1d87cd6bc05028470b3ecfebb5938252c47a35/ruff-0.12.9-py3-none-win_arm64.whl", hash = "sha256:63c8c819739d86b96d500cce885956a1a48ab056bbcbc61b747ad494b2485089", size = 11949623, upload-time = "2025-08-14T16:08:52.233Z" }, ] [[package]] @@ -1237,15 +1256,15 @@ wheels = [ [[package]] name = "starlette" -version = "0.47.1" +version = "0.47.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/69/662169fdb92fb96ec3eaee218cf540a629d629c86d7993d9651226a6789b/starlette-0.47.1.tar.gz", hash = "sha256:aef012dd2b6be325ffa16698f9dc533614fb1cebd593a906b90dc1025529a79b", size = 2583072, upload-time = "2025-06-21T04:03:17.337Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/57/d062573f391d062710d4088fa1369428c38d51460ab6fedff920efef932e/starlette-0.47.2.tar.gz", hash = "sha256:6ae9aa5db235e4846decc1e7b79c4f346adf41e9777aebeb49dfd09bbd7023d8", size = 2583948, upload-time = "2025-07-20T17:31:58.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/95/38ef0cd7fa11eaba6a99b3c4f5ac948d8bc6ff199aabd327a29cc000840c/starlette-0.47.1-py3-none-any.whl", hash = "sha256:5e11c9f5c7c3f24959edbf2dffdc01bba860228acf657129467d8a7468591527", size = 72747, upload-time = "2025-06-21T04:03:15.705Z" }, + { url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" }, ] [[package]] @@ -1307,11 +1326,11 @@ wheels = [ [[package]] name = "truststore" -version = "0.10.1" +version = "0.10.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/a7/b7a43228762966a13598a404f3dfb4803ea29a906f449d8b0e73ed0bcd30/truststore-0.10.1.tar.gz", hash = "sha256:eda021616b59021812e800fa0a071e51b266721bef3ce092db8a699e21c63539", size = 26101, upload-time = "2025-02-07T18:57:38.201Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/df/8ad635bdcfa8214c399e5614f7c2121dced47defb755a85ea1fa702ffb1c/truststore-0.10.1-py3-none-any.whl", hash = "sha256:b64e6025a409a43ebdd2807b0c41c8bff49ea7ae6550b5087ac6df6619352d4c", size = 18496, upload-time = "2025-02-07T18:57:36.348Z" }, + { url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" }, ] [[package]] @@ -1605,91 +1624,106 @@ wheels = [ [[package]] name = "zstandard" -version = "0.23.0" +version = "0.24.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "python_full_version >= '3.11' and platform_python_implementation == 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701, upload-time = "2024-07-15T00:18:06.141Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/1b/c20b2ef1d987627765dcd5bf1dadb8ef6564f00a87972635099bb76b7a05/zstandard-0.24.0.tar.gz", hash = "sha256:fe3198b81c00032326342d973e526803f183f97aa9e9a98e3f897ebafe21178f", size = 905681, upload-time = "2025-08-17T18:36:36.352Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701, upload-time = "2024-07-15T00:13:27.351Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678, upload-time = "2024-07-15T00:13:30.24Z" }, - { url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098, upload-time = "2024-07-15T00:13:32.526Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798, upload-time = "2024-07-15T00:13:34.925Z" }, - { url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840, upload-time = "2024-07-15T00:13:37.376Z" }, - { url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337, upload-time = "2024-07-15T00:13:39.772Z" }, - { url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182, upload-time = "2024-07-15T00:13:42.495Z" }, - { url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936, upload-time = "2024-07-15T00:13:44.234Z" }, - { url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705, upload-time = "2024-07-15T00:13:46.822Z" }, - { url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882, upload-time = "2024-07-15T00:13:49.297Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672, upload-time = "2024-07-15T00:13:51.447Z" }, - { url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043, upload-time = "2024-07-15T00:13:53.587Z" }, - { url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390, upload-time = "2024-07-15T00:13:56.137Z" }, - { url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901, upload-time = "2024-07-15T00:13:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596, upload-time = "2024-07-15T00:14:00.693Z" }, - { url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498, upload-time = "2024-07-15T00:14:02.741Z" }, - { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699, upload-time = "2024-07-15T00:14:04.909Z" }, - { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681, upload-time = "2024-07-15T00:14:13.99Z" }, - { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328, upload-time = "2024-07-15T00:14:16.588Z" }, - { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955, upload-time = "2024-07-15T00:14:19.389Z" }, - { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944, upload-time = "2024-07-15T00:14:22.173Z" }, - { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927, upload-time = "2024-07-15T00:14:24.825Z" }, - { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910, upload-time = "2024-07-15T00:14:26.982Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544, upload-time = "2024-07-15T00:14:29.582Z" }, - { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094, upload-time = "2024-07-15T00:14:40.126Z" }, - { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440, upload-time = "2024-07-15T00:14:42.786Z" }, - { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091, upload-time = "2024-07-15T00:14:45.184Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682, upload-time = "2024-07-15T00:14:47.407Z" }, - { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707, upload-time = "2024-07-15T00:15:03.529Z" }, - { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792, upload-time = "2024-07-15T00:15:28.372Z" }, - { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586, upload-time = "2024-07-15T00:15:32.26Z" }, - { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420, upload-time = "2024-07-15T00:15:34.004Z" }, - { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713, upload-time = "2024-07-15T00:15:35.815Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459, upload-time = "2024-07-15T00:15:37.995Z" }, - { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707, upload-time = "2024-07-15T00:15:39.872Z" }, - { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545, upload-time = "2024-07-15T00:15:41.75Z" }, - { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533, upload-time = "2024-07-15T00:15:44.114Z" }, - { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510, upload-time = "2024-07-15T00:15:46.509Z" }, - { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973, upload-time = "2024-07-15T00:15:49.939Z" }, - { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968, upload-time = "2024-07-15T00:15:52.025Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179, upload-time = "2024-07-15T00:15:54.971Z" }, - { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577, upload-time = "2024-07-15T00:15:57.634Z" }, - { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899, upload-time = "2024-07-15T00:16:00.811Z" }, - { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964, upload-time = "2024-07-15T00:16:03.669Z" }, - { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398, upload-time = "2024-07-15T00:16:06.694Z" }, - { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313, upload-time = "2024-07-15T00:16:09.758Z" }, - { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877, upload-time = "2024-07-15T00:16:11.758Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595, upload-time = "2024-07-15T00:16:13.731Z" }, - { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975, upload-time = "2024-07-15T00:16:16.005Z" }, - { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448, upload-time = "2024-07-15T00:16:17.897Z" }, - { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269, upload-time = "2024-07-15T00:16:20.136Z" }, - { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228, upload-time = "2024-07-15T00:16:23.398Z" }, - { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891, upload-time = "2024-07-15T00:16:26.391Z" }, - { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310, upload-time = "2024-07-15T00:16:29.018Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912, upload-time = "2024-07-15T00:16:31.871Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946, upload-time = "2024-07-15T00:16:34.593Z" }, - { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994, upload-time = "2024-07-15T00:16:36.887Z" }, - { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681, upload-time = "2024-07-15T00:16:39.709Z" }, - { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239, upload-time = "2024-07-15T00:16:41.83Z" }, - { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149, upload-time = "2024-07-15T00:16:44.287Z" }, - { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392, upload-time = "2024-07-15T00:16:46.423Z" }, - { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299, upload-time = "2024-07-15T00:16:49.053Z" }, - { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862, upload-time = "2024-07-15T00:16:51.003Z" }, - { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578, upload-time = "2024-07-15T00:16:53.135Z" }, - { url = "https://files.pythonhosted.org/packages/fb/96/4fcafeb7e013a2386d22f974b5b97a0b9a65004ed58c87ae001599bfbd48/zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb", size = 788697, upload-time = "2024-07-15T00:17:31.236Z" }, - { url = "https://files.pythonhosted.org/packages/83/ff/a52ce725be69b86a2967ecba0497a8184540cc284c0991125515449e54e2/zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916", size = 633679, upload-time = "2024-07-15T00:17:32.911Z" }, - { url = "https://files.pythonhosted.org/packages/34/0f/3dc62db122f6a9c481c335fff6fc9f4e88d8f6e2d47321ee3937328addb4/zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a", size = 4940416, upload-time = "2024-07-15T00:17:34.849Z" }, - { url = "https://files.pythonhosted.org/packages/1d/e5/9fe0dd8c85fdc2f635e6660d07872a5dc4b366db566630161e39f9f804e1/zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259", size = 5307693, upload-time = "2024-07-15T00:17:37.355Z" }, - { url = "https://files.pythonhosted.org/packages/73/bf/fe62c0cd865c171ee8ed5bc83174b5382a2cb729c8d6162edfb99a83158b/zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4", size = 5341236, upload-time = "2024-07-15T00:17:40.213Z" }, - { url = "https://files.pythonhosted.org/packages/39/86/4fe79b30c794286110802a6cd44a73b6a314ac8196b9338c0fbd78c2407d/zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58", size = 5439101, upload-time = "2024-07-15T00:17:42.284Z" }, - { url = "https://files.pythonhosted.org/packages/72/ed/cacec235c581ebf8c608c7fb3d4b6b70d1b490d0e5128ea6996f809ecaef/zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15", size = 4860320, upload-time = "2024-07-15T00:17:44.21Z" }, - { url = "https://files.pythonhosted.org/packages/f6/1e/2c589a2930f93946b132fc852c574a19d5edc23fad2b9e566f431050c7ec/zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269", size = 4931933, upload-time = "2024-07-15T00:17:46.455Z" }, - { url = "https://files.pythonhosted.org/packages/8e/f5/30eadde3686d902b5d4692bb5f286977cbc4adc082145eb3f49d834b2eae/zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700", size = 5463878, upload-time = "2024-07-15T00:17:48.866Z" }, - { url = "https://files.pythonhosted.org/packages/e0/c8/8aed1f0ab9854ef48e5ad4431367fcb23ce73f0304f7b72335a8edc66556/zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9", size = 4857192, upload-time = "2024-07-15T00:17:51.558Z" }, - { url = "https://files.pythonhosted.org/packages/a8/c6/55e666cfbcd032b9e271865e8578fec56e5594d4faeac379d371526514f5/zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69", size = 4696513, upload-time = "2024-07-15T00:17:53.924Z" }, - { url = "https://files.pythonhosted.org/packages/dc/bd/720b65bea63ec9de0ac7414c33b9baf271c8de8996e5ff324dc93fc90ff1/zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70", size = 5204823, upload-time = "2024-07-15T00:17:55.948Z" }, - { url = "https://files.pythonhosted.org/packages/d8/40/d678db1556e3941d330cd4e95623a63ef235b18547da98fa184cbc028ecf/zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2", size = 5666490, upload-time = "2024-07-15T00:17:58.327Z" }, - { url = "https://files.pythonhosted.org/packages/ed/cc/c89329723d7515898a1fc7ef5d251264078548c505719d13e9511800a103/zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5", size = 5196622, upload-time = "2024-07-15T00:18:00.404Z" }, - { url = "https://files.pythonhosted.org/packages/78/4c/634289d41e094327a94500dfc919e58841b10ea3a9efdfafbac614797ec2/zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274", size = 430620, upload-time = "2024-07-15T00:18:02.613Z" }, - { url = "https://files.pythonhosted.org/packages/a2/e2/0b0c5a0f4f7699fecd92c1ba6278ef9b01f2b0b0dd46f62bfc6729c05659/zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58", size = 495528, upload-time = "2024-07-15T00:18:04.452Z" }, + { url = "https://files.pythonhosted.org/packages/63/9d/d1ca1e7bff6a7938e81180322c053c080ae9e31b0e3b393434deae7a1ae5/zstandard-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af1394c2c5febc44e0bbf0fc6428263fa928b50d1b1982ce1d870dc793a8e5f4", size = 795228, upload-time = "2025-08-17T18:21:12.444Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ba/a40ddfbbb9f0773127701a802338f215211b018f9222b9fab1e2d498f9cd/zstandard-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e941654cef13a1d53634ec30933722eda11f44f99e1d0bc62bbce3387580d50", size = 640522, upload-time = "2025-08-17T18:21:14.133Z" }, + { url = "https://files.pythonhosted.org/packages/3e/7c/edeee3ef8d469a1345edd86f8d123a3825d60df033bcbbd16df417bdb9e7/zstandard-0.24.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:561123d05681197c0e24eb8ab3cfdaf299e2b59c293d19dad96e1610ccd8fbc6", size = 5344625, upload-time = "2025-08-17T18:21:16.067Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2c/2f76e5058435d96ab0187303d4e9663372893cdcc95d64fdb60824951162/zstandard-0.24.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0f6d9a146e07458cb41423ca2d783aefe3a3a97fe72838973c13b8f1ecc7343a", size = 5055074, upload-time = "2025-08-17T18:21:18.483Z" }, + { url = "https://files.pythonhosted.org/packages/e4/87/3962530a568d38e64f287e11b9a38936d873617120589611c49c29af94a8/zstandard-0.24.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf02f915fa7934ea5dfc8d96757729c99a8868b7c340b97704795d6413cf5fe6", size = 5401308, upload-time = "2025-08-17T18:21:20.859Z" }, + { url = "https://files.pythonhosted.org/packages/f1/69/85e65f0fb05b4475130888cf7934ff30ac14b5979527e8f1ccb6f56e21ec/zstandard-0.24.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:35f13501a8accf834457d8e40e744568287a215818778bc4d79337af2f3f0d97", size = 5448948, upload-time = "2025-08-17T18:21:23.015Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2f/1b607274bf20ea8bcd13bea3edc0a48f984c438c09d0a050b9667dadcaed/zstandard-0.24.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92be52ca4e6e604f03d5daa079caec9e04ab4cbf6972b995aaebb877d3d24e13", size = 5555870, upload-time = "2025-08-17T18:21:24.985Z" }, + { url = "https://files.pythonhosted.org/packages/a0/9a/fadd5ffded6ab113b26704658a40444865b914de072fb460b6b51aa5fa2f/zstandard-0.24.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0c9c3cba57f5792532a3df3f895980d47d78eda94b0e5b800651b53e96e0b604", size = 5044917, upload-time = "2025-08-17T18:21:27.082Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/c5edc3b00e070d0b4156993bd7bef9cba58c5f2571bd0003054cbe90005c/zstandard-0.24.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dd91b0134a32dfcd8be504e8e46de44ad0045a569efc25101f2a12ccd41b5759", size = 5571834, upload-time = "2025-08-17T18:21:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/1f/7e/9e353ed08c3d7a93050bbadbebe2f5f783b13393e0e8e08e970ef3396390/zstandard-0.24.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d6975f2d903bc354916a17b91a7aaac7299603f9ecdb788145060dde6e573a16", size = 4959108, upload-time = "2025-08-17T18:21:31.228Z" }, + { url = "https://files.pythonhosted.org/packages/af/28/135dffba375ab1f4d2c569de804647eba8bd682f36d3c01b5a012c560ff2/zstandard-0.24.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7ac6e4d727521d86d20ec291a3f4e64a478e8a73eaee80af8f38ec403e77a409", size = 5265997, upload-time = "2025-08-17T18:21:33.369Z" }, + { url = "https://files.pythonhosted.org/packages/cc/7a/702e7cbc51c39ce104c198ea6d069fb6a918eb24c5709ac79fe9371f7a55/zstandard-0.24.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:87ae1684bc3c02d5c35884b3726525eda85307073dbefe68c3c779e104a59036", size = 5440015, upload-time = "2025-08-17T18:21:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/77/40/4a2d0faa2ae6f4c847c7f77ec626abed80873035891c4a4349b735a36fb4/zstandard-0.24.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:7de5869e616d426b56809be7dc6dba4d37b95b90411ccd3de47f421a42d4d42c", size = 5819056, upload-time = "2025-08-17T18:21:39.661Z" }, + { url = "https://files.pythonhosted.org/packages/3e/fc/580504a2d7c71411a8e403b83f2388ee083819a68e0e740bf974e78839f8/zstandard-0.24.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:388aad2d693707f4a0f6cc687eb457b33303d6b57ecf212c8ff4468c34426892", size = 5362621, upload-time = "2025-08-17T18:21:42.605Z" }, + { url = "https://files.pythonhosted.org/packages/70/66/97f6b38eeda955eaa6b5e7cfc0528039bfcb9eb8338016aacf6d83d8a75e/zstandard-0.24.0-cp310-cp310-win32.whl", hash = "sha256:962ea3aecedcc944f8034812e23d7200d52c6e32765b8da396eeb8b8ffca71ce", size = 435575, upload-time = "2025-08-17T18:21:45.477Z" }, + { url = "https://files.pythonhosted.org/packages/68/a2/5814bdd22d879b10fcc5dc37366e39603767063f06ae970f2a657f76ddac/zstandard-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:869bf13f66b124b13be37dd6e08e4b728948ff9735308694e0b0479119e08ea7", size = 505115, upload-time = "2025-08-17T18:21:44.011Z" }, + { url = "https://files.pythonhosted.org/packages/01/1f/5c72806f76043c0ef9191a2b65281dacdf3b65b0828eb13bb2c987c4fb90/zstandard-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:addfc23e3bd5f4b6787b9ca95b2d09a1a67ad5a3c318daaa783ff90b2d3a366e", size = 795228, upload-time = "2025-08-17T18:21:46.978Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ba/3059bd5cd834666a789251d14417621b5c61233bd46e7d9023ea8bc1043a/zstandard-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b005bcee4be9c3984b355336283afe77b2defa76ed6b89332eced7b6fa68b68", size = 640520, upload-time = "2025-08-17T18:21:48.162Z" }, + { url = "https://files.pythonhosted.org/packages/57/07/f0e632bf783f915c1fdd0bf68614c4764cae9dd46ba32cbae4dd659592c3/zstandard-0.24.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:3f96a9130171e01dbb6c3d4d9925d604e2131a97f540e223b88ba45daf56d6fb", size = 5347682, upload-time = "2025-08-17T18:21:50.266Z" }, + { url = "https://files.pythonhosted.org/packages/a6/4c/63523169fe84773a7462cd090b0989cb7c7a7f2a8b0a5fbf00009ba7d74d/zstandard-0.24.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd0d3d16e63873253bad22b413ec679cf6586e51b5772eb10733899832efec42", size = 5057650, upload-time = "2025-08-17T18:21:52.634Z" }, + { url = "https://files.pythonhosted.org/packages/c6/16/49013f7ef80293f5cebf4c4229535a9f4c9416bbfd238560edc579815dbe/zstandard-0.24.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b7a8c30d9bf4bd5e4dcfe26900bef0fcd9749acde45cdf0b3c89e2052fda9a13", size = 5404893, upload-time = "2025-08-17T18:21:54.54Z" }, + { url = "https://files.pythonhosted.org/packages/4d/38/78e8bcb5fc32a63b055f2b99e0be49b506f2351d0180173674f516cf8a7a/zstandard-0.24.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:52cd7d9fa0a115c9446abb79b06a47171b7d916c35c10e0c3aa6f01d57561382", size = 5452389, upload-time = "2025-08-17T18:21:56.822Z" }, + { url = "https://files.pythonhosted.org/packages/55/8a/81671f05619edbacd49bd84ce6899a09fc8299be20c09ae92f6618ccb92d/zstandard-0.24.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0f6fc2ea6e07e20df48752e7700e02e1892c61f9a6bfbacaf2c5b24d5ad504b", size = 5558888, upload-time = "2025-08-17T18:21:58.68Z" }, + { url = "https://files.pythonhosted.org/packages/49/cc/e83feb2d7d22d1f88434defbaeb6e5e91f42a4f607b5d4d2d58912b69d67/zstandard-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e46eb6702691b24ddb3e31e88b4a499e31506991db3d3724a85bd1c5fc3cfe4e", size = 5048038, upload-time = "2025-08-17T18:22:00.642Z" }, + { url = "https://files.pythonhosted.org/packages/08/c3/7a5c57ff49ef8943877f85c23368c104c2aea510abb339a2dc31ad0a27c3/zstandard-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5e3b9310fd7f0d12edc75532cd9a56da6293840c84da90070d692e0bb15f186", size = 5573833, upload-time = "2025-08-17T18:22:02.402Z" }, + { url = "https://files.pythonhosted.org/packages/f9/00/64519983cd92535ba4bdd4ac26ac52db00040a52d6c4efb8d1764abcc343/zstandard-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76cdfe7f920738ea871f035568f82bad3328cbc8d98f1f6988264096b5264efd", size = 4961072, upload-time = "2025-08-17T18:22:04.384Z" }, + { url = "https://files.pythonhosted.org/packages/72/ab/3a08a43067387d22994fc87c3113636aa34ccd2914a4d2d188ce365c5d85/zstandard-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3f2fe35ec84908dddf0fbf66b35d7c2878dbe349552dd52e005c755d3493d61c", size = 5268462, upload-time = "2025-08-17T18:22:06.095Z" }, + { url = "https://files.pythonhosted.org/packages/49/cf/2abb3a1ad85aebe18c53e7eca73223f1546ddfa3bf4d2fb83fc5a064c5ca/zstandard-0.24.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:aa705beb74ab116563f4ce784fa94771f230c05d09ab5de9c397793e725bb1db", size = 5443319, upload-time = "2025-08-17T18:22:08.572Z" }, + { url = "https://files.pythonhosted.org/packages/40/42/0dd59fc2f68f1664cda11c3b26abdf987f4e57cb6b6b0f329520cd074552/zstandard-0.24.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:aadf32c389bb7f02b8ec5c243c38302b92c006da565e120dfcb7bf0378f4f848", size = 5822355, upload-time = "2025-08-17T18:22:10.537Z" }, + { url = "https://files.pythonhosted.org/packages/99/c0/ea4e640fd4f7d58d6f87a1e7aca11fb886ac24db277fbbb879336c912f63/zstandard-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e40cd0fc734aa1d4bd0e7ad102fd2a1aefa50ce9ef570005ffc2273c5442ddc3", size = 5365257, upload-time = "2025-08-17T18:22:13.159Z" }, + { url = "https://files.pythonhosted.org/packages/27/a9/92da42a5c4e7e4003271f2e1f0efd1f37cfd565d763ad3604e9597980a1c/zstandard-0.24.0-cp311-cp311-win32.whl", hash = "sha256:cda61c46343809ecda43dc620d1333dd7433a25d0a252f2dcc7667f6331c7b61", size = 435559, upload-time = "2025-08-17T18:22:17.29Z" }, + { url = "https://files.pythonhosted.org/packages/e2/8e/2c8e5c681ae4937c007938f954a060fa7c74f36273b289cabdb5ef0e9a7e/zstandard-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:3b95fc06489aa9388400d1aab01a83652bc040c9c087bd732eb214909d7fb0dd", size = 505070, upload-time = "2025-08-17T18:22:14.808Z" }, + { url = "https://files.pythonhosted.org/packages/52/10/a2f27a66bec75e236b575c9f7b0d7d37004a03aa2dcde8e2decbe9ed7b4d/zstandard-0.24.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad9fd176ff6800a0cf52bcf59c71e5de4fa25bf3ba62b58800e0f84885344d34", size = 461507, upload-time = "2025-08-17T18:22:15.964Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/0bd281d9154bba7fc421a291e263911e1d69d6951aa80955b992a48289f6/zstandard-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a2bda8f2790add22773ee7a4e43c90ea05598bffc94c21c40ae0a9000b0133c3", size = 795710, upload-time = "2025-08-17T18:22:19.189Z" }, + { url = "https://files.pythonhosted.org/packages/36/26/b250a2eef515caf492e2d86732e75240cdac9d92b04383722b9753590c36/zstandard-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cc76de75300f65b8eb574d855c12518dc25a075dadb41dd18f6322bda3fe15d5", size = 640336, upload-time = "2025-08-17T18:22:20.466Z" }, + { url = "https://files.pythonhosted.org/packages/79/bf/3ba6b522306d9bf097aac8547556b98a4f753dc807a170becaf30dcd6f01/zstandard-0.24.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:d2b3b4bda1a025b10fe0269369475f420177f2cb06e0f9d32c95b4873c9f80b8", size = 5342533, upload-time = "2025-08-17T18:22:22.326Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ec/22bc75bf054e25accdf8e928bc68ab36b4466809729c554ff3a1c1c8bce6/zstandard-0.24.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b84c6c210684286e504022d11ec294d2b7922d66c823e87575d8b23eba7c81f", size = 5062837, upload-time = "2025-08-17T18:22:24.416Z" }, + { url = "https://files.pythonhosted.org/packages/48/cc/33edfc9d286e517fb5b51d9c3210e5bcfce578d02a675f994308ca587ae1/zstandard-0.24.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c59740682a686bf835a1a4d8d0ed1eefe31ac07f1c5a7ed5f2e72cf577692b00", size = 5393855, upload-time = "2025-08-17T18:22:26.786Z" }, + { url = "https://files.pythonhosted.org/packages/73/36/59254e9b29da6215fb3a717812bf87192d89f190f23817d88cb8868c47ac/zstandard-0.24.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6324fde5cf5120fbf6541d5ff3c86011ec056e8d0f915d8e7822926a5377193a", size = 5451058, upload-time = "2025-08-17T18:22:28.885Z" }, + { url = "https://files.pythonhosted.org/packages/9a/c7/31674cb2168b741bbbe71ce37dd397c9c671e73349d88ad3bca9e9fae25b/zstandard-0.24.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51a86bd963de3f36688553926a84e550d45d7f9745bd1947d79472eca27fcc75", size = 5546619, upload-time = "2025-08-17T18:22:31.115Z" }, + { url = "https://files.pythonhosted.org/packages/e6/01/1a9f22239f08c00c156f2266db857545ece66a6fc0303d45c298564bc20b/zstandard-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d82ac87017b734f2fb70ff93818c66f0ad2c3810f61040f077ed38d924e19980", size = 5046676, upload-time = "2025-08-17T18:22:33.077Z" }, + { url = "https://files.pythonhosted.org/packages/a7/91/6c0cf8fa143a4988a0361380ac2ef0d7cb98a374704b389fbc38b5891712/zstandard-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92ea7855d5bcfb386c34557516c73753435fb2d4a014e2c9343b5f5ba148b5d8", size = 5576381, upload-time = "2025-08-17T18:22:35.391Z" }, + { url = "https://files.pythonhosted.org/packages/e2/77/1526080e22e78871e786ccf3c84bf5cec9ed25110a9585507d3c551da3d6/zstandard-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3adb4b5414febf074800d264ddf69ecade8c658837a83a19e8ab820e924c9933", size = 4953403, upload-time = "2025-08-17T18:22:37.266Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d0/a3a833930bff01eab697eb8abeafb0ab068438771fa066558d96d7dafbf9/zstandard-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6374feaf347e6b83ec13cc5dcfa70076f06d8f7ecd46cc71d58fac798ff08b76", size = 5267396, upload-time = "2025-08-17T18:22:39.757Z" }, + { url = "https://files.pythonhosted.org/packages/f3/5e/90a0db9a61cd4769c06374297ecfcbbf66654f74cec89392519deba64d76/zstandard-0.24.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:13fc548e214df08d896ee5f29e1f91ee35db14f733fef8eabea8dca6e451d1e2", size = 5433269, upload-time = "2025-08-17T18:22:42.131Z" }, + { url = "https://files.pythonhosted.org/packages/ce/58/fc6a71060dd67c26a9c5566e0d7c99248cbe5abfda6b3b65b8f1a28d59f7/zstandard-0.24.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0a416814608610abf5488889c74e43ffa0343ca6cf43957c6b6ec526212422da", size = 5814203, upload-time = "2025-08-17T18:22:44.017Z" }, + { url = "https://files.pythonhosted.org/packages/5c/6a/89573d4393e3ecbfa425d9a4e391027f58d7810dec5cdb13a26e4cdeef5c/zstandard-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0d66da2649bb0af4471699aeb7a83d6f59ae30236fb9f6b5d20fb618ef6c6777", size = 5359622, upload-time = "2025-08-17T18:22:45.802Z" }, + { url = "https://files.pythonhosted.org/packages/60/ff/2cbab815d6f02a53a9d8d8703bc727d8408a2e508143ca9af6c3cca2054b/zstandard-0.24.0-cp312-cp312-win32.whl", hash = "sha256:ff19efaa33e7f136fe95f9bbcc90ab7fb60648453b03f95d1de3ab6997de0f32", size = 435968, upload-time = "2025-08-17T18:22:49.493Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a3/8f96b8ddb7ad12344218fbd0fd2805702dafd126ae9f8a1fb91eef7b33da/zstandard-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc05f8a875eb651d1cc62e12a4a0e6afa5cd0cc231381adb830d2e9c196ea895", size = 505195, upload-time = "2025-08-17T18:22:47.193Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4a/bfca20679da63bfc236634ef2e4b1b4254203098b0170e3511fee781351f/zstandard-0.24.0-cp312-cp312-win_arm64.whl", hash = "sha256:b04c94718f7a8ed7cdd01b162b6caa1954b3c9d486f00ecbbd300f149d2b2606", size = 461605, upload-time = "2025-08-17T18:22:48.317Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ef/db949de3bf81ed122b8ee4db6a8d147a136fe070e1015f5a60d8a3966748/zstandard-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e4ebb000c0fe24a6d0f3534b6256844d9dbf042fdf003efe5cf40690cf4e0f3e", size = 795700, upload-time = "2025-08-17T18:22:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/99/56/fc04395d6f5eabd2fe6d86c0800d198969f3038385cb918bfbe94f2b0c62/zstandard-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:498f88f5109666c19531f0243a90d2fdd2252839cd6c8cc6e9213a3446670fa8", size = 640343, upload-time = "2025-08-17T18:22:51.999Z" }, + { url = "https://files.pythonhosted.org/packages/9b/0f/0b0e0d55f2f051d5117a0d62f4f9a8741b3647440c0ee1806b7bd47ed5ae/zstandard-0.24.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0a9e95ceb180ccd12a8b3437bac7e8a8a089c9094e39522900a8917745542184", size = 5342571, upload-time = "2025-08-17T18:22:53.734Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/d74e49f04fbd62d4b5d89aeb7a29d693fc637c60238f820cd5afe6ca8180/zstandard-0.24.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bcf69e0bcddbf2adcfafc1a7e864edcc204dd8171756d3a8f3340f6f6cc87b7b", size = 5062723, upload-time = "2025-08-17T18:22:55.624Z" }, + { url = "https://files.pythonhosted.org/packages/8e/97/df14384d4d6a004388e6ed07ded02933b5c7e0833a9150c57d0abc9545b7/zstandard-0.24.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:10e284748a7e7fbe2815ca62a9d6e84497d34cfdd0143fa9e8e208efa808d7c4", size = 5393282, upload-time = "2025-08-17T18:22:57.655Z" }, + { url = "https://files.pythonhosted.org/packages/7e/09/8f5c520e59a4d41591b30b7568595eda6fd71c08701bb316d15b7ed0613a/zstandard-0.24.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1bda8a85e5b9d5e73af2e61b23609a8cc1598c1b3b2473969912979205a1ff25", size = 5450895, upload-time = "2025-08-17T18:22:59.749Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3d/02aba892327a67ead8cba160ee835cfa1fc292a9dcb763639e30c07da58b/zstandard-0.24.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b14bc92af065d0534856bf1b30fc48753163ea673da98857ea4932be62079b1", size = 5546353, upload-time = "2025-08-17T18:23:01.457Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6e/96c52afcde44da6a5313a1f6c356349792079808f12d8b69a7d1d98ef353/zstandard-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:b4f20417a4f511c656762b001ec827500cbee54d1810253c6ca2df2c0a307a5f", size = 5046404, upload-time = "2025-08-17T18:23:03.418Z" }, + { url = "https://files.pythonhosted.org/packages/da/b6/eefee6b92d341a7db7cd1b3885d42d30476a093720fb5c181e35b236d695/zstandard-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:337572a7340e1d92fd7fb5248c8300d0e91071002d92e0b8cabe8d9ae7b58159", size = 5576095, upload-time = "2025-08-17T18:23:05.331Z" }, + { url = "https://files.pythonhosted.org/packages/a3/29/743de3131f6239ba6611e17199581e6b5e0f03f268924d42468e29468ca0/zstandard-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df4be1cf6e8f0f2bbe2a3eabfff163ef592c84a40e1a20a8d7db7f27cfe08fc2", size = 4953448, upload-time = "2025-08-17T18:23:07.225Z" }, + { url = "https://files.pythonhosted.org/packages/c9/11/bd36ef49fba82e307d69d93b5abbdcdc47d6a0bcbc7ffbbfe0ef74c2fec5/zstandard-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6885ae4b33aee8835dbdb4249d3dfec09af55e705d74d9b660bfb9da51baaa8b", size = 5267388, upload-time = "2025-08-17T18:23:09.127Z" }, + { url = "https://files.pythonhosted.org/packages/c0/23/a4cfe1b871d3f1ce1f88f5c68d7e922e94be0043f3ae5ed58c11578d1e21/zstandard-0.24.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:663848a8bac4fdbba27feea2926049fdf7b55ec545d5b9aea096ef21e7f0b079", size = 5433383, upload-time = "2025-08-17T18:23:11.343Z" }, + { url = "https://files.pythonhosted.org/packages/77/26/f3fb85f00e732cca617d4b9cd1ffa6484f613ea07fad872a8bdc3a0ce753/zstandard-0.24.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:05d27c953f2e0a3ecc8edbe91d6827736acc4c04d0479672e0400ccdb23d818c", size = 5813988, upload-time = "2025-08-17T18:23:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8c/d7e3b424b73f3ce66e754595cbcb6d94ff49790c9ac37d50e40e8145cd44/zstandard-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77b8b7b98893eaf47da03d262816f01f251c2aa059c063ed8a45c50eada123a5", size = 5359756, upload-time = "2025-08-17T18:23:15.021Z" }, + { url = "https://files.pythonhosted.org/packages/90/6c/f1f0e11f1b295138f9da7e7ae22dcd9a1bb96a9544fa3b31507e431288f5/zstandard-0.24.0-cp313-cp313-win32.whl", hash = "sha256:cf7fbb4e54136e9a03c7ed7691843c4df6d2ecc854a2541f840665f4f2bb2edd", size = 435957, upload-time = "2025-08-17T18:23:18.835Z" }, + { url = "https://files.pythonhosted.org/packages/9f/03/ab8b82ae5eb49eca4d3662705399c44442666cc1ce45f44f2d263bb1ae31/zstandard-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:d64899cc0f33a8f446f1e60bffc21fa88b99f0e8208750d9144ea717610a80ce", size = 505171, upload-time = "2025-08-17T18:23:16.44Z" }, + { url = "https://files.pythonhosted.org/packages/db/12/89a2ecdea4bc73a934a30b66a7cfac5af352beac94d46cf289e103b65c34/zstandard-0.24.0-cp313-cp313-win_arm64.whl", hash = "sha256:57be3abb4313e0dd625596376bbb607f40059d801d51c1a1da94d7477e63b255", size = 461596, upload-time = "2025-08-17T18:23:17.603Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/f3d2c4d64aacee4aab89e788783636884786b6f8334c819f09bff1aa207b/zstandard-0.24.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b7fa260dd2731afd0dfa47881c30239f422d00faee4b8b341d3e597cface1483", size = 795747, upload-time = "2025-08-17T18:23:19.968Z" }, + { url = "https://files.pythonhosted.org/packages/32/2d/9d3e5f6627e4cb5e511803788be1feee2f0c3b94594591e92b81db324253/zstandard-0.24.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e05d66239d14a04b4717998b736a25494372b1b2409339b04bf42aa4663bf251", size = 640475, upload-time = "2025-08-17T18:23:21.5Z" }, + { url = "https://files.pythonhosted.org/packages/be/5d/48e66abf8c146d95330e5385633a8cfdd556fa8bd14856fe721590cbab2b/zstandard-0.24.0-cp314-cp314-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:622e1e04bd8a085994e02313ba06fbcf4f9ed9a488c6a77a8dbc0692abab6a38", size = 5343866, upload-time = "2025-08-17T18:23:23.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/6c/65fe7ba71220a551e082e4a52790487f1d6bb8dfc2156883e088f975ad6d/zstandard-0.24.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:55872e818598319f065e8192ebefecd6ac05f62a43f055ed71884b0a26218f41", size = 5062719, upload-time = "2025-08-17T18:23:25.192Z" }, + { url = "https://files.pythonhosted.org/packages/cb/68/15ed0a813ff91be80cc2a610ac42e0fc8d29daa737de247bbf4bab9429a1/zstandard-0.24.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bb2446a55b3a0fd8aa02aa7194bd64740015464a2daaf160d2025204e1d7c282", size = 5393090, upload-time = "2025-08-17T18:23:27.145Z" }, + { url = "https://files.pythonhosted.org/packages/d4/89/e560427b74fa2da6a12b8f3af8ee29104fe2bb069a25e7d314c35eec7732/zstandard-0.24.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2825a3951f945fb2613ded0f517d402b1e5a68e87e0ee65f5bd224a8333a9a46", size = 5450383, upload-time = "2025-08-17T18:23:29.044Z" }, + { url = "https://files.pythonhosted.org/packages/a3/95/0498328cbb1693885509f2fc145402b108b750a87a3af65b7250b10bd896/zstandard-0.24.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09887301001e7a81a3618156bc1759e48588de24bddfdd5b7a4364da9a8fbc20", size = 5546142, upload-time = "2025-08-17T18:23:31.281Z" }, + { url = "https://files.pythonhosted.org/packages/8a/8a/64aa15a726594df3bf5d8decfec14fe20cd788c60890f44fcfc74d98c2cc/zstandard-0.24.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:98ca91dc9602cf351497d5600aa66e6d011a38c085a8237b370433fcb53e3409", size = 4953456, upload-time = "2025-08-17T18:23:33.234Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/e94879c5cd6017af57bcba08519ed1228b1ebb15681efd949f4a00199449/zstandard-0.24.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e69f8e534b4e254f523e2f9d4732cf9c169c327ca1ce0922682aac9a5ee01155", size = 5268287, upload-time = "2025-08-17T18:23:35.145Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e5/1a3b3a93f953dbe9e77e2a19be146e9cd2af31b67b1419d6cc8e8898d409/zstandard-0.24.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:444633b487a711e34f4bccc46a0c5dfbe1aee82c1a511e58cdc16f6bd66f187c", size = 5433197, upload-time = "2025-08-17T18:23:36.969Z" }, + { url = "https://files.pythonhosted.org/packages/39/83/b6eb1e1181de994b29804e1e0d2dc677bece4177f588c71653093cb4f6d5/zstandard-0.24.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f7d3fe9e1483171e9183ffdb1fab07c5fef80a9c3840374a38ec2ab869ebae20", size = 5813161, upload-time = "2025-08-17T18:23:38.812Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d3/2fb4166561591e9d75e8e35c79182aa9456644e2f4536f29e51216d1c513/zstandard-0.24.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:27b6fa72b57824a3f7901fc9cc4ce1c1c834b28f3a43d1d4254c64c8f11149d4", size = 5359831, upload-time = "2025-08-17T18:23:41.162Z" }, + { url = "https://files.pythonhosted.org/packages/11/94/6a9227315b774f64a67445f62152c69b4e5e49a52a3c7c4dad8520a55e20/zstandard-0.24.0-cp314-cp314-win32.whl", hash = "sha256:fdc7a52a4cdaf7293e10813fd6a3abc0c7753660db12a3b864ab1fb5a0c60c16", size = 444448, upload-time = "2025-08-17T18:23:45.151Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/67acaba311013e0798cb96d1a2685cb6edcdfc1cae378b297ea7b02c319f/zstandard-0.24.0-cp314-cp314-win_amd64.whl", hash = "sha256:656ed895b28c7e42dd5b40dfcea3217cfc166b6b7eef88c3da2f5fc62484035b", size = 516075, upload-time = "2025-08-17T18:23:42.8Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/45fd8921263cea0228b20aa31bce47cc66016b2aba1afae1c6adcc3dbb1f/zstandard-0.24.0-cp314-cp314-win_arm64.whl", hash = "sha256:0101f835da7de08375f380192ff75135527e46e3f79bef224e3c49cb640fef6a", size = 476847, upload-time = "2025-08-17T18:23:43.892Z" }, + { url = "https://files.pythonhosted.org/packages/c1/76/1b7e61b25543a129d26cd8e037a6efc6c660a4d77cf8727750923fe4e447/zstandard-0.24.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52788e7c489069e317fde641de41b757fa0ddc150e06488f153dd5daebac7192", size = 795242, upload-time = "2025-08-17T18:23:46.861Z" }, + { url = "https://files.pythonhosted.org/packages/3c/97/8f5ee77c1768c2bd023c11aa0c4598be818f25ed54fff2e1e861d7b22a77/zstandard-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ec194197e90ca063f5ecb935d6c10063d84208cac5423c07d0f1a09d1c2ea42b", size = 640521, upload-time = "2025-08-17T18:23:48.635Z" }, + { url = "https://files.pythonhosted.org/packages/3c/64/cdd1fe60786406081b85c3c7d9128b137a268a7057045970cee5afbc4818/zstandard-0.24.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e91a4e5d62da7cb3f53e04fe254f1aa41009af578801ee6477fe56e7bef74ee2", size = 5343733, upload-time = "2025-08-17T18:23:50.3Z" }, + { url = "https://files.pythonhosted.org/packages/93/98/607374a8c9e7e3113cd3fc9091593c13c6870e4dbae4883ab9411d03d6ed/zstandard-0.24.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fc67eb15ed573950bc6436a04b3faea6c36c7db98d2db030d48391c6736a0dc", size = 5054284, upload-time = "2025-08-17T18:23:52.451Z" }, + { url = "https://files.pythonhosted.org/packages/ec/31/7750afe872defa56fd18566f1552146c164100f259534a309b24655684ce/zstandard-0.24.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f6ae9fc67e636fc0fa9adee39db87dfbdeabfa8420bc0e678a1ac8441e01b22b", size = 5400618, upload-time = "2025-08-17T18:23:54.351Z" }, + { url = "https://files.pythonhosted.org/packages/ac/51/a8018a15958beda694e7670c13e8fae811620fef95983d683c8ccca3b3a0/zstandard-0.24.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ab2357353894a5ec084bb8508ff892aa43fb7fe8a69ad310eac58221ee7f72aa", size = 5448384, upload-time = "2025-08-17T18:23:56.57Z" }, + { url = "https://files.pythonhosted.org/packages/36/e3/cdab1945e39c2a57288806f90f55d293646d1adf49697e14a8b690989f84/zstandard-0.24.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f578fab202f4df67a955145c3e3ca60ccaaaf66c97808545b2625efeecdef10", size = 5554999, upload-time = "2025-08-17T18:23:58.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/4f/f594f6d828d7cf21d49c8d4f479d7299a101223b393e99a9a2bc854bee87/zstandard-0.24.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c39d2b6161f3c5c5d12e9207ecf1006bb661a647a97a6573656b09aaea3f00ef", size = 5043718, upload-time = "2025-08-17T18:24:00.835Z" }, + { url = "https://files.pythonhosted.org/packages/45/76/d04e89dd166fb44974a2ba9762d088842464d270246c717289a84928a8ce/zstandard-0.24.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dc5654586613aebe5405c1ba180e67b3f29e7d98cf3187c79efdcc172f39457", size = 5570940, upload-time = "2025-08-17T18:24:02.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b6/e3cd82e8716441c6e683bb094502a3f2fcad2d195183534d2bf890b6fc2e/zstandard-0.24.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b91380aefa9c7ac831b011368daf378d3277e0bdeb6bad9535e21251e26dd55a", size = 4957957, upload-time = "2025-08-17T18:24:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/03/a5/b5ceac0800eea956240ecbfcbd3ba1f550e866c706dddda003bbde65ab1e/zstandard-0.24.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:010302face38c9a909b8934e3bf6038266d6afc69523f3efa023c5cb5d38271b", size = 5265251, upload-time = "2025-08-17T18:24:06.668Z" }, + { url = "https://files.pythonhosted.org/packages/4d/62/1b6eab74668361fe3503324114ed4138b40f730f53caa47bc39a77ed5091/zstandard-0.24.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:3aa3b4344b206941385a425ea25e6dd63e5cb0f535a4b88d56e3f8902086be9e", size = 5439212, upload-time = "2025-08-17T18:24:08.503Z" }, + { url = "https://files.pythonhosted.org/packages/05/7f/abfc4c7aa073f28881d3e26e3b6461d940f8b5463eac3dc8224268747269/zstandard-0.24.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:63d39b161000aeeaa06a1cb77c9806e939bfe460dfd593e4cbf24e6bc717ae94", size = 5818666, upload-time = "2025-08-17T18:24:10.737Z" }, + { url = "https://files.pythonhosted.org/packages/06/68/84d2f478ee0613ea4258e06173ea6e4bd3de17726bf4b3b88adcd045a636/zstandard-0.24.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed8345b504df1cab280af923ef69ec0d7d52f7b22f78ec7982fde7c33a43c4f", size = 5361954, upload-time = "2025-08-17T18:24:12.698Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d2/9b9bcc15722c70aa140f5b3d55f3fa8ff01efa0fe97dbbc4a0392eb18662/zstandard-0.24.0-cp39-cp39-win32.whl", hash = "sha256:1e133a9dd51ac0bcd5fd547ba7da45a58346dbc63def883f999857b0d0c003c4", size = 435619, upload-time = "2025-08-17T18:24:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/aa/aa/6221f0b97741f660ba986c4fde20b451eb3b8c7ae9d5907cc198096487fe/zstandard-0.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:8ecd3b1f7a601f79e0cd20c26057d770219c0dc2f572ea07390248da2def79a4", size = 505169, upload-time = "2025-08-17T18:24:14.103Z" }, ] diff --git a/libs/langgraph/uv.lock b/libs/langgraph/uv.lock index d49ec5a55..8ba435297 100644 --- a/libs/langgraph/uv.lock +++ b/libs/langgraph/uv.lock @@ -1491,7 +1491,7 @@ inmem = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.1.7" }, - { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.3.0" }, + { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.4.0" }, { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.8" }, { name = "langgraph-sdk", marker = "python_full_version >= '3.11'", specifier = ">=0.1.0" }, { name = "python-dotenv", marker = "extra == 'inmem'", specifier = ">=0.8.0" }, From d73902ae76f106525ef33aa8bfd66b65a93496b3 Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Thu, 21 Aug 2025 11:15:52 -0700 Subject: [PATCH 04/58] feat(sdk-py): Count endpoints (#5986) --- libs/sdk-py/langgraph_sdk/__init__.py | 2 +- libs/sdk-py/langgraph_sdk/client.py | 176 ++++++++++++++++++++++++++ 2 files changed, 177 insertions(+), 1 deletion(-) diff --git a/libs/sdk-py/langgraph_sdk/__init__.py b/libs/sdk-py/langgraph_sdk/__init__.py index 6b03d43fd..1a58d6f1a 100644 --- a/libs/sdk-py/langgraph_sdk/__init__.py +++ b/libs/sdk-py/langgraph_sdk/__init__.py @@ -1,6 +1,6 @@ from langgraph_sdk.auth import Auth from langgraph_sdk.client import get_client, get_sync_client -__version__ = "0.2.2" +__version__ = "0.2.3" __all__ = ["Auth", "get_client", "get_sync_client"] diff --git a/libs/sdk-py/langgraph_sdk/client.py b/libs/sdk-py/langgraph_sdk/client.py index 0c4668c78..cf6d9f510 100644 --- a/libs/sdk-py/langgraph_sdk/client.py +++ b/libs/sdk-py/langgraph_sdk/client.py @@ -991,6 +991,34 @@ class AssistantsClient: params=params, ) + async def count( + self, + *, + metadata: Json = None, + graph_id: str | None = None, + headers: Mapping[str, str] | None = None, + params: QueryParamTypes | None = None, + ) -> int: + """Count assistants matching filters. + + Args: + metadata: Metadata to filter by. Exact match for each key/value. + graph_id: Optional graph id to filter by. + headers: Optional custom headers to include with the request. + params: Optional query parameters to include with the request. + + Returns: + int: Number of assistants matching the criteria. + """ + payload: dict[str, Any] = {} + if metadata: + payload["metadata"] = metadata + if graph_id: + payload["graph_id"] = graph_id + return await self.http.post( + "/assistants/count", json=payload, headers=headers, params=params + ) + async def get_versions( self, assistant_id: str, @@ -1340,6 +1368,38 @@ class ThreadsClient: params=params, ) + async def count( + self, + *, + metadata: Json = None, + values: Json = None, + status: ThreadStatus | None = None, + headers: Mapping[str, str] | None = None, + params: QueryParamTypes | None = None, + ) -> int: + """Count threads matching filters. + + Args: + metadata: Thread metadata to filter on. + values: State values to filter on. + status: Thread status to filter on. + headers: Optional custom headers to include with the request. + params: Optional query parameters to include with the request. + + Returns: + int: Number of threads matching the criteria. + """ + payload: dict[str, Any] = {} + if metadata: + payload["metadata"] = metadata + if values: + payload["values"] = values + if status: + payload["status"] = status + return await self.http.post( + "/threads/count", json=payload, headers=headers, params=params + ) + async def copy( self, thread_id: str, @@ -2855,6 +2915,34 @@ class CronClient: "/runs/crons/search", json=payload, headers=headers, params=params ) + async def count( + self, + *, + assistant_id: str | None = None, + thread_id: str | None = None, + headers: Mapping[str, str] | None = None, + params: QueryParamTypes | None = None, + ) -> int: + """Count cron jobs matching filters. + + Args: + assistant_id: Assistant ID to filter by. + thread_id: Thread ID to filter by. + headers: Optional custom headers to include with the request. + params: Optional query parameters to include with the request. + + Returns: + int: Number of crons matching the criteria. + """ + payload: dict[str, Any] = {} + if assistant_id: + payload["assistant_id"] = assistant_id + if thread_id: + payload["thread_id"] = thread_id + return await self.http.post( + "/runs/crons/count", json=payload, headers=headers, params=params + ) + class StoreClient: """Client for interacting with the graph's shared storage. @@ -3974,6 +4062,34 @@ class SyncAssistantsClient: params=params, ) + def count( + self, + *, + metadata: Json = None, + graph_id: str | None = None, + headers: Mapping[str, str] | None = None, + params: QueryParamTypes | None = None, + ) -> int: + """Count assistants matching filters. + + Args: + metadata: Metadata to filter by. Exact match for each key/value. + graph_id: Optional graph id to filter by. + headers: Optional custom headers to include with the request. + params: Optional query parameters to include with the request. + + Returns: + int: Number of assistants matching the criteria. + """ + payload: dict[str, Any] = {} + if metadata: + payload["metadata"] = metadata + if graph_id: + payload["graph_id"] = graph_id + return self.http.post( + "/assistants/count", json=payload, headers=headers, params=params + ) + def get_versions( self, assistant_id: str, @@ -4306,6 +4422,38 @@ class SyncThreadsClient: "/threads/search", json=payload, headers=headers, params=params ) + def count( + self, + *, + metadata: Json = None, + values: Json = None, + status: ThreadStatus | None = None, + headers: Mapping[str, str] | None = None, + params: QueryParamTypes | None = None, + ) -> int: + """Count threads matching filters. + + Args: + metadata: Thread metadata to filter on. + values: State values to filter on. + status: Thread status to filter on. + headers: Optional custom headers to include with the request. + params: Optional query parameters to include with the request. + + Returns: + int: Number of threads matching the criteria. + """ + payload: dict[str, Any] = {} + if metadata: + payload["metadata"] = metadata + if values: + payload["values"] = values + if status: + payload["status"] = status + return self.http.post( + "/threads/count", json=payload, headers=headers, params=params + ) + def copy( self, thread_id: str, @@ -5781,6 +5929,34 @@ class SyncCronClient: "/runs/crons/search", json=payload, headers=headers, params=params ) + def count( + self, + *, + assistant_id: str | None = None, + thread_id: str | None = None, + headers: Mapping[str, str] | None = None, + params: QueryParamTypes | None = None, + ) -> int: + """Count cron jobs matching filters. + + Args: + assistant_id: Assistant ID to filter by. + thread_id: Thread ID to filter by. + headers: Optional custom headers to include with the request. + params: Optional query parameters to include with the request. + + Returns: + int: Number of crons matching the criteria. + """ + payload: dict[str, Any] = {} + if assistant_id: + payload["assistant_id"] = assistant_id + if thread_id: + payload["thread_id"] = thread_id + return self.http.post( + "/runs/crons/count", json=payload, headers=headers, params=params + ) + class SyncStoreClient: """A client for synchronous operations on a key-value store. From ddf4e62bde806111a05de247cf028ec08883eac0 Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Tue, 26 Aug 2025 05:59:12 -0700 Subject: [PATCH 05/58] release(cli): 0.4.0 (#6014) Relax upper-bound to permit server versions 0.4.* --- libs/cli/langgraph_cli/__init__.py | 2 +- libs/cli/pyproject.toml | 4 +- libs/cli/uv.lock | 80 +++--- libs/langgraph/uv.lock | 436 ++++++++++++++--------------- 4 files changed, 261 insertions(+), 261 deletions(-) diff --git a/libs/cli/langgraph_cli/__init__.py b/libs/cli/langgraph_cli/__init__.py index 4ad67eb7a..6a9beea82 100644 --- a/libs/cli/langgraph_cli/__init__.py +++ b/libs/cli/langgraph_cli/__init__.py @@ -1 +1 @@ -__version__ = "0.3.8" +__version__ = "0.4.0" diff --git a/libs/cli/pyproject.toml b/libs/cli/pyproject.toml index 3a48f5434..ed8e68107 100644 --- a/libs/cli/pyproject.toml +++ b/libs/cli/pyproject.toml @@ -19,8 +19,8 @@ dependencies = [ path = "langgraph_cli/__init__.py" [project.optional-dependencies] inmem = [ - "langgraph-api>=0.2.120,<0.4.0 ; python_version >= '3.11'", - "langgraph-runtime-inmem>=0.6.8 ; python_version >= '3.11'", + "langgraph-api>=0.3,<0.5.0 ; python_version >= '3.11'", + "langgraph-runtime-inmem>=0.7 ; python_version >= '3.11'", "python-dotenv>=0.8.0", ] diff --git a/libs/cli/uv.lock b/libs/cli/uv.lock index 003499fcd..cc98e61a4 100644 --- a/libs/cli/uv.lock +++ b/libs/cli/uv.lock @@ -489,7 +489,7 @@ wheels = [ [[package]] name = "langgraph-api" -version = "0.3.0" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cloudpickle", marker = "python_full_version >= '3.11'" }, @@ -512,9 +512,9 @@ dependencies = [ { name = "uvicorn", marker = "python_full_version >= '3.11'" }, { name = "watchfiles", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/7c/37bd3f791dc00698b405288dc764e078ed143c7ecd65e2e72cc0e386d3f1/langgraph_api-0.3.0.tar.gz", hash = "sha256:b908c34ebb9c42c2f4fb17f3f3a71e39ee0dfb283b7028d73d4bc1f4681914e7", size = 255812, upload-time = "2025-08-21T00:49:28.347Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/c5/1bcaf07f3f973a4a540bd341f20dfc60f0fc3cac8e7c2dc606680cb1d11e/langgraph_api-0.4.1.tar.gz", hash = "sha256:6f12b8be914ad9a9f11e3b73278fc90aeb7b4988b0418afbdf686c6fd5577c74", size = 1579764, upload-time = "2025-08-26T12:23:48.172Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/34/cdbb0b5abf603fd01c91a63c9436fbe733f56cae448f42c7a1c7e3f4508e/langgraph_api-0.3.0-py3-none-any.whl", hash = "sha256:b76a7ced3bb559560b42a8d8f3cc7cff638c2022d0881d476caa1d511fb36a2e", size = 206012, upload-time = "2025-08-21T00:49:26.917Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/b36e6035b52e06a9c0bd04030255a03b2444c9d2cad347b96193674cf4f5/langgraph_api-0.4.1-py3-none-any.whl", hash = "sha256:1f5f8d33bca30200e954e81416f4de26bce173a7f2e623b1e509d1b8a44b49a3", size = 1536988, upload-time = "2025-08-26T12:23:45.834Z" }, ] [[package]] @@ -561,8 +561,8 @@ dev = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.1.7" }, - { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.4.0" }, - { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.8" }, + { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.3,<0.5.0" }, + { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.7" }, { name = "langgraph-sdk", marker = "python_full_version >= '3.11'", specifier = ">=0.1.0" }, { name = "python-dotenv", marker = "extra == 'inmem'", specifier = ">=0.8.0" }, ] @@ -595,7 +595,7 @@ wheels = [ [[package]] name = "langgraph-runtime-inmem" -version = "0.8.0" +version = "0.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "blockbuster", marker = "python_full_version >= '3.11'" }, @@ -605,27 +605,27 @@ dependencies = [ { name = "starlette", marker = "python_full_version >= '3.11'" }, { name = "structlog", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/94/02b58b1c137cfca6507f6c495e5794fd542b1f5269ef89fb662799be4b8c/langgraph_runtime_inmem-0.8.0.tar.gz", hash = "sha256:3082273f65650665b4a3875241721087fd51e675eb0227b18dc271839ce99594", size = 79510, upload-time = "2025-08-18T09:00:09.162Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/88/e5a0a776b2db76c114e3dc67eaa79135f008cc23c1af0802069acd9272d6/langgraph_runtime_inmem-0.9.0.tar.gz", hash = "sha256:7c5adfc98a5cce77c9d8413f606ce6edce315d15e4617a1191e066a0afe38802", size = 81401, upload-time = "2025-08-26T01:02:10.709Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/0e/b09c1aff0bcfdb1357be212b4a5d55f5b98644eae7fab6b115aa463e99fa/langgraph_runtime_inmem-0.8.0-py3-none-any.whl", hash = "sha256:85398321fc186618b0957c4d8629cc059fce2e7f57a4756ef83a75575791da1b", size = 31626, upload-time = "2025-08-18T09:00:08.256Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e5/8da2e1cc9a97750a346b21b81fc52d2d4127c226775a3071436d6c67e97b/langgraph_runtime_inmem-0.9.0-py3-none-any.whl", hash = "sha256:541e3666d37038f15fa6c2fe34667ae649fd79913de50720241f4017f8b7b946", size = 33479, upload-time = "2025-08-26T01:02:09.522Z" }, ] [[package]] name = "langgraph-sdk" -version = "0.2.2" +version = "0.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "python_full_version >= '3.11'" }, { name = "orjson", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/3a/ea929b5b3827615802f020abdaa6d4a6f9d59ab764f65559fa6f87a6dda6/langgraph_sdk-0.2.2.tar.gz", hash = "sha256:9484e8071953df75d7aaf9845d82db3595e485af7d5dcc235c9b32c52362e1fc", size = 77981, upload-time = "2025-08-18T19:25:42.596Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/50/1f5e4d129e3969973674db01bf5dcb85e2233e5e4fdffa53eefff1399902/langgraph_sdk-0.2.3.tar.gz", hash = "sha256:17398aeae0f937cae1c8eb9027ada2969abdb50fe8ed3246c78f543b679cf959", size = 78468, upload-time = "2025-08-21T23:01:06.674Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/0d/dfa633c6b85e973e7d4383e9b92603b7e910e89768411daeb7777bfbae04/langgraph_sdk-0.2.2-py3-none-any.whl", hash = "sha256:1afbec01ade166f8b6ce18782875415422eb70dcb82852aeaa373e6152db4b82", size = 52017, upload-time = "2025-08-18T19:25:40.567Z" }, + { url = "https://files.pythonhosted.org/packages/06/51/e6e3eb6b3cbad394d00cad128155781bc01e672ff01c5fc1c8a627b35a92/langgraph_sdk-0.2.3-py3-none-any.whl", hash = "sha256:059edfe2f62708c2e54239e170f5a33f796d456dbdbde64276c16cac8b97ba99", size = 52603, upload-time = "2025-08-21T23:01:05.379Z" }, ] [[package]] name = "langsmith" -version = "0.4.15" +version = "0.4.17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "python_full_version >= '3.11'" }, @@ -636,9 +636,9 @@ dependencies = [ { name = "requests-toolbelt", marker = "python_full_version >= '3.11'" }, { name = "zstandard", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/7a/a17f61670bec8fea8194fb0fef79812d02fc7d2b9660eb2c9d2d514f265f/langsmith-0.4.15.tar.gz", hash = "sha256:c9a4ec4b7b0f5f70e7be204ee9c5b17db872cc3015cd04851e2703a0966b9ff1", size = 930330, upload-time = "2025-08-20T17:48:32.552Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/6e/6a76eed14cbf43db79030f8e348de2fdad904334967df34d1c162641679c/langsmith-0.4.17.tar.gz", hash = "sha256:c91e218cd96ee9a310f4685ea7f2b958a54aec919f0f368e694f42431e32c422", size = 931257, upload-time = "2025-08-26T01:42:47.394Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/05/fcd7ee91990399fb7e1042da4b196bc99174f5282c6cb266607770abe935/langsmith-0.4.15-py3-none-any.whl", hash = "sha256:633719f9fdafe4297459b0ab442f536d6c0734b36c186ded67343d335e5ea0b3", size = 375733, upload-time = "2025-08-20T17:48:30.254Z" }, + { url = "https://files.pythonhosted.org/packages/d3/4c/6f9106237cbeb193e3138393f7134310a38e0db9e6acfc1f43567dfa0559/langsmith-0.4.17-py3-none-any.whl", hash = "sha256:b824ef6a3a0669faf2bc61799e22af0b05a3a53d12cb9a448f611f861a69e991", size = 376351, upload-time = "2025-08-26T01:42:45.101Z" }, ] [[package]] @@ -1207,28 +1207,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.12.9" +version = "0.12.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/45/2e403fa7007816b5fbb324cb4f8ed3c7402a927a0a0cb2b6279879a8bfdc/ruff-0.12.9.tar.gz", hash = "sha256:fbd94b2e3c623f659962934e52c2bea6fc6da11f667a427a368adaf3af2c866a", size = 5254702, upload-time = "2025-08-14T16:08:55.2Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/eb/8c073deb376e46ae767f4961390d17545e8535921d2f65101720ed8bd434/ruff-0.12.10.tar.gz", hash = "sha256:189ab65149d11ea69a2d775343adf5f49bb2426fc4780f65ee33b423ad2e47f9", size = 5310076, upload-time = "2025-08-21T18:23:22.595Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/20/53bf098537adb7b6a97d98fcdebf6e916fcd11b2e21d15f8c171507909cc/ruff-0.12.9-py3-none-linux_armv6l.whl", hash = "sha256:fcebc6c79fcae3f220d05585229463621f5dbf24d79fdc4936d9302e177cfa3e", size = 11759705, upload-time = "2025-08-14T16:08:12.968Z" }, - { url = "https://files.pythonhosted.org/packages/20/4d/c764ee423002aac1ec66b9d541285dd29d2c0640a8086c87de59ebbe80d5/ruff-0.12.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aed9d15f8c5755c0e74467731a007fcad41f19bcce41cd75f768bbd687f8535f", size = 12527042, upload-time = "2025-08-14T16:08:16.54Z" }, - { url = "https://files.pythonhosted.org/packages/8b/45/cfcdf6d3eb5fc78a5b419e7e616d6ccba0013dc5b180522920af2897e1be/ruff-0.12.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5b15ea354c6ff0d7423814ba6d44be2807644d0c05e9ed60caca87e963e93f70", size = 11724457, upload-time = "2025-08-14T16:08:18.686Z" }, - { url = "https://files.pythonhosted.org/packages/72/e6/44615c754b55662200c48bebb02196dbb14111b6e266ab071b7e7297b4ec/ruff-0.12.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d596c2d0393c2502eaabfef723bd74ca35348a8dac4267d18a94910087807c53", size = 11949446, upload-time = "2025-08-14T16:08:21.059Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d1/9b7d46625d617c7df520d40d5ac6cdcdf20cbccb88fad4b5ecd476a6bb8d/ruff-0.12.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b15599931a1a7a03c388b9c5df1bfa62be7ede6eb7ef753b272381f39c3d0ff", size = 11566350, upload-time = "2025-08-14T16:08:23.433Z" }, - { url = "https://files.pythonhosted.org/packages/59/20/b73132f66f2856bc29d2d263c6ca457f8476b0bbbe064dac3ac3337a270f/ruff-0.12.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d02faa2977fb6f3f32ddb7828e212b7dd499c59eb896ae6c03ea5c303575756", size = 13270430, upload-time = "2025-08-14T16:08:25.837Z" }, - { url = "https://files.pythonhosted.org/packages/a2/21/eaf3806f0a3d4c6be0a69d435646fba775b65f3f2097d54898b0fd4bb12e/ruff-0.12.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:17d5b6b0b3a25259b69ebcba87908496e6830e03acfb929ef9fd4c58675fa2ea", size = 14264717, upload-time = "2025-08-14T16:08:27.907Z" }, - { url = "https://files.pythonhosted.org/packages/d2/82/1d0c53bd37dcb582b2c521d352fbf4876b1e28bc0d8894344198f6c9950d/ruff-0.12.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72db7521860e246adbb43f6ef464dd2a532ef2ef1f5dd0d470455b8d9f1773e0", size = 13684331, upload-time = "2025-08-14T16:08:30.352Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2f/1c5cf6d8f656306d42a686f1e207f71d7cebdcbe7b2aa18e4e8a0cb74da3/ruff-0.12.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a03242c1522b4e0885af63320ad754d53983c9599157ee33e77d748363c561ce", size = 12739151, upload-time = "2025-08-14T16:08:32.55Z" }, - { url = "https://files.pythonhosted.org/packages/47/09/25033198bff89b24d734e6479e39b1968e4c992e82262d61cdccaf11afb9/ruff-0.12.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc83e4e9751e6c13b5046d7162f205d0a7bac5840183c5beebf824b08a27340", size = 12954992, upload-time = "2025-08-14T16:08:34.816Z" }, - { url = "https://files.pythonhosted.org/packages/52/8e/d0dbf2f9dca66c2d7131feefc386523404014968cd6d22f057763935ab32/ruff-0.12.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:881465ed56ba4dd26a691954650de6ad389a2d1fdb130fe51ff18a25639fe4bb", size = 12899569, upload-time = "2025-08-14T16:08:36.852Z" }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b614d7c08515b1428ed4d3f1d4e3d687deffb2479703b90237682586fa66/ruff-0.12.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:43f07a3ccfc62cdb4d3a3348bf0588358a66da756aa113e071b8ca8c3b9826af", size = 11751983, upload-time = "2025-08-14T16:08:39.314Z" }, - { url = "https://files.pythonhosted.org/packages/58/d6/383e9f818a2441b1a0ed898d7875f11273f10882f997388b2b51cb2ae8b5/ruff-0.12.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:07adb221c54b6bba24387911e5734357f042e5669fa5718920ee728aba3cbadc", size = 11538635, upload-time = "2025-08-14T16:08:41.297Z" }, - { url = "https://files.pythonhosted.org/packages/20/9c/56f869d314edaa9fc1f491706d1d8a47747b9d714130368fbd69ce9024e9/ruff-0.12.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f5cd34fabfdea3933ab85d72359f118035882a01bff15bd1d2b15261d85d5f66", size = 12534346, upload-time = "2025-08-14T16:08:43.39Z" }, - { url = "https://files.pythonhosted.org/packages/bd/4b/d8b95c6795a6c93b439bc913ee7a94fda42bb30a79285d47b80074003ee7/ruff-0.12.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f6be1d2ca0686c54564da8e7ee9e25f93bdd6868263805f8c0b8fc6a449db6d7", size = 13017021, upload-time = "2025-08-14T16:08:45.889Z" }, - { url = "https://files.pythonhosted.org/packages/c7/c1/5f9a839a697ce1acd7af44836f7c2181cdae5accd17a5cb85fcbd694075e/ruff-0.12.9-py3-none-win32.whl", hash = "sha256:cc7a37bd2509974379d0115cc5608a1a4a6c4bff1b452ea69db83c8855d53f93", size = 11734785, upload-time = "2025-08-14T16:08:48.062Z" }, - { url = "https://files.pythonhosted.org/packages/fa/66/cdddc2d1d9a9f677520b7cfc490d234336f523d4b429c1298de359a3be08/ruff-0.12.9-py3-none-win_amd64.whl", hash = "sha256:6fb15b1977309741d7d098c8a3cb7a30bc112760a00fb6efb7abc85f00ba5908", size = 12840654, upload-time = "2025-08-14T16:08:50.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/fd/669816bc6b5b93b9586f3c1d87cd6bc05028470b3ecfebb5938252c47a35/ruff-0.12.9-py3-none-win_arm64.whl", hash = "sha256:63c8c819739d86b96d500cce885956a1a48ab056bbcbc61b747ad494b2485089", size = 11949623, upload-time = "2025-08-14T16:08:52.233Z" }, + { url = "https://files.pythonhosted.org/packages/24/e7/560d049d15585d6c201f9eeacd2fd130def3741323e5ccf123786e0e3c95/ruff-0.12.10-py3-none-linux_armv6l.whl", hash = "sha256:8b593cb0fb55cc8692dac7b06deb29afda78c721c7ccfed22db941201b7b8f7b", size = 11935161, upload-time = "2025-08-21T18:22:26.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b0/ad2464922a1113c365d12b8f80ed70fcfb39764288ac77c995156080488d/ruff-0.12.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ebb7333a45d56efc7c110a46a69a1b32365d5c5161e7244aaf3aa20ce62399c1", size = 12660884, upload-time = "2025-08-21T18:22:30.925Z" }, + { url = "https://files.pythonhosted.org/packages/d7/f1/97f509b4108d7bae16c48389f54f005b62ce86712120fd8b2d8e88a7cb49/ruff-0.12.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d59e58586829f8e4a9920788f6efba97a13d1fa320b047814e8afede381c6839", size = 11872754, upload-time = "2025-08-21T18:22:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/12/ad/44f606d243f744a75adc432275217296095101f83f966842063d78eee2d3/ruff-0.12.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:822d9677b560f1fdeab69b89d1f444bf5459da4aa04e06e766cf0121771ab844", size = 12092276, upload-time = "2025-08-21T18:22:36.764Z" }, + { url = "https://files.pythonhosted.org/packages/06/1f/ed6c265e199568010197909b25c896d66e4ef2c5e1c3808caf461f6f3579/ruff-0.12.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b4a64f4062a50c75019c61c7017ff598cb444984b638511f48539d3a1c98db", size = 11734700, upload-time = "2025-08-21T18:22:39.822Z" }, + { url = "https://files.pythonhosted.org/packages/63/c5/b21cde720f54a1d1db71538c0bc9b73dee4b563a7dd7d2e404914904d7f5/ruff-0.12.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c6f4064c69d2542029b2a61d39920c85240c39837599d7f2e32e80d36401d6e", size = 13468783, upload-time = "2025-08-21T18:22:42.559Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/39369e6ac7f2a1848f22fb0b00b690492f20811a1ac5c1fd1d2798329263/ruff-0.12.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:059e863ea3a9ade41407ad71c1de2badfbe01539117f38f763ba42a1206f7559", size = 14436642, upload-time = "2025-08-21T18:22:45.612Z" }, + { url = "https://files.pythonhosted.org/packages/e3/03/5da8cad4b0d5242a936eb203b58318016db44f5c5d351b07e3f5e211bb89/ruff-0.12.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bef6161e297c68908b7218fa6e0e93e99a286e5ed9653d4be71e687dff101cf", size = 13859107, upload-time = "2025-08-21T18:22:48.886Z" }, + { url = "https://files.pythonhosted.org/packages/19/19/dd7273b69bf7f93a070c9cec9494a94048325ad18fdcf50114f07e6bf417/ruff-0.12.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f1345fbf8fb0531cd722285b5f15af49b2932742fc96b633e883da8d841896b", size = 12886521, upload-time = "2025-08-21T18:22:51.567Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1d/b4207ec35e7babaee62c462769e77457e26eb853fbdc877af29417033333/ruff-0.12.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f68433c4fbc63efbfa3ba5db31727db229fa4e61000f452c540474b03de52a9", size = 13097528, upload-time = "2025-08-21T18:22:54.609Z" }, + { url = "https://files.pythonhosted.org/packages/ff/00/58f7b873b21114456e880b75176af3490d7a2836033779ca42f50de3b47a/ruff-0.12.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:141ce3d88803c625257b8a6debf4a0473eb6eed9643a6189b68838b43e78165a", size = 13080443, upload-time = "2025-08-21T18:22:57.413Z" }, + { url = "https://files.pythonhosted.org/packages/12/8c/9e6660007fb10189ccb78a02b41691288038e51e4788bf49b0a60f740604/ruff-0.12.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f3fc21178cd44c98142ae7590f42ddcb587b8e09a3b849cbc84edb62ee95de60", size = 11896759, upload-time = "2025-08-21T18:23:00.473Z" }, + { url = "https://files.pythonhosted.org/packages/67/4c/6d092bb99ea9ea6ebda817a0e7ad886f42a58b4501a7e27cd97371d0ba54/ruff-0.12.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7d1a4e0bdfafcd2e3e235ecf50bf0176f74dd37902f241588ae1f6c827a36c56", size = 11701463, upload-time = "2025-08-21T18:23:03.211Z" }, + { url = "https://files.pythonhosted.org/packages/59/80/d982c55e91df981f3ab62559371380616c57ffd0172d96850280c2b04fa8/ruff-0.12.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e67d96827854f50b9e3e8327b031647e7bcc090dbe7bb11101a81a3a2cbf1cc9", size = 12691603, upload-time = "2025-08-21T18:23:06.935Z" }, + { url = "https://files.pythonhosted.org/packages/ad/37/63a9c788bbe0b0850611669ec6b8589838faf2f4f959647f2d3e320383ae/ruff-0.12.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ae479e1a18b439c59138f066ae79cc0f3ee250712a873d00dbafadaad9481e5b", size = 13164356, upload-time = "2025-08-21T18:23:10.225Z" }, + { url = "https://files.pythonhosted.org/packages/47/d4/1aaa7fb201a74181989970ebccd12f88c0fc074777027e2a21de5a90657e/ruff-0.12.10-py3-none-win32.whl", hash = "sha256:9de785e95dc2f09846c5e6e1d3a3d32ecd0b283a979898ad427a9be7be22b266", size = 11896089, upload-time = "2025-08-21T18:23:14.232Z" }, + { url = "https://files.pythonhosted.org/packages/ad/14/2ad38fd4037daab9e023456a4a40ed0154e9971f8d6aed41bdea390aabd9/ruff-0.12.10-py3-none-win_amd64.whl", hash = "sha256:7837eca8787f076f67aba2ca559cefd9c5cbc3a9852fd66186f4201b87c1563e", size = 13004616, upload-time = "2025-08-21T18:23:17.422Z" }, + { url = "https://files.pythonhosted.org/packages/24/3c/21cf283d67af33a8e6ed242396863af195a8a6134ec581524fd22b9811b6/ruff-0.12.10-py3-none-win_arm64.whl", hash = "sha256:cc138cc06ed9d4bfa9d667a65af7172b47840e1a98b02ce7011c391e54635ffc", size = 12074225, upload-time = "2025-08-21T18:23:20.137Z" }, ] [[package]] @@ -1256,15 +1256,15 @@ wheels = [ [[package]] name = "starlette" -version = "0.47.2" +version = "0.47.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/57/d062573f391d062710d4088fa1369428c38d51460ab6fedff920efef932e/starlette-0.47.2.tar.gz", hash = "sha256:6ae9aa5db235e4846decc1e7b79c4f346adf41e9777aebeb49dfd09bbd7023d8", size = 2583948, upload-time = "2025-07-20T17:31:58.522Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/b9/cc3017f9a9c9b6e27c5106cc10cc7904653c3eec0729793aec10479dd669/starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9", size = 2584144, upload-time = "2025-08-24T13:36:42.122Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" }, + { url = "https://files.pythonhosted.org/packages/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991, upload-time = "2025-08-24T13:36:40.887Z" }, ] [[package]] @@ -1335,11 +1335,11 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.14.1" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] diff --git a/libs/langgraph/uv.lock b/libs/langgraph/uv.lock index 8ba435297..1688827dc 100644 --- a/libs/langgraph/uv.lock +++ b/libs/langgraph/uv.lock @@ -194,15 +194,15 @@ wheels = [ [[package]] name = "beautifulsoup4" -version = "4.13.4" +version = "4.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/2e/3e5079847e653b1f6dc647aa24549d68c6addb4c595cc0d902d1b19308ad/beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695", size = 622954, upload-time = "2025-08-24T14:06:13.168Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, + { url = "https://files.pythonhosted.org/packages/04/eb/f4151e0c7377a6e08a38108609ba5cede57986802757848688aeedd1b9e8/beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a", size = 105113, upload-time = "2025-08-24T14:06:14.884Z" }, ] [[package]] @@ -448,97 +448,97 @@ wheels = [ [[package]] name = "coverage" -version = "7.10.4" +version = "7.10.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/4e/08b493f1f1d8a5182df0044acc970799b58a8d289608e0d891a03e9d269a/coverage-7.10.4.tar.gz", hash = "sha256:25f5130af6c8e7297fd14634955ba9e1697f47143f289e2a23284177c0061d27", size = 823798, upload-time = "2025-08-17T00:26:43.314Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/83/153f54356c7c200013a752ce1ed5448573dca546ce125801afca9e1ac1a4/coverage-7.10.5.tar.gz", hash = "sha256:f2e57716a78bc3ae80b2207be0709a3b2b63b9f2dcf9740ee6ac03588a2015b6", size = 821662, upload-time = "2025-08-23T14:42:44.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/f4/350759710db50362685f922259c140592dba15eb4e2325656a98413864d9/coverage-7.10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d92d6edb0ccafd20c6fbf9891ca720b39c2a6a4b4a6f9cf323ca2c986f33e475", size = 216403, upload-time = "2025-08-17T00:24:19.083Z" }, - { url = "https://files.pythonhosted.org/packages/29/7e/e467c2bb4d5ecfd166bfd22c405cce4c50de2763ba1d78e2729c59539a42/coverage-7.10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7202da14dc0236884fcc45665ffb2d79d4991a53fbdf152ab22f69f70923cc22", size = 216802, upload-time = "2025-08-17T00:24:21.824Z" }, - { url = "https://files.pythonhosted.org/packages/62/ab/2accdd1ccfe63b890e5eb39118f63c155202df287798364868a2884a50af/coverage-7.10.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ada418633ae24ec8d0fcad5efe6fc7aa3c62497c6ed86589e57844ad04365674", size = 243558, upload-time = "2025-08-17T00:24:23.569Z" }, - { url = "https://files.pythonhosted.org/packages/43/04/c14c33d0cfc0f4db6b3504d01a47f4c798563d932a836fd5f2dbc0521d3d/coverage-7.10.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b828e33eca6c3322adda3b5884456f98c435182a44917ded05005adfa1415500", size = 245370, upload-time = "2025-08-17T00:24:24.858Z" }, - { url = "https://files.pythonhosted.org/packages/99/71/147053061f1f51c1d3b3d040c3cb26876964a3a0dca0765d2441411ca568/coverage-7.10.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:802793ba397afcfdbe9f91f89d65ae88b958d95edc8caf948e1f47d8b6b2b606", size = 247228, upload-time = "2025-08-17T00:24:26.167Z" }, - { url = "https://files.pythonhosted.org/packages/cc/92/7ef882205d4d4eb502e6154ee7122c1a1b1ce3f29d0166921e0fb550a5d3/coverage-7.10.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d0b23512338c54101d3bf7a1ab107d9d75abda1d5f69bc0887fd079253e4c27e", size = 245270, upload-time = "2025-08-17T00:24:27.424Z" }, - { url = "https://files.pythonhosted.org/packages/ab/3d/297a20603abcc6c7d89d801286eb477b0b861f3c5a4222730f1c9837be3e/coverage-7.10.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f36b7dcf72d06a8c5e2dd3aca02be2b1b5db5f86404627dff834396efce958f2", size = 243287, upload-time = "2025-08-17T00:24:28.697Z" }, - { url = "https://files.pythonhosted.org/packages/65/f9/b04111438f41f1ddd5dc88706d5f8064ae5bb962203c49fe417fa23a362d/coverage-7.10.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fce316c367a1dc2c411821365592eeb335ff1781956d87a0410eae248188ba51", size = 244164, upload-time = "2025-08-17T00:24:30.393Z" }, - { url = "https://files.pythonhosted.org/packages/1e/e5/c7d9eb7a9ea66cf92d069077719fb2b07782dcd7050b01a9b88766b52154/coverage-7.10.4-cp310-cp310-win32.whl", hash = "sha256:8c5dab29fc8070b3766b5fc85f8d89b19634584429a2da6d42da5edfadaf32ae", size = 218917, upload-time = "2025-08-17T00:24:31.67Z" }, - { url = "https://files.pythonhosted.org/packages/66/30/4d9d3b81f5a836b31a7428b8a25e6d490d4dca5ff2952492af130153c35c/coverage-7.10.4-cp310-cp310-win_amd64.whl", hash = "sha256:4b0d114616f0fccb529a1817457d5fb52a10e106f86c5fb3b0bd0d45d0d69b93", size = 219822, upload-time = "2025-08-17T00:24:32.89Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ba/2c9817e62018e7d480d14f684c160b3038df9ff69c5af7d80e97d143e4d1/coverage-7.10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:05d5f98ec893d4a2abc8bc5f046f2f4367404e7e5d5d18b83de8fde1093ebc4f", size = 216514, upload-time = "2025-08-17T00:24:34.188Z" }, - { url = "https://files.pythonhosted.org/packages/e3/5a/093412a959a6b6261446221ba9fb23bb63f661a5de70b5d130763c87f916/coverage-7.10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9267efd28f8994b750d171e58e481e3bbd69e44baed540e4c789f8e368b24b88", size = 216914, upload-time = "2025-08-17T00:24:35.881Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1f/2fdf4a71cfe93b07eae845ebf763267539a7d8b7e16b062f959d56d7e433/coverage-7.10.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4456a039fdc1a89ea60823d0330f1ac6f97b0dbe9e2b6fb4873e889584b085fb", size = 247308, upload-time = "2025-08-17T00:24:37.61Z" }, - { url = "https://files.pythonhosted.org/packages/ba/16/33f6cded458e84f008b9f6bc379609a6a1eda7bffe349153b9960803fc11/coverage-7.10.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c2bfbd2a9f7e68a21c5bd191be94bfdb2691ac40d325bac9ef3ae45ff5c753d9", size = 249241, upload-time = "2025-08-17T00:24:38.919Z" }, - { url = "https://files.pythonhosted.org/packages/84/98/9c18e47c889be58339ff2157c63b91a219272503ee32b49d926eea2337f2/coverage-7.10.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab7765f10ae1df7e7fe37de9e64b5a269b812ee22e2da3f84f97b1c7732a0d8", size = 251346, upload-time = "2025-08-17T00:24:40.507Z" }, - { url = "https://files.pythonhosted.org/packages/6d/07/00a6c0d53e9a22d36d8e95ddd049b860eef8f4b9fd299f7ce34d8e323356/coverage-7.10.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a09b13695166236e171ec1627ff8434b9a9bae47528d0ba9d944c912d33b3d2", size = 249037, upload-time = "2025-08-17T00:24:41.904Z" }, - { url = "https://files.pythonhosted.org/packages/3e/0e/1e1b944d6a6483d07bab5ef6ce063fcf3d0cc555a16a8c05ebaab11f5607/coverage-7.10.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5c9e75dfdc0167d5675e9804f04a56b2cf47fb83a524654297000b578b8adcb7", size = 247090, upload-time = "2025-08-17T00:24:43.193Z" }, - { url = "https://files.pythonhosted.org/packages/62/43/2ce5ab8a728b8e25ced077111581290ffaef9efaf860a28e25435ab925cf/coverage-7.10.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c751261bfe6481caba15ec005a194cb60aad06f29235a74c24f18546d8377df0", size = 247732, upload-time = "2025-08-17T00:24:44.906Z" }, - { url = "https://files.pythonhosted.org/packages/a4/f3/706c4a24f42c1c5f3a2ca56637ab1270f84d9e75355160dc34d5e39bb5b7/coverage-7.10.4-cp311-cp311-win32.whl", hash = "sha256:051c7c9e765f003c2ff6e8c81ccea28a70fb5b0142671e4e3ede7cebd45c80af", size = 218961, upload-time = "2025-08-17T00:24:46.241Z" }, - { url = "https://files.pythonhosted.org/packages/e8/aa/6b9ea06e0290bf1cf2a2765bba89d561c5c563b4e9db8298bf83699c8b67/coverage-7.10.4-cp311-cp311-win_amd64.whl", hash = "sha256:1a647b152f10be08fb771ae4a1421dbff66141e3d8ab27d543b5eb9ea5af8e52", size = 219851, upload-time = "2025-08-17T00:24:48.795Z" }, - { url = "https://files.pythonhosted.org/packages/8b/be/f0dc9ad50ee183369e643cd7ed8f2ef5c491bc20b4c3387cbed97dd6e0d1/coverage-7.10.4-cp311-cp311-win_arm64.whl", hash = "sha256:b09b9e4e1de0d406ca9f19a371c2beefe3193b542f64a6dd40cfcf435b7d6aa0", size = 218530, upload-time = "2025-08-17T00:24:50.164Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4a/781c9e4dd57cabda2a28e2ce5b00b6be416015265851060945a5ed4bd85e/coverage-7.10.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a1f0264abcabd4853d4cb9b3d164adbf1565da7dab1da1669e93f3ea60162d79", size = 216706, upload-time = "2025-08-17T00:24:51.528Z" }, - { url = "https://files.pythonhosted.org/packages/6a/8c/51255202ca03d2e7b664770289f80db6f47b05138e06cce112b3957d5dfd/coverage-7.10.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:536cbe6b118a4df231b11af3e0f974a72a095182ff8ec5f4868c931e8043ef3e", size = 216939, upload-time = "2025-08-17T00:24:53.171Z" }, - { url = "https://files.pythonhosted.org/packages/06/7f/df11131483698660f94d3c847dc76461369782d7a7644fcd72ac90da8fd0/coverage-7.10.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9a4c0d84134797b7bf3f080599d0cd501471f6c98b715405166860d79cfaa97e", size = 248429, upload-time = "2025-08-17T00:24:54.934Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fa/13ac5eda7300e160bf98f082e75f5c5b4189bf3a883dd1ee42dbedfdc617/coverage-7.10.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7c155fc0f9cee8c9803ea0ad153ab6a3b956baa5d4cd993405dc0b45b2a0b9e0", size = 251178, upload-time = "2025-08-17T00:24:56.353Z" }, - { url = "https://files.pythonhosted.org/packages/9a/bc/f63b56a58ad0bec68a840e7be6b7ed9d6f6288d790760647bb88f5fea41e/coverage-7.10.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a5f2ab6e451d4b07855d8bcf063adf11e199bff421a4ba57f5bb95b7444ca62", size = 252313, upload-time = "2025-08-17T00:24:57.692Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b6/79338f1ea27b01266f845afb4485976211264ab92407d1c307babe3592a7/coverage-7.10.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:685b67d99b945b0c221be0780c336b303a7753b3e0ec0d618c795aada25d5e7a", size = 250230, upload-time = "2025-08-17T00:24:59.293Z" }, - { url = "https://files.pythonhosted.org/packages/bc/93/3b24f1da3e0286a4dc5832427e1d448d5296f8287464b1ff4a222abeeeb5/coverage-7.10.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0c079027e50c2ae44da51c2e294596cbc9dbb58f7ca45b30651c7e411060fc23", size = 248351, upload-time = "2025-08-17T00:25:00.676Z" }, - { url = "https://files.pythonhosted.org/packages/de/5f/d59412f869e49dcc5b89398ef3146c8bfaec870b179cc344d27932e0554b/coverage-7.10.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3749aa72b93ce516f77cf5034d8e3c0dfd45c6e8a163a602ede2dc5f9a0bb927", size = 249788, upload-time = "2025-08-17T00:25:02.354Z" }, - { url = "https://files.pythonhosted.org/packages/cc/52/04a3b733f40a0cc7c4a5b9b010844111dbf906df3e868b13e1ce7b39ac31/coverage-7.10.4-cp312-cp312-win32.whl", hash = "sha256:fecb97b3a52fa9bcd5a7375e72fae209088faf671d39fae67261f37772d5559a", size = 219131, upload-time = "2025-08-17T00:25:03.79Z" }, - { url = "https://files.pythonhosted.org/packages/83/dd/12909fc0b83888197b3ec43a4ac7753589591c08d00d9deda4158df2734e/coverage-7.10.4-cp312-cp312-win_amd64.whl", hash = "sha256:26de58f355626628a21fe6a70e1e1fad95702dafebfb0685280962ae1449f17b", size = 219939, upload-time = "2025-08-17T00:25:05.494Z" }, - { url = "https://files.pythonhosted.org/packages/83/c7/058bb3220fdd6821bada9685eadac2940429ab3c97025ce53549ff423cc1/coverage-7.10.4-cp312-cp312-win_arm64.whl", hash = "sha256:67e8885408f8325198862bc487038a4980c9277d753cb8812510927f2176437a", size = 218572, upload-time = "2025-08-17T00:25:06.897Z" }, - { url = "https://files.pythonhosted.org/packages/46/b0/4a3662de81f2ed792a4e425d59c4ae50d8dd1d844de252838c200beed65a/coverage-7.10.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b8e1d2015d5dfdbf964ecef12944c0c8c55b885bb5c0467ae8ef55e0e151233", size = 216735, upload-time = "2025-08-17T00:25:08.617Z" }, - { url = "https://files.pythonhosted.org/packages/c5/e8/e2dcffea01921bfffc6170fb4406cffb763a3b43a047bbd7923566708193/coverage-7.10.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:25735c299439018d66eb2dccf54f625aceb78645687a05f9f848f6e6c751e169", size = 216982, upload-time = "2025-08-17T00:25:10.384Z" }, - { url = "https://files.pythonhosted.org/packages/9d/59/cc89bb6ac869704d2781c2f5f7957d07097c77da0e8fdd4fd50dbf2ac9c0/coverage-7.10.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:715c06cb5eceac4d9b7cdf783ce04aa495f6aff657543fea75c30215b28ddb74", size = 247981, upload-time = "2025-08-17T00:25:11.854Z" }, - { url = "https://files.pythonhosted.org/packages/aa/23/3da089aa177ceaf0d3f96754ebc1318597822e6387560914cc480086e730/coverage-7.10.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e017ac69fac9aacd7df6dc464c05833e834dc5b00c914d7af9a5249fcccf07ef", size = 250584, upload-time = "2025-08-17T00:25:13.483Z" }, - { url = "https://files.pythonhosted.org/packages/ad/82/e8693c368535b4e5fad05252a366a1794d481c79ae0333ed943472fd778d/coverage-7.10.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bad180cc40b3fccb0f0e8c702d781492654ac2580d468e3ffc8065e38c6c2408", size = 251856, upload-time = "2025-08-17T00:25:15.27Z" }, - { url = "https://files.pythonhosted.org/packages/56/19/8b9cb13292e602fa4135b10a26ac4ce169a7fc7c285ff08bedd42ff6acca/coverage-7.10.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:becbdcd14f685fada010a5f792bf0895675ecf7481304fe159f0cd3f289550bd", size = 250015, upload-time = "2025-08-17T00:25:16.759Z" }, - { url = "https://files.pythonhosted.org/packages/10/e7/e5903990ce089527cf1c4f88b702985bd65c61ac245923f1ff1257dbcc02/coverage-7.10.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0b485ca21e16a76f68060911f97ebbe3e0d891da1dbbce6af7ca1ab3f98b9097", size = 247908, upload-time = "2025-08-17T00:25:18.232Z" }, - { url = "https://files.pythonhosted.org/packages/dd/c9/7d464f116df1df7fe340669af1ddbe1a371fc60f3082ff3dc837c4f1f2ab/coverage-7.10.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6c1d098ccfe8e1e0a1ed9a0249138899948afd2978cbf48eb1cc3fcd38469690", size = 249525, upload-time = "2025-08-17T00:25:20.141Z" }, - { url = "https://files.pythonhosted.org/packages/ce/42/722e0cdbf6c19e7235c2020837d4e00f3b07820fd012201a983238cc3a30/coverage-7.10.4-cp313-cp313-win32.whl", hash = "sha256:8630f8af2ca84b5c367c3df907b1706621abe06d6929f5045fd628968d421e6e", size = 219173, upload-time = "2025-08-17T00:25:21.56Z" }, - { url = "https://files.pythonhosted.org/packages/97/7e/aa70366f8275955cd51fa1ed52a521c7fcebcc0fc279f53c8c1ee6006dfe/coverage-7.10.4-cp313-cp313-win_amd64.whl", hash = "sha256:f68835d31c421736be367d32f179e14ca932978293fe1b4c7a6a49b555dff5b2", size = 219969, upload-time = "2025-08-17T00:25:23.501Z" }, - { url = "https://files.pythonhosted.org/packages/ac/96/c39d92d5aad8fec28d4606556bfc92b6fee0ab51e4a548d9b49fb15a777c/coverage-7.10.4-cp313-cp313-win_arm64.whl", hash = "sha256:6eaa61ff6724ca7ebc5326d1fae062d85e19b38dd922d50903702e6078370ae7", size = 218601, upload-time = "2025-08-17T00:25:25.295Z" }, - { url = "https://files.pythonhosted.org/packages/79/13/34d549a6177bd80fa5db758cb6fd3057b7ad9296d8707d4ab7f480b0135f/coverage-7.10.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:702978108876bfb3d997604930b05fe769462cc3000150b0e607b7b444f2fd84", size = 217445, upload-time = "2025-08-17T00:25:27.129Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c0/433da866359bf39bf595f46d134ff2d6b4293aeea7f3328b6898733b0633/coverage-7.10.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e8f978e8c5521d9c8f2086ac60d931d583fab0a16f382f6eb89453fe998e2484", size = 217676, upload-time = "2025-08-17T00:25:28.641Z" }, - { url = "https://files.pythonhosted.org/packages/7e/d7/2b99aa8737f7801fd95222c79a4ebc8c5dd4460d4bed7ef26b17a60c8d74/coverage-7.10.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:df0ac2ccfd19351411c45e43ab60932b74472e4648b0a9edf6a3b58846e246a9", size = 259002, upload-time = "2025-08-17T00:25:30.065Z" }, - { url = "https://files.pythonhosted.org/packages/08/cf/86432b69d57debaef5abf19aae661ba8f4fcd2882fa762e14added4bd334/coverage-7.10.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:73a0d1aaaa3796179f336448e1576a3de6fc95ff4f07c2d7251d4caf5d18cf8d", size = 261178, upload-time = "2025-08-17T00:25:31.517Z" }, - { url = "https://files.pythonhosted.org/packages/23/78/85176593f4aa6e869cbed7a8098da3448a50e3fac5cb2ecba57729a5220d/coverage-7.10.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:873da6d0ed6b3ffc0bc01f2c7e3ad7e2023751c0d8d86c26fe7322c314b031dc", size = 263402, upload-time = "2025-08-17T00:25:33.339Z" }, - { url = "https://files.pythonhosted.org/packages/88/1d/57a27b6789b79abcac0cc5805b31320d7a97fa20f728a6a7c562db9a3733/coverage-7.10.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c6446c75b0e7dda5daa876a1c87b480b2b52affb972fedd6c22edf1aaf2e00ec", size = 260957, upload-time = "2025-08-17T00:25:34.795Z" }, - { url = "https://files.pythonhosted.org/packages/fa/e5/3e5ddfd42835c6def6cd5b2bdb3348da2e34c08d9c1211e91a49e9fd709d/coverage-7.10.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6e73933e296634e520390c44758d553d3b573b321608118363e52113790633b9", size = 258718, upload-time = "2025-08-17T00:25:36.259Z" }, - { url = "https://files.pythonhosted.org/packages/1a/0b/d364f0f7ef111615dc4e05a6ed02cac7b6f2ac169884aa57faeae9eb5fa0/coverage-7.10.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52073d4b08d2cb571234c8a71eb32af3c6923149cf644a51d5957ac128cf6aa4", size = 259848, upload-time = "2025-08-17T00:25:37.754Z" }, - { url = "https://files.pythonhosted.org/packages/10/c6/bbea60a3b309621162e53faf7fac740daaf083048ea22077418e1ecaba3f/coverage-7.10.4-cp313-cp313t-win32.whl", hash = "sha256:e24afb178f21f9ceb1aefbc73eb524769aa9b504a42b26857243f881af56880c", size = 219833, upload-time = "2025-08-17T00:25:39.252Z" }, - { url = "https://files.pythonhosted.org/packages/44/a5/f9f080d49cfb117ddffe672f21eab41bd23a46179a907820743afac7c021/coverage-7.10.4-cp313-cp313t-win_amd64.whl", hash = "sha256:be04507ff1ad206f4be3d156a674e3fb84bbb751ea1b23b142979ac9eebaa15f", size = 220897, upload-time = "2025-08-17T00:25:40.772Z" }, - { url = "https://files.pythonhosted.org/packages/46/89/49a3fc784fa73d707f603e586d84a18c2e7796707044e9d73d13260930b7/coverage-7.10.4-cp313-cp313t-win_arm64.whl", hash = "sha256:f3e3ff3f69d02b5dad67a6eac68cc9c71ae343b6328aae96e914f9f2f23a22e2", size = 219160, upload-time = "2025-08-17T00:25:42.229Z" }, - { url = "https://files.pythonhosted.org/packages/b5/22/525f84b4cbcff66024d29f6909d7ecde97223f998116d3677cfba0d115b5/coverage-7.10.4-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a59fe0af7dd7211ba595cf7e2867458381f7e5d7b4cffe46274e0b2f5b9f4eb4", size = 216717, upload-time = "2025-08-17T00:25:43.875Z" }, - { url = "https://files.pythonhosted.org/packages/a6/58/213577f77efe44333a416d4bcb251471e7f64b19b5886bb515561b5ce389/coverage-7.10.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3a6c35c5b70f569ee38dc3350cd14fdd0347a8b389a18bb37538cc43e6f730e6", size = 216994, upload-time = "2025-08-17T00:25:45.405Z" }, - { url = "https://files.pythonhosted.org/packages/17/85/34ac02d0985a09472f41b609a1d7babc32df87c726c7612dc93d30679b5a/coverage-7.10.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:acb7baf49f513554c4af6ef8e2bd6e8ac74e6ea0c7386df8b3eb586d82ccccc4", size = 248038, upload-time = "2025-08-17T00:25:46.981Z" }, - { url = "https://files.pythonhosted.org/packages/47/4f/2140305ec93642fdaf988f139813629cbb6d8efa661b30a04b6f7c67c31e/coverage-7.10.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a89afecec1ed12ac13ed203238b560cbfad3522bae37d91c102e690b8b1dc46c", size = 250575, upload-time = "2025-08-17T00:25:48.613Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b5/41b5784180b82a083c76aeba8f2c72ea1cb789e5382157b7dc852832aea2/coverage-7.10.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:480442727f464407d8ade6e677b7f21f3b96a9838ab541b9a28ce9e44123c14e", size = 251927, upload-time = "2025-08-17T00:25:50.881Z" }, - { url = "https://files.pythonhosted.org/packages/78/ca/c1dd063e50b71f5aea2ebb27a1c404e7b5ecf5714c8b5301f20e4e8831ac/coverage-7.10.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a89bf193707f4a17f1ed461504031074d87f035153239f16ce86dfb8f8c7ac76", size = 249930, upload-time = "2025-08-17T00:25:52.422Z" }, - { url = "https://files.pythonhosted.org/packages/8d/66/d8907408612ffee100d731798e6090aedb3ba766ecf929df296c1a7ee4fb/coverage-7.10.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:3ddd912c2fc440f0fb3229e764feec85669d5d80a988ff1b336a27d73f63c818", size = 247862, upload-time = "2025-08-17T00:25:54.316Z" }, - { url = "https://files.pythonhosted.org/packages/29/db/53cd8ec8b1c9c52d8e22a25434785bfc2d1e70c0cfb4d278a1326c87f741/coverage-7.10.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8a538944ee3a42265e61c7298aeba9ea43f31c01271cf028f437a7b4075592cf", size = 249360, upload-time = "2025-08-17T00:25:55.833Z" }, - { url = "https://files.pythonhosted.org/packages/4f/75/5ec0a28ae4a0804124ea5a5becd2b0fa3adf30967ac656711fb5cdf67c60/coverage-7.10.4-cp314-cp314-win32.whl", hash = "sha256:fd2e6002be1c62476eb862b8514b1ba7e7684c50165f2a8d389e77da6c9a2ebd", size = 219449, upload-time = "2025-08-17T00:25:57.984Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ab/66e2ee085ec60672bf5250f11101ad8143b81f24989e8c0e575d16bb1e53/coverage-7.10.4-cp314-cp314-win_amd64.whl", hash = "sha256:ec113277f2b5cf188d95fb66a65c7431f2b9192ee7e6ec9b72b30bbfb53c244a", size = 220246, upload-time = "2025-08-17T00:25:59.868Z" }, - { url = "https://files.pythonhosted.org/packages/37/3b/00b448d385f149143190846217797d730b973c3c0ec2045a7e0f5db3a7d0/coverage-7.10.4-cp314-cp314-win_arm64.whl", hash = "sha256:9744954bfd387796c6a091b50d55ca7cac3d08767795b5eec69ad0f7dbf12d38", size = 218825, upload-time = "2025-08-17T00:26:01.44Z" }, - { url = "https://files.pythonhosted.org/packages/ee/2e/55e20d3d1ce00b513efb6fd35f13899e1c6d4f76c6cbcc9851c7227cd469/coverage-7.10.4-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5af4829904dda6aabb54a23879f0f4412094ba9ef153aaa464e3c1b1c9bc98e6", size = 217462, upload-time = "2025-08-17T00:26:03.014Z" }, - { url = "https://files.pythonhosted.org/packages/47/b3/aab1260df5876f5921e2c57519e73a6f6eeacc0ae451e109d44ee747563e/coverage-7.10.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7bba5ed85e034831fac761ae506c0644d24fd5594727e174b5a73aff343a7508", size = 217675, upload-time = "2025-08-17T00:26:04.606Z" }, - { url = "https://files.pythonhosted.org/packages/67/23/1cfe2aa50c7026180989f0bfc242168ac7c8399ccc66eb816b171e0ab05e/coverage-7.10.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d57d555b0719834b55ad35045de6cc80fc2b28e05adb6b03c98479f9553b387f", size = 259176, upload-time = "2025-08-17T00:26:06.159Z" }, - { url = "https://files.pythonhosted.org/packages/9d/72/5882b6aeed3f9de7fc4049874fd7d24213bf1d06882f5c754c8a682606ec/coverage-7.10.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ba62c51a72048bb1ea72db265e6bd8beaabf9809cd2125bbb5306c6ce105f214", size = 261341, upload-time = "2025-08-17T00:26:08.137Z" }, - { url = "https://files.pythonhosted.org/packages/1b/70/a0c76e3087596ae155f8e71a49c2c534c58b92aeacaf4d9d0cbbf2dde53b/coverage-7.10.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0acf0c62a6095f07e9db4ec365cc58c0ef5babb757e54745a1aa2ea2a2564af1", size = 263600, upload-time = "2025-08-17T00:26:11.045Z" }, - { url = "https://files.pythonhosted.org/packages/cb/5f/27e4cd4505b9a3c05257fb7fc509acbc778c830c450cb4ace00bf2b7bda7/coverage-7.10.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e1033bf0f763f5cf49ffe6594314b11027dcc1073ac590b415ea93463466deec", size = 261036, upload-time = "2025-08-17T00:26:12.693Z" }, - { url = "https://files.pythonhosted.org/packages/02/d6/cf2ae3a7f90ab226ea765a104c4e76c5126f73c93a92eaea41e1dc6a1892/coverage-7.10.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:92c29eff894832b6a40da1789b1f252305af921750b03ee4535919db9179453d", size = 258794, upload-time = "2025-08-17T00:26:14.261Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b1/39f222eab0d78aa2001cdb7852aa1140bba632db23a5cfd832218b496d6c/coverage-7.10.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:822c4c830989c2093527e92acd97be4638a44eb042b1bdc0e7a278d84a070bd3", size = 259946, upload-time = "2025-08-17T00:26:15.899Z" }, - { url = "https://files.pythonhosted.org/packages/74/b2/49d82acefe2fe7c777436a3097f928c7242a842538b190f66aac01f29321/coverage-7.10.4-cp314-cp314t-win32.whl", hash = "sha256:e694d855dac2e7cf194ba33653e4ba7aad7267a802a7b3fc4347d0517d5d65cd", size = 220226, upload-time = "2025-08-17T00:26:17.566Z" }, - { url = "https://files.pythonhosted.org/packages/06/b0/afb942b6b2fc30bdbc7b05b087beae11c2b0daaa08e160586cf012b6ad70/coverage-7.10.4-cp314-cp314t-win_amd64.whl", hash = "sha256:efcc54b38ef7d5bfa98050f220b415bc5bb3d432bd6350a861cf6da0ede2cdcd", size = 221346, upload-time = "2025-08-17T00:26:19.311Z" }, - { url = "https://files.pythonhosted.org/packages/d8/66/e0531c9d1525cb6eac5b5733c76f27f3053ee92665f83f8899516fea6e76/coverage-7.10.4-cp314-cp314t-win_arm64.whl", hash = "sha256:6f3a3496c0fa26bfac4ebc458747b778cff201c8ae94fa05e1391bab0dbc473c", size = 219368, upload-time = "2025-08-17T00:26:21.011Z" }, - { url = "https://files.pythonhosted.org/packages/d1/61/4e38d86d31a268778d69bb3fd1fc88e0c7a78ffdee48f2b5d9e028a3dce5/coverage-7.10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:48fd4d52600c2a9d5622e52dfae674a7845c5e1dceaf68b88c99feb511fbcfd6", size = 216393, upload-time = "2025-08-17T00:26:22.648Z" }, - { url = "https://files.pythonhosted.org/packages/17/16/5c2fdb1d213f57e0ff107738397aff68582fa90a6575ca165b49eae5a809/coverage-7.10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:56217b470d09d69e6b7dcae38200f95e389a77db801cb129101697a4553b18b6", size = 216779, upload-time = "2025-08-17T00:26:24.422Z" }, - { url = "https://files.pythonhosted.org/packages/26/99/3aca6b4028e3667ccfbaef9cfd9dca8d85eb14deee7868373cc48cbee553/coverage-7.10.4-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:44ac3f21a6e28c5ff7f7a47bca5f87885f6a1e623e637899125ba47acd87334d", size = 243214, upload-time = "2025-08-17T00:26:26.468Z" }, - { url = "https://files.pythonhosted.org/packages/0d/33/27a7d2557f85001b2edb6a2f14037851f87ca7d69a4ca79460e1859f4c7f/coverage-7.10.4-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3387739d72c84d17b4d2f7348749cac2e6700e7152026912b60998ee9a40066b", size = 245037, upload-time = "2025-08-17T00:26:28.071Z" }, - { url = "https://files.pythonhosted.org/packages/6d/68/92c0e18d36d34c774cb5053c9413188c27f8b3f9587e315193a30c1695ce/coverage-7.10.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f111ff20d9a6348e0125be892608e33408dd268f73b020940dfa8511ad05503", size = 246809, upload-time = "2025-08-17T00:26:29.828Z" }, - { url = "https://files.pythonhosted.org/packages/03/22/f0618594010903401e782459c100755af3f275ea86d49b0d4f3afa3658d9/coverage-7.10.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:01a852f0a9859734b018a3f483cc962d0b381d48d350b1a0c47d618c73a0c398", size = 244695, upload-time = "2025-08-17T00:26:31.495Z" }, - { url = "https://files.pythonhosted.org/packages/e5/45/e704923a037a4a38a3c13ae6405c31236db2d274307ab28fd1a23b961cad/coverage-7.10.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:225111dd06759ba4e37cee4c0b4f3df2b15c879e9e3c37bf986389300b9917c3", size = 242766, upload-time = "2025-08-17T00:26:33.425Z" }, - { url = "https://files.pythonhosted.org/packages/e4/b7/4dc6f2b41aa907ae330ed841deb49c9487f6ec5072a577fc3a3b284fe855/coverage-7.10.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2178d4183bd1ba608f0bb12e71e55838ba1b7dbb730264f8b08de9f8ef0c27d0", size = 243723, upload-time = "2025-08-17T00:26:35.688Z" }, - { url = "https://files.pythonhosted.org/packages/b7/62/0e58abc2ce2d9a5b906dd1c08802864f756365843c413aebf0184148ddfb/coverage-7.10.4-cp39-cp39-win32.whl", hash = "sha256:93d175fe81913aee7a6ea430abbdf2a79f1d9fd451610e12e334e4fe3264f563", size = 218927, upload-time = "2025-08-17T00:26:37.725Z" }, - { url = "https://files.pythonhosted.org/packages/a4/3e/4668a5b5601450d9c8aa71cc4f7e6c6c259350e577c758b894443598322a/coverage-7.10.4-cp39-cp39-win_amd64.whl", hash = "sha256:2221a823404bb941c7721cf0ef55ac6ee5c25d905beb60c0bba5e5e85415d353", size = 219838, upload-time = "2025-08-17T00:26:39.786Z" }, - { url = "https://files.pythonhosted.org/packages/bb/78/983efd23200921d9edb6bd40512e1aa04af553d7d5a171e50f9b2b45d109/coverage-7.10.4-py3-none-any.whl", hash = "sha256:065d75447228d05121e5c938ca8f0e91eed60a1eb2d1258d42d5084fecfc3302", size = 208365, upload-time = "2025-08-17T00:26:41.479Z" }, + { url = "https://files.pythonhosted.org/packages/af/70/e77b0061a6c7157bfce645c6b9a715a08d4c86b3360a7b3252818080b817/coverage-7.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c6a5c3414bfc7451b879141ce772c546985163cf553f08e0f135f0699a911801", size = 216774, upload-time = "2025-08-23T14:40:26.301Z" }, + { url = "https://files.pythonhosted.org/packages/91/08/2a79de5ecf37ee40f2d898012306f11c161548753391cec763f92647837b/coverage-7.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bc8e4d99ce82f1710cc3c125adc30fd1487d3cf6c2cd4994d78d68a47b16989a", size = 217175, upload-time = "2025-08-23T14:40:29.142Z" }, + { url = "https://files.pythonhosted.org/packages/64/57/0171d69a699690149a6ba6a4eb702814448c8d617cf62dbafa7ce6bfdf63/coverage-7.10.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:02252dc1216e512a9311f596b3169fad54abcb13827a8d76d5630c798a50a754", size = 243931, upload-time = "2025-08-23T14:40:30.735Z" }, + { url = "https://files.pythonhosted.org/packages/15/06/3a67662c55656702bd398a727a7f35df598eb11104fcb34f1ecbb070291a/coverage-7.10.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:73269df37883e02d460bee0cc16be90509faea1e3bd105d77360b512d5bb9c33", size = 245740, upload-time = "2025-08-23T14:40:32.302Z" }, + { url = "https://files.pythonhosted.org/packages/00/f4/f8763aabf4dc30ef0d0012522d312f0b7f9fede6246a1f27dbcc4a1e523c/coverage-7.10.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f8a81b0614642f91c9effd53eec284f965577591f51f547a1cbeb32035b4c2f", size = 247600, upload-time = "2025-08-23T14:40:33.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/31/6632219a9065e1b83f77eda116fed4c76fb64908a6a9feae41816dab8237/coverage-7.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6a29f8e0adb7f8c2b95fa2d4566a1d6e6722e0a637634c6563cb1ab844427dd9", size = 245640, upload-time = "2025-08-23T14:40:35.248Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e2/3dba9b86037b81649b11d192bb1df11dde9a81013e434af3520222707bc8/coverage-7.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fcf6ab569436b4a647d4e91accba12509ad9f2554bc93d3aee23cc596e7f99c3", size = 243659, upload-time = "2025-08-23T14:40:36.815Z" }, + { url = "https://files.pythonhosted.org/packages/02/b9/57170bd9f3e333837fc24ecc88bc70fbc2eb7ccfd0876854b0c0407078c3/coverage-7.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:90dc3d6fb222b194a5de60af8d190bedeeddcbc7add317e4a3cd333ee6b7c879", size = 244537, upload-time = "2025-08-23T14:40:38.737Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1c/93ac36ef1e8b06b8d5777393a3a40cb356f9f3dab980be40a6941e443588/coverage-7.10.5-cp310-cp310-win32.whl", hash = "sha256:414a568cd545f9dc75f0686a0049393de8098414b58ea071e03395505b73d7a8", size = 219285, upload-time = "2025-08-23T14:40:40.342Z" }, + { url = "https://files.pythonhosted.org/packages/30/95/23252277e6e5fe649d6cd3ed3f35d2307e5166de4e75e66aa7f432abc46d/coverage-7.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:e551f9d03347196271935fd3c0c165f0e8c049220280c1120de0084d65e9c7ff", size = 220185, upload-time = "2025-08-23T14:40:42.026Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f2/336d34d2fc1291ca7c18eeb46f64985e6cef5a1a7ef6d9c23720c6527289/coverage-7.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c177e6ffe2ebc7c410785307758ee21258aa8e8092b44d09a2da767834f075f2", size = 216890, upload-time = "2025-08-23T14:40:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/92448b07cc1cf2b429d0ce635f59cf0c626a5d8de21358f11e92174ff2a6/coverage-7.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:14d6071c51ad0f703d6440827eaa46386169b5fdced42631d5a5ac419616046f", size = 217287, upload-time = "2025-08-23T14:40:45.214Z" }, + { url = "https://files.pythonhosted.org/packages/96/ba/ad5b36537c5179c808d0ecdf6e4aa7630b311b3c12747ad624dcd43a9b6b/coverage-7.10.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:61f78c7c3bc272a410c5ae3fde7792b4ffb4acc03d35a7df73ca8978826bb7ab", size = 247683, upload-time = "2025-08-23T14:40:46.791Z" }, + { url = "https://files.pythonhosted.org/packages/28/e5/fe3bbc8d097029d284b5fb305b38bb3404895da48495f05bff025df62770/coverage-7.10.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f39071caa126f69d63f99b324fb08c7b1da2ec28cbb1fe7b5b1799926492f65c", size = 249614, upload-time = "2025-08-23T14:40:48.082Z" }, + { url = "https://files.pythonhosted.org/packages/69/9c/a1c89a8c8712799efccb32cd0a1ee88e452f0c13a006b65bb2271f1ac767/coverage-7.10.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:343a023193f04d46edc46b2616cdbee68c94dd10208ecd3adc56fcc54ef2baa1", size = 251719, upload-time = "2025-08-23T14:40:49.349Z" }, + { url = "https://files.pythonhosted.org/packages/e9/be/5576b5625865aa95b5633315f8f4142b003a70c3d96e76f04487c3b5cc95/coverage-7.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:585ffe93ae5894d1ebdee69fc0b0d4b7c75d8007983692fb300ac98eed146f78", size = 249411, upload-time = "2025-08-23T14:40:50.624Z" }, + { url = "https://files.pythonhosted.org/packages/94/0a/e39a113d4209da0dbbc9385608cdb1b0726a4d25f78672dc51c97cfea80f/coverage-7.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0ef4e66f006ed181df29b59921bd8fc7ed7cd6a9289295cd8b2824b49b570df", size = 247466, upload-time = "2025-08-23T14:40:52.362Z" }, + { url = "https://files.pythonhosted.org/packages/40/cb/aebb2d8c9e3533ee340bea19b71c5b76605a0268aa49808e26fe96ec0a07/coverage-7.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eb7b0bbf7cc1d0453b843eca7b5fa017874735bef9bfdfa4121373d2cc885ed6", size = 248104, upload-time = "2025-08-23T14:40:54.064Z" }, + { url = "https://files.pythonhosted.org/packages/08/e6/26570d6ccce8ff5de912cbfd268e7f475f00597cb58da9991fa919c5e539/coverage-7.10.5-cp311-cp311-win32.whl", hash = "sha256:1d043a8a06987cc0c98516e57c4d3fc2c1591364831e9deb59c9e1b4937e8caf", size = 219327, upload-time = "2025-08-23T14:40:55.424Z" }, + { url = "https://files.pythonhosted.org/packages/79/79/5f48525e366e518b36e66167e3b6e5db6fd54f63982500c6a5abb9d3dfbd/coverage-7.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:fefafcca09c3ac56372ef64a40f5fe17c5592fab906e0fdffd09543f3012ba50", size = 220213, upload-time = "2025-08-23T14:40:56.724Z" }, + { url = "https://files.pythonhosted.org/packages/40/3c/9058128b7b0bf333130c320b1eb1ae485623014a21ee196d68f7737f8610/coverage-7.10.5-cp311-cp311-win_arm64.whl", hash = "sha256:7e78b767da8b5fc5b2faa69bb001edafcd6f3995b42a331c53ef9572c55ceb82", size = 218893, upload-time = "2025-08-23T14:40:58.011Z" }, + { url = "https://files.pythonhosted.org/packages/27/8e/40d75c7128f871ea0fd829d3e7e4a14460cad7c3826e3b472e6471ad05bd/coverage-7.10.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c2d05c7e73c60a4cecc7d9b60dbfd603b4ebc0adafaef371445b47d0f805c8a9", size = 217077, upload-time = "2025-08-23T14:40:59.329Z" }, + { url = "https://files.pythonhosted.org/packages/18/a8/f333f4cf3fb5477a7f727b4d603a2eb5c3c5611c7fe01329c2e13b23b678/coverage-7.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:32ddaa3b2c509778ed5373b177eb2bf5662405493baeff52278a0b4f9415188b", size = 217310, upload-time = "2025-08-23T14:41:00.628Z" }, + { url = "https://files.pythonhosted.org/packages/ec/2c/fbecd8381e0a07d1547922be819b4543a901402f63930313a519b937c668/coverage-7.10.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dd382410039fe062097aa0292ab6335a3f1e7af7bba2ef8d27dcda484918f20c", size = 248802, upload-time = "2025-08-23T14:41:02.012Z" }, + { url = "https://files.pythonhosted.org/packages/3f/bc/1011da599b414fb6c9c0f34086736126f9ff71f841755786a6b87601b088/coverage-7.10.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7fa22800f3908df31cea6fb230f20ac49e343515d968cc3a42b30d5c3ebf9b5a", size = 251550, upload-time = "2025-08-23T14:41:03.438Z" }, + { url = "https://files.pythonhosted.org/packages/4c/6f/b5c03c0c721c067d21bc697accc3642f3cef9f087dac429c918c37a37437/coverage-7.10.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f366a57ac81f5e12797136552f5b7502fa053c861a009b91b80ed51f2ce651c6", size = 252684, upload-time = "2025-08-23T14:41:04.85Z" }, + { url = "https://files.pythonhosted.org/packages/f9/50/d474bc300ebcb6a38a1047d5c465a227605d6473e49b4e0d793102312bc5/coverage-7.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1dc8f1980a272ad4a6c84cba7981792344dad33bf5869361576b7aef42733a", size = 250602, upload-time = "2025-08-23T14:41:06.719Z" }, + { url = "https://files.pythonhosted.org/packages/4a/2d/548c8e04249cbba3aba6bd799efdd11eee3941b70253733f5d355d689559/coverage-7.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2285c04ee8676f7938b02b4936d9b9b672064daab3187c20f73a55f3d70e6b4a", size = 248724, upload-time = "2025-08-23T14:41:08.429Z" }, + { url = "https://files.pythonhosted.org/packages/e2/96/a7c3c0562266ac39dcad271d0eec8fc20ab576e3e2f64130a845ad2a557b/coverage-7.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c2492e4dd9daab63f5f56286f8a04c51323d237631eb98505d87e4c4ff19ec34", size = 250158, upload-time = "2025-08-23T14:41:09.749Z" }, + { url = "https://files.pythonhosted.org/packages/f3/75/74d4be58c70c42ef0b352d597b022baf12dbe2b43e7cb1525f56a0fb1d4b/coverage-7.10.5-cp312-cp312-win32.whl", hash = "sha256:38a9109c4ee8135d5df5505384fc2f20287a47ccbe0b3f04c53c9a1989c2bbaf", size = 219493, upload-time = "2025-08-23T14:41:11.095Z" }, + { url = "https://files.pythonhosted.org/packages/4f/08/364e6012d1d4d09d1e27437382967efed971d7613f94bca9add25f0c1f2b/coverage-7.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:6b87f1ad60b30bc3c43c66afa7db6b22a3109902e28c5094957626a0143a001f", size = 220302, upload-time = "2025-08-23T14:41:12.449Z" }, + { url = "https://files.pythonhosted.org/packages/db/d5/7c8a365e1f7355c58af4fe5faf3f90cc8e587590f5854808d17ccb4e7077/coverage-7.10.5-cp312-cp312-win_arm64.whl", hash = "sha256:672a6c1da5aea6c629819a0e1461e89d244f78d7b60c424ecf4f1f2556c041d8", size = 218936, upload-time = "2025-08-23T14:41:13.872Z" }, + { url = "https://files.pythonhosted.org/packages/9f/08/4166ecfb60ba011444f38a5a6107814b80c34c717bc7a23be0d22e92ca09/coverage-7.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ef3b83594d933020f54cf65ea1f4405d1f4e41a009c46df629dd964fcb6e907c", size = 217106, upload-time = "2025-08-23T14:41:15.268Z" }, + { url = "https://files.pythonhosted.org/packages/25/d7/b71022408adbf040a680b8c64bf6ead3be37b553e5844f7465643979f7ca/coverage-7.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b96bfdf7c0ea9faebce088a3ecb2382819da4fbc05c7b80040dbc428df6af44", size = 217353, upload-time = "2025-08-23T14:41:16.656Z" }, + { url = "https://files.pythonhosted.org/packages/74/68/21e0d254dbf8972bb8dd95e3fe7038f4be037ff04ba47d6d1b12b37510ba/coverage-7.10.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:63df1fdaffa42d914d5c4d293e838937638bf75c794cf20bee12978fc8c4e3bc", size = 248350, upload-time = "2025-08-23T14:41:18.128Z" }, + { url = "https://files.pythonhosted.org/packages/90/65/28752c3a896566ec93e0219fc4f47ff71bd2b745f51554c93e8dcb659796/coverage-7.10.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8002dc6a049aac0e81ecec97abfb08c01ef0c1fbf962d0c98da3950ace89b869", size = 250955, upload-time = "2025-08-23T14:41:19.577Z" }, + { url = "https://files.pythonhosted.org/packages/a5/eb/ca6b7967f57f6fef31da8749ea20417790bb6723593c8cd98a987be20423/coverage-7.10.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63d4bb2966d6f5f705a6b0c6784c8969c468dbc4bcf9d9ded8bff1c7e092451f", size = 252230, upload-time = "2025-08-23T14:41:20.959Z" }, + { url = "https://files.pythonhosted.org/packages/bc/29/17a411b2a2a18f8b8c952aa01c00f9284a1fbc677c68a0003b772ea89104/coverage-7.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1f672efc0731a6846b157389b6e6d5d5e9e59d1d1a23a5c66a99fd58339914d5", size = 250387, upload-time = "2025-08-23T14:41:22.644Z" }, + { url = "https://files.pythonhosted.org/packages/c7/89/97a9e271188c2fbb3db82235c33980bcbc733da7da6065afbaa1d685a169/coverage-7.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3f39cef43d08049e8afc1fde4a5da8510fc6be843f8dea350ee46e2a26b2f54c", size = 248280, upload-time = "2025-08-23T14:41:24.061Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/0ad7d0137257553eb4706b4ad6180bec0a1b6a648b092c5bbda48d0e5b2c/coverage-7.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2968647e3ed5a6c019a419264386b013979ff1fb67dd11f5c9886c43d6a31fc2", size = 249894, upload-time = "2025-08-23T14:41:26.165Z" }, + { url = "https://files.pythonhosted.org/packages/84/56/fb3aba936addb4c9e5ea14f5979393f1c2466b4c89d10591fd05f2d6b2aa/coverage-7.10.5-cp313-cp313-win32.whl", hash = "sha256:0d511dda38595b2b6934c2b730a1fd57a3635c6aa2a04cb74714cdfdd53846f4", size = 219536, upload-time = "2025-08-23T14:41:27.694Z" }, + { url = "https://files.pythonhosted.org/packages/fc/54/baacb8f2f74431e3b175a9a2881feaa8feb6e2f187a0e7e3046f3c7742b2/coverage-7.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:9a86281794a393513cf117177fd39c796b3f8e3759bb2764259a2abba5cce54b", size = 220330, upload-time = "2025-08-23T14:41:29.081Z" }, + { url = "https://files.pythonhosted.org/packages/64/8a/82a3788f8e31dee51d350835b23d480548ea8621f3effd7c3ba3f7e5c006/coverage-7.10.5-cp313-cp313-win_arm64.whl", hash = "sha256:cebd8e906eb98bb09c10d1feed16096700b1198d482267f8bf0474e63a7b8d84", size = 218961, upload-time = "2025-08-23T14:41:30.511Z" }, + { url = "https://files.pythonhosted.org/packages/d8/a1/590154e6eae07beee3b111cc1f907c30da6fc8ce0a83ef756c72f3c7c748/coverage-7.10.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0520dff502da5e09d0d20781df74d8189ab334a1e40d5bafe2efaa4158e2d9e7", size = 217819, upload-time = "2025-08-23T14:41:31.962Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ff/436ffa3cfc7741f0973c5c89405307fe39b78dcf201565b934e6616fc4ad/coverage-7.10.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d9cd64aca68f503ed3f1f18c7c9174cbb797baba02ca8ab5112f9d1c0328cd4b", size = 218040, upload-time = "2025-08-23T14:41:33.472Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ca/5787fb3d7820e66273913affe8209c534ca11241eb34ee8c4fd2aaa9dd87/coverage-7.10.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0913dd1613a33b13c4f84aa6e3f4198c1a21ee28ccb4f674985c1f22109f0aae", size = 259374, upload-time = "2025-08-23T14:41:34.914Z" }, + { url = "https://files.pythonhosted.org/packages/b5/89/21af956843896adc2e64fc075eae3c1cadb97ee0a6960733e65e696f32dd/coverage-7.10.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1b7181c0feeb06ed8a02da02792f42f829a7b29990fef52eff257fef0885d760", size = 261551, upload-time = "2025-08-23T14:41:36.333Z" }, + { url = "https://files.pythonhosted.org/packages/e1/96/390a69244ab837e0ac137989277879a084c786cf036c3c4a3b9637d43a89/coverage-7.10.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36d42b7396b605f774d4372dd9c49bed71cbabce4ae1ccd074d155709dd8f235", size = 263776, upload-time = "2025-08-23T14:41:38.25Z" }, + { url = "https://files.pythonhosted.org/packages/00/32/cfd6ae1da0a521723349f3129b2455832fc27d3f8882c07e5b6fefdd0da2/coverage-7.10.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b4fdc777e05c4940b297bf47bf7eedd56a39a61dc23ba798e4b830d585486ca5", size = 261326, upload-time = "2025-08-23T14:41:40.343Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c4/bf8d459fb4ce2201e9243ce6c015936ad283a668774430a3755f467b39d1/coverage-7.10.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:42144e8e346de44a6f1dbd0a56575dd8ab8dfa7e9007da02ea5b1c30ab33a7db", size = 259090, upload-time = "2025-08-23T14:41:42.106Z" }, + { url = "https://files.pythonhosted.org/packages/f4/5d/a234f7409896468e5539d42234016045e4015e857488b0b5b5f3f3fa5f2b/coverage-7.10.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:66c644cbd7aed8fe266d5917e2c9f65458a51cfe5eeff9c05f15b335f697066e", size = 260217, upload-time = "2025-08-23T14:41:43.591Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ad/87560f036099f46c2ddd235be6476dd5c1d6be6bb57569a9348d43eeecea/coverage-7.10.5-cp313-cp313t-win32.whl", hash = "sha256:2d1b73023854068c44b0c554578a4e1ef1b050ed07cf8b431549e624a29a66ee", size = 220194, upload-time = "2025-08-23T14:41:45.051Z" }, + { url = "https://files.pythonhosted.org/packages/36/a8/04a482594fdd83dc677d4a6c7e2d62135fff5a1573059806b8383fad9071/coverage-7.10.5-cp313-cp313t-win_amd64.whl", hash = "sha256:54a1532c8a642d8cc0bd5a9a51f5a9dcc440294fd06e9dda55e743c5ec1a8f14", size = 221258, upload-time = "2025-08-23T14:41:46.44Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ad/7da28594ab66fe2bc720f1bc9b131e62e9b4c6e39f044d9a48d18429cc21/coverage-7.10.5-cp313-cp313t-win_arm64.whl", hash = "sha256:74d5b63fe3f5f5d372253a4ef92492c11a4305f3550631beaa432fc9df16fcff", size = 219521, upload-time = "2025-08-23T14:41:47.882Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7f/c8b6e4e664b8a95254c35a6c8dd0bf4db201ec681c169aae2f1256e05c85/coverage-7.10.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:68c5e0bc5f44f68053369fa0d94459c84548a77660a5f2561c5e5f1e3bed7031", size = 217090, upload-time = "2025-08-23T14:41:49.327Z" }, + { url = "https://files.pythonhosted.org/packages/44/74/3ee14ede30a6e10a94a104d1d0522d5fb909a7c7cac2643d2a79891ff3b9/coverage-7.10.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cf33134ffae93865e32e1e37df043bef15a5e857d8caebc0099d225c579b0fa3", size = 217365, upload-time = "2025-08-23T14:41:50.796Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/06ac21bf87dfb7620d1f870dfa3c2cae1186ccbcdc50b8b36e27a0d52f50/coverage-7.10.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ad8fa9d5193bafcf668231294241302b5e683a0518bf1e33a9a0dfb142ec3031", size = 248413, upload-time = "2025-08-23T14:41:52.5Z" }, + { url = "https://files.pythonhosted.org/packages/21/bc/cc5bed6e985d3a14228539631573f3863be6a2587381e8bc5fdf786377a1/coverage-7.10.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:146fa1531973d38ab4b689bc764592fe6c2f913e7e80a39e7eeafd11f0ef6db2", size = 250943, upload-time = "2025-08-23T14:41:53.922Z" }, + { url = "https://files.pythonhosted.org/packages/8d/43/6a9fc323c2c75cd80b18d58db4a25dc8487f86dd9070f9592e43e3967363/coverage-7.10.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6013a37b8a4854c478d3219ee8bc2392dea51602dd0803a12d6f6182a0061762", size = 252301, upload-time = "2025-08-23T14:41:56.528Z" }, + { url = "https://files.pythonhosted.org/packages/69/7c/3e791b8845f4cd515275743e3775adb86273576596dc9f02dca37357b4f2/coverage-7.10.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:eb90fe20db9c3d930fa2ad7a308207ab5b86bf6a76f54ab6a40be4012d88fcae", size = 250302, upload-time = "2025-08-23T14:41:58.171Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bc/5099c1e1cb0c9ac6491b281babea6ebbf999d949bf4aa8cdf4f2b53505e8/coverage-7.10.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:384b34482272e960c438703cafe63316dfbea124ac62006a455c8410bf2a2262", size = 248237, upload-time = "2025-08-23T14:41:59.703Z" }, + { url = "https://files.pythonhosted.org/packages/7e/51/d346eb750a0b2f1e77f391498b753ea906fde69cc11e4b38dca28c10c88c/coverage-7.10.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:467dc74bd0a1a7de2bedf8deaf6811f43602cb532bd34d81ffd6038d6d8abe99", size = 249726, upload-time = "2025-08-23T14:42:01.343Z" }, + { url = "https://files.pythonhosted.org/packages/a3/85/eebcaa0edafe427e93286b94f56ea7e1280f2c49da0a776a6f37e04481f9/coverage-7.10.5-cp314-cp314-win32.whl", hash = "sha256:556d23d4e6393ca898b2e63a5bca91e9ac2d5fb13299ec286cd69a09a7187fde", size = 219825, upload-time = "2025-08-23T14:42:03.263Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f7/6d43e037820742603f1e855feb23463979bf40bd27d0cde1f761dcc66a3e/coverage-7.10.5-cp314-cp314-win_amd64.whl", hash = "sha256:f4446a9547681533c8fa3e3c6cf62121eeee616e6a92bd9201c6edd91beffe13", size = 220618, upload-time = "2025-08-23T14:42:05.037Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b0/ed9432e41424c51509d1da603b0393404b828906236fb87e2c8482a93468/coverage-7.10.5-cp314-cp314-win_arm64.whl", hash = "sha256:5e78bd9cf65da4c303bf663de0d73bf69f81e878bf72a94e9af67137c69b9fe9", size = 219199, upload-time = "2025-08-23T14:42:06.662Z" }, + { url = "https://files.pythonhosted.org/packages/2f/54/5a7ecfa77910f22b659c820f67c16fc1e149ed132ad7117f0364679a8fa9/coverage-7.10.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5661bf987d91ec756a47c7e5df4fbcb949f39e32f9334ccd3f43233bbb65e508", size = 217833, upload-time = "2025-08-23T14:42:08.262Z" }, + { url = "https://files.pythonhosted.org/packages/4e/0e/25672d917cc57857d40edf38f0b867fb9627115294e4f92c8fcbbc18598d/coverage-7.10.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a46473129244db42a720439a26984f8c6f834762fc4573616c1f37f13994b357", size = 218048, upload-time = "2025-08-23T14:42:10.247Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7c/0b2b4f1c6f71885d4d4b2b8608dcfc79057adb7da4143eb17d6260389e42/coverage-7.10.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1f64b8d3415d60f24b058b58d859e9512624bdfa57a2d1f8aff93c1ec45c429b", size = 259549, upload-time = "2025-08-23T14:42:11.811Z" }, + { url = "https://files.pythonhosted.org/packages/94/73/abb8dab1609abec7308d83c6aec547944070526578ee6c833d2da9a0ad42/coverage-7.10.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:44d43de99a9d90b20e0163f9770542357f58860a26e24dc1d924643bd6aa7cb4", size = 261715, upload-time = "2025-08-23T14:42:13.505Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d1/abf31de21ec92731445606b8d5e6fa5144653c2788758fcf1f47adb7159a/coverage-7.10.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a931a87e5ddb6b6404e65443b742cb1c14959622777f2a4efd81fba84f5d91ba", size = 263969, upload-time = "2025-08-23T14:42:15.422Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b3/ef274927f4ebede96056173b620db649cc9cb746c61ffc467946b9d0bc67/coverage-7.10.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9559b906a100029274448f4c8b8b0a127daa4dade5661dfd821b8c188058842", size = 261408, upload-time = "2025-08-23T14:42:16.971Z" }, + { url = "https://files.pythonhosted.org/packages/20/fc/83ca2812be616d69b4cdd4e0c62a7bc526d56875e68fd0f79d47c7923584/coverage-7.10.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b08801e25e3b4526ef9ced1aa29344131a8f5213c60c03c18fe4c6170ffa2874", size = 259168, upload-time = "2025-08-23T14:42:18.512Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/e0779e5716f72d5c9962e709d09815d02b3b54724e38567308304c3fc9df/coverage-7.10.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ed9749bb8eda35f8b636fb7632f1c62f735a236a5d4edadd8bbcc5ea0542e732", size = 260317, upload-time = "2025-08-23T14:42:20.005Z" }, + { url = "https://files.pythonhosted.org/packages/2b/fe/4247e732f2234bb5eb9984a0888a70980d681f03cbf433ba7b48f08ca5d5/coverage-7.10.5-cp314-cp314t-win32.whl", hash = "sha256:609b60d123fc2cc63ccee6d17e4676699075db72d14ac3c107cc4976d516f2df", size = 220600, upload-time = "2025-08-23T14:42:22.027Z" }, + { url = "https://files.pythonhosted.org/packages/a7/a0/f294cff6d1034b87839987e5b6ac7385bec599c44d08e0857ac7f164ad0c/coverage-7.10.5-cp314-cp314t-win_amd64.whl", hash = "sha256:0666cf3d2c1626b5a3463fd5b05f5e21f99e6aec40a3192eee4d07a15970b07f", size = 221714, upload-time = "2025-08-23T14:42:23.616Z" }, + { url = "https://files.pythonhosted.org/packages/23/18/fa1afdc60b5528d17416df440bcbd8fd12da12bfea9da5b6ae0f7a37d0f7/coverage-7.10.5-cp314-cp314t-win_arm64.whl", hash = "sha256:bc85eb2d35e760120540afddd3044a5bf69118a91a296a8b3940dfc4fdcfe1e2", size = 219735, upload-time = "2025-08-23T14:42:25.156Z" }, + { url = "https://files.pythonhosted.org/packages/3b/21/05248e8bc74683488cb7477e6b6b878decadd15af0ec96f56381d3d7ff2d/coverage-7.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:62835c1b00c4a4ace24c1a88561a5a59b612fbb83a525d1c70ff5720c97c0610", size = 216763, upload-time = "2025-08-23T14:42:26.75Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7f/161a0ad40cb1c7e19dc1aae106d3430cc88dac3d651796d6cf3f3730c800/coverage-7.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5255b3bbcc1d32a4069d6403820ac8e6dbcc1d68cb28a60a1ebf17e47028e898", size = 217154, upload-time = "2025-08-23T14:42:28.238Z" }, + { url = "https://files.pythonhosted.org/packages/de/31/41929ee53af829ea5a88e71d335ea09d0bb587a3da1c5e58e59b48473ed8/coverage-7.10.5-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3876385722e335d6e991c430302c24251ef9c2a9701b2b390f5473199b1b8ebf", size = 243588, upload-time = "2025-08-23T14:42:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4e/2649344e33eeb3567041e8255a1942173cae81817fe06b60f3fafaafe111/coverage-7.10.5-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8048ce4b149c93447a55d279078c8ae98b08a6951a3c4d2d7e87f4efc7bfe100", size = 245412, upload-time = "2025-08-23T14:42:31.296Z" }, + { url = "https://files.pythonhosted.org/packages/ac/b1/b21e1e69986ad89b051dd42c3ef06d9326e03ac3c0c844fc33385d1d9e35/coverage-7.10.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4028e7558e268dd8bcf4d9484aad393cafa654c24b4885f6f9474bf53183a82a", size = 247182, upload-time = "2025-08-23T14:42:33.155Z" }, + { url = "https://files.pythonhosted.org/packages/4c/b5/80837be411ae092e03fcc2a7877bd9a659c531eff50453e463057a9eee44/coverage-7.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03f47dc870eec0367fcdd603ca6a01517d2504e83dc18dbfafae37faec66129a", size = 245066, upload-time = "2025-08-23T14:42:34.754Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ed/fcb0838ddf149d68d09f89af57397b0dd9d26b100cc729daf1b0caf0b2d3/coverage-7.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2d488d7d42b6ded7ea0704884f89dcabd2619505457de8fc9a6011c62106f6e5", size = 243138, upload-time = "2025-08-23T14:42:36.311Z" }, + { url = "https://files.pythonhosted.org/packages/75/0f/505c6af24a9ae5d8919d209b9c31b7092815f468fa43bec3b1118232c62a/coverage-7.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b3dcf2ead47fa8be14224ee817dfc1df98043af568fe120a22f81c0eb3c34ad2", size = 244095, upload-time = "2025-08-23T14:42:38.227Z" }, + { url = "https://files.pythonhosted.org/packages/e4/7e/c82a8bede46217c1d944bd19b65e7106633b998640f00ab49c5f747a5844/coverage-7.10.5-cp39-cp39-win32.whl", hash = "sha256:02650a11324b80057b8c9c29487020073d5e98a498f1857f37e3f9b6ea1b2426", size = 219289, upload-time = "2025-08-23T14:42:39.827Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ac/46645ef6be543f2e7de08cc2601a0b67e130c816be3b749ab741be689fb9/coverage-7.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:b45264dd450a10f9e03237b41a9a24e85cbb1e278e5a32adb1a303f58f0017f3", size = 220199, upload-time = "2025-08-23T14:42:41.363Z" }, + { url = "https://files.pythonhosted.org/packages/08/b6/fff6609354deba9aeec466e4bcaeb9d1ed3e5d60b14b57df2a36fb2273f2/coverage-7.10.5-py3-none-any.whl", hash = "sha256:0be24d35e4db1d23d0db5c0f6a74a962e2ec83c426b5cac09f4234aadef38e4a", size = 208736, upload-time = "2025-08-23T14:42:43.145Z" }, ] [package.optional-dependencies] @@ -1145,7 +1145,7 @@ wheels = [ [[package]] name = "jupyter-server" -version = "2.16.0" +version = "2.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1157,7 +1157,7 @@ dependencies = [ { name = "jupyter-server-terminals" }, { name = "nbconvert" }, { name = "nbformat" }, - { name = "overrides" }, + { name = "overrides", marker = "python_full_version < '3.12'" }, { name = "packaging" }, { name = "prometheus-client" }, { name = "pywinpty", marker = "os_name == 'nt'" }, @@ -1168,9 +1168,9 @@ dependencies = [ { name = "traitlets" }, { name = "websocket-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/c8/ba2bbcd758c47f1124c4ca14061e8ce60d9c6fd537faee9534a95f83521a/jupyter_server-2.16.0.tar.gz", hash = "sha256:65d4b44fdf2dcbbdfe0aa1ace4a842d4aaf746a2b7b168134d5aaed35621b7f6", size = 728177, upload-time = "2025-05-12T16:44:46.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5", size = 731949, upload-time = "2025-08-21T14:42:54.042Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/1f/5ebbced977171d09a7b0c08a285ff9a20aafb9c51bde07e52349ff1ddd71/jupyter_server-2.16.0-py3-none-any.whl", hash = "sha256:3d8db5be3bc64403b1c65b400a1d7f4647a5ce743f3b20dbdefe8ddb7b55af9e", size = 386904, upload-time = "2025-05-12T16:44:43.335Z" }, + { url = "https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f", size = 388221, upload-time = "2025-08-21T14:42:52.034Z" }, ] [[package]] @@ -1350,7 +1350,7 @@ dev = [ [[package]] name = "langgraph-api" -version = "0.2.135" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cloudpickle", marker = "python_full_version >= '3.11'" }, @@ -1373,9 +1373,9 @@ dependencies = [ { name = "uvicorn", marker = "python_full_version >= '3.11'" }, { name = "watchfiles", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/1e/5ca12f00852e2f54075c65dc2d4eca4d2d8facd404d5c0d17803fe620eae/langgraph_api-0.2.135.tar.gz", hash = "sha256:8cbcd5ff7be89a72d01dd3b32b0873bc5114ab9ff206fc94c2781ba56d09182a", size = 255563, upload-time = "2025-08-20T01:02:01.661Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/c5/1bcaf07f3f973a4a540bd341f20dfc60f0fc3cac8e7c2dc606680cb1d11e/langgraph_api-0.4.1.tar.gz", hash = "sha256:6f12b8be914ad9a9f11e3b73278fc90aeb7b4988b0418afbdf686c6fd5577c74", size = 1579764, upload-time = "2025-08-26T12:23:48.172Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/98/18c475de127927622079e087b7cfe1ab97ed44fe1a2425f8c8de07ea0e64/langgraph_api-0.2.135-py3-none-any.whl", hash = "sha256:ac78035075230ccb816f48b242a76c5f8e607c074fe7802928425ba76a11b3f4", size = 205849, upload-time = "2025-08-20T01:02:00.156Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/b36e6035b52e06a9c0bd04030255a03b2444c9d2cad347b96193674cf4f5/langgraph_api-0.4.1-py3-none-any.whl", hash = "sha256:1f5f8d33bca30200e954e81416f4de26bce173a7f2e623b1e509d1b8a44b49a3", size = 1536988, upload-time = "2025-08-26T12:23:45.834Z" }, ] [[package]] @@ -1491,8 +1491,8 @@ inmem = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.1.7" }, - { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.4.0" }, - { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.8" }, + { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.3,<0.5.0" }, + { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.7" }, { name = "langgraph-sdk", marker = "python_full_version >= '3.11'", specifier = ">=0.1.0" }, { name = "python-dotenv", marker = "extra == 'inmem'", specifier = ">=0.8.0" }, ] @@ -1543,7 +1543,7 @@ dev = [ [[package]] name = "langgraph-runtime-inmem" -version = "0.8.0" +version = "0.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "blockbuster", marker = "python_full_version >= '3.11'" }, @@ -1553,9 +1553,9 @@ dependencies = [ { name = "starlette", marker = "python_full_version >= '3.11'" }, { name = "structlog", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/94/02b58b1c137cfca6507f6c495e5794fd542b1f5269ef89fb662799be4b8c/langgraph_runtime_inmem-0.8.0.tar.gz", hash = "sha256:3082273f65650665b4a3875241721087fd51e675eb0227b18dc271839ce99594", size = 79510, upload-time = "2025-08-18T09:00:09.162Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/88/e5a0a776b2db76c114e3dc67eaa79135f008cc23c1af0802069acd9272d6/langgraph_runtime_inmem-0.9.0.tar.gz", hash = "sha256:7c5adfc98a5cce77c9d8413f606ce6edce315d15e4617a1191e066a0afe38802", size = 81401, upload-time = "2025-08-26T01:02:10.709Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/0e/b09c1aff0bcfdb1357be212b4a5d55f5b98644eae7fab6b115aa463e99fa/langgraph_runtime_inmem-0.8.0-py3-none-any.whl", hash = "sha256:85398321fc186618b0957c4d8629cc059fce2e7f57a4756ef83a75575791da1b", size = 31626, upload-time = "2025-08-18T09:00:08.256Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e5/8da2e1cc9a97750a346b21b81fc52d2d4127c226775a3071436d6c67e97b/langgraph_runtime_inmem-0.9.0-py3-none-any.whl", hash = "sha256:541e3666d37038f15fa6c2fe34667ae649fd79913de50720241f4017f8b7b946", size = 33479, upload-time = "2025-08-26T01:02:09.522Z" }, ] [[package]] @@ -1585,7 +1585,7 @@ dev = [ [[package]] name = "langsmith" -version = "0.4.14" +version = "0.4.17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -1596,9 +1596,9 @@ dependencies = [ { name = "requests-toolbelt" }, { name = "zstandard" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/b0/1def3c6d12eb5e412213e39f1ba4ac64a47ec3102cf42a3a1ff86af1402d/langsmith-0.4.14.tar.gz", hash = "sha256:4d29c7a9c85b20ba813ab9c855407bccdf5eb4f397f512ffa89959b2a2cb83ed", size = 921872, upload-time = "2025-08-12T20:39:43.704Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/6e/6a76eed14cbf43db79030f8e348de2fdad904334967df34d1c162641679c/langsmith-0.4.17.tar.gz", hash = "sha256:c91e218cd96ee9a310f4685ea7f2b958a54aec919f0f368e694f42431e32c422", size = 931257, upload-time = "2025-08-26T01:42:47.394Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/08/3f0fb3e2f7cc6fd91c4d06d7abc6607425a66973bee79d04018bac41dd4f/langsmith-0.4.14-py3-none-any.whl", hash = "sha256:b6d070ac425196947d2a98126fb0e35f3b8c001a2e6e5b7049dd1c56f0767d0b", size = 373249, upload-time = "2025-08-12T20:39:41.992Z" }, + { url = "https://files.pythonhosted.org/packages/d3/4c/6f9106237cbeb193e3138393f7134310a38e0db9e6acfc1f43567dfa0559/langsmith-0.4.17-py3-none-any.whl", hash = "sha256:b824ef6a3a0669faf2bc61799e22af0b05a3a53d12cb9a448f611f861a69e991", size = 376351, upload-time = "2025-08-26T01:42:45.101Z" }, ] [[package]] @@ -2022,11 +2022,11 @@ wheels = [ [[package]] name = "parso" -version = "0.8.4" +version = "0.8.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload-time = "2024-04-05T09:43:55.897Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload-time = "2025-08-23T15:15:28.028Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" }, + { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, ] [[package]] @@ -2659,90 +2659,90 @@ wheels = [ [[package]] name = "pyzmq" -version = "27.0.1" +version = "27.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/5f/557d2032a2f471edbcc227da724c24a1c05887b5cda1e3ae53af98b9e0a5/pyzmq-27.0.1.tar.gz", hash = "sha256:45c549204bc20e7484ffd2555f6cf02e572440ecf2f3bdd60d4404b20fddf64b", size = 281158, upload-time = "2025-08-03T05:05:40.352Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/66/159f38d184f08b5f971b467f87b1ab142ab1320d5200825c824b32b84b66/pyzmq-27.0.2.tar.gz", hash = "sha256:b398dd713b18de89730447347e96a0240225e154db56e35b6bb8447ffdb07798", size = 281440, upload-time = "2025-08-21T04:23:26.334Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/0b/ccf4d0b152a6a11f0fc01e73978202fe0e8fe0e91e20941598e83a170bee/pyzmq-27.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:90a4da42aa322de8a3522461e3b5fe999935763b27f69a02fced40f4e3cf9682", size = 1329293, upload-time = "2025-08-03T05:02:56.001Z" }, - { url = "https://files.pythonhosted.org/packages/bc/76/48706d291951b1300d3cf985e503806901164bf1581f27c4b6b22dbab2fa/pyzmq-27.0.1-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e648dca28178fc879c814cf285048dd22fd1f03e1104101106505ec0eea50a4d", size = 905953, upload-time = "2025-08-03T05:02:59.061Z" }, - { url = "https://files.pythonhosted.org/packages/aa/8a/df3135b96712068d184c53120c7dbf3023e5e362a113059a4f85cd36c6a0/pyzmq-27.0.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bca8abc31799a6f3652d13f47e0b0e1cab76f9125f2283d085a3754f669b607", size = 666165, upload-time = "2025-08-03T05:03:00.789Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ed/341a7148e08d2830f480f53ab3d136d88fc5011bb367b516d95d0ebb46dd/pyzmq-27.0.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:092f4011b26d6b0201002f439bd74b38f23f3aefcb358621bdc3b230afc9b2d5", size = 853756, upload-time = "2025-08-03T05:03:03.347Z" }, - { url = "https://files.pythonhosted.org/packages/c2/bc/d26fe010477c3e901f0f5a3e70446950dde9aa217f1d1a13534eb0fccfe5/pyzmq-27.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f02f30a4a6b3efe665ab13a3dd47109d80326c8fd286311d1ba9f397dc5f247", size = 1654870, upload-time = "2025-08-03T05:03:05.331Z" }, - { url = "https://files.pythonhosted.org/packages/32/21/9b488086bf3f55b2eb26db09007a3962f62f3b81c5c6295a6ff6aaebd69c/pyzmq-27.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f293a1419266e3bf3557d1f8778f9e1ffe7e6b2c8df5c9dca191caf60831eb74", size = 2033444, upload-time = "2025-08-03T05:03:07.318Z" }, - { url = "https://files.pythonhosted.org/packages/3d/53/85b64a792223cd43393d25e03c8609df41aac817ea5ce6a27eceeed433ee/pyzmq-27.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ce181dd1a7c6c012d0efa8ab603c34b5ee9d86e570c03415bbb1b8772eeb381c", size = 1891289, upload-time = "2025-08-03T05:03:08.96Z" }, - { url = "https://files.pythonhosted.org/packages/23/5b/078aae8fe1c4cdba1a77a598870c548fd52b4d4a11e86b8116bbef47d9f3/pyzmq-27.0.1-cp310-cp310-win32.whl", hash = "sha256:f65741cc06630652e82aa68ddef4986a3ab9073dd46d59f94ce5f005fa72037c", size = 566693, upload-time = "2025-08-03T05:03:10.711Z" }, - { url = "https://files.pythonhosted.org/packages/24/e1/4471fff36416ebf1ffe43577b9c7dcf2ff4798f2171f0d169640a48d2305/pyzmq-27.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:44909aa3ed2234d69fe81e1dade7be336bcfeab106e16bdaa3318dcde4262b93", size = 631649, upload-time = "2025-08-03T05:03:12.232Z" }, - { url = "https://files.pythonhosted.org/packages/e8/4c/8edac8dd56f223124aa40403d2c097bbad9b0e2868a67cad9a2a029863aa/pyzmq-27.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:4401649bfa0a38f0f8777f8faba7cd7eb7b5b8ae2abc7542b830dd09ad4aed0d", size = 559274, upload-time = "2025-08-03T05:03:13.728Z" }, - { url = "https://files.pythonhosted.org/packages/ae/18/a8e0da6ababbe9326116fb1c890bf1920eea880e8da621afb6bc0f39a262/pyzmq-27.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9729190bd770314f5fbba42476abf6abe79a746eeda11d1d68fd56dd70e5c296", size = 1332721, upload-time = "2025-08-03T05:03:15.237Z" }, - { url = "https://files.pythonhosted.org/packages/75/a4/9431ba598651d60ebd50dc25755402b770322cf8432adcc07d2906e53a54/pyzmq-27.0.1-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:696900ef6bc20bef6a242973943574f96c3f97d2183c1bd3da5eea4f559631b1", size = 908249, upload-time = "2025-08-03T05:03:16.933Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/e624e1793689e4e685d2ee21c40277dd4024d9d730af20446d88f69be838/pyzmq-27.0.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f96a63aecec22d3f7fdea3c6c98df9e42973f5856bb6812c3d8d78c262fee808", size = 668649, upload-time = "2025-08-03T05:03:18.49Z" }, - { url = "https://files.pythonhosted.org/packages/6c/29/0652a39d4e876e0d61379047ecf7752685414ad2e253434348246f7a2a39/pyzmq-27.0.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c512824360ea7490390566ce00bee880e19b526b312b25cc0bc30a0fe95cb67f", size = 856601, upload-time = "2025-08-03T05:03:20.194Z" }, - { url = "https://files.pythonhosted.org/packages/36/2d/8d5355d7fc55bb6e9c581dd74f58b64fa78c994079e3a0ea09b1b5627cde/pyzmq-27.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dfb2bb5e0f7198eaacfb6796fb0330afd28f36d985a770745fba554a5903595a", size = 1657750, upload-time = "2025-08-03T05:03:22.055Z" }, - { url = "https://files.pythonhosted.org/packages/ab/f4/cd032352d5d252dc6f5ee272a34b59718ba3af1639a8a4ef4654f9535cf5/pyzmq-27.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4f6886c59ba93ffde09b957d3e857e7950c8fe818bd5494d9b4287bc6d5bc7f1", size = 2034312, upload-time = "2025-08-03T05:03:23.578Z" }, - { url = "https://files.pythonhosted.org/packages/e4/1a/c050d8b6597200e97a4bd29b93c769d002fa0b03083858227e0376ad59bc/pyzmq-27.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b99ea9d330e86ce1ff7f2456b33f1bf81c43862a5590faf4ef4ed3a63504bdab", size = 1893632, upload-time = "2025-08-03T05:03:25.167Z" }, - { url = "https://files.pythonhosted.org/packages/6a/29/173ce21d5097e7fcf284a090e8beb64fc683c6582b1f00fa52b1b7e867ce/pyzmq-27.0.1-cp311-cp311-win32.whl", hash = "sha256:571f762aed89025ba8cdcbe355fea56889715ec06d0264fd8b6a3f3fa38154ed", size = 566587, upload-time = "2025-08-03T05:03:26.769Z" }, - { url = "https://files.pythonhosted.org/packages/53/ab/22bd33e7086f0a2cc03a5adabff4bde414288bb62a21a7820951ef86ec20/pyzmq-27.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee16906c8025fa464bea1e48128c048d02359fb40bebe5333103228528506530", size = 632873, upload-time = "2025-08-03T05:03:28.685Z" }, - { url = "https://files.pythonhosted.org/packages/90/14/3e59b4a28194285ceeff725eba9aa5ba8568d1cb78aed381dec1537c705a/pyzmq-27.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:ba068f28028849da725ff9185c24f832ccf9207a40f9b28ac46ab7c04994bd41", size = 558918, upload-time = "2025-08-03T05:03:30.085Z" }, - { url = "https://files.pythonhosted.org/packages/0e/9b/c0957041067c7724b310f22c398be46399297c12ed834c3bc42200a2756f/pyzmq-27.0.1-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:af7ebce2a1e7caf30c0bb64a845f63a69e76a2fadbc1cac47178f7bb6e657bdd", size = 1305432, upload-time = "2025-08-03T05:03:32.177Z" }, - { url = "https://files.pythonhosted.org/packages/8e/55/bd3a312790858f16b7def3897a0c3eb1804e974711bf7b9dcb5f47e7f82c/pyzmq-27.0.1-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8f617f60a8b609a13099b313e7e525e67f84ef4524b6acad396d9ff153f6e4cd", size = 895095, upload-time = "2025-08-03T05:03:33.918Z" }, - { url = "https://files.pythonhosted.org/packages/20/50/fc384631d8282809fb1029a4460d2fe90fa0370a0e866a8318ed75c8d3bb/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d59dad4173dc2a111f03e59315c7bd6e73da1a9d20a84a25cf08325b0582b1a", size = 651826, upload-time = "2025-08-03T05:03:35.818Z" }, - { url = "https://files.pythonhosted.org/packages/7e/0a/2356305c423a975000867de56888b79e44ec2192c690ff93c3109fd78081/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5b6133c8d313bde8bd0d123c169d22525300ff164c2189f849de495e1344577", size = 839751, upload-time = "2025-08-03T05:03:37.265Z" }, - { url = "https://files.pythonhosted.org/packages/d7/1b/81e95ad256ca7e7ccd47f5294c1c6da6e2b64fbace65b84fe8a41470342e/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:58cca552567423f04d06a075f4b473e78ab5bdb906febe56bf4797633f54aa4e", size = 1641359, upload-time = "2025-08-03T05:03:38.799Z" }, - { url = "https://files.pythonhosted.org/packages/50/63/9f50ec965285f4e92c265c8f18344e46b12803666d8b73b65d254d441435/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:4b9d8e26fb600d0d69cc9933e20af08552e97cc868a183d38a5c0d661e40dfbb", size = 2020281, upload-time = "2025-08-03T05:03:40.338Z" }, - { url = "https://files.pythonhosted.org/packages/02/4a/19e3398d0dc66ad2b463e4afa1fc541d697d7bc090305f9dfb948d3dfa29/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2329f0c87f0466dce45bba32b63f47018dda5ca40a0085cc5c8558fea7d9fc55", size = 1877112, upload-time = "2025-08-03T05:03:42.012Z" }, - { url = "https://files.pythonhosted.org/packages/bf/42/c562e9151aa90ed1d70aac381ea22a929d6b3a2ce4e1d6e2e135d34fd9c6/pyzmq-27.0.1-cp312-abi3-win32.whl", hash = "sha256:57bb92abdb48467b89c2d21da1ab01a07d0745e536d62afd2e30d5acbd0092eb", size = 558177, upload-time = "2025-08-03T05:03:43.979Z" }, - { url = "https://files.pythonhosted.org/packages/40/96/5c50a7d2d2b05b19994bf7336b97db254299353dd9b49b565bb71b485f03/pyzmq-27.0.1-cp312-abi3-win_amd64.whl", hash = "sha256:ff3f8757570e45da7a5bedaa140489846510014f7a9d5ee9301c61f3f1b8a686", size = 618923, upload-time = "2025-08-03T05:03:45.438Z" }, - { url = "https://files.pythonhosted.org/packages/13/33/1ec89c8f21c89d21a2eaff7def3676e21d8248d2675705e72554fb5a6f3f/pyzmq-27.0.1-cp312-abi3-win_arm64.whl", hash = "sha256:df2c55c958d3766bdb3e9d858b911288acec09a9aab15883f384fc7180df5bed", size = 552358, upload-time = "2025-08-03T05:03:46.887Z" }, - { url = "https://files.pythonhosted.org/packages/6c/a0/f26e276211ec8090a4d11e4ec70eb8a8b15781e591c1d44ce62f372963a0/pyzmq-27.0.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:497bd8af534ae55dc4ef67eebd1c149ff2a0b0f1e146db73c8b5a53d83c1a5f5", size = 1122287, upload-time = "2025-08-03T05:03:48.838Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d8/af4b507e4f7eeea478cc8ee873995a6fd55582bfb99140593ed460e1db3c/pyzmq-27.0.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:a066ea6ad6218b4c233906adf0ae67830f451ed238419c0db609310dd781fbe7", size = 1155756, upload-time = "2025-08-03T05:03:50.907Z" }, - { url = "https://files.pythonhosted.org/packages/ac/55/37fae0013e11f88681da42698e550b08a316d608242551f65095cc99232a/pyzmq-27.0.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:72d235d6365ca73d8ce92f7425065d70f5c1e19baa458eb3f0d570e425b73a96", size = 1340826, upload-time = "2025-08-03T05:03:52.568Z" }, - { url = "https://files.pythonhosted.org/packages/f2/e4/3a87854c64b26fcf63a9d1b6f4382bd727d4797c772ceb334a97b7489be9/pyzmq-27.0.1-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:313a7b374e3dc64848644ca348a51004b41726f768b02e17e689f1322366a4d9", size = 897283, upload-time = "2025-08-03T05:03:54.167Z" }, - { url = "https://files.pythonhosted.org/packages/17/3e/4296c6b0ad2d07be11ae1395dccf9cae48a0a655cf9be1c3733ad2b591d1/pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:119ce8590409702394f959c159d048002cbed2f3c0645ec9d6a88087fc70f0f1", size = 660565, upload-time = "2025-08-03T05:03:56.152Z" }, - { url = "https://files.pythonhosted.org/packages/72/41/a33ba3aa48b45b23c4cd4ac49aafde46f3e0f81939f2bfb3b6171a437122/pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45c3e00ce16896ace2cd770ab9057a7cf97d4613ea5f2a13f815141d8b6894b9", size = 847680, upload-time = "2025-08-03T05:03:57.696Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8c/bf2350bb25b3b58d2e5b5d2290ffab0e923f0cc6d02288d3fbf4baa6e4d1/pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:678e50ec112bdc6df5a83ac259a55a4ba97a8b314c325ab26b3b5b071151bc61", size = 1650151, upload-time = "2025-08-03T05:03:59.387Z" }, - { url = "https://files.pythonhosted.org/packages/f7/1a/a5a07c54890891344a8ddc3d5ab320dd3c4e39febb6e4472546e456d5157/pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d0b96c30be9f9387b18b18b6133c75a7b1b0065da64e150fe1feb5ebf31ece1c", size = 2023766, upload-time = "2025-08-03T05:04:01.883Z" }, - { url = "https://files.pythonhosted.org/packages/62/5e/514dcff08f02c6c8a45a6e23621901139cf853be7ac5ccd0b9407c3aa3de/pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88dc92d9eb5ea4968123e74db146d770b0c8d48f0e2bfb1dbc6c50a8edb12d64", size = 1885195, upload-time = "2025-08-03T05:04:03.923Z" }, - { url = "https://files.pythonhosted.org/packages/c8/91/87f74f98a487fbef0b115f6025e4a295129fd56b2b633a03ba7d5816ecc2/pyzmq-27.0.1-cp313-cp313t-win32.whl", hash = "sha256:6dcbcb34f5c9b0cefdfc71ff745459241b7d3cda5b27c7ad69d45afc0821d1e1", size = 574213, upload-time = "2025-08-03T05:04:05.905Z" }, - { url = "https://files.pythonhosted.org/packages/e6/d7/07f7d0d7f4c81e08be7b60e52ff2591c557377c017f96204d33d5fca1b07/pyzmq-27.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9fd0fda730461f510cfd9a40fafa5355d65f5e3dbdd8d6dfa342b5b3f5d1949", size = 640202, upload-time = "2025-08-03T05:04:07.439Z" }, - { url = "https://files.pythonhosted.org/packages/ab/83/21d66bcef6fb803647a223cbde95111b099e2176277c0cbc8b099c485510/pyzmq-27.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:56a3b1853f3954ec1f0e91085f1350cc57d18f11205e4ab6e83e4b7c414120e0", size = 561514, upload-time = "2025-08-03T05:04:09.071Z" }, - { url = "https://files.pythonhosted.org/packages/5a/0b/d5ea75cf46b52cdce85a85200c963cb498932953df443892238be49b1a01/pyzmq-27.0.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f98f6b7787bd2beb1f0dde03f23a0621a0c978edf673b7d8f5e7bc039cbe1b60", size = 1340836, upload-time = "2025-08-03T05:04:10.774Z" }, - { url = "https://files.pythonhosted.org/packages/be/4c/0dbce882550e17db6846b29e9dc242aea7590e7594e1ca5043e8e58fff2d/pyzmq-27.0.1-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:351bf5d8ca0788ca85327fda45843b6927593ff4c807faee368cc5aaf9f809c2", size = 897236, upload-time = "2025-08-03T05:04:13.221Z" }, - { url = "https://files.pythonhosted.org/packages/1b/22/461e131cf16b8814f3c356fa1ea0912697dbc4c64cddf01f7756ec704c1e/pyzmq-27.0.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5268a5a9177afff53dc6d70dffe63114ba2a6e7b20d9411cc3adeba09eeda403", size = 660374, upload-time = "2025-08-03T05:04:15.032Z" }, - { url = "https://files.pythonhosted.org/packages/3f/0c/bbd65a814395bf4fc3e57c6c13af27601c07e4009bdfb75ebcf500537bbd/pyzmq-27.0.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4aca06ba295aa78bec9b33ec028d1ca08744c36294338c41432b7171060c808", size = 847497, upload-time = "2025-08-03T05:04:16.967Z" }, - { url = "https://files.pythonhosted.org/packages/1e/df/3d1f4a03b561d824cbd491394f67591957e2f1acf6dc85d96f970312a76a/pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1c363c6dc66352331d5ad64bb838765c6692766334a6a02fdb05e76bd408ae18", size = 1650028, upload-time = "2025-08-03T05:04:19.398Z" }, - { url = "https://files.pythonhosted.org/packages/41/c9/a3987540f59a412bdaae3f362f78e00e6769557a598c63b7e32956aade5a/pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:87aebf4acd7249bdff8d3df03aed4f09e67078e6762cfe0aecf8d0748ff94cde", size = 2023808, upload-time = "2025-08-03T05:04:21.145Z" }, - { url = "https://files.pythonhosted.org/packages/b0/a5/c388f4cd80498a8eaef7535f2a8eaca0a35b82b87a0b47fa1856fc135004/pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e4f22d67756518d71901edf73b38dc0eb4765cce22c8fe122cc81748d425262b", size = 1884970, upload-time = "2025-08-03T05:04:22.908Z" }, - { url = "https://files.pythonhosted.org/packages/9a/ac/b2a89a1ed90526a1b9a260cdc5cd42f055fd44ee8d2a59902b5ac35ddeb1/pyzmq-27.0.1-cp314-cp314t-win32.whl", hash = "sha256:8c62297bc7aea2147b472ca5ca2b4389377ad82898c87cabab2a94aedd75e337", size = 586905, upload-time = "2025-08-03T05:04:24.492Z" }, - { url = "https://files.pythonhosted.org/packages/68/62/7aa5ea04e836f7a788b2a67405f83011cef59ca76d7bac91d1fc9a0476da/pyzmq-27.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:bee5248d5ec9223545f8cc4f368c2d571477ae828c99409125c3911511d98245", size = 660503, upload-time = "2025-08-03T05:04:26.382Z" }, - { url = "https://files.pythonhosted.org/packages/89/32/3836ed85947b06f1d67c07ce16c00b0cf8c053ab0b249d234f9f81ff95ff/pyzmq-27.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0fc24bf45e4a454e55ef99d7f5c8b8712539200ce98533af25a5bfa954b6b390", size = 575098, upload-time = "2025-08-03T05:04:27.974Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f1/cdceaf9b6637570f36eee2dbd25bc5a800637cd9b4103b15fbc4b0658b82/pyzmq-27.0.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:05a94233fdde585eb70924a6e4929202a747eea6ed308a6171c4f1c715bbe39e", size = 1330651, upload-time = "2025-08-03T05:04:45.583Z" }, - { url = "https://files.pythonhosted.org/packages/74/5c/469d3b9315eb4d5c61c431a4ae8acdb6abb165dfa5ddbc7af639be53891c/pyzmq-27.0.1-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c96702e1082eab62ae583d64c4e19c9b848359196697e536a0c57ae9bd165bd5", size = 906524, upload-time = "2025-08-03T05:04:47.904Z" }, - { url = "https://files.pythonhosted.org/packages/ed/c0/c7a12a533a87beb1143f4a9c8f4d6f82775c04eb3ad27f664e0ef00a6189/pyzmq-27.0.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c9180d1f5b4b73e28b64e63cc6c4c097690f102aa14935a62d5dd7426a4e5b5a", size = 863547, upload-time = "2025-08-03T05:04:49.579Z" }, - { url = "https://files.pythonhosted.org/packages/41/78/50907d004511bd23eae03d951f3ca4e4cc2e7eb5ec8d3df70d89eca3f97c/pyzmq-27.0.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e971d8680003d0af6020713e52f92109b46fedb463916e988814e04c8133578a", size = 666797, upload-time = "2025-08-03T05:04:51.263Z" }, - { url = "https://files.pythonhosted.org/packages/67/bd/ec3388888eda39705a4cefb465452a4bca5430a3435803588ced49943fdb/pyzmq-27.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe632fa4501154d58dfbe1764a0495734d55f84eaf1feda4549a1f1ca76659e9", size = 1655601, upload-time = "2025-08-03T05:04:53.026Z" }, - { url = "https://files.pythonhosted.org/packages/84/50/170a1671a171365dda677886d42c39629a086752696ede70296b8f6224d8/pyzmq-27.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4c3874344fd5fa6d58bb51919708048ac4cab21099f40a227173cddb76b4c20b", size = 2034120, upload-time = "2025-08-03T05:04:55.323Z" }, - { url = "https://files.pythonhosted.org/packages/a4/0a/f06841495e4ec33ed65588e94aff07f1dcbc6878e1611577f6b97a449068/pyzmq-27.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ec09073ed67ae236785d543df3b322282acc0bdf6d1b748c3e81f3043b21cb5", size = 1891956, upload-time = "2025-08-03T05:04:57.084Z" }, - { url = "https://files.pythonhosted.org/packages/d9/6b/6ba945a4756e4b1ba69b909d2b040d16aff0f0edd56a60874970b8d47237/pyzmq-27.0.1-cp39-cp39-win32.whl", hash = "sha256:f44e7ea288d022d4bf93b9e79dafcb4a7aea45a3cbeae2116792904931cefccf", size = 567388, upload-time = "2025-08-03T05:04:58.704Z" }, - { url = "https://files.pythonhosted.org/packages/b0/b4/8ffb9cfb363bc9d61c5d8d9f79a7ada572b0865dac9f4a547da901b81d76/pyzmq-27.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ffe6b809a97ac6dea524b3b837d5b28743d8c2f121141056d168ff0ba8f614ef", size = 632004, upload-time = "2025-08-03T05:05:00.434Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4b/dd5c4d3bb7261efb30a909d2df447ac77393653e5c34c8a9cd536f429c3e/pyzmq-27.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:fde26267416c8478c95432c81489b53f57b0b5d24cd5c8bfaebf5bbaac4dc90c", size = 559881, upload-time = "2025-08-03T05:05:02.363Z" }, - { url = "https://files.pythonhosted.org/packages/6f/87/fc96f224dd99070fe55d0afc37ac08d7d4635d434e3f9425b232867e01b9/pyzmq-27.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:544b995a6a1976fad5d7ff01409b4588f7608ccc41be72147700af91fd44875d", size = 835950, upload-time = "2025-08-03T05:05:04.193Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b6/802d96017f176c3a7285603d9ed2982550095c136c6230d3e0b53f52c7e5/pyzmq-27.0.1-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0f772eea55cccce7f45d6ecdd1d5049c12a77ec22404f6b892fae687faa87bee", size = 799876, upload-time = "2025-08-03T05:05:06.263Z" }, - { url = "https://files.pythonhosted.org/packages/4e/52/49045c6528007cce385f218f3a674dc84fc8b3265330d09e57c0a59b41f4/pyzmq-27.0.1-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9d63d66059114a6756d09169c9209ffceabacb65b9cb0f66e6fc344b20b73e6", size = 567402, upload-time = "2025-08-03T05:05:08.028Z" }, - { url = "https://files.pythonhosted.org/packages/bc/fe/c29ac0d5a817543ecf0cb18f17195805bad0da567a1c64644aacf11b2779/pyzmq-27.0.1-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1da8e645c655d86f0305fb4c65a0d848f461cd90ee07d21f254667287b5dbe50", size = 747030, upload-time = "2025-08-03T05:05:10.116Z" }, - { url = "https://files.pythonhosted.org/packages/17/d1/cc1fbfb65b4042016e4e035b2548cdfe0945c817345df83aa2d98490e7fc/pyzmq-27.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1843fd0daebcf843fe6d4da53b8bdd3fc906ad3e97d25f51c3fed44436d82a49", size = 544567, upload-time = "2025-08-03T05:05:11.856Z" }, - { url = "https://files.pythonhosted.org/packages/b4/1a/49f66fe0bc2b2568dd4280f1f520ac8fafd73f8d762140e278d48aeaf7b9/pyzmq-27.0.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7fb0ee35845bef1e8c4a152d766242164e138c239e3182f558ae15cb4a891f94", size = 835949, upload-time = "2025-08-03T05:05:13.798Z" }, - { url = "https://files.pythonhosted.org/packages/49/94/443c1984b397eab59b14dd7ae8bc2ac7e8f32dbc646474453afcaa6508c4/pyzmq-27.0.1-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f379f11e138dfd56c3f24a04164f871a08281194dd9ddf656a278d7d080c8ad0", size = 799875, upload-time = "2025-08-03T05:05:15.632Z" }, - { url = "https://files.pythonhosted.org/packages/30/f1/fd96138a0f152786a2ba517e9c6a8b1b3516719e412a90bb5d8eea6b660c/pyzmq-27.0.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b978c0678cffbe8860ec9edc91200e895c29ae1ac8a7085f947f8e8864c489fb", size = 567403, upload-time = "2025-08-03T05:05:17.326Z" }, - { url = "https://files.pythonhosted.org/packages/16/57/34e53ef2b55b1428dac5aabe3a974a16c8bda3bf20549ba500e3ff6cb426/pyzmq-27.0.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ebccf0d760bc92a4a7c751aeb2fef6626144aace76ee8f5a63abeb100cae87f", size = 747032, upload-time = "2025-08-03T05:05:19.074Z" }, - { url = "https://files.pythonhosted.org/packages/81/b7/769598c5ae336fdb657946950465569cf18803140fe89ce466d7f0a57c11/pyzmq-27.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:77fed80e30fa65708546c4119840a46691290efc231f6bfb2ac2a39b52e15811", size = 544566, upload-time = "2025-08-03T05:05:20.798Z" }, - { url = "https://files.pythonhosted.org/packages/60/8d/c0880acd2d5908eec6fe9b399f0fb630e5f203f8a69f82442d5cb2b2f46c/pyzmq-27.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d97b59cbd8a6c8b23524a8ce237ff9504d987dc07156258aa68ae06d2dd5f34d", size = 835946, upload-time = "2025-08-03T05:05:31.161Z" }, - { url = "https://files.pythonhosted.org/packages/c1/35/6b71409aa6629b3d4917b38961501898827f4fb5ddc680cc8e0cb13987f3/pyzmq-27.0.1-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:27a78bdd384dbbe7b357af95f72efe8c494306b5ec0a03c31e2d53d6763e5307", size = 799870, upload-time = "2025-08-03T05:05:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/16/f6/5d36d8f6571478f32c32f5872abd76eda052746283ca87e24cc5758f7987/pyzmq-27.0.1-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b007e5dcba684e888fbc90554cb12a2f4e492927c8c2761a80b7590209821743", size = 758371, upload-time = "2025-08-03T05:05:34.722Z" }, - { url = "https://files.pythonhosted.org/packages/6f/29/6a7b7f5d47712487d8a3516584a4a484a0147f2537228237397793b2de69/pyzmq-27.0.1-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:95594b2ceeaa94934e3e94dd7bf5f3c3659cf1a26b1fb3edcf6e42dad7e0eaf2", size = 567395, upload-time = "2025-08-03T05:05:36.701Z" }, - { url = "https://files.pythonhosted.org/packages/eb/37/c1f26d13e9d4c3bfce42fead8ff640f6c06a58decde49a6b295b9d52cefd/pyzmq-27.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:70b719a130b81dd130a57ac0ff636dc2c0127c5b35ca5467d1b67057e3c7a4d2", size = 544561, upload-time = "2025-08-03T05:05:38.608Z" }, + { url = "https://files.pythonhosted.org/packages/83/4d/2081cd7e41e340004d2051821efe1d0d67d31bdb5ac33bffc7e628d5f1bd/pyzmq-27.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:8b32c4636ced87dce0ac3d671e578b3400215efab372f1b4be242e8cf0b11384", size = 1329839, upload-time = "2025-08-21T04:20:55.8Z" }, + { url = "https://files.pythonhosted.org/packages/ad/f1/1300b7e932671e31accb3512c19b43e6a3e8d08c54ab8b920308e53427ce/pyzmq-27.0.2-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f9528a4b3e24189cb333a9850fddbbafaa81df187297cfbddee50447cdb042cf", size = 906367, upload-time = "2025-08-21T04:20:58.476Z" }, + { url = "https://files.pythonhosted.org/packages/e6/80/61662db85eb3255a58c1bb59f6d4fc0d31c9c75b9a14983deafab12b2329/pyzmq-27.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b02ba0c0b2b9ebe74688002e6c56c903429924a25630804b9ede1f178aa5a3f", size = 666545, upload-time = "2025-08-21T04:20:59.775Z" }, + { url = "https://files.pythonhosted.org/packages/5c/6e/49fb9c75b039978cbb1f3657811d8056b0ebe6ecafd78a4457fc6de19799/pyzmq-27.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4dc5c9a6167617251dea0d024d67559795761aabb4b7ea015518be898be076", size = 854219, upload-time = "2025-08-21T04:21:01.807Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3c/9951b302d221e471b7c659e70f9cb64db5f68fa3b7da45809ec4e6c6ef17/pyzmq-27.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f1151b33aaf3b4fa9da26f4d696e38eebab67d1b43c446184d733c700b3ff8ce", size = 1655103, upload-time = "2025-08-21T04:21:03.239Z" }, + { url = "https://files.pythonhosted.org/packages/88/ca/d7adea6100fdf7f87f3856db02d2a0a45ce2764b9f60ba08c48c655b762f/pyzmq-27.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4ecfc7999ac44c9ef92b5ae8f0b44fb935297977df54d8756b195a3cd12f38f0", size = 2033712, upload-time = "2025-08-21T04:21:05.121Z" }, + { url = "https://files.pythonhosted.org/packages/e9/63/b34e601b36ba4864d02ac1460443fc39bf533dedbdeead2a4e0df7dfc8ee/pyzmq-27.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31c26a5d0b00befcaeeb600d8b15ad09f5604b6f44e2057ec5e521a9e18dcd9a", size = 1891847, upload-time = "2025-08-21T04:21:06.586Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a2/9479e6af779da44f788d5fcda5f77dff1af988351ef91682b92524eab2db/pyzmq-27.0.2-cp310-cp310-win32.whl", hash = "sha256:25a100d2de2ac0c644ecf4ce0b509a720d12e559c77aff7e7e73aa684f0375bc", size = 567136, upload-time = "2025-08-21T04:21:07.885Z" }, + { url = "https://files.pythonhosted.org/packages/58/46/e1c2be469781fc56ba092fecb1bb336cedde0fd87d9e1a547aaeb5d1a968/pyzmq-27.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a1acf091f53bb406e9e5e7383e467d1dd1b94488b8415b890917d30111a1fef3", size = 631969, upload-time = "2025-08-21T04:21:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8d/d20a62f1f77e3f04633a80bb83df085e4314f0e9404619cc458d0005d6ab/pyzmq-27.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:b38e01f11e9e95f6668dc8a62dccf9483f454fed78a77447507a0e8dcbd19a63", size = 559459, upload-time = "2025-08-21T04:21:11.208Z" }, + { url = "https://files.pythonhosted.org/packages/42/73/034429ab0f4316bf433eb6c20c3f49d1dc13b2ed4e4d951b283d300a0f35/pyzmq-27.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:063845960df76599ad4fad69fa4d884b3ba38304272104fdcd7e3af33faeeb1d", size = 1333169, upload-time = "2025-08-21T04:21:12.483Z" }, + { url = "https://files.pythonhosted.org/packages/35/02/c42b3b526eb03a570c889eea85a5602797f800a50ba8b09ddbf7db568b78/pyzmq-27.0.2-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:845a35fb21b88786aeb38af8b271d41ab0967985410f35411a27eebdc578a076", size = 909176, upload-time = "2025-08-21T04:21:13.835Z" }, + { url = "https://files.pythonhosted.org/packages/1b/35/a1c0b988fabbdf2dc5fe94b7c2bcfd61e3533e5109297b8e0daf1d7a8d2d/pyzmq-27.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:515d20b5c3c86db95503faa989853a8ab692aab1e5336db011cd6d35626c4cb1", size = 668972, upload-time = "2025-08-21T04:21:15.315Z" }, + { url = "https://files.pythonhosted.org/packages/a0/63/908ac865da32ceaeecea72adceadad28ca25b23a2ca5ff018e5bff30116f/pyzmq-27.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:862aedec0b0684a5050cdb5ec13c2da96d2f8dffda48657ed35e312a4e31553b", size = 856962, upload-time = "2025-08-21T04:21:16.652Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5a/90b3cc20b65cdf9391896fcfc15d8db21182eab810b7ea05a2986912fbe2/pyzmq-27.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5bcfc51c7a4fce335d3bc974fd1d6a916abbcdd2b25f6e89d37b8def25f57", size = 1657712, upload-time = "2025-08-21T04:21:18.666Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3c/32a5a80f9be4759325b8d7b22ce674bb87e586b4c80c6a9d77598b60d6f0/pyzmq-27.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:38ff75b2a36e3a032e9fef29a5871e3e1301a37464e09ba364e3c3193f62982a", size = 2035054, upload-time = "2025-08-21T04:21:20.073Z" }, + { url = "https://files.pythonhosted.org/packages/13/61/71084fe2ff2d7dc5713f8740d735336e87544845dae1207a8e2e16d9af90/pyzmq-27.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a5709abe8d23ca158a9d0a18c037f4193f5b6afeb53be37173a41e9fb885792", size = 1894010, upload-time = "2025-08-21T04:21:21.96Z" }, + { url = "https://files.pythonhosted.org/packages/cb/6b/77169cfb13b696e50112ca496b2ed23c4b7d8860a1ec0ff3e4b9f9926221/pyzmq-27.0.2-cp311-cp311-win32.whl", hash = "sha256:47c5dda2018c35d87be9b83de0890cb92ac0791fd59498847fc4eca6ff56671d", size = 566819, upload-time = "2025-08-21T04:21:23.31Z" }, + { url = "https://files.pythonhosted.org/packages/37/cd/86c4083e0f811f48f11bc0ddf1e7d13ef37adfd2fd4f78f2445f1cc5dec0/pyzmq-27.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:f54ca3e98f8f4d23e989c7d0edcf9da7a514ff261edaf64d1d8653dd5feb0a8b", size = 633264, upload-time = "2025-08-21T04:21:24.761Z" }, + { url = "https://files.pythonhosted.org/packages/a0/69/5b8bb6a19a36a569fac02153a9e083738785892636270f5f68a915956aea/pyzmq-27.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:2ef3067cb5b51b090fb853f423ad7ed63836ec154374282780a62eb866bf5768", size = 559316, upload-time = "2025-08-21T04:21:26.1Z" }, + { url = "https://files.pythonhosted.org/packages/68/69/b3a729e7b03e412bee2b1823ab8d22e20a92593634f664afd04c6c9d9ac0/pyzmq-27.0.2-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:5da05e3c22c95e23bfc4afeee6ff7d4be9ff2233ad6cb171a0e8257cd46b169a", size = 1305910, upload-time = "2025-08-21T04:21:27.609Z" }, + { url = "https://files.pythonhosted.org/packages/15/b7/f6a6a285193d489b223c340b38ee03a673467cb54914da21c3d7849f1b10/pyzmq-27.0.2-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4e4520577971d01d47e2559bb3175fce1be9103b18621bf0b241abe0a933d040", size = 895507, upload-time = "2025-08-21T04:21:29.005Z" }, + { url = "https://files.pythonhosted.org/packages/17/e6/c4ed2da5ef9182cde1b1f5d0051a986e76339d71720ec1a00be0b49275ad/pyzmq-27.0.2-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d7de7bf73165b90bd25a8668659ccb134dd28449116bf3c7e9bab5cf8a8ec9", size = 652670, upload-time = "2025-08-21T04:21:30.71Z" }, + { url = "https://files.pythonhosted.org/packages/0e/66/d781ab0636570d32c745c4e389b1c6b713115905cca69ab6233508622edd/pyzmq-27.0.2-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:340e7cddc32f147c6c00d116a3f284ab07ee63dbd26c52be13b590520434533c", size = 840581, upload-time = "2025-08-21T04:21:32.008Z" }, + { url = "https://files.pythonhosted.org/packages/a6/df/f24790caf565d72544f5c8d8500960b9562c1dc848d6f22f3c7e122e73d4/pyzmq-27.0.2-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ba95693f9df8bb4a9826464fb0fe89033936f35fd4a8ff1edff09a473570afa0", size = 1641931, upload-time = "2025-08-21T04:21:33.371Z" }, + { url = "https://files.pythonhosted.org/packages/65/65/77d27b19fc5e845367f9100db90b9fce924f611b14770db480615944c9c9/pyzmq-27.0.2-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:ca42a6ce2d697537da34f77a1960d21476c6a4af3e539eddb2b114c3cf65a78c", size = 2021226, upload-time = "2025-08-21T04:21:35.301Z" }, + { url = "https://files.pythonhosted.org/packages/5b/65/1ed14421ba27a4207fa694772003a311d1142b7f543179e4d1099b7eb746/pyzmq-27.0.2-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3e44e665d78a07214b2772ccbd4b9bcc6d848d7895f1b2d7653f047b6318a4f6", size = 1878047, upload-time = "2025-08-21T04:21:36.749Z" }, + { url = "https://files.pythonhosted.org/packages/dd/dc/e578549b89b40dc78a387ec471c2a360766690c0a045cd8d1877d401012d/pyzmq-27.0.2-cp312-abi3-win32.whl", hash = "sha256:272d772d116615397d2be2b1417b3b8c8bc8671f93728c2f2c25002a4530e8f6", size = 558757, upload-time = "2025-08-21T04:21:38.2Z" }, + { url = "https://files.pythonhosted.org/packages/b5/89/06600980aefcc535c758414da969f37a5194ea4cdb73b745223f6af3acfb/pyzmq-27.0.2-cp312-abi3-win_amd64.whl", hash = "sha256:734be4f44efba0aa69bf5f015ed13eb69ff29bf0d17ea1e21588b095a3147b8e", size = 619281, upload-time = "2025-08-21T04:21:39.909Z" }, + { url = "https://files.pythonhosted.org/packages/30/84/df8a5c089552d17c9941d1aea4314b606edf1b1622361dae89aacedc6467/pyzmq-27.0.2-cp312-abi3-win_arm64.whl", hash = "sha256:41f0bd56d9279392810950feb2785a419c2920bbf007fdaaa7f4a07332ae492d", size = 552680, upload-time = "2025-08-21T04:21:41.571Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7b/b79e976508517ab80dc800f7021ef1fb602a6d55e4caa2d47fb3dca5d8b6/pyzmq-27.0.2-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:7f01118133427cd7f34ee133b5098e2af5f70303fa7519785c007bca5aa6f96a", size = 1122259, upload-time = "2025-08-21T04:21:43.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/1c/777217b9940ebcb7e71c924184ca5f31e410580a58d9fd93798589f0d31c/pyzmq-27.0.2-cp313-cp313-android_24_x86_64.whl", hash = "sha256:e4b860edf6379a7234ccbb19b4ed2c57e3ff569c3414fadfb49ae72b61a8ef07", size = 1156113, upload-time = "2025-08-21T04:21:44.566Z" }, + { url = "https://files.pythonhosted.org/packages/59/7d/654657a4c6435f41538182e71b61eac386a789a2bbb6f30171915253a9a7/pyzmq-27.0.2-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:cb77923ea163156da14295c941930bd525df0d29c96c1ec2fe3c3806b1e17cb3", size = 1341437, upload-time = "2025-08-21T04:21:46.019Z" }, + { url = "https://files.pythonhosted.org/packages/20/a0/5ed7710037f9c096017adc748bcb1698674a2d297f8b9422d38816f7b56a/pyzmq-27.0.2-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:61678b7407b04df8f9423f188156355dc94d0fb52d360ae79d02ed7e0d431eea", size = 897888, upload-time = "2025-08-21T04:21:47.362Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8a/6e4699a60931c17e7406641d201d7f2c121e2a38979bc83226a6d8f1ba32/pyzmq-27.0.2-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3c824b70925963bdc8e39a642672c15ffaa67e7d4b491f64662dd56d6271263", size = 660727, upload-time = "2025-08-21T04:21:48.734Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d8/d761e438c186451bd89ce63a665cde5690c084b61cd8f5d7b51e966e875a/pyzmq-27.0.2-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c4833e02fcf2751975457be1dfa2f744d4d09901a8cc106acaa519d868232175", size = 848136, upload-time = "2025-08-21T04:21:50.416Z" }, + { url = "https://files.pythonhosted.org/packages/43/f1/a0f31684efdf3eb92f46b7dd2117e752208115e89d278f8ca5f413c5bb85/pyzmq-27.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b18045668d09cf0faa44918af2a67f0dbbef738c96f61c2f1b975b1ddb92ccfc", size = 1650402, upload-time = "2025-08-21T04:21:52.235Z" }, + { url = "https://files.pythonhosted.org/packages/41/fd/0d7f2a1732812df02c85002770da4a7864c79b210084bcdab01ea57e8d92/pyzmq-27.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bbbb7e2f3ac5a22901324e7b086f398b8e16d343879a77b15ca3312e8cd8e6d5", size = 2024587, upload-time = "2025-08-21T04:21:54.07Z" }, + { url = "https://files.pythonhosted.org/packages/f1/73/358be69e279a382dd09e46dda29df8446365cddee4f79ef214e71e5b2b5a/pyzmq-27.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b751914a73604d40d88a061bab042a11d4511b3ddbb7624cd83c39c8a498564c", size = 1885493, upload-time = "2025-08-21T04:21:55.588Z" }, + { url = "https://files.pythonhosted.org/packages/c5/7b/e9951ad53b3dfed8cfb4c2cfd6e0097c9b454e5c0d0e6df5f2b60d7c8c3d/pyzmq-27.0.2-cp313-cp313t-win32.whl", hash = "sha256:3e8f833dd82af11db5321c414638045c70f61009f72dd61c88db4a713c1fb1d2", size = 574934, upload-time = "2025-08-21T04:21:57.52Z" }, + { url = "https://files.pythonhosted.org/packages/55/33/1a7fc3a92f2124a63e6e2a6afa0af471a5c0c713e776b476d4eda5111b13/pyzmq-27.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5b45153cb8eadcab14139970643a84f7a7b08dda541fbc1f6f4855c49334b549", size = 640932, upload-time = "2025-08-21T04:21:59.527Z" }, + { url = "https://files.pythonhosted.org/packages/2a/52/2598a94ac251a7c83f3887866225eea1952b0d4463a68df5032eb00ff052/pyzmq-27.0.2-cp313-cp313t-win_arm64.whl", hash = "sha256:86898f5c9730df23427c1ee0097d8aa41aa5f89539a79e48cd0d2c22d059f1b7", size = 561315, upload-time = "2025-08-21T04:22:01.295Z" }, + { url = "https://files.pythonhosted.org/packages/42/7d/10ef02ea36590b29d48ef88eb0831f0af3eb240cccca2752556faec55f59/pyzmq-27.0.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d2b4b261dce10762be5c116b6ad1f267a9429765b493c454f049f33791dd8b8a", size = 1341463, upload-time = "2025-08-21T04:22:02.712Z" }, + { url = "https://files.pythonhosted.org/packages/94/36/115d18dade9a3d4d3d08dd8bfe5459561b8e02815f99df040555fdd7768e/pyzmq-27.0.2-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4e4d88b6cff156fed468903006b24bbd85322612f9c2f7b96e72d5016fd3f543", size = 897840, upload-time = "2025-08-21T04:22:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/39/66/083b37839b95c386a95f1537bb41bdbf0c002b7c55b75ee737949cecb11f/pyzmq-27.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8426c0ebbc11ed8416a6e9409c194142d677c2c5c688595f2743664e356d9e9b", size = 660704, upload-time = "2025-08-21T04:22:06.389Z" }, + { url = "https://files.pythonhosted.org/packages/76/5a/196ab46e549ba35bf3268f575e10cfac0dc86b78dcaa7a3e36407ecda752/pyzmq-27.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565bee96a155fe6452caed5fb5f60c9862038e6b51a59f4f632562081cdb4004", size = 848037, upload-time = "2025-08-21T04:22:07.817Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/a27b9eb44b2e615a9ecb8510ebb023cc1d2d251181e4a1e50366bfbf94d6/pyzmq-27.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5de735c745ca5cefe9c2d1547d8f28cfe1b1926aecb7483ab1102fd0a746c093", size = 1650278, upload-time = "2025-08-21T04:22:09.269Z" }, + { url = "https://files.pythonhosted.org/packages/62/ac/3e9af036bfaf718ab5e69ded8f6332da392c5450ad43e8e3ca66797f145a/pyzmq-27.0.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ea4f498f8115fd90d7bf03a3e83ae3e9898e43362f8e8e8faec93597206e15cc", size = 2024504, upload-time = "2025-08-21T04:22:10.778Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/3202d31788df8ebaa176b23d846335eb9c768d8b43c0506bbd6265ad36a0/pyzmq-27.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d00e81cb0afd672915257a3927124ee2ad117ace3c256d39cd97ca3f190152ad", size = 1885381, upload-time = "2025-08-21T04:22:12.718Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ed/42de80b7ab4e8fcf13376f81206cf8041740672ac1fd2e1c598d63f595bf/pyzmq-27.0.2-cp314-cp314t-win32.whl", hash = "sha256:0f6e9b00d81b58f859fffc112365d50413954e02aefe36c5b4c8fb4af79f8cc3", size = 587526, upload-time = "2025-08-21T04:22:14.18Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c8/8f3c72d6f0bfbf090aa5e283576073ca5c59839b85a5cc8c66ddb9b59801/pyzmq-27.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:2e73cf3b127a437fef4100eb3ac2ebe6b49e655bb721329f667f59eca0a26221", size = 661368, upload-time = "2025-08-21T04:22:15.677Z" }, + { url = "https://files.pythonhosted.org/packages/69/a4/7ee652ea1c77d872f5d99ed937fa8bbd1f6f4b7a39a6d3a0076c286e0c3e/pyzmq-27.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:4108785f2e5ac865d06f678a07a1901e3465611356df21a545eeea8b45f56265", size = 574901, upload-time = "2025-08-21T04:22:17.423Z" }, + { url = "https://files.pythonhosted.org/packages/c8/57/a4aff0dbb29001cebf94848a980ac36bea8e1cb65ac0f72ff03e484df208/pyzmq-27.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:aa9c1c208c263b84386ac25bed6af5672397dc3c232638114fc09bca5c7addf9", size = 1330291, upload-time = "2025-08-21T04:22:34.433Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a6/8519ed48b5bdd72e1a3946a76987afb6659a355180cd15e51cea6afe1983/pyzmq-27.0.2-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:795c4884cfe7ea59f2b67d82b417e899afab889d332bfda13b02f8e0c155b2e4", size = 906596, upload-time = "2025-08-21T04:22:36.168Z" }, + { url = "https://files.pythonhosted.org/packages/3c/19/cb6f463d6454079a566160d10cf175c3c59274b1378104d2b01a5a1ca560/pyzmq-27.0.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47eb65bb25478358ba3113dd9a08344f616f417ad3ffcbb190cd874fae72b1b1", size = 863605, upload-time = "2025-08-21T04:22:37.825Z" }, + { url = "https://files.pythonhosted.org/packages/9d/37/afe25d5f9b91b7422067bb7cd3f75691d78baa0c2c2f76bd0643389ac600/pyzmq-27.0.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6fc24f00293f10aff04d55ca37029b280474c91f4de2cad5e911e5e10d733b7", size = 666777, upload-time = "2025-08-21T04:22:39.551Z" }, + { url = "https://files.pythonhosted.org/packages/15/4a/97b0b59a7eacfd9e61c40abaa9c7e2587bbb39671816a9fb0c5dc32d87bc/pyzmq-27.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58d4cc9b6b768478adfc40a5cbee545303db8dbc81ba688474e0f499cc581028", size = 1655404, upload-time = "2025-08-21T04:22:41.082Z" }, + { url = "https://files.pythonhosted.org/packages/27/db/bcf03bea232839ea749562f76bda3807b16a25c68fdd153339a56699bb1d/pyzmq-27.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea2f26c5972796e02b222968a21a378d09eb4ff590eb3c5fafa8913f8c2bdf5", size = 2034051, upload-time = "2025-08-21T04:22:43.216Z" }, + { url = "https://files.pythonhosted.org/packages/57/3f/9cc291101ee766ab41bae25654af84c11d259f27d73b1ed985256dae8a16/pyzmq-27.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a0621ec020c49fc1b6e31304f1a820900d54e7d9afa03ea1634264bf9387519e", size = 1892080, upload-time = "2025-08-21T04:22:44.81Z" }, + { url = "https://files.pythonhosted.org/packages/16/52/51d4c56c553e7368abc2d010a783092c68a1888045f899eabcfd3bc345f3/pyzmq-27.0.2-cp39-cp39-win32.whl", hash = "sha256:1326500792a9cb0992db06bbaf5d0098459133868932b81a6e90d45c39eca99d", size = 567463, upload-time = "2025-08-21T04:22:46.853Z" }, + { url = "https://files.pythonhosted.org/packages/93/20/3b0ac853b5bbe1fd05e1898ea60335f9d402312328fa17514a876418ab11/pyzmq-27.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:5ee9560cb1e3094ef01fc071b361121a57ebb8d4232912b6607a6d7d2d0a97b4", size = 632200, upload-time = "2025-08-21T04:22:48.34Z" }, + { url = "https://files.pythonhosted.org/packages/b0/14/78b192a7864a38c71e30c3fd668eff949b44db13c1906035e6095fecd00d/pyzmq-27.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:85e3c6fb0d25ea046ebcfdc2bcb9683d663dc0280645c79a616ff5077962a15b", size = 559638, upload-time = "2025-08-21T04:22:50.002Z" }, + { url = "https://files.pythonhosted.org/packages/19/d7/e388e80107b7c438c9698ce59c2a3b950021cd4ab3fe641485e4ed6b0960/pyzmq-27.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d67a0960803a37b60f51b460c58444bc7033a804c662f5735172e21e74ee4902", size = 836008, upload-time = "2025-08-21T04:22:51.842Z" }, + { url = "https://files.pythonhosted.org/packages/65/ef/58d3eb85f1b67a16e22adb07d084f975a7b9641463d18e27230550bb436a/pyzmq-27.0.2-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:dd4d3e6a567ffd0d232cfc667c49d0852d0ee7481458a2a1593b9b1bc5acba88", size = 799932, upload-time = "2025-08-21T04:22:53.529Z" }, + { url = "https://files.pythonhosted.org/packages/3c/63/66b9f6db19ee8c86105ffd4475a4f5d93cdd62b1edcb1e894d971df0728c/pyzmq-27.0.2-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e558be423631704803bc6a642e2caa96083df759e25fe6eb01f2d28725f80bd", size = 567458, upload-time = "2025-08-21T04:22:55.289Z" }, + { url = "https://files.pythonhosted.org/packages/10/af/d92207fe8b6e3d9f588d0591219a86dd7b4ed27bb3e825c1d9cf48467fc0/pyzmq-27.0.2-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c4c20ba8389f495c7b4f6b896bb1ca1e109a157d4f189267a902079699aaf787", size = 747087, upload-time = "2025-08-21T04:22:56.994Z" }, + { url = "https://files.pythonhosted.org/packages/82/e9/d9f8b4b191c6733e31de28974d608a2475a6598136ac901a8c5b67c11432/pyzmq-27.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c5be232f7219414ff672ff7ab8c5a7e8632177735186d8a42b57b491fafdd64e", size = 544641, upload-time = "2025-08-21T04:22:58.87Z" }, + { url = "https://files.pythonhosted.org/packages/c7/60/027d0032a1e3b1aabcef0e309b9ff8a4099bdd5a60ab38b36a676ff2bd7b/pyzmq-27.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e297784aea724294fe95e442e39a4376c2f08aa4fae4161c669f047051e31b02", size = 836007, upload-time = "2025-08-21T04:23:00.447Z" }, + { url = "https://files.pythonhosted.org/packages/25/20/2ed1e6168aaea323df9bb2c451309291f53ba3af372ffc16edd4ce15b9e5/pyzmq-27.0.2-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e3659a79ded9745bc9c2aef5b444ac8805606e7bc50d2d2eb16dc3ab5483d91f", size = 799932, upload-time = "2025-08-21T04:23:02.052Z" }, + { url = "https://files.pythonhosted.org/packages/fd/25/5c147307de546b502c9373688ce5b25dc22288d23a1ebebe5d587bf77610/pyzmq-27.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3dba49ff037d02373a9306b58d6c1e0be031438f822044e8767afccfdac4c6b", size = 567459, upload-time = "2025-08-21T04:23:03.593Z" }, + { url = "https://files.pythonhosted.org/packages/71/06/0dc56ffc615c8095cd089c9b98ce5c733e990f09ce4e8eea4aaf1041a532/pyzmq-27.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de84e1694f9507b29e7b263453a2255a73e3d099d258db0f14539bad258abe41", size = 747088, upload-time = "2025-08-21T04:23:05.334Z" }, + { url = "https://files.pythonhosted.org/packages/06/f6/4a50187e023b8848edd3f0a8e197b1a7fb08d261d8c60aae7cb6c3d71612/pyzmq-27.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f0944d65ba2b872b9fcece08411d6347f15a874c775b4c3baae7f278550da0fb", size = 544639, upload-time = "2025-08-21T04:23:07.279Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ce/36c82244b111c408c99037b61eedcaac9a3f17300c3f857cf175a7b8832f/pyzmq-27.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:400f34321e3bd89b1165b91ea6b18ad26042ba9ad0dfed8b35049e2e24eeab9b", size = 836001, upload-time = "2025-08-21T04:23:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/6f/dc/4aa8e518f1c0d0ee7fb98cf54cf3854e471815040062d26d948df638d9bc/pyzmq-27.0.2-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9cbad4ef12e4c15c94d2c24ecd15a8ed56bf091c62f121a2b0c618ddd4b7402b", size = 799927, upload-time = "2025-08-21T04:23:19.218Z" }, + { url = "https://files.pythonhosted.org/packages/43/4a/cca781133ce015898b7c4ad63240d05af5c54e8736d099c95b0a6c9aaca9/pyzmq-27.0.2-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6b2b74aac3392b8cf508ccb68c980a8555298cd378434a2d065d6ce0f4211dff", size = 758427, upload-time = "2025-08-21T04:23:21.204Z" }, + { url = "https://files.pythonhosted.org/packages/e3/66/772bf1e3aed8b20587f2e0122bc929711d44ddd27dbbd6eb308a5badd0c3/pyzmq-27.0.2-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7db5db88c24cf9253065d69229a148ff60821e5d6f8ff72579b1f80f8f348bab", size = 567453, upload-time = "2025-08-21T04:23:22.825Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fb/fdc3dd8ec46f5226b4cde299839f10c625886bd18adbeaa8a59ffe104356/pyzmq-27.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8ffe40c216c41756ca05188c3e24a23142334b304f7aebd75c24210385e35573", size = 544636, upload-time = "2025-08-21T04:23:24.736Z" }, ] [[package]] @@ -2995,28 +2995,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.12.9" +version = "0.12.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/45/2e403fa7007816b5fbb324cb4f8ed3c7402a927a0a0cb2b6279879a8bfdc/ruff-0.12.9.tar.gz", hash = "sha256:fbd94b2e3c623f659962934e52c2bea6fc6da11f667a427a368adaf3af2c866a", size = 5254702, upload-time = "2025-08-14T16:08:55.2Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/eb/8c073deb376e46ae767f4961390d17545e8535921d2f65101720ed8bd434/ruff-0.12.10.tar.gz", hash = "sha256:189ab65149d11ea69a2d775343adf5f49bb2426fc4780f65ee33b423ad2e47f9", size = 5310076, upload-time = "2025-08-21T18:23:22.595Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/20/53bf098537adb7b6a97d98fcdebf6e916fcd11b2e21d15f8c171507909cc/ruff-0.12.9-py3-none-linux_armv6l.whl", hash = "sha256:fcebc6c79fcae3f220d05585229463621f5dbf24d79fdc4936d9302e177cfa3e", size = 11759705, upload-time = "2025-08-14T16:08:12.968Z" }, - { url = "https://files.pythonhosted.org/packages/20/4d/c764ee423002aac1ec66b9d541285dd29d2c0640a8086c87de59ebbe80d5/ruff-0.12.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aed9d15f8c5755c0e74467731a007fcad41f19bcce41cd75f768bbd687f8535f", size = 12527042, upload-time = "2025-08-14T16:08:16.54Z" }, - { url = "https://files.pythonhosted.org/packages/8b/45/cfcdf6d3eb5fc78a5b419e7e616d6ccba0013dc5b180522920af2897e1be/ruff-0.12.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5b15ea354c6ff0d7423814ba6d44be2807644d0c05e9ed60caca87e963e93f70", size = 11724457, upload-time = "2025-08-14T16:08:18.686Z" }, - { url = "https://files.pythonhosted.org/packages/72/e6/44615c754b55662200c48bebb02196dbb14111b6e266ab071b7e7297b4ec/ruff-0.12.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d596c2d0393c2502eaabfef723bd74ca35348a8dac4267d18a94910087807c53", size = 11949446, upload-time = "2025-08-14T16:08:21.059Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d1/9b7d46625d617c7df520d40d5ac6cdcdf20cbccb88fad4b5ecd476a6bb8d/ruff-0.12.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b15599931a1a7a03c388b9c5df1bfa62be7ede6eb7ef753b272381f39c3d0ff", size = 11566350, upload-time = "2025-08-14T16:08:23.433Z" }, - { url = "https://files.pythonhosted.org/packages/59/20/b73132f66f2856bc29d2d263c6ca457f8476b0bbbe064dac3ac3337a270f/ruff-0.12.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d02faa2977fb6f3f32ddb7828e212b7dd499c59eb896ae6c03ea5c303575756", size = 13270430, upload-time = "2025-08-14T16:08:25.837Z" }, - { url = "https://files.pythonhosted.org/packages/a2/21/eaf3806f0a3d4c6be0a69d435646fba775b65f3f2097d54898b0fd4bb12e/ruff-0.12.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:17d5b6b0b3a25259b69ebcba87908496e6830e03acfb929ef9fd4c58675fa2ea", size = 14264717, upload-time = "2025-08-14T16:08:27.907Z" }, - { url = "https://files.pythonhosted.org/packages/d2/82/1d0c53bd37dcb582b2c521d352fbf4876b1e28bc0d8894344198f6c9950d/ruff-0.12.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72db7521860e246adbb43f6ef464dd2a532ef2ef1f5dd0d470455b8d9f1773e0", size = 13684331, upload-time = "2025-08-14T16:08:30.352Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2f/1c5cf6d8f656306d42a686f1e207f71d7cebdcbe7b2aa18e4e8a0cb74da3/ruff-0.12.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a03242c1522b4e0885af63320ad754d53983c9599157ee33e77d748363c561ce", size = 12739151, upload-time = "2025-08-14T16:08:32.55Z" }, - { url = "https://files.pythonhosted.org/packages/47/09/25033198bff89b24d734e6479e39b1968e4c992e82262d61cdccaf11afb9/ruff-0.12.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc83e4e9751e6c13b5046d7162f205d0a7bac5840183c5beebf824b08a27340", size = 12954992, upload-time = "2025-08-14T16:08:34.816Z" }, - { url = "https://files.pythonhosted.org/packages/52/8e/d0dbf2f9dca66c2d7131feefc386523404014968cd6d22f057763935ab32/ruff-0.12.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:881465ed56ba4dd26a691954650de6ad389a2d1fdb130fe51ff18a25639fe4bb", size = 12899569, upload-time = "2025-08-14T16:08:36.852Z" }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b614d7c08515b1428ed4d3f1d4e3d687deffb2479703b90237682586fa66/ruff-0.12.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:43f07a3ccfc62cdb4d3a3348bf0588358a66da756aa113e071b8ca8c3b9826af", size = 11751983, upload-time = "2025-08-14T16:08:39.314Z" }, - { url = "https://files.pythonhosted.org/packages/58/d6/383e9f818a2441b1a0ed898d7875f11273f10882f997388b2b51cb2ae8b5/ruff-0.12.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:07adb221c54b6bba24387911e5734357f042e5669fa5718920ee728aba3cbadc", size = 11538635, upload-time = "2025-08-14T16:08:41.297Z" }, - { url = "https://files.pythonhosted.org/packages/20/9c/56f869d314edaa9fc1f491706d1d8a47747b9d714130368fbd69ce9024e9/ruff-0.12.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f5cd34fabfdea3933ab85d72359f118035882a01bff15bd1d2b15261d85d5f66", size = 12534346, upload-time = "2025-08-14T16:08:43.39Z" }, - { url = "https://files.pythonhosted.org/packages/bd/4b/d8b95c6795a6c93b439bc913ee7a94fda42bb30a79285d47b80074003ee7/ruff-0.12.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f6be1d2ca0686c54564da8e7ee9e25f93bdd6868263805f8c0b8fc6a449db6d7", size = 13017021, upload-time = "2025-08-14T16:08:45.889Z" }, - { url = "https://files.pythonhosted.org/packages/c7/c1/5f9a839a697ce1acd7af44836f7c2181cdae5accd17a5cb85fcbd694075e/ruff-0.12.9-py3-none-win32.whl", hash = "sha256:cc7a37bd2509974379d0115cc5608a1a4a6c4bff1b452ea69db83c8855d53f93", size = 11734785, upload-time = "2025-08-14T16:08:48.062Z" }, - { url = "https://files.pythonhosted.org/packages/fa/66/cdddc2d1d9a9f677520b7cfc490d234336f523d4b429c1298de359a3be08/ruff-0.12.9-py3-none-win_amd64.whl", hash = "sha256:6fb15b1977309741d7d098c8a3cb7a30bc112760a00fb6efb7abc85f00ba5908", size = 12840654, upload-time = "2025-08-14T16:08:50.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/fd/669816bc6b5b93b9586f3c1d87cd6bc05028470b3ecfebb5938252c47a35/ruff-0.12.9-py3-none-win_arm64.whl", hash = "sha256:63c8c819739d86b96d500cce885956a1a48ab056bbcbc61b747ad494b2485089", size = 11949623, upload-time = "2025-08-14T16:08:52.233Z" }, + { url = "https://files.pythonhosted.org/packages/24/e7/560d049d15585d6c201f9eeacd2fd130def3741323e5ccf123786e0e3c95/ruff-0.12.10-py3-none-linux_armv6l.whl", hash = "sha256:8b593cb0fb55cc8692dac7b06deb29afda78c721c7ccfed22db941201b7b8f7b", size = 11935161, upload-time = "2025-08-21T18:22:26.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b0/ad2464922a1113c365d12b8f80ed70fcfb39764288ac77c995156080488d/ruff-0.12.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ebb7333a45d56efc7c110a46a69a1b32365d5c5161e7244aaf3aa20ce62399c1", size = 12660884, upload-time = "2025-08-21T18:22:30.925Z" }, + { url = "https://files.pythonhosted.org/packages/d7/f1/97f509b4108d7bae16c48389f54f005b62ce86712120fd8b2d8e88a7cb49/ruff-0.12.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d59e58586829f8e4a9920788f6efba97a13d1fa320b047814e8afede381c6839", size = 11872754, upload-time = "2025-08-21T18:22:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/12/ad/44f606d243f744a75adc432275217296095101f83f966842063d78eee2d3/ruff-0.12.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:822d9677b560f1fdeab69b89d1f444bf5459da4aa04e06e766cf0121771ab844", size = 12092276, upload-time = "2025-08-21T18:22:36.764Z" }, + { url = "https://files.pythonhosted.org/packages/06/1f/ed6c265e199568010197909b25c896d66e4ef2c5e1c3808caf461f6f3579/ruff-0.12.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b4a64f4062a50c75019c61c7017ff598cb444984b638511f48539d3a1c98db", size = 11734700, upload-time = "2025-08-21T18:22:39.822Z" }, + { url = "https://files.pythonhosted.org/packages/63/c5/b21cde720f54a1d1db71538c0bc9b73dee4b563a7dd7d2e404914904d7f5/ruff-0.12.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c6f4064c69d2542029b2a61d39920c85240c39837599d7f2e32e80d36401d6e", size = 13468783, upload-time = "2025-08-21T18:22:42.559Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/39369e6ac7f2a1848f22fb0b00b690492f20811a1ac5c1fd1d2798329263/ruff-0.12.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:059e863ea3a9ade41407ad71c1de2badfbe01539117f38f763ba42a1206f7559", size = 14436642, upload-time = "2025-08-21T18:22:45.612Z" }, + { url = "https://files.pythonhosted.org/packages/e3/03/5da8cad4b0d5242a936eb203b58318016db44f5c5d351b07e3f5e211bb89/ruff-0.12.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bef6161e297c68908b7218fa6e0e93e99a286e5ed9653d4be71e687dff101cf", size = 13859107, upload-time = "2025-08-21T18:22:48.886Z" }, + { url = "https://files.pythonhosted.org/packages/19/19/dd7273b69bf7f93a070c9cec9494a94048325ad18fdcf50114f07e6bf417/ruff-0.12.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f1345fbf8fb0531cd722285b5f15af49b2932742fc96b633e883da8d841896b", size = 12886521, upload-time = "2025-08-21T18:22:51.567Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1d/b4207ec35e7babaee62c462769e77457e26eb853fbdc877af29417033333/ruff-0.12.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f68433c4fbc63efbfa3ba5db31727db229fa4e61000f452c540474b03de52a9", size = 13097528, upload-time = "2025-08-21T18:22:54.609Z" }, + { url = "https://files.pythonhosted.org/packages/ff/00/58f7b873b21114456e880b75176af3490d7a2836033779ca42f50de3b47a/ruff-0.12.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:141ce3d88803c625257b8a6debf4a0473eb6eed9643a6189b68838b43e78165a", size = 13080443, upload-time = "2025-08-21T18:22:57.413Z" }, + { url = "https://files.pythonhosted.org/packages/12/8c/9e6660007fb10189ccb78a02b41691288038e51e4788bf49b0a60f740604/ruff-0.12.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f3fc21178cd44c98142ae7590f42ddcb587b8e09a3b849cbc84edb62ee95de60", size = 11896759, upload-time = "2025-08-21T18:23:00.473Z" }, + { url = "https://files.pythonhosted.org/packages/67/4c/6d092bb99ea9ea6ebda817a0e7ad886f42a58b4501a7e27cd97371d0ba54/ruff-0.12.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7d1a4e0bdfafcd2e3e235ecf50bf0176f74dd37902f241588ae1f6c827a36c56", size = 11701463, upload-time = "2025-08-21T18:23:03.211Z" }, + { url = "https://files.pythonhosted.org/packages/59/80/d982c55e91df981f3ab62559371380616c57ffd0172d96850280c2b04fa8/ruff-0.12.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e67d96827854f50b9e3e8327b031647e7bcc090dbe7bb11101a81a3a2cbf1cc9", size = 12691603, upload-time = "2025-08-21T18:23:06.935Z" }, + { url = "https://files.pythonhosted.org/packages/ad/37/63a9c788bbe0b0850611669ec6b8589838faf2f4f959647f2d3e320383ae/ruff-0.12.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ae479e1a18b439c59138f066ae79cc0f3ee250712a873d00dbafadaad9481e5b", size = 13164356, upload-time = "2025-08-21T18:23:10.225Z" }, + { url = "https://files.pythonhosted.org/packages/47/d4/1aaa7fb201a74181989970ebccd12f88c0fc074777027e2a21de5a90657e/ruff-0.12.10-py3-none-win32.whl", hash = "sha256:9de785e95dc2f09846c5e6e1d3a3d32ecd0b283a979898ad427a9be7be22b266", size = 11896089, upload-time = "2025-08-21T18:23:14.232Z" }, + { url = "https://files.pythonhosted.org/packages/ad/14/2ad38fd4037daab9e023456a4a40ed0154e9971f8d6aed41bdea390aabd9/ruff-0.12.10-py3-none-win_amd64.whl", hash = "sha256:7837eca8787f076f67aba2ca559cefd9c5cbc3a9852fd66186f4201b87c1563e", size = 13004616, upload-time = "2025-08-21T18:23:17.422Z" }, + { url = "https://files.pythonhosted.org/packages/24/3c/21cf283d67af33a8e6ed242396863af195a8a6134ec581524fd22b9811b6/ruff-0.12.10-py3-none-win_arm64.whl", hash = "sha256:cc138cc06ed9d4bfa9d667a65af7172b47840e1a98b02ce7011c391e54635ffc", size = 12074225, upload-time = "2025-08-21T18:23:20.137Z" }, ] [[package]] @@ -3106,15 +3106,15 @@ wheels = [ [[package]] name = "starlette" -version = "0.47.2" +version = "0.47.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/57/d062573f391d062710d4088fa1369428c38d51460ab6fedff920efef932e/starlette-0.47.2.tar.gz", hash = "sha256:6ae9aa5db235e4846decc1e7b79c4f346adf41e9777aebeb49dfd09bbd7023d8", size = 2583948, upload-time = "2025-07-20T17:31:58.522Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/b9/cc3017f9a9c9b6e27c5106cc10cc7904653c3eec0729793aec10479dd669/starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9", size = 2584144, upload-time = "2025-08-24T13:36:42.122Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" }, + { url = "https://files.pythonhosted.org/packages/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991, upload-time = "2025-08-24T13:36:40.887Z" }, ] [[package]] @@ -3251,11 +3251,11 @@ wheels = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20250809" +version = "2.9.0.20250822" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/53/07dac71db45fb6b3c71c2fd29a87cada2239eac7ecfb318e6ebc7da00a3b/types_python_dateutil-2.9.0.20250809.tar.gz", hash = "sha256:69cbf8d15ef7a75c3801d65d63466e46ac25a0baa678d89d0a137fc31a608cc1", size = 15820, upload-time = "2025-08-09T03:14:14.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/0a/775f8551665992204c756be326f3575abba58c4a3a52eef9909ef4536428/types_python_dateutil-2.9.0.20250822.tar.gz", hash = "sha256:84c92c34bd8e68b117bff742bc00b692a1e8531262d4507b33afcc9f7716cd53", size = 16084, upload-time = "2025-08-22T03:02:00.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/5e/67312e679f612218d07fcdbd14017e6d571ce240a5ba1ad734f15a8523cc/types_python_dateutil-2.9.0.20250809-py3-none-any.whl", hash = "sha256:768890cac4f2d7fd9e0feb6f3217fce2abbfdfc0cadd38d11fba325a815e4b9f", size = 17707, upload-time = "2025-08-09T03:14:13.314Z" }, + { url = "https://files.pythonhosted.org/packages/ab/d9/a29dfa84363e88b053bf85a8b7f212a04f0d7343a4d24933baa45c06e08b/types_python_dateutil-2.9.0.20250822-py3-none-any.whl", hash = "sha256:849d52b737e10a6dc6621d2bd7940ec7c65fcb69e6aa2882acf4e56b2b508ddc", size = 17892, upload-time = "2025-08-22T03:01:59.436Z" }, ] [[package]] @@ -3272,11 +3272,11 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.14.1" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] From b63572ee16bf59883475b14795aa291d61582f21 Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Tue, 26 Aug 2025 20:51:30 -0700 Subject: [PATCH 06/58] chore: Update OpenAPI spec from LangGraph API v0.4.0 (#6011) This PR updates the OpenAPI specification with changes detected from the LangGraph API server. **Changes detected as of LangGraph API version 0.4.0** This update was automatically generated by the sync workflow in the langgraph-api repository. Co-authored-by: hinthornw --- docs/docs/cloud/reference/api/openapi.json | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/docs/docs/cloud/reference/api/openapi.json b/docs/docs/cloud/reference/api/openapi.json index 212a65a74..4fa99c8a3 100644 --- a/docs/docs/cloud/reference/api/openapi.json +++ b/docs/docs/cloud/reference/api/openapi.json @@ -1520,6 +1520,73 @@ } } }, + "/threads/{thread_id}/stream": { + "get": { + "tags": [ + "Threads" + ], + "summary": "Join Thread Stream", + "description": "This endpoint streams output in real-time from a thread. The stream will include the output of each run executed sequentially on the thread and will remain open indefinitely. It is the responsibility of the calling client to close the connection.", + "operationId": "join_thread_stream_threads__thread_id__stream_get", + "parameters": [ + { + "description": "The ID of the thread.", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Thread Id", + "description": "The ID of the thread." + }, + "name": "thread_id", + "in": "path" + }, + { + "required": false, + "schema": { + "type": "string", + "title": "Last Event ID", + "description": "The ID of the last event received. Used to resume streaming from a specific point. Pass '-' to resume from the beginning." + }, + "name": "Last-Event-ID", + "in": "header" + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/event-stream": { + "schema": { + "type": "string", + "description": "The server will send a stream of events in SSE format.\n\n**Example event**:\n\nid: 1\n\nevent: message\n\ndata: {}" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, "/threads/{thread_id}/runs": { "get": { "tags": [ From f3423c052e1feb2236edf363ed3aad57e91175f7 Mon Sep 17 00:00:00 2001 From: hari-dhanushkodi Date: Wed, 27 Aug 2025 10:47:45 -0400 Subject: [PATCH 07/58] fix(docs): add revision queuing docs (#5997) --- docs/docs/cloud/deployment/cloud.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/cloud/deployment/cloud.md b/docs/docs/cloud/deployment/cloud.md index 89e703599..0ac08d578 100644 --- a/docs/docs/cloud/deployment/cloud.md +++ b/docs/docs/cloud/deployment/cloud.md @@ -99,8 +99,8 @@ Starting from the `LangGraph Platform` view... 1. In the top-right corner, select the gear icon (`Deployment Settings`). 1. Update the `Git Branch` to the desired branch. 1. Check/uncheck checkbox to `Automatically update deployment on push to branch`. - 1. Branch creation/deletion and tag creation/deletion events will not trigger an update. Only pushes to an existing branch will trigger an update. - 1. Pushes in quick succession to a branch will not trigger subsequent updates. In the future, this functionality may be changed/improved. +1. Branch creation/deletion and tag creation/deletion events will not trigger an update. Only pushes to an existing branch will trigger an update. +1. Pushes in quick succession to a branch will queue subsequent updates. Once a build completes, the most recent commit will begin building and the other queued builds will be skipped. ## Add or Remove GitHub Repositories From 1ebdb1ba312bae431a16e9510bc966e6b4fa053f Mon Sep 17 00:00:00 2001 From: Isaac Francisco <78627776+isahers1@users.noreply.github.com> Date: Wed, 27 Aug 2025 11:20:06 -0700 Subject: [PATCH 08/58] chore: Update schema for new config allowed in LGP (#5875) --- libs/cli/langgraph_cli/config.py | 2 ++ libs/cli/schemas/schema.json | 11 +++++++++++ libs/cli/schemas/schema.v0.json | 11 +++++++++++ 3 files changed, 24 insertions(+) diff --git a/libs/cli/langgraph_cli/config.py b/libs/cli/langgraph_cli/config.py index d631bc5f1..229ceb732 100644 --- a/libs/cli/langgraph_cli/config.py +++ b/libs/cli/langgraph_cli/config.py @@ -357,6 +357,8 @@ class HttpConfig(TypedDict, total=False): You can include or exclude headers as configurable values to condition your agent's behavior or permissions on a request's headers.""" + logging_headers: Optional[ConfigurableHeaderConfig] + """Optional. Defines which headers are excluded from logging.""" class Config(TypedDict, total=False): diff --git a/libs/cli/schemas/schema.json b/libs/cli/schemas/schema.json index b3de933a0..21dd34a39 100644 --- a/libs/cli/schemas/schema.json +++ b/libs/cli/schemas/schema.json @@ -576,6 +576,17 @@ "disable_threads": { "type": "boolean", "description": "Optional. If True, /threads routes are removed.\n\nDefault is False.\n" + }, + "logging_headers": { + "anyOf": [ + { + "$ref": "#/$defs/ConfigurableHeaderConfig" + }, + { + "type": "null" + } + ], + "description": "Optional. Defines which headers are excluded from logging." } }, "required": [] diff --git a/libs/cli/schemas/schema.v0.json b/libs/cli/schemas/schema.v0.json index b3de933a0..21dd34a39 100644 --- a/libs/cli/schemas/schema.v0.json +++ b/libs/cli/schemas/schema.v0.json @@ -576,6 +576,17 @@ "disable_threads": { "type": "boolean", "description": "Optional. If True, /threads routes are removed.\n\nDefault is False.\n" + }, + "logging_headers": { + "anyOf": [ + { + "$ref": "#/$defs/ConfigurableHeaderConfig" + }, + { + "type": "null" + } + ], + "description": "Optional. Defines which headers are excluded from logging." } }, "required": [] From 0b4638269b6565e6e0ef055ff4f87c9eb04a8417 Mon Sep 17 00:00:00 2001 From: Isaac Francisco <78627776+isahers1@users.noreply.github.com> Date: Wed, 27 Aug 2025 12:21:25 -0700 Subject: [PATCH 09/58] feat(sdk-py): add durability flag (#5963) --- libs/sdk-py/langgraph_sdk/client.py | 100 ++++++++++++++++++++++++---- libs/sdk-py/langgraph_sdk/schema.py | 6 ++ 2 files changed, 94 insertions(+), 12 deletions(-) diff --git a/libs/sdk-py/langgraph_sdk/client.py b/libs/sdk-py/langgraph_sdk/client.py index cf6d9f510..904e78e01 100644 --- a/libs/sdk-py/langgraph_sdk/client.py +++ b/libs/sdk-py/langgraph_sdk/client.py @@ -15,6 +15,7 @@ import logging import os import re import sys +import warnings from collections.abc import AsyncIterator, Iterator, Mapping, Sequence from types import TracebackType from typing import ( @@ -45,6 +46,7 @@ from langgraph_sdk.schema import ( CronSelectField, CronSortBy, DisconnectMode, + Durability, GraphSchema, IfNotExists, Item, @@ -1772,7 +1774,7 @@ class RunsClient: context: Context | None = None, checkpoint: Checkpoint | None = None, checkpoint_id: str | None = None, - checkpoint_during: bool | None = None, + checkpoint_during: bool | None = None, # deprecated interrupt_before: All | Sequence[str] | None = None, interrupt_after: All | Sequence[str] | None = None, feedback_keys: Sequence[str] | None = None, @@ -1785,6 +1787,7 @@ class RunsClient: headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, on_run_created: Callable[[RunCreateMetadata], None] | None = None, + durability: Durability | None = None, ) -> AsyncIterator[StreamPart]: """Create a run and stream the results. @@ -1804,7 +1807,7 @@ class RunsClient: context: Static context to add to the assistant. !!! version-added "Supported with langgraph>=0.6.0" checkpoint: The checkpoint to resume from. - checkpoint_during: Whether to checkpoint during the run (or only at the end/interruption). + checkpoint_during: (deprecated) Whether to checkpoint during the run (or only at the end/interruption). interrupt_before: Nodes to interrupt immediately before they get executed. interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. feedback_keys: Feedback keys to assign to run. @@ -1822,6 +1825,10 @@ class RunsClient: headers: Optional custom headers to include with the request. params: Optional query parameters to include with the request. on_run_created: Callback when a run is created. + durability: The durability to use for the run. Values are "sync", "async", or "exit". + "async" means checkpoints are persisted async while next graph step executes, replaces checkpoint_during=True + "sync" means checkpoints are persisted sync after graph step executes, replaces checkpoint_during=False + "exit" means checkpoints are only persisted when the run exits, does not save intermediate steps Returns: AsyncIterator[StreamPart]: Asynchronous iterator of stream results. @@ -1857,6 +1864,13 @@ class RunsClient: ``` """ # noqa: E501 + if checkpoint_during is not None: + warnings.warn( + "`checkpoint_during` is deprecated and will be removed in a future version. Use `durability` instead.", + DeprecationWarning, + stacklevel=2, + ) + payload = { "input": input, "command": ( @@ -1881,6 +1895,7 @@ class RunsClient: "on_disconnect": on_disconnect, "on_completion": on_completion, "after_seconds": after_seconds, + "durability": durability, } endpoint = ( f"/threads/{thread_id}/runs/stream" @@ -1971,7 +1986,7 @@ class RunsClient: context: Context | None = None, checkpoint: Checkpoint | None = None, checkpoint_id: str | None = None, - checkpoint_during: bool | None = None, + checkpoint_during: bool | None = None, # deprecated interrupt_before: All | Sequence[str] | None = None, interrupt_after: All | Sequence[str] | None = None, webhook: str | None = None, @@ -1982,6 +1997,7 @@ class RunsClient: headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, on_run_created: Callable[[RunCreateMetadata], None] | None = None, + durability: Durability | None = None, ) -> Run: """Create a background run. @@ -2001,7 +2017,7 @@ class RunsClient: context: Static context to add to the assistant. !!! version-added "Supported with langgraph>=0.6.0" checkpoint: The checkpoint to resume from. - checkpoint_during: Whether to checkpoint during the run (or only at the end/interruption). + checkpoint_during: (deprecated) Whether to checkpoint during the run (or only at the end/interruption). interrupt_before: Nodes to interrupt immediately before they get executed. interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. webhook: Webhook to call after LangGraph API call is done. @@ -2015,6 +2031,10 @@ class RunsClient: Use to schedule future runs. headers: Optional custom headers to include with the request. on_run_created: Optional callback to call when a run is created. + durability: The durability to use for the run. Values are "sync", "async", or "exit". + "async" means checkpoints are persisted async while next graph step executes, replaces checkpoint_during=True + "sync" means checkpoints are persisted sync after graph step executes, replaces checkpoint_during=False + "exit" means checkpoints are only persisted when the run exits, does not save intermediate steps Returns: Run: The created background run. @@ -2090,6 +2110,12 @@ class RunsClient: } ``` """ # noqa: E501 + if checkpoint_during is not None: + warnings.warn( + "`checkpoint_during` is deprecated and will be removed in a future version. Use `durability` instead.", + DeprecationWarning, + stacklevel=2, + ) payload = { "input": input, "command": ( @@ -2112,6 +2138,7 @@ class RunsClient: "if_not_exists": if_not_exists, "on_completion": on_completion, "after_seconds": after_seconds, + "durability": durability, } payload = {k: v for k, v in payload.items() if v is not None} @@ -2209,7 +2236,7 @@ class RunsClient: context: Context | None = None, checkpoint: Checkpoint | None = None, checkpoint_id: str | None = None, - checkpoint_during: bool | None = None, + checkpoint_during: bool | None = None, # deprecated interrupt_before: All | Sequence[str] | None = None, interrupt_after: All | Sequence[str] | None = None, webhook: str | None = None, @@ -2222,6 +2249,7 @@ class RunsClient: headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, on_run_created: Callable[[RunCreateMetadata], None] | None = None, + durability: Durability | None = None, ) -> list[dict] | dict[str, Any]: """Create a run, wait until it finishes and return the final state. @@ -2237,7 +2265,7 @@ class RunsClient: context: Static context to add to the assistant. !!! version-added "Supported with langgraph>=0.6.0" checkpoint: The checkpoint to resume from. - checkpoint_during: Whether to checkpoint during the run (or only at the end/interruption). + checkpoint_during: (deprecated) Whether to checkpoint during the run (or only at the end/interruption). interrupt_before: Nodes to interrupt immediately before they get executed. interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. webhook: Webhook to call after LangGraph API call is done. @@ -2253,6 +2281,10 @@ class RunsClient: Use to schedule future runs. headers: Optional custom headers to include with the request. on_run_created: Optional callback to call when a run is created. + durability: The durability to use for the run. Values are "sync", "async", or "exit". + "async" means checkpoints are persisted async while next graph step executes, replaces checkpoint_during=True + "sync" means checkpoints are persisted sync after graph step executes, replaces checkpoint_during=False + "exit" means checkpoints are only persisted when the run exits, does not save intermediate steps Returns: Union[list[dict], dict[str, Any]]: The output of the run. @@ -2306,6 +2338,12 @@ class RunsClient: ``` """ # noqa: E501 + if checkpoint_during is not None: + warnings.warn( + "`checkpoint_during` is deprecated and will be removed in a future version. Use `durability` instead.", + DeprecationWarning, + stacklevel=2, + ) payload = { "input": input, "command": ( @@ -2326,6 +2364,7 @@ class RunsClient: "on_disconnect": on_disconnect, "on_completion": on_completion, "after_seconds": after_seconds, + "durability": durability, } endpoint = ( f"/threads/{thread_id}/runs/wait" if thread_id is not None else "/runs/wait" @@ -4823,7 +4862,7 @@ class SyncRunsClient: context: Context | None = None, checkpoint: Checkpoint | None = None, checkpoint_id: str | None = None, - checkpoint_during: bool | None = None, + checkpoint_during: bool | None = None, # deprecated interrupt_before: All | Sequence[str] | None = None, interrupt_after: All | Sequence[str] | None = None, feedback_keys: Sequence[str] | None = None, @@ -4836,6 +4875,7 @@ class SyncRunsClient: headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, on_run_created: Callable[[RunCreateMetadata], None] | None = None, + durability: Durability | None = None, ) -> Iterator[StreamPart]: """Create a run and stream the results. @@ -4855,7 +4895,7 @@ class SyncRunsClient: context: Static context to add to the assistant. !!! version-added "Supported with langgraph>=0.6.0" checkpoint: The checkpoint to resume from. - checkpoint_during: Whether to checkpoint during the run (or only at the end/interruption). + checkpoint_during: (deprecated) Whether to checkpoint during the run (or only at the end/interruption). interrupt_before: Nodes to interrupt immediately before they get executed. interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. feedback_keys: Feedback keys to assign to run. @@ -4872,6 +4912,11 @@ class SyncRunsClient: Use to schedule future runs. headers: Optional custom headers to include with the request. on_run_created: Optional callback to call when a run is created. + durability: The durability to use for the run. Values are "sync", "async", or "exit". + "async" means checkpoints are persisted async while next graph step executes, replaces checkpoint_during=True + "sync" means checkpoints are persisted sync after graph step executes, replaces checkpoint_during=False + "exit" means checkpoints are only persisted when the run exits, does not save intermediate steps + Returns: Iterator[StreamPart]: Iterator of stream results. @@ -4904,6 +4949,12 @@ class SyncRunsClient: StreamPart(event='end', data=None) ``` """ # noqa: E501 + if checkpoint_during is not None: + warnings.warn( + "`checkpoint_during` is deprecated and will be removed in a future version. Use `durability` instead.", + DeprecationWarning, + stacklevel=2, + ) payload = { "input": input, "command": ( @@ -4928,6 +4979,7 @@ class SyncRunsClient: "on_disconnect": on_disconnect, "on_completion": on_completion, "after_seconds": after_seconds, + "durability": durability, } endpoint = ( f"/threads/{thread_id}/runs/stream" @@ -5018,7 +5070,7 @@ class SyncRunsClient: context: Context | None = None, checkpoint: Checkpoint | None = None, checkpoint_id: str | None = None, - checkpoint_during: bool | None = None, + checkpoint_during: bool | None = None, # deprecated interrupt_before: All | Sequence[str] | None = None, interrupt_after: All | Sequence[str] | None = None, webhook: str | None = None, @@ -5029,6 +5081,7 @@ class SyncRunsClient: headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, on_run_created: Callable[[RunCreateMetadata], None] | None = None, + durability: Durability | None = None, ) -> Run: """Create a background run. @@ -5048,7 +5101,7 @@ class SyncRunsClient: context: Static context to add to the assistant. !!! version-added "Supported with langgraph>=0.6.0" checkpoint: The checkpoint to resume from. - checkpoint_during: Whether to checkpoint during the run (or only at the end/interruption). + checkpoint_during: (deprecated) Whether to checkpoint during the run (or only at the end/interruption). interrupt_before: Nodes to interrupt immediately before they get executed. interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. webhook: Webhook to call after LangGraph API call is done. @@ -5062,6 +5115,10 @@ class SyncRunsClient: Use to schedule future runs. headers: Optional custom headers to include with the request. on_run_created: Optional callback to call when a run is created. + durability: The durability to use for the run. Values are "sync", "async", or "exit". + "async" means checkpoints are persisted async while next graph step executes, replaces checkpoint_during=True + "sync" means checkpoints are persisted sync after graph step executes, replaces checkpoint_during=False + "exit" means checkpoints are only persisted when the run exits, does not save intermediate steps Returns: Run: The created background run. @@ -5137,6 +5194,12 @@ class SyncRunsClient: } ``` """ # noqa: E501 + if checkpoint_during is not None: + warnings.warn( + "`checkpoint_during` is deprecated and will be removed in a future version. Use `durability` instead.", + DeprecationWarning, + stacklevel=2, + ) payload = { "input": input, "command": ( @@ -5159,6 +5222,7 @@ class SyncRunsClient: "if_not_exists": if_not_exists, "on_completion": on_completion, "after_seconds": after_seconds, + "durability": durability, } payload = {k: v for k, v in payload.items() if v is not None} @@ -5254,7 +5318,7 @@ class SyncRunsClient: metadata: Mapping[str, Any] | None = None, config: Config | None = None, context: Context | None = None, - checkpoint_during: bool | None = None, + checkpoint_during: bool | None = None, # deprecated checkpoint: Checkpoint | None = None, checkpoint_id: str | None = None, interrupt_before: All | Sequence[str] | None = None, @@ -5269,6 +5333,7 @@ class SyncRunsClient: headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, on_run_created: Callable[[RunCreateMetadata], None] | None = None, + durability: Durability | None = None, ) -> list[dict] | dict[str, Any]: """Create a run, wait until it finishes and return the final state. @@ -5284,7 +5349,7 @@ class SyncRunsClient: context: Static context to add to the assistant. !!! version-added "Supported with langgraph>=0.6.0" checkpoint: The checkpoint to resume from. - checkpoint_during: Whether to checkpoint during the run (or only at the end/interruption). + checkpoint_during: (deprecated) Whether to checkpoint during the run (or only at the end/interruption). interrupt_before: Nodes to interrupt immediately before they get executed. interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. webhook: Webhook to call after LangGraph API call is done. @@ -5301,6 +5366,10 @@ class SyncRunsClient: raise_error: Whether to raise an error if the run fails. headers: Optional custom headers to include with the request. on_run_created: Optional callback to call when a run is created. + durability: The durability to use for the run. Values are "sync", "async", or "exit". + "async" means checkpoints are persisted async while next graph step executes, replaces checkpoint_during=True + "sync" means checkpoints are persisted sync after graph step executes, replaces checkpoint_during=False + "exit" means checkpoints are only persisted when the run exits, does not save intermediate steps Returns: Union[list[dict], dict[str, Any]]: The output of the run. @@ -5355,6 +5424,12 @@ class SyncRunsClient: ``` """ # noqa: E501 + if checkpoint_during is not None: + warnings.warn( + "`checkpoint_during` is deprecated and will be removed in a future version. Use `durability` instead.", + DeprecationWarning, + stacklevel=2, + ) payload = { "input": input, "command": ( @@ -5376,6 +5451,7 @@ class SyncRunsClient: "on_completion": on_completion, "after_seconds": after_seconds, "raise_error": raise_error, + "durability": durability, } def on_response(res: httpx.Response): diff --git a/libs/sdk-py/langgraph_sdk/schema.py b/libs/sdk-py/langgraph_sdk/schema.py index ccc8133dc..a1a8f4f9c 100644 --- a/libs/sdk-py/langgraph_sdk/schema.py +++ b/libs/sdk-py/langgraph_sdk/schema.py @@ -91,6 +91,12 @@ Defines action after completion: - "keep": Retain resources after completion. """ +Durability = Literal["sync", "async", "exit"] +"""Durability mode for the graph execution. +- `"sync"`: Changes are persisted synchronously before the next step starts. +- `"async"`: Changes are persisted asynchronously while the next step executes. +- `"exit"`: Changes are persisted only when the graph exits.""" + All = Literal["*"] """Represents a wildcard or 'all' selector.""" From 1756ce1dd22d7b509f052d9c8cb0aaf8ef998e7b Mon Sep 17 00:00:00 2001 From: Isaac Francisco <78627776+isahers1@users.noreply.github.com> Date: Thu, 28 Aug 2025 09:12:04 -0700 Subject: [PATCH 10/58] feat(sdk-py): add endpoint for thread streaming (#6009) SDK support for: https://github.com/langchain-ai/langgraph-api/pull/1217/ --- libs/sdk-py/langgraph_sdk/client.py | 96 +++++++++++++++++++++++++++++ libs/sdk-py/langgraph_sdk/schema.py | 8 +++ 2 files changed, 104 insertions(+) diff --git a/libs/sdk-py/langgraph_sdk/client.py b/libs/sdk-py/langgraph_sdk/client.py index 904e78e01..b1f0116f9 100644 --- a/libs/sdk-py/langgraph_sdk/client.py +++ b/libs/sdk-py/langgraph_sdk/client.py @@ -71,6 +71,7 @@ from langgraph_sdk.schema import ( ThreadSortBy, ThreadState, ThreadStatus, + ThreadStreamMode, ThreadUpdateStateResponse, ) from langgraph_sdk.sse import SSEDecoder, aiter_lines_raw, iter_lines_raw @@ -1684,6 +1685,53 @@ class ThreadsClient: params=params, ) + async def join_stream( + self, + thread_id: str, + *, + last_event_id: str | None = None, + stream_mode: ThreadStreamMode | Sequence[ThreadStreamMode] = "run_modes", + headers: Mapping[str, str] | None = None, + params: QueryParamTypes | None = None, + ) -> AsyncIterator[StreamPart]: + """Get a stream of events for a thread. + + Args: + thread_id: The ID of the thread to get the stream for. + last_event_id: The ID of the last event to get. + headers: Optional custom headers to include with the request. + params: Optional query parameters to include with the request. + + Returns: + Iterator[StreamPart]: An iterator of stream parts. + + ???+ example "Example Usage" + + ```python + + for chunk in client.threads.join_stream( + thread_id="my_thread_id", + last_event_id="my_event_id", + ): + print(chunk) + ``` + + """ # noqa: E501 + query_params = { + "stream_mode": stream_mode, + } + if params: + query_params.update(params) + return self.http.stream( + f"/threads/{thread_id}/stream", + "GET", + headers={ + **({"Last-Event-ID": last_event_id} if last_event_id else {}), + **(headers or {}), + }, + params=query_params, + ) + class RunsClient: """Client for managing runs in LangGraph. @@ -4772,6 +4820,54 @@ class SyncThreadsClient: params=params, ) + def join_stream( + self, + thread_id: str, + *, + stream_mode: ThreadStreamMode | Sequence[ThreadStreamMode] = "run_modes", + last_event_id: str | None = None, + headers: Mapping[str, str] | None = None, + params: QueryParamTypes | None = None, + ) -> Iterator[StreamPart]: + """Get a stream of events for a thread. + + Args: + thread_id: The ID of the thread to get the stream for. + last_event_id: The ID of the last event to get. + headers: Optional custom headers to include with the request. + params: Optional query parameters to include with the request. + + Returns: + Iterator[StreamPart]: An iterator of stream parts. + + ???+ example "Example Usage" + + ```python + + for chunk in client.threads.join_stream( + thread_id="my_thread_id", + last_event_id="my_event_id", + stream_mode="run_modes", + ): + print(chunk) + ``` + + """ # noqa: E501 + query_params = { + "stream_mode": stream_mode, + } + if params: + query_params.update(params) + return self.http.stream( + f"/threads/{thread_id}/stream", + "GET", + headers={ + **({"Last-Event-ID": last_event_id} if last_event_id else {}), + **(headers or {}), + }, + params=query_params, + ) + class SyncRunsClient: """Synchronous client for managing runs in LangGraph. diff --git a/libs/sdk-py/langgraph_sdk/schema.py b/libs/sdk-py/langgraph_sdk/schema.py index a1a8f4f9c..4166b2973 100644 --- a/libs/sdk-py/langgraph_sdk/schema.py +++ b/libs/sdk-py/langgraph_sdk/schema.py @@ -38,6 +38,14 @@ Represents the status of a thread: - "error": An exception occurred during task processing. """ +ThreadStreamMode = Literal["run_modes", "lifecycle", "state_update"] +""" +Defines the mode of streaming: +- "run_modes": Stream the same events as the runs on thread, as well as run_done events. +- "lifecycle": Stream only run start/end events. +- "state_update": Stream state updates on the thread. +""" + StreamMode = Literal[ "values", "messages", From 22942d4eece26b11981f6d65dda75b823a087581 Mon Sep 17 00:00:00 2001 From: Isaac Francisco <78627776+isahers1@users.noreply.github.com> Date: Thu, 28 Aug 2025 16:34:33 -0700 Subject: [PATCH 11/58] release(sdk-py): 0.2.4 (#6038) --- libs/sdk-py/langgraph_sdk/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/sdk-py/langgraph_sdk/__init__.py b/libs/sdk-py/langgraph_sdk/__init__.py index 1a58d6f1a..337441c25 100644 --- a/libs/sdk-py/langgraph_sdk/__init__.py +++ b/libs/sdk-py/langgraph_sdk/__init__.py @@ -1,6 +1,6 @@ from langgraph_sdk.auth import Auth from langgraph_sdk.client import get_client, get_sync_client -__version__ = "0.2.3" +__version__ = "0.2.4" __all__ = ["Auth", "get_client", "get_sync_client"] From 120ae38c122e499c839f062308f12ae879f24d4d Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Fri, 29 Aug 2025 13:45:39 -0400 Subject: [PATCH 12/58] chore(docs): fix runtime context link (#6043) --- docs/docs/concepts/low_level.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/concepts/low_level.md b/docs/docs/concepts/low_level.md index 12b563e44..bfa5ead33 100644 --- a/docs/docs/concepts/low_level.md +++ b/docs/docs/concepts/low_level.md @@ -1040,7 +1040,7 @@ def node_a(state: State, runtime: Runtime[ContextSchema]): ... ``` -See [this guide](../how-tos/graph-api.ipynb#add-runtime-configuration) for a full breakdown on configuration. +See [this guide](../how-tos/graph-api.md#add-runtime-configuration) for a full breakdown on configuration. ::: :::js From b08c2e092f47a17c412760d147cadab9dd333fdb Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Wed, 3 Sep 2025 01:10:12 +0800 Subject: [PATCH 13/58] chore(docs): Update OpenAPI spec from LangGraph API v0.4.8 (#6048) This PR updates the OpenAPI specification with changes detected from the LangGraph API server. **Changes detected as of LangGraph API version 0.4.8** This update was automatically generated by the sync workflow in the langgraph-api repository. Co-authored-by: hinthornw --- docs/docs/cloud/reference/api/openapi.json | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/docs/docs/cloud/reference/api/openapi.json b/docs/docs/cloud/reference/api/openapi.json index 4fa99c8a3..d322f5ee0 100644 --- a/docs/docs/cloud/reference/api/openapi.json +++ b/docs/docs/cloud/reference/api/openapi.json @@ -1550,6 +1550,29 @@ }, "name": "Last-Event-ID", "in": "header" + }, + { + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "enum": ["lifecycle", "run_modes", "state_update"] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": ["lifecycle", "run_modes", "state_update"] + } + } + ], + "default": ["run_modes"], + "title": "Stream Modes", + "description": "Stream modes to control which events are returned. 'lifecycle' returns only run start/end events, 'run_modes' returns all run events (default behavior), 'state_update' returns only state update events." + }, + "name": "stream_modes", + "in": "query" } ], "responses": { @@ -4413,6 +4436,17 @@ "title": "Checkpoint During", "description": "Whether to checkpoint during the run.", "default": false + }, + "durability": { + "type": "string", + "enum": [ + "sync", + "async", + "exit" + ], + "title": "Durability", + "description": "Durability level for the run. Must be one of 'sync', 'async', or 'exit'.", + "default": "async" } }, "type": "object", @@ -4649,6 +4683,17 @@ "title": "Checkpoint During", "description": "Whether to checkpoint during the run.", "default": false + }, + "durability": { + "type": "string", + "enum": [ + "sync", + "async", + "exit" + ], + "title": "Durability", + "description": "Durability level for the run. Must be one of 'sync', 'async', or 'exit'.", + "default": "async" } }, "type": "object", From 5db65e0281175938ec424764582690ab6ffe3c6d Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Wed, 3 Sep 2025 06:25:52 +0800 Subject: [PATCH 14/58] chore(docs): Update OpenAPI spec from LangGraph API v0.4.8 (#6065) This PR updates the OpenAPI specification with changes detected from the LangGraph API server. **Changes detected as of LangGraph API version 0.4.8** This update was automatically generated by the sync workflow in the langgraph-api repository. Co-authored-by: hinthornw --- docs/docs/cloud/reference/api/openapi.json | 193 +++++++++++++++++++++ 1 file changed, 193 insertions(+) diff --git a/docs/docs/cloud/reference/api/openapi.json b/docs/docs/cloud/reference/api/openapi.json index d322f5ee0..fd1147f3a 100644 --- a/docs/docs/cloud/reference/api/openapi.json +++ b/docs/docs/cloud/reference/api/openapi.json @@ -29,6 +29,10 @@ "name": "Store", "description": "Store is an API for managing persistent key-value store (long-term memory) that is available from any thread." }, + { + "name": "A2A", + "description": "Agent-to-Agent Protocol related endpoints for exposing assistants as A2A-compliant agents." + }, { "name": "MCP", "description": "Model Context Protocol related endpoints for exposing an agent as an MCP server." @@ -3182,6 +3186,195 @@ } } }, + "/a2a/{assistant_id}": { + "post": { + "operationId": "post_a2a", + "summary": "A2A Post", + "description": "Communicate with an assistant using the Agent-to-Agent Protocol.\nSends a JSON-RPC 2.0 message to the assistant.\n\n- **Request**: Provide an object with `jsonrpc`, `id`, `method`, and optional `params`.\n- **Response**: Returns a JSON-RPC response with task information or error.\n\n**Supported Methods:**\n- `message/send`: Send a message to the assistant\n- `tasks/get`: Get the status and result of a task\n\n**Notes:**\n- Supports threaded conversations via thread context\n- Messages can contain text and data parts\n- Tasks run asynchronously and return completion status\n", + "parameters": [ + { + "name": "assistant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The ID of the assistant to communicate with" + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string", + "enum": ["application/json"] + }, + "description": "Must be application/json" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "jsonrpc": { + "type": "string", + "enum": ["2.0"], + "description": "JSON-RPC version" + }, + "id": { + "type": "string", + "description": "Request identifier" + }, + "method": { + "type": "string", + "enum": ["message/send", "tasks/get"], + "description": "The method to invoke" + }, + "params": { + "type": "object", + "description": "Method parameters", + "oneOf": [ + { + "title": "Message Send Parameters", + "properties": { + "message": { + "type": "object", + "properties": { + "role": { + "type": "string", + "enum": ["user", "assistant"], + "description": "Message role" + }, + "parts": { + "type": "array", + "items": { + "oneOf": [ + { + "title": "Text Part", + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": ["text"] + }, + "text": { + "type": "string" + } + }, + "required": ["kind", "text"] + }, + { + "title": "Data Part", + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": ["data"] + }, + "data": { + "type": "object" + } + }, + "required": ["kind", "data"] + } + ] + }, + "description": "Message parts" + }, + "messageId": { + "type": "string", + "description": "Unique message identifier" + } + }, + "required": ["role", "parts", "messageId"] + }, + "thread": { + "type": "object", + "properties": { + "threadId": { + "type": "string", + "description": "Thread identifier for conversation context" + } + }, + "description": "Optional thread context" + } + }, + "required": ["message"] + }, + { + "title": "Task Get Parameters", + "properties": { + "taskId": { + "type": "string", + "description": "Task identifier to retrieve" + } + }, + "required": ["taskId"] + } + ] + } + }, + "required": ["jsonrpc", "id", "method"] + } + } + } + }, + "responses": { + "200": { + "description": "JSON-RPC response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "jsonrpc": { + "type": "string", + "enum": ["2.0"] + }, + "id": { + "type": "string" + }, + "result": { + "type": "object", + "description": "Success result containing task information or task details" + }, + "error": { + "type": "object", + "properties": { + "code": { + "type": "integer" + }, + "message": { + "type": "string" + } + }, + "description": "Error information if request failed" + } + }, + "required": ["jsonrpc", "id"] + } + } + } + }, + "400": { + "description": "Bad request - invalid JSON-RPC or missing Accept header" + }, + "404": { + "description": "Assistant not found" + }, + "500": { + "description": "Internal server error" + } + }, + "tags": [ + "A2A" + ] + } + }, "/mcp/": { "post": { "operationId": "post_mcp", From 7cf230defa77f70479c94a6d9ea9a760f39bbf2b Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Wed, 3 Sep 2025 08:04:30 +0800 Subject: [PATCH 15/58] chore(docs): Update OpenAPI spec from LangGraph API v0.4.9 (#6066) This PR updates the OpenAPI specification with changes detected from the LangGraph API server. **Changes detected as of LangGraph API version 0.4.9** This update was automatically generated by the sync workflow in the langgraph-api repository. Co-authored-by: hinthornw --- docs/docs/cloud/reference/api/openapi.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/docs/cloud/reference/api/openapi.json b/docs/docs/cloud/reference/api/openapi.json index fd1147f3a..90cecdd76 100644 --- a/docs/docs/cloud/reference/api/openapi.json +++ b/docs/docs/cloud/reference/api/openapi.json @@ -5015,6 +5015,12 @@ }, "ThreadSearchRequest": { "properties": { + "ids": { + "type": "array", + "items": {"type": "string", "format": "uuid"}, + "title": "Ids", + "description": "List of thread IDs to include. Others are excluded." + }, "metadata": { "type": "object", "title": "Metadata", From 6f4c5fefeef7b53acbdfb5abe431b02d6eaaad90 Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Wed, 3 Sep 2025 08:49:11 +0800 Subject: [PATCH 16/58] feat(sdk-py): Support ids filtering in threads search (#6067) --- libs/sdk-py/langgraph_sdk/__init__.py | 2 +- libs/sdk-py/langgraph_sdk/auth/types.py | 3 +++ libs/sdk-py/langgraph_sdk/client.py | 8 ++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/libs/sdk-py/langgraph_sdk/__init__.py b/libs/sdk-py/langgraph_sdk/__init__.py index 337441c25..87cf2696e 100644 --- a/libs/sdk-py/langgraph_sdk/__init__.py +++ b/libs/sdk-py/langgraph_sdk/__init__.py @@ -1,6 +1,6 @@ from langgraph_sdk.auth import Auth from langgraph_sdk.client import get_client, get_sync_client -__version__ = "0.2.4" +__version__ = "0.2.5" __all__ = ["Auth", "get_client", "get_sync_client"] diff --git a/libs/sdk-py/langgraph_sdk/auth/types.py b/libs/sdk-py/langgraph_sdk/auth/types.py index c0260ee72..0e138839b 100644 --- a/libs/sdk-py/langgraph_sdk/auth/types.py +++ b/libs/sdk-py/langgraph_sdk/auth/types.py @@ -489,6 +489,9 @@ class ThreadsSearch(typing.TypedDict, total=False): offset: int """Offset for pagination.""" + ids: Sequence[UUID] | None + """typing.Optional list of thread IDs to filter by.""" + thread_id: UUID | None """typing.Optional thread ID to filter by.""" diff --git a/libs/sdk-py/langgraph_sdk/client.py b/libs/sdk-py/langgraph_sdk/client.py index b1f0116f9..37f402508 100644 --- a/libs/sdk-py/langgraph_sdk/client.py +++ b/libs/sdk-py/langgraph_sdk/client.py @@ -1309,6 +1309,7 @@ class ThreadsClient: *, metadata: Json = None, values: Json = None, + ids: Sequence[str] | None = None, status: ThreadStatus | None = None, limit: int = 10, offset: int = 0, @@ -1323,6 +1324,7 @@ class ThreadsClient: Args: metadata: Thread metadata to filter on. values: State values to filter on. + ids: List of thread IDs to filter by. status: Thread status to filter on. Must be one of 'idle', 'busy', 'interrupted' or 'error'. limit: Limit on number of threads to return. @@ -1356,6 +1358,8 @@ class ThreadsClient: payload["metadata"] = metadata if values: payload["values"] = values + if ids: + payload["ids"] = ids if status: payload["status"] = status if sort_by: @@ -4454,6 +4458,7 @@ class SyncThreadsClient: *, metadata: Json = None, values: Json = None, + ids: Sequence[str] | None = None, status: ThreadStatus | None = None, limit: int = 10, offset: int = 0, @@ -4468,6 +4473,7 @@ class SyncThreadsClient: Args: metadata: Thread metadata to filter on. values: State values to filter on. + ids: List of thread IDs to filter by. status: Thread status to filter on. Must be one of 'idle', 'busy', 'interrupted' or 'error'. limit: Limit on number of threads to return. @@ -4497,6 +4503,8 @@ class SyncThreadsClient: payload["metadata"] = metadata if values: payload["values"] = values + if ids: + payload["ids"] = ids if status: payload["status"] = status if sort_by: From dfc1c59ebfc6fa125575083c0fbbee238d9e4b62 Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:37:39 +0800 Subject: [PATCH 17/58] chore(docs): Update OpenAPI spec from LangGraph API v0.4.11 (#6074) This PR updates the OpenAPI specification with changes detected from the LangGraph API server. **Changes detected as of LangGraph API version 0.4.11** This update was automatically generated by the sync workflow in the langgraph-api repository. Co-authored-by: hinthornw --- docs/docs/cloud/reference/api/openapi.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/docs/cloud/reference/api/openapi.json b/docs/docs/cloud/reference/api/openapi.json index 90cecdd76..3b16a7ea7 100644 --- a/docs/docs/cloud/reference/api/openapi.json +++ b/docs/docs/cloud/reference/api/openapi.json @@ -5261,11 +5261,30 @@ "type": "object", "title": "Metadata", "description": "Metadata to merge with existing thread metadata." + }, + "ttl": { + "type": "object", + "title": "TTL", + "description": "The time-to-live for the thread.", + "properties": { + "strategy": { + "type": "string", + "enum": [ + "delete" + ], + "description": "The TTL strategy. 'delete' removes the entire thread.", + "default": "delete" + }, + "ttl": { + "type": "number", + "description": "The time-to-live in minutes from now until thread should be swept." + } + } } }, "type": "object", "title": "ThreadPatch", - "description": "Payload for creating a thread." + "description": "Payload for updating a thread." }, "ThreadStateCheckpointRequest": { "properties": { From 25ba4c3bda993d37108ca02830527e4387e4d9d7 Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:48:57 +0800 Subject: [PATCH 18/58] feat(sdk-py): Specify ttl on thread creation and update (#6075) --- libs/sdk-py/langgraph_sdk/__init__.py | 2 +- libs/sdk-py/langgraph_sdk/auth/types.py | 17 ++++++++++ libs/sdk-py/langgraph_sdk/client.py | 45 +++++++++++++++++++++++-- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/libs/sdk-py/langgraph_sdk/__init__.py b/libs/sdk-py/langgraph_sdk/__init__.py index 87cf2696e..a0f139b7d 100644 --- a/libs/sdk-py/langgraph_sdk/__init__.py +++ b/libs/sdk-py/langgraph_sdk/__init__.py @@ -1,6 +1,6 @@ from langgraph_sdk.auth import Auth from langgraph_sdk.client import get_client, get_sync_client -__version__ = "0.2.5" +__version__ = "0.2.6" __all__ = ["Auth", "get_client", "get_sync_client"] diff --git a/libs/sdk-py/langgraph_sdk/auth/types.py b/libs/sdk-py/langgraph_sdk/auth/types.py index 0e138839b..4a7912ea3 100644 --- a/libs/sdk-py/langgraph_sdk/auth/types.py +++ b/libs/sdk-py/langgraph_sdk/auth/types.py @@ -400,6 +400,20 @@ class AuthContext(BaseAuthContext): """ +class ThreadTTL(typing.TypedDict, total=False): + """Time-to-live configuration for a thread. + + Matches the OpenAPI schema where TTL is represented as an object with + an optional strategy and a time value in minutes. + """ + + strategy: typing.Literal["delete"] + """TTL strategy. Currently only 'delete' is supported.""" + + ttl: int + """Time-to-live in minutes from now until the thread should be swept.""" + + class ThreadsCreate(typing.TypedDict, total=False): """Parameters for creating a new thread. @@ -422,6 +436,9 @@ class ThreadsCreate(typing.TypedDict, total=False): if_exists: OnConflictBehavior """Behavior when a thread with the same ID already exists.""" + ttl: ThreadTTL + """Optional TTL configuration for the thread.""" + class ThreadsRead(typing.TypedDict, total=False): """Parameters for reading thread state or run information. diff --git a/libs/sdk-py/langgraph_sdk/client.py b/libs/sdk-py/langgraph_sdk/client.py index 37f402508..490738ab1 100644 --- a/libs/sdk-py/langgraph_sdk/client.py +++ b/libs/sdk-py/langgraph_sdk/client.py @@ -1179,6 +1179,7 @@ class ThreadsClient: if_exists: OnConflictBehavior | None = None, supersteps: Sequence[dict[str, Sequence[dict[str, Any]]]] | None = None, graph_id: str | None = None, + ttl: int | Mapping[str, Any] | None = None, headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, ) -> Thread: @@ -1193,6 +1194,9 @@ class ThreadsClient: supersteps: Apply a list of supersteps when creating a thread, each containing a sequence of updates. Each update has `values` or `command` and `as_node`. Used for copying a thread between deployments. graph_id: Optional graph ID to associate with the thread. + ttl: Optional time-to-live in minutes for the thread. You can pass an + integer (minutes) or a mapping with keys `ttl` and optional + `strategy` (defaults to "delete"). headers: Optional custom headers to include with the request. params: Optional query parameters to include with the request. @@ -1234,6 +1238,11 @@ class ThreadsClient: } for s in supersteps ] + if ttl is not None: + if isinstance(ttl, (int, float)): + payload["ttl"] = {"ttl": ttl, "strategy": "delete"} + else: + payload["ttl"] = ttl return await self.http.post( "/threads", json=payload, headers=headers, params=params @@ -1244,6 +1253,7 @@ class ThreadsClient: thread_id: str, *, metadata: Mapping[str, Any], + ttl: int | Mapping[str, Any] | None = None, headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, ) -> Thread: @@ -1252,6 +1262,9 @@ class ThreadsClient: Args: thread_id: ID of thread to update. metadata: Metadata to merge with existing thread metadata. + ttl: Optional time-to-live in minutes for the thread. You can pass an + integer (minutes) or a mapping with keys `ttl` and optional + `strategy` (defaults to "delete"). headers: Optional custom headers to include with the request. params: Optional query parameters to include with the request. @@ -1265,12 +1278,19 @@ class ThreadsClient: thread = await client.threads.update( thread_id="my-thread-id", metadata={"number":1}, + ttl=43_200, ) ``` """ # noqa: E501 + payload: dict[str, Any] = {"metadata": metadata} + if ttl is not None: + if isinstance(ttl, (int, float)): + payload["ttl"] = {"ttl": ttl, "strategy": "delete"} + else: + payload["ttl"] = ttl return await self.http.patch( f"/threads/{thread_id}", - json={"metadata": metadata}, + json=payload, headers=headers, params=params, ) @@ -4332,6 +4352,7 @@ class SyncThreadsClient: if_exists: OnConflictBehavior | None = None, supersteps: Sequence[dict[str, Sequence[dict[str, Any]]]] | None = None, graph_id: str | None = None, + ttl: int | Mapping[str, Any] | None = None, headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, ) -> Thread: @@ -4346,6 +4367,9 @@ class SyncThreadsClient: supersteps: Apply a list of supersteps when creating a thread, each containing a sequence of updates. Each update has `values` or `command` and `as_node`. Used for copying a thread between deployments. graph_id: Optional graph ID to associate with the thread. + ttl: Optional time-to-live in minutes for the thread. You can pass an + integer (minutes) or a mapping with keys `ttl` and optional + `strategy` (defaults to "delete"). headers: Optional custom headers to include with the request. Returns: @@ -4387,6 +4411,11 @@ class SyncThreadsClient: } for s in supersteps ] + if ttl is not None: + if isinstance(ttl, (int, float)): + payload["ttl"] = {"ttl": ttl, "strategy": "delete"} + else: + payload["ttl"] = ttl return self.http.post("/threads", json=payload, headers=headers, params=params) @@ -4395,6 +4424,7 @@ class SyncThreadsClient: thread_id: str, *, metadata: Mapping[str, Any], + ttl: int | Mapping[str, Any] | None = None, headers: Mapping[str, str] | None = None, params: QueryParamTypes | None = None, ) -> Thread: @@ -4403,7 +4433,11 @@ class SyncThreadsClient: Args: thread_id: ID of thread to update. metadata: Metadata to merge with existing thread metadata. + ttl: Optional time-to-live in minutes for the thread. You can pass an + integer (minutes) or a mapping with keys `ttl` and optional + `strategy` (defaults to "delete"). headers: Optional custom headers to include with the request. + params: Optional query parameters to include with the request. Returns: Thread: The created thread. @@ -4415,12 +4449,19 @@ class SyncThreadsClient: thread = client.threads.update( thread_id="my-thread-id", metadata={"number":1}, + ttl=43_200, ) ``` """ # noqa: E501 + payload: dict[str, Any] = {"metadata": metadata} + if ttl is not None: + if isinstance(ttl, (int, float)): + payload["ttl"] = {"ttl": ttl, "strategy": "delete"} + else: + payload["ttl"] = ttl return self.http.patch( f"/threads/{thread_id}", - json={"metadata": metadata}, + json=payload, headers=headers, params=params, ) From d503c0bf3303a97e1eaec0eabe7ab6f219df62ec Mon Sep 17 00:00:00 2001 From: Isaac Francisco <78627776+isahers1@users.noreply.github.com> Date: Thu, 4 Sep 2025 12:29:11 -0700 Subject: [PATCH 19/58] WIP: monorepo support in CLI (#6028) This PR introduces the `--build-command` and `--install-command` arguments to `langgraph build`. `--install-command` is a custom install command. If passed, it will be run from wherever the `langgraph build` call was made, i.e. NOT where the langgraph.json file lives (except if these are the same place). This will override the detected install command that we previously used. `--build-command` is a custom build command. This will run from wherever the langgraph.json file lives, and will be done after the install has been run. You don't need to provide both. Just providing one will make the install (detected or supplied) run in the directory from where `langgraph build was called` and then have the build command (if one exists) run in the directory where langgraph.json exists. I think we should probably allow configuring the directories from which these commands get run, but I don't think this needs to be part of the MVP. --------- Co-authored-by: William FH <13333726+hinthornw@users.noreply.github.com> --- .github/workflows/_integration_test.yml | 15 + docs/docs/cloud/reference/cli.md | 6 +- libs/cli/js-monorepo-example/.eslintrc.cjs | 62 + .../apps/agent/langgraph.json | 7 + .../apps/agent/package.json | 18 + .../apps/agent/src/graph.ts | 47 + .../apps/agent/src/state.ts | 15 + .../apps/agent/tsconfig.json | 9 + .../libs/shared/package.json | 14 + .../libs/shared/src/index.ts | 6 + .../libs/shared/tsconfig.json | 9 + libs/cli/js-monorepo-example/package.json | 34 + libs/cli/js-monorepo-example/tsconfig.json | 16 + libs/cli/js-monorepo-example/turbo.json | 15 + libs/cli/js-monorepo-example/yarn.lock | 2204 +++++++++++++++++ libs/cli/langgraph_cli/__init__.py | 2 +- libs/cli/langgraph_cli/cli.py | 36 +- libs/cli/langgraph_cli/config.py | 84 +- .../apps/agent/.env.example | 0 .../apps/agent/langgraph.json | 7 + .../apps/agent/pyproject.toml | 19 + .../apps/agent/src/agent/__init__.py | 1 + .../apps/agent/src/agent/graph.py | 40 + .../apps/agent/src/agent/state.py | 13 + .../libs/common/__init__.py | 5 + .../libs/common/helpers.py | 6 + .../libs/shared/pyproject.toml | 20 + .../libs/shared/src/shared/__init__.py | 5 + .../libs/shared/src/shared/utils.py | 6 + .../python-monorepo-example/pyproject.toml | 46 + libs/cli/tests/unit_tests/cli/test_cli.py | 2 +- libs/cli/tests/unit_tests/test_config.py | 112 +- libs/langgraph/.claude/settings.local.json | 4 +- 33 files changed, 2808 insertions(+), 77 deletions(-) create mode 100644 libs/cli/js-monorepo-example/.eslintrc.cjs create mode 100644 libs/cli/js-monorepo-example/apps/agent/langgraph.json create mode 100644 libs/cli/js-monorepo-example/apps/agent/package.json create mode 100644 libs/cli/js-monorepo-example/apps/agent/src/graph.ts create mode 100644 libs/cli/js-monorepo-example/apps/agent/src/state.ts create mode 100644 libs/cli/js-monorepo-example/apps/agent/tsconfig.json create mode 100644 libs/cli/js-monorepo-example/libs/shared/package.json create mode 100644 libs/cli/js-monorepo-example/libs/shared/src/index.ts create mode 100644 libs/cli/js-monorepo-example/libs/shared/tsconfig.json create mode 100644 libs/cli/js-monorepo-example/package.json create mode 100644 libs/cli/js-monorepo-example/tsconfig.json create mode 100644 libs/cli/js-monorepo-example/turbo.json create mode 100644 libs/cli/js-monorepo-example/yarn.lock create mode 100644 libs/cli/python-monorepo-example/apps/agent/.env.example create mode 100644 libs/cli/python-monorepo-example/apps/agent/langgraph.json create mode 100644 libs/cli/python-monorepo-example/apps/agent/pyproject.toml create mode 100644 libs/cli/python-monorepo-example/apps/agent/src/agent/__init__.py create mode 100644 libs/cli/python-monorepo-example/apps/agent/src/agent/graph.py create mode 100644 libs/cli/python-monorepo-example/apps/agent/src/agent/state.py create mode 100644 libs/cli/python-monorepo-example/libs/common/__init__.py create mode 100644 libs/cli/python-monorepo-example/libs/common/helpers.py create mode 100644 libs/cli/python-monorepo-example/libs/shared/pyproject.toml create mode 100644 libs/cli/python-monorepo-example/libs/shared/src/shared/__init__.py create mode 100644 libs/cli/python-monorepo-example/libs/shared/src/shared/utils.py create mode 100644 libs/cli/python-monorepo-example/pyproject.toml diff --git a/.github/workflows/_integration_test.yml b/.github/workflows/_integration_test.yml index f4aa57aa6..29dcc7d7b 100644 --- a/.github/workflows/_integration_test.yml +++ b/.github/workflows/_integration_test.yml @@ -87,3 +87,18 @@ jobs: working-directory: libs/cli/js-examples run: | langgraph build -t langgraph-test-e + + - name: Build JS monorepo service + if: steps.changed-files.outputs.all + working-directory: libs/cli/js-monorepo-example + run: | + langgraph build -t langgraph-test-f -c apps/agent/langgraph.json --build-command "yarn run turbo build" --install-command "yarn install" + + - name: Build Python monorepo service + if: steps.changed-files.outputs.all + working-directory: libs/cli/python-monorepo-example + run: | + langgraph build -t langgraph-test-g -c apps/agent/langgraph.json + cp apps/agent/.env.example apps/agent/.env + if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> apps/agent/.env; fi + timeout 60 python ../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-g -c apps/agent/langgraph.json diff --git a/docs/docs/cloud/reference/cli.md b/docs/docs/cloud/reference/cli.md index b2a45bf61..9699100ea 100644 --- a/docs/docs/cloud/reference/cli.md +++ b/docs/docs/cloud/reference/cli.md @@ -483,19 +483,19 @@ The LangGraph CLI requires a JSON configuration file that follows this [schema]( RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 pip install --no-cache-dir -c /api/constraints.txt langchain_community langchain_anthropic langchain_openai wikipedia scikit-learn - ADD ./graphs /deps/__outer_graphs/src + ADD ./graphs /deps/outer-graphs/src RUN set -ex && \ for line in '[project]' \ 'name = "graphs"' \ 'version = "0.1"' \ '[tool.setuptools.package-data]' \ '"*" = ["**/*"]'; do \ - echo "$line" >> /deps/__outer_graphs/pyproject.toml; \ + echo "$line" >> /deps/outer-graphs/pyproject.toml; \ done RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 pip install --no-cache-dir -c /api/constraints.txt -e /deps/* - ENV LANGSERVE_GRAPHS='{"agent": "/deps/__outer_graphs/src/agent.py:graph", "storm": "/deps/__outer_graphs/src/storm.py:graph"}' + ENV LANGSERVE_GRAPHS='{"agent": "/deps/outer-graphs/src/agent.py:graph", "storm": "/deps/outer-graphs/src/storm.py:graph"}' ``` ???+ note "Updating your langgraph.json file" diff --git a/libs/cli/js-monorepo-example/.eslintrc.cjs b/libs/cli/js-monorepo-example/.eslintrc.cjs new file mode 100644 index 000000000..da4c3ecb4 --- /dev/null +++ b/libs/cli/js-monorepo-example/.eslintrc.cjs @@ -0,0 +1,62 @@ +module.exports = { + extends: [ + "eslint:recommended", + "prettier", + "plugin:@typescript-eslint/recommended", + ], + parserOptions: { + ecmaVersion: 12, + parser: "@typescript-eslint/parser", + project: "./tsconfig.json", + sourceType: "module", + }, + plugins: ["import", "@typescript-eslint", "no-instanceof"], + ignorePatterns: [ + ".eslintrc.cjs", + "scripts", + "src/utils/lodash/*", + "node_modules", + "dist", + "dist-cjs", + "*.js", + "*.cjs", + "*.d.ts", + ], + rules: { + "no-process-env": 2, + "no-instanceof/no-instanceof": 2, + "@typescript-eslint/explicit-module-boundary-types": 0, + "@typescript-eslint/no-empty-function": 0, + "@typescript-eslint/no-shadow": 0, + "@typescript-eslint/no-empty-interface": 0, + "@typescript-eslint/no-use-before-define": ["error", "nofunc"], + "@typescript-eslint/no-unused-vars": ["warn", { args: "none" }], + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-misused-promises": "error", + camelcase: 0, + "class-methods-use-this": 0, + "import/extensions": [2, "ignorePackages"], + "import/no-extraneous-dependencies": [ + "error", + { devDependencies: ["**/*.test.ts"] }, + ], + "import/no-unresolved": 0, + "import/prefer-default-export": 0, + "keyword-spacing": "error", + "max-classes-per-file": 0, + "max-len": 0, + "no-await-in-loop": 0, + "no-bitwise": 0, + "no-console": 0, + "no-restricted-syntax": 0, + "no-shadow": 0, + "no-continue": 0, + "no-underscore-dangle": 0, + "no-use-before-define": 0, + "no-useless-constructor": 0, + "no-return-await": 0, + "consistent-return": 0, + "no-else-return": 0, + "new-cap": ["error", { properties: false, capIsNew: false }], + }, +}; diff --git a/libs/cli/js-monorepo-example/apps/agent/langgraph.json b/libs/cli/js-monorepo-example/apps/agent/langgraph.json new file mode 100644 index 000000000..e39ef7891 --- /dev/null +++ b/libs/cli/js-monorepo-example/apps/agent/langgraph.json @@ -0,0 +1,7 @@ +{ + "node_version": "20", + "graphs": { + "agent": "./src/graph.ts:graph" + }, + "env": "../../.env" +} diff --git a/libs/cli/js-monorepo-example/apps/agent/package.json b/libs/cli/js-monorepo-example/apps/agent/package.json new file mode 100644 index 000000000..e55e3b338 --- /dev/null +++ b/libs/cli/js-monorepo-example/apps/agent/package.json @@ -0,0 +1,18 @@ +{ + "name": "@js-monorepo-example/agent", + "version": "0.0.1", + "type": "module", + "main": "src/graph.ts", + "scripts": { + "build": "tsc", + "clean": "rm -rf dist" + }, + "dependencies": { + "@js-monorepo-example/shared": "*", + "@langchain/core": "^0.3.2", + "@langchain/langgraph": "^0.2.5" + }, + "devDependencies": { + "typescript": "^5.3.3" + } +} diff --git a/libs/cli/js-monorepo-example/apps/agent/src/graph.ts b/libs/cli/js-monorepo-example/apps/agent/src/graph.ts new file mode 100644 index 000000000..6bc4e6311 --- /dev/null +++ b/libs/cli/js-monorepo-example/apps/agent/src/graph.ts @@ -0,0 +1,47 @@ +/** + * Simple LangGraph.js example for monorepo testing + */ +import { StateGraph } from "@langchain/langgraph"; +import { RunnableConfig } from "@langchain/core/runnables"; +import { StateAnnotation } from "./state.js"; +import { getGreeting } from "@js-monorepo-example/shared"; + +/** + * Simple node that uses the shared library + */ +const callModel = async ( + state: typeof StateAnnotation.State, + _config: RunnableConfig, +): Promise => { + // Use functions from the shared library + const greeting = getGreeting(); + + return { + messages: [ + { + role: "assistant", + content: `${greeting}`, + }, + ], + }; +}; + +/** + * Simple routing function + */ +export const route = ( + state: typeof StateAnnotation.State, +): "__end__" | "callModel" => { + if (state.messages.length > 0) { + return "__end__"; + } + return "callModel"; +}; + +// Create the graph +const builder = new StateGraph(StateAnnotation) + .addNode("callModel", callModel) + .addEdge("__start__", "callModel") + .addConditionalEdges("callModel", route); + +export const graph = builder.compile(); diff --git a/libs/cli/js-monorepo-example/apps/agent/src/state.ts b/libs/cli/js-monorepo-example/apps/agent/src/state.ts new file mode 100644 index 000000000..eeeecd417 --- /dev/null +++ b/libs/cli/js-monorepo-example/apps/agent/src/state.ts @@ -0,0 +1,15 @@ +import { BaseMessage, BaseMessageLike } from "@langchain/core/messages"; +import { Annotation, messagesStateReducer } from "@langchain/langgraph"; + +/** + * Simple state annotation for the agent + */ +export const StateAnnotation = Annotation.Root({ + /** + * Messages track the primary execution state of the agent. + */ + messages: Annotation({ + reducer: messagesStateReducer, + default: () => [], + }), +}); diff --git a/libs/cli/js-monorepo-example/apps/agent/tsconfig.json b/libs/cli/js-monorepo-example/apps/agent/tsconfig.json new file mode 100644 index 000000000..ed464a96b --- /dev/null +++ b/libs/cli/js-monorepo-example/apps/agent/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/libs/cli/js-monorepo-example/libs/shared/package.json b/libs/cli/js-monorepo-example/libs/shared/package.json new file mode 100644 index 000000000..d220ae394 --- /dev/null +++ b/libs/cli/js-monorepo-example/libs/shared/package.json @@ -0,0 +1,14 @@ +{ + "name": "@js-monorepo-example/shared", + "version": "0.0.1", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "clean": "rm -rf dist" + }, + "devDependencies": { + "typescript": "^5.3.3" + } +} diff --git a/libs/cli/js-monorepo-example/libs/shared/src/index.ts b/libs/cli/js-monorepo-example/libs/shared/src/index.ts new file mode 100644 index 000000000..19878933c --- /dev/null +++ b/libs/cli/js-monorepo-example/libs/shared/src/index.ts @@ -0,0 +1,6 @@ +/** + * Simple utility functions for monorepo testing + */ +export function getGreeting(): string { + return "Hello from shared library!"; +} diff --git a/libs/cli/js-monorepo-example/libs/shared/tsconfig.json b/libs/cli/js-monorepo-example/libs/shared/tsconfig.json new file mode 100644 index 000000000..ed464a96b --- /dev/null +++ b/libs/cli/js-monorepo-example/libs/shared/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/libs/cli/js-monorepo-example/package.json b/libs/cli/js-monorepo-example/package.json new file mode 100644 index 000000000..22eb6b37d --- /dev/null +++ b/libs/cli/js-monorepo-example/package.json @@ -0,0 +1,34 @@ +{ + "name": "js-monorepo-example", + "version": "0.0.1", + "packageManager": "yarn@1.22.22", + "description": "A simple monorepo example for LangGraph integration testing.", + "private": true, + "workspaces": [ + "libs/*", + "apps/*" + ], + "type": "module", + "scripts": { + "build": "turbo build", + "clean": "turbo clean", + "test": "turbo test", + "format": "prettier --write .", + "lint": "eslint 'apps/**/*.ts' 'libs/**/*.ts'" + }, + "devDependencies": { + "turbo": "^2.5.0", + "typescript": "^5.3.3", + "@tsconfig/recommended": "^1.0.7", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.9.1", + "eslint": "^8.41.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-no-instanceof": "^1.0.1", + "eslint-plugin-prettier": "^4.2.1", + "@typescript-eslint/eslint-plugin": "^5.59.8", + "@typescript-eslint/parser": "^5.59.8", + "prettier": "^3.3.3" + } +} diff --git a/libs/cli/js-monorepo-example/tsconfig.json b/libs/cli/js-monorepo-example/tsconfig.json new file mode 100644 index 000000000..3aa3da2d9 --- /dev/null +++ b/libs/cli/js-monorepo-example/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "@tsconfig/recommended", + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "skipLibCheck": true, + "strict": true, + "declaration": true, + "outDir": "./dist" + }, + "include": ["apps/**/*", "libs/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/libs/cli/js-monorepo-example/turbo.json b/libs/cli/js-monorepo-example/turbo.json new file mode 100644 index 000000000..815403faa --- /dev/null +++ b/libs/cli/js-monorepo-example/turbo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://turbo.build/schema.json", + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": ["dist/**"] + }, + "clean": { + "dependsOn": ["^clean"] + }, + "test": { + "dependsOn": ["^test"] + } + } +} diff --git a/libs/cli/js-monorepo-example/yarn.lock b/libs/cli/js-monorepo-example/yarn.lock new file mode 100644 index 000000000..292469589 --- /dev/null +++ b/libs/cli/js-monorepo-example/yarn.lock @@ -0,0 +1,2204 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cfworker/json-schema@^4.0.2": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" + integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/eslintrc@^3.1.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@eslint/js@^9.9.1": + version "9.34.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.34.0.tgz#fc423168b9d10e08dea9088d083788ec6442996b" + integrity sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw== + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@langchain/core@^0.3.2": + version "0.3.72" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.72.tgz#725e2fc863c45672862c8486083e5703557ab422" + integrity sha512-WsGWVZYnlKffj2eEfDocPNiaTRoxyYiLSQdQ7oxZvxGZBqo/90vpjbC33UGK1uPNBM4kT+pkdaol/MnvKUh8TQ== + dependencies: + "@cfworker/json-schema" "^4.0.2" + ansi-styles "^5.0.0" + camelcase "6" + decamelize "1.2.0" + js-tiktoken "^1.0.12" + langsmith "^0.3.46" + mustache "^4.2.0" + p-queue "^6.6.2" + p-retry "4" + uuid "^10.0.0" + zod "^3.25.32" + zod-to-json-schema "^3.22.3" + +"@langchain/langgraph-checkpoint@~0.0.17": + version "0.0.18" + resolved "https://registry.yarnpkg.com/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-0.0.18.tgz#2f7a9cdeda948ccc8d312ba9463810709d71d0b8" + integrity sha512-IS7zJj36VgY+4pf8ZjsVuUWef7oTwt1y9ylvwu0aLuOn1d0fg05Om9DLm3v2GZ2Df6bhLV1kfWAM0IAl9O5rQQ== + dependencies: + uuid "^10.0.0" + +"@langchain/langgraph-sdk@~0.0.32": + version "0.0.112" + resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.112.tgz#3186919b60e3381aa8aa32ea9b9c39df1f02a9fd" + integrity sha512-/9W5HSWCqYgwma6EoOspL4BGYxGxeJP6lIquPSF4FA0JlKopaUv58ucZC3vAgdJyCgg6sorCIV/qg7SGpEcCLw== + dependencies: + "@types/json-schema" "^7.0.15" + p-queue "^6.6.2" + p-retry "4" + uuid "^9.0.0" + +"@langchain/langgraph@^0.2.5": + version "0.2.74" + resolved "https://registry.yarnpkg.com/@langchain/langgraph/-/langgraph-0.2.74.tgz#37367a1e8bafda3548037a91449a69a84f285def" + integrity sha512-oHpEi5sTZTPaeZX1UnzfM2OAJ21QGQrwReTV6+QnX7h8nDCBzhtipAw1cK616S+X8zpcVOjgOtJuaJhXa4mN8w== + dependencies: + "@langchain/langgraph-checkpoint" "~0.0.17" + "@langchain/langgraph-sdk" "~0.0.32" + uuid "^10.0.0" + zod "^3.23.8" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + +"@tsconfig/recommended@^1.0.7": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@tsconfig/recommended/-/recommended-1.0.10.tgz#5ed23fcf8cca7d78a9e3a6e4828cd96cf783994c" + integrity sha512-cGvydvg03lONp5Z9yaplW493Vw9/um7k588mvDkm+VFPF2PZUVPx0uswq4PFpeEySsLbQRETrDRhzh4Dmxaslw== + +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/semver@^7.3.12": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e" + integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== + +"@types/uuid@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" + integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== + +"@typescript-eslint/eslint-plugin@^5.59.8": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.59.8": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@ungap/structured-clone@^1.2.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.15.0, acorn@^8.9.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-includes@^3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" + integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-object-atoms "^1.1.1" + get-intrinsic "^1.3.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlastindex@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" + integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-shim-unscopables "^1.1.0" + +array.prototype.flat@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@6: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-table-printer@^2.12.1: + version "2.14.6" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.14.6.tgz#edfe0bf311fa2701922ed509443145ab51e06436" + integrity sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw== + dependencies: + simple-wcswidth "^1.0.1" + +cross-spawn@^7.0.2: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + +decamelize@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: + version "1.24.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" + integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.8.0: + version "8.10.2" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz#0642e53625ebc62c31c24726b0f050df6bd97a2e" + integrity sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" + integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.27.5: + version "2.32.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" + integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.9" + array.prototype.findlastindex "^1.2.6" + array.prototype.flat "^1.3.3" + array.prototype.flatmap "^1.3.3" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.12.1" + hasown "^2.0.2" + is-core-module "^2.16.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.1" + semver "^6.3.1" + string.prototype.trimend "^1.0.9" + tsconfig-paths "^3.15.0" + +eslint-plugin-no-instanceof@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-instanceof/-/eslint-plugin-no-instanceof-1.0.1.tgz#5d9fc86d160df6991b654b294a62390207f1bb97" + integrity sha512-zlqQ7EsfzbRO68uI+p8FIE7zYB4njs+nNbkNjSb5QmLi2et67zQLqSeaao5U9SpnlZTTJC87nS2oyHo2ACtajw== + +eslint-plugin-prettier@^4.2.1: + version "4.2.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz#91ca3f2f01a84f1272cce04e9717550494c0fe06" + integrity sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint@^8.41.0: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^10.0.1: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== + dependencies: + acorn "^8.15.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.1" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.16.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-generator-function@^1.0.10: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== + dependencies: + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-tiktoken@^1.0.12: + version "1.0.21" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.21.tgz#368a9957591a30a62997dd0c4cf30866f00f8221" + integrity sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g== + dependencies: + base64-js "^1.5.1" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +langsmith@^0.3.46: + version "0.3.66" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.66.tgz#33f13458c6d1086b5f530a25f00c38acd448e0fa" + integrity sha512-d50FJ25HPAT2e/6u7oPAYFYH7uvVhxf7vThAOE5tP6YFIUHwLMBmJj8R4Z7APp5jF4/m8upvbK4J4jP5UIN+Eg== + dependencies: + "@types/uuid" "^10.0.0" + chalk "^4.1.2" + console-table-printer "^2.12.1" + p-queue "^6.6.2" + p-retry "4" + semver "^7.6.3" + uuid "^10.0.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-retry@4: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.22.4: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7, semver@^7.6.3: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +simple-wcswidth@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz#66722f37629d5203f9b47c5477b1225b85d6525b" + integrity sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +turbo-darwin-64@2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-2.5.6.tgz#d694492bdd16359b31918f9d33234bccc44f853e" + integrity sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A== + +turbo-darwin-arm64@2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-2.5.6.tgz#b8800a1613bc06ded2445b0337ed146c1dbac234" + integrity sha512-LyiG+rD7JhMfYwLqB6k3LZQtYn8CQQUePbpA8mF/hMLPAekXdJo1g0bUPw8RZLwQXUIU/3BU7tXENvhSGz5DPA== + +turbo-linux-64@2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-2.5.6.tgz#23938cee385e358a1363316b6d7464899354349d" + integrity sha512-GOcUTT0xiT/pSnHL4YD6Yr3HreUhU8pUcGqcI2ksIF9b2/r/kRHwGFcsHgpG3+vtZF/kwsP0MV8FTlTObxsYIA== + +turbo-linux-arm64@2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-2.5.6.tgz#1e36c543497ffbefed7e479bd9dbe594de457321" + integrity sha512-10Tm15bruJEA3m0V7iZcnQBpObGBcOgUcO+sY7/2vk1bweW34LMhkWi8svjV9iDF68+KJDThnYDlYE/bc7/zzQ== + +turbo-windows-64@2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-2.5.6.tgz#abbb9a8226d0b2b293fc7dbea0e0869a95323545" + integrity sha512-FyRsVpgaj76It0ludwZsNN40ytHN+17E4PFJyeliBEbxrGTc5BexlXVpufB7XlAaoaZVxbS6KT8RofLfDRyEPg== + +turbo-windows-arm64@2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-2.5.6.tgz#81af8538b338ef3b3814db0ed1d9ea31d30ff72d" + integrity sha512-j/tWu8cMeQ7HPpKri6jvKtyXg9K1gRyhdK4tKrrchH8GNHscPX/F71zax58yYtLRWTiK04zNzPcUJuoS0+v/+Q== + +turbo@^2.5.0: + version "2.5.6" + resolved "https://registry.yarnpkg.com/turbo/-/turbo-2.5.6.tgz#610810b87037520cc2c0f94decba552d3a6e770b" + integrity sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w== + optionalDependencies: + turbo-darwin-64 "2.5.6" + turbo-darwin-arm64 "2.5.6" + turbo-linux-64 "2.5.6" + turbo-linux-arm64 "2.5.6" + turbo-windows-64 "2.5.6" + turbo-windows-arm64 "2.5.6" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typescript@^5.3.3: + version "5.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" + integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== + +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod-to-json-schema@^3.22.3: + version "3.24.6" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz#5920f020c4d2647edfbb954fa036082b92c9e12d" + integrity sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg== + +zod@^3.23.8, zod@^3.25.32: + version "3.25.76" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" + integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== diff --git a/libs/cli/langgraph_cli/__init__.py b/libs/cli/langgraph_cli/__init__.py index 6a9beea82..3d26edf77 100644 --- a/libs/cli/langgraph_cli/__init__.py +++ b/libs/cli/langgraph_cli/__init__.py @@ -1 +1 @@ -__version__ = "0.4.0" +__version__ = "0.4.1" diff --git a/libs/cli/langgraph_cli/cli.py b/libs/cli/langgraph_cli/cli.py index 0ee774159..6a3ddf007 100644 --- a/libs/cli/langgraph_cli/cli.py +++ b/libs/cli/langgraph_cli/cli.py @@ -303,6 +303,8 @@ def _build( pull: bool, tag: str, passthrough: Sequence[str] = (), + install_command: Optional[str] = None, + build_command: Optional[str] = None, ): # pull latest images if pull: @@ -322,22 +324,38 @@ def _build( "-t", tag, ] + # determine build context: use current directory for JS projects, config parent for Python + is_js_project = config_json.get("node_version") and not config_json.get( + "python_version" + ) + # build/install commands only apply to JS projects for now + # without install/build command, JS projects will follow the old behavior + if is_js_project and (build_command or install_command): + build_context = str(pathlib.Path.cwd()) + else: + build_context = str(config.parent) + # apply config stdin, additional_contexts = langgraph_cli.config.config_to_docker( - config, config_json, base_image, api_version + config, + config_json, + base_image, + api_version, + install_command, + build_command, + build_context, ) # add additional_contexts if additional_contexts: for k, v in additional_contexts.items(): args.extend(["--build-context", f"{k}={v}"]) - # run docker build runner.run( subp_exec( "docker", "build", *args, *passthrough, - str(config.parent), + build_context, input=stdin, verbose=True, ) @@ -366,6 +384,14 @@ def _build( "\n --base-image langchain/langgraph-server:0.2 # Pin to a minor version (Python)", ) @OPT_API_VERSION +@click.option( + "--install-command", + help="Custom install command to run from the build context root. If not provided, auto-detects based on package manager files.", +) +@click.option( + "--build-command", + help="Custom build command to run from the langgraph.json directory. If not provided, uses default build process.", +) @click.argument("docker_build_args", nargs=-1, type=click.UNPROCESSED) @cli.command( help="📦 Build LangGraph API server Docker image.", @@ -381,6 +407,8 @@ def build( api_version: Optional[str], pull: bool, tag: str, + install_command: Optional[str], + build_command: Optional[str], ): with Runner() as runner, Progress(message="Pulling...") as set: if shutil.which("docker") is None: @@ -397,6 +425,8 @@ def build( pull, tag, docker_build_args, + install_command, + build_command, ) diff --git a/libs/cli/langgraph_cli/config.py b/libs/cli/langgraph_cli/config.py index 229ceb732..fc987064f 100644 --- a/libs/cli/langgraph_cli/config.py +++ b/libs/cli/langgraph_cli/config.py @@ -913,10 +913,10 @@ def _assemble_local_deps(config_path: pathlib.Path, config: Config) -> LocalDeps "Rename the directory to use it as flat-layout package." ) check_reserved(resolved.name, local_dep) - container_path = f"/deps/__outer_{resolved.name}/{resolved.name}" + container_path = f"/deps/outer-{resolved.name}/{resolved.name}" else: # src layout - container_path = f"/deps/__outer_{resolved.name}/src" + container_path = f"/deps/outer-{resolved.name}/src" for file in files: rfile = resolved / file if ( @@ -1286,7 +1286,7 @@ def python_config_to_docker( if local_deps.pip_reqs: pip_reqs_str = os.linesep.join( ( - f"COPY --from=__outer_{reqpath.name} requirements.txt {destpath}" + f"COPY --from=outer-{reqpath.name} requirements.txt {destpath}" if reqpath.parent in local_deps.additional_contexts else f"ADD {reqpath.relative_to(config_path.parent)} {destpath}" ) @@ -1305,7 +1305,7 @@ def python_config_to_docker( faux_pkgs_str = f"{os.linesep}{os.linesep}".join( ( f"""# -- Adding non-package dependency {fullpath.name} -- -COPY --from=__outer_{fullpath.name} . {destpath}""" +COPY --from=outer-{fullpath.name} . {destpath}""" if fullpath in local_deps.additional_contexts else f"""# -- Adding non-package dependency {fullpath.name} -- ADD {relpath} {destpath}""" @@ -1320,7 +1320,7 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_{fullpath.name}/pyproject.toml; \\ + echo "$line" >> /deps/outer-{fullpath.name}/pyproject.toml; \\ done # -- End of non-package dependency {fullpath.name} --""" for fullpath, (relpath, destpath) in local_deps.faux_pkgs.items() @@ -1423,7 +1423,7 @@ ADD {relpath} /deps/{name} if p in local_deps.real_pkgs: name = local_deps.real_pkgs[p][1] elif p in local_deps.faux_pkgs: - name = f"__outer_{p.name}" + name = f"outer-{p.name}" else: raise RuntimeError(f"Unknown additional context: {p}") additional_contexts[name] = str(p) @@ -1436,9 +1436,28 @@ def node_config_to_docker( config: Config, base_image: str, api_version: Optional[str] = None, + install_command: Optional[str] = None, + build_command: Optional[str] = None, + build_context: Optional[str] = None, ) -> tuple[str, dict[str, str]]: - faux_path = f"/deps/{config_path.parent.name}" - install_cmd = _get_node_pm_install_cmd(config_path, config) + # Calculate paths for monorepo support + if build_context: + relative_workdir = _calculate_relative_workdir(config_path, build_context) + container_name = pathlib.Path(build_context).name + if relative_workdir: + faux_path = f"/deps/{container_name}/{relative_workdir}" + else: + faux_path = f"/deps/{container_name}" + else: + # Backward compatibility: use the original behavior + faux_path = f"/deps/{config_path.parent.name}" + + # Use custom install command or auto-detect + if install_command: + install_cmd = install_command + else: + install_cmd = _get_node_pm_install_cmd(config_path, config) + image_str = docker_tag(config, base_image, api_version) env_vars: list[str] = [] @@ -1465,20 +1484,35 @@ def node_config_to_docker( env_vars.append(f"ENV LANGSERVE_GRAPHS='{json.dumps(config['graphs'])}'") + # For monorepo support, we need to handle install and build commands differently + if build_context: + # Monorepo case: install from root, build from config directory + container_root = f"/deps/{pathlib.Path(build_context).name}" + install_step = f"RUN cd {container_root} && {install_cmd}" + + if build_command: + build_step = f"RUN cd {faux_path} && {build_command}" + else: + build_step = 'RUN (test ! -f /api/langgraph_api/js/build.mts && echo "Prebuild script not found, skipping") || tsx /api/langgraph_api/js/build.mts' + else: + # Original behavior: everything happens in the same directory + install_step = f"RUN cd {faux_path} && {install_cmd}" + build_step = 'RUN (test ! -f /api/langgraph_api/js/build.mts && echo "Prebuild script not found, skipping") || tsx /api/langgraph_api/js/build.mts' + docker_file_contents = [ f"FROM {image_str}", "", os.linesep.join(config["dockerfile_lines"]), "", - f"ADD . {faux_path}", + f"ADD . {faux_path if not build_context else container_root}", "", - f"RUN cd {faux_path} && {install_cmd}", + install_step, "", os.linesep.join(env_vars), "", f"WORKDIR {faux_path}", "", - 'RUN (test ! -f /api/langgraph_api/js/build.mts && echo "Prebuild script not found, skipping") || tsx /api/langgraph_api/js/build.mts', + build_step, ] return os.linesep.join(docker_file_contents), {} @@ -1526,16 +1560,42 @@ def docker_tag( return f"{base_image}:{full_tag}" +def _calculate_relative_workdir(config_path: pathlib.Path, build_context: str) -> str: + """Calculate the relative path from build context to langgraph.json directory.""" + config_dir = config_path.parent.resolve() + build_context_path = pathlib.Path(build_context).resolve() + + try: + relative_path = config_dir.relative_to(build_context_path) + return str(relative_path) if str(relative_path) != "." else "" + except ValueError as _: + raise ValueError( + f"Configuration file {config_path} is not under the build context {build_context}. " + f"Please run the command from a directory that contains your langgraph.json file, " + ) from None + + def config_to_docker( config_path: pathlib.Path, config: Config, base_image: Optional[str] = None, api_version: Optional[str] = None, + install_command: Optional[str] = None, + build_command: Optional[str] = None, + build_context: Optional[str] = None, ) -> tuple[str, dict[str, str]]: base_image = base_image or default_base_image(config) if config.get("node_version") and not config.get("python_version"): - return node_config_to_docker(config_path, config, base_image, api_version) + return node_config_to_docker( + config_path, + config, + base_image, + api_version, + install_command, + build_command, + build_context, + ) return python_config_to_docker(config_path, config, base_image, api_version) diff --git a/libs/cli/python-monorepo-example/apps/agent/.env.example b/libs/cli/python-monorepo-example/apps/agent/.env.example new file mode 100644 index 000000000..e69de29bb diff --git a/libs/cli/python-monorepo-example/apps/agent/langgraph.json b/libs/cli/python-monorepo-example/apps/agent/langgraph.json new file mode 100644 index 000000000..a02bcf929 --- /dev/null +++ b/libs/cli/python-monorepo-example/apps/agent/langgraph.json @@ -0,0 +1,7 @@ +{ + "dependencies": [".", "../../libs/shared", "../../libs/common"], + "graphs": { + "agent": "./src/agent/graph.py:graph" + }, + "env": ".env" +} \ No newline at end of file diff --git a/libs/cli/python-monorepo-example/apps/agent/pyproject.toml b/libs/cli/python-monorepo-example/apps/agent/pyproject.toml new file mode 100644 index 000000000..43475d21a --- /dev/null +++ b/libs/cli/python-monorepo-example/apps/agent/pyproject.toml @@ -0,0 +1,19 @@ +[project] +name = "agent" +version = "0.0.1" +description = "Agent for the Python monorepo" +authors = [ + { name = "Developer", email = "dev@example.com" }, +] +license = { text = "MIT" } +requires-python = ">=3.11,<4.0" + +[build-system] +requires = ["setuptools>=73.0.0", "wheel"] +build-backend = "setuptools.build_meta" + +[tool.setuptools] +packages = ["agent"] + +[tool.setuptools.package-dir] +"agent" = "src/agent" \ No newline at end of file diff --git a/libs/cli/python-monorepo-example/apps/agent/src/agent/__init__.py b/libs/cli/python-monorepo-example/apps/agent/src/agent/__init__.py new file mode 100644 index 000000000..62617ff1c --- /dev/null +++ b/libs/cli/python-monorepo-example/apps/agent/src/agent/__init__.py @@ -0,0 +1 @@ +"""Agent package.""" diff --git a/libs/cli/python-monorepo-example/apps/agent/src/agent/graph.py b/libs/cli/python-monorepo-example/apps/agent/src/agent/graph.py new file mode 100644 index 000000000..39ee31c75 --- /dev/null +++ b/libs/cli/python-monorepo-example/apps/agent/src/agent/graph.py @@ -0,0 +1,40 @@ +"""Simple LangGraph agent for monorepo testing.""" + +from common import get_common_prefix +from langchain_core.messages import AIMessage +from langgraph.graph import END, START, StateGraph +from shared import get_dummy_message + +from agent.state import State + + +def call_model(state: State) -> dict: + """Simple node that uses the shared libraries.""" + # Use functions from both shared packages + dummy_message = get_dummy_message() + prefix = get_common_prefix() + + message = AIMessage(content=f"{prefix} Agent says: {dummy_message}") + + return {"messages": [message]} + + +def should_continue(state: State): + """Conditional edge - end after first message.""" + messages = state["messages"] + if len(messages) > 0: + return END + return "call_model" + + +# Build the graph +workflow = StateGraph(State) + +# Add the node +workflow.add_node("call_model", call_model) + +# Add edges +workflow.add_edge(START, "call_model") +workflow.add_conditional_edges("call_model", should_continue) + +graph = workflow.compile() diff --git a/libs/cli/python-monorepo-example/apps/agent/src/agent/state.py b/libs/cli/python-monorepo-example/apps/agent/src/agent/state.py new file mode 100644 index 000000000..8ef10fa21 --- /dev/null +++ b/libs/cli/python-monorepo-example/apps/agent/src/agent/state.py @@ -0,0 +1,13 @@ +"""State definition for the agent.""" + +from collections.abc import Sequence +from typing import Annotated, TypedDict + +from langchain_core.messages import BaseMessage +from langgraph.graph.message import add_messages + + +class State(TypedDict): + """The state of the agent.""" + + messages: Annotated[Sequence[BaseMessage], add_messages] diff --git a/libs/cli/python-monorepo-example/libs/common/__init__.py b/libs/cli/python-monorepo-example/libs/common/__init__.py new file mode 100644 index 000000000..8c49dd1ad --- /dev/null +++ b/libs/cli/python-monorepo-example/libs/common/__init__.py @@ -0,0 +1,5 @@ +"""Common helper functions package.""" + +from .helpers import get_common_prefix + +__all__ = ["get_common_prefix"] diff --git a/libs/cli/python-monorepo-example/libs/common/helpers.py b/libs/cli/python-monorepo-example/libs/common/helpers.py new file mode 100644 index 000000000..f745dbddc --- /dev/null +++ b/libs/cli/python-monorepo-example/libs/common/helpers.py @@ -0,0 +1,6 @@ +"""Common helper functions.""" + + +def get_common_prefix() -> str: + """Get a common prefix for messages.""" + return "[COMMON]" diff --git a/libs/cli/python-monorepo-example/libs/shared/pyproject.toml b/libs/cli/python-monorepo-example/libs/shared/pyproject.toml new file mode 100644 index 000000000..319411a4c --- /dev/null +++ b/libs/cli/python-monorepo-example/libs/shared/pyproject.toml @@ -0,0 +1,20 @@ +[project] +name = "shared" +version = "0.0.1" +description = "Shared utilities for the Python monorepo" +authors = [ + { name = "Developer", email = "dev@example.com" }, +] +license = { text = "MIT" } +requires-python = ">=3.11,<4.0" +dependencies = [] + +[build-system] +requires = ["setuptools>=73.0.0", "wheel"] +build-backend = "setuptools.build_meta" + +[tool.setuptools] +packages = ["shared"] + +[tool.setuptools.package-dir] +"shared" = "src/shared" \ No newline at end of file diff --git a/libs/cli/python-monorepo-example/libs/shared/src/shared/__init__.py b/libs/cli/python-monorepo-example/libs/shared/src/shared/__init__.py new file mode 100644 index 000000000..c30c138c1 --- /dev/null +++ b/libs/cli/python-monorepo-example/libs/shared/src/shared/__init__.py @@ -0,0 +1,5 @@ +"""Shared utilities package.""" + +from .utils import get_dummy_message + +__all__ = ["get_dummy_message"] diff --git a/libs/cli/python-monorepo-example/libs/shared/src/shared/utils.py b/libs/cli/python-monorepo-example/libs/shared/src/shared/utils.py new file mode 100644 index 000000000..b26dcf187 --- /dev/null +++ b/libs/cli/python-monorepo-example/libs/shared/src/shared/utils.py @@ -0,0 +1,6 @@ +"""Shared utility functions.""" + + +def get_dummy_message() -> str: + """Get a dummy message for testing.""" + return "Hello from shared library!" diff --git a/libs/cli/python-monorepo-example/pyproject.toml b/libs/cli/python-monorepo-example/pyproject.toml new file mode 100644 index 000000000..81eb9c768 --- /dev/null +++ b/libs/cli/python-monorepo-example/pyproject.toml @@ -0,0 +1,46 @@ +[project] +name = "python-monorepo-example" +version = "0.0.1" +description = "A Python monorepo example with LangGraph agents and shared packages" +authors = [ + { name = "Developer", email = "dev@example.com" }, +] +license = { text = "MIT" } +requires-python = ">=3.11,<4.0" +dependencies = [ + "langgraph>=0.6.0,<0.7.0", + "langchain-core>=0.2.14", +] + +[tool.uv.workspace] +members = ["apps/*", "libs/shared"] + +[tool.uv.sources] +shared = { workspace = true } + +[project.optional-dependencies] +dev = ["mypy>=1.11.1", "ruff>=0.6.1"] + +[build-system] +requires = ["setuptools>=73.0.0", "wheel"] +build-backend = "setuptools.build_meta" + +[tool.ruff] +lint.select = [ + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "D", # pydocstyle + "UP", +] +lint.ignore = [ + "D100", # Missing docstring in public module + "D101", # Missing docstring in public class + "D102", # Missing docstring in public method + "D103", # Missing docstring in public function + "D104", # Missing docstring in public package + "D105", # Missing docstring in magic method +] + +[tool.ruff.lint.pydocstyle] +convention = "google" \ No newline at end of file diff --git a/libs/cli/tests/unit_tests/cli/test_cli.py b/libs/cli/tests/unit_tests/cli/test_cli.py index f0341dbad..d722b5666 100644 --- a/libs/cli/tests/unit_tests/cli/test_cli.py +++ b/libs/cli/tests/unit_tests/cli/test_cli.py @@ -570,7 +570,7 @@ def test_build_generate_proper_build_context(): catch_exceptions=True, ) - build_context_pattern = re.compile(r"--build-context\s+(\w+)=([^\s]+)") + build_context_pattern = re.compile(r"--build-context\s+([\w-]+)=([^\s]+)") build_contexts = re.findall(build_context_pattern, result.output) assert len(build_contexts) == 2, ( diff --git a/libs/cli/tests/unit_tests/test_config.py b/libs/cli/tests/unit_tests/test_config.py index fbc257e8b..40feb08f9 100644 --- a/libs/cli/tests/unit_tests/test_config.py +++ b/libs/cli/tests/unit_tests/test_config.py @@ -421,14 +421,14 @@ def test_config_to_docker_simple(): expected_docker_stdin = f"""\ FROM langchain/langgraph-api:3.11 # -- Installing local requirements -- -COPY --from=__outer_requirements.txt requirements.txt /deps/__outer_graphs_reqs_a/graphs_reqs_a/requirements.txt -RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -r /deps/__outer_graphs_reqs_a/graphs_reqs_a/requirements.txt +COPY --from=outer-requirements.txt requirements.txt /deps/outer-graphs_reqs_a/graphs_reqs_a/requirements.txt +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -r /deps/outer-graphs_reqs_a/graphs_reqs_a/requirements.txt # -- End of local requirements install -- # -- Adding local package ../../examples -- COPY --from=examples . /deps/examples # -- End of local package ../../examples -- # -- Adding non-package dependency unit_tests -- -ADD . /deps/__outer_unit_tests/unit_tests +ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -438,11 +438,11 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Adding non-package dependency graphs_reqs_a -- -COPY --from=__outer_graphs_reqs_a . /deps/__outer_graphs_reqs_a/graphs_reqs_a +COPY --from=outer-graphs_reqs_a . /deps/outer-graphs_reqs_a/graphs_reqs_a RUN set -ex && \\ for line in '[project]' \\ 'name = "graphs_reqs_a"' \\ @@ -452,21 +452,21 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_graphs_reqs_a/pyproject.toml; \\ + echo "$line" >> /deps/outer-graphs_reqs_a/pyproject.toml; \\ done # -- End of non-package dependency graphs_reqs_a -- # -- Installing all local dependencies -- RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGGRAPH_HTTP='{{"app": "/deps/examples/my_app.py:app"}}' -ENV LANGSERVE_GRAPHS='{{"agent": "/deps/__outer_unit_tests/unit_tests/agent.py:graph"}}' +ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {FORMATTED_CLEANUP_LINES} -WORKDIR /deps/__outer_unit_tests/unit_tests\ +WORKDIR /deps/outer-unit_tests/unit_tests\ """ assert clean_empty_lines(actual_docker_stdin) == expected_docker_stdin assert additional_contexts == { - "__outer_graphs_reqs_a": str( + "outer-graphs_reqs_a": str( (pathlib.Path(__file__).parent / "../../examples/graphs_reqs_a").resolve() ), "examples": str((pathlib.Path(__file__).parent / "../../examples").resolve()), @@ -484,7 +484,7 @@ def test_config_to_docker_outside_path(): """\ FROM langchain/langgraph-api:3.11 # -- Adding non-package dependency unit_tests -- -ADD . /deps/__outer_unit_tests/unit_tests +ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -494,11 +494,11 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Adding non-package dependency tests -- -COPY --from=__outer_tests . /deps/__outer_tests/tests +COPY --from=outer-tests . /deps/outer-tests/tests RUN set -ex && \\ for line in '[project]' \\ 'name = "tests"' \\ @@ -508,22 +508,22 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-tests/pyproject.toml; \\ done # -- End of non-package dependency tests -- # -- Installing all local dependencies -- RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- -ENV LANGSERVE_GRAPHS='{"agent": "/deps/__outer_unit_tests/unit_tests/agent.py:graph"}' +ENV LANGSERVE_GRAPHS='{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}' """ + FORMATTED_CLEANUP_LINES + """ -WORKDIR /deps/__outer_unit_tests/unit_tests\ +WORKDIR /deps/outer-unit_tests/unit_tests\ """ ) assert clean_empty_lines(actual_docker_stdin) == expected_docker_stdin assert additional_contexts == { - "__outer_tests": str(pathlib.Path(__file__).parent.parent.absolute()), + "outer-tests": str(pathlib.Path(__file__).parent.parent.absolute()), } @@ -545,7 +545,7 @@ def test_config_to_docker_pipconfig(): FROM langchain/langgraph-api:3.11 ADD pipconfig.txt /pipconfig.txt # -- Adding non-package dependency unit_tests -- -ADD . /deps/__outer_unit_tests/unit_tests +ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -555,17 +555,17 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- -ENV LANGSERVE_GRAPHS='{"agent": "/deps/__outer_unit_tests/unit_tests/agent.py:graph"}' +ENV LANGSERVE_GRAPHS='{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}' """ + FORMATTED_CLEANUP_LINES + """ -WORKDIR /deps/__outer_unit_tests/unit_tests\ +WORKDIR /deps/outer-unit_tests/unit_tests\ """ ) assert clean_empty_lines(actual_docker_stdin) == expected_docker_stdin @@ -607,7 +607,7 @@ def test_config_to_docker_local_deps(): expected_docker_stdin = f"""\ FROM langchain/langgraph-api-custom:3.11 # -- Adding non-package dependency graphs -- -ADD ./graphs /deps/__outer_graphs/src +ADD ./graphs /deps/outer-graphs/src RUN set -ex && \\ for line in '[project]' \\ 'name = "graphs"' \\ @@ -617,13 +617,13 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_graphs/pyproject.toml; \\ + echo "$line" >> /deps/outer-graphs/pyproject.toml; \\ done # -- End of non-package dependency graphs -- # -- Installing all local dependencies -- RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- -ENV LANGSERVE_GRAPHS='{{"agent": "/deps/__outer_graphs/src/agent.py:graph"}}' +ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-graphs/src/agent.py:graph"}}' {FORMATTED_CLEANUP_LINES}\ """ assert clean_empty_lines(actual_docker_stdin) == expected_docker_stdin @@ -691,7 +691,7 @@ ARG foo ADD pipconfig.txt /pipconfig.txt RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt langchain langchain_openai # -- Adding non-package dependency graphs -- -ADD ./graphs/ /deps/__outer_graphs/src +ADD ./graphs/ /deps/outer-graphs/src RUN set -ex && \\ for line in '[project]' \\ 'name = "graphs"' \\ @@ -701,13 +701,13 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_graphs/pyproject.toml; \\ + echo "$line" >> /deps/outer-graphs/pyproject.toml; \\ done # -- End of non-package dependency graphs -- # -- Installing all local dependencies -- RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- -ENV LANGSERVE_GRAPHS='{{"agent": "/deps/__outer_graphs/src/agent.py:graph"}}' +ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-graphs/src/agent.py:graph"}}' {FORMATTED_CLEANUP_LINES}""" assert clean_empty_lines(actual_docker_stdin) == expected_docker_stdin assert additional_contexts == {} @@ -797,7 +797,7 @@ def test_config_to_docker_gen_ui_python(): expected_docker_stdin = f"""FROM langchain/langgraph-api:3.11 RUN /storage/install-node.sh # -- Adding non-package dependency unit_tests -- -ADD . /deps/__outer_unit_tests/unit_tests +ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -807,7 +807,7 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- @@ -815,13 +815,13 @@ RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/con # -- End of local dependencies install -- ENV LANGGRAPH_UI='{{"agent": "./graphs/agent.ui.jsx"}}' ENV LANGGRAPH_UI_CONFIG='{{"shared": ["nuqs"]}}' -ENV LANGSERVE_GRAPHS='{{"agent": "/deps/__outer_unit_tests/unit_tests/agent.py:graph"}}' +ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' # -- Installing JS dependencies -- ENV NODE_VERSION=20 -RUN cd /deps/__outer_unit_tests/unit_tests && npm i && tsx /api/langgraph_api/js/build.mts +RUN cd /deps/outer-unit_tests/unit_tests && npm i && tsx /api/langgraph_api/js/build.mts # -- End of JS dependencies install -- {FORMATTED_CLEANUP_LINES} -WORKDIR /deps/__outer_unit_tests/unit_tests""" +WORKDIR /deps/outer-unit_tests/unit_tests""" assert clean_empty_lines(actual_docker_stdin) == expected_docker_stdin assert additional_contexts == {} @@ -843,7 +843,7 @@ def test_config_to_docker_multiplatform(): expected_docker_stdin = f"""FROM langchain/langgraph-api:3.11 RUN /storage/install-node.sh # -- Adding non-package dependency unit_tests -- -ADD . /deps/__outer_unit_tests/unit_tests +ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -853,19 +853,19 @@ RUN set -ex && \\ '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- -ENV LANGSERVE_GRAPHS='{{"python": "/deps/__outer_unit_tests/unit_tests/multiplatform/python.py:graph", "js": "/deps/__outer_unit_tests/unit_tests/multiplatform/js.mts:graph"}}' +ENV LANGSERVE_GRAPHS='{{"python": "/deps/outer-unit_tests/unit_tests/multiplatform/python.py:graph", "js": "/deps/outer-unit_tests/unit_tests/multiplatform/js.mts:graph"}}' # -- Installing JS dependencies -- ENV NODE_VERSION=22 -RUN cd /deps/__outer_unit_tests/unit_tests && npm i && tsx /api/langgraph_api/js/build.mts +RUN cd /deps/outer-unit_tests/unit_tests && npm i && tsx /api/langgraph_api/js/build.mts # -- End of JS dependencies install -- {FORMATTED_CLEANUP_LINES} -WORKDIR /deps/__outer_unit_tests/unit_tests""" +WORKDIR /deps/outer-unit_tests/unit_tests""" assert clean_empty_lines(actual_docker_stdin) == expected_docker_stdin assert additional_contexts == {} @@ -984,7 +984,7 @@ def test_config_to_compose_simple_config(): dockerfile_inline: | FROM langchain/langgraph-api:3.11 # -- Adding non-package dependency unit_tests -- - ADD . /deps/__outer_unit_tests/unit_tests + ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -994,15 +994,15 @@ def test_config_to_compose_simple_config(): '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- - ENV LANGSERVE_GRAPHS='{{"agent": "/deps/__outer_unit_tests/unit_tests/agent.py:graph"}}' + ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} - WORKDIR /deps/__outer_unit_tests/unit_tests + WORKDIR /deps/outer-unit_tests/unit_tests """ actual_compose_stdin = config_to_compose( PATH_TO_CONFIG, @@ -1025,7 +1025,7 @@ def test_config_to_compose_env_vars(): dockerfile_inline: | FROM langchain/langgraph-api-custom:3.11 # -- Adding non-package dependency unit_tests -- - ADD . /deps/__outer_unit_tests/unit_tests + ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -1035,15 +1035,15 @@ def test_config_to_compose_env_vars(): '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- - ENV LANGSERVE_GRAPHS='{{"agent": "/deps/__outer_unit_tests/unit_tests/agent.py:graph"}}' + ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} - WORKDIR /deps/__outer_unit_tests/unit_tests + WORKDIR /deps/outer-unit_tests/unit_tests """ openai_api_key = "key" actual_compose_stdin = config_to_compose( @@ -1070,7 +1070,7 @@ def test_config_to_compose_env_file(): dockerfile_inline: | FROM langchain/langgraph-api:3.11 # -- Adding non-package dependency unit_tests -- - ADD . /deps/__outer_unit_tests/unit_tests + ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -1080,15 +1080,15 @@ def test_config_to_compose_env_file(): '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- - ENV LANGSERVE_GRAPHS='{{"agent": "/deps/__outer_unit_tests/unit_tests/agent.py:graph"}}' + ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} - WORKDIR /deps/__outer_unit_tests/unit_tests + WORKDIR /deps/outer-unit_tests/unit_tests """ actual_compose_stdin = config_to_compose( PATH_TO_CONFIG, @@ -1108,7 +1108,7 @@ def test_config_to_compose_watch(): dockerfile_inline: | FROM langchain/langgraph-api:3.11 # -- Adding non-package dependency unit_tests -- - ADD . /deps/__outer_unit_tests/unit_tests + ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -1118,15 +1118,15 @@ def test_config_to_compose_watch(): '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- - ENV LANGSERVE_GRAPHS='{{"agent": "/deps/__outer_unit_tests/unit_tests/agent.py:graph"}}' + ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} - WORKDIR /deps/__outer_unit_tests/unit_tests + WORKDIR /deps/outer-unit_tests/unit_tests develop: watch: @@ -1155,7 +1155,7 @@ def test_config_to_compose_end_to_end(): dockerfile_inline: | FROM langchain/langgraph-api:3.11 # -- Adding non-package dependency unit_tests -- - ADD . /deps/__outer_unit_tests/unit_tests + ADD . /deps/outer-unit_tests/unit_tests RUN set -ex && \\ for line in '[project]' \\ 'name = "unit_tests"' \\ @@ -1165,15 +1165,15 @@ def test_config_to_compose_end_to_end(): '[build-system]' \\ 'requires = ["setuptools>=61"]' \\ 'build-backend = "setuptools.build_meta"'; do \\ - echo "$line" >> /deps/__outer_unit_tests/pyproject.toml; \\ + echo "$line" >> /deps/outer-unit_tests/pyproject.toml; \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- - ENV LANGSERVE_GRAPHS='{{"agent": "/deps/__outer_unit_tests/unit_tests/agent.py:graph"}}' + ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} - WORKDIR /deps/__outer_unit_tests/unit_tests + WORKDIR /deps/outer-unit_tests/unit_tests develop: watch: diff --git a/libs/langgraph/.claude/settings.local.json b/libs/langgraph/.claude/settings.local.json index d4dec4ec5..64237d262 100644 --- a/libs/langgraph/.claude/settings.local.json +++ b/libs/langgraph/.claude/settings.local.json @@ -5,7 +5,9 @@ "Bash(python:*)", "Bash(grep:*)", "Bash(sed:*)", - "Bash(awk:*)" + "Bash(awk:*)", + "Bash(uv run mypy:*)", + "Bash(uv run:*)" ], "deny": [] } From 36cf353d1965dcc50996445dbc9155b47b4bdb08 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 5 Sep 2025 10:27:10 +0100 Subject: [PATCH 20/58] fix: Unwrap Required/NotRequired special forms before resolving channel/reducer annotations (#6080) --- libs/langgraph/langgraph/graph/state.py | 8 +++++++- libs/langgraph/tests/test_state.py | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/libs/langgraph/langgraph/graph/state.py b/libs/langgraph/langgraph/graph/state.py index 2a1a194b7..3512b3fa5 100644 --- a/libs/langgraph/langgraph/graph/state.py +++ b/libs/langgraph/langgraph/graph/state.py @@ -25,7 +25,7 @@ from typing import ( from langchain_core.runnables import Runnable, RunnableConfig from pydantic import BaseModel, TypeAdapter -from typing_extensions import Self, Unpack, is_typeddict +from typing_extensions import NotRequired, Required, Self, Unpack, is_typeddict from langgraph._internal._constants import ( INTERRUPT, @@ -1334,6 +1334,12 @@ def _get_channel( def _get_channel( name: str, annotation: Any, *, allow_managed: bool = True ) -> BaseChannel | ManagedValueSpec: + # Strip out Required and NotRequired wrappers + if hasattr(annotation, "__origin__") and annotation.__origin__ in ( + Required, + NotRequired, + ): + annotation = annotation.__args__[0] if manager := _is_field_managed_value(name, annotation): if allow_managed: return manager diff --git a/libs/langgraph/tests/test_state.py b/libs/langgraph/tests/test_state.py index 82a3997de..67988ef09 100644 --- a/libs/langgraph/tests/test_state.py +++ b/libs/langgraph/tests/test_state.py @@ -10,6 +10,7 @@ from langchain_core.runnables import RunnableConfig from pydantic import BaseModel from typing_extensions import NotRequired, Required, TypedDict +from langgraph.channels.binop import BinaryOperatorAggregate from langgraph.graph.state import StateGraph, _get_node_name, _warn_invalid_state_schema @@ -137,7 +138,7 @@ def test_state_schema_optional_values(total_: bool): class InputState(SomeParentState, total=total_): # type: ignore val1: str val2: Optional[str] - val3: Required[str] + val3: Required[Annotated[dict, operator.or_]] val4: NotRequired[dict] val5: Annotated[Required[str], "foo"] val6: Annotated[NotRequired[str], "bar"] @@ -159,6 +160,8 @@ def test_state_schema_optional_values(total_: bool): graph = builder.compile() json_schema = graph.get_input_jsonschema() + assert isinstance(graph.channels["val3"], BinaryOperatorAggregate) + if total_ is False: expected_required = set() expected_optional = {"val2", "val1"} From f761116de7f827607bec9c2118de43b2ceb222ab Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Fri, 5 Sep 2025 13:43:31 -0700 Subject: [PATCH 21/58] chore(sdk-py): Clean up docstring for get_client (#6084) Main thing here is to call out the ASGITransport behavior --- libs/sdk-py/langgraph_sdk/client.py | 72 ++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/libs/sdk-py/langgraph_sdk/client.py b/libs/sdk-py/langgraph_sdk/client.py index 490738ab1..394167eea 100644 --- a/libs/sdk-py/langgraph_sdk/client.py +++ b/libs/sdk-py/langgraph_sdk/client.py @@ -157,37 +157,63 @@ def get_client( headers: Mapping[str, str] | None = None, timeout: TimeoutTypes | None = None, ) -> LangGraphClient: - """Get a LangGraphClient instance. + """Create and configure a LangGraphClient. + + The client provides programmatic access to a LangGraph Platform deployment. It supports + both remote servers and local in-process connections (when running inside a LangGraph server). Args: - url: The URL of the LangGraph API. - api_key: The API key. If not provided, it will be read from the environment. - Precedence: - 1. explicit argument - 2. LANGGRAPH_API_KEY - 3. LANGSMITH_API_KEY - 4. LANGCHAIN_API_KEY - headers: Optional custom headers - timeout: Optional timeout configuration for the HTTP client. - Accepts an httpx.Timeout instance, a float (seconds), or a tuple of timeouts. - Tuple format is (connect, read, write, pool) - If not provided, defaults to connect=5s, read=300s, write=300s, and pool=5s. + url: + Base URL of the LangGraph API. + – If `None`, the client first attempts an in-process connection via ASGI transport. + If that fails, it falls back to `http://localhost:8123`. + api_key: + API key for authentication. If omitted, the client reads from environment + variables in the following order: + 1. Function argument + 2. `LANGGRAPH_API_KEY` + 3. `LANGSMITH_API_KEY` + 4. `LANGCHAIN_API_KEY` + headers: + Additional HTTP headers to include in requests. Merged with authentication headers. + timeout: + HTTP timeout configuration. May be: + – `httpx.Timeout` instance + – float (total seconds) + – tuple `(connect, read, write, pool)` in seconds + Defaults: connect=5, read=300, write=300, pool=5. Returns: - LangGraphClient: The top-level client for accessing AssistantsClient, - ThreadsClient, RunsClient, and CronClient. + LangGraphClient: + A top-level client exposing sub-clients for assistants, threads, + runs, and cron operations. - ???+ example "Example" + ???+ example "Connect to a remote server:" - ```python - from langgraph_sdk import get_client + ```python + from langgraph_sdk import get_client - # get top-level LangGraphClient - client = get_client(url="http://localhost:8123") + # get top-level LangGraphClient + client = get_client(url="http://localhost:8123") - # example usage: client..() - assistants = await client.assistants.get(assistant_id="some_uuid") - ``` + # example usage: client..() + assistants = await client.assistants.get(assistant_id="some_uuid") + ``` + + ???+ example "Connect in-process to a running LangGraph server:" + + ```python + from langgraph_sdk import get_client + + client = get_client(url=None) + + async def my_node(...): + subagent_result = await client.runs.wait( + thread_id=None, + assistant_id="agent", + input={"messages": [{"role": "user", "content": "Foo"}]}, + ) + ``` """ transport: httpx.AsyncBaseTransport | None = None From eaeafe54ab7dd5082c791a8bea2d713737ca4163 Mon Sep 17 00:00:00 2001 From: Isaac Francisco <78627776+isahers1@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:45:48 -0700 Subject: [PATCH 22/58] feat(cli): support prereleases (#6085) We previously errored when a user had prerelease dependencies, this PR passes the `--prereleases=allow` flag to our `uv pip install` call. This PR also adds a test to verify that said deployments will build and run as expected. --- .github/workflows/_integration_test.yml | 9 ++ .../examples/graph_prerelease_reqs/agent.py | 95 +++++++++++++++++++ .../graph_prerelease_reqs/langgraph.json | 11 +++ .../graph_prerelease_reqs/requirements.txt | 6 ++ libs/cli/langgraph_cli/config.py | 2 +- libs/cli/tests/unit_tests/cli/test_cli.py | 4 +- libs/cli/tests/unit_tests/test_config.py | 42 ++++---- 7 files changed, 145 insertions(+), 24 deletions(-) create mode 100644 libs/cli/examples/graph_prerelease_reqs/agent.py create mode 100644 libs/cli/examples/graph_prerelease_reqs/langgraph.json create mode 100644 libs/cli/examples/graph_prerelease_reqs/requirements.txt diff --git a/.github/workflows/_integration_test.yml b/.github/workflows/_integration_test.yml index 29dcc7d7b..2057dceae 100644 --- a/.github/workflows/_integration_test.yml +++ b/.github/workflows/_integration_test.yml @@ -102,3 +102,12 @@ jobs: cp apps/agent/.env.example apps/agent/.env if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> apps/agent/.env; fi timeout 60 python ../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-g -c apps/agent/langgraph.json + + - name: Build and test prerelease reqs service + if: steps.changed-files.outputs.all + working-directory: libs/cli/examples/graph_prerelease_reqs + run: | + langgraph build -t langgraph-test-h + cp ../.env.example .env + if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi + timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-h diff --git a/libs/cli/examples/graph_prerelease_reqs/agent.py b/libs/cli/examples/graph_prerelease_reqs/agent.py new file mode 100644 index 000000000..b33b1a5d3 --- /dev/null +++ b/libs/cli/examples/graph_prerelease_reqs/agent.py @@ -0,0 +1,95 @@ +from collections.abc import Sequence +from typing import Annotated, Literal, TypedDict + +from langchain.chat_models import init_chat_model +from langchain_community.tools.tavily_search import TavilySearchResults +from langchain_core.messages import BaseMessage +from langchain_openai import ChatOpenAI +from langgraph.graph import END, StateGraph, add_messages +from langgraph.prebuilt import ToolNode + +tools = [TavilySearchResults(max_results=1)] + +model_anth = init_chat_model("claude-3-7-sonnet-20250219", model_provider="anthropic") +model_oai = ChatOpenAI(temperature=0) + +model_anth = model_anth.bind_tools(tools) +model_oai = model_oai.bind_tools(tools) + + +class AgentState(TypedDict): + messages: Annotated[Sequence[BaseMessage], add_messages] + + +# Define the function that determines whether to continue or not +def should_continue(state): + messages = state["messages"] + last_message = messages[-1] + # If there are no tool calls, then we finish + if not last_message.tool_calls: + return "end" + # Otherwise if there is, we continue + else: + return "continue" + + +# Define the function that calls the model +def call_model(state, config): + if config["configurable"].get("model", "anthropic") == "anthropic": + model = model_anth + else: + model = model_oai + messages = state["messages"] + response = model.invoke(messages) + # We return a list, because this will get added to the existing list + return {"messages": [response]} + + +# Define the function to execute tools +tool_node = ToolNode(tools) + + +class ContextSchema(TypedDict): + model: Literal["anthropic", "openai"] + + +# Define a new graph +workflow = StateGraph(AgentState, context_schema=ContextSchema) + +# Define the two nodes we will cycle between +workflow.add_node("agent", call_model) +workflow.add_node("action", tool_node) + +# Set the entrypoint as `agent` +# This means that this node is the first one called +workflow.set_entry_point("agent") + +# We now add a conditional edge +workflow.add_conditional_edges( + # First, we define the start node. We use `agent`. + # This means these are the edges taken after the `agent` node is called. + "agent", + # Next, we pass in the function that will determine which node is called next. + should_continue, + # Finally we pass in a mapping. + # The keys are strings, and the values are other nodes. + # END is a special node marking that the graph should finish. + # What will happen is we will call `should_continue`, and then the output of that + # will be matched against the keys in this mapping. + # Based on which one it matches, that node will then be called. + { + # If `tools`, then we call the tool node. + "continue": "action", + # Otherwise we finish. + "end": END, + }, +) + +# We now add a normal edge from `tools` to `agent`. +# This means that after `tools` is called, `agent` node is called next. +workflow.add_edge("action", "agent") + +# Finally, we compile it! +# This compiles it into a LangChain Runnable, +# meaning you can use it as you would any other runnable +graph = workflow.compile() diff --git a/libs/cli/examples/graph_prerelease_reqs/langgraph.json b/libs/cli/examples/graph_prerelease_reqs/langgraph.json new file mode 100644 index 000000000..8bc7d8b2c --- /dev/null +++ b/libs/cli/examples/graph_prerelease_reqs/langgraph.json @@ -0,0 +1,11 @@ +{ + "python_version": "3.12", + "dependencies": [ + "." + ], + "graphs": { + "agent": "./agent.py:graph" + }, + "env": "../.env" + } + \ No newline at end of file diff --git a/libs/cli/examples/graph_prerelease_reqs/requirements.txt b/libs/cli/examples/graph_prerelease_reqs/requirements.txt new file mode 100644 index 000000000..92e4c3b5c --- /dev/null +++ b/libs/cli/examples/graph_prerelease_reqs/requirements.txt @@ -0,0 +1,6 @@ +requests +langchain_anthropic +langchain_openai +langchain_community +langchain +langgraph==1.0.0a2 \ No newline at end of file diff --git a/libs/cli/langgraph_cli/config.py b/libs/cli/langgraph_cli/config.py index fc987064f..87d4d5c72 100644 --- a/libs/cli/langgraph_cli/config.py +++ b/libs/cli/langgraph_cli/config.py @@ -1256,7 +1256,7 @@ def python_config_to_docker( else: pip_installer = "pip" if pip_installer == "uv": - install_cmd = "uv pip install --system" + install_cmd = "uv pip install --system --prerelease=allow" elif pip_installer == "pip": install_cmd = "pip install" else: diff --git a/libs/cli/tests/unit_tests/cli/test_cli.py b/libs/cli/tests/unit_tests/cli/test_cli.py index d722b5666..6b1fca6ed 100644 --- a/libs/cli/tests/unit_tests/cli/test_cli.py +++ b/libs/cli/tests/unit_tests/cli/test_cli.py @@ -15,7 +15,7 @@ from langgraph_cli.docker import DEFAULT_POSTGRES_URI, DockerCapabilities, Versi from langgraph_cli.util import clean_empty_lines FORMATTED_CLEANUP_LINES = _get_pip_cleanup_lines( - install_cmd="uv pip install --system", + install_cmd="uv pip install --system --prerelease=allow", to_uninstall=("pip", "setuptools", "wheel"), pip_installer="uv", ) @@ -149,7 +149,7 @@ services: COPY --from=cli_1 . /deps/cli_1 # -- End of local package ../../.. -- # -- Installing all local dependencies -- - RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* + RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{{"agent": "agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} diff --git a/libs/cli/tests/unit_tests/test_config.py b/libs/cli/tests/unit_tests/test_config.py index 40feb08f9..3b3efb6ec 100644 --- a/libs/cli/tests/unit_tests/test_config.py +++ b/libs/cli/tests/unit_tests/test_config.py @@ -20,7 +20,7 @@ from langgraph_cli.config import ( from langgraph_cli.util import clean_empty_lines FORMATTED_CLEANUP_LINES = _get_pip_cleanup_lines( - install_cmd="uv pip install --system", + install_cmd="uv pip install --system --prerelease=allow", to_uninstall=("pip", "setuptools", "wheel"), pip_installer="uv", ) @@ -422,7 +422,7 @@ def test_config_to_docker_simple(): FROM langchain/langgraph-api:3.11 # -- Installing local requirements -- COPY --from=outer-requirements.txt requirements.txt /deps/outer-graphs_reqs_a/graphs_reqs_a/requirements.txt -RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -r /deps/outer-graphs_reqs_a/graphs_reqs_a/requirements.txt +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -r /deps/outer-graphs_reqs_a/graphs_reqs_a/requirements.txt # -- End of local requirements install -- # -- Adding local package ../../examples -- COPY --from=examples . /deps/examples @@ -456,7 +456,7 @@ RUN set -ex && \\ done # -- End of non-package dependency graphs_reqs_a -- # -- Installing all local dependencies -- -RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGGRAPH_HTTP='{{"app": "/deps/examples/my_app.py:app"}}' ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' @@ -512,7 +512,7 @@ RUN set -ex && \\ done # -- End of non-package dependency tests -- # -- Installing all local dependencies -- -RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}' """ @@ -559,7 +559,7 @@ RUN set -ex && \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- -RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* +RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}' """ @@ -621,7 +621,7 @@ RUN set -ex && \\ done # -- End of non-package dependency graphs -- # -- Installing all local dependencies -- -RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-graphs/src/agent.py:graph"}}' {FORMATTED_CLEANUP_LINES}\ @@ -657,7 +657,7 @@ dependencies = ["langchain"]""" ADD . /deps/unit_tests # -- End of local package . -- # -- Installing all local dependencies -- -RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{"agent": "/deps/unit_tests/graphs/agent.py:graph"}' """ @@ -689,7 +689,7 @@ def test_config_to_docker_end_to_end(): ARG meow ARG foo ADD pipconfig.txt /pipconfig.txt -RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt langchain langchain_openai +RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt langchain langchain_openai # -- Adding non-package dependency graphs -- ADD ./graphs/ /deps/outer-graphs/src RUN set -ex && \\ @@ -705,7 +705,7 @@ RUN set -ex && \\ done # -- End of non-package dependency graphs -- # -- Installing all local dependencies -- -RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* +RUN PIP_CONFIG_FILE=/pipconfig.txt PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-graphs/src/agent.py:graph"}}' {FORMATTED_CLEANUP_LINES}""" @@ -811,7 +811,7 @@ RUN set -ex && \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- -RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGGRAPH_UI='{{"agent": "./graphs/agent.ui.jsx"}}' ENV LANGGRAPH_UI_CONFIG='{{"shared": ["nuqs"]}}' @@ -857,7 +857,7 @@ RUN set -ex && \\ done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- -RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{{"python": "/deps/outer-unit_tests/unit_tests/multiplatform/python.py:graph", "js": "/deps/outer-unit_tests/unit_tests/multiplatform/js.mts:graph"}}' # -- Installing JS dependencies -- @@ -887,7 +887,7 @@ def test_config_to_docker_pip_installer(): docker_auto, _ = config_to_docker( PATH_TO_CONFIG, config_auto, "langchain/langgraph-api:0.2.47" ) - assert "uv pip install --system" in docker_auto + assert "uv pip install --system --prerelease=allow" in docker_auto assert "rm /usr/bin/uv /usr/bin/uvx" in docker_auto # Test explicit pip setting @@ -895,7 +895,7 @@ def test_config_to_docker_pip_installer(): docker_pip, _ = config_to_docker( PATH_TO_CONFIG, config_pip, "langchain/langgraph-api:0.2.47" ) - assert "uv pip install --system" not in docker_pip + assert "uv pip install --system --prerelease=allow" not in docker_pip assert "pip install" in docker_pip assert "rm /usr/bin/uv" not in docker_pip @@ -904,7 +904,7 @@ def test_config_to_docker_pip_installer(): docker_uv, _ = config_to_docker( PATH_TO_CONFIG, config_uv, "langchain/langgraph-api:0.2.47" ) - assert "uv pip install --system" in docker_uv + assert "uv pip install --system --prerelease=allow" in docker_uv assert "rm /usr/bin/uv /usr/bin/uvx" in docker_uv # Test auto behavior with older image (should use pip) @@ -914,7 +914,7 @@ def test_config_to_docker_pip_installer(): docker_auto_old, _ = config_to_docker( PATH_TO_CONFIG, config_auto_old, "langchain/langgraph-api:0.2.46" ) - assert "uv pip install --system" not in docker_auto_old + assert "uv pip install --system --prerelease=allow" not in docker_auto_old assert "pip install" in docker_auto_old assert "rm /usr/bin/uv" not in docker_auto_old @@ -923,7 +923,7 @@ def test_config_to_docker_pip_installer(): docker_default, _ = config_to_docker( PATH_TO_CONFIG, config_default, "langchain/langgraph-api:0.2.47" ) - assert "uv pip install --system" in docker_default + assert "uv pip install --system --prerelease=allow" in docker_default def test_config_retain_build_tools(): @@ -998,7 +998,7 @@ def test_config_to_compose_simple_config(): done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- - RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* + RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} @@ -1039,7 +1039,7 @@ def test_config_to_compose_env_vars(): done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- - RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* + RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} @@ -1084,7 +1084,7 @@ def test_config_to_compose_env_file(): done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- - RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* + RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} @@ -1122,7 +1122,7 @@ def test_config_to_compose_watch(): done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- - RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* + RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} @@ -1169,7 +1169,7 @@ def test_config_to_compose_end_to_end(): done # -- End of non-package dependency unit_tests -- # -- Installing all local dependencies -- - RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e /deps/* + RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --prerelease=allow --no-cache-dir -c /api/constraints.txt -e /deps/* # -- End of local dependencies install -- ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}' {textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")} From ada5d2ecb191b4fd66d6367c7c705aeec3d1287d Mon Sep 17 00:00:00 2001 From: Isaac Francisco <78627776+isahers1@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:52:30 -0700 Subject: [PATCH 23/58] feat(cli): bump version (#6086) version bump for: https://github.com/langchain-ai/langgraph/pull/6085 --- libs/cli/langgraph_cli/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/cli/langgraph_cli/__init__.py b/libs/cli/langgraph_cli/__init__.py index 3d26edf77..df1243329 100644 --- a/libs/cli/langgraph_cli/__init__.py +++ b/libs/cli/langgraph_cli/__init__.py @@ -1 +1 @@ -__version__ = "0.4.1" +__version__ = "0.4.2" From 8f6ad0b25aa9593b231583ce58874d04f6d274cb Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:56:03 -0700 Subject: [PATCH 24/58] chore(sdk-py): Cleanup docstring indentation (#6087) --- libs/sdk-py/langgraph_sdk/client.py | 36 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/libs/sdk-py/langgraph_sdk/client.py b/libs/sdk-py/langgraph_sdk/client.py index 394167eea..71d256fce 100644 --- a/libs/sdk-py/langgraph_sdk/client.py +++ b/libs/sdk-py/langgraph_sdk/client.py @@ -190,30 +190,30 @@ def get_client( ???+ example "Connect to a remote server:" - ```python - from langgraph_sdk import get_client + ```python + from langgraph_sdk import get_client - # get top-level LangGraphClient - client = get_client(url="http://localhost:8123") + # get top-level LangGraphClient + client = get_client(url="http://localhost:8123") - # example usage: client..() - assistants = await client.assistants.get(assistant_id="some_uuid") - ``` + # example usage: client..() + assistants = await client.assistants.get(assistant_id="some_uuid") + ``` - ???+ example "Connect in-process to a running LangGraph server:" + ???+ example "Connect in-process to a running LangGraph server:" - ```python - from langgraph_sdk import get_client + ```python + from langgraph_sdk import get_client - client = get_client(url=None) + client = get_client(url=None) - async def my_node(...): - subagent_result = await client.runs.wait( - thread_id=None, - assistant_id="agent", - input={"messages": [{"role": "user", "content": "Foo"}]}, - ) - ``` + async def my_node(...): + subagent_result = await client.runs.wait( + thread_id=None, + assistant_id="agent", + input={"messages": [{"role": "user", "content": "Foo"}]}, + ) + ``` """ transport: httpx.AsyncBaseTransport | None = None From b5437528784ba9af7ee26092dbc39a36c06fb10f Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Sun, 7 Sep 2025 06:42:11 -0700 Subject: [PATCH 25/58] chore: update emphemeral local (#6091) basically - for conditional edges, we use this to merge the updates from state with the state object (before the actual update really occurs in the tick.after) otherwise - an emphemeral value will actually last through the logic in the conditional edge of the node after --- libs/langgraph/langgraph/pregel/_algo.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/libs/langgraph/langgraph/pregel/_algo.py b/libs/langgraph/langgraph/pregel/_algo.py index 2405d3d81..9c29288bc 100644 --- a/libs/langgraph/langgraph/pregel/_algo.py +++ b/libs/langgraph/langgraph/pregel/_algo.py @@ -194,15 +194,12 @@ def local_read( for c, v in task.writes: if c in select: updated[c].append(v) - if fresh and updated: + if fresh: # apply writes local_channels: dict[str, BaseChannel] = {} for k in channels: - if k in updated: - cc = channels[k].copy() - cc.update(updated[k]) - else: - cc = channels[k] + cc = channels[k].copy() + cc.update(updated[k]) local_channels[k] = cc # read fresh values values = read_channels(local_channels, select) From 6fc5b3aeda2aaa89277c79dc3682e7c723e2abb6 Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:49:43 -0400 Subject: [PATCH 26/58] release(langgraph): 0.6.7 (#6092) --- libs/langgraph/pyproject.toml | 2 +- libs/langgraph/uv.lock | 2 +- libs/prebuilt/uv.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/langgraph/pyproject.toml b/libs/langgraph/pyproject.toml index a24d1de9f..b575ad754 100644 --- a/libs/langgraph/pyproject.toml +++ b/libs/langgraph/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "langgraph" -version = "0.6.6" +version = "0.6.7" description = "Building stateful, multi-actor applications with LLMs" authors = [] requires-python = ">=3.9" diff --git a/libs/langgraph/uv.lock b/libs/langgraph/uv.lock index 1688827dc..b4c365b4b 100644 --- a/libs/langgraph/uv.lock +++ b/libs/langgraph/uv.lock @@ -1269,7 +1269,7 @@ wheels = [ [[package]] name = "langgraph" -version = "0.6.6" +version = "0.6.7" source = { editable = "." } dependencies = [ { name = "langchain-core" }, diff --git a/libs/prebuilt/uv.lock b/libs/prebuilt/uv.lock index 07f97d1c2..f41c1e8f2 100644 --- a/libs/prebuilt/uv.lock +++ b/libs/prebuilt/uv.lock @@ -316,7 +316,7 @@ wheels = [ [[package]] name = "langgraph" -version = "0.6.6" +version = "0.6.7" source = { editable = "../langgraph" } dependencies = [ { name = "langchain-core" }, From 50ce6badeeed4003c9d2a32be4e546381c7847b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 16:49:17 -0400 Subject: [PATCH 27/58] chore: bump actions/setup-python from 5 to 6 (#6099) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
Release notes

Sourced from actions/setup-python's releases.

v6.0.0

What's Changed

Breaking Changes

Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release. See Release Notes

Enhancements:

Bug fixes:

Dependency updates:

New Contributors

Full Changelog: https://github.com/actions/setup-python/compare/v5...v6.0.0

v5.6.0

What's Changed

Full Changelog: https://github.com/actions/setup-python/compare/v5...v5.6.0

v5.5.0

What's Changed

Enhancements:

Bug fixes:

... (truncated)

Commits
  • e797f83 Upgrade to node 24 (#1164)
  • 3d1e2d2 Revert "Enhance cache-dependency-path handling to support files outside the w...
  • 65b0712 Clarify pythonLocation behavior for PyPy and GraalPy in environment variables...
  • 5b668cf Bump actions/checkout from 4 to 5 (#1181)
  • f62a0e2 Change missing cache directory error to warning (#1182)
  • 9322b3c Upgrade setuptools to 78.1.1 to fix path traversal vulnerability in PackageIn...
  • fbeb884 Bump form-data to fix critical vulnerabilities #182 & #183 (#1163)
  • 03bb615 Bump idna from 2.9 to 3.7 in /tests/data (#843)
  • 36da51d Add version parsing from Pipfile (#1067)
  • 3c6f142 update documentation (#1156)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-python&package-manager=github_actions&previous-version=5&new-version=6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c37bac96..53f67c352 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -102,7 +102,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.11" - name: Run check_sdk_methods script From 2c14b1d65886dacc82a0af1d818f6b3b9cc79919 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 16:49:55 -0400 Subject: [PATCH 28/58] chore bump hono from 4.8.9 to 4.9.6 in /docs/_scripts/js_translation/codeblocks (#6078) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [hono](https://github.com/honojs/hono) from 4.8.9 to 4.9.6.
Release notes

Sourced from hono's releases.

v4.9.6

Security

Fixed a bug in URL path parsing (getPath) that could cause path confusion under malformed requests.

If you rely on reverse proxies (e.g. Nginx) for ACLs or restrict access to endpoints like /admin, please update immediately.

See advisory for details: GHSA-9hp6-4448-45g2

What's Changed

Full Changelog: https://github.com/honojs/hono/compare/v4.9.5...v4.9.6

v4.9.5

What's Changed

New Contributors

Full Changelog: https://github.com/honojs/hono/compare/v4.9.4...v4.9.5

v4.9.4

What's Changed

Full Changelog: https://github.com/honojs/hono/compare/v4.9.3...v4.9.4

v4.9.3

What's Changed

Full Changelog: https://github.com/honojs/hono/compare/v4.9.2...v4.9.3

v4.9.2

... (truncated)

Commits
  • 7f4311c 4.9.6
  • 1d79aed Merge commit from fork
  • adecab1 chore(benchmarks): remove comment-out from router bench (#4387)
  • b3d5b40 chore: update packages in the router bench (#4386)
  • 98cb963 4.9.5
  • b3e8cab fix(language-detector): Detect language from path after getPath changed (#4369)
  • 0e3db67 fix(service-worker): correct args for app.fetch in handle (#4374)
  • c4577e9 fix(cors): Allow returning null or undefined for origin (#4375)
  • 5bfbff8 feat(cors): Allow async functions for origin and allowMethods (#4373)
  • a268569 fix(aws-lambda): preserve percent-encoded values in query strings (#4372)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hono&package-manager=npm_and_yarn&previous-version=4.8.9&new-version=4.9.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/langchain-ai/langgraph/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../codeblocks/.yarn/install-state.gz | Bin 0 -> 293403 bytes .../js_translation/codeblocks/yarn.lock | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 docs/_scripts/js_translation/codeblocks/.yarn/install-state.gz diff --git a/docs/_scripts/js_translation/codeblocks/.yarn/install-state.gz b/docs/_scripts/js_translation/codeblocks/.yarn/install-state.gz new file mode 100644 index 0000000000000000000000000000000000000000..625ab3e676f5a4c628a974ab4eda930f06a0dab8 GIT binary patch literal 293403 zcmV((K;XY0iwFP!0000011y|N&Rt1vgsl}A_7XJll#gU4X%Fq8H^EGjK*Ns$y4rK? z+(sN3C=^gC>DRsI!6YNT;Q#*pA3y)$KmYRI|IvT_^I!kx&%gcgU;mbW%YXUjzx(-* z`Ck9|=U?uB_P_t}@^63q_0NC$`RfPiBe9Iu$cTG+^>J1Y^3^ev#q@mpv89i7GG@!{ zeB5{M-pp^hX&<6%`yG2UI^M7EeYB?IZa(`)QJHGI*iUG^Ws6PL{`u=i-CTEk`JvKH zSLjBy@XBbTJQZ(sy;@YBn}$+tu6qYvQR5tU=e>3MSad8EiPie{dA1{@pQ-NsXg@BK zT76xo>fN)d2_Hc&SzUYCvzTv9J-vDRIs4l|scWx{t2YcEL+GfR$lL32aFrAHR%z!J zzvFW!Xmu{}jJv|KU5;PwTgCU~JZ5!Kz4!YFerB)BEXS<+NyuUE9klPUeaLz}FH7C5 zo?4H&y;y_Ibw}0f;u-5YWwToM>~QLr^@=>Z&m&XT^==RIjPN@4SXQnG+=wId4w1Hc zC%xLGY<=vmC!2Ul;_h6gDBCNNZ2bDwYiBMWku@hL@;PhsIk#B%ExC7}%c13#W@4Ce-fBk6dB}v8RW+c8}#?+&8>1mXQw$k-|hbSh7lY+cE-cAylX)Ajo z)$g#!>*IRYQTL(U)e&CGk*r|V2*Yb4IiSSR+DE5_@*Wp={%ZI}1>z0-It#BENy+Ffm3FKCIlA780dl~T6z zP)px!!tJNWUH4rlFK)$b^Pj(dT$v-s_To+V25!aaS#Mr1)vPqnnm#VG?&arCPUWdN zO1_dR*N{HB%~xh|ueV-!x%WE7$6fJST&uey?LH0W6f*g~CY}YJ*4lMW?%lp+*WH>| zRM*Apzn9GFcX{`|Srwtj&5m>Q^w>pVDAQIJ>#5}HcZ<`GUT5e&*_&>!I@3GzZ1UT; z)^x2EiL1azpWR8X*u}Zd3%O^O)y(qU&P!g8Y*+lmqbA{3y7rD|!@TpHPE9&vSEbQ@Io0VCc54gD3NPOve+=z3;_GI61HCtZcE;l0(wG&1dJ}>5=WN9lofB)nAZn zEiHaF5)yHraF7tbqR8qzG*w0MLaOz-_*^_I;w^8sG%t z>6y)1sXu@Hz@wdM=k3jV+C{dFN8O5!+*vvjEc;kBZ{JLEwl6JP&as*A)bn-Y`V`&T zD{O>mPe&9rN985)BU^l5ekd$)*S_6*e187=5#xv7ytsTq$~*_ZEjlCeah}~xOKHz( z5mKGbd+WZES-Juz8o!~iS;1q&jjwp;t)S`N_jTxgWO)UTw}e-ZGt*pkyp+B0t1IQH zoxVMj=a|V}_*iF;opb2jGfCz8*2+$!?&}lBQ&iGUuaiA@w%hY}I$ZUZsJor&$2RA< zwb~x#3cV8RypD?-;nA0g^6t>r_UaJ|MXasKLAo{VuCr$8t|r}=ch#M}LQktJ6WySt z+!8e$(fn}C=ILeCWUkK|7uGt~sd{s-v7W5-w4c9zEI)GBo^k2n%WR#vvror0M+INQ z9QRS3_%eB@HJ9*>rDs)8#mVim{M>oB_qucGaQEH!q5lZWG&*}H+M;+%*LrX63Y-zA zTDGc=zX*P_wi#_Xdbe-<_|sNJCyykDP3Dnz-!Wn(96Wt^)sch3HMwner7yW$w~NtZ z(2`fX*Q2cJCNFdoq$%pCjxT8)+v&7ktYN(wr><0mMrC$s>($wJj!P&CD_@n}LefTO z_IWoRi)^7v>bLhhk@q$3(S0>nQwnuwcND*B+jLi{Fg?5x`Iz=T+xBXlOubj1#k*eH zB6q99QY=Y_7IW~{HzrasWxAVA@JbEyhj!~+&wJbOCw6A;=BB(>N8V;5c~@KNug$7vUcVc+I7%IA_tfpUZ+FL0 z$#$ETo10J2(BfmYn#_D_Y0iz#^urb_9haF-@1}d0l*C;|^EDc0;X0ROlZ?>XBX!DC zRs0Zc1c{xHOP%NWygc>lmMW9o4hxPe7J~;+^Ykm$zRx%f-QxAIogI_Q7WMFnWLy2h z?;Vis644LkXv#!W_ zoyYyW+EI&Sy?v$UnVq-p*>9t}wMof)ZfKx8T<_MVQFp4nFZa&&P;L+LiL$#Qdtu7S z<64`Rm)=u2rpRfzO0H9cVPI3;5%z z^PaeIGIG7JLp8BWiO5(~&yr_fr)aOx7vfnsyp<;Dyg5F--xgcXDff^pJ(hK!nu$gj zE$4gM?X6QspHIkZqkW3E-0MAV68mlzmhjia&nkDjuuq!sJtBVjP~YpxjDc>RUYsNG zO&%Pa=EaN=VSH4RFit+b9U?me|uEl#?g4aj;*(~74vAFJ|geZ>_xs^ zU+vUq`_8Q}45T4?ci;8%*N@qYQL#?sHn#gLPOVpU*IV0n$J%W#8j{5IJArAcwm7TE zW}MIa@|vR-A&cMRyJ+k?UvlC`PS}aX zC_vJ^dZl^9!3%;4WmCeUXL$CLlUl8}$%@f3;!F81^|v^}52uecbO3haqYHyd#kA%) z-iTe)*JamO*lZM{%9!5rl-Htz<}}akV~h4XlKXC}b?4~5LO8G3R<74Gy7*zl*jHaB zCZ@Y&i6MuM_Si0=eAl<4K%C}%tLsRYR*|2+=iQ@9*@73Auh6@t zQ)K)3+h||+S#lOiJHO##Pp_1Tb#HZevpjRk@<%&w%kE=-iHOE)>_L~I5VuY5QaWep zO3cO*m1Rvy+e5Xlq{Wjbj)yZsee8T6!TDBd?Vi~-X8RuJojL0~rO?oDrRXE~yE(kh zx$26UARotJRFk7}m3Q+^+QD%%z@?1N6LEkh@mhmltpPT!>3? zpI^($zU?RzeoELu-tgif zvbS{KF0@2%iPxO9J)YdVa@)N&c_%wqiK*Y~(}&*L;gxo8t+i3?<89mHX~dPYqCCgW z<$5wWxHr++?|cIt3s>iGT2j%&G{Vc;!cNn%t5I6b_@r+i=*BfGy~UF3aGE3y-GD%w zmd4lo^~NOh>~uq~`DTqQj)vH!wJ{{wY-negBkJDCoT!6`=EN;sYsd(XkA@As(|1UW zW9fDynZEZxo2}gSZrxgWvkrvIp-~!Wt&uHP$~`2q1f9(HJn%j58;l5r7|+6ZooGEX z!!F;ak>?c0-kyF(42m*)sk|l7YIC5kKfasj?Y_g&=23j0<4?-VZeKSw_aY1TA{^3d z2^53VZ{K02s;l2ecpHEDmh*O;vCHppRlQSc`y6rE(WV8_d-Uv*y;|y6S-+g)=f>Jk zdyA{%^o)^n&$Vbq?}+)cX5#4K6BW`*^c@r92X6$VdE-OwM_SnP-99Mv=RmE124l%$ zmu5=)wcE+7H}|?_^W+gx@+3xnee{fVB6dKXe$d9Pn~uy{3soVVxu?*rESd;>1l0~U z?WJ}bFTUkyL~c>^-XnJ}ylx~yQFB>v>tv73Cec}G#phE)#MW_w^rWI_oxUOFHpR5} zh4uLhM~XUyiM~{%PWgAOr}4D`Wy)3a_?2)Be$m-)~(p5srK*btSz zVve<|NcM_~dBTI+>fd2aQo2!gp2EmtMlVR_X@}99X@pX;ZW%@IPu2>5tY6Y^%}uvC zn_)yiM-{U5EN>eO53(`y`yGr`PK53loxN1C1xk~l4li_`_mZyWmSc?3AYv*DGUtir zix*S+Wawt|%C1T>hSHeK0B_zG0+>CiOweWU>@=&~$aq z*^$ly$xXSPe-MYV1w z-R#!&TyMR}{Y0xX$-cvS-Mg3P_Sb7p_r^;)(;H6MGF>I+#Oo!!H7wFeV(~eGeI@L| z%L?51TOKGU=!g}vd@`I(IdYwaG*8gsanfeuk@F5zmfr`WACKgYGtI`~lNVPQqx+RS ztFqNeou0>a3yXz$AzrZD=X>{R4L)nFebVYipHk1QTk?=D@BC&N=P=J#Ywm;a4JE$# zoQ`^Z0~#qmOz5Mh3O<;=OLsjjOM(a|baqIdS&yHd_a1xP9LR84z9Ms7ckz?MEs_|9 zT2|o}?9T+SdqO?G!Lz>hwH;aoWH;CK$}EHU_?u@$F0_(N(JN>M7pnE?=X(lMj7X_N z3EqO~;c51H4?66i*PgT+WJ<5xXV78ft6AzijJ7Q7el3fw{`>}&8Kaj|qUAzVB=54Y^1-IrGI3EVy%b zyq1tn!{>g(Ll}Gw*C+8!Q_plmB{cYW=m+EM3n7vuV7jceH*~Y)1KV`a^baKJm8QS_ zfZDx14`W!qxUZ11eKn`&+l@MP*SZ`sn_|v`|I^$@zJYGhrpTyD`2M8S&*Gg`H}pW1 zie8CBZ{Se7LHuQY#nKzrus}GL5Pfy_as9rWsNgYmStbJwnzr>WgN$ZPda_CLIy35m zY88k9*TT(+IRk4+FO??M)z-RBzLRZ6;a%fAeyH=#_*p~)v2zYB`3Cg94pjpx9cSmX zZdaXRnMjY_1u-=9G=Ckmyz2AdAvy#J46K6Z1Eb{GX}BQDrz0!*&@uRHX6ru4npH5A z11)SF{UqLwQ+1EgBf(^M3lhoZ<9kjW+xw!po@d-r{vi~!*3IWn)B4_=OO+0+f$%d) zttV2UpVZbBDy$a<)XkUpb>pbbgg-t^wxCNc7-9FoSJ|#k#&f6nSeUeAnV~bCI8s6=vOX+)FCKMyeUeZv1$)`ipYoRnrQ|&ABUUOR!JxFX4>PvY& zg}OlDlK8r#pPzgvl26`&mAph_@6|7l_Q~FB&o(8Tt8|Jb_&k@byR!l&tI!tF7Vj}= zP0(?VgXZMavo}H-T z7{k%(^_J8eZJ|uYqw};izvnwK!MOh7(CUP+iccm)jw z2UD7=l|}MqDVbBM0nR}ihc%<0BV(L_7(~YE)Pck?9A@ zhXt}L{DB>LxL+*xTXD!4iqg(ps|=%4!A!-Bv)6Gj7KBkI)Xk5l0voUdFhsHJ#XOTh zYrlm2u-1uf=yUH=h%4+(+RMdO)7&{LPT?fi*Gl``?c>}b3Hy6`t!TPo0%3mMtfK+jDfYPl& zEBbC(=j1^LFIOTg&&h&h$fz{XSPns)F?;s~DSBgnlCzJ~LS5jzm#9V8iX$2>uMaIt zKjj4_?h-qf@eSI3PIT>MUTt_+-&I;JO0h5i=moa7>s|u3#}%DaL#@fgKT|qp=J3) zqn$UXS$)k~WDgI>94Vm@96B-kgAENB8xtEp{$BbXuB4?t#B{GNs+K!4qi@y`6yAV8 zsk`IdMcfa(#H0Q^dJ)%n_Kf^k%oxwpRW;tN9x~_JCT`m>O7J+oW*3S>qT7Q4f9-y+ z@*4HFzR909f6hwUx`)rscQ4>Sz+#RutjK_qt<-hb7Vl?poVONuCUZIO%>vR>2SOdh za^AsxKi%J9r~ zoQ2(EW7ma5l&-xnd73~Vh7Ydl<;X=ZpR7+iTqqXMQ9~=E9xEN)7 z9-Vn>0m>T`?p>&F%l#x?Ll8uwYpVhTd$?DteW9e+GMB(*JU#YXKC74O!#`u^bS@La z0}Z!Xpt9uKFVWnn#r)97i;Bb3~d8Q%hw;#oq0VmCg(TB`RrP**x|3<%I95D zT#q}$=jNCdx|2iZ&_w*b>572SD2%6orHw66?;bcb6BoXNVd8COC~kVe=`?4*BB{O) zBSg+w>ETfN=3RlH@9Jxf8{LQD_l3TdM|hXott)L6I5oYp`(eK9ElbVLew7S1h#;9h z_QNi{4J018rlH!_VmdHE9-9Z%6HprG&IQI<9FJ4>;*hCjLIc#NBurKUeO% zOu&x}O$Rr{IrnZ(-Jm~Whe89$v~sig*e%;h=ct~2NH>FhV@pfz?K9ny4pp+^9qU?P zhot=C7+IhCdQD)l9ClceEjI+!T~IW;9mrw5XO`YfIpC2zdfuBPdHh&gh2dSEm0^2q z5h?WL2wxEMV7~cY1UwD`S1s9tnnggj@i^uJlzp{UmZJfdvF})0PghL3b!)M)EzkFA z_=2i>6azWw?2X3CdY@e27}&BNhd=|z-w3Ay3aq_~!qWjm94a}KK|{a5-_$qrbnXSF zsUIaZtzJv?5)5Fiozi*WheHfM7Odqlk5%VsSV`;|xdbD6?tLm9cJk%m_jK#RZ|c54E9_Z>}h~ z69x2u*TIk)_Kn+X7|al#hU#+8(;cFx4$<0n_9g2f(tVoN!dw-R3ajyVzaYoj4dNnP zMQBG!o7x_fwte>-m9ncv_f0$y{9xB2cxWxDUAawCz>LC1Jzf0C{OspKc%utkCL5v; zn7$_H6bLNf1i(pY;EaI|9zH-u&>h~FC+@i`CBP!&!JEFfknw57O+l?*VQ5Cdyl$Qt zMcvJUcqu_I=sLq(>%coUKVP|F%GO zc=k@Z?;GPlb<@i#tmQ8Ilri(+eP-Z<@_xYditw!8Q(L z!_UAvmq;`e3NJ|jMK6P$3kn)E(Y!vp9nZxD+>i7FCrKKQKiFg+J>^YMzO6)ybB$e?t5H^LuJ^z3shWP$1+IfnwWWvQ(49etxah?g;q0gzC$4JmwN~fb z8bFJv&yh2=XSQU0Kza>RDXLow68nlje^MPEMi}(_Rd$b)Fu9xmS zf}Ur!;mu~J#v}qi0Fd05j}QoovPjWiY0%y28&^>q{*SwquP*3+qrLhdEp|*^@1==y zqVE7|us#b~j-hpa_ugv{Sk$`Yu{9R0ee6Q*TgVjk=Eg~B>9m(RzAxew@_7w}1DR3s z@xU);=Lg9KF}2wTQk!WHkOai18gnvpsh6q>Oy9UyS$e%f&R_uJ6F5|&&Arj@ne^*V z`iyH-pYX4t{q8PwcGb-~SGP~J;@rQYY#8i%G5DFFvP%>gN^TrGp9PDP2}Y+JfG9Fj z!Ed!<)SNiruFW(fry^LIl%iN z(;=C?{o3msG3AQ~S^O!OR{YBFFtB6BoVPsIrnL-Y)pA?~Je(~SEy^5rmQm{}{Lbe{ zb@^Uz<$jPr3N}u1t%IB!BNjwX(M_4Y-nzBknvCrT$nCl30*RiA+_Tsj$|`&ZK@+q- zPZV%t;f1!n3ebh(=RANj5={)1r3Z`!zf1nU$X%e}yvBeya#9TFH_%wRfUpEw2To$f z5rqCCSHEScBlpp)n1kWr8o*%0S~zK+E=#nbvVM0omcq;Z>zW?BCo+m686dOZRPLf@ z(T@xrFs&1B@G#$#*<=sHxsx#b9Jrx}H+_G{A^7ADm#t%7pdR^J%de!T;YALvX+Pu6ZomP`&hr(0o|9ymG73g za)n>l>H3{2RUC&R5i3sEh9FO-Q|o~N|1xvjVJuB--f&0yR0e9yj)kLi<2o)0@b>7_ zHfq5dz{k4?fLek6G}Li&N?K+oF+xDjzd{b>Y0Vw9OW#HZcWTKzUy?YO&p{A^0-g{uYywa0bYQBOz9#zHMQckIsWsB(03$a zV4M>WM@bi3ptFrl`MsP-Z65GdzUIBJiD&BvCT}C(m4tw%vkZaMOk{ zvz7*U!lwek4j;HeY+a8-%^TzI1I2X^cDZwdmv1^S^*XP{!c0ams&5fqquF_*uQ4^9 zwcj0S+rSezkAD#j0I?GrcA!>M0F{Ni>k%bLs%;$Yq(j+7yZqV228zTA5zjQ77Pr}{ zYXnFFj^RQ2T97VE1`~FL2*JiS40W8Bwi8wvX^a`gya6R{E%YwY}KxDWPMvGxH zuDz(Z-^>*pqKK8xMxrE^IhxHvU9Uy)CB@NEia&7hfF}@~@T<^BpC6zGAHR?t7@2J$ zvU%j=S+_=rIJ*h~{1y;B`4(u+I-xp=q54RJ+BFAE+RyS!UDT!hkZIL>wCxQ{>Ndsf zOwbDR?Lu;|Z7)T2>_QI8?UrF;1UNNo_t}?`b(W?F@}*AVEO8@Fl?D#1W^nKkUcC>A zO@6sS92|WYijY%JKau@j&pp|G$=iAG1CE#Le7d6*Lf&T?hiwOE2q6Fk`4(bEhKFR~ z6T!qs(E4D6V#HbVh-qTJ9w3if{qurD_Pny*x9SK1H_j)rxR9I@L^R4lh?RPL9P}oT ztZxW5l%KRq`Mol0V}u=9vC%A(MkCpXOk&+Kwe#N63-lK0k9UwZLfBaMaV5w^P3{h0dA^j4A4bDEahh<3kzW?~ zfU^zh6^UqaG2Wf9_SS;mXTk_=xw5RNcsp2Vg0HSm95D_c$PP zCI#yO?o#Xb-bTc2QwJ=@M1SaO1bpL_Gqy3Nz`TFd8uzP?$Z7zWc|a(?e!+{+!#N8w z40AoSr39>`83ujcpz96@Ii!BxE`j%idt57y87G2$Hc0Rzqj9fE`Zv(6g)Tmz7Qxkrmmmqo z>TFO}^qRhSNCM$f&7DNGXG1yv7BOUkTy7I+%#Wcz%s$Joo+2;$$b2mJy>)NEFhL6< zG*qD9@DZ-hIt1cto42BJL~Ui5z#~u(5%oDBC-B62s~4h%GZzw#!lRY)&Aya08 zdB2PO39FnBBug7}`Z~0I5HO8f_y7yyyQis&V7*3SB?EGV#Pb5uxpW^Nr=wuSx;{sF zna+WRphy?I&zph=H{$Kb9(2^UdJ2o~1c+uVs-c4E3bF6`BgddNSdws3Z%_w zErfpeb^x2if#11)Z>RC&)nGc&n+4g{wJ07IEC|7t%p(V)LiLh?Vtp}#-c^LhaIJI$ zvvZzGzIk*_*6S}uC0}@bp|Ka^+wNYmJh8_?dCivdP1g72!UiNnDPZFXnsEgi2sQ?? zqtiEu4XDUt`jGiF)X6g|l|z-pv_88C1HT9urNC&3nGFV#UkPRk;kXCseJ$Q(4U^E3 z@Qf}1SBcII0Qf~zA8nvnfWBOeTmR~vgESMOO`jguxp!$|YlIzyE|L^#2WcH&x{>9Q ze)lu$+>)mjR=t##Mli{a?;{*Y_=*igr^%nXDG-FZcu4Fk*5ZBc=f#5U$h~9n)D}Gm zHB1>$nsd*~E1gU}*?#cn3_O5Gu1sdQXKR6y-WU+Dp$a!5H=u%Lr3MX zWrMy2Of6XY1jo219$0_H(y2M~xwUtp%(^6O3XuNZ-C}c|FxC=@zp;@+7ob@p7DR|z zX+RqyvxA75-{}Du8BBpEUd|m#Iu`@u(AwKr zePbFVejmkwjHO~~Vkq&*^62e_4GZ#+=fnDr71L+t4Hl%R%=UD7hK(+Eh~ciw_+H3+ zH#S2&S9GZH%!M{%eo@i0K1%dl;ElWiKh6i9A}t934?;a^>P8{~xh|@rtflz`!2_## zmGQ8a%7HqfiwqE^_h^xCLK4#wA)&2gq?eVe%t;}P^{2Kok|B618DuJbE^qS-&;qRu(k?Z5U5-nqUXH?cE!qp zrB2IKk*3N*R20u2N)urv1eWKd7!a)|2@`Xz1q61L_ibgLvM<%hq2}s-rR>!xqiJ3{ z6De*(y}?!*T+D%0_l0&02+i9vIfW@r77eCYMnd8vfWw!r!S)pf=(7gfs^Glic>&B~ zSij{!N&%pN*n=0krq}t7@0&(?Pyuqx)d>c&xhN(8=(bzx_1-g4;aUg!CN3!VmM|``lPX+-WNnl$WXhIiGIWWLe~twAq$(nZ@B-QT38(f+coBWy~IK=%xw@7vs)~%ZTFLh&u?Wj z4<+zqpdXcn2^%NJL#OS2Hr6YQi^NS1Br%)F5c0?-|3LLHiHYltzFg0M8JFvG* zr}SkUJP1M_SRtr|*^Tt2jp{OF?q43maa7_A2LP?7V;>Mgg957kI{v?RM$Ypcf`ruZ zTMO}xPw3gm_&hd-ya0rv3u`M4=I$!$?f4U#yAoSl?%9EM8p~qf3fBQ4H@;ZA9gEN& zmJtnh4OTIBS=LfGf9-uFQCS(S!kxh3jWYs5WygiC`Z0yQD+F8fpw@=a2_#CfG{xx% zVOQb7$_`jL1P>Nv(!LD|z>5rPwIIY`5eDL6_-z~COg!}i>!J`vz%?-cz*7eNrt)oO zy!R{^E{&xpAgZt}gFAE`2&;h16X!D)fnD?%wlbn0ert-IjDjzwkh2tvIJ6B+X<+K1 zDavK=PkH-=UC_Uk_-EJ{D!ho|W?N{}eHTj$U+R7?C7j@%7}65Nyk4k50U8`BwiOG+ zD44rgh1CKegXKvd;Lpe+!FekSSf#WHquW{6zx^H1nwT+(%eLE3>YnYjSyxY^s-3NC zED?Ml?BGcO&_Z*Ox+CXJ8~dr)X_((@kH}*Tdq}v24NSwv6Oq;;hqht_!GK~IvGEa* zEl_{38!=My2ja^1ucd4Vd+5+#Z(M%3X1k2B4NSo{cw(HQSA(po@J1QLrW&lF5fU}R zD<$9v9dr^F;B9lH3%}#)TN#CY28`^LiQc3Va4Y+?r(z@`nAF1#jsY2aY_CI*Dla)* zz0j=)4KTegWVm0xgW+%u&}P4Z^_5Sm_aQ{}Y_uOt`5oEd$1m{n-HxMqkyj|JcdX)*lcW=m4R@xi~%hwU*NVcbbycbEWt{% z=s1)M^OrR-e&VWI=NTlJFZj2w->)=*lkM^;SIlql-8PoH4AxYk{b1~CUHc#a$+MsV zG=zjtc%77WuxEqsYxH`_2XDto_ADT7GGG_x)jA9D!-Hl|mo=m>`6lawn}l@xXbJKT z(4FJkUv%>!H)=7a+n+=xHecQZOm590E3d(shMvO@ekCF@YcG6@+VY2pZu!HFKLqpcH3x?B9H=1mkWhX22)eT`T2w;RI0qjVp(L#+oW_T;*xGO&{^=w&-RI-keK6JyTE=Roe*hQt&S{({WZfy>dKPkHRy zMfcV$EXUZ`BXJR7AUS$WVBBH*8E9ya#T#(DvX1gaasvNjef#Dv_SPZ@h9G>v+Sv%z zV0RT_U|?E3;bmb5CI%z<62^_8)g15bPMeka*z4`aCPo~Us~ZbeBPtJ-=-@HKHoHMU zsuUZl_F$sI>O<^Nsbve;sc+m8Eb2RN%O-5Xbiw9ew*`)Kso`-HRF_6E?C-Ei?BJbu zs?JR)*IY=HL4khASG5<`6FSDO#6o1*P&dH)=Ud3MAeMU}Q^HizYn=tjs2U|gOY!DE zEJgu#^;xAm`h=h-zgm-BNRaD=Ui&u0!To>ioxQGYxp8g-=Y|2lK_^ZGgDn0OD|PIb zV6jM`frgG@$?xFDHbzZ_2As;kzQ7HxuGD?b-fPWCR(;KcmJ)q&X#Uy=jQ!0m0*D+Qo@S#?_jbqH^+sVm} zQNuhLTPXY@2Vu2Yq8D~QCYAQPN@ic#Hl0FgoyXn1d(!DGNobV9qm~`XyTC%%?Z=q8 z#$?IDAIg&~!7KrG`0%nIEKc^S?9Cwqc70R|V!72|Z)lx$I6N%PZEeje&_1j-E?p3z z63Fi3F+;4hDQF@tdIrXbl;;ld$6?1+25*^1mEzQJo3Xb*mbvr=PY{dZMBQm2%GTO# z90Pr#Jm2z8soTbpY1BLzF4xJs{uL+?w~?dWr;?N?8rN+Io$^5 zn`^^v&~Q6sCtlZt_IVh27 z#X6-mXI4dae#Vb~}uQEmp&f(7@*Nqjct8nLD43 zC@aG0s;95$UJ43mks`y|lJN$c6Db8$l- zbB!3`y~_XtyxZ6`z~WMdd?))6ZgyXg2c@f2z0kp@Su(n?_#$gWrlk)iOdK;}O*si! z8^;z5Rle}Uw!ogqJX~#2ZyBWmZ6``uwdS*HIcTg#XuA={%a`@or@c8BU@XQ1aYCre z?pF9yfo0-T<YvTu2QHg4x-{m1@t62&pJsVkC_cQFJ$}6?1k3BNlLMi?15a+eHv)N z%@cKu@QiTzB4!l_ey!{{eAdn~ff$&n&kC_;ZBYW`?b|VosWNRuVcOM3E0kv1VxMK? zMMb$q*2}ska@_a&l(LGf_lB{Vx*brGCPcKbJLlR;If*?9(g3s$l#CLJ(pO-luw9o< zpxwL@S_K-SPoYD%IT#8P6pKr_l1ubC<5Ea(<((H@X_qQYygaj68m-4xHgzI?YdmokqQKa-^oO?`}{B-()+|b4lo`v}(y*fV`T18WA$W?TpNpaF~R? zLu{vOy{i%){aO^1JA1i#L>#u4QpSXrm)|IJKI0Z3)!;iL*8o|WyqC5)Qw84$fx#7z zPe<(n+P`htaaZNl-L}|-c+4<0N?v#FP^q?I=L1L92dtf)++q`W$xki-&~FhYvS28A zYxKcpkMoS#Y?_CjS@}h9hrN3>sY4CQYE?p;G;G`GWp~>{#-$t@0uG8@uFNo!WPT{# z$Fr6jOPX2iC6$6bTZhGp$2x!1vJwz`_vSoW1vZ^Trn^`Il?pv(bie=rf(~UQbwC7j zy-qjL31tPJh7Iz10G}jha;qJGu{V)Kfs(Z!qfRJZ9h2Kh#Sv)CvqnZH~d$(&B;8z%FaPe!)C( zI-_O;xlPZ_LktOPcDL23^Ma!)7e@PBC2tt?*nwjD;sSdYP~NllxC}RfpCJ_IZoHS* zDt>xaw`P5AL+4W1CFc_11vgxQ2ab29AFK0rXBidrJos5s@F6v!V|(>}=N&zIO~5IT zqeC|Lj6OFB^~b(zbbd3eL3icA^a`bIcAm?+>=_y=weryY-QeCR_lph+?dy zc$4UyR7hX9d$^a2op$H|@1UspFA& zeAHt2_jL2O=hPE*2H zp4YG6J5r2LWn=w8NDWo!n?`LHt{AKKl%{u>GIHtqjD}-6Kuxl}>exxxerL&i~ z^~5g98*EPgsPOw=5Gc8tD-q7fN8u>+?l)c$A%%I#>sS?%-gI~>MwyESt4P#}y-&L}pWG8Bot^`=cWdwK9siWS#6fvCIsZ9fEUx&B{ab6450IH!3>^ zxBAYh^Dz|$$ui;$?s|=X@Qae;hgG0g3@dvp*Im#=vikK#yh?(6B4tnO0AWSsZKpgr;wzW0pxaw}}k}qdE)wDW|1jb=Z7S`=RNlc$rlIlypv+>x^{Y{$= zik2hhwe9_p0FHs0$jHut_&#&@oWwW1AcCm=zE;RqQ2Q{ZId^egI-?dE_MJ#rSEa_x z(raG+sX&hp6fYT3!^!{dOF5qv+?+L*zj{#t9MN$G60upc)3s_#f5ZhQyrPWt-qhkY z`5!+H)anu&Q^}xr}-^;w?=4fQfnLuafcmPNAcC)d%fslfnIL>=>=S2zT5#<7N z8xL%5r>8**Sz1fPsamhyVDM2_xv!eu)H{{ zKj8fB$!nCw5#`vP&YHf}*V(4Ffi%LFG>#cW34=Y=CW-8oM@HGr8{i2Ap5YTW+8&Q~ zAP1sc25e$;GW)Pb^(w>(=faD7jLU)S21(X&3e31d=D_qwsm0!+g4j!J7VlFM&{G*k z9(IUN<$J&1DN)|*w&9UBsDHh*F05ZOJkToD@;Mx}9Rw{K#^!f%UToXPlF4s;gUaW6 zr^!+G174xJIpJIzN=I+3Y^DgUt{8mH$`?{Rue>R}SG@$%>~BIB}+3N6Gyag=o?wdnztetZam{`^+}n*=27ju*ei241vWHL@j756HCT~<;ro_ z;$Rx7u_-z_-&CUEv@A<2lfwPtSIzQI^JPt?$!OwJwy%7JcJYM)ZW7Wrau{l)W9J5w zR^JIASG9FYrEI=idk!b34)}Bo2LXh2A{(P@Sd_Q`DC?p7OMrqn(R^CSd?TP_Z0nyG zBF9A$Y~@JrF(QRLJ;V!u8n6It6A&!e?6A7|ud?8<+B*eYGNPAcj5{4KOscl*lSw>I@Z2>uE zTV!%4F!gJBn-j(_)p^+6H+#R~Edj{4ZmrsL`Z`SdfgbZ%nGmNzbJ!2cPqIt0~yxm{y_=tc1yk zt(|J?h#-7NIJ$TP$3f6EymbZ_t|RurUSef%t<$#1P#ge3K)$~PHij*s zlGe5eBruR7nC>@j1i~P&Hm-0SV`l`@P_BD;pZdin07QSr?CU$eo?6OD$7;>=zVKz^ zCbG0|_tAk~9zMY>^9hHy-kxMM#yLDbbv7+KqnplF9|}5P5L7Q-DrK8PsE74u6Y}=vcm-vZ3ggg@ka+A`ib)cm#eHHNVaU{R;ghM!?lTcR5J`Eno~O+GHA>9YfP-!1oO_IDp%|BeQo4NSPdN zszP%TLG2`!yw=P&q7hGjYx7evv68E$J-M_k4+4MG0D5Z^Ects+$KEw|c(q!``F2x| zu9Esgg(TN))Cwc}#*@Gw!7v|=FXjaH{$o$CZ#S3qkjz2`Uffp4RI17|CTTG7+N+=<=x4nJ7X*fTN{xGn);3Q2mV}cKKCT1fmAtvlKLz8; z8UxG+Q^rd6w>|Pplljgo*fv5R2q2-VwP{OP-RDUHy4W_o82JUIT0#>}5RRa9YValf zHBUCUqE+MeG2A-hp_nN`6W=;oE|No1_paR}*p`$FLh+MwePIxoC zQ>q7CIkXpO**GkyP^_a5wJpEITIp;Me+;fw<79wMFSmMGkYvgJs({mN6Nt;|wU$d9 zjFA{4cf&WkY98Vn9pl0-1hsn{P|@vi=%ObL@3XdHt!MZ*;CTX&;uY>_$+%9n&Y_;m zO1s#@g5=&{ddNw--U00$$RGRFgSVs1$9u74v6b9}AF6s>-I2T!LJ}T7eJx>HaP9;~ zzW7S+)jAlAXO-C)tlZh}wB7AY&TOo;0jV`?Kj1kWPB${|l|@0y?x;(-x}94Rmb7Pw zJ$p_gztalw#BnNqJ<#ax@6fP5Fd=A(P)iplm`8gr7QW-#(IIhmMBku0>`V(pZl_g7 zYy|6Q?Ye|t@&{GeRo2{D)AY;)HANlrPu1IL3-v^+`yzf2W{Lbu&Cw{-n4ruxZ3Zd> z67j{i+R(@$m%gBaUO|L=A7!Jpkgf4YEoF7*3xptBYR;PKpm=jLd(TFQRWv@zHtY-s zIOBaeBm#qL2|CXE*aHAQTcF}Fn#iS=cXE>C*fIgKM%nyd`ZnfZYEfysQe&Njg@ZO; zHVKoUba!~R%aFmcw&+K)&2GjqSQ-G1HBwMG-F44g>2-cOZX;wMqUHxK^Tg& z6c}#7^Qd{WB z(<-Bh2o~@d=ZvMB6_v~OAhzK3v|Dqr4M~7K*Hqq8)p=o%EJfWr@@8GAKF|J`X|k=~ z3e>64(Q$=a7g%e>Wgp(QK~Z#KiDk}KsjpISva_(koisJJHu`ut>XJnb;;;)hECh{p zst_F{4LhW8f_{9m21$RcnMxlm$ux;$4m+rv$>PTZzWO$eVOH*#sx?)DpiQ32V)t){<2;wGV8n3O3}eB z-6qSyE?Pr_Nuo?S40Co0W43kXAiS1&(6C~q;xGv~=lf`l&bW+l`0X1s(5jfxF7Kwh z)URzywoy^n^j%UE%E?Qa)7W$h2Tq>kk=LWKFNZ~Oc_-^Gg}0NCB~V6#)c}0bMc~MCad+zZVa@ zehHoD^S}345g|j`tAqS9#74g5dt~6AV|>Zy6_X%~5j^7So{LjlaFkrhlWIBcT5*xk zZIDEV_4JXsWz7zgs>XnJE3idw^k)l1F8(8BNO{qOT-@1%O=M{R02pidMG9tmZkkQ# zS59C=17O914&{X#r{+(AJu3wZwT;>!xlrI{$@ZPT5Xy3XzQlb`)gVq%&tuHdT*tV6 zb6Adf_>6%##~vR8W~2|XFAoCr)WmKym;6hPK|N!z%!Q7j0%=b=JO%PPGpkV++t@&r zIj57W-q&IRi~6`5FE-!C(J?QZy>qlptKqD$-k9ycaAKOH`;ULyRbf_azLIiIc z{2AYfvx-n`zx-H(Zky*MiSK9$n~HzUxDsgUOdEtuLhf%v93Bh130Qa%!9o|Aw^o49vhKTOa{;?ZSG9@p z>b6t0qpbvORB<;~J8^S=jfaZd|7~!k&Uv#v%`5!mT44Llf^6xtXp{$ok+gg5f~On; z$}DbJ3vQwy$Fen`FwoWY9A2)51n8~Nq_d}(p-XCQvlk2U7EE|v zV_r)T+2!Qfk%PsGjZfEs)#v<=m31Rp8>IAc$s)B?u+UUTE_)KlvcTu>M(H|dn`~|x zK<*(%6+$UIP4o-F!TDL&9Jrnd?qMJYTl^xrIK|}IXtWD&2da#Q=b|4PundZM{i=*}1Sdjjv7aDWy8pp}7GU z9ul>L)c|d+sFa9ljZB--kF}KDv^h>@ODa`cko08|kP!ejq?xq>B}=(N6_npBC-@h4 zc0su0iI%vYn=!k65jh~0;p~}w`ZJ{L>$IJrwev|ua&!3NoV~<^of;)O8Hm#|a17ux zW{N!GF_h0vo%gexf$bsR#Lk3OLn`5dBxU4E1cXmZ0OUHyc1Mv4HMOo2N~K*7Ka`Z1 zhw$2WX9HUX;u#EH%!ZR-WmzfbLMHt(Nf#Wv$RxLCsAg~0G!s()SY!cTUTbB~GOdo~ zl~GN_!n_&0#zFEMg~M8qW$VCJ#HGpYfa5Vq4h#}q+e0TauuQXE zKHWtKGQCeFd{-X<6LD|4_$de%Bv-?&zREoFzJRZpsheTXNyfBXXBrImXt9 zD|7HBqEz4TwVpbgD4?#5S@LV^b@#%(>kyArS_S8+)QxhX zFD0s}$8QNzIk4@~i86zx5#*KbzFykbybc0p)6~p-ZR}Tt^uO7Mf#_gggyJw4*ajnh z1C`;Zj&Er3PXMY?1K<|YiCv)obOY;yizTpl-2kotx6dr5qgJ9?*XoEPBPMI6U5^YUcAU5Z??Q_h7xsD&lg`6M1tSFHrLW|E*^Z zdar;2vyZe<;rF$)XQ) zb?A)(q+kVl@oaqa^dXp%9lDFhN`#6d8eu}Sw#?r>Q5mIc=k!afcyI^~d=tRz;*?h4 zw^|`Cz>H>{Z5xCecPsGFj0~za%BDoD(wc znCX<03mwM6=Psj^r?jC>6*uH7?dD0ZvP0t3PoY4uDZNW4xF*4Dq>==09fA@7uVKt5 z%PAA3-?{n9LniaycP< zsq@xn3G!Ps)5!N)-A{OHyXhq*31n*KB)%D^TFFReq5jzPOT4fw&_*oN*EwvgmrQ&(*hj91xdDs z6PBKoS{B!KDvY~L0(=|F!L_!YHANyw5CT&hNVQZM>{7#gjKcXbO3*6CR=NPtqg?6@ zyLR=BL~XSj24FhFhKiK8F1`S780jvISz+}QK4FbU@otwal+3pHkvqkpg}#P0{N@x{ zpv1RbLkKf1qlOMzJfqReXeUEvRTJp4mM7q*`B?xMH`ngODwysZupWE}3#u*tM~Cyv zE=)%@E*=u))Xq`M);rG~reX|Ww$2)3?X4OW;ta-eTMOw0_^vrq-e5EROH1Qsd#tQd zvAy2OGa0=n7IE_aj@G@grp7qQ%_&uOvg(_c3Ikx;XZ7w`3vqdjgyq^Bpg~v<&uUupR2(i^u^4J4{$1! zyz?oF=l(o=W2ey$eIqq!@dzG3zC{v0qmcVycFN@9`#9c5Yh6Hypcp&RuxXt};Ok)v ztX8SKtj<&xGy}R&o{iAC0K)@)1MV02D|VHY;iILsN2KAM}(e;2K2=WN;o;TnGd)M4OYU13-ce__Ac+9x z#+)|U*-WcT0n~Ip$ccv{3_cbC-#j(px2>*R-20uXl?C>qh6P3~NsCei;QWHcJ;4Pfd2cK8y|x zu!La4L3Xt9j*kVdx$JSFVgb~ny?SP^rP<0XOEZ|uFanm6G>dV+fFv#v7;c z)V z*;S(wVAVEJKM}EL&Dws0>^|2K#3mKt2ZoNAj7m6y2=WoM%N#qTB5k1_isvNKPuX?g z=A72J7K6~N5e+mx6SmuunZk1-cX)bpKd*s1m&_osaWikTJ&?rS&kon~8uFIs@d{2Y zc@=C!;jhDRoZ32{cFlv^1TuL1kY9SEw$2!Tf|b+R`_AL(BeBR^+frJ(Cv?yw8vub_ztA*mouBR*Uu93^Cmw$QCMRLR!MQ*zMnK@Cf^l1Ek{*kpu{1Q z<7Vvl$uEp#&7-j|l^`60)aWpaPu0QQRF=xX7R2F@5AMUvbcB&#&;3GRJtdJ_1RfNX zpw5$6>|TP3&)O=*ouj3*SWruuG|3Q-J9~9%l|34R^LxbUgOZ)AV-VhXXFgO^HKWRB z84XhhAI-64G|aAyn#<5ya2iRSNXJXiJ|c~7A&|E3j$O(zG$aX2;><+g7QyFJtTSGD z!jKEX63Ql&RvcXby$hE-LXSc6(5=3t@7;hw`DT{D+_Qe?g$|i{7f>r` z$LFSDHkI=&}j#l1QhKE-W3Z6i7lkFD{_}9tUp@Ytyi6V;JEUPJm<|) zgLqnd3Lk|<oEqEM3q{kB&!?4xp88-j!rrn@)@XCra-C}M&0ByCc8{m^-GV}avL86BckIoChC#~|2YDGrD->LvyJVJyBM1u1 znyItaNXn2v$a-a=WUb;Op;WM+z%6VZd+j=dL8{(~qh7@CIHJiVjdf9gnhD!!PWRH1PBYd8rw?lRc=)A1OO=zkNB6qGA{`CH4#Npwa5^!p@<31_n>ND5 zo>?VimFpM+dVp3W;)^B_m-Xnxc2&nhWjLr6A4zIenXeJQe(#iu zw-$8di6kqMvcF0}|MnD0w#$c^q^7{LX4x1e1Tfbf8A#W+>*(x-b>Df5FxZc`Mq;5; zj@486F0c7zsw`Uu2j0MCH3>c+gPxnV6(XV-At_g^gye0V=i_^;Q5PvJbF*$U?c}yL z>S``n)8>_6O6xwCI4KOBap$4aayc=!P4YUyV?4Gm1$F6Y1}+X4{>5wKXp;VCPl;b(ERPFA4;*^J!a)pt4Be7tdFPoq)v zrLw^8lb4j|Hmm_H%7jban#B^f>{F#?q>ADcDWO6zIMIIvhNw2*0*gs)Rc7Lf1l%Q+ zSNF=geg1ew->V;LI2%*^a(SBG1j!DgD?s`bI(yx84O$<=UN8< zk$-;~o0vL`5s=8|5(Hj}K5I!kSHvMS-Jn4U?ND!%3?8vCO<+GfYLhdKOV+3ij}!_5 z0j{=?KnNcbUsyDz(CDN++E4+?TvWQd6G!$&Lfq|8?5w;R_-}v-y|2z~uPcSKI1>(e zWAamK{t=4aK>bhwR8{x6n=-TByFw}6;(l4SVlJL+chzfNM?I?+)<`EylzLu& zxQCl`UTW(e;N$1+HED`p&H6FFsi$ayRwFnNW5K3y0Q2pxJFT{7JSIPIR*p8#L>EnO zxpI7d$72@lgN1Bk!Z&s&t;jSQk>AD>&n%8G-U=_FGF{dWk3v3vTiwa5aQ!E_C8!?35&+{WgntF*V~bdx9LO&Fp08*m?HrKa(-Zu3%dO>LVj{|*nCJ6OnFO`H zmcn%apR18Vl&f@xtHA3Ths~DPg&}F8T0|FkPx=7`wb8% z;Bj(pUk~?@uUUi`FYSb}ir#k!_~6@ti#7?fIA-&b7`;|8GvW1ZPlMM;117*{I)ZV! zU+)P;IZP8_%8PMBI|Y)H9(p*Z?6wx=5xx_xa;yB>lABp89-lhIF;*%zC}2g_LmT`q zQw-wozBFd>@0(2T#IE z_=ed$273X~Rc^YyFN|$|k(E+ViOq+rw&N8V3XfQ}6jq>@pH9{& z{J8c;l&50jnz8^~+T$GPPn=XwsVK|R&J^UIOJ8pYz3q`gz%!3+1$j#Wz0bWa*Nn;m zBL#|#iyDd~GJ;+5x2OjR9HtSv#N8q%O=pQ5*7CcJFfbT3@}hWYzOl{&VZ0HBaZ&d} z2#=2=x;;c-Wsx)%C_LGz;FkX=Fw#MStefWT?%)Ywk?A0&c(3tF15io%oKP&EH1^qa_)L0* zw?(4s%*jHKV9?`gjKW>)wu4piaMUA=?SlycI>2<6GyJW6OMSakab{ABbEfY4 z6;r8HHhMcO7YM!0#$#x_`w&W6td~i@IdYe{JoTgzFK4DyH26**R{|VNSirOPn(+K8 zY+r5qn+%xpOT^TsPmCZfSw4FZMxnw|bUZR}&03q4Z5?w7n3$*rn{$>x%h)VYK z&fOq7Flal;0N#0bnsv{&9%LYhwPW$uy~Eq2(v5Hc80gmd=v{*7Jdy;@%elkXTYT?y z;mqjL8I32Gg?)+hdZ}iqs<8T;)(u%}E>2jd3H`G>CB)IQg3Ucm*(At&gQ+ROg_j9P z^B3cuHJzd!p^C=$Mh_2^aS6TvcW!m}k^YERYiAU{@N??cWKzvur>^?6@Ft+Qw+UIo zh8+-i`HO=21o8$V;c9T#CSPFiBb~7@s{s{yYWr0f9Z@&q*~TDzQ5e*WR;@({Z0xC| z*yZ7&gj7kh)4Ps&;Eiz%Ij?s|Lf#1=FfFC31DaLz048O{y+SZ3kidaqwyBOk_5fI4 zjOg}j%_ipANs*h+!aIRZBHkFlzpM6!#fRCi*EP3ntGeU$N4f}Ww)WUk@Ndu7^t7t? zNokd=Bkg}4+k^Lj%#O;Ci|?iu91DEyS+w8+kp@tM3?XxA>7MGjP5+-77ZZ^SWKlq| zrW~Gl{yZmWWlka{wZd*HWHs0JzB;>g1og(=+|`BO*jtbdx>P9rI1}Y%w0NyopBZoR*|FDjboAKqDwO8EE{Q}XQX+m3#9l<0izlf_`;qlUD zKYem1{cs>W^rd@1{Jls6UKUel;d-xaqPOOTPj(Sn$$6IIcE=1ggO?{0C1Z62vc4T! z%O~HNr+}5cRI}T$TlZ}T?aTDX!mUd#hSsnPA)O$M&NX+?K_u?&l!HU(E{>+S?#T`g zxv@17pipcl;jf)uf%5nLYS-I39im&8Iv$Ow)V+3L_zw7k%l6|=zF*Jw7##7{%N|6Y zHwed!!LcjlodW>B0ol6ggz7}}D0wfK`|WbQm}bKjpKh=$x{NwR2$Fq`V^>Z(E5? zaX_3pq#_#-l6}C-6SOGO$p)i7Z?bQ1FzQxbEI|e0x|5Nj)zjDJ)H-bXr_~FEDJU<5pGv!aV!xwzrc! z0O;342!E108c0F_2}v(X2*2;iF@r}VbjztT`Ps`dA23oL*jYS|N!3{Qy63tFt9&lB znJ+-XC0aWsEUkWLpTW>_d_j^nIa4+lE)M`%HwREY1s%z_Vj=|RCd2KJF`P4z$#d%f zsa3<31=fOOGa0uqA-!I#aFiI8fDuWGJQXV2B`;|{?I{YyQr7&A24a-OOz4aqeFp24 z9)@$QurdlrWf;Rtqd~kc!=_rA0~D1d^aYTT9D3Ls#e(CqVAliW0ONcfX*i~R1ctIP zlf_Xg^EZUMbCYI%wiHX(-7FQkFe1^U&R=aM{Hves%8-Y7jywj2R8^uIxh3n$!4-y<1bZco}alt_yOJ&EfLjQ*+bfy z#9Tbsa!$4w0~%f5oi{GJVNOL4gi?YtH-v(xRY|+@z&f_ab8HS2P%daxPEKof?{z+6 zj#cx4d1m598>$ZuUSPPSVmcvldO#qz-5F2oAwh49UXog~=oX)Hm1&#ubzNBQ34P{q z9JpTRU9PO2Z&s9Ov8}n@9$Z?;)Me-^%L(rsBcjLcWk?E_gHJt=lSsE}xwKRG`O*F9 zEa?OvF)m#lz}Q_5rzXs;6&Od7jfi^Yh}l4;eXAE8)5v*Gq~SP zr_(Uuh)?e=^$<*{x+ebdVkbR?ZTRHbkAVhvxdmi|-5)w4H&l4M0E)yE=jL-s|CCZo zd5h*uUA$qZS&|1PxAHrb*W22qj5@h?oAI}H?&CsYqVS^LzF9_%It=m?P#D@kcF+jC zQC>k)c=s+HwA6Sco7;$bE-r9YVX@H5#Zd3OxKf=fH6a|WztV4RSmvv}fmGn}$G=sW zYV3A#O5iLZ2G&@P9p+K|c?i9)UfR;wq-8K8c#OHKTtIJy5>!?2J!{{cA%3zCnu{SB zgew^;UuBI&ABFtKA$|N}pLqsZf`$Ak%GAOcXzU^MC?+neRd%hoU@wL>ju&{9Wu1z6 zRB|%3lGse_(W(fGR*KJA^+qbn4~EOr;3U4eO+MyDm(l|v*ta~N!L6-T31IEAdgZ-2 z=cSg<+=YezIC0?wmEB~K;BCR?roe~ewM4+fB=3#XM&#xp9;R&V_-OXBH`_3L#BA%> zy^>mm8@e_f_yz)Cu{wTMOJSI>XJ2v=2EH4G%gC(!$- z)Lolr&$=6^)^LFHm15Ou!3+z~cEhZTZ2_QE8!G`m$h?46I?kI-)beuAE0n>zZcZip z@Z;yT&SXn^`j{p}1rBM9H#uFjkzE-`$&zMO=B!-&HF4i7yfc*_WQpljkKP{YK#yXD z-v?)(6V!+bPjJu#gVqv?(b3^)K(B154Z+z#XDvQ;i!G>k=81C5vtuc1T7#=F?xYiq z)`11fB5rw?%@dF#y$dL%ci;lU%q4zA;+k{R>kROH0((q~ps0B|%*m6Bva#e{uVv1o z?Y<$QYkoazT{w_zO_=L6iRuh&f^faH$=XC}I0_SxUf9=L>y!Xi}G2DxF;GbRh6ehYh8{4hfwxaGz#8J zR;a93X^5R7%b8nNdwV%_w(%B_0FX?6E_dhor~m$k-~Rdh`g8pL*WZ8rdH?b6zs~;a zumAkZzx;ie0x#K6oX_Y5bVnh8J1^ZQ^_`MAnvbD7+Bz#qAae5!0#E(~uSY+MBO847Cag&mK8SLi$#1xD`lG)ySouZ$@Qy^hJKOFS6*7W%?D z5@M(c_~Fd|V# zCIV2O&_bu0LpW;D;>Re%D&^HdJL6Q9O;Q$`JPZMSa!3A(>$bBukoBd^;;6m8h3RPZ z!Mo``q#1H-z83Vu>bRt_ z`ZPR-6shq>Zs-7(s|vPH_p*y8XP7gq^X^#i!V|SCopm8u+0JHCkpdNB5;kN_#Kyfv ziY4}5c?@8Vd?1cJYBxtc9-JW3tg39x>SKyz@i+&s*kx{kE{Xkm@ibU~Ul2YKqXkc0 z6E5LVC)fiWL#zu#IEZ@E-H96j^F;tV+l3`KDIXDEyb6MrZF5K1Ws!B@?eBgnUHOS+NddzE7Q zDW&Nw_W;x{R7Wn-0Yr3jmjbJ2Hmw?4`JQ-FhE)VS5TO{_T<$lqz4PEZRYrd6&dbpV z-2Q>4LUSzJ9j#-*wKWHdBpyMK1f+4iWoSJbaP&r~c-#ph{4@>*-F*9d4!8&hPZ#tv zjJW2`9_lNYZlh10bjdz8H%F!yorPsxC(pGTi??*E&=9K-tQ#bfGd6=es>;8+YG#+{!pcyMjo2Zj5Nq8~W=b zXr|w;*si!y$EqrwAm^at1S(wDfCo&-BEU?%wMT0p>vZpma5yTmOIm!;gf6Ms!d`7) zsE^Vy#XlB8XyG-@KkNC}5WlJV!Y&wWshTLdfU5a9I3U*M^|)*WFh^4prsJ?7A&>%< zjW!JTId5Y8aE%l9)CN+yt-MIXZKQTT8#h=vTt1RFcq?r7ikw=~@_{-A7B-aKRlJ;< zh=O}WfqSwLVmChA(gT*;(~OFjvRfUG*_?oW1N4O{WgFfHt^a z9MN{2a5``n@wO`4n0P~`L4{|b9W5ovH~eO3!{v$?OWG@rWudRa za`Lpnq#)+k_hQ$)8;f#|ER?e;>MjP4V5i_Gvp#aVZjy|-x3LnGX z_rh?%{a-ly1Hq*gkyyj#T4u-G22|~?wGxfUslV0!W>yUEr2@jNx(R(!1VhmfLCn|f zOE!ZmiIwxa23L>T)v(VhxLdWxYPSUm{8o!?i~yXtD4Ct%i%6`C)moA*sfYjw%9Qbe z9~Z;U8xAy*lN)4kOn$Js6UNrO^vbXP1lkJ)0%!)dOW?KzZn8&VUS4PBH+Cc8g7Ilk zkiUm^Vi!DIxcTl(rB}8Tav+J-bOGudZ|N-zT#&+WOW{K@@?p&u#V3)`^-85)+Utuc znP6xS1uc3TlxA`_e1d&3mLN}I<3x3E*D7ATzMN(iz~YfNRi7gMU@NU8++GYUtxSu z+oDw1NzvgHtg&Gb$;wLO7%t~F ze)3Mn9HC=|C3``bnKP9bcauDrC50b0aPTq%U=~YLm_ecYcmouSm1gz5#r%*o$G67a zPQC=VzbVfEfsTQATw?_;497eigHknzV`Jq$R@`ycBkNnT1jOKcyyoG&|5%HZXe7_* z+Ogn^UYS@vHp7|SfFXagJ`zl8QMZi;CC}QsSUS!{KoK7+5#;6BXW45P(*gG%EW1S3 za_PeC3HW59&7jsDa~^Y6Zfz^Mu;cInd9-NDlWoHMv!~~zGVvilarkaDro#jT8*c+9 zh`lhdr$XDnzYDf)^JSyWYq<65Jq;#K$#dBeS*pbgO?(ESSd11Ctb5wL>m+^FNWaXq2F@~T3BfEB<9_cHDmw4`1+ucQJAI0wX) z*>HpDSOjs9{apzywcNU;)oJx+$OZa1ZQa4^&>6^g2+%-rVU|xgha|$wT7Vwz=$qLe zswkCDD2FcjQ}@t;B+I*H;g^StYB0ci!$PX zbv?G%zy!w|95AV!fNLJKwvO5Z=jA3pmJZ-$UDwn-kICn zp)DX0Ma!ORT!J|paAA36JZ^BbKMsMszFuh0*+g)|UyQ_CbmtiE7vw=lLkD)%o{hUM zRaF)cdmnq0tcE%@J~1>{RcY9>MPIX$qY=wHQe{=&9Axg`?`uwaJ}=P#5sfeNtcFYaePeeL1;JAT!0DlDl2EUX__rvO?z9 zA|OPS0*!Ilfr-x)v#)@+Y_B)~%7BPH1UE&Mi!0J)%+6o3oluS{`InO>6{?r?AumX{ z@Ocf=q&i3o03qGJzJy6@5hxTEn2GZ2F~b6jQ1F}vi4kfXYwkMUN>9YDjz!0S!rI(DwYHe8WLC%xl-gNs}cbPztH@&Zg}&8MLh3!4aiO|sAl z0d)kboA&gEo(%FKHu^_AC4@2QL+#dXyYUHeYV&$oS0Ei??qD%%;eU?wqGK596C{)# z+E}azyh<-p(&~6gm|zsK&?IVA8JpharXs)6|dM5+90`ZK_6KR^oYMa5lgc<`#k`^iKxKe z8V$`Rg^ntCf!Gd$gfK9CQl(0gOLCGB#K}-aD9Ga@J zEeD4FbWE(kFgVWoc-rGAKJ5}=H%=@O-D5%+x-a6*)8;O4AOJc$N3Z>TPm6#S*!93W z9t+f<<8kRpWSgUNxtEK`6zn6v>eo=#*%G&15mR+2!SKzyR`S^;?MJ+?Py12;euoFP#knORkaAlMNca21=V%Bq}^r&|(|+UzkA z+zdBLJhh}A^!5_7gOgKK?Q1tQBP7|_q$ zi^skVzRcdO2F3E4D%YR+SlT(IVzF3vAH|>|(>53)-Fc=>$7r2DSDliYU7pAQ$XRw@ z@U?TR@7V(l_=zjEELkp$2O{CF`Hr8_>FJao?T$|!e1+qPs8JK7f)|#D;uMAIdZP4dI&$;|VY&e) zI6}QRPhNSh21a9B*AQ@Rg{{`YpcoY^;IkxHE`jHQ;Gl;myA@Fcoqe}Nee+s|8P~gX z^_~Z{IyBr!c^l}{RIH8$FprXr%{3~5rEO|?p!zF)=at(K&aLq49DV#i$+z}qlB-{- zVUJS%>YR~0v@tsT2oc7kQ{qK{kyY_F_Q6eVm%zAtDow%6f<~GUk&u;wN!8I?Df`ZI zvkM1x1oa3t$fnzHsv0a}5O;d@JbXG&>N#D`s82t~k^HwF8SPItJ$DhH|q9J2KR zA1-?Bj1i`q?jwwuC5<{~Wx=_KVkGkURK5#rcQ=p~Id+SU!y@Ax_QZVa&UlE#>22;a zK!lz(dsOrbdoFq|+md2TuYTLD=-C#-rS;rVXbz^zM<&(o#x4x8lVyqp zd$a#pD`wNA1~Uc|*UdSc1MXRaWqmM5E}Le}NUc$l>U>8LKw8n&#B-QJ-{(WIAWv(n ziod7wIRs0+10RS626mK;98y-thL;Ba&!tT1(^Rb&jaVppFf+-cba;9q^A8_^Q1C#M z8khk4IBAZ+u(>!Y_00HbnRhw(IR+)VE%+7@BScG17G{^; zO=U@gR&e&hq+95_09!z$zgI0;TXPNeS}S7M)~BPzEK6XIXT-vL?)p^OHGHJ~KJf`} zVY&`^+!>OAMD}87P#&k)=;$s6go7mHgh+WnX3wivDsa)K^u)2pqq-c8-G20P(EV0S{1T!TV_WR5~^LHl;J2yP&FT zHui8&vuw?c{da9`&6YqGJQZFN_zN_o02iQx47)6!nKpGbNWyul---dUPi^`UK(H}tn0m0ubybhZ8%_) zj{eG^JJYPI-j^zX&RFX*r$$fXl&t55e5&z{k7W|vDbCk$8+*El6Q_YKYclliJI=}Z zw3;VEYhjFucnv%dfZAKIhf%b;_$KYQicXak?E`h*ICNIUJc4^&%5~$Q@MPUAB3PvR z+-G*xC{sHwgft>6Z~g9Wb@UN>Y4Sjx(mho14$fUk9c27D*{(nvzaj*rxhxW|7L*(C z!J6sz&NxWk(?5^2Rk{bKUiof}eKh5UHiO`HRkUqmYSBY2Z5O=LG`WlIF>sYTK9n7! z-c~MUJ{q=wRM1`LPWuhj5$9)jFYC-%TI5^=rT0Gf>)3SAcsP@Fx!#u4p#%aZVNjY? ztU3a0Bi&AF&mGg0-SYzE;OI|A8(s|w2XZ6+8{%E<}T)xrrl1s5u3y2*k(Pq)5WM-i{Y=>VTU(*! zbK>OHwN-AIh$Y(XgB<}Dh_Y`cbYHc6NUCz(FT01U|{ zTS{+9Nvy2A&dEiq^DVeUhcXh)V+j8&to_i_$Wh5Sd7G|4$x_0KgfTFASnjK88DO`P zA2ftzTo&El7TjbX5?!ZlpSABOh-x+;kiN5`7NVHVtHU{&T@)Is98LO8wek_JDebW> zZI19M)ri*ju9|890&?g{9EK2R_d)Qh-HsVi5@lhYu6fsa>+zP!kmQ_uT3qv0TiH3u z+A9}u$nDzc$1(Umo#O3o{HbcGW6m|_%!kGth;Nx7Lh}-%4k>eqmEIG?jCR> z1Z>p(`IWJ!r=!4t!@6B|I)bEq9QG0|?NVb>CR5Z!d|_+r zC}C;h7HWqqL~{2mts5UH2wlysSV|s#Q2 z72VC&CL=?h!?OcTnQk*uHM|5m=$4wzim4N%QpS7+Gr6j*A-#L_ktQ=G&4ZfqM2yyN zalVf+ljCk1v?3cP%*rP4h*r))2cmzs4a%%VEdpW*l@Uf1X()12z#B}?c}wm|oCr%D zjUC~t$A`HiUba;?#8^0YH*UGd-LmxF(%R)@LB~3moEnq98~YOBI~3V5ljqU+3; zW(2|uu)9wLSVRswn;y%?70jTbjTq>5Aj?l0va35Rh#eDtM}hUPv!ZAkU2D7^ttVOoBw67Ui?E;^y z?si;Z>Lnn9onA+ZOm2D2G$5OM&uj4Abc*B>8AZcMZA|ThI{MisTO~SV)$V{BL4du5 zCAO|OY_7(d8Hg)ws+FsI9Z%-4O7k4O0{I;f<^lPXeLtn05oX&?_>g5f$VY`Yc+n>& zqUc>nY*UZBd;UaaEXL`I&4yS+wj8N;@sl!a!5buI)nu1iZ{2ZT8DL`5ctG@DeJe*_ z!hGj;(=*l+DXueZy5)^PxKw)Zh(=bgoM~o?kb01@>`^7D;OgFa=lkq*W%~z>Ir{uVCeZ3J+o53seV^+EM5YNrx;F=o zS}AMJ+|{$H9?t1&1vqJz8o6mJW-AIOEgS zj{JWa94W|N@J3{Ox3j=c&f#tEwkF%Xyepp0JQ)n2w6}r$cYf>4b>w1v5(qp`7v>7c z6ED_wPGWT_%AN+oespk92n?SmkdEHG@=;t*o8HmzY&CEz`CtYC_GY=b2Fd&| zq+T(X??l;ipvLjIN)~Cm6%uT4+}orE!`j2cUo<3hF-F7ZMbxFyqDJzDNvek;B&A_; zTfzB8+xbISQ}nD=<*@NvT5h(QFRgE^i+PM@f4I9dUjBKhvX%b+*IgJ)I?7Bo|FN?FpSWi3X zQE;}l7Ks4XL1w!|{IFBB)uD&)V)WZobgjcXI%_RTU2J8J?WOdx5*cLv+l0@O(4CuA zX!`_+!_~{+>yWdYoHA~u8o53RtJ2ZB%kkbz=&C~ZaW&o3J1*69t>&%voMr+FkDO~4 zbaZ9xT@vq?70%oBK#jxJFy( zXor1~_$cdqA1M1iQ1*SG?4RF2*>~#Q_nEdYGi`n_0-mAGa6C35`na90RCQ9^&>O`j z1*nRurAt3J5$B50*z6J8)11>yv?)HVjbOK;%|a`Okf^MaGaE0*ZlsBi0EH?}Q`yF0 zg+h2%cg%y58J*=k9p}jqOS3S0g^0AK#KcldJsMute2l3gnpK3_aV7WcdfEuaiZ(v- zMCz=r#oUQ*+$!ie2O~de-GEu&qs~D9P+c(w3hBBLeCf7~LRU@;CQ=-RV*CS+S_~8M zOe!zfjE*c~KGDadGkUYe>MKfWW7r5W7Pr#!WKp9tpi7qaYalKsMU2^S!RIv_tAmB5 zvh=K`HpjAbc0T9W;E+R3w!3v2^6V&Lq{7QPtR?zA74P$@34ov+%d z$OFsP5-cW$fYDfQy2UL8AGAo0?ETz6E z#sR8$)U5qB2Wkr@BQYRVzf*4vC*q2-;vV#q_6p*3XXIVYw`GqY;=c}Mr`r2P&eh}@ z8)%-yJH`w=zc(<^#8guttimi^N8OzVa@Iu3APC?R}Vf5 zp@f#APmVThJ`exkX=QCPesktTZA)sk?J*;w>704by)qdYzg-zb(T1k8j+y41CoJL$ z>t+plLW|@|w#lY@#|SHo62J0%GQGHZQ0V8X=$~ds}J6bt?k$t(H*tZZB^#Wk{_+^gEsrZ$yiSn0`(-*r$(h5Z9WLICF+(c zvZtjjiG08)*=g&RJI2@MP%lhs)tiROxZ*}6@1du*v6ur`snwKDpNhot%ryvGP!nOW zX;J8~7>BhKOXOlSf#~d_QhI9>XY>eaR+K?}R_a1lZ)2zqWejRmV@!urqbivsVwnkD zx-+xWIK;9iTB-HO$s|Qi%M*2_!N?fj6>2{kVmAMI4IU3L` zk~%MCk=;m*ZqISQb7mp7;p0HT2e-mQrci82j+t)=C3yF~Q8_ zGvSdLo6Sh6v)N$=Y6$TN@-rRH?9;PgItc!)j%pnZVT@4Pl)0YlN*8n3=)PU1cjEkc zlMfp`*w0XKu8r?yVwWYadnW5{VTmxG>_x`~sA)6z-gvsSs~o9L-b_bl}BzEjzU z@!vIOG|a?3MeMi<=(&6C4A)Y8C3}LKT4pO${dH}0$D25d_f3f2>%>tjRkfKjY)#ev zjO9)%x|f5k_-@?rsSa7St<#F!=fZR8bU2I^pZO>zr_P>2dbhS^jGZu=QW?HnLJd54 znj;Js zLbcs?A2w>Q;siLEW;scFRb$e*Rt`|rn3s~QlT@Ach;z#9RChNX^0S569bS8CK{9US z(sPkX8-ZTh7N)1dQwtXv<22f1W}C{P^xh@~E)oER3Bx+dYFs!%$wISci}rFSJK72A zoC~19l(8tJ+9U(6MJW|6da32U5sctdiTBJekfAyEW&P|ZyAI{+&{=SuvHDYzPFp!< zU8P6H^qKhti;x3P^tmz8XU5`c;yLt2>!9=|ciNiuH6On{u2!#&IucRvLV{14GndR8 zT53(&XqT518^I$4$P=IV+Vr=)Dd7X1)W^9fTa*EdT&9Tx^TJ+<)>~=lOE1aiYt|s=TZU{=7s#3k4 zYZ0_9!)fF&sVLoL6Er?;sk*0pRx|v=x8=IPF;FAv42<_p`IwNL(+w8p2w_xE*rlzO zZwQ&(u{YC|cW2|x2F8|%?vwlUxp$z>?MlyStf0}SHD>IMCbo>5+uMw8Ioo3GzU!z= zEpuY4D-qaAE7c`al#*e#6sW{~&06kHP)`?KQ243`yBEob;j>v^z(a4J$kj-jzjFYGt{N!s$TDWgr&^1Zj7qw zjvt=Ub&u8<%pF5?rd2U3(?QFjdl$MFbzj|jl6BSSX9B6(b? z{0*3S4et7q$q@PWUFdktnpUBDnird&#rVb;93jaLjmfw_Kk*D{HFV_BZ_!eSH~8tB z-dLMbJ8R6KT+-KJT48U>E<$&u-Zz3Vq5Cj3a}T@%9@+ZnT7m3~R0&9O}$vuT^K(vpd21WV@V2@4w~KbCK5Cx&tr_d!=*d z)O5gs*fI7bi%H{ead*c)w)bh0hnzagIf;yIounJ~jpd6iX3~1P!IwoE*a(F@O|zV+ z#Pm^q_kC8JUa3M9p-NLW10q7gwIudLjFqsw-XQUcBAeiwbdD2iED5Jodyr!L5#~hh zv37DpD;w6l$?r1nHmFe#wDuQSQR;TKUj7S^|YqW z%&Z7|jm}4<=a^zKx@#IehGy$y&&u%s*1bfEQpulHCw1g~=yQhOmdJu-vm2vlRFPJq z>eBDMETmd1tbxoo1+l)Hq)I8d=9IJx(Xk9=Yxez$*7r!1`Ej`5rp^ z%8^n%o{5=K>)|MqW6_f7jY@={&P-1oCzrUeC|f?V9o~-BcTG2+R&tC(+_fph2RTN{ zLEzfxEm`_t_orgB=rP7I7;PCX$gj=J-zs@+xf8~GiE13a;M+G}4C5$H*qpB$Q?FxM zIn3O`0TF`7%xUk_%3#1bWxHo58U!bpGC%bUb~bbBAQzJFfJjqYzIK-+Rrc^g)SaIY zQjN;u2Bg8+v0f%j+acpPgW_d)b&gzfYn$YNdrNK2)2Re^%Y_JkFjw0d$fWlJaB2(j zP1f2`chPoe><#9od(}3CnUISEVMpMNuB*spz?8z&#v$K3n6wF_$w`8!Fy+{?%%0ZD zllk#AFCxcvP2#Ey&9riu;HZqw#L3?4bfEzQK}geB#YE(s#Tds8q&HEHm5XWjs!LV) z0}}T<%m}bQW8QT*Yv=OLa}?G=a=<1#!N^%YtLFT4m(JRQgo%p}C@EB%cRpE)n`VNH zDOymCYQ=iKb;r^&U<&r-x$Ij3Ny3qedVo`W&Q2S2+EfC2+B|jbmt=8P^s%!>ht_7Z z6|T0771ONMvTCh~q~)>M7!s&vDap*7y&SCnychPN9mj~c^ailTWj^AQtXB=Xn;L`{$ zWtjcsi*^Jlh%-mP&3vSlu zKK$%C-*d!Vhi1b(Qq@-h&$ei}j^>^5^QxO@4&yPN((bc#&W6frcy>D-R8-n0)9|8n zO@--F1o|v$sWjIL#BLJyu6O$OQjA(~ki9n|*JiL*+_Gou(_&F1pbR^U?s+oBU4li# zr)gfDIa{n?0Vw2oM+S|!`W@VxJ%`GwoP``pQusJ&7YIzf+)j6y94Z>khPZ8WGGS+( zqm?gU;s7lfevWr#XXu`*PyULsSll5Na?1Q~9R$^iNJ=g%CA!Opb{-W!yUi;(ceK2* zxi;gc9w-l+c>Zaf#oB8-pv!h%B`WE-lxwixW)n(P&v}e}RAH_|S|g#r7_}YVvvM{^ z!3sez@3mL5d8msKdo;_C`ts>P)3&LrcR+^f71YI86!F{^v8-F*{@KTH;`Xc3m@Sh=TE>$YjkXYo5| zIo&zy%IHe&o@n{Im!P9^N@|%Gf{`&ckrdz+XbA^AqCYaq=}USaxg9#o=eG7OOSf_k zbjijCv8#~D+a{#b*>f(~Thc~|@A2RMU;oh$|K{VTcOTCFpU+4C@a8>otpA=&0hLyr z9LsxMabGx+QA&iW;|G8G-4O2=eENi?&?|09gjppeMq6TP)=+8t{SUa znF8deJNW;KK}UT?WfN-_douJ=kDoCU%FrJ>D%`|{r$fiuWNao?mZ2jU`s(^v=9NU zjYWR>lP z`u&G@@89?{clV_);@5XKy{@l|+`H>Gs;SEvgcitF?Ix?VLcCQuaxXYcdTOdB9FNzT zK(OT04vMLh_-G78aYVmRwXC`CO;I!~?{tZVi?MJx$lII(dtX5+d_COV;)?-%m~nj* z))z3cUY0uhyu$<-AT>^%{> za|(tGK}cL2l8~^Rgs1`v_X#QAer^9X|Hbb<%=f>4HQ&E^<_^E~g?zlj>9v-7hjRuF z*y%ckmSCGr=oPZYmcE-P052A9xM?br8k+_?5R$}t++Zs2&6;+yFv+;UM(mi;jpKBm zF^mu%VgD9j5lUmCuxg2iJ8Y%pVbQ2G>7*&$1d^4vHn>bDfvoeo%WP~osT#*1+;^g+ zGDB$tkHjb_c&0N-retqyn^nm)6R-pk18Bt4mOIoX~o6PyRpK^Bj%+}`#EOu9l$nZb%=rRZ?+H9JM zQZb9DL~o9r0gnTm3oGE3I22q2-a&>TLa;X2^|Yvm7~C0_ylC1K!C*vW=(VkVd+q(@ z7C&=)U-}~c`V*b=(+fOBrR2!+%LLo!*yrN z6&fi{Q}KNPvy<9d0baAbh@92R8n>8E%zLuzj%-YWJ`P{eprLW+ZTl?3aZ>_zqPkUyf*pw!8r8diIm2PS;#*)_+_`o3x3`}U| z8$g6K-wyad`rb9C6sOh_u8Z#ABzaf&YUUN9KMZxoFG;w&)|0nE2P6+aB0t<&&00!d zjcNq!f|Vydzux$)R`(={wtQVwN{12_vD^T@@e*pGr(2h4hLx_Q`oT6|xfF)N(Tg&L}Va6 zuC-Z6)^A4lcb}QxzKVei+-uDQ9RCWIWu^zxv&e@7DbBxnu21U%0RDXtvk&^BrX{$pqa- zUBek#I8k@^2Jyte`_0pweq9YX(wR}fGZJ!)c8wI#ysJt;7nn7?$^+=Ru@)AX4mXUl{99Z!B88SD@$lB zi103%8UKY-fezqK#7(E|(G8OEd4j5s-Uq)Lg3a!EwTCEnrN)U9Az(e!853}Ofo&(%?8anyC$p*=jL-(TP|~@4Z(>K*QT|Uqi#%B z)FEC%u$znsUea2b)^rmFP_&-3vy=I?o_15_J5mTIOeqcoPTTMXnXboL4|nt5eEQ@2 z&v)|GH^03veF?vQQ~T@MKfkF1vQ8t*l4c5EpYlXx&W7f|jT1gA&F)0c9B0z$N^%h} zwvEhuT0fPUrDCJ=L8A*-ngO|Mt7dJ>8&k*;LS|u1zfpkM{BbcIqz_X}%OU7Z@I>U| z)Ny8&lup39SqyY}sa~8^TaUv?^E#O%xZiGn(Gr$r!C{0P6oyZzr$zLzSvL=0a|m;o zH{4xDt`-mX_OJhRZ=boTFMaL4+|+;jetz=b|NWnS>;Lrj{ZIc*{kQ*4U-#Gbzy9Lq z`mff{Z+`sr=I#IB?|yneKmB)q`rrSLPp>&Zi&6XV)g~uJ0qnrBjSRnAo(5D}GaTC4 zwE-I1x+XM;46`qAX#vq_RJP}0IyW`id5fUmW;Evpe#liSk+)LchZVclpafgf9M$ZUokr{giQi16NQTr)NiX&ueIy4@O89=(XhU%%LLkGD^!+hy>L7;1ow;I@|+-3K5W zrGgYG7bW32hzG;`sud8T?{mm_F!Tu^vZRdts>n@EthUx7rMPv%fpQ=y4j&{Rc);~) z$U^GB(ld<;^-V)I z?J^nq`qJ0?;ctIw4!oLgzPzr_SEF9~3O<%A)IP7nX*^NnZc=n*xQi|j14|@pkQ&Dv z^AhIhm(i-q#~8Kioj@Z==yRhC0UA&RNyoPPn)Gy9SyZ=$ERZv#6|JNKzK1z^o$c|~ z4hNUDhru1=(qxW!Cb?yK(@{q^=K=T<{`E`AhD9mg>Bm>^=ZBBy!*gxh7ruaBzq9gMK5w2C z+X0J^g8yXdqBKL17yK(OJf3aah`fm)FQ!QSWHRt>-4?p1S$+uo+>9v=wP)gUNoNT%ud-4D9@ztj{fB5w7 z59jT3AL19jcn=3$R@bN6F#|8F*s80-h$ay`)!MFLv3g1yrC>UquK7aCYI(P_W=-8^ z(L!f&lnLjYnOG~lBa!Z}*>&$qUvV*bjS+PEDis|e8UJolezjMsdoj7iU?;Qk08@!; zGX0KQg9Aqq^fM`!HP4~`IIIk15Ncdd-N+ZnrLWuL%KD{X0ep71W`&bt7kZd;%L#me)a82WCC@vc(^ZNV0TnQS z8W2{4lLA{^q#iwzpqP%;+9ov+D&pg^O_)X9IPs(rzHDtrnrF-T7rFO+>5KMtYp1?0 z`no>7o{-KNWH0=&W6?ndri=q7oo4m0%mV_0`7UYVu!)9%@+i2nk#C3|)+YzDuGW~*CAkd1BxGH+mNPGoXs`;wZ*w*x1cs*p5n20}*3NJ4uJ=!$ z-gj?bee~a-pXPJLs29G3Uw?WVpI*K9c4B-)>ssMV8)FT%8gB>#p&3Yq%J5~qPnX>p z@9r~8sz5-%?$!b67S>%UXiI@_3S4khAl3(aLHuS#FR}To4I334dt3c6+?EVd0}ACr zIlN)Gbt?Z@v@$i_tJ1})v_ZaRaV)F(Fskll8Z!$_sck?A-dhPMV=9ng$6^2)QV684 zr0AVV)~~h)NWWbk%m07%{?-5X^ZEI?G{s9_xUavx_S#-Qy{x8l0$^!Q+?Lq&Hq?oX zz~Pb02R_&$T3R%E1x<`4jcJ355|GJSEV3uzkr1ak&1fofyvd^JU>vXjlwjPv<)=a* zXNcrd9#b+Um(m-dW6`=(&Yl}i!_D^$wi=(Ti5R$UOoYZoe)wqEWW*$jSOORpT6EDFyxT~e5Ma%f>^NUNh8xRHb^u&^oqnAw)4H9{hURZ^mc=7 zFe|zR;UqzlfuW&#lSzy7NV@v?>3|Xnu-nHr4j!Wo<)@#i2iOMFLtD-QW*E5-h0uUH zJDSga(3=Ff0GU9DcEOd&TE*mkT2A}~fRtaZAr8D=MnoSS#v^FWJ((SC1?lxSd+7h= zpF%MH`{RFj|L*xNz)N4xuh!K6^JZcC(|&0dO-$xm$q1mg!tL;mDM{AOxkoLkYj-+{ z;sK!TOuc5$gf(zrvYWgBx=V%l0Rd(2>Y60b1fY zr0U4DgUi@RF-j&IUm3kz4C}GfZQ2;K;nscJ68{VNGQadydniDpKYf}Pibo*|$0QE3 zwzhIv0UI9w<*sBz#3$sRDOl3ef-GD6lRD6o+Z|9zhWTBMUpJ+oR3XTrdCgo&vgAH< znnzCOI$BFzAEU*JRs=gbZr7UT0Xzb}s9X}MG`xRIVAr+ptU6$)L%q!pr_z)8WeQG= zIe>cA0;`CD;?CIzv-8D*sL_Fgos)xP1U{*r` z7xb$&`2W$M<=f;bgYzoR5wY`Ri5wi5DObOy&N_-SE6CB{09xKX6+U=#M#-QN08ccO z%b{2R8P1Q@01aDeh+y09OE)Y6&IlZ5Fo*vtYFu-hXi6N$a35*SQ<*RaFrD{F`EVdS zhqweN?a~*lGC+JCY@R7U1b3dUV93pGF#x#jA%w)R)Bh;OFRQf=2^@?h57=sfPci2PG`LF zD(v>yWtnWLJeP);Y}1#S32h_|MdX-9-l&gXoqrlMz!R)qjARpK%gee?p9_v7*oSla z!0pYW04ah{!a^}>u*&(dV?!!vbrk@d03G2hE&koURrZ1-KIS@HNUOrcyGoSwXYcUW zf8*1K^W0(gr7!BYZngxki(SLj8UuU{8L*q)K}FCQRL?yRsAY0X2dT3{Mk)sXXw`!M z#^xF|Oy@SGDsxaA?YuHm9p`eP#IYleQ;08Z9p3wXJRo^ly>M)2XO-&!TYj869n*J2 zNKa{rV=Ynu?ASUqZwAj5V`sA!CqV^am)Q}DlKBmyg}zp{k(fddd2;Gf9%%!2(Q=*Y z_0Qhy-~9aP&9m9Jm%fnSy1^OsqWJFcyqw`!Vt-N7PGG&@L;B7ONN{j<1f^vZ2H)0I znuwg-VbLs6=HF5Sbt5r+l-LOap(8xLF4;3KqS6KX1TCt^MjnRaQalXgbi?Phm7`zb zhGdt_l2ytHYptGTF~{tw)Vk_K_XYbZLlam@YdIuUS8H`kzd$`CnUq7+nS92*Nzi36 zTJEDQt&g37kDorg{rRWo(#9`*-M&5p=hyjj|E?ul(9j!-^G$?9+clt^4l zM_4_fQl4O*%(1UEkf0+iUVfV53oYiD2o^^wV?>AQWsoTwbu?2I;H?ImsA6uZD1QV= z$72P#4+wQiw69NvYA$*A!sM~oITr`C_9%{Bq8@nJi0y z!?gL(8ToiS&7kXJs?I|MEDv%Z^yH7to_~G*@x1+XetPri)A>-J>$Jb{<$LV3r`J!l zN8kf_wY&B7epzZ4%k5{hMSlz87R;PB?E>8l3g97{PNMLFd@zNznDeR}iLdH3^k zg{hambYI`n`ufXcz`;{Cc(5wtPA6ivrdkm1jMWVETf^2JGf@?RQaCjsMts7LSEiNG zRxr?PR1TT`>v&XvH6k{4q;icv6ho4EkGe=4(TRK9Eu|^6baL8dN2H=d`s&iAtuBt_ ztx}#J zlc7*LGb?2QWY1TEng-*+-5nGZ0T%-QK^KDwCehl^GV-ak#}lpL1u$qhcVdku9U|5o zV^nNI2Y1!NSPp9XoK}ZU1>U39T(VX*<~VXk!-#~PCj4or&-Xf!tz{0s>rw(7q{QBc zilQd+a}V$7H*e=lU$)2STCSg$Q{MwUnQR1RK?sLGwhDEyx)W&<<0Db46mw2TK`hMl z6e%EUwJ_AI3NDQ`t2`$6@R^|K6PjP9^(*e__`71Du8SvcLT9sL1MxQ zU?g!d5w&wG!)ao-8v-mRGBh7%-F!O1hpgx9U7`$S3gQ~FH|C(zn)V^Z_UstU^B9lA zSs)SnIHh1fVsxcuf`r8J@cEtHXS9Z0HFraJa%9ogLEjZ~F@VbX1|=YE1hfgbmV!{V zUIAvyCCp>l^lyW?RH(N=-gKX>ziJ`dN_zVl8LY3l|O+nI_Aens>>V^pS+%T0D2 z9gBU9rJB>uu_T0l}^on5`G4t-wB<@M%Li zi)P>GUM&OJ=FJVNON4lnjZ>oBkV;|9YXeDyhp+gTAGby+<{P=8P>4h)dS55aP z8ingbyoBXoGG$`DK4Z^rVCAn<|@e&-xUce%2((^e`y*+4C) z1x1ClLJ~x}f~E#=(@Q^-uojp_fri@BJXpH)^n$U$ANNQl$bQ$;vBR8uV*mHQ}%#49#NXHJ0bm- zsLr&rd$zjaXCKKRj1GiIj#hIKc5g_r3?egncVx6UNTfTO}1x zu#p$lJn-|wpYRQn-96fu=r>cS*3cgJJ)2ajgBi+gKI_;_yLR-t2IVb+Xo5c}LT$RN z6cG$wK;ml>Yj=NqP5;$TKY#o*{rAtkq%VEt9`{CH-qPCeow~uz&v|yqGcWYVH;m)! z^6k7yR&9OR$uNsy^~4;zbj^E1Ot!K0nla$haGD=Z{%EAgEGLKao} zV^2MY4(&bn##b%%R)eANQ4|R^T*8Li_2x_Llq)71YqMZRo_*w=(P|lvHJjEK1tu$c zRwpfX>F7{Z4vSs}2$aj}13o|JqQ{EEfBsMJ_N!0tUj4uCdtdq*e*L=E*QI zxl>VE)+N|u^@LoYQ0vz(N&LAs+L+8d&8rP}iX=6QG|3b2ZeG!Kb-ICj98T7EV!V+F z*=?QyU$c0gmipP*B___B$4EHv+g8#9ym7KyHd{?eQ;)T*<2QAM0&bfxtmkT*t{ol; z7>grG?+ko!Q}^!49VJ3KTSYkWm#VQt)=HC&Q7sEJTLf+;`=v_w!+-XL~V@(qm_*w*5=NKSdYHZoMlqxbvW6XCp zBZ+`vT+?}+klZsy!F_bc zrMH>H>!#9XyB@Z5w3p;(>HPDZ*QX-mGo88@zL4L#!5q3A#&tg_&qyBV`p9@_nnua% zpw?KP>Z%D>AUoHxyBx*tJ7Vtz_cQIud9tiN!_iTBS;FJ+PoUb_!&dgHU;$@n>)F-~Qv9k8eJ``|#=y=a0|b=a;^o-@4BOywvC; zyq11H_Yt%5u2}MFOY1;3G76v?1Pb%|-5F^t5nbvU0%$O&3ItpY%;31mjR`z0XNutz znKHO;#lpRbL3pfHe$|o143Kn<%y6)1pB)6&F&TBr>B<*P_G}hb&~o6G7{rCrkZ76Z zSz1wNk+YeHK^s>M+1{j$y0MjwTA~1%XW(jsy4-lVBG1Qpf#2-2e*WEaqjxWS*&Y|* z`nhcvLYJON-3r=Zw_Ge*m&tfUqwdxxB8%808Ct$hF|tCFsKBw+2E}=dF34qvI85=A zwK%2vo)9|Lc3SCF46mi;LM{t`(;llAk@%Rl*6SVt+!I*4P~|J+B+Rift?9UM-2CKu~XGr1{v1Wen}ANk_D;c}JFf@OYu= zT?;IAmrahhml{gntp@68Lg+}R>hAOgsG6Gy)6>L!snn~@BP}!iwFFn+@WU8KlDir< z@1w<^+dBW%hx5Dh@87?F?he23m3+jD=Wp$Q$@lj7sR_;*$Cx`pR8yuodjXt>Hum_%X`|6v+Zf32=5tp+Td8NKE(`p z#krj$Zm|esigvuH~o|{+I}i3hZBC*#?uJp;SCgjogXi znWRZ}bmfJetS%Z7B^^N&F}jh)LskLwJM=V1r&#xzn2LI8sZn&znGUpCipP@GSy#;l ziaJ-m$7*Om!8P|XnFq+%5js||frLiMPI@QV*#UbG2&;#XjUzp}BT=Q&9jhk|=HVL2 zA&jtjdg>i3tRUb`C;211;J0@Yy`?ei@1m%eUa-_Q1^L6B@)JkkD2d8zaD z+bE{JUBN_x@S#bRhY0NT93hPr4F?JXNM0rNv1{*>Al9Wm%uWZ*+98#>?z9n1ZrK2D zSR?aO>CpG%_DSjr40BkFjc|U++N+(zWb1SP$s@d~nKJo9~&QCvom_NR{%(G{2>`Pz3Z@s9e z-M+(#U6<~D%ISbtkpX5iy%Ov!a&)tmJhkSv2-II1-il7}#_m(hxs48Z-I&M{KJ zr)Yzg19SuZ^C|{udF)CFAwRCL9pv=nKqxg?;tT+NZ-Mw9gp#Fou`bmiWIJV$tPQd4P$^`_G}?r&m45& zQ?9iL$zdzjPsikqf;8}Wkzt@N)G#93^^LV+6}C=0SuNS1!vwTA5ybI1W-jS5PVrxS z-XZ^)%EU`w#K*Xz{K98T({<3m-)emh*J0*|sO#SJpJY#(5T%|uvS&q$;AM5H|ad@w^wh~8W$QBze0#ZU2kW4KkzeY~Zcc}BN=pabPX-{8gy6F#R#lDqZEu|FH2 zl0UmC{=4@d-u=VzPp>|n5C8bapN(6*@Fo4$&Y1Q^+eZB6#6bQW{pyx64Y`FQls8u{ zS3^=5CQNLPy8mzP-fd~JBgxJ) zBZuA7hdIb}0BAs$zqpXDL>Vuu6%poNmk@g6PR_k{Os4*=m?>nQ0ozWq_7RSqYvaPjto4CpFJ zQ`Oln=XI;i8$S*VzXk*l2oKLGdv&O_t307dry~m-zN76*Xe%3GyKUMyQ*?NcG zoZk_xtC9T6Gtfom1ETyPpyatrcl(^C&zVM<0@XGn)7yZ5(ABH(Y(N|d-h)1%{U!Kg zZ1=ggBL=9En+#J4m>Ng+y)rPuKuoqvfv7GmoMU1?4^sydlfsWSfKEc0zqQ-)v;*yf z%xxbTEyLH5wB7cUxq3pIH;-;D8EE&k1ukiCc9bip=2SHl=T)v}+=YFnPTO=|mpK)k zdmES=COQIikldayRwsnOx5Sy358wJgpS^JRA=S?>Uh4!!e8u99{4UU)fz1cAktts0 z#|1bv9M=Mou)vkj>d8HUQbRg=ChclII8qk@C4t!VazqIg8d7*bA!?Ylna(ur)zN;w z4PsD}SiZUlc2aR2{i%^4GXtgPM!*f|aotY%D<|jKf)d5*xI=EewZpi1pSk8ls~ERE zb2d3{bQyW~k*-YzJeVl>#L-Db+u-&$`oqhcmmk20ewb%`?$X_}XFiPuKre)ZzAvd7 zNN$1IxN!;A!WT^iJYsfK6aYzX3I6*!Or@w`(;~LU4RBJ5b8ww2C4CNH0Vn0`r7_PE zr$HL9Yj7R(%Al&fo$|Qtgmpa`mAGrJgj< zw5(4B+AqC^RGz)gsL(nyIr8VM^m7h9nm=o69eQF`eB{^ps z*PB}vh_R!oBrQ*_S$^uE?+Dn^1P~uI@KsF^WZ2XWnr^+V3&PO4_qdHT9^cZjoe<#4 zteO2F4Z&!Oqc#uS>zMIjc?Cb7_HDF;0%IJhci4(P_g*;A)`eP{w9- zHTW}TpUaSor2v%kYf9$tzJL4X?U&BS8+@`jvVH?I^4t}?Wfp(!-NoT)jOGiz(5rV4 zp8NDJ2umOLITeCxgoWy4z}w}gc%43T0$+vu?a>{?8-mo;0_dg#Su-!$5Lv9RK+C(TDr&HN17A zjn6;ZK0vyz?pNGCMmvsxw3ui%1w!l)x`UPHT6Y8($)T+BknXV32OKiV1h0e)@x`vfzh;7_KlHgr&?zwaC^PW zFr#s)0(JR>oeU`3h1!96z#`VNW15F*#UfJTo|?l?s|FK0ZunZrIh*+FXL|>5`{UmL zZa+SB-aUC8Z#uJIb)@XZ-J-+&W;^FX+LuUi`MIVvR0FrnJ!bA2-6!^J$@3I`Un4gv zfXu|{N-RsO7CeK*yK#siLQ*+;0LBFZ+d9RTJf>}kvu+PK$ZZZhLpw6^+0UM61<%gb zyQxf+Na^x1(P%4VnVbesQGtvX2jOHi@7Q1sZnoz^nqgdw7W_Nbq^?_PP66El1DJyj zeFl%OH;ezJ#^W=p`Y-j67W3rwyB+d;*%kBIi2lUf&OpTyS!y>SMVHrGY?*~;J2Ig_ zFe5nWT)`LtL+9K!o}ZUI6zT#Gw64a2cAN43uU%uWY5mHNFCJGI(M}=*e|vCEw8Oc4 zA`Ucr9<>Bz?;@@wcp=ik<|xdgy~cH3mth5sXwd+^-P+LAN_Ocv)>;Wc{OY|Ldb7%i zSZu-_s|n`ZBZu|e$Mw!-h=1>gB+X~9+dW$3)6V$xy&AUW1u9M=q+GaJ9oyU5GLO8C1(Kliy&L-hG~LKjxdiJklsVdEM?zhWsb}bkDz%=I(sJQ$7Xy zIyFXMlSP0)bFr~^3irMZ`3#^bN8x5*Gf3&}g2yU?CsG?5m+46CIIs$V$hJgVQ4OTt zezfFdrP08q?=~(WxaEX2Y%5TC&?y_{%(w=g>_jSOMl?)i{U~9Au4@6b-{!HYGrK1k zPPM77gOE4$y#!of$V{#v2C^1|!6yOO-!r}Gnk(Dw%~JmL<>RaG-@bjsLVfnq-Cq`d ziLUkD$ad<`agfJ6$i5P%S<{50mfPOrz>5OAD{h(LJ5_I}bZ*=^(?G1FZ6w1`AX}>| zql*NTJ&&rn{o_*jUJKY6Cb#=wcILq0GiOttf|W+05ZesFOhj?`11zWSu?f_k zYr~vSuZSSX8@S;;*EItiTCL%7g7#=9PzVnI>eC2HXtK>qWUuKw(>?Fxl-G9nQAF*z zt9JWo%IAB+WCr3P2vOSVJu=YD-ffSmu-a@m$IjV%YAe9$i?7GriVaT?&IVkfNBjFSl+-ZnZ&FNX!y-c3pCSs=}*pw~@B5lEwxwg$A3Y32x_hgvpwY?iP*?hMCD& zbAw{^Y2XqWc zg%%YfXSQY^egI(Jt=(Q1{%WrBpS^CkSNZxG_`_(A=qi{?22gE-TXtVcGlO9;Mc)8+ zUIQ7Y4W2}6dmVDAb_h*+sF+vu8dLgNVG}QNqA|CWJIGZ*1_nm3G7PtJe6y}`7dgb- z%Xf6_P`d-oWOL2}Dg02Inb&>y5Jc%O+Z2yAtjWkzF`FJeNAYifS!R-@1AnSxz-+&v zUvhXkWr9*1iGPQ}A-DXvjDDL;`|nU=|Cf*NJ@VVOx@Rxp9n9&AHk3ih0q}MXt2xbL zQS6bkn{=&=MvhGCkgPNNjEp`Q7dfZ^YVd4@1h0?4rDpnAa+nigZ1@%%u_d*`wpL9* zIT>4$F)!f#z8%wG3xi|=%~sZ^T>)Ap^#h9f**uE}A`v8eVq}$Kiw@P5j{pdQL4@}J zVQrKVTJhZ@PFHM3x{W|fypH6lPCUju)@Iu!o#pno`nwN5zRUM0v_JYxpS*Op)0!`L zgR+6i6a%4{mvTV{u`N{_;3nz@f>1PK1l|A=TSU3nLceTh2I-OpHo7jFgcVm5jCFMb z3&YcZl4@fM>Im68^y-LRTd3?i8P;KO9gb6gXo6abPyhgrN8!GjdZyyio(c)~7P`;W zg?u!!2g`w_-JpSE8?km_qm@d1n^m?n^jj>(f=fYQ-qww~IYX46Z;vql{^N(gK2*Ry zchT;OH}?64q2sO$<6Ndza=>IBHdakE5Nou9!?B9Z1oVgs=lTu$&PrQN3k~Elv;pRc4_~b0S+2L%a3R$ zhFIgEbF<*M#&XwXL_QL&YikSrq*}Mxq|cx4qr%OT7w#4$(!UTUMsPo-r-q?QSbM3` zLbHq&yE|PBG+86uNavx_s}igdrL95-`UInsw1uEDLNmSzvajN0t>Bf$?d&O0IlJZZ zRs&$eGeCCuRk|ggy=Zq>82bGC%rqzs&L{R`;Yw`;bb4#FR-{2VRlDyI0!;ZHb_V($ zpqLFgd~iE}|3V!E?Zx`(<%)K}gji!V3`4^9l;;J>F??XJVb%Zc`lNB9*Go7p*v-^}okUr%A?^@*&AfodPS|RU_N$%Qb zr_%;Z^%RPkeGE&1Bekt;hqMo_+c9c%n2Q=9NG*VL#FOl_4j{9ijz14MoB5a(m_9{W zTjg@rY*AXHB|r@|#+bk}uu-F}1^J{)3%;VivH6&2-*BLhjt6q8wDZ-@@C)AXw^T{b zUb}CqlAu(jL?%X7ut4012)kN8TZzs!1!{H{=<-2e6#&X;$Vy+#h0e2USFR3FAPQ>u zuMuIR)7Cu3&0}^`Hg6Zhh6YQAJ!776S7L=Xs&O|p5?Vt=9Ub!$-#a=Kb!O|LVUV-5 zVrc<{bjyx*%7VO+F;3%4PH%9&k)bNFk1nU`$dqn6rH%rpE_K!&Wfi2RD04uEAsB7Sc!b$OWI$Csl zeg8jx+4z3+{W@R0d;jw0XD{O~f35>DrT*F79BtrWrJ#Y0CS~b#c5vC=e6S%y zXOr+thz%_uCki1uyB>(edvrK#Mjsxz*1$j6&zMmHw{TyFc;b>852@B=Q*}Q0jfmLo zarIYoTlnmCyAS?;IhvwELV-sA7RA&&JJlNWS zr8_tFY~C;*oYy0NIgPG+)GnZ;a0?jAkgkGkxSOL@P5l-I0$$4=*&Y7*9c=?D*TDWD z^%54U$#eNU64>C10o+nO7PTURe;#^s=?7BP<_p`YJUmR#&a+`o!QM3jr0FWFLagZs z*bZyoK7N1y^5Iqf_2ah+G*4c;`vCB#-)QfhGP}>6OL4D3yW>~EZF$e;KviuWM!agW zNbLu<|$3XCu&p@Jl5Q-)q<0xJm2>}q!CU;&2kkTR@ zg{X-S31QAIm`(w)WGFRWo`!+KJ|B#FDz#r^`WrAovA#;Z)-b}(byhQtYj&+*V?Cj$5V)Mc_u2wKj>W4_Mx{QWb zogq7^@4NiUuZ6Ak>}9*(D}6rCbW7qLAXgt)4r+GUk-}I|tF~6B-gyH_0z672k4`?$ z$Z{mWT0e6|YZzT3#<@r4CGVL)5gCH3b|6PL>67`BX{$jGXg2N!sVQ(R3se;C*koK~ zhYG_NB0F}%fIAm73k~z-f``uozBrpw=7<}%U4@cvYj)6!!zr~@ERD$oJK45%5Kn7s z=qx71o2#w7>n>hQp2`moUCmEky4$4hm*E>|A!kNosVT_BbU=*`%oDVC>!TO`B%tYz zJk(>Nyh%F;3M6ypEPx91N?rEa4Lt-k*rzE5BZXChKP#N^*EA#&Eko2wgZQp^jO!#` zhfa%ytMWmybPFabZK@I8if!1H(hn)YedyS(L%9(C=xw=>H&k}OxIv0;BCPu z?j5z}&VFD;@2dDaBGA=uKhl4Qx9@&_YMO8}p5Ef;O^6&QA!i_gvO#M2?( zRmP3IW{tJhw!0wce*=B;XRqil4>W3B8`RrFAaRUgO>&o0&}pq)#`C68fp8UW+km4REBe0Y72@cWO$Oa z6fbY>@{i7amSJPq)=cMfO_l(E?Fasm+t=>E?GX6=X6R&8)ebMnH)LYom1Hg3;)&$f zx^B-8RIi1S=Yh!0vhXGo$yp3B)!-^i8Hr>+G9dPUV(%MnuBFjd+n!Ha%N*<&l z(mc|;1<(~WSLHrwx_GmOTQ`^)@&2eddjWATThKXlY*5jnaEpB!=t6!PHXDQo*mTD} z_O@)}3q)lEr4g|$*UjA8-WX=!@4J!sJxph#1T{@YwAn%luq)%Xic|55YM6Nsh{8H9 z=k`WY<#fht8Pc)24i1&4yDTA}3mDmRYe)M1yO($yZ(qNC|L8M)_S$_*o(oCc`n?fsURikI#J6z(;M`;68Jv{ z2I&HAD!C1obr6WK+n?#qO%tiS(G$SOT|>t}^rtHhp#21~?Pwt0uZi!xw>8BxL3Z7v z!xHLchX7XK!i^J7#nj*xLi0BXGSJhg=`GAB}aMy>P#H z@c!rary-wzrTALW=)Jc#@buO+jO-zbxW=3nh+E)71-W$hOoA!cr*u%R#cFqLXVqyJ zRt7^e2;*_H(|pW5oseG1-49L%Od87--$R=BV&={Z;K_xoS^%^hP^X+c@PZ+&L^Tr0 z{GospSxdhppJVG~Iq7i$w1qxxyC$g+!eKskE+|KFGhYl7d#*_b=q+UVmK!QMw<*NG zuMd~U_t9_k*(>+uBmKYLfl2azeEF09KX2as@So`a{m%nI@c-@YyN@q#-}vkQ6<^Gc zFK_@Dg7zEf9D)4Bj+$ zWx&aRjC<=;`r~)`@zs}u(!(+Qb64-)$s(VA+6$5c1)?4o+Q3@dz{?K+jegD=1<*su zo|}wg5lLgSGMI%WhD+`?+ZgDYLPvq}Vm0_rmh}XOrgM%pQ|DB2NCp=W%dXweZRrYP zTpK|27&>&LdT!t3uHaM#OKOL%cOaT_vFUi9?C7swv^=#LIbdMQYkEYkt2^LGCI**P zg9>nVvr%zAw+x+tFX9EUH|^nYlPeMT zzPgUG0dM@SHNY`Bxz+-52zb6GldkuQpHjdK8_udr$JQ!Z)3cE}@_asa-@G*;ySY^< zN$tI_jv%szAlX0?!w(iia(3bVgwr9mc10=H(C2Y z?cTL}z-l5s`iQLBGL76M8Fy{7`dqZe@kD<*7GY<*<|t(KwvN`2loo_r@B*@&Ay5%(k$p;ofW@%62AC z^jKMxum4zaxufROHx?dOBW*&{T0+7EGE%j;EnWTLLSMUW8km)NG3w+VUk~15wV%(|NCDc&ja%F~$NSN?Hi6H+?i)XfceV6C!~))U=~( ziof@`G#WT(PSd(bx^u&GUw&-gIwyZk8>%O-+%G=SPy44&pQv=i0dTD9%@0%n0HGKm zB8wQwU>@)iS?pmk8(9*5hW zy@0pR;4jk24T)XDaSC%%=xGSIRvOrKokoC+3(|lxWym_qV{T)>-U?s4Y@UgyN5noh z5C;TjXLp&3LeatyWxVX*Q< zUy2@JYTLM*w~k4%C0dTBuBt>poY4;A1|Z!{R8-i|3bj7gU8hc4qjQPW!<=z6X)_qw zUu;p$bGI@8OXq=%0g`#{l_ILHXbVgtrR!HL8DKT)~-0&>diN1gxP6m7PuTT zV{E+Xz%kk**eDb<|YopXidH1f!SH*A*pwfF=Test&KzbI$LqPcIoagKs z#)HYQQ|ZHHnVo?%!{KxCGUy$*q>VS6Q6R75;}B$PWH!Nh4D2)^(zq>jP}9;3Ge}*b zPj#e6p&jQ7xV&?v?;ax&;}joUv5lfT0Ki?^0z2Y#UcrdG9goev4~(3sd8kp9?mPwN zfSEzqv%b#V z4Rv0t)-`wowm6PY^kX2e?3j}^;8zYvxJrY-ZFHQib=bgcO^5WQ?s8$w*8tD~@VdK_ zjw5q2YhT05OPvY~8lIU0RWu-xwTrioQ8Ol6`0!MtIg>X;##-|&ZUJ`%isa-6TZ+k$ zl|jxKhWQHup^JJmya$)ElA`x({^RS9ulD=5KRs?VKYIahAHHAW#C@(q0q1a= zJ?91y6JW^Z=bQoD8vs|$c4Q4G#bMu!z+{1>i~tNpM|CwtnU4*YBA(M2Gw}m{6mS`I zV$nE4g$-u|k$cLbyuC}Bm2>f4OqSD~mI|>pYJcHId+c+S-B5Sd- zp@yp9yB>9bw>%-n*|0z-9+uYDCTbzbrDKCS2bv&y1fGkV5B8r=*2|lG_1gcxpI^Ou z|MroC?%6ANADQ{wt3xUqb1PhhR0X8+7*ronC8?wKoyjts)?A~SL+&vex17?49CsKm zjwJ}>P`fe0gNet|$Sl=jD6renZQ5fwIzhs?5Oe zEkR}o{>OG4F~dB(%L>ouU6Tg@?HYXyKC|W6oeLi2T+pu@rT4i5b2&QFJuqOyZ}^&? zx!jtp{`;2?uU_7KcsYqK>_>lj^B5QXea+ z#As6I9vyfxcgOde2f?35=Ntmr3tcixK^HLQS`#nG?$_<}$OvzSa|U^I#5Q+hcBJ*} zBpPqGx4;>pWqx8{qgePdw-ek1Ei7%SN8+?OXHV9MSf~hKI{`lMnj3ktYzNG{HdL$j zMAgOMU95Q=-5NpQvqu^ij+mN(KQ@OPZ(5Xpd)s5nrRWqapSM>| zS7ImxpV=(UL2qlGTCokPMKhxDm8oaq`JZTg&nqAtZ%@hPb zY{WQ6ddyYa^fH$YG>?Peq~+71qlz6!(IICyjV7C-Z3g$tY?xiSZ#WQ-b((ux>_`Tk z@^){0Y{6g)YBtc?5msPxB4*m1b?E7~MoI&Sb#gyl#syurjMUMkH3ShQqA}G<#*NL| zcx9E+Fd4-bP+ zPhQJ!HF{)YXh0H(fQb{PTr&!}bYy11jNDzeWUF{S*~2A`h2aJPuAufeCYMu3AOPWTB z(PPCG#6G&+7{sJ8&lJq`bEkA`;f8z(af7?Q2|f#3+;QZNB$)5ABq4P{zjd}`;ZE7D z8?6Zy*tpA&H=3=(o*B`6!8#QS22|^*Cqh;e?2&fNiQ{{WOb`+GS(67+p6U>8f^(Yc z-9k{dlV);K{AjdmM~Qc2~#>$Ed4sy@4c>ldG?qb5*keV$t#;4D41| zsqX^gn~@%shTL=>NWAWb>RobK4#-p{&12M^&L|yiZ@~1Hm#SXT+0J0oY2rJykD5_?`i2@9rm)dShk2vhYsEjHOZn=<$Ddz6>;gP{ z@$MUVpMR{EtbD{A3ifTch0;+JjL##%Xq>n|iHKQfOxWqiMt6WaYj>PYU_JzZ-rC$_ zE%m@##3vZC<-JX(b0K|VIXLZCI>1|2EV@1POxuVCQQ@+l`VPg6N~$LDoSrr6%!w)h zYV9fq^XQ;tFt^44N2&GV;DB6{!*~;Vm$u7L;5!9`X(t?f8NUoR+yKS2OWA#!CH}_` zKfZhS_Wj2XudYnfqaW*&*YCE~{^fJsI6^6yGRt*$2rDrLi8azn8@Wxi6oJgDNjm_k zcM>>gk9ZG&-BvV5uzc{bz1D*fOS zFHnkQTXj388~j%wU>_(1fBOF6Nd4IhcmG5EGyphzg|K38nX;vCj=oTvXp{6%GlD(0 zS0OY9j!AX0zS?OLNO$A_jt)%Gt>&w(rRO z>zZN)@&%$Z^I}OJCr7nu30!=-j!%s2fR`{BNH!@_{oJnq>!>Rx%tIvElPWqeLP5TL zo0nkfi4#bGCa+DQpThm$n70bSe}11I-oE}zzIyjB-@W?5-#vN+KYIng^II)4|Q}|?6z77uJRd+LE^%^qiuvCj$6YZdNJVfIk}TNEJ1nIH~tu-StRM2(%Uj6&aX7%0Ak8b{-y>h?! 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

`Dq(%Z?*ZxgR>MfvBc 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 H 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%0A|UQBbg0^+9NrRnr&6yPMp*mNl40!nI< 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

1E|Y3>1Udq%;fXI=f9kKl$`AMCQ&z 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 K3>;w|6b=Bhi+qs) literal 0 HcmV?d00001 diff --git a/docs/_scripts/js_translation/codeblocks/yarn.lock b/docs/_scripts/js_translation/codeblocks/yarn.lock index 0c6068c46..2891897a8 100644 --- a/docs/_scripts/js_translation/codeblocks/yarn.lock +++ b/docs/_scripts/js_translation/codeblocks/yarn.lock @@ -2108,9 +2108,9 @@ __metadata: linkType: hard "hono@npm:^4.5.4": - version: 4.8.9 - resolution: "hono@npm:4.8.9" - checksum: 10c0/385539d1787fdc747bc869ef0e5ccc9f39cbe40289b94f23eecfc82c6ca440f059704647cd6381a5066d2cf7baa43ab25184c78d44af4c5c98a5c5b07670059e + version: 4.9.6 + resolution: "hono@npm:4.9.6" + checksum: 10c0/182a144eb3b9e05bd9e43d15af15c93f60d3d747fef6c6904b9993e9db8129ea7fadf6190331d6f76b1bf6dd2b2c3b13efea105236f541ef411397e30475422d languageName: node linkType: hard From b90d7c4e5813c2d693d0a42a27c2fc7132441eef Mon Sep 17 00:00:00 2001 From: Kenta Murata <3959+mrkn@users.noreply.github.com> Date: Tue, 9 Sep 2025 05:51:16 +0900 Subject: [PATCH 29/58] fix(docs): Fix indentation of info block in graph-api.md (#6081) The "Why split application steps into a sequence with LangGraph?" info block in `graph-api.md` is broken. Before: image After: image --- docs/docs/how-tos/graph-api.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/docs/how-tos/graph-api.md b/docs/docs/how-tos/graph-api.md index bf0af9610..75d686bc4 100644 --- a/docs/docs/how-tos/graph-api.md +++ b/docs/docs/how-tos/graph-api.md @@ -1422,8 +1422,8 @@ const builder = new StateGraph(State) ::: ??? info "Why split application steps into a sequence with LangGraph?" -LangGraph makes it easy to add an underlying persistence layer to your application. -This allows state to be checkpointed in between the execution of nodes, so your LangGraph nodes govern: + LangGraph makes it easy to add an underlying persistence layer to your application. + This allows state to be checkpointed in between the execution of nodes, so your LangGraph nodes govern: - How state updates are [checkpointed](../concepts/persistence.md) - How interruptions are resumed in [human-in-the-loop](../concepts/human_in_the_loop.md) workflows @@ -3320,4 +3320,4 @@ const imageBuffer = new Uint8Array(await image.arrayBuffer()); await fs.writeFile("graph.png", imageBuffer); ``` -::: \ No newline at end of file +::: From c0067cd304f10c762cd7220f9d6c84c7c41c1a49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 20:52:35 +0000 Subject: [PATCH 30/58] chore: bump actions/upload-pages-artifact from 3 to 4 (#6004) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 3 to 4.

Release notes

Sourced from actions/upload-pages-artifact's releases.

v4.0.0

What's Changed

Full Changelog: https://github.com/actions/upload-pages-artifact/compare/v3.0.1...v4.0.0

v3.0.1

Changelog

See details of all code changes since previous release.

Commits
  • 7b1f4a7 Merge pull request #127 from heavymachinery/pin-sha
  • 4cc19c7 Pin actions/upload-artifact to SHA
  • 2d163be Merge pull request #107 from KittyChiu/main
  • c704843 fix: linted README
  • 9605915 Merge pull request #106 from KittyChiu/kittychiu/update-readme-1
  • e59cdfe Update README.md
  • a2d6704 doc: updated usage section in readme
  • 984864e Merge pull request #105 from actions/Jcambass-patch-1
  • 45dc788 Add workflow file for publishing releases to immutable action package
  • efaad07 Merge pull request #102 from actions/hidden-files
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/upload-pages-artifact&package-manager=github_actions&previous-version=3&new-version=4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> --- .github/workflows/deploy_docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml index 4c31784c2..9c05447ec 100644 --- a/.github/workflows/deploy_docs.yml +++ b/.github/workflows/deploy_docs.yml @@ -140,7 +140,7 @@ jobs: - name: Upload Pages Artifact # if: github.ref == 'refs/heads/main' - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v4 with: path: ./docs/site/ From f3055178f33a6622245ad3a717a50a3790e1e1af Mon Sep 17 00:00:00 2001 From: Mohammad Yehya <56927485+MohammadYehya@users.noreply.github.com> Date: Tue, 9 Sep 2025 01:53:22 +0500 Subject: [PATCH 31/58] docs: Fix Example Code Snippet in HITL (#5999) Description: Fixing the example code snippet at this [url](https://langchain-ai.github.io/langgraph/how-tos/human_in_the_loop/add-human-in-the-loop/#resume-multiple-interrupts-with-one-invocation). Fixes: - i.interrupt_id -> i.id, since interrupt_id is deprecrated - f"human input for prompt {i.value}" -> f"edited text for {i.value['text_to_revise']}", to match the output statement - parent.get_state -> graph.get_state, no variable named parent - get_state(thread_config) -> get_state(config), no variable named thread_config --- docs/docs/how-tos/human_in_the_loop/add-human-in-the-loop.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/how-tos/human_in_the_loop/add-human-in-the-loop.md b/docs/docs/how-tos/human_in_the_loop/add-human-in-the-loop.md index 6e7330f2f..49dffd465 100644 --- a/docs/docs/how-tos/human_in_the_loop/add-human-in-the-loop.md +++ b/docs/docs/how-tos/human_in_the_loop/add-human-in-the-loop.md @@ -366,8 +366,8 @@ result = graph.invoke( # Resume with mapping of interrupt IDs to values resume_map = { - i.interrupt_id: f"human input for prompt {i.value}" - for i in parent.get_state(thread_config).interrupts + i.id: f"edited text for {i.value['text_to_revise']}" + for i in graph.get_state(config).interrupts } print(graph.invoke(Command(resume=resume_map), config=config)) # > {'text_1': 'edited text for original text 1', 'text_2': 'edited text for original text 2'} From 1539a55d2c82a8fa5e22253f21b52abc1ac50287 Mon Sep 17 00:00:00 2001 From: zzxxj216 <144192050+zzxxj216@users.noreply.github.com> Date: Tue, 9 Sep 2025 04:54:35 +0800 Subject: [PATCH 32/58] docs(langgraph): correct typo "runtie" to "runtime" in StateGraph (#6060) **Description:** Fix a typo where "runtie" was incorrectly used instead of "runtime" in line 158 of the StateGraph class in state.py. This resolves the example error caused by the misspelled variable name. **Dependencies:** None --- libs/langgraph/langgraph/graph/state.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langgraph/langgraph/graph/state.py b/libs/langgraph/langgraph/graph/state.py index 3512b3fa5..2f7d3f75b 100644 --- a/libs/langgraph/langgraph/graph/state.py +++ b/libs/langgraph/langgraph/graph/state.py @@ -155,7 +155,7 @@ class StateGraph(Generic[StateT, ContextT, InputT, OutputT]): graph = StateGraph(state_schema=State, context_schema=Context) def node(state: State, runtime: Runtime[Context]) -> dict: - r = runtie.context.get("r", 1.0) + r = runtime.context.get("r", 1.0) x = state["x"][-1] next_value = x * r * (1 - x) return {"x": next_value} From 788b62c0fb17e8b34ae8fe32cb75d48da61d6fd9 Mon Sep 17 00:00:00 2001 From: xindoo Date: Tue, 9 Sep 2025 04:54:42 +0800 Subject: [PATCH 33/58] docs(langgraph):Correct variable name in context.md (#6022) Ensures the variable name used in the documentation accurately reflects the codebase. --- docs/docs/agents/context.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/agents/context.md b/docs/docs/agents/context.md index 5aa71a608..942e7d628 100644 --- a/docs/docs/agents/context.md +++ b/docs/docs/agents/context.md @@ -90,7 +90,7 @@ graph.invoke( # (1)! from langgraph.runtime import Runtime # highlight-next-line - def node(state: State, config: Runtime[ContextSchema]): + def node(state: State, runtime: Runtime[ContextSchema]): user_name = runtime.context.user_name ... ``` From 89de9503076c8964b7daa42927c034e85b5050da Mon Sep 17 00:00:00 2001 From: Xin Zhang Date: Tue, 9 Sep 2025 20:17:07 +0800 Subject: [PATCH 34/58] docs (langgraph): Fix bug in the code example (#6114) - **Description:** Fix the wrong variable name in the example of `memory.md`. - **Dependencies:** NA. --- docs/docs/concepts/memory.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/concepts/memory.md b/docs/docs/concepts/memory.md index 83d3f29a0..390693965 100644 --- a/docs/docs/concepts/memory.md +++ b/docs/docs/concepts/memory.md @@ -134,7 +134,7 @@ def update_instructions(state: State, store: BaseStore): namespace = ("instructions",) current_instructions = store.search(namespace)[0] # Memory logic - prompt = prompt_template.format(instructions=instructions.value["instructions"], conversation=state["messages"]) + prompt = prompt_template.format(instructions=current_instructions.value["instructions"], conversation=state["messages"]) output = llm.invoke(prompt) new_instructions = output['new_instructions'] store.put(("agent_instructions",), "agent_a", {"instructions": new_instructions}) @@ -278,4 +278,4 @@ const items = await store.search( ``` ::: -For more information about the memory store, see the [Persistence](persistence.md#memory-store) guide. \ No newline at end of file +For more information about the memory store, see the [Persistence](persistence.md#memory-store) guide. From 14d4be6c4a4ffb08bfcbe535dce853c9a73d691e Mon Sep 17 00:00:00 2001 From: Sakshi Gupta <64280320+sakshi1989@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:18:48 -0400 Subject: [PATCH 36/58] docs: Import RetryPolicy from types not pregel (#5941) docs (graphapi.md) : With the new langgraph version, the RetryPolicy needs to be imported from `langgraph.types` to avoid `ImportError: cannot import name 'RetryPolicy' from 'langgraph.pregel'` --- docs/docs/how-tos/graph-api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/how-tos/graph-api.md b/docs/docs/how-tos/graph-api.md index 75d686bc4..04de9495e 100644 --- a/docs/docs/how-tos/graph-api.md +++ b/docs/docs/how-tos/graph-api.md @@ -1205,7 +1205,7 @@ There are many use cases where you may wish for your node to have a custom retry To configure a retry policy, pass the `retry_policy` parameter to the [add_node](../reference/graphs.md#langgraph.graph.state.StateGraph.add_node). The `retry_policy` parameter takes in a `RetryPolicy` named tuple object. Below we instantiate a `RetryPolicy` object with the default parameters and associate it with a node: ```python -from langgraph.pregel import RetryPolicy +from langgraph.types import RetryPolicy builder.add_node( "node_name", @@ -1260,7 +1260,7 @@ By default, the retry policy retries on any exception except for the following: from typing_extensions import TypedDict from langchain.chat_models import init_chat_model from langgraph.graph import END, MessagesState, StateGraph, START - from langgraph.pregel import RetryPolicy + from langgraph.types import RetryPolicy from langchain_community.utilities import SQLDatabase from langchain_core.messages import AIMessage From 692f177a104190b2f2613e62f2ca40c294e68d5c Mon Sep 17 00:00:00 2001 From: Adriaan Joubert <45142747+adriaanjoubert@users.noreply.github.com> Date: Tue, 9 Sep 2025 17:19:24 +0300 Subject: [PATCH 37/58] docs(langgraph): unindent text (#5906) **Description:** unintend wrongly indented bulleted list and paragraph. Co-authored-by: Lauren Hirata Singh --- docs/docs/how-tos/graph-api.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/docs/how-tos/graph-api.md b/docs/docs/how-tos/graph-api.md index 04de9495e..81e2c7e79 100644 --- a/docs/docs/how-tos/graph-api.md +++ b/docs/docs/how-tos/graph-api.md @@ -1425,12 +1425,12 @@ const builder = new StateGraph(State) LangGraph makes it easy to add an underlying persistence layer to your application. This allows state to be checkpointed in between the execution of nodes, so your LangGraph nodes govern: - - How state updates are [checkpointed](../concepts/persistence.md) - - How interruptions are resumed in [human-in-the-loop](../concepts/human_in_the_loop.md) workflows - - How we can "rewind" and branch-off executions using LangGraph's [time travel](../concepts/time-travel.md) features +- How state updates are [checkpointed](../concepts/persistence.md) +- How interruptions are resumed in [human-in-the-loop](../concepts/human_in_the_loop.md) workflows +- How we can "rewind" and branch-off executions using LangGraph's [time travel](../concepts/time-travel.md) features - They also determine how execution steps are [streamed](../concepts/streaming.md), and how your application is visualized - and debugged using [LangGraph Studio](../concepts/langgraph_studio.md). +They also determine how execution steps are [streamed](../concepts/streaming.md), and how your application is visualized +and debugged using [LangGraph Studio](../concepts/langgraph_studio.md). Let's demonstrate an end-to-end example. We will create a sequence of three steps: From cd33de2ad10f1cdc74cf73134b5299367d6f50e8 Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:22:19 -0400 Subject: [PATCH 38/58] chore: minor CI/link fixes (#6116) --- .github/workflows/pr_lint.yml | 1 + README.md | 2 +- libs/langgraph/README.md | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr_lint.yml b/.github/workflows/pr_lint.yml index f4bc62f51..aaba898be 100644 --- a/.github/workflows/pr_lint.yml +++ b/.github/workflows/pr_lint.yml @@ -40,6 +40,7 @@ jobs: sdk-py docs ci + deps requireScope: false ignoreLabels: | ignore-lint-pr-title diff --git a/README.md b/README.md index 47cc4d052..8fe8c5f2c 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ While LangGraph can be used standalone, it also integrates seamlessly with any L ## Additional resources -- [Guides](https://langchain-ai.github.io/langgraph/how-tos/): Quick, actionable code snippets for topics such as streaming, adding memory & persistence, and design patterns (e.g. branching, subgraphs, etc.). +- [Guides](https://langchain-ai.github.io/langgraph/guides/): Quick, actionable code snippets for topics such as streaming, adding memory & persistence, and design patterns (e.g. branching, subgraphs, etc.). - [Reference](https://langchain-ai.github.io/langgraph/reference/graphs/): Detailed reference on core classes, methods, how to use the graph and checkpointing APIs, and higher-level prebuilt components. - [Examples](https://langchain-ai.github.io/langgraph/examples/): Guided examples on getting started with LangGraph. - [LangChain Forum](https://forum.langchain.com/): Connect with the community and share all of your technical questions, ideas, and feedback. diff --git a/libs/langgraph/README.md b/libs/langgraph/README.md index 47cc4d052..8fe8c5f2c 100644 --- a/libs/langgraph/README.md +++ b/libs/langgraph/README.md @@ -71,7 +71,7 @@ While LangGraph can be used standalone, it also integrates seamlessly with any L ## Additional resources -- [Guides](https://langchain-ai.github.io/langgraph/how-tos/): Quick, actionable code snippets for topics such as streaming, adding memory & persistence, and design patterns (e.g. branching, subgraphs, etc.). +- [Guides](https://langchain-ai.github.io/langgraph/guides/): Quick, actionable code snippets for topics such as streaming, adding memory & persistence, and design patterns (e.g. branching, subgraphs, etc.). - [Reference](https://langchain-ai.github.io/langgraph/reference/graphs/): Detailed reference on core classes, methods, how to use the graph and checkpointing APIs, and higher-level prebuilt components. - [Examples](https://langchain-ai.github.io/langgraph/examples/): Guided examples on getting started with LangGraph. - [LangChain Forum](https://forum.langchain.com/): Connect with the community and share all of your technical questions, ideas, and feedback. From 264caa06846f65de7a1e48639cda27d2d0bcfea6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:28:09 -0400 Subject: [PATCH 39/58] chore(deps): bump amannn/action-semantic-pull-request from 5 to 6 (#5929) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [amannn/action-semantic-pull-request](https://github.com/amannn/action-semantic-pull-request) from 5 to 6.
Release notes

Sourced from amannn/action-semantic-pull-request's releases.

v6.0.0

6.0.0 (2025-08-13)

⚠ BREAKING CHANGES

  • Upgrade action to use Node.js 24 and ESM (#287)

Features

  • Upgrade action to use Node.js 24 and ESM (#287) (bc0c9a7)

v5.5.3

5.5.3 (2024-06-28)

Bug Fixes

v5.5.2

5.5.2 (2024-04-24)

Bug Fixes

v5.5.1

5.5.1 (2024-04-24)

Bug Fixes

v5.5.0

5.5.0 (2024-04-23)

Features

v5.4.0

5.4.0 (2023-11-03)

... (truncated)

Changelog

Sourced from amannn/action-semantic-pull-request's changelog.

5.3.0 (2023-09-25)

Features

5.2.0 (2023-03-16)

Features

5.1.0 (2023-02-10)

Features

  • Add regex support to scope and disallowScopes configuration (#226) (403a6f8)

5.0.2 (2022-10-17)

Bug Fixes

  • Upgrade @actions/core to avoid deprecation warnings (#208) (91f4126)

5.0.1 (2022-10-14)

Bug Fixes

  • Upgrade GitHub Action to use Node v16 (#207) (6282ee3)

5.0.0 (2022-10-11)

⚠ BREAKING CHANGES

  • Enum options need to be newline delimited (to allow whitespace within them) (#205)

Features

  • Enum options need to be newline delimited (to allow whitespace within them) (#205) (c906fe1)

4.6.0 (2022-09-26)

Features

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=amannn/action-semantic-pull-request&package-manager=github_actions&previous-version=5&new-version=6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> --- .github/workflows/pr_lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_lint.yml b/.github/workflows/pr_lint.yml index aaba898be..944f51e59 100644 --- a/.github/workflows/pr_lint.yml +++ b/.github/workflows/pr_lint.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Validate PR Title - uses: amannn/action-semantic-pull-request@v5 + uses: amannn/action-semantic-pull-request@v6 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 94fa3291002605219bcd35d58081c3ace3abad78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:28:41 +0000 Subject: [PATCH 40/58] chore(deps): bump actions/checkout from 4 to 5 (#5930) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
Release notes

Sourced from actions/checkout's releases.

v5.0.0

What's Changed

⚠️ Minimum Compatible Runner Version

v2.327.1
Release Notes

Make sure your runner is updated to this version or newer to use this release.

Full Changelog: https://github.com/actions/checkout/compare/v4...v5.0.0

v4.3.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4...v4.3.0

v4.2.2

What's Changed

Full Changelog: https://github.com/actions/checkout/compare/v4.2.1...v4.2.2

v4.2.1

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4.2.0...v4.2.1

... (truncated)

Changelog

Sourced from actions/checkout's changelog.

Changelog

V5.0.0

V4.3.0

v4.2.2

v4.2.1

v4.2.0

v4.1.7

v4.1.6

v4.1.5

v4.1.4

v4.1.3

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4&new-version=5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> --- .github/workflows/_integration_test.yml | 2 +- .github/workflows/_lint.yml | 2 +- .github/workflows/_test.yml | 2 +- .github/workflows/_test_langgraph.yml | 2 +- .github/workflows/_test_release.yml | 4 ++-- .github/workflows/baseline.yml | 2 +- .github/workflows/bench.yml | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/codespell.yml | 2 +- .github/workflows/deploy_docs.yml | 4 ++-- .github/workflows/link_check.yml | 4 ++-- .github/workflows/release.yml | 10 +++++----- .github/workflows/run_notebooks.yml | 2 +- .github/workflows/uv_lock_ugprade.yml | 2 +- 14 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/_integration_test.yml b/.github/workflows/_integration_test.yml index 2057dceae..b55e23664 100644 --- a/.github/workflows/_integration_test.yml +++ b/.github/workflows/_integration_test.yml @@ -19,7 +19,7 @@ jobs: run: working-directory: libs/cli steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Get changed files id: changed-files uses: Ana06/get-changed-files@v2.3.0 diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml index 68c9a78f3..eb64ea4ce 100644 --- a/.github/workflows/_lint.yml +++ b/.github/workflows/_lint.yml @@ -31,7 +31,7 @@ jobs: - "3.12" name: "lint #${{ matrix.python-version }}" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Get changed files id: changed-files uses: Ana06/get-changed-files@v2.3.0 diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index 6fb763003..6f41c6407 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -25,7 +25,7 @@ jobs: name: "test #${{ matrix.python-version }}" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} uses: astral-sh/setup-uv@v6 with: diff --git a/.github/workflows/_test_langgraph.yml b/.github/workflows/_test_langgraph.yml index df09511e7..3486671d9 100644 --- a/.github/workflows/_test_langgraph.yml +++ b/.github/workflows/_test_langgraph.yml @@ -23,7 +23,7 @@ jobs: working-directory: libs/langgraph name: "test #${{ matrix.python-version }}" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} uses: astral-sh/setup-uv@v6 with: diff --git a/.github/workflows/_test_release.yml b/.github/workflows/_test_release.yml index 2a2324c6f..bf311ff0d 100644 --- a/.github/workflows/_test_release.yml +++ b/.github/workflows/_test_release.yml @@ -24,7 +24,7 @@ jobs: version: ${{ steps.check-version.outputs.version }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python $${ env.PYTHON_VERSION }} uses: astral-sh/setup-uv@v6 @@ -75,7 +75,7 @@ jobs: id-token: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/download-artifact@v4 with: diff --git a/.github/workflows/baseline.yml b/.github/workflows/baseline.yml index 9b2c7cd71..27f7d179a 100644 --- a/.github/workflows/baseline.yml +++ b/.github/workflows/baseline.yml @@ -17,7 +17,7 @@ jobs: run: working-directory: libs/langgraph steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - run: SHA=$(git rev-parse HEAD) && echo "SHA=$SHA" >> $GITHUB_ENV - name: Set up Python 3.11 uses: astral-sh/setup-uv@v6 diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index f5484badb..7061e2852 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -15,7 +15,7 @@ jobs: run: working-directory: libs/langgraph steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - id: files name: Get changed files uses: Ana06/get-changed-files@v2.3.0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53f67c352..d84b982d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: python: ${{ steps.filter.outputs.python }} deps: ${{ steps.filter.outputs.deps }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: dorny/paths-filter@v3 id: filter with: @@ -100,7 +100,7 @@ jobs: name: "Check SDK methods matching" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python uses: actions/setup-python@v6 with: @@ -118,7 +118,7 @@ jobs: python-version: - "3.11" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} uses: astral-sh/setup-uv@v6 with: diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml index a4d9f9c41..b1be72f7e 100644 --- a/.github/workflows/codespell.yml +++ b/.github/workflows/codespell.yml @@ -21,7 +21,7 @@ steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Dependencies run: | diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml index 9c05447ec..6368aeeca 100644 --- a/.github/workflows/deploy_docs.yml +++ b/.github/workflows/deploy_docs.yml @@ -28,7 +28,7 @@ jobs: outputs: changed-files: ${{ steps.changed-files.outputs.added_modified }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Get changed files id: changed-files uses: Ana06/get-changed-files@v2.3.0 @@ -41,7 +41,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.MKDOCS_GITHUB_TOKEN }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/link_check.yml b/.github/workflows/link_check.yml index 65e041e7b..95e792b18 100644 --- a/.github/workflows/link_check.yml +++ b/.github/workflows/link_check.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e739b064a..d908917ca 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,7 @@ jobs: tag: ${{ steps.check-version.outputs.tag }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python uses: astral-sh/setup-uv@v6 @@ -87,7 +87,7 @@ jobs: outputs: release-body: ${{ steps.generate-release-body.outputs.release-body }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: repository: langchain-ai/langgraph path: langgraph @@ -158,7 +158,7 @@ jobs: - test-pypi-publish runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 # We explicitly *don't* set up caching here. This ensures our tests are # maximally sensitive to catching breakage. @@ -261,7 +261,7 @@ jobs: working-directory: ${{ inputs.working-directory }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python uses: astral-sh/setup-uv@v6 @@ -302,7 +302,7 @@ jobs: working-directory: ${{ inputs.working-directory }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python uses: astral-sh/setup-uv@v6 diff --git a/.github/workflows/run_notebooks.yml b/.github/workflows/run_notebooks.yml index 975df0191..1602eb970 100644 --- a/.github/workflows/run_notebooks.yml +++ b/.github/workflows/run_notebooks.yml @@ -28,7 +28,7 @@ jobs: - "latest" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python + Poetry uses: astral-sh/setup-uv@v6 with: diff --git a/.github/workflows/uv_lock_ugprade.yml b/.github/workflows/uv_lock_ugprade.yml index 75d74890c..192afd7eb 100644 --- a/.github/workflows/uv_lock_ugprade.yml +++ b/.github/workflows/uv_lock_ugprade.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up uv uses: astral-sh/setup-uv@v6 From e6a9e1d1c1415fd6c5b93a9fbfba65dc31f68fb8 Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:31:40 -0400 Subject: [PATCH 41/58] chore: update examples with `context` API (#5865) --- examples/rag/langgraph_crag_local.ipynb | 4 +++- libs/cli/examples/graphs/agent.py | 15 ++++++++------- .../examples/graphs_reqs_a/graphs_submod/agent.py | 14 +++++++++----- .../examples/graphs_reqs_b/graphs_submod/agent.py | 13 +++++++++---- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/examples/rag/langgraph_crag_local.ipynb b/examples/rag/langgraph_crag_local.ipynb index 19dc84410..c454127f2 100644 --- a/examples/rag/langgraph_crag_local.ipynb +++ b/examples/rag/langgraph_crag_local.ipynb @@ -707,7 +707,9 @@ " \"\"\"\n", " Find all tool calls in the messages returned\n", " \"\"\"\n", - " tool_calls = [tc['name'] for m in messages['messages'] for tc in getattr(m, 'tool_calls', [])]\n", + " tool_calls = [\n", + " tc[\"name\"] for m in messages[\"messages\"] for tc in getattr(m, \"tool_calls\", [])\n", + " ]\n", " return tool_calls\n", "\n", "\n", diff --git a/libs/cli/examples/graphs/agent.py b/libs/cli/examples/graphs/agent.py index f39df4cae..931982061 100644 --- a/libs/cli/examples/graphs/agent.py +++ b/libs/cli/examples/graphs/agent.py @@ -7,6 +7,7 @@ from langchain_core.messages import BaseMessage from langchain_openai import ChatOpenAI from langgraph.graph import END, StateGraph, add_messages from langgraph.prebuilt import ToolNode +from langgraph.runtime import Runtime tools = [TavilySearchResults(max_results=1)] @@ -17,6 +18,10 @@ model_anth = model_anth.bind_tools(tools) model_oai = model_oai.bind_tools(tools) +class AgentContext(TypedDict): + model: Literal["anthropic", "openai"] + + class AgentState(TypedDict): messages: Annotated[Sequence[BaseMessage], add_messages] @@ -34,8 +39,8 @@ def should_continue(state): # Define the function that calls the model -def call_model(state, config): - if config["configurable"].get("model", "anthropic") == "anthropic": +def call_model(state, runtime: Runtime[AgentContext]): + if runtime.context.get("model", "anthropic") == "anthropic": model = model_anth else: model = model_oai @@ -49,12 +54,8 @@ def call_model(state, config): tool_node = ToolNode(tools) -class ContextSchema(TypedDict): - model: Literal["anthropic", "openai"] - - # Define a new graph -workflow = StateGraph(AgentState, context_schema=ContextSchema) +workflow = StateGraph(AgentState, context_schema=AgentContext) # Define the two nodes we will cycle between workflow.add_node("agent", call_model) diff --git a/libs/cli/examples/graphs_reqs_a/graphs_submod/agent.py b/libs/cli/examples/graphs_reqs_a/graphs_submod/agent.py index 1073110cb..7971b3ce0 100644 --- a/libs/cli/examples/graphs_reqs_a/graphs_submod/agent.py +++ b/libs/cli/examples/graphs_reqs_a/graphs_submod/agent.py @@ -1,6 +1,6 @@ from collections.abc import Sequence from pathlib import Path -from typing import Annotated, TypedDict +from typing import Annotated, Literal, TypedDict from langchain_anthropic import ChatAnthropic from langchain_community.tools.tavily_search import TavilySearchResults @@ -8,6 +8,7 @@ from langchain_core.messages import BaseMessage from langchain_openai import ChatOpenAI from langgraph.graph import END, StateGraph, add_messages from langgraph.prebuilt import ToolNode +from langgraph.runtime import Runtime tools = [TavilySearchResults(max_results=1)] @@ -21,6 +22,10 @@ prompt = open(Path(__file__).parent.parent / "prompt.txt").read() subprompt = open(Path(__file__).parent / "subprompt.txt").read() +class AgentContext(TypedDict): + model: Literal["anthropic", "openai"] + + class AgentState(TypedDict): messages: Annotated[Sequence[BaseMessage], add_messages] @@ -38,8 +43,8 @@ def should_continue(state): # Define the function that calls the model -def call_model(state, config): - if config["configurable"].get("model", "anthropic") == "anthropic": +def call_model(state, runtime: Runtime[AgentContext]): + if runtime.context.get("model", "anthropic") == "anthropic": model = model_anth else: model = model_oai @@ -52,9 +57,8 @@ def call_model(state, config): # Define the function to execute tools tool_node = ToolNode(tools) - # Define a new graph -workflow = StateGraph(AgentState) +workflow = StateGraph(AgentState, context_schema=AgentContext) # Define the two nodes we will cycle between workflow.add_node("agent", call_model) diff --git a/libs/cli/examples/graphs_reqs_b/graphs_submod/agent.py b/libs/cli/examples/graphs_reqs_b/graphs_submod/agent.py index 1073110cb..eb81a0a7f 100644 --- a/libs/cli/examples/graphs_reqs_b/graphs_submod/agent.py +++ b/libs/cli/examples/graphs_reqs_b/graphs_submod/agent.py @@ -1,6 +1,6 @@ from collections.abc import Sequence from pathlib import Path -from typing import Annotated, TypedDict +from typing import Annotated, Literal, TypedDict from langchain_anthropic import ChatAnthropic from langchain_community.tools.tavily_search import TavilySearchResults @@ -8,6 +8,7 @@ from langchain_core.messages import BaseMessage from langchain_openai import ChatOpenAI from langgraph.graph import END, StateGraph, add_messages from langgraph.prebuilt import ToolNode +from langgraph.runtime import Runtime tools = [TavilySearchResults(max_results=1)] @@ -21,6 +22,10 @@ prompt = open(Path(__file__).parent.parent / "prompt.txt").read() subprompt = open(Path(__file__).parent / "subprompt.txt").read() +class AgentContext(TypedDict): + model: Literal["anthropic", "openai"] + + class AgentState(TypedDict): messages: Annotated[Sequence[BaseMessage], add_messages] @@ -38,8 +43,8 @@ def should_continue(state): # Define the function that calls the model -def call_model(state, config): - if config["configurable"].get("model", "anthropic") == "anthropic": +def call_model(state, runtime: Runtime[AgentContext]): + if runtime.context.get("model", "anthropic") == "anthropic": model = model_anth else: model = model_oai @@ -54,7 +59,7 @@ tool_node = ToolNode(tools) # Define a new graph -workflow = StateGraph(AgentState) +workflow = StateGraph(AgentState, context_schema=AgentContext) # Define the two nodes we will cycle between workflow.add_node("agent", call_model) From 62f754853288b4f15234527fbf9942a9810faddb Mon Sep 17 00:00:00 2001 From: Shelton Cui <89503179+dmwcs@users.noreply.github.com> Date: Wed, 10 Sep 2025 00:33:27 +1000 Subject: [PATCH 42/58] docs(docs): fix incorrect return type in should_continue example (#6068) Description: The documentation for the should_continue function contained an incorrect return type annotation. It was shown as Literal["environment", END], but the actual logic returns "Action" or END. This PR updates the example to use Literal["Action", END] so that the documentation matches the intended behavior of the function. Issue: N/A Dependencies: None --- docs/docs/tutorials/workflows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/tutorials/workflows.md b/docs/docs/tutorials/workflows.md index 7d46f853e..9b2f4de88 100644 --- a/docs/docs/tutorials/workflows.md +++ b/docs/docs/tutorials/workflows.md @@ -1948,7 +1948,7 @@ const llmWithTools = llm.bindTools(tools); # Conditional edge function to route to the tool node or end based upon whether the LLM made a tool call - def should_continue(state: MessagesState) -> Literal["environment", END]: + def should_continue(state: MessagesState) -> Literal["Action", END]: """Decide if we should continue the loop or stop based upon whether the LLM made a tool call""" messages = state["messages"] From 72843261606f8e180b2f46882c277fda988a7fb4 Mon Sep 17 00:00:00 2001 From: Kenta Murata <3959+mrkn@users.noreply.github.com> Date: Tue, 9 Sep 2025 23:42:26 +0900 Subject: [PATCH 43/58] fix(docs): Embed appropriate image files in graph-api.md (#6082) This fixes some images that refer to incorrect files. --- docs/docs/how-tos/graph-api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/how-tos/graph-api.md b/docs/docs/how-tos/graph-api.md index 81e2c7e79..9a64d5cd8 100644 --- a/docs/docs/how-tos/graph-api.md +++ b/docs/docs/how-tos/graph-api.md @@ -2333,7 +2333,7 @@ from IPython.display import Image, display display(Image(graph.get_graph().draw_mermaid_png())) ``` -![Simple loop graph](assets/graph_api_image_3.png) +![Simple loop graph](assets/graph_api_image_7.png) ::: :::js @@ -3272,7 +3272,7 @@ from langchain_core.runnables.graph import CurveStyle, MermaidDrawMethod, NodeSt display(Image(app.get_graph().draw_mermaid_png())) ``` -![Fractal graph visualization](assets/graph_api_image_5.png) +![Fractal graph visualization](assets/graph_api_image_10.png) **Using Mermaid + Pyppeteer** From f5f536ba7861ccd0cc16f877dbded5df08ce3bcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:48:03 -0400 Subject: [PATCH 44/58] chore(deps): bump actions/download-artifact from 4 to 5 (#5868) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 5.
Release notes

Sourced from actions/download-artifact's releases.

v5.0.0

What's Changed

v5.0.0

🚨 Breaking Change

This release fixes an inconsistency in path behavior for single artifact downloads by ID. If you're downloading single artifacts by ID, the output path may change.

What Changed

Previously, single artifact downloads behaved differently depending on how you specified the artifact:

  • By name: name: my-artifact → extracted to path/ (direct)
  • By ID: artifact-ids: 12345 → extracted to path/my-artifact/ (nested)

Now both methods are consistent:

  • By name: name: my-artifact → extracted to path/ (unchanged)
  • By ID: artifact-ids: 12345 → extracted to path/ (fixed - now direct)

Migration Guide

✅ No Action Needed If:
  • You download artifacts by name
  • You download multiple artifacts by ID
  • You already use merge-multiple: true as a workaround
⚠️ Action Required If:

You download single artifacts by ID and your workflows expect the nested directory structure.

Before v5 (nested structure):

- uses: actions/download-artifact@v4
  with:
    artifact-ids: 12345
    path: dist
# Files were in: dist/my-artifact/

Where my-artifact is the name of the artifact you previously uploaded

To maintain old behavior (if needed):

</tr></table>

... (truncated)

Commits
  • 634f93c Merge pull request #416 from actions/single-artifact-id-download-path
  • b19ff43 refactor: resolve download path correctly in artifact download tests (mainly ...
  • e262cbe bundle dist
  • bff23f9 update docs
  • fff8c14 fix download path logic when downloading a single artifact by id
  • 448e3f8 Merge pull request #407 from actions/nebuk89-patch-1
  • 47225c4 Update README.md
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/download-artifact&package-manager=github_actions&previous-version=4&new-version=5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> --- .github/workflows/_test_release.yml | 2 +- .github/workflows/release.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/_test_release.yml b/.github/workflows/_test_release.yml index bf311ff0d..fdb237fe0 100644 --- a/.github/workflows/_test_release.yml +++ b/.github/workflows/_test_release.yml @@ -77,7 +77,7 @@ jobs: steps: - uses: actions/checkout@v5 - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: test-dist path: ${{ inputs.working-directory }}/dist/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d908917ca..cd4d7f60a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -270,7 +270,7 @@ jobs: enable-cache: true cache-suffix: "release" - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: dist path: ${{ inputs.working-directory }}/dist/ @@ -311,7 +311,7 @@ jobs: enable-cache: true cache-suffix: "release" - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: dist path: ${{ inputs.working-directory }}/dist/ From faacbc1570d5870d043d8305416c0e0817e8c6d4 Mon Sep 17 00:00:00 2001 From: Mohammad Mohtashim <45242107+keenborder786@users.noreply.github.com> Date: Tue, 9 Sep 2025 20:07:07 +0500 Subject: [PATCH 45/58] docs(prebuilt): remaining_steps explanation added in `create_react_agent` (#5847) - **Description:** A better explanation of `remaining_steps` to clarify what it does. - **Issue:** #5548 --- libs/prebuilt/langgraph/prebuilt/chat_agent_executor.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libs/prebuilt/langgraph/prebuilt/chat_agent_executor.py b/libs/prebuilt/langgraph/prebuilt/chat_agent_executor.py index 8256bbc44..13d2ec6a4 100644 --- a/libs/prebuilt/langgraph/prebuilt/chat_agent_executor.py +++ b/libs/prebuilt/langgraph/prebuilt/chat_agent_executor.py @@ -390,6 +390,14 @@ def create_react_agent( state_schema: An optional state schema that defines graph state. Must have `messages` and `remaining_steps` keys. Defaults to `AgentState` that defines those two keys. + !!! Note + `remaining_steps` is used to limit the number of steps the react agent can take. + Calculated roughly as `recursion_limit` - `total_steps_taken`. + If `remaining_steps` is less than 2 and tool calls are present in the response, + the react agent will return a final AI Message with + the content "Sorry, need more steps to process this request.". + No `GraphRecusionError` will be raised in this case. + context_schema: An optional schema for runtime context. checkpointer: An optional checkpoint saver object. This is used for persisting the state of the graph (e.g., as chat memory) for a single thread (e.g., a single conversation). From b75daf093e7383a3200ca016eaba90bd80a9d34f Mon Sep 17 00:00:00 2001 From: Ahmad Elmalah Date: Tue, 9 Sep 2025 18:14:25 +0300 Subject: [PATCH 46/58] docs(multi-agent page): fix a couple of broken links (#5813) On this page: https://langchain-ai.github.io/langgraph/concepts/multi_agent/ The last couple of links are broken **First link:** https://langchain-ai.github.io/langgraph/concepts/how-tos/subgraph.ipynb#different-state-schemas should be updated to https://langchain-ai.github.io/langgraph/how-tos/subgraph/#different-state-schemas **Second link:** https://langchain-ai.github.io/langgraph/concepts/how-tos/graph-api.ipynb#pass-private-state-between-nodes should be updated to https://langchain-ai.github.io/langgraph/how-tos/graph-api/#pass-private-state-between-nodes --------- Co-authored-by: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> --- docs/docs/concepts/multi_agent.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/concepts/multi_agent.md b/docs/docs/concepts/multi_agent.md index 53f8bb3cd..752b8cc6b 100644 --- a/docs/docs/concepts/multi_agent.md +++ b/docs/docs/concepts/multi_agent.md @@ -897,5 +897,5 @@ There are two high-level approaches to achieve that: An agent might need to have a different state schema from the rest of the agents. For example, a search agent might only need to keep track of queries and retrieved documents. There are two ways to achieve this in LangGraph: -- Define [subgraph](./subgraphs.md) agents with a separate state schema. If there are no shared state keys (channels) between the subgraph and the parent graph, it's important to [add input / output transformations](../how-tos/subgraph.ipynb#different-state-schemas) so that the parent graph knows how to communicate with the subgraphs. -- Define agent node functions with a [private input state schema](../how-tos/graph-api.ipynb#pass-private-state-between-nodes) that is distinct from the overall graph state schema. This allows passing information that is only needed for executing that particular agent. +- Define [subgraph](./subgraphs.md) agents with a separate state schema. If there are no shared state keys (channels) between the subgraph and the parent graph, it's important to [add input / output transformations](../how-tos/subgraph.md#different-state-schemas) so that the parent graph knows how to communicate with the subgraphs. +- Define agent node functions with a [private input state schema](../how-tos/graph-api.md#pass-private-state-between-nodes) that is distinct from the overall graph state schema. This allows passing information that is only needed for executing that particular agent. From 4dfd1c368c6aaa65eb274d493e9ff1b9816d432d Mon Sep 17 00:00:00 2001 From: Todd Chaney <47466952+Therealchainman@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:27:23 -0400 Subject: [PATCH 47/58] Fix to graph-api docs Send API example (#5576) Very small update to docs, I think there is an add_edge that shouldn't be there and a bug. Adding the Annotated, resolves this error I received running the example. Traceback (most recent call last): File "/Users/toddchaney/repos/work/importal-apps/python-worker/main.py", line 52, in for step in graph.stream({"topic": "animals"}, stream_mode = ["updates", "values"]): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/toddchaney/repos/work/importal-apps/python-worker/.venv/lib/python3.12/site-packages/langgraph/pregel/__init__.py", line 2544, in stream loop.after_tick() File "/Users/toddchaney/repos/work/importal-apps/python-worker/.venv/lib/python3.12/site-packages/langgraph/pregel/loop.py", line 526, in after_tick self.updated_channels = apply_writes( ^^^^^^^^^^^^^ File "/Users/toddchaney/repos/work/importal-apps/python-worker/.venv/lib/python3.12/site-packages/langgraph/pregel/algo.py", line 299, in apply_writes if channels[chan].update(vals) and next_version is not None: ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/toddchaney/repos/work/importal-apps/python-worker/.venv/lib/python3.12/site-packages/langgraph/channels/last_value.py", line 58, in update raise InvalidUpdateError(msg) langgraph.errors.InvalidUpdateError: At key 'jokes': Can receive only one value per step. Use an Annotated key to handle multiple values. For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/INVALID_CONCURRENT_GRAPH_UPDATE Co-authored-by: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Co-authored-by: Eugene Yurtsev --- docs/docs/how-tos/graph-api.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/docs/how-tos/graph-api.md b/docs/docs/how-tos/graph-api.md index 9a64d5cd8..c92f45dcc 100644 --- a/docs/docs/how-tos/graph-api.md +++ b/docs/docs/how-tos/graph-api.md @@ -2110,7 +2110,6 @@ builder.add_edge(START, "generate_topics") builder.add_conditional_edges("generate_topics", continue_to_jokes, ["generate_joke"]) builder.add_edge("generate_joke", "best_joke") builder.add_edge("best_joke", END) -builder.add_edge("generate_topics", END) graph = builder.compile() ``` From 7bbe8d862822958d43ae43f753b57dbe3bbe806c Mon Sep 17 00:00:00 2001 From: Sakshi Gupta <64280320+sakshi1989@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:43:42 -0400 Subject: [PATCH 48/58] docs: Update graph-api.md for "Extended example: specifying LLM at runtime" (#5938) docs (graphapi) : Handle Missing Context in LLM Invocation - Invoking the LLM without explicitly passing a context parameter resulted in the following error: `AttributeError: 'NoneType' object has no attribute 'model_provider'` This occurred because the context was None, and the system attempted to access model_provider. This PR ensures that when context is not provided, an empty context is passed explicitly. This allows the system to correctly fall back to the default value defined in the ContextSchema.model_provider attribute. --- docs/docs/how-tos/graph-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/how-tos/graph-api.md b/docs/docs/how-tos/graph-api.md index c92f45dcc..7fbd084c8 100644 --- a/docs/docs/how-tos/graph-api.md +++ b/docs/docs/how-tos/graph-api.md @@ -1019,7 +1019,7 @@ console.log(await graph.invoke({}, { configurable: { myRuntimeValue: "b" } })); # Usage input_message = {"role": "user", "content": "hi"} # With no configuration, uses default (Anthropic) - response_1 = graph.invoke({"messages": [input_message]})["messages"][-1] + response_1 = graph.invoke({"messages": [input_message]}, context=ContextSchema())["messages"][-1] # Or, can set OpenAI response_2 = graph.invoke({"messages": [input_message]}, context={"model_provider": "openai"})["messages"][-1] From 682f39e0d38678ca76ef9dd3547fddf405d39072 Mon Sep 17 00:00:00 2001 From: Caspar Broekhuizen Date: Tue, 9 Sep 2025 10:52:11 -0700 Subject: [PATCH 49/58] fix(checkpoint): preserve non-ascii text in InMemoryStore embeddings (#6111) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description * Set `ensure_ascii=False` for all `json.dumps` calls in `get_text_at_path`. Preserves non-ASCII text instead of embedding `\uXXXX` escapes. **Before** ```python store.put(("user_123", "memories"), "1", {"text": "这是中文"}) # embeds {"text": "\\u8fd9\\u662f\\u4e2d\\u6587"} ``` **After** ```python store.put(("user_123", "memories"), "1", {"text": "这是中文"}) # embeds {"text": "这是中文"} ``` ### Tests & Docs * Add unit test `test_non_ascii` that writes three records (Chinese, Japanese, Korean) to an `InMemoryStore`, searches with the same strings, and asserts the correct top hit with a score >= 0.15 for each. ### Issue Fixes #5946 --- libs/checkpoint-postgres/tests/test_store.py | 43 +++++++++ libs/checkpoint-sqlite/tests/test_store.py | 28 ++++++ libs/checkpoint/langgraph/store/base/embed.py | 10 +- libs/checkpoint/tests/test_redis_cache.py | 91 ++++++++++--------- libs/checkpoint/tests/test_store.py | 24 +++++ 5 files changed, 151 insertions(+), 45 deletions(-) diff --git a/libs/checkpoint-postgres/tests/test_store.py b/libs/checkpoint-postgres/tests/test_store.py index f7c7a1b2c..42bf50419 100644 --- a/libs/checkpoint-postgres/tests/test_store.py +++ b/libs/checkpoint-postgres/tests/test_store.py @@ -861,3 +861,46 @@ def test_store_ttl(store): # Now has been (TTL_SECONDS-2)*2 > TTL_SECONDS + TTL_SECONDS/2 res = store.search(ns, query="bar", refresh_ttl=False) assert len(res) == 0 + + +@pytest.mark.parametrize( + "vector_type,distance_type", + [ + ("vector", "cosine"), + ("vector", "inner_product"), + ("halfvec", "cosine"), + ("halfvec", "inner_product"), + ], +) +def test_non_ascii( + request: Any, + fake_embeddings: CharacterEmbeddings, + vector_type: str, + distance_type: str, +) -> None: + """Test support for non-ascii characters""" + with _create_vector_store( + vector_type, + distance_type, + fake_embeddings + ) as store: + + store.put(("user_123", "memories"), "1", {"text": "这是中文"}) # Chinese + store.put( + ("user_123", "memories"), "2", {"text": "これは日本語です"} + ) # Japanese + store.put(("user_123", "memories"), "3", {"text": "이건 한국어야"}) # Korean + store.put(("user_123", "memories"), "4", {"text": "Это русский"}) # Russian + store.put(("user_123", "memories"), "5", {"text": "यह रूसी है"}) # Hindi + + result1 = store.search(("user_123", "memories"), query="这是中文") + result2 = store.search(("user_123", "memories"), query="これは日本語です") + result3 = store.search(("user_123", "memories"), query="이건 한국어야") + result4 = store.search(("user_123", "memories"), query="Это русский") + result5 = store.search(("user_123", "memories"), query="यह रूसी है") + + assert result1[0].key == "1" + assert result2[0].key == "2" + assert result3[0].key == "3" + assert result4[0].key == "4" + assert result5[0].key == "5" diff --git a/libs/checkpoint-sqlite/tests/test_store.py b/libs/checkpoint-sqlite/tests/test_store.py index 590394375..844493fdc 100644 --- a/libs/checkpoint-sqlite/tests/test_store.py +++ b/libs/checkpoint-sqlite/tests/test_store.py @@ -1067,3 +1067,31 @@ def test_sql_injection_vulnerability(store: SqliteStore) -> None: with pytest.raises(ValueError, match="Invalid filter key"): store.search(("docs",), filter={malicious_key: "dummy"}) + + +@pytest.mark.parametrize("distance_type", VECTOR_TYPES) +def test_non_ascii( + fake_embeddings: CharacterEmbeddings, + distance_type: str, +) -> None: + """Test support for non-ascii characters""" + with create_vector_store(fake_embeddings, distance_type=distance_type) as store: + store.put(("user_123", "memories"), "1", {"text": "这是中文"}) # Chinese + store.put( + ("user_123", "memories"), "2", {"text": "これは日本語です"} + ) # Japanese + store.put(("user_123", "memories"), "3", {"text": "이건 한국어야"}) # Korean + store.put(("user_123", "memories"), "4", {"text": "Это русский"}) # Russian + store.put(("user_123", "memories"), "5", {"text": "यह रूसी है"}) # Hindi + + result1 = store.search(("user_123", "memories"), query="这是中文") + result2 = store.search(("user_123", "memories"), query="これは日本語です") + result3 = store.search(("user_123", "memories"), query="이건 한국어야") + result4 = store.search(("user_123", "memories"), query="Это русский") + result5 = store.search(("user_123", "memories"), query="यह रूसी है") + + assert result1[0].key == "1" + assert result2[0].key == "2" + assert result3[0].key == "3" + assert result4[0].key == "4" + assert result5[0].key == "5" diff --git a/libs/checkpoint/langgraph/store/base/embed.py b/libs/checkpoint/langgraph/store/base/embed.py index 738a9e53f..afaa4d135 100644 --- a/libs/checkpoint/langgraph/store/base/embed.py +++ b/libs/checkpoint/langgraph/store/base/embed.py @@ -238,7 +238,7 @@ def get_text_at_path(obj: Any, path: str | list[str]) -> list[str]: - Nested paths in multi-field: "{field1,nested.field2}" """ if not path or path == "$": - return [json.dumps(obj, sort_keys=True)] + return [json.dumps(obj, sort_keys=True, ensure_ascii=False)] tokens = tokenize_path(path) if isinstance(path, str) else path @@ -249,7 +249,7 @@ def get_text_at_path(obj: Any, path: str | list[str]) -> list[str]: elif obj is None: return [] elif isinstance(obj, (list, dict)): - return [json.dumps(obj, sort_keys=True)] + return [json.dumps(obj, sort_keys=True, ensure_ascii=False)] return [] token = tokens[pos] @@ -295,7 +295,11 @@ def get_text_at_path(obj: Any, path: str | list[str]) -> list[str]: if isinstance(current_obj, (str, int, float, bool)): results.append(str(current_obj)) elif isinstance(current_obj, (list, dict)): - results.append(json.dumps(current_obj, sort_keys=True)) + results.append( + json.dumps( + current_obj, sort_keys=True, ensure_ascii=False + ) + ) # Handle wildcard elif token == "*": diff --git a/libs/checkpoint/tests/test_redis_cache.py b/libs/checkpoint/tests/test_redis_cache.py index bec001e9b..ca1fce09c 100644 --- a/libs/checkpoint/tests/test_redis_cache.py +++ b/libs/checkpoint/tests/test_redis_cache.py @@ -5,12 +5,13 @@ import time import pytest import redis +from langgraph.cache.base import FullKey from langgraph.cache.redis import RedisCache class TestRedisCache: @pytest.fixture(autouse=True) - def setup(self): + def setup(self) -> None: """Set up test Redis client and cache.""" self.client = redis.Redis( host="localhost", port=6379, db=0, decode_responses=False @@ -20,21 +21,21 @@ class TestRedisCache: except redis.ConnectionError: pytest.skip("Redis server not available") - self.cache = RedisCache(self.client, prefix="test:cache:") + self.cache: RedisCache = RedisCache(self.client, prefix="test:cache:") # Clean up before each test self.client.flushdb() - def teardown_method(self): + def teardown_method(self) -> None: """Clean up after each test.""" try: self.client.flushdb() except Exception: pass - def test_basic_set_and_get(self): + def test_basic_set_and_get(self) -> None: """Test basic set and get operations.""" - keys = [(("graph", "node"), "key1")] + keys: list[FullKey] = [(("graph", "node"), "key1")] values = {keys[0]: ({"result": 42}, None)} # Set value @@ -45,9 +46,9 @@ class TestRedisCache: assert len(result) == 1 assert result[keys[0]] == {"result": 42} - def test_batch_operations(self): + def test_batch_operations(self) -> None: """Test batch set and get operations.""" - keys = [ + keys: list[FullKey] = [ (("graph", "node1"), "key1"), (("graph", "node2"), "key2"), (("other", "node"), "key3"), @@ -68,9 +69,9 @@ class TestRedisCache: assert result[keys[1]] == {"result": 2} assert result[keys[2]] == {"result": 3} - def test_ttl_behavior(self): + def test_ttl_behavior(self) -> None: """Test TTL (time-to-live) functionality.""" - key = (("graph", "node"), "ttl_key") + key: FullKey = (("graph", "node"), "ttl_key") values = {key: ({"data": "expires_soon"}, 1)} # 1 second TTL # Set with TTL @@ -88,10 +89,10 @@ class TestRedisCache: result = self.cache.get([key]) assert len(result) == 0 - def test_namespace_isolation(self): + def test_namespace_isolation(self) -> None: """Test that different namespaces are isolated.""" - key1 = (("graph1", "node"), "same_key") - key2 = (("graph2", "node"), "same_key") + key1: FullKey = (("graph1", "node"), "same_key") + key2: FullKey = (("graph2", "node"), "same_key") values = {key1: ({"graph": 1}, None), key2: ({"graph": 2}, None)} @@ -101,9 +102,12 @@ class TestRedisCache: assert result[key1] == {"graph": 1} assert result[key2] == {"graph": 2} - def test_clear_all(self): + def test_clear_all(self) -> None: """Test clearing all cached values.""" - keys = [(("graph", "node1"), "key1"), (("graph", "node2"), "key2")] + keys: list[FullKey] = [ + (("graph", "node1"), "key1"), + (("graph", "node2"), "key2"), + ] values = {keys[0]: ({"result": 1}, None), keys[1]: ({"result": 2}, None)} self.cache.set(values) @@ -119,9 +123,9 @@ class TestRedisCache: result = self.cache.get(keys) assert len(result) == 0 - def test_clear_by_namespace(self): + def test_clear_by_namespace(self) -> None: """Test clearing cached values by namespace.""" - keys = [ + keys: list[FullKey] = [ (("graph1", "node"), "key1"), (("graph2", "node"), "key2"), (("graph1", "other"), "key3"), @@ -142,7 +146,7 @@ class TestRedisCache: assert len(result) == 1 assert result[keys[1]] == {"result": 2} - def test_empty_operations(self): + def test_empty_operations(self) -> None: """Test behavior with empty keys/values.""" # Empty get result = self.cache.get([]) @@ -151,14 +155,14 @@ class TestRedisCache: # Empty set self.cache.set({}) # Should not raise error - def test_nonexistent_keys(self): + def test_nonexistent_keys(self) -> None: """Test getting keys that don't exist.""" - keys = [(("graph", "node"), "nonexistent")] + keys: list[FullKey] = [(("graph", "node"), "nonexistent")] result = self.cache.get(keys) assert len(result) == 0 @pytest.mark.asyncio - async def test_async_operations(self): + async def test_async_operations(self) -> None: """Test async set and get operations with sync Redis client.""" # Create sync Redis client and cache (like main integration tests) client = redis.Redis(host="localhost", port=6379, db=1, decode_responses=False) @@ -167,9 +171,9 @@ class TestRedisCache: except Exception: pytest.skip("Redis not available") - cache = RedisCache(client, prefix="test:async:") + cache: RedisCache = RedisCache(client, prefix="test:async:") - keys = [(("graph", "node"), "async_key")] + keys: list[FullKey] = [(("graph", "node"), "async_key")] values = {keys[0]: ({"async": True}, None)} # Async set (delegates to sync) @@ -184,7 +188,7 @@ class TestRedisCache: client.flushdb() @pytest.mark.asyncio - async def test_async_clear(self): + async def test_async_clear(self) -> None: """Test async clear operations with sync Redis client.""" # Create sync Redis client and cache (like main integration tests) client = redis.Redis(host="localhost", port=6379, db=1, decode_responses=False) @@ -193,9 +197,9 @@ class TestRedisCache: except Exception: pytest.skip("Redis not available") - cache = RedisCache(client, prefix="test:async:") + cache: RedisCache = RedisCache(client, prefix="test:async:") - keys = [(("graph", "node"), "key")] + keys: list[FullKey] = [(("graph", "node"), "key")] values = {keys[0]: ({"data": "test"}, None)} await cache.aset(values) @@ -214,44 +218,44 @@ class TestRedisCache: # Cleanup client.flushdb() - def test_redis_unavailable_get(self): + def test_redis_unavailable_get(self) -> None: """Test behavior when Redis is unavailable during get operations.""" # Create cache with non-existent Redis server bad_client = redis.Redis( host="nonexistent", port=9999, socket_connect_timeout=0.1 ) - cache = RedisCache(bad_client, prefix="test:cache:") + cache: RedisCache = RedisCache(bad_client, prefix="test:cache:") - keys = [(("graph", "node"), "key")] + keys: list[FullKey] = [(("graph", "node"), "key")] result = cache.get(keys) # Should return empty dict when Redis unavailable assert result == {} - def test_redis_unavailable_set(self): + def test_redis_unavailable_set(self) -> None: """Test behavior when Redis is unavailable during set operations.""" # Create cache with non-existent Redis server bad_client = redis.Redis( host="nonexistent", port=9999, socket_connect_timeout=0.1 ) - cache = RedisCache(bad_client, prefix="test:cache:") + cache: RedisCache = RedisCache(bad_client, prefix="test:cache:") - keys = [(("graph", "node"), "key")] + keys: list[FullKey] = [(("graph", "node"), "key")] values = {keys[0]: ({"data": "test"}, None)} # Should not raise exception when Redis unavailable cache.set(values) # Should silently fail @pytest.mark.asyncio - async def test_redis_unavailable_async(self): + async def test_redis_unavailable_async(self) -> None: """Test async behavior when Redis is unavailable.""" # Create sync cache with non-existent Redis server (like main integration tests) bad_client = redis.Redis( host="nonexistent", port=9999, socket_connect_timeout=0.1 ) - cache = RedisCache(bad_client, prefix="test:cache:") + cache: RedisCache = RedisCache(bad_client, prefix="test:cache:") - keys = [(("graph", "node"), "key")] + keys: list[FullKey] = [(("graph", "node"), "key")] values = {keys[0]: ({"data": "test"}, None)} # Should return empty dict for get (delegates to sync) @@ -261,10 +265,10 @@ class TestRedisCache: # Should not raise exception for set (delegates to sync) await cache.aset(values) # Should silently fail - def test_corrupted_data_handling(self): + def test_corrupted_data_handling(self) -> None: """Test handling of corrupted data in Redis.""" # Set some valid data first - keys = [(("graph", "node"), "valid_key")] + keys: list[FullKey] = [(("graph", "node"), "valid_key")] values = {keys[0]: ({"data": "valid"}, None)} self.cache.set(values) @@ -273,33 +277,36 @@ class TestRedisCache: self.client.set(corrupted_key, b"invalid:data:format:too:many:colons") # Should skip corrupted entry and return only valid ones - all_keys = [keys[0], (("graph", "node"), "corrupted_key")] + all_keys: list[FullKey] = [keys[0], (("graph", "node"), "corrupted_key")] result = self.cache.get(all_keys) assert len(result) == 1 assert result[keys[0]] == {"data": "valid"} - def test_key_parsing_edge_cases(self): + def test_key_parsing_edge_cases(self) -> None: """Test key parsing with edge cases.""" # Test empty namespace - key1 = ((), "empty_ns") + key1: FullKey = ((), "empty_ns") values = {key1: ({"data": "empty_ns"}, None)} self.cache.set(values) result = self.cache.get([key1]) assert result[key1] == {"data": "empty_ns"} # Test namespace with special characters - key2 = (("graph:with:colons", "node-with-dashes"), "key_with_underscores") + key2: FullKey = ( + ("graph:with:colons", "node-with-dashes"), + "key_with_underscores", + ) values = {key2: ({"data": "special_chars"}, None)} self.cache.set(values) result = self.cache.get([key2]) assert result[key2] == {"data": "special_chars"} - def test_large_data_serialization(self): + def test_large_data_serialization(self) -> None: """Test handling of large data objects.""" # Create a large data structure large_data = {"large_list": list(range(1000)), "nested": {"data": "x" * 1000}} - key = (("graph", "node"), "large_key") + key: FullKey = (("graph", "node"), "large_key") values = {key: (large_data, None)} self.cache.set(values) diff --git a/libs/checkpoint/tests/test_store.py b/libs/checkpoint/tests/test_store.py index 589eec0e4..1bdfc0408 100644 --- a/libs/checkpoint/tests/test_store.py +++ b/libs/checkpoint/tests/test_store.py @@ -1021,3 +1021,27 @@ async def test_embed_with_path(fake_embeddings: CharacterEmbeddings) -> None: assert len(results) == 3 doc5_result = next(r for r in results if r.key == "doc5") assert doc5_result.score is None + + +def test_non_ascii(fake_embeddings: CharacterEmbeddings) -> None: + """Test support for non-ascii characters""" + store = InMemoryStore( + index={"dims": fake_embeddings.dims, "embed": fake_embeddings} + ) + store.put(("user_123", "memories"), "1", {"text": "这是中文"}) # Chinese + store.put(("user_123", "memories"), "2", {"text": "これは日本語です"}) # Japanese + store.put(("user_123", "memories"), "3", {"text": "이건 한국어야"}) # Korean + store.put(("user_123", "memories"), "4", {"text": "Это русский"}) # Russian + store.put(("user_123", "memories"), "5", {"text": "यह रूसी है"}) # Hindi + + result1 = store.search(("user_123", "memories"), query="这是中文") + result2 = store.search(("user_123", "memories"), query="これは日本語です") + result3 = store.search(("user_123", "memories"), query="이건 한국어야") + result4 = store.search(("user_123", "memories"), query="Это русский") + result5 = store.search(("user_123", "memories"), query="यह रूसी है") + + assert result1[0].key == "1" + assert result2[0].key == "2" + assert result3[0].key == "3" + assert result4[0].key == "4" + assert result5[0].key == "5" From 4af07942ed689bdb888e34ec3dca945ae5ae3b9e Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Tue, 9 Sep 2025 12:01:12 -0700 Subject: [PATCH 50/58] chore(ci): Run CI int tests in parallel (#5976) Co-authored-by: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> --- .github/workflows/_integration_test.yml | 63 +++++++++---------------- 1 file changed, 23 insertions(+), 40 deletions(-) diff --git a/.github/workflows/_integration_test.yml b/.github/workflows/_integration_test.yml index b55e23664..89097d600 100644 --- a/.github/workflows/_integration_test.yml +++ b/.github/workflows/_integration_test.yml @@ -14,6 +14,19 @@ jobs: python-version: - "3.10" - "3.11" + example: + - name: A + workdir: libs/cli/examples + tag: langgraph-test-a + - name: B + workdir: libs/cli/examples/graphs + tag: langgraph-test-b + - name: C + workdir: libs/cli/examples/graphs_reqs_a + tag: langgraph-test-c + - name: D + workdir: libs/cli/examples/graphs_reqs_b + tag: langgraph-test-d name: "CLI integration test" defaults: run: @@ -33,54 +46,24 @@ jobs: enable-cache: true cache-suffix: "cli-integration-test" ignore-nothing-to-cache: true - - name: Setup env - if: steps.changed-files.outputs.all - working-directory: libs/cli/examples - run: cat .env.example > .env - name: Install cli globally if: steps.changed-files.outputs.all run: pip install -e . - - name: Build and test service A + - name: Build and test service ${{ matrix.example.name }} if: steps.changed-files.outputs.all - working-directory: libs/cli/examples + working-directory: ${{ matrix.example.workdir }} env: LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }} run: | - # The build-arg isn't used; just testing that we accept other args - langgraph build -t langgraph-test-a - cp .env.example .env + # Build the image for this example + langgraph build -t ${{ matrix.example.tag }} + # Prepare environment file from local or parent example directory + if [ -f .env.example ]; then cp .env.example .env; elif [ -f ../.env.example ]; then cp ../.env.example .env; fi if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi - timeout 60 python ../../../.github/scripts/run_langgraph_cli_test.py -c langgraph.json -t langgraph-test-a - - name: Build and test service B - if: steps.changed-files.outputs.all - working-directory: libs/cli/examples/graphs - env: - LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }} - run: | - langgraph build -t langgraph-test-b - cp ../.env.example .env - if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi - timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-b - - name: Build and test service C - if: steps.changed-files.outputs.all - working-directory: libs/cli/examples/graphs_reqs_a - env: - LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }} - run: | - langgraph build -t langgraph-test-c - cp ../.env.example .env - if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi - timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-c - - name: Build and test service D - if: steps.changed-files.outputs.all - working-directory: libs/cli/examples/graphs_reqs_b - env: - LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }} - run: | - langgraph build -t langgraph-test-d - cp ../.env.example .env - if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi - timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-d + # Run the integration test using the built tag + # Compute repo root to reference the shared script robustly + REPO_ROOT=$(git rev-parse --show-toplevel) + timeout 60 python "$REPO_ROOT/.github/scripts/run_langgraph_cli_test.py" -t ${{ matrix.example.tag }} - name: Build JS service if: steps.changed-files.outputs.all From 20581e61c05b74791a0eba79fd2c4be747fa4fe8 Mon Sep 17 00:00:00 2001 From: Eyal Schuller Date: Wed, 10 Sep 2025 00:41:51 +0300 Subject: [PATCH 51/58] fix(checkpoint-postgres): export PoolConfig from package init (#5934) ### Description Export PoolConfig from langgraph.store.postgres.__init__ so the documented import from langgraph.store.postgres import AsyncPostgresStore, PoolConfig works as shown in the AsyncPostgresStore examples. This resolves a docs vs. code inconsistency without changing behavior. ### Issue N/A ### Dependencies: None --------- Co-authored-by: William FH <13333726+hinthornw@users.noreply.github.com> Co-authored-by: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> --- libs/checkpoint-postgres/langgraph/store/postgres/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/checkpoint-postgres/langgraph/store/postgres/__init__.py b/libs/checkpoint-postgres/langgraph/store/postgres/__init__.py index 47b7836d2..d0432b588 100644 --- a/libs/checkpoint-postgres/langgraph/store/postgres/__init__.py +++ b/libs/checkpoint-postgres/langgraph/store/postgres/__init__.py @@ -1,4 +1,4 @@ from langgraph.store.postgres.aio import AsyncPostgresStore -from langgraph.store.postgres.base import PostgresStore +from langgraph.store.postgres.base import PoolConfig, PostgresStore -__all__ = ["AsyncPostgresStore", "PostgresStore"] +__all__ = ["AsyncPostgresStore", "PoolConfig", "PostgresStore"] From 7170e04aa6f2193fdafedc8b22ffa84ace3988cf Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Tue, 9 Sep 2025 18:17:11 -0400 Subject: [PATCH 52/58] chore: update issue templates to redirect docs stuff (#6119) --- .github/ISSUE_TEMPLATE/config.yml | 5 ++++- .github/ISSUE_TEMPLATE/documentation.yml | 19 ------------------- 2 files changed, 4 insertions(+), 20 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/documentation.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 8ab0b8d23..0273d1555 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,6 +1,9 @@ blank_issues_enabled: false version: 2.1 contact_links: + - name: Documentation + url: https://github.com/langchain-ai/docs/issues/new + about: Report an issue related to the LangGraph documentation - name: LangChain Forum url: https://forum.langchain.com/ - about: General community discussions, support, and feature requests + about: General community discussions and support diff --git a/.github/ISSUE_TEMPLATE/documentation.yml b/.github/ISSUE_TEMPLATE/documentation.yml deleted file mode 100644 index fa48adb58..000000000 --- a/.github/ISSUE_TEMPLATE/documentation.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Documentation -description: Report an issue related to the LangGraph documentation. -title: "DOC: " -labels: [documentation] - -body: -- type: textarea - attributes: - label: "Issue with current documentation:" - description: > - Please make sure to leave a reference to the document/code you're - referring to. - -- type: textarea - attributes: - label: "Idea or request for content:" - description: > - Please describe as clearly as possible what topics you think are missing - from the current documentation. \ No newline at end of file From d9328027f966c29ac7d9b8626b91f82a1e30e4a4 Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Tue, 9 Sep 2025 18:20:15 -0400 Subject: [PATCH 53/58] fix: use langgraph template for docs issue (#6121) --- .github/ISSUE_TEMPLATE/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 0273d1555..cd9f8270a 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,7 +2,7 @@ blank_issues_enabled: false version: 2.1 contact_links: - name: Documentation - url: https://github.com/langchain-ai/docs/issues/new + url: https://github.com/langchain-ai/docs/issues/new?template=langgraph.yml about: Report an issue related to the LangGraph documentation - name: LangChain Forum url: https://forum.langchain.com/ From 6037f0210fa79745a8a08c544e8b276fcbe997e2 Mon Sep 17 00:00:00 2001 From: Lauren Hirata Singh Date: Tue, 9 Sep 2025 20:33:11 -0400 Subject: [PATCH 54/58] docs: Update banner for docs deprecation notice (#6120) --- docs/overrides/main.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/overrides/main.html b/docs/overrides/main.html index 54909ed89..e2089ffe0 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -291,7 +291,7 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= } .md-banner { - background-color: #CFC9FA; + background-color: #FFAE42; color: #000000; } @@ -360,5 +360,5 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= {% endblock %} {% block announce %} -Our new LangChain Academy Course Deep Research with LangGraph is now live! Enroll for free. +These docs will be deprecated and removed with the release of LangGraph v1.0 in October 2025. Visit the v1.0 alpha docs {% endblock %} From 326fd55e4f29a6b2d8127f416410bcd21efe2643 Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Wed, 10 Sep 2025 08:19:33 -0400 Subject: [PATCH 55/58] fix(langgraph): key error on runtime for config w/o configurable (#6106) Fixes https://github.com/langchain-ai/langgraph/issues/6072 Long term we probably want a more robust approach to configurable management in terms of required / not required attributes. --- .../langgraph/langgraph/_internal/_runnable.py | 4 ++-- libs/langgraph/tests/test_runnable.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/libs/langgraph/langgraph/_internal/_runnable.py b/libs/langgraph/langgraph/_internal/_runnable.py index 82db24e92..f4bce0b2a 100644 --- a/libs/langgraph/langgraph/_internal/_runnable.py +++ b/libs/langgraph/langgraph/_internal/_runnable.py @@ -345,7 +345,7 @@ class RunnableCallable(Runnable): args = (input,) kwargs = {**self.kwargs, **kwargs} - runtime = config[CONF].get(CONFIG_KEY_RUNTIME) + runtime = config.get(CONF, {}).get(CONFIG_KEY_RUNTIME) for kw, (runtime_key, default) in self.func_accepts.items(): # If the kwarg is already set, use the set value @@ -417,7 +417,7 @@ class RunnableCallable(Runnable): args = (input,) kwargs = {**self.kwargs, **kwargs} - runtime = config[CONF].get(CONFIG_KEY_RUNTIME) + runtime = config.get(CONF, {}).get(CONFIG_KEY_RUNTIME) for kw, (runtime_key, default) in self.func_accepts.items(): # If the kwarg has already been set, use the set value diff --git a/libs/langgraph/tests/test_runnable.py b/libs/langgraph/tests/test_runnable.py index b7b85f894..35eb53c1c 100644 --- a/libs/langgraph/tests/test_runnable.py +++ b/libs/langgraph/tests/test_runnable.py @@ -394,3 +394,21 @@ def test_config_injection() -> None: assert RunnableCallable(func_untyped).invoke( "test", config={"tags": ["test"], "configurable": {}} ) == ["test"] + + +def test_config_ensured() -> None: + def func(input: str, config: RunnableConfig) -> None: + assert input == "test" + assert config is not None + assert config.get("configurable") is not None + + RunnableCallable(func).invoke("test") + + +async def test_config_ensured_async() -> None: + async def func(input: str, config: RunnableConfig) -> None: + assert input == "test" + assert config is not None + assert config.get("configurable") is not None + + await RunnableCallable(func).ainvoke("test") From a43acc33bd913095b6180082469bedd38323a182 Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Wed, 10 Sep 2025 08:31:11 -0400 Subject: [PATCH 56/58] feat(langgraph): prevent arbitrary resumes w/ multiple pending interrupts (#6108) The idea here is that we don't want to allow resuming a graph w/ an arbitrary resume value if there are multiple interrupts in the queue, because the order in which interrupts enter the queue is not deterministic. We want to instead enforce that each resume value is mapped to an interrupt id. Instead, when multiple interrupts are present, a user should invoke w/ a resume map, mapping interrupt id -> resume value. The logic was more complex than expected because there are 2 copies of an interrupt in `checkpoint_pending_writes` for the cases w/ the functional API, because an interrupt in a task interrupts the task and entrypoint. This is technically breaking (users resuming multiple hanging interrupts w/ multiple resume calls can no longer do this... but the behavior for this case was non-deterministic in the first place so we can sell this as a fix). --- libs/langgraph/langgraph/pregel/_loop.py | 58 ++++++++++++++++++---- libs/langgraph/tests/test_pregel.py | 60 ++++++++++++++++++++++- libs/langgraph/tests/test_pregel_async.py | 49 ++++++++++++++++++ 3 files changed, 155 insertions(+), 12 deletions(-) diff --git a/libs/langgraph/langgraph/pregel/_loop.py b/libs/langgraph/langgraph/pregel/_loop.py index c9300f3d4..b0c98a5e3 100644 --- a/libs/langgraph/langgraph/pregel/_loop.py +++ b/libs/langgraph/langgraph/pregel/_loop.py @@ -568,6 +568,36 @@ class PregelLoop: if task := tasks.get(tid): task.writes.append((k, v)) + def _pending_interrupts(self) -> set[str]: + """Return the set of interrupt ids that are pending without corresponding resume values.""" + # mapping of task ids to interrupt ids + pending_interrupts: dict[str, str] = {} + + # set of resume task ids + pending_resumes: set[str] = set() + + for task_id, write_type, value in self.checkpoint_pending_writes: + if write_type == INTERRUPT: + # interrupts is always a list, but there should only be one element + pending_interrupts[task_id] = value[0].id + elif write_type == RESUME: + pending_resumes.add(task_id) + + resumed_interrupt_ids = { + pending_interrupts[task_id] + for task_id in pending_resumes + if task_id in pending_interrupts + } + + # Keep only interrupts whose interrupt_id is not resumed + hanging_interrupts: set[str] = { + interrupt_id + for interrupt_id in pending_interrupts.values() + if interrupt_id not in resumed_interrupt_ids + } + + return hanging_interrupts + def _first( self, *, input_keys: str | Sequence[str], updated_channels: set[str] | None ) -> set[str] | None: @@ -590,16 +620,24 @@ class PregelLoop: # map command to writes if isinstance(self.input, Command): - if resume_is_map := ( - (resume := self.input.resume) is not None - and isinstance(resume, dict) - and all(is_xxh3_128_hexdigest(k) for k in resume) - ): - self.config[CONF][CONFIG_KEY_RESUME_MAP] = self.input.resume - if resume is not None and not self.checkpointer: - raise RuntimeError( - "Cannot use Command(resume=...) without checkpointer" - ) + if (resume := self.input.resume) is not None: + if not self.checkpointer: + raise RuntimeError( + "Cannot use Command(resume=...) without checkpointer" + ) + + if resume_is_map := ( + isinstance(resume, dict) + and all(is_xxh3_128_hexdigest(k) for k in resume) + ): + self.config[CONF][CONFIG_KEY_RESUME_MAP] = resume + else: + if len(self._pending_interrupts()) > 1: + raise RuntimeError( + "When there are multiple pending interrupts, you must specify the interrupt id when resuming. " + "Docs: https://docs.langchain.com/oss/python/langgraph/add-human-in-the-loop#resume-multiple-interrupts-with-one-invocation." + ) + writes: defaultdict[str, list[tuple[str, Any]]] = defaultdict(list) # group writes by task ID for tid, c, v in map_command(cmd=self.input): diff --git a/libs/langgraph/tests/test_pregel.py b/libs/langgraph/tests/test_pregel.py index 8c9dda4fa..cbf6d03b6 100644 --- a/libs/langgraph/tests/test_pregel.py +++ b/libs/langgraph/tests/test_pregel.py @@ -7222,7 +7222,11 @@ def test_parallel_interrupts(sync_checkpointer: BaseCheckpointSaver) -> None: # get human input and resume if len(current_interrupts) > 0: - current_input = Command(resume=f"Resume #{invokes}") + # we resume one at a time to preserve original test behavior, + # but we could also resume all at once if we wanted + # with a single dict mapping of interrupt ids to resume values + resume = {current_interrupts[0].id: f"Resume #{invokes}"} + current_input = Command(resume=resume) # not more human input required, must be completed else: @@ -7383,7 +7387,11 @@ def test_parallel_interrupts_double(sync_checkpointer: BaseCheckpointSaver) -> N # get human input and resume if len(current_interrupts) > 0: - current_input = Command(resume=f"Resume #{invokes}") + # we resume one at a time to preserve original test behavior, + # but we could also resume all at once if we wanted + # with a single dict mapping of interrupt ids to resume values + resume = {current_interrupts[0].id: f"Resume #{invokes}"} + current_input = Command(resume=resume) # not more human input required, must be completed else: @@ -8333,3 +8341,51 @@ def test_subgraph_streaming_sync() -> None: assert result["last_chunk"].content == "today." assert result["num_chunks"] == 9 + + +def test_null_resume_disallowed_with_multiple_interrupts( + sync_checkpointer: BaseCheckpointSaver, +) -> None: + class State(TypedDict): + text_1: str + text_2: str + + def human_node_1(state: State): + value = interrupt({"text_to_revise": state["text_1"]}) + return {"text_1": value} + + def human_node_2(state: State): + value = interrupt({"text_to_revise": state["text_2"]}) + return {"text_2": value} + + graph_builder = StateGraph(State) + graph_builder.add_node("human_node_1", human_node_1) + graph_builder.add_node("human_node_2", human_node_2) + + # Add both nodes in parallel from START + graph_builder.add_edge(START, "human_node_1") + graph_builder.add_edge(START, "human_node_2") + + checkpointer = InMemorySaver() + graph = graph_builder.compile(checkpointer=checkpointer) + + thread_id = str(uuid.uuid4()) + config: RunnableConfig = {"configurable": {"thread_id": thread_id}} + graph.invoke( + {"text_1": "original text 1", "text_2": "original text 2"}, config=config + ) + + resume_map = { + i.id: f"resume for prompt: {i.value['text_to_revise']}" + for i in graph.get_state(config).interrupts + } + with pytest.raises( + RuntimeError, + match="When there are multiple pending interrupts, you must specify the interrupt id when resuming.", + ): + graph.invoke(Command(resume="singular resume"), config=config) + + assert graph.invoke(Command(resume=resume_map), config=config) == { + "text_1": "resume for prompt: original text 1", + "text_2": "resume for prompt: original text 2", + } diff --git a/libs/langgraph/tests/test_pregel_async.py b/libs/langgraph/tests/test_pregel_async.py index 6d42a0244..b5bd272af 100644 --- a/libs/langgraph/tests/test_pregel_async.py +++ b/libs/langgraph/tests/test_pregel_async.py @@ -9107,3 +9107,52 @@ async def test_subgraph_streaming_async() -> None: assert result["last_chunk"].content == "today." assert result["num_chunks"] == 9 + + +@NEEDS_CONTEXTVARS +async def test_null_resume_disallowed_with_multiple_interrupts( + async_checkpointer: BaseCheckpointSaver, +) -> None: + class State(TypedDict): + text_1: str + text_2: str + + async def human_node_1(state: State): + value = interrupt(state["text_1"]) + return {"text_1": value} + + async def human_node_2(state: State): + value = interrupt(state["text_2"]) + return {"text_2": value} + + graph_builder = StateGraph(State) + graph_builder.add_node("human_node_1", human_node_1) + graph_builder.add_node("human_node_2", human_node_2) + + # Add both nodes in parallel from START + graph_builder.add_edge(START, "human_node_1") + graph_builder.add_edge(START, "human_node_2") + + checkpointer = InMemorySaver() + graph = graph_builder.compile(checkpointer=checkpointer) + + thread_id = str(uuid.uuid4()) + config: RunnableConfig = {"configurable": {"thread_id": thread_id}} + await graph.ainvoke( + {"text_1": "original text 1", "text_2": "original text 2"}, config=config + ) + + resume_map = { + i.id: f"resume for prompt: {i.value}" + for i in (await graph.aget_state(config)).interrupts + } + with pytest.raises( + RuntimeError, + match="When there are multiple pending interrupts, you must specify the interrupt id when resuming.", + ): + await graph.ainvoke(Command(resume="singular resume"), config=config) + + assert await graph.ainvoke(Command(resume=resume_map), config=config) == { + "text_1": "resume for prompt: original text 1", + "text_2": "resume for prompt: original text 2", + } From 677d941bb62a5a6d1ff44e6bf3fe4db72b0fabee Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Wed, 10 Sep 2025 11:26:02 -0400 Subject: [PATCH 57/58] fix(langgraph): type checking for async w/ functional API (#6126) Fixes https://github.com/langchain-ai/langgraph/issues/4140 Fixes https://github.com/langchain-ai/langgraph/issues/3310 --- libs/langgraph/langgraph/func/__init__.py | 17 +++++++++-------- libs/langgraph/langgraph/pregel/_call.py | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/libs/langgraph/langgraph/func/__init__.py b/libs/langgraph/langgraph/func/__init__.py index fd3245791..5505c1a05 100644 --- a/libs/langgraph/langgraph/func/__init__.py +++ b/libs/langgraph/langgraph/func/__init__.py @@ -1,7 +1,5 @@ from __future__ import annotations -import asyncio -import concurrent.futures import functools import inspect import warnings @@ -49,7 +47,7 @@ __all__ = ("task", "entrypoint") class _TaskFunction(Generic[P, T]): def __init__( self, - func: Callable[P, T], + func: Callable[P, Awaitable[T]] | Callable[P, T], *, retry_policy: Sequence[RetryPolicy], cache_policy: CachePolicy[Callable[P, str | bytes]] | None = None, @@ -60,7 +58,7 @@ class _TaskFunction(Generic[P, T]): # handle class methods # NOTE: we're modifying the instance method to avoid modifying # the original class method in case it's shared across multiple tasks - instance_method = functools.partial(func.__func__, func.__self__) # type: ignore [attr-defined] + instance_method = functools.partial(func.__func__, func.__self__) # type: ignore [union-attr] instance_method.__name__ = name # type: ignore [attr-defined] func = instance_method else: @@ -95,6 +93,7 @@ class _TaskFunction(Generic[P, T]): @overload def task( + __func_or_none__: None = None, *, name: str | None = None, retry_policy: RetryPolicy | Sequence[RetryPolicy] | None = None, @@ -107,9 +106,11 @@ def task( @overload -def task( - __func_or_none__: Callable[P, Awaitable[T]] | Callable[P, T], -) -> _TaskFunction[P, T]: ... +def task(__func_or_none__: Callable[P, Awaitable[T]]) -> _TaskFunction[P, T]: ... + + +@overload +def task(__func_or_none__: Callable[P, T]) -> _TaskFunction[P, T]: ... def task( @@ -200,7 +201,7 @@ def task( def decorator( func: Callable[P, Awaitable[T]] | Callable[P, T], - ) -> Callable[P, concurrent.futures.Future[T]] | Callable[P, asyncio.Future[T]]: + ) -> Callable[P, SyncAsyncFuture[T]]: return _TaskFunction( func, retry_policy=retry_policies, cache_policy=cache_policy, name=name ) diff --git a/libs/langgraph/langgraph/pregel/_call.py b/libs/langgraph/langgraph/pregel/_call.py index 5956160aa..ba723e512 100644 --- a/libs/langgraph/langgraph/pregel/_call.py +++ b/libs/langgraph/langgraph/pregel/_call.py @@ -7,7 +7,7 @@ import functools import inspect import sys import types -from collections.abc import Generator, Sequence +from collections.abc import Awaitable, Generator, Sequence from typing import Any, Callable, Generic, TypeVar, cast from langchain_core.runnables import Runnable @@ -251,7 +251,7 @@ class SyncAsyncFuture(Generic[T], concurrent.futures.Future[T]): def call( - func: Callable[P, T], + func: Callable[P, Awaitable[T]] | Callable[P, T], *args: Any, retry_policy: Sequence[RetryPolicy] | None = None, cache_policy: CachePolicy | None = None, From bdef6b3f5d700d5cf8bbf0ffab06fa25f4792e61 Mon Sep 17 00:00:00 2001 From: Caspar Broekhuizen Date: Wed, 10 Sep 2025 08:28:33 -0700 Subject: [PATCH 58/58] fix(langgraph): get_graph generates unexpected conditional edge (#6122) ### Description * Fix `get_graph()` generating an unexpected conditional edge to `__end__` when the last step has a single (non-terminal) source and the graph is cyclic. ### Issue * There was a fallback path that was triggered in `draw_graph()` when, for a Pregel instance; no termini exist and there is only a single step source (the last one). In this case an edge was added: (last source) -> `__end__`, even when another node already had a valid edge: (node) -> `__end__`. See this example:
code ```python from langgraph.graph import END, START, StateGraph from pydantic import BaseModel class State(TypedDict): messages: list[str] def chatbot_node(state: State) -> State: return {"messages": state["messages"] + ["chatbot"]} def tools_node(state: State) -> State: return {"messages": state["messages"] + ["tools"]} def human_node(state: State) -> State: return {"messages": state["messages"] + ["human"]} def tools_condition(_: State) -> str: return "tools" def end_condition(_: State) -> str: return "chatbot" workflow = StateGraph(State) workflow.add_node("chatbot", chatbot_node) workflow.add_node("tools", tools_node) workflow.add_node("human", human_node) workflow.add_edge(START, "human") workflow.add_edge("tools", "chatbot") # graph_builder.add_edge("chatbot", "human") !!! workflow.add_conditional_edges( "chatbot", tools_condition, {"tools": "tools", "human": "human"} ) workflow.add_conditional_edges( "human", end_condition, {"chatbot": "chatbot", END: END} ) app = workflow.compile() mermaid = app.get_graph().draw_mermaid() ```
The code above, as-is, generates the graph on the left. There is an unexpected conditional edge: chatbot -> `__end__`. If you uncomment the commented line and introduce a static edge: chatbot -> human, `get_graph()` returns the correct representation: 1 Without `graph_builder.add_edge("chatbot", "human")` | 2 With `graph_builder.add_edge("chatbot", "human")` :-------------------------:|:-------------------------: ![](https://github.com/user-attachments/assets/aa3149c2-ceee-4c0c-9c0c-e999caf042f0) | ![](https://github.com/user-attachments/assets/ea53287f-1d68-47d6-8b36-9ec7ca1d52fa) * In case 1), the graph is cyclic so termini is empty, and the last `step_sources` set during the static walk contains only the chatbot node, so an edge is added: chatbot -> `__end__`. * In case 2), the graph is cyclic so termini is empty, and the last `step_sources` set during the static walk contains only the human node, so an edge is added: human -> `__end__`, but `add_edge()` dedups (the edge already exists) so the graph appears correct. ### Solution * Check that no valid edges: (node) -> `__end__` exist before triggering the fallback path and creating an edge. Before | After :-------------------------:|:-------------------------: ![](https://github.com/user-attachments/assets/aa3149c2-ceee-4c0c-9c0c-e999caf042f0) | ![](https://github.com/user-attachments/assets/9de4ab4f-6503-4894-bfda-37aba1d1be05) After: The graph is cyclic so termini is empty, and the last `step_sources` contains the chatbot node, but an edge already exists: human -> `__end__`, so no more edges are added. ### Tests * `test_get_graph_nonterminal_last_step_source()` which asserts no unexpected edge to `__end__` is produced from the last nonterminal step source. ### Issue Closes #4394 --------- Co-authored-by: Sydney Runkle Co-authored-by: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> --- libs/langgraph/langgraph/pregel/_draw.py | 3 +- .../tests/__snapshots__/test_pregel.ambr | 93 +++++++++++++++++++ libs/langgraph/tests/test_pregel.py | 40 ++++++++ 3 files changed, 135 insertions(+), 1 deletion(-) diff --git a/libs/langgraph/langgraph/pregel/_draw.py b/libs/langgraph/langgraph/pregel/_draw.py index b8ae73389..af6d03427 100644 --- a/libs/langgraph/langgraph/pregel/_draw.py +++ b/libs/langgraph/langgraph/pregel/_draw.py @@ -215,10 +215,11 @@ def draw_graph( termini = {d for _, d, _, _ in edges if d != END}.difference( s for s, _, _, _ in edges ) + end_edge_exists = any(d == END for _, d, _, _ in edges) if termini: for src in sorted(termini): add_edge(graph, src, END) - elif len(step_sources) == 1: + elif len(step_sources) == 1 and not end_edge_exists: for src in sorted(step_sources): add_edge(graph, src, END, conditional=True) # replace subgraphs diff --git a/libs/langgraph/tests/__snapshots__/test_pregel.ambr b/libs/langgraph/tests/__snapshots__/test_pregel.ambr index 5167d8924..b7dfbcd0e 100644 --- a/libs/langgraph/tests/__snapshots__/test_pregel.ambr +++ b/libs/langgraph/tests/__snapshots__/test_pregel.ambr @@ -795,6 +795,99 @@ ''' # --- +# name: test_get_graph_nonterminal_last_step_source + ''' + { + "edges": [ + { + "source": "__start__", + "target": "human" + }, + { + "conditional": true, + "source": "chatbot", + "target": "human" + }, + { + "conditional": true, + "source": "chatbot", + "target": "tools" + }, + { + "conditional": true, + "source": "human", + "target": "__end__" + }, + { + "conditional": true, + "source": "human", + "target": "chatbot" + }, + { + "source": "tools", + "target": "chatbot" + } + ], + "nodes": [ + { + "data": { + "id": [ + "langgraph", + "_internal", + "_runnable", + "RunnableCallable" + ], + "name": "__start__" + }, + "id": "__start__", + "type": "runnable" + }, + { + "data": { + "id": [ + "langgraph", + "_internal", + "_runnable", + "RunnableCallable" + ], + "name": "chatbot" + }, + "id": "chatbot", + "type": "runnable" + }, + { + "data": { + "id": [ + "langgraph", + "_internal", + "_runnable", + "RunnableCallable" + ], + "name": "tools" + }, + "id": "tools", + "type": "runnable" + }, + { + "data": { + "id": [ + "langgraph", + "_internal", + "_runnable", + "RunnableCallable" + ], + "name": "human" + }, + "id": "human", + "type": "runnable" + }, + { + "id": "__end__" + } + ] + } + ''' +# --- # name: test_repeat_condition ''' graph TD; diff --git a/libs/langgraph/tests/test_pregel.py b/libs/langgraph/tests/test_pregel.py index cbf6d03b6..7cc67bd35 100644 --- a/libs/langgraph/tests/test_pregel.py +++ b/libs/langgraph/tests/test_pregel.py @@ -8343,6 +8343,46 @@ def test_subgraph_streaming_sync() -> None: assert result["num_chunks"] == 9 +def test_get_graph_nonterminal_last_step_source(snapshot: SnapshotAssertion) -> None: + class State(TypedDict): + messages: list[str] + + def chatbot_node(state: State) -> State: + return {"messages": state["messages"] + ["chatbot"]} + + def tools_node(state: State) -> State: + return {"messages": state["messages"] + ["tools"]} + + def human_node(state: State) -> State: + return {"messages": state["messages"] + ["human"]} + + def tools_condition(_: State) -> str: + return "tools" + + def end_condition(_: State) -> str: + return "chatbot" + + workflow = StateGraph(State) + workflow.add_node("chatbot", chatbot_node) + workflow.add_node("tools", tools_node) + workflow.add_node("human", human_node) + + workflow.add_edge(START, "human") + workflow.add_edge("tools", "chatbot") + + workflow.add_conditional_edges( + "chatbot", tools_condition, {"tools": "tools", "human": "human"} + ) + workflow.add_conditional_edges( + "human", end_condition, {"chatbot": "chatbot", END: END} + ) + + app = workflow.compile() + graph = app.get_graph() + graph_json = graph.to_json() + + assert json.dumps(graph_json, indent=2, sort_keys=True) == snapshot + def test_null_resume_disallowed_with_multiple_interrupts( sync_checkpointer: BaseCheckpointSaver, ) -> None: