Ptc_runner - Programmatic Tool Calling for LLM agents without Python sandbox

Build LLM agents that write and execute programs instead of reading data. ptc_runner lets LLMs generate PTC-Lisp programs that run deterministically in sandboxed BEAM processes — no Python runtime, no Docker containers.

Instead of stuffing thousands of records into an LLM’s context window, the LLM writes a small program that filters, aggregates and transforms the data computationally. Tool results stay in BEAM memory, the LLM only sees what it needs.

Features

  • purpose-built PTC-Lisp (Clojure inspired) language with minimal surface area — the language itself is the sandbox
  • process isolation with configurable timeouts and heap limits, one crash never takes anything else down
  • typed signatures with automatic retry — LLM gets structured feedback on errors, including process crashes (OOM, timeout), and adapts
  • transactional memory via def — data persists across turns without re-entering context
  • composable SubAgents with typed imports/exports — agents pass large datasets between each other through BEAM memory
  • parallel tool calling with pmap/pcalls — BEAM-native concurrency, no thread pool configuration
  • ad-hoc llm-query from within generated programs — combine computation and LLM judgment in one workflow
  • compiled SubAgents — LLM writes orchestration logic once, execute deterministically after that
  • telemetry spans for every turn, LLM call and tool call with parent-child correlation
  • trace viewer with Chrome DevTools flame chart export
  • JSON mode for single-turn structured output via Mustache templates

Based on the Programmatic Tool Calling concept from Anthropic: https://www.anthropic.com/engineering/advanced-tool-use

Blog post about the motivation and design: Stop Feeding Data to Your LLM. Let It Write Programs Instead. | ptc_runner blog

Links

Package: ptc_runner | Hex
Docs: PtcRunner v0.7.0 — Documentation
Source:

2 Likes