This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## deepagents-acp@0.1.9 ### Patch Changes - [#501](https://github.com/langchain-ai/deepagentsjs/pull/501) [`5b0eaea`](https://github.com/langchain-ai/deepagentsjs/commit/5b0eaea7b20461414983b71ba08d26d078b49214) Thanks [@sukhmanghotraa](https://github.com/sukhmanghotraa)! - fix: bump @langchain/core to ^1.1.42 across all workspace packages - Updated dependencies \[[`5b0eaea`](https://github.com/langchain-ai/deepagentsjs/commit/5b0eaea7b20461414983b71ba08d26d078b49214), [`e90171a`](https://github.com/langchain-ai/deepagentsjs/commit/e90171abe4bcc76767246be470a7b17b94692f41), [`8fd575f`](https://github.com/langchain-ai/deepagentsjs/commit/8fd575f06ca27cb0bef1a649aa34124a2c04ddd3), [`3657941`](https://github.com/langchain-ai/deepagentsjs/commit/3657941ea36b21b9b512c1eb68a250ae79124383), [`998d772`](https://github.com/langchain-ai/deepagentsjs/commit/998d772a07acc76fcc0d419e65b3c74a64d9ac52), [`55f3bd8`](https://github.com/langchain-ai/deepagentsjs/commit/55f3bd8d74cac22d124fd6d1b11538dc2c2c2aec), [`79e20e1`](https://github.com/langchain-ai/deepagentsjs/commit/79e20e18082a19b65094b953cd857908a7525801), [`2442d7d`](https://github.com/langchain-ai/deepagentsjs/commit/2442d7d080c8a1008197eda526de52400303dd72), [`43cd121`](https://github.com/langchain-ai/deepagentsjs/commit/43cd121133562abf0dee76c6db01f2bde0eb3fd3), [`2994444`](https://github.com/langchain-ai/deepagentsjs/commit/2994444f32a6c0503defa6157652e742361abb00)]: - deepagents@1.9.1 ## deepagents@1.9.1 ### Patch Changes - [#501](https://github.com/langchain-ai/deepagentsjs/pull/501) [`5b0eaea`](https://github.com/langchain-ai/deepagentsjs/commit/5b0eaea7b20461414983b71ba08d26d078b49214) Thanks [@sukhmanghotraa](https://github.com/sukhmanghotraa)! - fix: bump @langchain/core to ^1.1.42 across all workspace packages - [#442](https://github.com/langchain-ai/deepagentsjs/pull/442) [`e90171a`](https://github.com/langchain-ai/deepagentsjs/commit/e90171abe4bcc76767246be470a7b17b94692f41) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(deepagents): closer align store backend with Python - [#496](https://github.com/langchain-ai/deepagentsjs/pull/496) [`8fd575f`](https://github.com/langchain-ai/deepagentsjs/commit/8fd575f06ca27cb0bef1a649aa34124a2c04ddd3) Thanks [@colifran](https://github.com/colifran)! - feat(deepagents): implement functional skills for quickjs middleware - [#448](https://github.com/langchain-ai/deepagentsjs/pull/448) [`3657941`](https://github.com/langchain-ai/deepagentsjs/commit/3657941ea36b21b9b512c1eb68a250ae79124383) Thanks [@ItayCoCo](https://github.com/ItayCoCo)! - fix: follow symlinks in sandbox find commands by adding -L flag to find invocations in buildLsCommand, buildFindCommand, and buildGrepCommand - [#486](https://github.com/langchain-ai/deepagentsjs/pull/486) [`998d772`](https://github.com/langchain-ai/deepagentsjs/commit/998d772a07acc76fcc0d419e65b3c74a64d9ac52) Thanks [@colifran](https://github.com/colifran)! - feat(quickjs): remove built-in VFS globals, add PTC instance injection and StateBackend read-your-writes - [#470](https://github.com/langchain-ai/deepagentsjs/pull/470) [`55f3bd8`](https://github.com/langchain-ai/deepagentsjs/commit/55f3bd8d74cac22d124fd6d1b11538dc2c2c2aec) Thanks [@jacoblee93](https://github.com/jacoblee93)! - Adds agent type metadata prop to configurable - [#451](https://github.com/langchain-ai/deepagentsjs/pull/451) [`79e20e1`](https://github.com/langchain-ai/deepagentsjs/commit/79e20e18082a19b65094b953cd857908a7525801) Thanks [@JadenKim-dev](https://github.com/JadenKim-dev)! - remove unconditional @langchain/anthropic import - [#465](https://github.com/langchain-ai/deepagentsjs/pull/465) [`2442d7d`](https://github.com/langchain-ai/deepagentsjs/commit/2442d7d080c8a1008197eda526de52400303dd72) Thanks [@hntrl](https://github.com/hntrl)! - fix(deepagents): route summarization through active request model - [#492](https://github.com/langchain-ai/deepagentsjs/pull/492) [`43cd121`](https://github.com/langchain-ai/deepagentsjs/commit/43cd121133562abf0dee76c6db01f2bde0eb3fd3) Thanks [@colifran](https://github.com/colifran)! - implement file system permissions for fs middleware tools - [#459](https://github.com/langchain-ai/deepagentsjs/pull/459) [`2994444`](https://github.com/langchain-ai/deepagentsjs/commit/2994444f32a6c0503defa6157652e742361abb00) Thanks [@open-swe](https://github.com/apps/open-swe)! - fix(deepagents): skill loading should default to 1000 lines ## @langchain/quickjs@0.2.6 ### Patch Changes - [#501](https://github.com/langchain-ai/deepagentsjs/pull/501) [`5b0eaea`](https://github.com/langchain-ai/deepagentsjs/commit/5b0eaea7b20461414983b71ba08d26d078b49214) Thanks [@sukhmanghotraa](https://github.com/sukhmanghotraa)! - fix: bump @langchain/core to ^1.1.42 across all workspace packages - [#496](https://github.com/langchain-ai/deepagentsjs/pull/496) [`8fd575f`](https://github.com/langchain-ai/deepagentsjs/commit/8fd575f06ca27cb0bef1a649aa34124a2c04ddd3) Thanks [@colifran](https://github.com/colifran)! - feat(deepagents): implement functional skills for quickjs middleware - [#486](https://github.com/langchain-ai/deepagentsjs/pull/486) [`998d772`](https://github.com/langchain-ai/deepagentsjs/commit/998d772a07acc76fcc0d419e65b3c74a64d9ac52) Thanks [@colifran](https://github.com/colifran)! - feat(quickjs): remove built-in VFS globals, add PTC instance injection and StateBackend read-your-writes - [#498](https://github.com/langchain-ai/deepagentsjs/pull/498) [`192bbd7`](https://github.com/langchain-ai/deepagentsjs/commit/192bbd7109817a826aa6bd982e16b54b5a5c8cb5) Thanks [@colifran](https://github.com/colifran)! - fix(quickjs): bound console buffering at capture time - [#497](https://github.com/langchain-ai/deepagentsjs/pull/497) [`79dcf9a`](https://github.com/langchain-ai/deepagentsjs/commit/79dcf9ae4567fcce71ea7e529f332baf6a3d6dcd) Thanks [@colifran](https://github.com/colifran)! - feat(quickjs): add maxPtcCallsbudget for ptc calls - [#492](https://github.com/langchain-ai/deepagentsjs/pull/492) [`43cd121`](https://github.com/langchain-ai/deepagentsjs/commit/43cd121133562abf0dee76c6db01f2bde0eb3fd3) Thanks [@colifran](https://github.com/colifran)! - implement file system permissions for fs middleware tools - [#494](https://github.com/langchain-ai/deepagentsjs/pull/494) [`e64c7e3`](https://github.com/langchain-ai/deepagentsjs/commit/e64c7e31a7e62929d5d2a9048ad7df3315a546cd) Thanks [@colifran](https://github.com/colifran)! - feat(quickjs): implement delete session in after agent hook to clean up completed repl sessions - [#499](https://github.com/langchain-ai/deepagentsjs/pull/499) [`352e487`](https://github.com/langchain-ai/deepagentsjs/commit/352e4876679fb708d9690ffeab82363ba02677dc) Thanks [@hntrl](https://github.com/hntrl)! - fix(quickjs): add ls_code_input_language metadata to js_eval tool ## @deepagents/evals@0.0.8 ### Patch Changes - Updated dependencies \[[`5b0eaea`](https://github.com/langchain-ai/deepagentsjs/commit/5b0eaea7b20461414983b71ba08d26d078b49214), [`e90171a`](https://github.com/langchain-ai/deepagentsjs/commit/e90171abe4bcc76767246be470a7b17b94692f41), [`8fd575f`](https://github.com/langchain-ai/deepagentsjs/commit/8fd575f06ca27cb0bef1a649aa34124a2c04ddd3), [`3657941`](https://github.com/langchain-ai/deepagentsjs/commit/3657941ea36b21b9b512c1eb68a250ae79124383), [`998d772`](https://github.com/langchain-ai/deepagentsjs/commit/998d772a07acc76fcc0d419e65b3c74a64d9ac52), [`55f3bd8`](https://github.com/langchain-ai/deepagentsjs/commit/55f3bd8d74cac22d124fd6d1b11538dc2c2c2aec), [`79e20e1`](https://github.com/langchain-ai/deepagentsjs/commit/79e20e18082a19b65094b953cd857908a7525801), [`2442d7d`](https://github.com/langchain-ai/deepagentsjs/commit/2442d7d080c8a1008197eda526de52400303dd72), [`43cd121`](https://github.com/langchain-ai/deepagentsjs/commit/43cd121133562abf0dee76c6db01f2bde0eb3fd3), [`2994444`](https://github.com/langchain-ai/deepagentsjs/commit/2994444f32a6c0503defa6157652e742361abb00)]: - deepagents@1.9.1 --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Hunter Lovell <hunter@hntrl.io>
@deepagents/evals
Generic eval harness for deepagents. Provides the runner interface,
runner registry, trajectory parsing, and custom vitest matchers with
LangSmith feedback integration.
Package exports
| Export | Description |
|---|---|
@deepagents/evals |
Core harness — EvalRunner, registry functions, parseTrajectory, getFinalText, custom matchers |
@deepagents/evals/deepagent |
registerDeepAgentRunner() — wires createDeepAgent into the generic runner interface |
@deepagents/evals/setup |
Side-effect import that registers all concrete runners (sonnet-4-5, gpt-4.1, etc.) |
Core concepts
EvalRunner
The central interface. A runner has a name, a run() method, and an
extend() method:
interface EvalRunner {
name: string;
run(params: RunAgentParams): Promise<AgentTrajectory>;
extend(overrides: Record<string, unknown>): EvalRunner;
}
run()takes invocation params only —{ query, initialFiles? }.extend()returns a new runner with agent configuration overrides (e.g.systemPrompt,tools,subagents) baked in. This keeps "what the agent is" separate from "what to ask it".
RunAgentParams
interface RunAgentParams {
query: string;
initialFiles?: Record<string, string>;
}
Pure invocation inputs. query is the user message; initialFiles seeds the
agent's virtual file system.
AgentTrajectory
interface AgentTrajectory {
steps: AgentStep[];
files: Record<string, string>;
}
The output of every run() call. steps is an ordered list of agent
turns (each containing an AIMessage action and any ToolMessage
observations). files is the final file-system snapshot.
Runner registry
flowchart LR
setup["setup.ts<br/><i>vitest setupFile</i>"]
deepagent["deepagent.ts<br/>registerDeepAgentRunner()"]
registry["index.ts<br/>registerRunner()"]
resolve["resolveRunner(name)"]
default["getDefaultRunner()<br/>reads EVAL_RUNNER env"]
test["test file<br/>runner.run() / runner.extend()"]
setup -- "calls for each model" --> deepagent
deepagent -- "wraps in DeepAgentEvalRunner" --> registry
default -- "looks up by name" --> registry
resolve -- "looks up by name" --> registry
test --> default
test --> resolve
setup.tsis loaded as a vitestsetupFile. It callsregisterDeepAgentRunner()for each model, which internally callsregisterRunner().getDefaultRunner()reads theEVAL_RUNNERenv var, looks up the runner by name, and returns it (cached).resolveRunner(name)is the lower-level lookup if you need a specific runner by name.
registerDeepAgentRunner
Bridges createDeepAgent to the generic EvalRunner interface:
registerDeepAgentRunner("sonnet-4-5", (config) =>
createDeepAgent({
...config,
model: new ChatAnthropic({ model: "claude-sonnet-4-5-20250929" }),
}),
);
The factory receives optional overrides (from extend()) and must return
an invokable agent. A default agent (no overrides) is built eagerly at
registration time and reused across run() calls for performance.
When extend() is called, a fresh agent is constructed with the overrides.
The DeepAgentEvalRunner handles:
- Converting
initialFilesstrings into theFileDataformat expected by the agent's state backend - Generating a unique
thread_idper invocation - Calling
ls.logOutputs()for LangSmith experiment tracking - Parsing the raw LangGraph result into an
AgentTrajectory
Custom vitest matchers
Imported automatically when you import from @deepagents/evals.
Each matcher also logs LangSmith feedback (scores) so results appear in
the experiment dashboard.
| Matcher | Description |
|---|---|
toHaveAgentSteps(n) |
Trajectory has exactly n steps |
toHaveToolCallRequests(n) |
Total tool-call count equals n |
toHaveToolCallInStep(step, match) |
Step (1-indexed) contains a tool call matching { name, argsContains?, argsEquals? } |
toHaveFinalTextContaining(text, caseInsensitive?) |
Last step's text content includes text |
Adding a new runner
To add support for a new model, add a registerDeepAgentRunner call in
src/setup.ts:
registerDeepAgentRunner("my-model", (config) =>
createDeepAgent({ ...config, model: new ChatMyProvider({ model: "my-model" }) }),
);
Then run evals with EVAL_RUNNER=my-model.
To add a completely different runner backend (not deepagents), implement
the EvalRunner interface directly and call registerRunner(), or use
the runner directly inside of the eval suite.
Development
pnpm build # Build with tsdown
pnpm typecheck # Type-check without emitting