636 Commits

Author SHA1 Message Date
KiewanVillatel 8d8f04caf4 release: 0.1.0-beta.22 (#203) v0.1.0-beta.22 2026-07-31 19:55:29 +02:00
github-actions[bot] 7e785f0992 release: 0.1.0-beta.22 2026-07-31 17:46:42 +00:00
KiewanVillatel 80871220e2 Release SDK updates 2026-07-31 19:46:23 +02:00
Kiewan Villatel 32192ca3e1 Build SDK
Stainless-Generated-From: fa9e9cd4cf1e6fa524a69184c0fbaba61eae1556
2026-07-31 18:41:49 +02:00
Quentin Brosse c9f51683ce chore: note light-review expectation on generated SDK release PRs (#53)
Reviewers stamping the auto-generated `Release SDK updates` PR had no
signal about how much review the diff actually needs.
`smith-sdks/README.md` documents that the promotion diff is either
already-reviewed custom code or code generated from an already-reviewed
Stainless config, but nobody reads the README before reviewing the PR —
so put the note in the PR body itself.

Also hoists the twice-inlined `git log` body into a `BODY` variable
shared by `gh pr create` and `gh pr edit`.

Rendered at the bottom of every future release PR:

---

> [!NOTE]
> These changes are either auto-generated or already reviewed, so only a
very light review is required: guard against a potential catastrophic
generation failure by checking the diff stat for an unexpectedly large
number of deleted files, and confirm any deletion traces back to a
legitimate commit (e.g. an endpoint removal).
> See [Releasing the
SDKs](https://github.com/langchain-ai/langchainplus/tree/main/smith-sdks#releasing-the-sdks)
for the full instructions.

---

### Test plan

- Both edited workflows parse as YAML.
- Dry-ran the body construction in bash: the `> [!NOTE]` callout starts
on its own line after a blank line (command substitution strips `git
log`'s trailing newlines, hence `printf '%s\n\n%s\n'`).

### Sibling PRs

All three must land to cover all four SDKs:

- Go: langchain-ai/langsmith-go-staging#92
- Java: langchain-ai/langsmith-java-staging#53
- Python + TypeScript: langchain-ai/langchainplus#32531

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 12:44:25 +02:00
KiewanVillatel dae5c4eb91 release: 0.1.0-beta.21 (#200) v0.1.0-beta.21 2026-07-31 09:57:34 +02:00
github-actions[bot] e2c92e9265 release: 0.1.0-beta.21 2026-07-30 13:09:45 +00:00
Emil Filipov 73844b36b6 Release SDK updates (#201) 2026-07-30 15:09:20 +02:00
stlc-bot 8abc50af55 docs(feedback): document session_id as required on feedback creation
Stainless-Generated-From: 111b7da5b320b1dfa13b0d1ced36a9d0ba2c43ef
2026-07-30 11:28:49 +00:00
Emil Filipov 736b9888c3 Release SDK updates (#199) 2026-07-30 13:20:01 +02:00
Emil Filipov 714a32cc62 fix(evaluation): don't post comparative feedback without a session_id (#52)
`logComparativeEvaluationFeedback` looked each run up by the keys of the
score map
returned by the user's comparative evaluator, but posted the feedback
whether or not
the lookup hit. On a miss, `POST /api/v1/feedback` went out with a
`run_id` but no
`session_id` — while still carrying this comparison's
`comparative_experiment_id` and
`feedback_group_id`. `ComparisonEvaluationResult.scores` is authored
entirely by the
evaluator and was never checked against the runs it was handed, so a
nested run id, or
one an LLM judge invented, was enough to trigger it.

Such an entry is now skipped with a `WARNING`, and `.sessionId(...)` is
unconditional in
the builder. No fallback session is used: with two experiments in play
there is no way to
tell which one an unrecognised run belongs to. Evaluator-supplied text
is sanitized before
logging so a judge's output can't forge log records.

The other feedback paths were checked and are unaffected — `evaluate()`
supplies
`session_id` via `TraceConfig`, and `evaluateExisting()` via the
required
`RunSchema.session_id`.

New `EvaluateSupportTest` calls the internal helper directly with a
mocked
`FeedbackService`. This path had no coverage before.

## Test Plan

- [x] `./gradlew :langsmith-java-core:test` green (422 test classes);
`lintKotlin` clean
2026-07-30 13:02:06 +02:00
KiewanVillatel 5026b6057f release: 0.1.0-beta.20 (#198) v0.1.0-beta.20 2026-07-30 12:12:48 +02:00
github-actions[bot] 4074d57d15 release: 0.1.0-beta.20 2026-07-30 09:59:15 +00:00
KiewanVillatel b8a8bb5114 Release SDK updates 2026-07-30 11:58:43 +02:00
KiewanVillatel 383fbdb431 fix: strip a trailing /api or /api/v1 from the configured base URL (#51)
## Summary

Port of langchain-ai/langsmith-sdk#3284 to the Java SDK. There was no
stripping here at all, so this implements it.

The generated request paths spell their own prefix out —
`RunServiceImpl` emits `.addPathSegments("api", "v1", "runs", "query")`,
`.addPathSegments("v2", "runs", "query")` — so for those the base URL
has to point at the deployment root. A user who sets
`LANGSMITH_ENDPOINT` to the suffixed URL the Python and JS SDKs accept
(`https://host/api/v1`) currently gets requests to
`https://host/api/v1/api/v1/runs/query`.

Handwritten requests are the opposite case: they are root-relative, so
the prefix they sit behind comes from the configured endpoint — `/api`
on self-hosted, nothing on SaaS. That is deployment specific and cannot
be reconstructed from a normalized root, so those requests keep the URL
exactly as configured.

## Which requests are handwritten

Determined with `make show-custom-code TARGET=java` in
`langchainplus/smith-sdks`, which diffs pure generated output against
the integrated SDK. Only two endpoint families build a URL from the
client base URL outside the generated paths:

| Handwritten request | Files |
|---|---|
| `GET {base}/info` | `InfoServiceImpl`, `InfoServiceAsyncImpl` |
| `POST {base}/runs/multipart` | `RunServiceImpl`, `RunServiceAsyncImpl`
|

`AutoBatchQueue`, `RunMultipartBatch`, `RunCompression` and
`evaluation/*` are custom but route through those or through generated
methods. `OtelTraceExporter` uses its own OTLP endpoint. The one other
handwritten request, the OAuth token refresh in `ProfileConfig`,
deliberately targets the root and already stripped `/api/v1`.

## Changes

- **`BaseUrls.kt`** (new, custom) — `normalizeBaseUrl` trims a trailing
`/api/v1` or `/api`. Only whole trailing path segments of the *parsed*
URL are considered, so a host such as `api.example.com` is untouched and
the scheme/host are never rewritten. The result keeps a trailing slash,
matching `ClientOptions.PRODUCTION_URL`. A URL that fails to parse, or
that carries a query or fragment, is returned unchanged. A bare `/v1` is
not stripped, matching the Python and JS SDKs.
- **`ClientOptions.kt`** — `baseUrl()` now returns the normalized root,
and a new `configuredBaseUrl()` returns the value as configured.
Normalizing in the **getter** rather than in `Builder.baseUrl` matters:
it keeps the configured value recoverable, including across a
`toBuilder()` round trip.
- **The four handwritten call sites** — switched to
`clientOptions.configuredBaseUrl()`.
- **`ProfileConfig.kt`** — `normalizeConfigUrl` delegates to the shared
helper, so the OAuth token endpoint strips `/api` too rather than only
`/api/v1`.

`PrepareRequest.kt` carries no custom code, so it is left untouched.

## Tests

New custom `BaseUrlsTest.kt` (the generated `ClientOptionsTest.kt` is
left alone), 21 tests: the stripped and preserved cases for
`normalizeBaseUrl`; handwritten `/info` and `/runs/multipart` keeping
the configured URL for endpoints of `""`, `/api` and `/api/v1`;
generated paths resolving against the root in all three; both accessors
on `ClientOptions`; the `toBuilder()` round trip; and the null fallback
to `PRODUCTION_URL`.

- `./gradlew :langsmith-java-core:test` → 1986 tests, 0 failures
- `./gradlew format` / `lint` clean

Note: `AutoBatchQueueTest.batch size limit starts a new batch for
subsequent runs` is timing sensitive and fails intermittently when run
in isolation, on a clean `main` checkout as well as here. Unrelated to
this change.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 10:19:21 +02:00
stlc-bot 02b1bda78f fix(annotation-queues): document item endpoints at their served path
Stainless-Generated-From: 10b633a9e465beaf23af76f9aa3b5ff84c2eca74
2026-07-30 03:21:13 +00:00
stlc-bot 553547325f feat(smith-go): declare v2 endpoints under /api/v2 in the OpenAPI spec
Stainless-Generated-From: 748b608f92cf157c589ab2ee8519c1420b0a93e7
2026-07-29 23:06:21 +00:00
stlc-bot 02f1aeb12c feat(annotation-queues): rename items wire field session_id to project_id
Stainless-Generated-From: d8ce7475f1c53e5168838114f442e164c1b41861
2026-07-29 21:38:42 +00:00
stlc-bot 3d2ec89e04 fix(evaluators): show an evaluator's current name wherever it's attached [LSE-2687]
Stainless-Generated-From: 0cd00faa550590ce050dec54af177d6966f0524b
2026-07-29 20:39:21 +00:00
stlc-bot b922c8e220 fix(runs): restore optional session on public dataset stats endpoint
Stainless-Generated-From: 76dd0b0d5956a552fb8cd7a66c74b7ffb56cbcc6
2026-07-29 18:07:10 +00:00
stlc-bot 2c5d0dcd28 fix: remove internal annotation queue API docs
Stainless-Generated-From: eca75e0aa426da2c8f1192558f02df067eb1f7cc
2026-07-28 21:51:32 +00:00
stlc-bot 2fdc70b11a feat: expose annotation queue item APIs publicly [LSE-2550]
Stainless-Generated-From: 398b0fdecf4307af3af7cea4f223d52f9dc1919f
2026-07-27 22:57:12 +00:00
stlc-bot fd6269b865 fix(threads): make trace_id in list_traces respect the selects contract
Stainless-Generated-From: 08a82813d828aeeebf42e3a08245aec3769b29a7
2026-07-27 08:20:34 +00:00
stlc-bot 06cdab2519 feat(backend): allow storing markdown / text blocks as charts in /v1/charts/{...} endpoints
Stainless-Generated-From: e81011bfc58ba311ddea07863c252a3e872dba12
2026-07-25 00:53:27 +00:00
stlc-bot 3d6f9eb532 chore(info): remove legacy Python /info endpoint, serve from smith-go
Stainless-Generated-From: 992d75ad1ceef103593fd9b00d7994097a43e46a
2026-07-24 14:51:44 +00:00
KiewanVillatel 2775de9d25 release: 0.1.0-beta.19 (#195) v0.1.0-beta.19 2026-07-23 12:31:02 +02:00
github-actions[bot] 2ab482c2d3 release: 0.1.0-beta.19 2026-07-23 10:21:10 +00:00
KiewanVillatel b1649d975e Release SDK updates 2026-07-23 12:20:48 +02:00
stlc-bot aece72d035 refactor(runs): remove SmithDB v2 endpoint flag [LSO-3391]
Stainless-Generated-From: eaf6eeeffa6089b29a6ed890ffccada85c435446
2026-07-23 00:21:12 +00:00
stlc-bot aa4be05c11 feat(backend): update CRUD endpoint to allow retrieving / storing chart series metadata
Stainless-Generated-From: d6a6962cef9066a8de2683d0a48553057474595b
2026-07-22 19:30:16 +00:00
stlc-bot 8aded40800 feat(backend): Allow storing grid layout to custom dashboards
Stainless-Generated-From: 235750773cea09074a5f805563dba096b19f5c6a
2026-07-22 18:27:41 +00:00
stlc-bot 6165434d21 feat(sandboxes): free-form labels on sandboxes and snapshots
Stainless-Generated-From: 5a8ad04cc2a2a4afaa4f310a862d9701806a1662
2026-07-22 14:07:11 +00:00
stlc-bot 95da1e9b94 revert(runs): require session in POST /runs/stats
Stainless-Generated-From: 76e29824c8418e6e3596ff4fde3f2abec3fd34f9
2026-07-22 12:49:59 +00:00
stlc-bot eace8c3f99 feat(sandboxes): let proxy rules contribute sandbox env vars
Stainless-Generated-From: 3d4147438f77389052680dd6bf85a9c90ab4d373
2026-07-22 10:42:41 +00:00
stlc-bot 056dbd3673 fix(runs): require session in POST /runs/stats
Stainless-Generated-From: b24d4f534d67323bbf8765d82bb0843c24030da5
2026-07-22 10:25:34 +00:00
stlc-bot e7fe407f74 fix: support last_queued_at in v2 runs query
Stainless-Generated-From: da0d737eda0ece655bc0779537309b706951bb74
2026-07-21 23:20:53 +00:00
stlc-bot f6608288d4 feat(host): p50/p99 run queue wait-time chart in project monitoring [LSD-1547]
Stainless-Generated-From: 17fb5d12f51ab1746f996098443e5b69b023ca82
2026-07-21 20:22:16 +00:00
stlc-bot b072b2e2fc fix(evaluators): persist and wire through playground_settings_id for llm-as-judge oauth models [part of ENT-1402]
Stainless-Generated-From: 809ff1ccff334354d5ce4e55c50e5f4974bcf13f
2026-07-21 15:57:35 +00:00
stlc-bot 391b75ca3b Build SDK
Stainless-Generated-From: df7d0b0d0f4e763f9a168447fe5c95f5efdf25fa
2026-07-20 13:51:31 +00:00
KiewanVillatel 42326ef486 Merge branch 'main' into stlc/from-prod 2026-07-20 15:04:28 +02:00
KiewanVillatel b6d079b991 ci: sync from prod now targets main instead of next (#48)
## Summary

- Updates `stlc-sync-from-production.yml` to check out `main` (instead
of `next`) and open back-sync PRs targeting `main`
- Aligns with the removal of the `next` branch and the shift to a
direct-to-main flow

## Test plan

- [ ] Trigger `stlc: sync from production` via workflow_dispatch and
confirm the PR it creates targets `main`

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-20 14:39:17 +02:00
KiewanVillatel 804022edf1 release: 0.1.0-beta.18 (#193) v0.1.0-beta.18 2026-07-20 12:55:54 +02:00
github-actions[bot] feb140e343 release: 0.1.0-beta.18 2026-07-20 10:26:58 +00:00
KiewanVillatel 0d0a8f5ffb Release SDK updates (#191) 2026-07-20 12:26:41 +02:00
stlc-bot 57da309643 feat(runs): add GET /v2/runs/{run_id}/url endpoint and SDK runs.get_url method
Stainless-Generated-From: 12ef224c44ef834db59a6216eb1010f87947b165
2026-07-20 10:12:06 +00:00
stlc-bot 388984c005 fix: build, lint, and test failures (feat(gateway): rate limit policy CRUD, validation, and materialization [ENT-1138]) 2026-07-17 21:55:39 +00:00
KiewanVillatel 283c4c2bcf release: 0.1.0-beta.17 (#190) v0.1.0-beta.17 2026-07-17 20:47:23 +02:00
github-actions[bot] b8f1caebe1 release: 0.1.0-beta.17 2026-07-17 18:39:52 +00:00
KiewanVillatel b64cfc2ca8 Release SDK updates (#189) 2026-07-17 20:39:32 +02:00
stlc-bot 101472f4ce feat(runs/v2): make start_time optional in GET /v2/runs/:id
Stainless-Generated-From: fc698ee51e0e6b4b1cb0389217ce572774ac2dba
2026-07-17 17:39:28 +00:00