andreasronge
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-queryfrom 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: PTC-Runner Blog | ptc_runner blog
Links
Package: ptc_runner | Hex
Docs: PtcRunner v0.13.0 — Documentation
Source:
Popular in Announcing
Hi everyone,
I’m coming from the Symfony (PHP) framework. I like Phoenix, but it has a one thing that was build much better in the Symfo...
New
Hey everyone!
Well, we made this lib a while ago and now we decided to finally go out and public with it! It’s a tool for creating and m...
New
Hello everybody.
I have just released Jason - a new JSON library.
You might be wondering, why do we need a new library? The primary foc...
New
Yes, yet another parser combinator library!
Most of the parser combinators in the ecosystem are either compile-time, often using AST tra...
New
Currently just starting out on a new mini-project - getting zig NIFs to run in elixir.
https://github.com/ityonemo/zigler
The idea here...
New
After working on it for a couple of months and using it in production for most of that time, today I’ve released LiveAdmin, a LiveView ba...
New
Hello everyone!
I am excited to share our heart project Backpex with you.
After building several Phoenix applications, we realized that...
New
Other popular topics
Update:
How to use the Blogs & Podcasts section
You can post links to your blog posts or podcasts either in one of the Official Blog...
New
I have an umbrella app.
Some of the apps inside depend on other apps in the umbrella, unsurprisingly.
I’m writing a test for one of the...
New
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible.
total = 10
while total != 0
...
New
Phoenix 1.4.0 released
Phoenix 1.4 is out! This release ships with exciting new features, most notably
with HTTP2 support, improved deve...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









