pinecall agent
The agent's settings in the sandbox and in production, its versions and its knowledge.
pinecall agent [--agent <slug>] [--json]
pinecall agent list · stop <app>
pinecall agent set [--voice x] [--tts x] [--tts-model x] [--stt x] [--llm x] [--temperature n] [--language en|es|pt-BR…]
[--llm-builds Class] [--llm-option key=value …] [--stt-builds Class] [--stt-option key=value …]
[--tts-builds Class] [--tts-option key=value …]
[--judge x] [--judge-builds Class] [--judge-option key=value …]
[--greeting '…' | --greeting improvise[:'…']] [--greeting-interruptible on|off]
[--hangup '…' | --hangup any] [--end-of-turn stt|livekit|smart-turn] [--endpointing-ms n] [--min-interruption-words n]
[--eot-threshold 0.5-0.9] [--eager-eot-threshold 0.3-0.9] [--record on|off]
[--max-duration 1-60|off]
[--remember '…' …] [--forget '…' …] [--team] [--note '…']
pinecall agent knowledge [--team] · knowledge edit [--team] [--note '…']
pinecall agent clear [voice|tts|tts-model|stt|end-of-turn|llm|temperature|llm-builds|llm-options|stt-builds|stt-options|tts-builds|tts-options
|judge|judge-builds|judge-options|language|greeting|hangup|turn|memory|record|max-duration|knowledge|bases …] [--team]
pinecall agent history [--team] · diff [--against team|production] · rollback <version> [--team]
pinecall agent pull [--team] · push <file> [--team]
… and any of them with --prod, in production
$ pinecall agent
clinica-norte · sandbox
yours team production
voice class class class
tts — — —
tts model — — —
stt — deepgram deepgram
llm — anthropic/claude-haiku-5-5 anthropic/claude-haiku-5-5
language — es es
greeting — "Thanks for calling Clíni… "Thanks for calling Clíni…
hangup — when the person has what… when the person has what…
turn — — —
memory — remember 4 · forget 1 remember 4 · forget 1
record — — keeps the audio
knowledge — 2,140 chars 2,140 chars
bases — clinica-norte (k 4) clinica-norte (k 4)
yours: v3 · m_ana · 2026-09-19 14:32 · "flat on the phone" · team: v11 · m_bruno · 2026-09-18 10:04 · production: v11 · m_ana · 2026-09-12 …
What an agent runs on is its settings', unless its class declares it — per environment, per
corner, a version a row (the runtime's docs/protocol/settings-api.md). The class declares the
contract: its tools, its state, its render(). The language, the voice, the models, the opening,
how a call ends, how a turn is cut, what is remembered, what is known by heart and which bases are
searched are settings, kept by the gateway and laid over the class at the one place every
session is built. A class may declare any of them itself (@voice, @llm, @stt and its static
fields; the site's Settings in the class), and what the class declares wins: the table prints
class for that field in every corner — voice above — and a set or a clear that changes it is
refused, nothing saved, in the gateway's sentence: voice set by the class of clinica-norte: the class's declaration wins over these settings, so change it there, or take it out of the class to set it here. --tts and --tts-model are the class's voice; --temperature, --llm-builds and
--llm-option its llm; --stt-builds, --stt-option and --end-of-turn its stt; --judge-builds and
--judge-option its judge (@judge). Which fields are fixed is
what the process holding the agent in that environment declared: with none holding it, none is.
How a call opens and ends is words, or the model's own. --greeting '…' is said as written;
--greeting improvise has the model open on its prompt, and --greeting improvise:'…' with an
instruction for the opening. The caller cannot cut the opening short unless
--greeting-interruptible on. --hangup '…' is when the model may end the call, in your words;
--hangup any whenever it judges the call done. --end-of-turn is who says the caller's turn is
over: stt, the ears themselves (Deepgram Flux; refused for ears that cannot), or livekit and
smart-turn (Smart Turn v3), a model on the worker that runs on any key. Unset, ears that do not
end the turn themselves run Smart Turn v3 (runtime 0.1.44), so Soniox needs no flag for it.
A plugin's own class and options are three pairs of flags, one per stage. --llm-builds names a
class of the vendor's LiveKit plugin other than its default, a dot reaching into a module of it
(responses.LLM); --llm-option key=value passes one keyword argument as the plugin names it, and
repeats — the value read as JSON when it is JSON (true, 1000, [1,2]), as text otherwise. The
options a row sets replace the whole list it had; clear llm-options takes them out. Each one
replaces Pinecall's option of the same name for the vendor. A set that changes them tries the stage
once before anything is kept, so a class the plugin does not export, or an argument it does not
take, is refused in its own words. They run only on the org's own key for the vendor: on a key
Pinecall lends, the set is refused with llm options and builds run on the org's own openai key, and this agent's llm would run on the platform's: add yours with pinecall providers add openai, or take them out — an option can point a plugin at another server, and a lent key never goes anywhere but the
vendor. --temperature is the model's, in the vendor's own range, and runs on any key.
The model the agent's calls are judged on is --judge, named as --llm is — vendor/model, a
vendor, a model, a tier — with --judge-builds and --judge-option beside it as the --llm pair
is. It wins over the org's (pinecall judging --model), which wins over Pinecall's. On the org's
own key for the vendor its evals are never billed, and a local model is that vendor's plugin
pointed at your server: --judge openai/qwen3-32b --judge-option base_url=http://gpu:8000/v1. The
options run on your own key alone, as every stage's do. clear judge goes back to the org's.
How a turn is decided is four numbers, and two of them are confidences. --endpointing-ms is
the longest silence a caller is left in before the turn is called finished, and
--min-interruption-words how many words it takes to stop the agent mid-sentence. The other two
are for a recogniser that decides the end of a turn itself — Deepgram Flux, which is the
runtime's own ears: --eot-threshold is how sure it must be before it ends one, and
--eager-eot-threshold the lower bar at which it says a turn MIGHT be over, which is what lets
the model start on an answer that is thrown away if the caller carries on.
The first of those is the knob that decides whether an agent answers half a sentence. Deepgram's
own measurement of its default, 0.7, is that as much as a fifth of the turns it ends were ended
before the person had finished speaking — on a line, an agent that replies to the first half of
"normal cleaning needed, it gets done every couple of months" and runs a tool on half the facts.
--eot-threshold 0.85 --eager-eot-threshold 0.4 is Deepgram's own pairing for a line that must
not cut anybody off: the turn is committed only when Flux is sure, and the latency that would
cost is bought back by the eager bar. The eager one may never sit above the other, and a set that
would is refused before it is written.
--record on|off says whether this agent's calls keep their audio, and it is typed rather
than being a bare flag because the answer worth being able to give is no. A corner that sets it
decides for the copies built there; a corner that says nothing falls through to the one below, and
an agent nobody has told keeps its audio. What is kept is the whole room — the caller, the agent,
the hold music, and a supervisor who took the line — served back by the console's session screen
and by pinecall sessions. pinecall agent clear record gives the answer back to the corner below.
--max-duration 1-60|off is the longest a voice call of this agent runs, in minutes; unset
anywhere it is ten. A minute before it the agent is told to close and say goodbye, and at it the
call ends after the sentence being said — timeout by the platform in the call's log. off is
no limit. It holds on the phone and on the widget's voice, never on a written conversation, and a
supervisor on the line does not stop the clock. pinecall agent clear max-duration gives it back
to the corner below.
--language <tag> is the language the agent's calls are in — en, es, pt-BR — and what
the voice, the ears and the turn-taking are set to; unset anywhere, each vendor keeps its own
default. It is not a field of the class, and a class that still declares language is refused at
load with this verb. The prompt does not follow it: the framework's own rules are English for
every agent, one of them is to answer in the language the caller speaks, and the class's docstring
and render() are in whatever language the tenant wrote them. A blank tag is refused with exit 2
and nothing is written; pinecall agent clear language takes it out of the corner.
A model knob takes a tier by its short name. --llm haiku · sonnet · opus are expanded
here to the model id the provider answers to — the same table pinecall test --model reads — so
the corner never holds a name that is a 404 at the vendor. haiku is claude-haiku-5-5. --llm <vendor>/<model>, a vendor
alone and a model alone travel as typed; a word that names no model at all (an empty one, half a
vendor/model) is refused with exit 2 and nothing is written.
Three corners. In the sandbox your key has a corner of its own: what you set is yours, and a
colleague's next call does not hear it — so two developers testing two voices never change each
other's. A corner that set nothing reads the team's ((team's) in your column), which is the org's
own corner, written with --team. Production has one corner, and --prod writes it directly:
pinecall agent set --voice carolina --note "warmer" --prod, by a person whose production switch
is on — the same change the production console's Settings tab makes. There is no promote between
the corners: what guards production is the goldens in CI before a deploy
(Production), and the history after it.
Versions. Every set is a new row; nothing is updated, nothing deleted. The whole set travels
with the version it was read at, so two people saving at once never write over each other: the
second is told this corner is at v4 now, not the version you read. history prints every version
with who set it, why, and what it changed; diff reads this corner against the team's or
production's; rollback <n> brings one back as the next version — rollback <n> --prod is how a
production change that went wrong is undone, in one line.
What is running, and where. list prints every process holding the org's agents in the environment
asked — one line an app socket: its id, the agents it holds, whose corner, the machine and address
it connected from, the SDK, and since when:
$ pinecall agent list --prod
app_7 clinica-norte the org's · web-1 (34.68.177.78) · pinecall/0.5.1 · since 2026-09-19 14:02
stop <app> closes that socket with the stopped code (POST /v1/apps/{app}/stop, a key with
app): the process prints stopped by <name> and exits instead of dialling back, and its agents
are free. A supervisor that restarts whatever exits — systemd's Restart=always, pm2 — starts it
again, so a process kept that way is stopped where it is supervised. An app on the SDK hears it on
pc.onStopped(why => …). The Overview's Processes card is the same list, with a Stop per row.
Git, for whoever wants it. pinecall agent pull > pinecall/clinica-norte.json writes the corner's
config as a file; pinecall agent push pinecall/clinica-norte.json --team sends it back as the next
version, with no version check — it is what CI applies, and push … --prod is what a release
applies to production. A corner that set nothing has nothing to pull: pull says so on stderr,
prints nothing and exits 1, so pull > file in a script fails rather than keeping an empty file.
agent knowledge#
pinecall agent knowledge [--team]
pinecall agent knowledge edit [--team] [--note '…']
What the agent knows by heart — the business as the org describes it, a page of Markdown:
hours, prices, what needs an authorisation, what to say when asked for the doctor's mobile. It
is one field of the settings, versioned like the rest, and the runtime reads it whole into
the prompt's static knowledge block on every call — so it is read once and cached, and never
searched. Alone, the verb prints the corner's text; edit opens it in $VISUAL or $EDITOR,
the way git commit does, and what you leave is the next version. An unchanged file writes
nothing; an empty one takes the field out. The console's Settings ▸ Knowledge is the same
textarea, and a supervisor's or a manager's key opens it (words) — the person who knows
the prices changes them, without a developer and without a deploy.
$ pinecall agent knowledge
clinica-norte knows nothing by heart in your corner: `pinecall agent knowledge edit` writes it
$ EDITOR=vim pinecall agent knowledge edit --team --note "prices for 2027"
clinica-norte · knowledge 2,140 chars · the team's corner v12
It is not the RAG. The documents a turn searches — a catalogue, a policy manual, anything
too long to read whole — are pinecall docs, attached to the same settings as bases.
pinecall agent prints the two on two rows: knowledge as a size, bases by name.