langgraph-api 0.4.38__tar.gz → 0.4.40__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.

Potentially problematic release.


This version of langgraph-api might be problematic. Click here for more details.

Files changed (137) hide show
  1. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/Makefile +1 -1
  2. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/PKG-INFO +1 -1
  3. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/capacity_k6.js +4 -8
  4. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/capacity_runner.mjs +7 -2
  5. langgraph_api-0.4.40/benchmark/capacity_urls.mjs +18 -0
  6. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/reporting/dd_reporting.py +6 -4
  7. langgraph_api-0.4.40/langgraph_api/__init__.py +1 -0
  8. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/auth/langsmith/backend.py +3 -2
  9. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/auth/langsmith/client.py +13 -8
  10. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/cli.py +3 -3
  11. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/graph.py +1 -1
  12. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/client.http.mts +12 -6
  13. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/server.py +1 -1
  14. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/openapi.json +1 -1
  15. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/pyproject.toml +1 -0
  16. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/uv.lock +197 -131
  17. langgraph_api-0.4.38/langgraph_api/__init__.py +0 -1
  18. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/.gitignore +0 -0
  19. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/LICENSE +0 -0
  20. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/README.md +0 -0
  21. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/.gitignore +0 -0
  22. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/Makefile +0 -0
  23. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/README.md +0 -0
  24. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/burst.js +0 -0
  25. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/clean.js +0 -0
  26. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/graphs.js +0 -0
  27. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/package.json +0 -0
  28. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/ramp.js +0 -0
  29. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/update-revision.js +0 -0
  30. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/benchmark/weather.js +0 -0
  31. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/constraints.txt +0 -0
  32. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/forbidden.txt +0 -0
  33. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/healthcheck.py +0 -0
  34. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/__init__.py +0 -0
  35. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/a2a.py +0 -0
  36. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/assistants.py +0 -0
  37. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/mcp.py +0 -0
  38. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/meta.py +0 -0
  39. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/openapi.py +0 -0
  40. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/runs.py +0 -0
  41. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/store.py +0 -0
  42. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/threads.py +0 -0
  43. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/api/ui.py +0 -0
  44. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/asgi_transport.py +0 -0
  45. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/asyncio.py +0 -0
  46. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/auth/__init__.py +0 -0
  47. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/auth/custom.py +0 -0
  48. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/auth/langsmith/__init__.py +0 -0
  49. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/auth/middleware.py +0 -0
  50. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/auth/noop.py +0 -0
  51. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/auth/studio_user.py +0 -0
  52. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/command.py +0 -0
  53. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/config.py +0 -0
  54. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/cron_scheduler.py +0 -0
  55. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/errors.py +0 -0
  56. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/executor_entrypoint.py +0 -0
  57. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/feature_flags.py +0 -0
  58. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/grpc_ops/__init__.py +0 -0
  59. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/grpc_ops/client.py +0 -0
  60. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/grpc_ops/generated/__init__.py +0 -0
  61. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/grpc_ops/generated/core_api_pb2.py +0 -0
  62. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/grpc_ops/generated/core_api_pb2.pyi +0 -0
  63. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/grpc_ops/generated/core_api_pb2_grpc.py +0 -0
  64. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/grpc_ops/ops.py +0 -0
  65. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/http.py +0 -0
  66. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/http_metrics.py +0 -0
  67. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/http_metrics_utils.py +0 -0
  68. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/.gitignore +0 -0
  69. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/.prettierrc +0 -0
  70. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/__init__.py +0 -0
  71. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/base.py +0 -0
  72. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/build.mts +0 -0
  73. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/client.mts +0 -0
  74. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/errors.py +0 -0
  75. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/global.d.ts +0 -0
  76. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/package.json +0 -0
  77. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/remote.py +0 -0
  78. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/schema.py +0 -0
  79. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/src/graph.mts +0 -0
  80. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/src/load.hooks.mjs +0 -0
  81. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/src/preload.mjs +0 -0
  82. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/src/utils/files.mts +0 -0
  83. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/src/utils/importMap.mts +0 -0
  84. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  85. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/src/utils/serde.mts +0 -0
  86. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/sse.py +0 -0
  87. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/traceblock.mts +0 -0
  88. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/tsconfig.json +0 -0
  89. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/ui.py +0 -0
  90. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/js/yarn.lock +0 -0
  91. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/logging.py +0 -0
  92. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/metadata.py +0 -0
  93. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/middleware/__init__.py +0 -0
  94. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/middleware/http_logger.py +0 -0
  95. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/middleware/private_network.py +0 -0
  96. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/middleware/request_id.py +0 -0
  97. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/models/__init__.py +0 -0
  98. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/models/run.py +0 -0
  99. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/patch.py +0 -0
  100. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/queue_entrypoint.py +0 -0
  101. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/route.py +0 -0
  102. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/schema.py +0 -0
  103. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/self_hosted_logs.py +0 -0
  104. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/self_hosted_metrics.py +0 -0
  105. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/serde.py +0 -0
  106. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/sse.py +0 -0
  107. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/state.py +0 -0
  108. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/store.py +0 -0
  109. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/stream.py +0 -0
  110. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/thread_ttl.py +0 -0
  111. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/traceblock.py +0 -0
  112. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/tunneling/cloudflare.py +0 -0
  113. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/utils/__init__.py +0 -0
  114. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/utils/cache.py +0 -0
  115. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/utils/config.py +0 -0
  116. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/utils/errors.py +0 -0
  117. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/utils/future.py +0 -0
  118. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/utils/headers.py +0 -0
  119. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/utils/retriable_client.py +0 -0
  120. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/utils/stream_codec.py +0 -0
  121. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/utils/uuids.py +0 -0
  122. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/validation.py +0 -0
  123. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/webhook.py +0 -0
  124. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_api/worker.py +0 -0
  125. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_license/__init__.py +0 -0
  126. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_license/validation.py +0 -0
  127. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_runtime/__init__.py +0 -0
  128. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_runtime/checkpoint.py +0 -0
  129. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_runtime/database.py +0 -0
  130. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_runtime/lifespan.py +0 -0
  131. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_runtime/metrics.py +0 -0
  132. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_runtime/ops.py +0 -0
  133. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_runtime/queue.py +0 -0
  134. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_runtime/retry.py +0 -0
  135. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/langgraph_runtime/store.py +0 -0
  136. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/logging.json +0 -0
  137. {langgraph_api-0.4.38 → langgraph_api-0.4.40}/scripts/create_license.py +0 -0
