langgraph-api 0.7.96__tar.gz → 0.7.97__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/PKG-INFO +1 -1
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/benchmark_profiles.ts +5 -2
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/stream_write.ts +1 -1
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/healthcheck.py +2 -17
- langgraph_api-0.7.97/langgraph_api/__init__.py +1 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/cli.py +3 -1
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/config/__init__.py +23 -1
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/errors.py +10 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/feature_flags.py +2 -1
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/graph.py +2 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/server.py +4 -4
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/client.mts +17 -5
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/remote.py +23 -1
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/ui.py +1 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/metadata.py +1 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/metrics_datadog.py +1 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/http_logger.py +1 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/queue_entrypoint.py +28 -6
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/server.py +3 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/traceblock.py +1 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/tunneling/cloudflare.py +1 -0
- langgraph_api-0.7.97/langgraph_api/utils/network.py +49 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/scripts/create_license.py +1 -1
- langgraph_api-0.7.96/langgraph_api/__init__.py +0 -1
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/.gitignore +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/LICENSE +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/Makefile +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/README.md +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/.gitignore +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/Makefile +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/README.md +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/assistant.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/benchmarks.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/log-failure.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/meta_workload.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/thread.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/types.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/wait_write.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_dd_report.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_k6.js +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_runner.mjs +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_slack_report.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/capacity_urls.mjs +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/clean-cli.js +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/clean.js +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/continuous/README.md +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/continuous/pyproject.toml +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/continuous/runner.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/continuous/uv.lock +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/graphs.js +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/mixed_workload_k6.js +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/mixed_workload_runner.mjs +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/package.json +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/ramp.js +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/reporting/dd_reporting.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/reporting/slack_slowest_runs.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/reporting/slack_summary.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/run_local.sh +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/staircase.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/staircase_step_k6.js +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/tsconfig.json +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/update-revision.js +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/weather.js +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/constraints.txt +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/custom_store.sql +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/forbidden.txt +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/hatch_build.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph-cloud-debugging-20260210132856.zip +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/_checkpointer/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/_checkpointer/_adapter.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/_checkpointer/protocol.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/_factory_utils.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/a2a.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/assistants.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_constants.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_handlers.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_models.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_routes.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/mcp/_sanitizers.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/meta.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/openapi.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/profile.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/runs.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/store.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/threads.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/api/ui.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/asgi_transport.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/asyncio.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/custom.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/errors.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/langsmith/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/langsmith/backend.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/langsmith/client.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/middleware.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/noop.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/auth/studio_user.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/cache.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/command.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/config/_parse.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/config/schemas.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/cron_scheduler.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/aes_json.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/context.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/custom.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/middleware.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/encryption/shared.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/executor_entrypoint.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/client.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/assistants.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/cache.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/crons.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/runs.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/ops/threads.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/servicers/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/grpc/servicers/encryption.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/http.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/http_metrics.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/http_metrics_utils.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/.gitignore +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/.prettierrc +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/base.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/build.mts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/client.http.mts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/errors.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/global.d.ts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/package.json +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/schema.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/graph.mts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/load.hooks.mjs +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/preload.mjs +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/utils/files.mts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/utils/importMap.mts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/src/utils/serde.mts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/sse.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/traceblock.mts +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/tsconfig.json +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/js/yarn.lock +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/logging.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/ensure_store.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/private_network.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/middleware/request_id.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/models/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/models/run.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/otel_context.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/patch.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/route.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/schema.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/self_hosted_logs.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/self_hosted_metrics.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/serde.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/sse.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/state.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/store.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/stream.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/timing/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/timing/profiler.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/timing/timer.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/cache.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/config.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/errors.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/extract.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/future.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/headers.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/retriable_client.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/stream_codec.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/utils/uuids.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/validation.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/webhook.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_api/worker.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/checkpointer.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/_compat.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/channel.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/config.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/durability.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/exception.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/graph.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/interrupt.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/messages.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/orchestrator_response.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/runopts.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/stream_mode.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/struct.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/task.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/conversion/value.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_api_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_api_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_store_operation_entry_type_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/executor_api_pb2.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/executor_api_pb2.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/executor_api_pb2_grpc.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/proto/executor_api_pb2_grpc.pyi +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/sanitize.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_grpc_common/serde.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_license/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_license/validation.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/__init__.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/checkpoint.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/database.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/lifespan.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/metrics.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/ops.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/queue.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/retry.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/routes.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/langgraph_runtime/store.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/logging.json +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/openapi.json +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/pyproject.toml +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/scripts/build_wheel.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/scripts/run_a2a_tck.py +0 -0
- {langgraph_api-0.7.96 → langgraph_api-0.7.97}/uv.lock +0 -0
{langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/benchmark_profiles.ts
RENAMED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { BenchmarkGraphOptions } from "./types";
|
|
2
|
+
|
|
1
3
|
export interface BenchmarkContext {
|
|
2
4
|
delay: number;
|
|
3
5
|
delay_jitter_ratio: number;
|
|
@@ -208,8 +210,9 @@ export function resolveBenchmarkContext(
|
|
|
208
210
|
* There are two possible counts for expected events: normal and burst.
|
|
209
211
|
* ratio * (expected_steps * expand) + 2 will be the min, but could be larger if we hit bursts.
|
|
210
212
|
*/
|
|
211
|
-
export function getExpectedEvents(
|
|
212
|
-
|
|
213
|
+
export function getExpectedEvents(benchmarkGraphOptions: BenchmarkGraphOptions): number {
|
|
214
|
+
const messages_per_step = benchmarkGraphOptions.resumable ? 3 + benchmarkGraphOptions.context.stream_size / benchmarkGraphOptions.context.chunk_size : 1;
|
|
215
|
+
return messages_per_step * (benchmarkGraphOptions.context.steps * benchmarkGraphOptions.context.expand) + 2;
|
|
213
216
|
}
|
|
214
217
|
|
|
215
218
|
function parseOptionalInt(value?: string): number | undefined {
|
|
@@ -52,7 +52,7 @@ export class StreamWrite extends BenchmarkRunner {
|
|
|
52
52
|
benchmarkGraphOptions: BenchmarkGraphOptions
|
|
53
53
|
): boolean {
|
|
54
54
|
const expected_steps = benchmarkGraphOptions.context.steps;
|
|
55
|
-
const expected_events = getExpectedEvents(benchmarkGraphOptions
|
|
55
|
+
const expected_events = getExpectedEvents(benchmarkGraphOptions);
|
|
56
56
|
const events = result.data?.events ?? [];
|
|
57
57
|
const hasExpectedCounter = events.some((event) => {
|
|
58
58
|
if (!event?.data || typeof event.data !== 'object') return false;
|
|
@@ -1,29 +1,14 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import os
|
|
3
3
|
import urllib.request
|
|
4
|
-
from ipaddress import IPv6Address, ip_address
|
|
5
4
|
|
|
6
5
|
from langgraph_api import config
|
|
6
|
+
from langgraph_api.utils.network import get_healthcheck_url_host
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
def get_healthcheck_host() -> str:
|
|
10
10
|
server_host = os.environ.get("LANGGRAPH_SERVER_HOST", "0.0.0.0")
|
|
11
|
-
|
|
12
|
-
"0.0.0.0", # IPv4 wildcard
|
|
13
|
-
"", # IPv4/IPv6 dual-stack
|
|
14
|
-
):
|
|
15
|
-
return "localhost"
|
|
16
|
-
|
|
17
|
-
try:
|
|
18
|
-
server_host_ip = ip_address(server_host)
|
|
19
|
-
except ValueError:
|
|
20
|
-
return server_host
|
|
21
|
-
|
|
22
|
-
return (
|
|
23
|
-
f"[{server_host_ip.compressed}]"
|
|
24
|
-
if isinstance(server_host_ip, IPv6Address)
|
|
25
|
-
else server_host_ip.compressed
|
|
26
|
-
)
|
|
11
|
+
return get_healthcheck_url_host(server_host)
|
|
27
12
|
|
|
28
13
|
|
|
29
14
|
def healthcheck():
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.7.97"
|
|
@@ -21,6 +21,7 @@ if typing.TYPE_CHECKING:
|
|
|
21
21
|
from packaging.version import Version
|
|
22
22
|
|
|
23
23
|
from langgraph_api.config import AuthConfig, HttpConfig, StoreConfig
|
|
24
|
+
from langgraph_api.utils.network import format_hostport
|
|
24
25
|
|
|
25
26
|
logging.basicConfig(level=logging.INFO)
|
|
26
27
|
logger = logging.getLogger(__name__)
|
|
@@ -210,7 +211,7 @@ def run_server(
|
|
|
210
211
|
logger.info("Debugger attached. Starting server...")
|
|
211
212
|
|
|
212
213
|
# Determine local or tunneled URL
|
|
213
|
-
upstream_url = f"http://{host
|
|
214
|
+
upstream_url = f"http://{format_hostport(host, port)}"
|
|
214
215
|
if mount_prefix:
|
|
215
216
|
upstream_url += mount_prefix
|
|
216
217
|
if tunnel:
|
|
@@ -330,6 +331,7 @@ For production use, please use LangSmith Deployment.
|
|
|
330
331
|
logger.info(welcome)
|
|
331
332
|
if open_browser:
|
|
332
333
|
threading.Thread(target=_open_browser, daemon=True).start()
|
|
334
|
+
# Not in public docs: LANGGRAPH_NO_VERSION_CHECK is dev-only
|
|
333
335
|
nvc = os.getenv("LANGGRAPH_NO_VERSION_CHECK")
|
|
334
336
|
if nvc is None or nvc.lower() not in ("true", "1"):
|
|
335
337
|
from langgraph_api import __version__ # noqa: PLC0415
|
|
@@ -40,7 +40,9 @@ STATS_INTERVAL_SECS = env("STATS_INTERVAL_SECS", cast=int, default=60)
|
|
|
40
40
|
|
|
41
41
|
# storage
|
|
42
42
|
|
|
43
|
+
# Not in public docs: infrastructure, set by platform
|
|
43
44
|
DATABASE_URI = env("DATABASE_URI", cast=str, default=getenv("POSTGRES_URI", undefined))
|
|
45
|
+
# Not in public docs: infrastructure, set by platform
|
|
44
46
|
MIGRATIONS_PATH = env("MIGRATIONS_PATH", cast=str, default="/storage/migrations")
|
|
45
47
|
POSTGRES_POOL_MAX_SIZE = env("LANGGRAPH_POSTGRES_POOL_MAX_SIZE", cast=int, default=150)
|
|
46
48
|
RESUMABLE_STREAM_TTL_SECONDS = env(
|
|
@@ -122,6 +124,7 @@ LANGGRAPH_AES_JSON_KEYS: frozenset[str] | None = env(
|
|
|
122
124
|
)
|
|
123
125
|
|
|
124
126
|
# redis
|
|
127
|
+
# Not in public docs: infrastructure, set by platform
|
|
125
128
|
REDIS_URI = env("REDIS_URI", cast=str)
|
|
126
129
|
REDIS_CLUSTER = env("REDIS_CLUSTER", cast=bool, default=False)
|
|
127
130
|
REDIS_MAX_CONNECTIONS = env("REDIS_MAX_CONNECTIONS", cast=int, default=2000)
|
|
@@ -148,16 +151,20 @@ HTTP_MAX_REQUEST_BODY_BYTES = env(
|
|
|
148
151
|
)
|
|
149
152
|
|
|
150
153
|
# gRPC message size limits (300MB default)
|
|
154
|
+
# Not in public docs: infrastructure, set by platform
|
|
151
155
|
LSD_GRPC_SERVER_MAX_RECV_MSG_BYTES = env(
|
|
152
156
|
"LSD_GRPC_SERVER_MAX_RECV_MSG_BYTES", cast=int, default=300 * 1024 * 1024
|
|
153
157
|
)
|
|
158
|
+
# Not in public docs: infrastructure, set by platform
|
|
154
159
|
LSD_GRPC_SERVER_MAX_SEND_MSG_BYTES = env(
|
|
155
160
|
"LSD_GRPC_SERVER_MAX_SEND_MSG_BYTES", cast=int, default=300 * 1024 * 1024
|
|
156
161
|
)
|
|
157
162
|
LSD_PUBLISH_QUEUE_SIZE = env("LSD_PUBLISH_QUEUE_SIZE", cast=int, default=512)
|
|
163
|
+
# Not in public docs: infrastructure, set by platform
|
|
158
164
|
GRPC_CLIENT_MAX_RECV_MSG_BYTES = env(
|
|
159
165
|
"GRPC_CLIENT_MAX_RECV_MSG_BYTES", cast=int, default=300 * 1024 * 1024
|
|
160
166
|
)
|
|
167
|
+
# Not in public docs: infrastructure, set by platform
|
|
161
168
|
GRPC_CLIENT_MAX_SEND_MSG_BYTES = env(
|
|
162
169
|
"GRPC_CLIENT_MAX_SEND_MSG_BYTES", cast=int, default=300 * 1024 * 1024
|
|
163
170
|
)
|
|
@@ -167,7 +174,7 @@ GRPC_CLIENT_HTTP2_INITIAL_WINDOW_SIZE = env(
|
|
|
167
174
|
LSD_GRPC_SERVER_ADDRESS = env(
|
|
168
175
|
"LSD_GRPC_SERVER_ADDRESS",
|
|
169
176
|
cast=str,
|
|
170
|
-
default="
|
|
177
|
+
default="localhost:50051",
|
|
171
178
|
)
|
|
172
179
|
|
|
173
180
|
# Python gRPC server settings (for encryption/checkpointer services called by Go)
|
|
@@ -180,10 +187,12 @@ PYTHON_GRPC_BIND_HOST = env("PYTHON_GRPC_BIND_HOST", cast=str, default="127.0.0.
|
|
|
180
187
|
# (Otherwise, the payload is parsed directly in the event loop.)
|
|
181
188
|
JSON_THREAD_POOL_MINIMUM_SIZE_BYTES = 100 * 1024 # 100 KB
|
|
182
189
|
|
|
190
|
+
# Not in public docs: populated by langgraph.json config, not set as env var directly
|
|
183
191
|
HTTP_CONFIG = env("LANGGRAPH_HTTP", cast=_parse.parse_schema(HttpConfig), default=None)
|
|
184
192
|
MCP_ENABLED = HTTP_CONFIG is None or not HTTP_CONFIG.get("disable_mcp")
|
|
185
193
|
A2A_ENABLED = HTTP_CONFIG is None or not HTTP_CONFIG.get("disable_a2a")
|
|
186
194
|
WEBHOOKS_ENABLED = HTTP_CONFIG and HTTP_CONFIG.get("disable_webhooks")
|
|
195
|
+
# Not in public docs: populated by langgraph.json config, not set as env var directly
|
|
187
196
|
STORE_CONFIG = env(
|
|
188
197
|
"LANGGRAPH_STORE", cast=_parse.parse_schema(StoreConfig), default=None
|
|
189
198
|
)
|
|
@@ -284,6 +293,7 @@ MAX_STREAM_CHUNK_SIZE_BYTES = env(
|
|
|
284
293
|
)
|
|
285
294
|
|
|
286
295
|
|
|
296
|
+
# Not in public docs: populated by langgraph.json config, not set as env var directly
|
|
287
297
|
CHECKPOINTER_CONFIG: CheckpointerConfig | None = _parse.parse_checkpointer(
|
|
288
298
|
env("LANGGRAPH_CHECKPOINTER", cast=str, default=None)
|
|
289
299
|
)
|
|
@@ -340,6 +350,7 @@ FF_ASYNC_PUBLISH_QUEUE = env("FF_ASYNC_PUBLISH_QUEUE", cast=bool, default=False)
|
|
|
340
350
|
FF_CRONS_ENABLED = env("FF_CRONS_ENABLED", cast=bool, default=True)
|
|
341
351
|
FF_LOG_DROPPED_EVENTS = env("FF_LOG_DROPPED_EVENTS", cast=bool, default=False)
|
|
342
352
|
FF_LOG_QUERY_AND_PARAMS = env("FF_LOG_QUERY_AND_PARAMS", cast=bool, default=False)
|
|
353
|
+
# Not in public docs: internal feature flag
|
|
343
354
|
FF_USE_REDIS_QUEUE = env("FF_USE_REDIS_QUEUE", cast=bool, default=False)
|
|
344
355
|
|
|
345
356
|
# Internal flag intended for testing only
|
|
@@ -349,6 +360,7 @@ CRON_SCHEDULER_SLEEP_TIME = env("CRON_SCHEDULER_SLEEP_TIME", cast=int, default=5
|
|
|
349
360
|
# auth
|
|
350
361
|
|
|
351
362
|
LANGGRAPH_AUTH_TYPE = env("LANGGRAPH_AUTH_TYPE", cast=str, default="noop")
|
|
363
|
+
# Not in public docs: populated by langgraph.json config, not set as env var directly
|
|
352
364
|
LANGGRAPH_POSTGRES_EXTENSIONS: Literal["standard", "lite"] = env(
|
|
353
365
|
"LANGGRAPH_POSTGRES_EXTENSIONS", cast=str, default="standard"
|
|
354
366
|
)
|
|
@@ -356,12 +368,15 @@ if LANGGRAPH_POSTGRES_EXTENSIONS not in ("standard", "lite"):
|
|
|
356
368
|
raise ValueError(
|
|
357
369
|
f"Unknown LANGGRAPH_POSTGRES_EXTENSIONS value: {LANGGRAPH_POSTGRES_EXTENSIONS}"
|
|
358
370
|
)
|
|
371
|
+
# Not in public docs: populated by langgraph.json config, not set as env var directly
|
|
359
372
|
LANGGRAPH_AUTH = env(
|
|
360
373
|
"LANGGRAPH_AUTH", cast=_parse.parse_schema(AuthConfig), default=None
|
|
361
374
|
)
|
|
375
|
+
# Not in public docs: populated by langgraph.json config, not set as env var directly
|
|
362
376
|
LANGGRAPH_ENCRYPTION = env(
|
|
363
377
|
"LANGGRAPH_ENCRYPTION", cast=_parse.parse_schema(EncryptionConfig), default=None
|
|
364
378
|
)
|
|
379
|
+
# Not in public docs: set by SaaS control plane, not user-configurable
|
|
365
380
|
LANGSMITH_TENANT_ID = env("LANGSMITH_TENANT_ID", cast=str, default=None)
|
|
366
381
|
LANGSMITH_AUTH_VERIFY_TENANT_ID = env(
|
|
367
382
|
"LANGSMITH_AUTH_VERIFY_TENANT_ID",
|
|
@@ -412,6 +427,7 @@ LANGSMITH_LICENSE_REQUIRED_CLAIMS = env(
|
|
|
412
427
|
"LANGSMITH_LICENSE_REQUIRED_CLAIMS", cast=CommaSeparatedStrings, default=[]
|
|
413
428
|
)
|
|
414
429
|
|
|
430
|
+
# Not in public docs: LANGCHAIN_API_KEY is a legacy alias (prefer LANGSMITH_API_KEY)
|
|
415
431
|
LANGSMITH_API_KEY = env(
|
|
416
432
|
"LANGSMITH_API_KEY", cast=str, default=getenv("LANGCHAIN_API_KEY", "")
|
|
417
433
|
)
|
|
@@ -464,6 +480,7 @@ if OTEL_ENABLED is None:
|
|
|
464
480
|
|
|
465
481
|
# if variant is "licensed", update to "local" if using LANGSMITH_CONTROL_PLANE_API_KEY instead
|
|
466
482
|
|
|
483
|
+
# Not in public docs: LANGSMITH_LANGGRAPH_API_VARIANT is set by SaaS control plane
|
|
467
484
|
if (
|
|
468
485
|
getenv("LANGSMITH_LANGGRAPH_API_VARIANT") == "licensed"
|
|
469
486
|
and LANGSMITH_CONTROL_PLANE_API_KEY
|
|
@@ -492,16 +509,20 @@ LANGGRAPH_METRICS_ENDPOINT = env("LANGGRAPH_METRICS_ENDPOINT", cast=str, default
|
|
|
492
509
|
LANGGRAPH_METRICS_EXPORT_INTERVAL_MS = env(
|
|
493
510
|
"LANGGRAPH_METRICS_EXPORT_INTERVAL_MS", cast=int, default=60000
|
|
494
511
|
)
|
|
512
|
+
# Not in public docs: infrastructure, set by platform
|
|
495
513
|
LSD_DD_API_KEY = _first_non_empty(
|
|
496
514
|
env("LSD_DD_API_KEY", cast=str, default=None),
|
|
497
515
|
env("CUSTOM_LSD_DD_API_KEY", cast=str, default=None),
|
|
498
516
|
)
|
|
517
|
+
# Not in public docs: infrastructure, set by platform
|
|
499
518
|
LSD_DD_ENDPOINT = _first_non_empty(
|
|
500
519
|
env("LSD_DD_ENDPOINT", cast=str, default=None),
|
|
501
520
|
env("CUSTOM_LSD_DD_ENDPOINT", cast=str, default=None),
|
|
502
521
|
"otlp.us5.datadoghq.com",
|
|
503
522
|
)
|
|
523
|
+
# Not in public docs: infrastructure, set by platform
|
|
504
524
|
METRIC_PREFIX = env("METRIC_PREFIX", cast=str, default="lg_api_")
|
|
525
|
+
# Not in public docs: infrastructure, set by platform
|
|
505
526
|
METRIC_MAX_EMITTING_TIER = env("METRIC_MAX_EMITTING_TIER", cast=int, default=2)
|
|
506
527
|
DATADOG_METRICS_ENABLED = bool(LSD_DD_API_KEY)
|
|
507
528
|
LANGGRAPH_LOGS_ENDPOINT = env("LANGGRAPH_LOGS_ENDPOINT", cast=str, default=None)
|
|
@@ -530,6 +551,7 @@ IS_EXECUTOR_ENTRYPOINT = False
|
|
|
530
551
|
PYTHON_GRPC_SERVER_ENABLED = bool(LANGGRAPH_ENCRYPTION or USE_CUSTOM_CHECKPOINTER)
|
|
531
552
|
|
|
532
553
|
|
|
554
|
+
# Not in public docs: LANGSMITH_LANGGRAPH_GIT_REF_SHA is set by SaaS control plane
|
|
533
555
|
ref_sha = None
|
|
534
556
|
if not os.getenv("LANGCHAIN_REVISION_ID") and (
|
|
535
557
|
ref_sha := os.getenv("LANGSMITH_LANGGRAPH_GIT_REF_SHA")
|
|
@@ -4,6 +4,8 @@ from starlette.exceptions import HTTPException
|
|
|
4
4
|
from starlette.requests import Request
|
|
5
5
|
from starlette.responses import JSONResponse, Response
|
|
6
6
|
|
|
7
|
+
from langgraph_api.js.errors import RemoteException
|
|
8
|
+
|
|
7
9
|
logger = structlog.stdlib.get_logger(__name__)
|
|
8
10
|
|
|
9
11
|
|
|
@@ -34,6 +36,7 @@ async def http_exception_handler(request: Request, exc: HTTPException) -> Respon
|
|
|
34
36
|
|
|
35
37
|
|
|
36
38
|
async def validation_error_handler(request, exc: jsonschema_rs.ValidationError):
|
|
39
|
+
request.scope["error_detail"] = str(exc)
|
|
37
40
|
return await http_exception_handler(
|
|
38
41
|
request, HTTPException(status_code=422, detail=str(exc))
|
|
39
42
|
)
|
|
@@ -46,6 +49,13 @@ async def value_error_handler(request, exc: ValueError):
|
|
|
46
49
|
)
|
|
47
50
|
|
|
48
51
|
|
|
52
|
+
async def remote_exception_handler(request, exc: RemoteException):
|
|
53
|
+
logger.exception("Remote Exception", exc_info=exc)
|
|
54
|
+
return await http_exception_handler(
|
|
55
|
+
request, HTTPException(status_code=500, detail=str(exc))
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
49
59
|
async def overloaded_error_handler(request, exc: ValueError):
|
|
50
60
|
logger.exception("Overloaded Error", exc_info=exc)
|
|
51
61
|
return await http_exception_handler(
|
|
@@ -12,10 +12,11 @@ USE_DURABILITY = LANGGRAPH_PY_MINOR >= (0, 6)
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
# Runtime edition detection
|
|
15
|
+
# Not in public docs: LANGGRAPH_RUNTIME_EDITION is internal, set by packaging/entrypoint
|
|
15
16
|
_RUNTIME_EDITION = os.getenv("LANGGRAPH_RUNTIME_EDITION", "inmem")
|
|
16
17
|
IS_POSTGRES_BACKEND = _RUNTIME_EDITION == "postgres"
|
|
17
18
|
IS_POSTGRES_OR_GRPC_BACKEND = IS_POSTGRES_BACKEND
|
|
18
|
-
#
|
|
19
|
+
# Not in public docs: internal feature flag
|
|
19
20
|
FF_USE_JS_API = os.getenv("FF_USE_JS_API", "false").lower() in (
|
|
20
21
|
"true",
|
|
21
22
|
"1",
|
|
@@ -436,6 +436,7 @@ js_bg_tasks: set[asyncio.Task] = set()
|
|
|
436
436
|
|
|
437
437
|
def _load_graph_config_from_env() -> dict | None:
|
|
438
438
|
"""Return graph config from env."""
|
|
439
|
+
# Not in public docs: LANGGRAPH_CONFIG is internal, set by CLI from langgraph.json
|
|
439
440
|
config_str = os.getenv("LANGGRAPH_CONFIG")
|
|
440
441
|
if not config_str:
|
|
441
442
|
return None
|
|
@@ -459,6 +460,7 @@ def _load_graph_config_from_env() -> dict | None:
|
|
|
459
460
|
async def collect_graphs_from_env(register: bool = False) -> None:
|
|
460
461
|
"""Return graphs from env."""
|
|
461
462
|
|
|
463
|
+
# Not in public docs: LANGSERVE_GRAPHS is internal, set by CLI from langgraph.json "graphs" field
|
|
462
464
|
paths_str = os.getenv("LANGSERVE_GRAPHS")
|
|
463
465
|
config_per_graph = _load_graph_config_from_env() or {}
|
|
464
466
|
|
|
@@ -24,6 +24,7 @@ from langgraph_grpc_common.proto.encryption_pb2_grpc import (
|
|
|
24
24
|
from langgraph_api import config
|
|
25
25
|
from langgraph_api.grpc.servicers.checkpointer import CheckpointerServicerImpl
|
|
26
26
|
from langgraph_api.grpc.servicers.encryption import EncryptionServicerImpl
|
|
27
|
+
from langgraph_api.utils.network import format_hostport, get_healthcheck_target_host
|
|
27
28
|
|
|
28
29
|
logger = structlog.stdlib.get_logger(__name__)
|
|
29
30
|
|
|
@@ -103,8 +104,7 @@ async def start_python_grpc_server(
|
|
|
103
104
|
add_EncryptionServicer_to_server(encryption_servicer, server)
|
|
104
105
|
await logger.ainfo("Registered Encryption service")
|
|
105
106
|
|
|
106
|
-
|
|
107
|
-
bind_address = f"{host}:{port}"
|
|
107
|
+
bind_address = format_hostport(host, port)
|
|
108
108
|
resolved_port = server.add_insecure_port(bind_address)
|
|
109
109
|
|
|
110
110
|
await server.start()
|
|
@@ -167,9 +167,9 @@ async def wait_until_python_grpc_ready(
|
|
|
167
167
|
Raises:
|
|
168
168
|
RuntimeError: If the server is not ready within the timeout period.
|
|
169
169
|
"""
|
|
170
|
-
host =
|
|
170
|
+
host = get_healthcheck_target_host(config.PYTHON_GRPC_BIND_HOST)
|
|
171
171
|
port = config.PYTHON_GRPC_SERVER_PORT
|
|
172
|
-
address =
|
|
172
|
+
address = format_hostport(host, port)
|
|
173
173
|
max_attempts = int(timeout_seconds / interval_seconds)
|
|
174
174
|
|
|
175
175
|
await logger.ainfo(
|
|
@@ -315,12 +315,24 @@ const handleInvoke = <T extends z.ZodType<any>>(
|
|
|
315
315
|
// as a heartbeat
|
|
316
316
|
let interval = setInterval(() => enqueueWrite(" "), HEARTBEAT_MS);
|
|
317
317
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
318
|
+
try {
|
|
319
|
+
const response = JSON.stringify(
|
|
320
|
+
await handler({ graph_id: graphId, ...body }),
|
|
321
|
+
);
|
|
321
322
|
|
|
322
|
-
|
|
323
|
-
|
|
323
|
+
clearInterval(interval);
|
|
324
|
+
await enqueueWrite(response);
|
|
325
|
+
} catch (error) {
|
|
326
|
+
// Log the error since the stack trace won't be carried over to Python
|
|
327
|
+
logger.error(error);
|
|
328
|
+
// Return an error object that the Python side can handle
|
|
329
|
+
const errorResponse = JSON.stringify({
|
|
330
|
+
__error__: true,
|
|
331
|
+
...serializeError(error),
|
|
332
|
+
});
|
|
333
|
+
clearInterval(interval);
|
|
334
|
+
await enqueueWrite(errorResponse);
|
|
335
|
+
}
|
|
324
336
|
});
|
|
325
337
|
};
|
|
326
338
|
};
|
|
@@ -117,7 +117,29 @@ async def _client_invoke(method: str, data: dict[str, Any]):
|
|
|
117
117
|
headers={"Content-Type": "application/json"},
|
|
118
118
|
data=orjson.dumps(data, default=default_command),
|
|
119
119
|
)
|
|
120
|
-
|
|
120
|
+
try:
|
|
121
|
+
result = res.json()
|
|
122
|
+
except json.JSONDecodeError as e:
|
|
123
|
+
# Get the raw response for debugging
|
|
124
|
+
raw = res.text.strip()
|
|
125
|
+
if not raw:
|
|
126
|
+
raise RemoteException(
|
|
127
|
+
"EmptyResponse",
|
|
128
|
+
"Graph returned empty response",
|
|
129
|
+
) from e
|
|
130
|
+
logger.exception(
|
|
131
|
+
"JS graph returned invalid JSON for method call %s: %s... (truncated)",
|
|
132
|
+
method,
|
|
133
|
+
raw[:50],
|
|
134
|
+
)
|
|
135
|
+
raise RemoteException(
|
|
136
|
+
"InvalidJSON",
|
|
137
|
+
"Graph returned invalid JSON",
|
|
138
|
+
) from e
|
|
139
|
+
# Check if the JS side returned an error
|
|
140
|
+
if isinstance(result, dict) and result.get("__error__"):
|
|
141
|
+
raise RemoteException(result.get("error", "Unknown"), result.get("message", ""))
|
|
142
|
+
return result
|
|
121
143
|
|
|
122
144
|
|
|
123
145
|
class RemotePregel(BaseRemotePregel):
|
|
@@ -28,6 +28,7 @@ UI_SCHEMAS_FILE = UI_ROOT_DIR / "schemas.json"
|
|
|
28
28
|
async def start_ui_bundler() -> None:
|
|
29
29
|
# LANGGRAPH_UI_ROOT_DIR is only set by in-memory server
|
|
30
30
|
# @see langgraph_api/cli.py
|
|
31
|
+
# Not in public docs: LANGGRAPH_UI is populated by langgraph.json config
|
|
31
32
|
if not UI_USE_BUNDLER or not os.getenv("LANGGRAPH_UI"):
|
|
32
33
|
return
|
|
33
34
|
|
|
@@ -29,6 +29,7 @@ from langgraph_license.validation import plus_features_enabled
|
|
|
29
29
|
logger = structlog.stdlib.get_logger(__name__)
|
|
30
30
|
|
|
31
31
|
INTERVAL = 300
|
|
32
|
+
# Not in public docs: set by SaaS control plane, not user-configurable
|
|
32
33
|
REVISION = os.getenv("LANGSMITH_LANGGRAPH_API_REVISION")
|
|
33
34
|
VARIANT = os.getenv("LANGSMITH_LANGGRAPH_API_VARIANT")
|
|
34
35
|
PROJECT_ID = os.getenv("LANGSMITH_HOST_PROJECT_ID")
|
|
@@ -228,6 +228,7 @@ class DatadogMetricsReporter:
|
|
|
228
228
|
{
|
|
229
229
|
"service.name": SERVICE_NAME,
|
|
230
230
|
"host.id": os.getenv("HOSTNAME", ""),
|
|
231
|
+
# Not in public docs: these LANGSMITH_* vars are set by SaaS control plane
|
|
231
232
|
"api_version": os.getenv("LANGSMITH_LANGGRAPH_API_VERSION")
|
|
232
233
|
or __version__,
|
|
233
234
|
"project_id": os.getenv("LANGSMITH_HOST_PROJECT_ID", ""),
|
|
@@ -117,6 +117,7 @@ class AccessLoggerMiddleware:
|
|
|
117
117
|
route=str(route),
|
|
118
118
|
path_params=scope.get("path_params"),
|
|
119
119
|
query_string=qs.decode() if qs else "",
|
|
120
|
+
error_detail=scope.get("error_detail"),
|
|
120
121
|
proto=scope.get("http_version"),
|
|
121
122
|
req_header=_headers_to_dict(scope.get("headers")),
|
|
122
123
|
res_header=_headers_to_dict(info["response"].get("headers")),
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from contextlib import suppress
|
|
3
2
|
|
|
4
3
|
if not (
|
|
5
4
|
(disable_truststore := os.getenv("DISABLE_TRUSTSTORE"))
|
|
@@ -16,11 +15,13 @@ import logging.config
|
|
|
16
15
|
import pathlib
|
|
17
16
|
import signal
|
|
18
17
|
import socket
|
|
18
|
+
from contextlib import suppress
|
|
19
19
|
|
|
20
20
|
import structlog
|
|
21
21
|
|
|
22
22
|
from langgraph_api.api.meta import meta_pool_stats
|
|
23
23
|
from langgraph_api.utils.errors import GraphLoadError, HealthServerStartupError
|
|
24
|
+
from langgraph_api.utils.network import format_hostport, normalize_host
|
|
24
25
|
from langgraph_runtime import lifespan
|
|
25
26
|
from langgraph_runtime.database import healthcheck
|
|
26
27
|
from langgraph_runtime.metrics import get_metrics
|
|
@@ -32,13 +33,31 @@ shutdown_reason: str | None = None
|
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
def _ensure_port_available(host: str, port: int) -> None:
|
|
36
|
+
host = normalize_host(host)
|
|
37
|
+
last_error: OSError | None = None
|
|
35
38
|
try:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
addrinfos = socket.getaddrinfo(
|
|
40
|
+
host,
|
|
41
|
+
port,
|
|
42
|
+
type=socket.SOCK_STREAM,
|
|
43
|
+
flags=socket.AI_PASSIVE,
|
|
44
|
+
)
|
|
39
45
|
except OSError as exc:
|
|
40
46
|
raise HealthServerStartupError(host, port, exc) from exc
|
|
41
47
|
|
|
48
|
+
for family, socktype, proto, _, sockaddr in addrinfos:
|
|
49
|
+
try:
|
|
50
|
+
with socket.socket(family, socktype, proto) as sock:
|
|
51
|
+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
52
|
+
sock.bind(sockaddr)
|
|
53
|
+
return
|
|
54
|
+
except OSError as exc:
|
|
55
|
+
last_error = exc
|
|
56
|
+
|
|
57
|
+
if last_error is None:
|
|
58
|
+
last_error = OSError(f"Could not resolve bind address for host {host!r}")
|
|
59
|
+
raise HealthServerStartupError(host, port, last_error)
|
|
60
|
+
|
|
42
61
|
|
|
43
62
|
async def health_and_metrics_server():
|
|
44
63
|
import uvicorn # noqa: PLC0415
|
|
@@ -51,7 +70,8 @@ async def health_and_metrics_server():
|
|
|
51
70
|
from langgraph_api.api.meta import METRICS_FORMATS # noqa: PLC0415
|
|
52
71
|
|
|
53
72
|
port = int(os.getenv("PORT", "8080"))
|
|
54
|
-
|
|
73
|
+
# Not in public docs: LANGGRAPH_SERVER_HOST is internal
|
|
74
|
+
host = normalize_host(os.getenv("LANGGRAPH_SERVER_HOST", "0.0.0.0"))
|
|
55
75
|
|
|
56
76
|
async def health_endpoint(request: Request):
|
|
57
77
|
check_db = int(request.query_params.get("check_db", "1"))
|
|
@@ -137,7 +157,9 @@ async def health_and_metrics_server():
|
|
|
137
157
|
# Server will run indefinitely until the process is terminated
|
|
138
158
|
server = uvicorn.Server(config)
|
|
139
159
|
|
|
140
|
-
logger.info(
|
|
160
|
+
logger.info(
|
|
161
|
+
f"Health and metrics server started at http://{format_hostport(host, port)}"
|
|
162
|
+
)
|
|
141
163
|
try:
|
|
142
164
|
# Use the internal serve to skip capturing signals, otherwise there's a race condition
|
|
143
165
|
# where uvicorn captures the signal and will exit early before the queue can gracefully shutdown
|
|
@@ -40,10 +40,12 @@ from langgraph_api.api.openapi import set_custom_spec
|
|
|
40
40
|
from langgraph_api.errors import (
|
|
41
41
|
http_exception_handler,
|
|
42
42
|
overloaded_error_handler,
|
|
43
|
+
remote_exception_handler,
|
|
43
44
|
validation_error_handler,
|
|
44
45
|
value_error_handler,
|
|
45
46
|
)
|
|
46
47
|
from langgraph_api.js.base import is_js_path
|
|
48
|
+
from langgraph_api.js.errors import RemoteException
|
|
47
49
|
from langgraph_api.middleware.ensure_store import EnsureStoreAccessible
|
|
48
50
|
from langgraph_api.middleware.http_logger import AccessLoggerMiddleware
|
|
49
51
|
from langgraph_api.middleware.private_network import PrivateNetworkMiddleware
|
|
@@ -102,6 +104,7 @@ exception_handlers = {
|
|
|
102
104
|
InvalidUpdateError: value_error_handler,
|
|
103
105
|
EmptyInputError: value_error_handler,
|
|
104
106
|
jsonschema_rs.ValidationError: validation_error_handler,
|
|
107
|
+
RemoteException: remote_exception_handler,
|
|
105
108
|
} | {exc: overloaded_error_handler for exc in OVERLOADED_EXCEPTIONS}
|
|
106
109
|
|
|
107
110
|
|
|
@@ -15,6 +15,7 @@ from pathlib import Path
|
|
|
15
15
|
|
|
16
16
|
logger = logging.getLogger(__name__)
|
|
17
17
|
|
|
18
|
+
# Not in public docs: internal, controls cloudflared binary version for tunneling
|
|
18
19
|
CLOUDFLARED_VERSION = os.environ.get("LANGGRAPH_CLOUDFLARED_VERSION", "2025.2.1")
|
|
19
20
|
CACHE_DIR = (
|
|
20
21
|
Path(os.path.expanduser("~"))
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from ipaddress import IPv6Address, ip_address
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def normalize_host(host: str) -> str:
|
|
7
|
+
"""Normalize host literals from env/config.
|
|
8
|
+
|
|
9
|
+
Brackets are valid in URLs and host:port strings, but socket bind/connect APIs
|
|
10
|
+
expect the raw IPv6 literal.
|
|
11
|
+
"""
|
|
12
|
+
if host.startswith("[") and host.endswith("]"):
|
|
13
|
+
return host[1:-1]
|
|
14
|
+
return host
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def format_hostport(host: str, port: int) -> str:
|
|
18
|
+
host = normalize_host(host)
|
|
19
|
+
if ":" in host:
|
|
20
|
+
return f"[{host}]:{port}"
|
|
21
|
+
return f"{host}:{port}"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_healthcheck_target_host(bind_host: str) -> str:
|
|
25
|
+
bind_host = normalize_host(bind_host)
|
|
26
|
+
if bind_host in {"", "0.0.0.0"}:
|
|
27
|
+
return "127.0.0.1"
|
|
28
|
+
if bind_host == "::":
|
|
29
|
+
return "::1"
|
|
30
|
+
return bind_host
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def get_healthcheck_url_host(host: str) -> str:
|
|
34
|
+
host = normalize_host(host)
|
|
35
|
+
if host in {"0.0.0.0", ""}:
|
|
36
|
+
return "localhost"
|
|
37
|
+
if host == "::":
|
|
38
|
+
return "[::1]"
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
host_ip = ip_address(host)
|
|
42
|
+
except ValueError:
|
|
43
|
+
return host
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
f"[{host_ip.compressed}]"
|
|
47
|
+
if isinstance(host_ip, IPv6Address)
|
|
48
|
+
else host_ip.compressed
|
|
49
|
+
)
|
|
@@ -30,7 +30,7 @@ parser.add_argument(
|
|
|
30
30
|
)
|
|
31
31
|
args = parser.parse_args()
|
|
32
32
|
|
|
33
|
-
#
|
|
33
|
+
# Not in public docs: LANGGRAPH_CLOUD_LICENSE_PRIVATE_KEY is internal (in 1password vault)
|
|
34
34
|
private_key_str = os.environ.get("LANGGRAPH_CLOUD_LICENSE_PRIVATE_KEY")
|
|
35
35
|
|
|
36
36
|
if private_key_str is None:
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.7.96"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/benchmark-runner.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/enqueued_runs_order.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langgraph_api-0.7.96 → langgraph_api-0.7.97}/benchmark/benchmark-runners/threads_search_metadata.ts
RENAMED
|
File without changes
|