mirror of
https://github.com/langchain-ai/deepagentsjs.git
synced 2026-07-18 16:04:44 -04:00
[PR #287] feat: Programmatic Tool Calling & Subagent Spawning for All Sandbox Providers #328
Open
opened 2026-06-05 17:22:41 -04:00 by yindo
·
0 comments
No Branch/Tag Specified
main
dependabot/npm_and_yarn/patch-deps-updates-main-c0f001c0f6
dependabot/npm_and_yarn/major-deps-updates-main-b7ceb5d816
dependabot/npm_and_yarn/minor-deps-updates-main-f52a01c0f6
dependabot/github_actions/major-deps-updates-5c183d6ffa
dependabot/github_actions/minor-deps-updates-38afab4f4d
dependabot/github_actions/patch-deps-updates-00a0d7aaea
dependabot/docker/examples/async-subagent-server/major-deps-updates-docker-4faa477378
feat/delete-backend-protocol
feat/write-file-overwrites
feat/recursive-delete-tool
corridor/fix-1119d955-1783568785287
open-swe/bump-langsmith-0-8-0
alex/initializer
cb/connectors-spec-19bb
open-swe/fs-interrupt-permissions
sydney/oolong-ptc-runners
cb/fs-permissions-interrupt-9517
hunter/swarm-oolong-eval
colifran/swarm-eval
colifran/interp-libs
colifran/workflow-poc
colifran/swarm-sub-mw-defaults
hunter/fix-ci-read-file-mime-guard
fix/filesystem-glob-suppress-permission-errors
hunter/middleware-replace-by-name
hunter/fix-node-vfs-absolute-exec-paths
colifran/lazy-skills
cb/fix-subagent-stream-same-type-isolation
fix/acp-filesystem-virtual-mode
colifran/skill-dist
colifran/skill-cli
open-swe/9065a8d9-c0c3-5c29-b106-1a195b97ddbd
colifran/permissions
colifran/repl-swarm
hunter/quickjs-pending-write-reads
colifran/swarm-in-repl
jacob/subagents
jacob/subagenttype
open-swe/7460276d-5f03-10ca-8a53-7653699f1133
colifran/swarm-tool
hunter/fix-sandbox-find-follow-symlinks
open-swe/dfd00850-86b7-5f87-2c10-3bd968b1c75e
colifran/swarm-refactor
colifran/swarm-table
colifran/swarm
open-swe/8d89ab28-9b47-3a19-427b-aacfa4c5d099
open-swe/086c3d27-2ff0-ebf5-5d74-4d35e38083c5
open-swe/23f64c62-afe9-dc40-bbe0-c86a558611b3
hunter/namespace-factories
alpha
baseten-integration
colifran/deprecate-backend-factories
colifran/agent-protocol-poc
colifran/a2a-subagents
ci/add-codeql-scanning
colifran/async-example
colifran/async-subagents-example
1.9.0-alpha.1
colifran/backend-rename
hunter/js-queue-lookahead-middleware
cb/secure-exec
cb/pass-checkpointer
colifran/multimodal-refactor-pr2
structured-output-evals
subagent-structured-output
colifran/multimodal-refactor-pr1
cb/async-agents
hunter/repl-rlm
cb/ptc-repl-network-policy
cb/ptc-repl
cb/ptc
open-swe/020b364c-2a7f-e2b2-30e0-4593befd0490
add-evals
hunter/structured-output-eval
cb/composite-fix
hunter/async-subagents
hunter/relo-evals
cb/summarization-improvements
hunter/deepbash
harbor-evals
hunter/trace-metadata
hunter/integration
cb/langsmith-sandbox
isolate-agent-skills
hunter/batch-task
fix-memory-load-state
add-e2e-test
cb/add-streaming-example
copilot/fix-partial-file-updates
copilot/fix-file-state-loss
nh/release-1.0.0
dqbd/fs-store
hunter/v1
dqbd/js
cb/createAgent-migration
cb/repo-update
palash/add-built-in-toosl
palash/skip-tools
palash/add-interrupt-config
brace/bump-langgraph
open-swe/6f37e688-42f4-458b-a26a-9de18f1c5ab8
palash/post-model-hook
palash/add-local
palash/add-post-model-hook-interrupt
palash/final-touch-ups
palash/subagent-fix
palash/add-langgraph-server
palash/update-readme
palash/change-name-to-deepagents
palash/fix-anthropic-zod-import
brace/fixes
open-swe/8357536e-2207-4292-a24d-00ea431ed4d4
open-swe/9453f008-7578-458d-bb92-e729e9fca363
deepagents@1.11.1
deepagents-acp@0.1.20
deepagents@1.11.0
deepagents-acp@0.1.19
@langchain/node-vfs@0.2.1
deepagents@1.10.8
deepagents-acp@0.1.18
deepagents@1.10.7
deepagents-acp@0.1.17
deepagents@1.10.6
deepagents-acp@0.1.16
@langchain/quickjs@0.6.0
@langchain/modal@0.1.5
@langchain/daytona@0.2.1
deepagents@1.10.5
deepagents-acp@0.1.15
@langchain/quickjs@0.5.1
deepagents@1.10.4
deepagents-acp@0.1.14
@langchain/quickjs@0.5.0
@langchain/node-vfs@0.2.0
deepagents@1.10.2
deepagents-acp@0.1.12
deepagents@1.10.1
deepagents-acp@0.1.11
@langchain/quickjs@0.4.0
deepagents@1.10.0
deepagents-acp@0.1.10
@langchain/quickjs@0.3.0
deepagents@1.9.1
deepagents-acp@0.1.9
@langchain/quickjs@0.2.6
deepagents@1.9.0
deepagents-acp@0.1.8
@langchain/sandbox-standard-tests@1.0.0
@langchain/quickjs@0.2.5
@langchain/node-vfs@0.1.4
@langchain/modal@0.1.4
deepagents@1.9.0-alpha.1
deepagents-acp@0.1.8-alpha.0
@langchain/quickjs@0.2.5-alpha.0
@langchain/node-vfs@0.1.4-alpha.0
@langchain/modal@0.1.4-alpha.0
@langchain/deno@0.2.2-alpha.0
@langchain/daytona@0.2.0-alpha.0
deepagents@1.8.8
deepagents-acp@0.1.7
@langchain/quickjs@0.2.4
deepagents@1.8.7
deepagents-acp@0.1.6
@langchain/quickjs@0.2.3
@langchain/daytona@0.2.0
deepagents@1.8.6
deepagents-acp@0.1.5
@langchain/quickjs@0.2.2
@langchain/deno@0.2.2
deepagents@1.9.0-alpha.0
deepagents-acp@0.1.5-alpha.0
@langchain/sandbox-standard-tests@1.0.0-alpha.0
@langchain/quickjs@1.0.0-alpha.0
@langchain/node-vfs@1.0.0-alpha.0
@langchain/modal@1.0.0-alpha.0
@langchain/deno@1.0.0-alpha.0
@langchain/daytona@1.0.0-alpha.0
deepagents@1.8.5
deepagents-acp@0.1.4
@langchain/quickjs@0.2.1
@langchain/node-vfs@0.1.3
deepagents@1.8.3
deepagents-acp@0.1.2
deepagents-acp@0.1.0
deepagents@1.8.1
@langchain/modal@0.1.3
deepagents@1.8.0
@langchain/sandbox-standard-tests@0.1.0
@langchain/node-vfs@0.1.2
@langchain/deno@0.2.1
@langchain/daytona@0.1.2
deepagents@1.7.6
deepagents@1.7.5
deepagents@1.7.4
@langchain/deno@0.2.0
@langchain/deno@0.1.2
deepagents@1.7.3
deepagents@1.7.2
@langchain/modal@0.1.2
deepagents@1.7.1
@langchain/node-vfs@0.1.1
@langchain/modal@0.1.1
@langchain/deno@0.1.1
@langchain/daytona@0.1.1
deepagents@1.7.0
@langchain/node-vfs@0.1.0
@langchain/modal@0.1.0
@langchain/deno@0.1.0
@langchain/daytona@0.1.0
deepagents@1.6.3
deepagents@1.6.2
deepagents@1.6.1
deepagents@1.6.0
deepagents@1.5.1
deepagents@1.5.0
deepagents@1.4.2
deepagents@1.4.1
deepagents@1.4.0
v1.3.1
v1.3.0
v1.2.0
v1.1.1
v1.1.0
No Label
pull-request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: langchain-ai/deepagentsjs#328
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/langchain-ai/deepagentsjs/pull/287
Author: @christian-bromann
Created: 3/8/2026
Status: 🔄 Open
Base:
main← Head:cb/ptc📝 Commits (7)
bb4bf52feat(deepagents): support for PTC in all sandboxes9800a3fstore tracesff2ea45demo update6098276improve prompt and exampleec7576bformat + lintde866bemake PTC and subagent spawning work via scriptsfafd0bdfix test📊 Changes
26 files changed (+3812 additions, -1009 deletions)
View changed files
📝
.gitignore(+2 -1)📝
examples/package.json(+3 -3)➕
examples/sandbox/sandbox-ptc-node.ts(+118 -0)➕
examples/sandbox/sandbox-ptc-python.ts(+118 -0)➕
examples/sandbox/sandbox-ptc.ts(+177 -0)➕
examples/sandbox/skills/employee-classifier/SKILL.md(+92 -0)➕
examples/sandbox/utils/sandbox-ptc.ts(+129 -0)📝
libs/deepagents/package.json(+6 -6)📝
libs/deepagents/src/agent.test-d.ts(+2 -2)📝
libs/deepagents/src/backends/index.ts(+1 -0)📝
libs/deepagents/src/backends/protocol.ts(+36 -0)📝
libs/deepagents/src/index.ts(+11 -0)📝
libs/deepagents/src/middleware/index.ts(+6 -0)➕
libs/deepagents/src/sandbox-ptc/engine.int.test.ts(+303 -0)➕
libs/deepagents/src/sandbox-ptc/engine.test.ts(+354 -0)➕
libs/deepagents/src/sandbox-ptc/engine.ts(+306 -0)➕
libs/deepagents/src/sandbox-ptc/index.ts(+30 -0)➕
libs/deepagents/src/sandbox-ptc/middleware.ts(+188 -0)➕
libs/deepagents/src/sandbox-ptc/prompt.ts(+192 -0)➕
libs/deepagents/src/sandbox-ptc/runtimes.ts(+189 -0)...and 6 more files
📄 Description
This PR extends Programmatic Tool Calling (PTC) beyond QuickJS to every sandbox provider (Deno, Modal, Daytona, Node-VFS). Agents can now write bash scripts that call tools and spawn subagents in parallel directly from within the sandbox — enabling Recursive Language Model (RLM) patterns across all execution environments.
This is demonstrated by the example in
examples/sandbox/sandbox-ptc.ts:Motivation
The QuickJS provider already supports PTC through its WASM FFI bridge — tools are injected as JavaScript functions into the QuickJS context, and the agent calls them via
tools.webSearch({...})insidejs_eval. This works because QuickJS runs in-process; the host and guest share an address space.Shell-based sandboxes (Deno, Modal, Daytona, Node-VFS) had no equivalent. Code running inside these sandboxes could not call tools or spawn subagents during execution — the
executetool was fire-and-forget.Approach: QuickJS vs Sandbox PTC
context.newFunction()on the QuickJS C APIexecute()+ heredocawait tools.webSearch({query: "..."})(JS)result=$(tool_call web_search '{"query":"..."}')(bash)await tools.task({description: "..."})(JS)result=$(spawn_agent "Research X" "analyst")(bash)Promise.all([...])&) +waitArchitecture
IPC Protocol:
__DA_REQ__<uuid> <json>to stderr (single line, atomic underPIPE_BUF)/tmp/.da_ipc/res/<uuid>(status line + payload)$(...)command substitutionWhat's included
Core PTC engine (
libs/deepagents/src/sandbox-ptc/):engine.ts—PtcExecutionEnginewithStdoutScanner, IPC loop, tool call tracingruntimes.ts— Bash, Python, and Node.js runtime libraries (embedded strings)middleware.ts—createSandboxPtcMiddleware(opt-in, interceptsexecuteviawrapToolCall)prompt.ts— Auto-generates system prompt from tool schemas and subagent typestypes.ts—PtcToolCallTrace,PtcExecuteResult, IPC typesProtocol extension (
libs/deepagents/src/backends/protocol.ts):InteractiveProcessinterface (streaming stdout/stderr +writeFile+waitForExit)spawnInteractive()method onSandboxBackendProtocol(optional, enables PTC)Provider implementations (each adds
spawnInteractive()):@langchain/deno— nativeReadableStreamfromsandbox.spawn()@langchain/modal—ReadableStreamfromsandbox.exec()@langchain/node-vfs— Node.jschild_processstreams@langchain/daytona— background process + polling (SDK has no streaming API)Example (
examples/sandbox/sandbox-ptc.ts):createDeepAgentintegration with PTC middleware + analyst subagenttool_call classify_record+ 100 parallelspawn_agent "analyst"Usage
The middleware auto-injects a system prompt documenting
tool_callandspawn_agentwith per-tool API references generated from schemas. No manual prompt engineering needed.Tool call tracing
Every PTC-instrumented
executeresult includes a trace summary:The engine also returns structured
PtcToolCallTrace[]with name, input, result/error, and duration per call.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.