@@ -24,7 +24,7 @@ stop-go-server:
24
24
  lint:
25
25
  uv run ruff check . --exclude "**/generated/**"
26
26
  uv run ruff format . --diff --exclude "**/generated/**"
27
- uvx ty check --exclude "**/pb/**" --exclude "**/*_test.py" --exclude "**/test_*.py" --exclude "**/tests/**" --exclude "venv/**" --exclude ".venv/**" --exclude "build/**" --exclude "dist/**" --exclude "**/generated/**" .
27
+ uv run ty check --exclude "**/pb/**" --exclude "**/*_test.py" --exclude "**/test_*.py" --exclude "**/tests/**" --exclude "venv/**" --exclude ".venv/**" --exclude "build/**" --exclude "dist/**" --exclude "**/generated/**" .
28
28
 
29
29
  format:
30
30
  uv run ruff check --fix . --exclude "**/generated/**"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.4.38
3
+ Version: 0.4.40
4
4
  Author-email: Nuno Campos <nuno@langchain.dev>, Will Fu-Hinthorn <will@langchain.dev>
5
5
  License: Elastic-2.0
6
6
  License-File: LICENSE
@@ -1,14 +1,7 @@
1
1
  import http from 'k6/http';
2
2
  import { sleep } from 'k6';
3
3
  import { Trend, Counter, Rate } from 'k6/metrics';
