Skip to main content

pinecall

Voice AI that runs where you do. Pinecall is a self-hosted runtime for voice agents: phone calls, web voice, chat and WhatsApp, on your box, your carrier, your models.

This repository is the runtime: the gateway that answers the doors and the worker that runs the calls, one Python package, one wheel, on LiveKit. It runs Pinecall's own production (box.pinecall.io) and its sandbox on one box. The agents are written with the SDK, in pinecall/agents (TypeScript) or the Ruby SDK, and talk to this runtime over the wire pinecall/wire/ declares. Nothing here is imported by an agent.

$ git clone https://github.com/pinecall/runtime && cd runtime
$ uv sync                      # Python 3.12, one venv, every dev tool
$ make check                   # the rules and every suite that needs no database
$ make test                    # every suite, on a throwaway Postgres (colima or docker)

docs/architecture.md is the map: what each folder does and what it may import. docs/glossary.md defines the ten words of the domain. docs/conventions.md says how a file is written. examples/ walks an inbound number, an outbound call and a chat with curl.

What it is

  • Any vendor, no list. Every LiveKit plugin works out of the box: the model, the ears and the voice are whatever is installed and keyed. Bring your own key, or use the box's. Nothing in the code decides which models you may run.
  • One deployment, two worlds. Production and sandbox on one gateway and one database, each with its own worker fleet and its own name. One login, one key, a switch in the console.
  • The log is the product. Every call is an append-only log: what was said, what the model read, every tool call and its answer, every measure LiveKit took, the judges' verdicts at hang-up. The console, the CLI and the API read the same log.
  • Compliance is built in, and provable. Calling hours and a frequency cap by destination, consent on file and a do-not-call list the agent honours with one call, the AI disclosure and the recording notice said before the greeting and logged, judges that settle by code whether a call identified the business and honoured a "stop". Erasure through one path the append-only trigger admits, with a trail; retention per org; an export in one request; an access log of who read what; call records kept 24 months for a carrier's traceback; encrypted nightly backups.
  • A wheel, not a checkout. A deploy is one file copied to the box and three units restarted. Migrations run before the gateway comes up; a deploy never cuts a call.
  • Three hops from a door to its effect, enforced by tests the commit hook runs. No registries, no layers, no vendor named in code.

What runs

The call's log; voice and text on one session; tenants, people, keys and sign-in (password, one-use codes, SSO); numbers from any carrier account and outbound calls with their guards; WhatsApp; knowledge bases and contact memory looked up in the call; goldens, simulated callers and judges; every operator door and verb; a fleet per world that grows through a cloud script; the console served at the box's names. Coming: local models end to end (the model, the ears and the voice on your own hardware).

Where to start reading

  • docs/from-zero.md walks a box to its first call; docs/a-box-in-production.md is what a box keeps, backs up and forgets.
  • docs/protocol/gateway-api.md is every door a tenant's code knocks at, and docs/protocol/every-door.md all of them in one table.
  • docs/protocol/numbers.md is the phone side: carriers, numbers, dials and their guards.
  • docs/the-runtime-cli.md is the operator's terminal; docs/the-environment.md names every variable.
  • docs/wire/ describes every frame, event and command on the wire.

Working on it

make check      the rules and the suites that need no database
make test       every suite, on a local Postgres in colima (T=tests/log for one folder)
make hooks      install the pre-commit hook (runs `make check`)
make deploy     the console built in, a wheel, released on the box, the live suite, the journal

Python 3.12 and uv; colima for the suites that need Postgres (make db). Nothing runs LiveKit locally. Apache-2.0.

Metadata

Release files for pinecall 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for pinecall 0.1.1
File Interpreter ABI Platform
pinecall-0.1.1-py3-none-any.whl Python 3 none any Details

Release files / pinecall-0.1.1-py3-none-any.whl

Download URL pinecall-0.1.1-py3-none-any.whl
Size 1.1 MB
Tags Python 3
SHA-256 checksum
How to use checksums
b3167785ba071205e7fdfb15c3474e425d414beedd194977db5f9fc832ac96ce
BLAKE2b-256 checksum
How to use checksums
f92e2b75c040c154d86785e5c7da328cfe1d3fa355c63975ea82aaeab9aed253
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release history Release notifications | RSS feed

0.10.0

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.6

2 release files

0.1.5

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

This release

0.1.1 This release

1 release file

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page