[//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps [langsmith](https://github.com/langchain-ai/langsmith-sdk) from 0.5.20 to 0.6.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langsmith-sdk/releases">langsmith's releases</a>.</em></p> <blockquote> <h2>v0.6.0</h2> <h2>What's Changed</h2> <ul> <li>chore(js): bump JS to 0.4.3 by <a href="https://github.com/dqbd"><code>@dqbd</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2253">langchain-ai/langsmith-sdk#2253</a></li> <li>Revert "feat: add js prompt caching" by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2258">langchain-ai/langsmith-sdk#2258</a></li> <li>Revert "feat: Replace UUID5 with deterministic UUID7 for replicas" by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2257">langchain-ai/langsmith-sdk#2257</a></li> <li>release(js): bump to 0.4.4 by <a href="https://github.com/dqbd"><code>@dqbd</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2259">langchain-ai/langsmith-sdk#2259</a></li> <li>feat: add prompt cache back and setup environment tests by <a href="https://github.com/langchain-infra"><code>@langchain-infra</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2260">langchain-ai/langsmith-sdk#2260</a></li> <li>feat(python): Bump pydantic to v2 by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2248">langchain-ai/langsmith-sdk#2248</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.5.2...v0.6.0">https://github.com/langchain-ai/langsmith-sdk/compare/v0.5.2...v0.6.0</a></p> <h2>v0.6.0rc0</h2> <h2>What's Changed</h2> <ul> <li>feat(js): Add support for tracing AI SDK 6 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2237">langchain-ai/langsmith-sdk#2237</a></li> <li>fix(js): Remove default Jestlike timeout by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2243">langchain-ai/langsmith-sdk#2243</a></li> <li>feat(js): Add support for tracing tool loop agent by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2244">langchain-ai/langsmith-sdk#2244</a></li> <li>feat: Replace UUID5 with deterministic UUID7 for replicas by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2249">langchain-ai/langsmith-sdk#2249</a></li> <li>feat: add prompt caching to python sdk by <a href="https://github.com/langchain-infra"><code>@langchain-infra</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2246">langchain-ai/langsmith-sdk#2246</a></li> <li>feat: add js prompt caching by <a href="https://github.com/langchain-infra"><code>@langchain-infra</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2251">langchain-ai/langsmith-sdk#2251</a></li> <li>fix(claude): correctly parse llm and tool inputs in claude agent sdk by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2255">langchain-ai/langsmith-sdk#2255</a></li> <li>bump(python): 0.5.2 by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2256">langchain-ai/langsmith-sdk#2256</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.5.1...v0.6.0rc0">https://github.com/langchain-ai/langsmith-sdk/compare/v0.5.1...v0.6.0rc0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/langchain-ai/langsmith-sdk/commits/v0.6.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Evals
Behavioural evaluations for deepagents. Each subdirectory is an independent
workspace package containing vitest tests that run a real agent against LLM
APIs and assert on the resulting trajectory.
Results are streamed to LangSmith as experiments so you can compare runs across models and track regressions over time.
Available eval suites
| Suite | Description |
|---|---|
basic/ |
System prompt adherence, simple reasoning, avoiding unnecessary tool calls |
all/ |
Aggregated run that executes all eval suites in a single Vitest + LangSmith session |
files/ |
File operations — read, write, edit, ls, grep, glob, parallel I/O, deep nesting |
followup-quality/ |
Clarifying question quality for underspecified user requests |
hitl/ |
Human-in-the-loop interrupt behavior, review configs, resume after approval |
external-benchmarks/ |
Curated hard-set from FRAMES, Nexus, and BFCL v3 benchmark samples |
memory/ |
AGENTS.md memory injection — recall, guided behavior, multiple sources, graceful fallback |
memory-agent-bench/ |
MemoryAgentBench-style long-context memorization and retrieval scenarios |
memory-multiturn/ |
Multi-turn memory persistence: implicit preferences, explicit instructions, transient filtering |
skills/ |
Skill file discovery, reading, selection, combination, and editing via skill source paths |
subagents/ |
Subagent delegation — task tool routing to named and general-purpose subagents |
summarization/ |
Summarization middleware behavior and conversation-history offloading |
tau2-airline/ |
Tau2-airline inspired policy-grounded airline support tasks |
todos/ |
Sequential write_todos state updates and completion behavior |
tool-selection/ |
Direct/indirect tool routing and multi-step chaining across mock integrations |
tool-usage-relational/ |
Multi-step tool chaining with relational data lookups (users, locations, foods) |
Running evals
Evals require the EVAL_RUNNER environment variable to select a model runner.
Available runners are registered in
internal/eval-harness/src/setup.ts:
You also need LANGSMITH_API_KEY set for result tracking (and the appropriate
ANTHROPIC_API_KEY / OPENAI_API_KEY for the model you choose).
# Run all eval suites with Sonnet 4.5
EVAL_RUNNER=sonnet-4-5 pnpm test:eval
# Run a single suite
EVAL_RUNNER=sonnet-4-5 pnpm --filter @deepagents/eval-basic test:eval
# Run every suite in one execution (single reporter session)
EVAL_RUNNER=sonnet-4-5 pnpm --filter @deepagents/eval-all test:eval
# Run with a different model
EVAL_RUNNER=gpt-4.1 pnpm --filter @deepagents/eval-files test:eval
Writing a new eval
-
Create a new directory under
evals/(e.g.evals/my-eval/). -
Add a
package.json:{ "name": "@deepagents/eval-my-eval", "private": true, "type": "module", "scripts": { "test:eval": "vitest run" }, "dependencies": { "@deepagents/evals": "workspace:*", "deepagents": "workspace:*", "langsmith": "^0.5.4", "vitest": "^4.0.18" } } -
Add a
vitest.config.ts:import { defineConfig } from "vitest/config"; export default defineConfig({ test: { environment: "node", globals: false, testTimeout: 120_000, hookTimeout: 60_000, teardownTimeout: 60_000, include: ["**/*.test.ts"], setupFiles: ["@deepagents/evals/setup"], reporters: ["default", "langsmith/vitest/reporter"], }, }); -
Write your test in
eval.test.ts:import * as ls from "langsmith/vitest"; import { expect } from "vitest"; import { getDefaultRunner } from "@deepagents/evals"; const runner = getDefaultRunner(); const evalName = "deepagents-js-my-eval"; ls.describe( evalName, () => { ls.test( "my test case", { inputs: { query: "Hello" } }, async ({ inputs }) => { const result = await runner.run({ query: inputs.query }); expect(result).toHaveAgentSteps(1); }, ); }, { projectName: runner.name, upsert: true }, ); -
Run
pnpm installfrom the repo root to link the new workspace.
Customising the agent per test
Use runner.extend() to create a derived runner with different agent
configuration. The run() method only takes invocation params (query,
initialFiles).
// Custom system prompt
const result = await runner
.extend({ systemPrompt: "Your name is Foo Bar." })
.run({ query: "What is your name?" });
// Custom tools
const result = await runner
.extend({ tools: [myTool] })
.run({ query: "Use the tool." });
// Custom subagents
const result = await runner
.extend({
subagents: [
{ name: "helper", description: "A helper agent", tools: [myTool] },
],
})
.run({ query: "Delegate to the helper." });
// Seed files
const result = await runner.run({
query: "Read /data.txt",
initialFiles: { "/data.txt": "hello world" },
});
Custom matchers
The harness provides vitest matchers that also log LangSmith feedback:
toHaveAgentSteps(n)— assert exact step counttoHaveToolCallRequests(n)— assert total tool-call counttoHaveToolCallInStep(step, { name, argsContains?, argsEquals? })— assert a specific tool call in a step (1-indexed)toHaveFinalTextContaining(text, caseInsensitive?)— assert the final response contains text
Architecture
See internal/eval-harness/README.md
for details on the harness internals.