4
-
5
- // Mao
6
-
7
- const baseUrlToBaseUrlName = {
8
- 'https://ifh-core-api-dr-benchmark-048d364b548f5d9790082d8ba4fb44d8.us.langgraph.app': 'DRC,API S,OPS S,1 Job per',
9
- 'https://ifh-benchmarks-ba3f7d811fb6564ebe5248bcd7a0a662.us.langgraph.app': 'API S, OPS S, 1 Job per',
10
- 'https://wfh-benchmark-distributed-r-1603f73b1a175234b9b0fb1f9beea4f1.us.langgraph.app': 'DR,API S,OPS S,1 Job per',
11
- }
4
+ import { baseUrlToBaseUrlName } from './capacity_urls.mjs';
12
5
 
13
6
  // Metrics
14
7
  const runDuration = new Trend('run_duration'); // ms for successful runs
@@ -194,12 +187,15 @@ export function handleSummary(data) {
194
187
  baseUrl: BASE_URL,
195
188
  baseUrlName: baseUrlToBaseUrlName[BASE_URL],
196
189
  target: TARGET,
190
+ },
191
+ config: {
197
192
  waitSeconds: WAIT_SECONDS,
198
193
  dataSize: DATA_SIZE,
199
194
  delay: DELAY,
200
195
  expand: EXPAND,
201
196
  steps: STEPS,
202
197
  },
