pinecallDocs
Configuring / pinecall agent

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
Terminal
$ 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:

Terminal
$ 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.

Terminal
$ 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.