198
+ config_key: `wait:${WAIT_SECONDS}_dataSize:${DATA_SIZE}_delay:${DELAY}_expand:${EXPAND}_steps:${STEPS}`,
203
199
  metrics: {
204
200
  totalRuns: total,
205
201
  successfulRuns: succ,
@@ -10,6 +10,7 @@ import { readdirSync, readFileSync, writeFileSync, createReadStream } from 'node
10
10
  import { join } from 'node:path';
11
11
  import readline from 'node:readline';
12
12
  import QuickChart from 'quickchart-js';
13
+ import { baseUrlToBaseUrlName } from './capacity_urls.mjs';
13
14
 
14
15
  function envBool(name, def = false) {
15
16
  const v = process.env[name];
@@ -167,7 +168,7 @@ async function main() {
167
168
  const summary = loadSummaryForTarget(n);
168
169
  const s = summary?.metrics?.successRate; // percent
169
170
  successRate = Number.isFinite(s) ? s / 100 : 0;
170
- avgDurationSeconds = summary?.metrics?.averageDurationSeconds ?? null;
171
+ avgDurationSeconds = summary?.metrics?.runDuration?.avg ?? null;
171
172
  console.log(`Step N=${n} successRate=${(successRate * 100).toFixed(2)}% avgDur=${avgDurationSeconds ?? 'n/a'}s`);
172
173
  } catch (e) {
173
174
  console.error(`Failed to read summary for N=${n}:`, e?.message || e);
@@ -183,13 +184,15 @@ async function main() {
183
184
  }
184
185
  n = next;
185
186
  } else {
186
- failedStep = { target: n, successRate };
187
+ failedStep = { target: n, avgDurationSeconds, successRate };
187
188
  break;
188
189
  }
189
190
  }
190
191
 
191
192
  const ts = new Date().toISOString().replace(/:/g, '-').replace(/\..+/, '');
192
193
  const report = {
194
+ baseUrl: BASE_URL,
195
+ baseUrlName: baseUrlToBaseUrlName[BASE_URL],
193
196
  timestamp: ts,
194
197
  ramp: { start: RAMP_START, end: RAMP_END, multiplier: RAMP_MULTIPLIER },
195
198
  waitSeconds: WAIT_SECONDS,
@@ -199,6 +202,7 @@ async function main() {
199
202
  last_success_rate: lastSuccess?.successRate ?? null,
200
203
  failed_target: failedStep?.target ?? null,
201
204
  failed_success_rate: failedStep?.successRate ?? null,
205
+ failed_avg_duration_seconds: failedStep?.avgDurationSeconds ?? null,
202
206
  };
203
207
  const fname = `capacity_report_${ts}.json`;
204
208
  writeFileSync(join(process.cwd(), fname), JSON.stringify(report, null, 2));
@@ -210,6 +214,7 @@ async function main() {
210
214
  `last_success_avg_duration_seconds=${report.last_success_avg_duration_seconds}`,
211
215
  `failed_target=${report.failed_target}`,
212
216
  `failed_success_rate=${report.failed_success_rate}`,
217
+ `failed_avg_duration_seconds=${report.failed_avg_duration_seconds}`,
213
218
  ].join('\n');
214
219
  writeFileSync(process.env.GITHUB_OUTPUT, `${out}\n`, { flag: 'a' });
215
220
  }
@@ -0,0 +1,18 @@
1
+ export const baseUrlToBaseUrlName = {
2
+ 'https://ifh-core-api-dr-benchmark-048d364b548f5d9790082d8ba4fb44d8.us.langgraph.app': 'DRC,API S,OPS S',
3
+ 'https://ifh-benchmarks-ba3f7d811fb6564ebe5248bcd7a0a662.us.langgraph.app': 'API S, OPS S',
4
+ 'https://wfh-benchmark-distributed-r-1603f73b1a175234b9b0fb1f9beea4f1.us.langgraph.app': 'DR,API S,OPS S',
5
+ 'https://benchmark-api-m-ops-s-81bb8ca883ce54438fcb9027877be8e7.us.langgraph.app': 'API M, OPS S',
6
+ 'https://benchmark-api-s-ops-m-32baf0b195b7589eb77ce06c373f0886.us.langgraph.app': 'API S, OPS M',
7
+ 'https://benchmark-api-m-ops-m-2c4ecc0e7f6a526fac98db7068092d5a.us.langgraph.app': 'API M, OPS M',
8
+ 'https://benchmark-dr-api-m-ops-s-d3bfd55b7b065af5a89d3b15edd99500.us.langgraph.app': 'DR, API M, OPS S',
9
+ 'https://benchmark-dr-api-s-ops-m-7f98f893140257b7869cbe00a93ecb71.us.langgraph.app': 'DR, API S, OPS M',
10
+ 'https://benchmark-dr-api-m-ops-m-22b1c77d9f175160b226090601add28a.us.langgraph.app': 'DR, API M, OPS M',
11
+ 'https://benchmark-drc-api-m-ops-s-9a7d59e246d95b5bad994c7ea269c460.us.langgraph.app': 'DRC, API M, OPS S',
12
+ 'https://benchmark-drc-api-s-ops-m-d54e214bd0fd5c9db1f44b80065f7b9a.us.langgraph.app': 'DRC, API S, OPS M',
13
+ 'https://benchmark-drc-api-m-ops-m-caa32d5c7e945a15a3818aa7a941b1bd.us.langgraph.app': 'DRC, API M, OPS M',
14
+ 'https://benchmark-dr-api-s-ops-s-db-b8ba0253c7a65ace836c0662f22c530d.us.langgraph.app': 'DR, API S, OPS S, DB M',
15
+ 'https://benchmark-api-s-ops-s-db-m-4e3d4e6f27d35555b7f3955c3a4c301a.us.langgraph.app': 'API S, OPS S, DB M',
16
+ 'https://benchmark-dr-api-s-ops-s-re-423b90208677556e86eced49b27a73a0.us.langgraph.app': 'DR, API S, OPS S, Redis M',
17
+ 'https://benchmark-api-s-ops-s-redis-91911734773c51e292ecb2b15fa015e5.us.langgraph.app': 'API S, OPS S, Redis M',
18
+ };
@@ -34,10 +34,8 @@ def send_benchmark_results(
34
34
  benchmark_data["labels"] = common_labels
35
35
 
36
36
  log_item = HTTPLogItem(
37
- ddsource="benchmark",
38
- ddtags=f"env:benchmarking,base_url:{common_labels.get('base_url', 'unknown')}"
39
- if common_labels
40
- else "env:benchmarking",
37
+ ddsource="benchmark-3",
38
+ ddtags="env:benchmarking" if common_labels else "env:benchmarking",
41
39
  hostname=os.getenv("HOSTNAME", "localhost"),
42
40
  message=json.dumps(benchmark_data),
43
41
  service="benchmark-results",
@@ -80,6 +78,10 @@ if __name__ == "__main__":
80
78
  DD_SITE = os.getenv("DD_SITE", "us5.datadoghq.com")
81
79
 
82
80
  common_labels = {"base_url": os.getenv("BASE_URL")}
81
+ if "report" in args.benchmark_file:
82
+ common_labels["type"] = "summary"
83
+ else:
84
+ common_labels["type"] = "individual_run"
83
85
 
84
86
  for file in glob.glob(args.benchmark_file):
85
87
  process_benchmark_file(file, common_labels, DD_SITE, DD_API_KEY)
@@ -0,0 +1 @@
1
+ __version__ = "0.4.40"
@@ -30,10 +30,11 @@ class AuthCacheEntry(TypedDict):
30
30
 
31
31
 
32
32
  class LangsmithAuthBackend(AuthenticationBackend):
33
- def __init__(self):
33
+ def __init__(self, *, base_url: str | None = None):
34
34
  from langgraph_api.utils.cache import LRUCache
35
35
 
36
36
  self._cache = LRUCache[AuthCacheEntry](max_size=1000, ttl=60)
37
+ self._base_url = base_url
37
38
 
38
39
  def _get_cache_key(self, headers):
39
40
  """Generate cache key from authentication headers"""
@@ -61,7 +62,7 @@ class LangsmithAuthBackend(AuthenticationBackend):
61
62
  if cached_entry := await self._cache.get(cache_key):
62
63
  return cached_entry["credentials"], cached_entry["user"]
63
64
 
64
- async with auth_client() as auth:
65
+ async with auth_client(base_url=self._base_url) as auth:
65
66
  if not LANGSMITH_AUTH_VERIFY_TENANT_ID and not conn.headers.get(
66
67
  "x-api-key"
67
68
  ):
@@ -85,8 +85,10 @@ class JsonHttpClient:
85
85
  )
86
86
 
87
87
 
88
- def create_client() -> JsonHttpClient:
88
+ def create_client(base_url: str | None = None) -> JsonHttpClient:
89
89
  """Create the auth http client."""
90
+ url = base_url if base_url is not None else LANGSMITH_AUTH_ENDPOINT
91
+
90
92
  return JsonHttpClient(
91
93
  httpx.AsyncClient(
92
94
  transport=httpx.AsyncHTTPTransport(
@@ -97,7 +99,7 @@ def create_client() -> JsonHttpClient:
97
99
  ),
98
100
  ),
99
101
  timeout=httpx.Timeout(2.0),
100
- base_url=LANGSMITH_AUTH_ENDPOINT,
102
+ base_url=url,
101
103
  )
102
104
  )
103
105
 
@@ -109,20 +111,23 @@ async def close_auth_client() -> None:
109
111
  await _client.client.aclose()
110
112
 
111
113
 
112
- async def initialize_auth_client() -> None:
114
+ async def initialize_auth_client(base_url: str | None = None) -> None:
113
115
  """Initialize the auth http client."""
114
116
  await close_auth_client()
115
117
  global _client
116
- _client = create_client()
118
+ _client = create_client(base_url=base_url)
117
119
 
118
120
 
119
121
  @asynccontextmanager
120
- async def auth_client() -> AsyncGenerator[JsonHttpClient, None]:
122
+ async def auth_client(
123
+ base_url: str | None = None,
124
+ ) -> AsyncGenerator[JsonHttpClient, None]:
121
125
  """Get the auth http client."""
126
+ url = base_url if base_url is not None else LANGSMITH_AUTH_ENDPOINT
122
127
  # pytest does something funny with event loops,
123
128
  # so we can't use a global pool for tests
124
- if LANGSMITH_AUTH_ENDPOINT.startswith("http://localhost"):
125
- client = create_client()
129
+ if url.startswith("http://localhost"):
130
+ client = create_client(base_url=url)
126
131
  try:
127
132
  yield client
128
133
  finally:
@@ -135,5 +140,5 @@ async def auth_client() -> AsyncGenerator[JsonHttpClient, None]:
135
140
  if found:
136
141
  yield _client
137
142
  else:
138
- await initialize_auth_client()
143
+ await initialize_auth_client(base_url=url)
139
144
  yield _client
@@ -299,7 +299,7 @@ def run_server(
299
299
  f"Server started in {time.time() - start_time:.2f}s"
300
300
  )
301
301
  thread_logger.info(
302
- "🎨 Opening Debugger in your browser..."
302
+ "🎨 Opening Studio in your browser..."
303
303
  )
304
304
  thread_logger.info("URL: " + full_studio_url)
305
305
  webbrowser.open(full_studio_url)
@@ -317,11 +317,11 @@ def run_server(
317
317
  ╩═╝┴ ┴┘└┘└─┘╚═╝┴└─┴ ┴┴ ┴ ┴
318
318
 
319
319
  - 🚀 API: \033[36m{local_url}\033[0m
320
- - 🎨 Debugger UI: \033[36m{full_studio_url}\033[0m
320
+ - 🎨 Studio UI: \033[36m{full_studio_url}\033[0m
321
321
  - 📚 API Docs: \033[36m{local_url}/docs\033[0m
322
322
 
323
323
  This in-memory server is designed for development and testing.
324
- For production use, please use LangGraph Platform.
324
+ For production use, please use LangSmith Deployment.
325
325
 
326
326
  """
327
327
  logger.info(welcome)
@@ -362,7 +362,7 @@ async def collect_graphs_from_env(register: bool = False) -> None:
362
362
  if lg_api_config.API_VARIANT == "local_dev":
363
363
  raise NotImplementedError(
364
364
  "LangGraph.JS graphs are not yet supported in local development mode. "
365
- "To run your JS graphs, either use the LangSmith Debugger "
365
+ "To run your JS graphs, either use the LangGraph Studio application "
366
366
  "or run `langgraph up` to start the server in a Docker container."
367
367
  )
368
368
  import sys
@@ -47,7 +47,9 @@ const wrapHonoApp = (app: Hono) => {
47
47
  // b/c the user's Hono version might be different than ours.
48
48
  // See warning here: https://hono.dev/docs/guides/middleware#built-in-middleware
49
49
  const newApp = new (Object.getPrototypeOf(app).constructor)() as Hono<{
50
- Variables: { body: string | ArrayBuffer | ReadableStream | null };
50
+ Variables: {
51
+ "langgraph:body": string | ArrayBuffer | ReadableStream | null;
52
+ };
51
53
  }>;
52
54
 
53
55
  // This endpoint is used to check if we can yield the routing to the Python server early.
@@ -71,11 +73,15 @@ const wrapHonoApp = (app: Hono) => {
71
73
  newApp.notFound(async (c) => {
72
74
  // Send the request body back to the Python server
73
75
  // Use the cached body in-case the user mutated the body
74
- let payload: any = null;
75
- try {
76
- payload = JSON.stringify(await c.req.json()) ?? null;
77
- } catch {
78
- // pass
76
+ let payload: string | ArrayBuffer | ReadableStream | null =
77
+ c.get("langgraph:body");
78
+
79
+ if (payload == null) {
80
+ try {
81
+ payload = JSON.stringify(await c.req.json()) ?? null;
82
+ } catch {
83
+ // pass
84
+ }
79
85
  }
80
86
 
81
87
  return c.body(payload, {
@@ -117,7 +117,7 @@ def update_openapi_spec(app):
117
117
  schemas = SchemaGenerator(
118
118
  {
119
119
  "openapi": "3.1.0",
120
- "info": {"title": "LangGraph Platform", "version": "0.1.0"},
120
+ "info": {"title": "LangSmith Deployment", "version": "0.1.0"},
121
121
  }
122
122
  )
123
123
  spec = schemas.get_schema(routes=app.routes)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
- "title": "LangGraph Platform",
4
+ "title": "LangSmith Deployment",
5
5
  "version": "0.1.0"
6
6
  },
7
7
  "tags": [
@@ -64,6 +64,7 @@ dev = [
64
64
  "passlib>=1.7.4",
65
65
  "langgraph-checkpoint-sqlite>=2.0.10",
66
66
  "datadog-api-client>=2.0.0",
67
+ "ty==0.0.1-alpha.21",
67
68
  ]
68
69
 
69
70