Protocol Documentation

From docs/api/aulo.v1.md at 0950448 View on GitHub

Table of Contents

<p align="right"><a href="#top">Top</a></p>

aulo/v1/common.proto

ModelRef

A provider-qualified model, for example provider "anthropic" and model "claude-sonnet-5-5". Both parts are the ids ConfigService.ListModels returns.

FieldTypeLabelDescription
providerstringProvider id from [providers.*] in the config. At most 64 bytes.
modelstringModel id as the provider names it. At most 128 bytes.

ApprovalDecision

How a human answered an approval. Voice never widens access: when ApprovalRequired.needs_click is true, only a deliberate click or key may produce one of these.

NameNumberDescription
APPROVAL_DECISION_UNSPECIFIED0
APPROVAL_DECISION_ALLOW_ONCE1Run this call once.
APPROVAL_DECISION_ALLOW_CHAT2Allow this tool and subject for the rest of this chat.
APPROVAL_DECISION_ALLOW_ALWAYS3Allow this tool and subject from now on; stored as a grant.
APPROVAL_DECISION_DENY_ONCE4Refuse this call once.
APPROVAL_DECISION_DENY_ALWAYS5Refuse this tool and subject from now on; stored as a grant.

ToolCallStatus

Where a tool call is in its life.

NameNumberDescription
TOOL_CALL_STATUS_UNSPECIFIED0
TOOL_CALL_STATUS_RUNNING1
TOOL_CALL_STATUS_SUCCEEDED2
TOOL_CALL_STATUS_FAILED3
TOOL_CALL_STATUS_DENIED4Policy or a human refused it; it never ran.
TOOL_CALL_STATUS_CANCELLED5The turn was interrupted while it ran.

<p align="right"><a href="#top">Top</a></p>

aulo/v1/event.proto

ApprovalRequired

The agent wants to run a call that policy sent to Ask. Any attached client may answer with ApprovalService.Decide or a Converse decision; no answer before the server timeout means deny.

FieldTypeLabelDescription
chat_idstringULID.
turn_idstringULID.
call_idstringULID.
toolstringTool name, for example "shell" or "mcp__server__tool". Untrusted: plugin and MCP names come from third parties. At most 128 bytes.
summarystringHuman-readable description of the call, built from model-chosen arguments. Untrusted; render as plain text. At most 2 KiB; secrets appear as handles.
needs_clickboolVoice never widens access: when true, only a click or key approves.

ApprovalResolved

An approval was answered, so every other attached client can dismiss its prompt.

FieldTypeLabelDescription
call_idstringULID.
decisionApprovalDecision
timed_outboolTrue when nobody answered in time and the server denied.

Event

One event pushed to a client. The first block of variants mirrors aulo-types AuloEvent one to one (same names, same fields), so the server maps them without a translation table. The second block carries the agent loop: the turn, its streamed text and its tool calls.

Events never carry audio samples: TTS audio travels as VoiceService TtsAudio messages so events stay small and the audio path stays bounded.

FieldTypeLabelDescription
voice_stateVoiceStateChangedMirrors of AuloEvent.
speech_startedSpeechStarted
speech_endedSpeechEnded
transcriptTranscript
tts_chunkTtsChunk
approval_requiredApprovalRequired
takeover_requestedTakeoverRequested
noticeNotice
turn_startedTurnStartedAgent loop.
text_deltaTextDelta
tool_call_startedToolCallStarted
tool_call_outputToolCallOutput
tool_call_finishedToolCallFinished
approval_resolvedApprovalResolved
turn_finishedTurnFinished

Notice

FieldTypeLabelDescription
levelNoticeLevel
messagestringUntrusted when it quotes a plugin, MCP server or engine. At most 2 KiB.
sourcestringoptionalThe engine, server or plugin the notice is about, if any.

SpeechEnded

FieldTypeLabelDescription
at_msuint64

SpeechStarted

FieldTypeLabelDescription
at_msuint64Offset into the capture stream, so clients can align it with audio.

TakeoverRequested

FieldTypeLabelDescription
chat_idstringULID.
call_idstringULID.
reasonTakeoverReason

TextDelta

A streamed piece of the assistant reply. Concatenate deltas of one turn in arrival order.

FieldTypeLabelDescription
turn_idstringULID.
textstringUntrusted model output. At most 16 KiB per delta.

ToolCallFinished

FieldTypeLabelDescription
call_idstringULID.
statusToolCallStatus

ToolCallOutput

A streamed piece of tool output.

FieldTypeLabelDescription
call_idstringULID.
textstringUntrusted: tool, web and plugin output. At most 16 KiB per event and truncated server-side beyond a per-call total.

ToolCallStarted

FieldTypeLabelDescription
turn_idstringULID.
call_idstringULID.
toolstringUntrusted; see ApprovalRequired.tool.
arguments_jsonstringModel-chosen arguments as a JSON object. Untrusted. Truncated server-side to 16 KiB for display; the persisted call keeps the full text.

Transcript

FieldTypeLabelDescription
turn_idstringULID.
kindTranscriptKind
textstringUntrusted: STT output of whatever was said or played near the microphone. At most 64 KiB; the server truncates longer text.
languagestringoptionalBCP 47 tag when the engine detected or was told the language.

TtsChunk

Metadata of one synthesized audio chunk. The samples follow in the matching TtsAudio message (same turn_id and seq) on the Talk stream.

FieldTypeLabelDescription
turn_idstringULID.
sequint32Position in the reply, so a client can detect a dropped chunk.
sample_rate_hzuint32
channelsuint32Rust side is u8; protobuf has no 8-bit integer.
duration_msuint32
lastboolTrue on the last chunk of the reply.

TurnFinished

FieldTypeLabelDescription
turn_idstringULID.
reasonTurnEndReason
errorstringoptionalSet when reason is FAILED. Server-written, no secrets, at most 2 KiB.

TurnStarted

A user turn was accepted and the agent started on it.

FieldTypeLabelDescription
turn_idstringULID, assigned by the server.

VoiceStateChanged

AuloEvent::VoiceState. Named Changed because the enum already owns the name.

FieldTypeLabelDescription
stateVoiceState

NoticeLevel

Severity of a Notice.

NameNumberDescription
NOTICE_LEVEL_UNSPECIFIED0
NOTICE_LEVEL_INFO1
NOTICE_LEVEL_WARN2
NOTICE_LEVEL_ERROR3

TakeoverReason

What a human has to do themselves because the agent must not.

NameNumberDescription
TAKEOVER_REASON_UNSPECIFIED0
TAKEOVER_REASON_PASSWORD1
TAKEOVER_REASON_TWO_FACTOR2
TAKEOVER_REASON_CAPTCHA3
TAKEOVER_REASON_OTHER4

TranscriptKind

Whether a transcript may still change.

NameNumberDescription
TRANSCRIPT_KIND_UNSPECIFIED0
TRANSCRIPT_KIND_PARTIAL1A streaming hypothesis the engine may revise.
TRANSCRIPT_KIND_FINAL2The engine's committed text for the utterance.

TurnEndReason

Why a turn ended.

NameNumberDescription
TURN_END_REASON_UNSPECIFIED0
TURN_END_REASON_COMPLETED1
TURN_END_REASON_INTERRUPTED2
TURN_END_REASON_FAILED3
TURN_END_REASON_MAX_STEPS4The agent hit its step limit before finishing.

VoiceState

Where the voice pipeline is for the current client.

NameNumberDescription
VOICE_STATE_UNSPECIFIED0
VOICE_STATE_IDLE1
VOICE_STATE_LISTENING2
VOICE_STATE_THINKING3
VOICE_STATE_SPEAKING4

<p align="right"><a href="#top">Top</a></p>

aulo/v1/approval.proto

DecideRequest

FieldTypeLabelDescription
call_idstringULID.
decisionApprovalDecision

DecideResponse

Grant

A standing answer stored by an ALLOW_ALWAYS or DENY_ALWAYS decision.

FieldTypeLabelDescription
idstringULID.
subjectstringWhat the grant covers, written by aulo-policy; opaque to clients, which show it and never build one.
scopestring
decisionGrantDecision
expires_atgoogle.protobuf.TimestampoptionalAbsent means it never expires.
created_atgoogle.protobuf.Timestamp

ListGrantsRequest

FieldTypeLabelDescription
page_sizeuint32
page_tokenstring

ListGrantsResponse

FieldTypeLabelDescription
grantsGrantrepeated
next_page_tokenstring

ListPendingRequest

FieldTypeLabelDescription
chat_idstringoptionalOnly this chat.

ListPendingResponse

FieldTypeLabelDescription
approvalsApprovalRequiredrepeated

RevokeGrantRequest

FieldTypeLabelDescription
grant_idstringULID.

RevokeGrantResponse

GrantDecision

NameNumberDescription
GRANT_DECISION_UNSPECIFIED0
GRANT_DECISION_ALLOW1
GRANT_DECISION_DENY2

ApprovalService

Human answers to the questions policy asks, and the standing grants those answers create. Scope: control.

Method NameRequest TypeResponse TypeDescription
ListPendingListPendingRequestListPendingResponseApprovals still waiting, oldest first. Lets a client that attached late show prompts it missed.
DecideDecideRequestDecideResponseAnswers one pending approval. Always a deliberate click or key from the client's own UI: spoken answers are resolved inside the daemon and never arrive here, so a client must not forward a spoken yes for a call whose needs_click is true. An unknown or already answered call_id fails with NOT_FOUND.
ListGrantsListGrantsRequestListGrantsResponse
RevokeGrantRevokeGrantRequestRevokeGrantResponse

<p align="right"><a href="#top">Top</a></p>

aulo/v1/audit.proto

AuditEntry

FieldTypeLabelDescription
sequint64Position in the chain, assigned by the database.
prev_hashstringHex digests; hash covers prev_hash and the row's content.
hashstring
kindstringRow kind, for example "tool_call" or "approval".
payload_jsonstringJSON object. Untrusted: it quotes model-chosen arguments and tool output.
created_atgoogle.protobuf.Timestamp

ExportRequest

FieldTypeLabelDescription
from_sequint64optionalInclusive bounds on seq; absent means from the first or to the last row.
to_sequint64optional

ExportResponse

FieldTypeLabelDescription
chunkbytesA slice of the JSON Lines stream, at most 64 KiB. A row may span chunks; concatenate in order.

QueryRequest

FieldTypeLabelDescription
page_sizeuint32
page_tokenstring
kindstringoptionalOnly rows of this kind.
sincegoogle.protobuf.TimestampoptionalOnly rows created at or after / before these instants.
untilgoogle.protobuf.Timestampoptional

QueryResponse

FieldTypeLabelDescription
entriesAuditEntryrepeated
next_page_tokenstring

VerifyRequest

VerifyResponse

FieldTypeLabelDescription
okbool
rows_checkeduint64
first_bad_sequint64optionalSet when ok is false: the first row whose hash does not match.

AuditService

The append-only, hash-chained audit log of tool calls, approvals, egress and plugin loads. Read only: no RPC writes or deletes rows. Scope: admin, because payloads can contain what a user asked the agent to do.

Method NameRequest TypeResponse TypeDescription
QueryQueryRequestQueryResponseOldest first (seq ascending).
VerifyVerifyRequestVerifyResponseRecomputes the whole hash chain.
ExportExportRequestExportResponse streamStreams rows as JSON Lines, one AuditEntry per line, in chunks.

<p align="right"><a href="#top">Top</a></p>

aulo/v1/chat.proto

Chat

FieldTypeLabelDescription
idstringULID.
bot_idstringoptionalThe bot (agent persona) the chat belongs to; absent for the default bot.
titlestringUntrusted when generated by the model. At most 200 bytes.
modelModelRefThe model the next turn uses; changed by a SwitchModel submission.
created_atgoogle.protobuf.Timestamp
updated_atgoogle.protobuf.Timestamp

CreateChatRequest

FieldTypeLabelDescription
bot_idstringoptionalDefaults to the default bot.
titlestringoptionalDefaults to an empty title that the cheap tier fills in after the first turn. At most 200 bytes.
modelModelRefoptionalDefaults to the bot's configured main model.

CreateChatResponse

FieldTypeLabelDescription
chatChat

DeleteChatRequest

FieldTypeLabelDescription
chat_idstringULID.

DeleteChatResponse

GetChatRequest

FieldTypeLabelDescription
chat_idstringULID.

GetChatResponse

FieldTypeLabelDescription
chatChat

ListChatsRequest

FieldTypeLabelDescription
page_sizeuint32
page_tokenstring
bot_idstringoptionalOnly chats of this bot.

ListChatsResponse

FieldTypeLabelDescription
chatsChatrepeated
next_page_tokenstringEmpty on the last page.

ListMessagesRequest

FieldTypeLabelDescription
chat_idstringULID.
page_sizeuint32
page_tokenstring

ListMessagesResponse

FieldTypeLabelDescription
messagesMessagerepeated
next_page_tokenstring

Message

FieldTypeLabelDescription
idstringULID.
chat_idstringULID.
roleMessageRole
contentstringUntrusted for every role except what the signed-in user typed. Text is never interpreted as markup by the server.
tool_callsToolCallrepeatedCalls the assistant made in this message, oldest first.
created_atgoogle.protobuf.Timestamp

RenameChatRequest

FieldTypeLabelDescription
chat_idstringULID.
titlestringNon-empty, at most 200 bytes.

RenameChatResponse

FieldTypeLabelDescription
chatChat

SearchMessagesRequest

FieldTypeLabelDescription
querystringUntrusted user input for the FTS index; at most 1 KiB. Treated as plain words, never as query syntax.
page_sizeuint32
page_tokenstring
chat_idstringoptionalOnly this chat.

SearchMessagesResponse

FieldTypeLabelDescription
messagesMessagerepeated
next_page_tokenstring

ToolCall

FieldTypeLabelDescription
idstringULID.
namestringUntrusted; see Event ApprovalRequired.tool.
arguments_jsonstringModel-chosen arguments as a JSON object. Untrusted.
outputstringoptionalTool output, absent while running. Untrusted; the server caps it at 64 KiB here and keeps the full text only in storage.
statusToolCallStatus
created_atgoogle.protobuf.Timestamp

MessageRole

NameNumberDescription
MESSAGE_ROLE_UNSPECIFIED0
MESSAGE_ROLE_USER1
MESSAGE_ROLE_ASSISTANT2
MESSAGE_ROLE_TOOL3

ChatService

Chat CRUD and message history. Scopes: reads need read; create, rename and delete need chat.

Method NameRequest TypeResponse TypeDescription
CreateChatCreateChatRequestCreateChatResponse
ListChatsListChatsRequestListChatsResponseNewest activity first (updated_at descending).
GetChatGetChatRequestGetChatResponse
RenameChatRenameChatRequestRenameChatResponse
DeleteChatDeleteChatRequestDeleteChatResponseDeletes the chat with its messages, tool calls and usage rows. Permanent.
ListMessagesListMessagesRequestListMessagesResponseOldest first (message id ascending).
SearchMessagesSearchMessagesRequestSearchMessagesResponseFull-text search across all chats, best match first.

<p align="right"><a href="#top">Top</a></p>

aulo/v1/config.proto

AudioDevice

FieldTypeLabelDescription
idstringStable id of the device on this host. At most 256 bytes.
namestringUntrusted: the OS or driver supplies it.
directionAudioDirection
is_defaultbool

GetConfigRequest

GetConfigResponse

FieldTypeLabelDescription
config_jsonstringThe effective configuration as JSON that validates against schemas/aulo.schema.json. Secrets are never part of it; inline keys are rejected by the config loader.

ListAudioDevicesRequest

ListAudioDevicesResponse

FieldTypeLabelDescription
devicesAudioDevicerepeated

ListModelsRequest

FieldTypeLabelDescription
provider_idstringoptionalOnly this provider.
page_sizeuint32
page_tokenstring

ListModelsResponse

FieldTypeLabelDescription
modelsModelrepeated
next_page_tokenstring

ListProvidersRequest

ListProvidersResponse

FieldTypeLabelDescription
providersProviderrepeated

Model

FieldTypeLabelDescription
refModelRef
display_namestringUntrusted: comes from a provider's server. At most 128 bytes.
servedboolTrue when the provider's server reports it as served right now, as opposed to only being in the catalog.

Provider

FieldTypeLabelDescription
idstringSection name under [providers.*]. At most 64 bytes.
kindstringWire family, for example "openai", "anthropic" or "openai-compatible".
base_urlstringoptionalAbsent for hosted providers with a fixed endpoint.
key_setboolWhether a credential is available (keychain or env). The value is never sent.

SetConfigRequest

FieldTypeLabelDescription
merge_patch_jsonstringAn RFC 7386 JSON merge patch applied to the user layer (~/.aulo/config.toml) and validated against the schema before it is written; unknown keys are rejected. At most 64 KiB.

SetConfigResponse

FieldTypeLabelDescription
config_jsonstringThe effective configuration after the patch, as in GetConfigResponse.

SetDeviceRequest

FieldTypeLabelDescription
directionAudioDirection
device_idstringEmpty selects the system default.

SetDeviceResponse

SetProviderKeyRequest

FieldTypeLabelDescription
provider_idstring
keystringAt most 4 KiB. Never echoed, logged or audited.

SetProviderKeyResponse

AudioDirection

NameNumberDescription
AUDIO_DIRECTION_UNSPECIFIED0
AUDIO_DIRECTION_INPUT1
AUDIO_DIRECTION_OUTPUT2

ConfigService

Providers, models, audio devices and the configuration. Reads need read; every write needs admin.

Method NameRequest TypeResponse TypeDescription
ListProvidersListProvidersRequestListProvidersResponse
SetProviderKeySetProviderKeyRequestSetProviderKeyResponseStores the key in the OS keychain. Write-only: no RPC ever returns a key, and the key must not appear in logs, audit rows or events. A remote client should only call it over TLS.
ListModelsListModelsRequestListModelsResponseThe catalog merged with what the provider's server reports as served.
ListAudioDevicesListAudioDevicesRequestListAudioDevicesResponse
SetDeviceSetDeviceRequestSetDeviceResponsePicks the audio device for a direction; the choice persists. An unplugged device falls back to the default with a Notice.
GetConfigGetConfigRequestGetConfigResponse
SetConfigSetConfigRequestSetConfigResponse

<p align="right"><a href="#top">Top</a></p>

aulo/v1/mcp.proto

ListServersRequest

ListServersResponse

FieldTypeLabelDescription
serversMcpServerrepeated

McpServer

FieldTypeLabelDescription
namestringKey under [mcp.servers]. At most 64 bytes.
stateMcpServerState
last_errorstringoptionalWhy the server is FAILED. Untrusted: it can quote the server's own output. At most 2 KiB.

McpServiceDisableRequest

FieldTypeLabelDescription
namestring

McpServiceDisableResponse

FieldTypeLabelDescription
serverMcpServer

McpServiceEnableRequest

FieldTypeLabelDescription
namestring

McpServiceEnableResponse

FieldTypeLabelDescription
serverMcpServer

McpServiceRestartRequest

FieldTypeLabelDescription
namestring

McpServiceRestartResponse

FieldTypeLabelDescription
serverMcpServer

ServerStatusRequest

FieldTypeLabelDescription
namestring

ServerStatusResponse

FieldTypeLabelDescription
serverMcpServer
toolsstringrepeatedTool names as the model sees them (mcp__server__tool). Untrusted: the server chooses them.
recent_stderrstringrepeatedThe last lines the server wrote to stderr, oldest first. Untrusted; the server keeps at most 100 lines of 4 KiB each.

McpServerState

NameNumberDescription
MCP_SERVER_STATE_UNSPECIFIED0
MCP_SERVER_STATE_DISABLED1
MCP_SERVER_STATE_STARTING2
MCP_SERVER_STATE_READY3
MCP_SERVER_STATE_FAILED4

McpService

The MCP servers aulo is a client of. Reads need read; Enable, Disable and Restart need control. A broken server is a notice and a FAILED state, never an RPC error for the others. Enable, Disable and Restart messages carry the service name because PluginService has RPCs of the same names and message names are package-wide.

<p align="right"><a href="#top">Top</a></p>

aulo/v1/plugin.proto

Plugin

FieldTypeLabelDescription
idstringManifest id. At most 64 bytes.
namestringUntrusted: the plugin's own manifest text. At most 128 bytes.
versionstring
kindPluginKind
enabledbool

PluginServiceDisableRequest

FieldTypeLabelDescription
idstring

PluginServiceDisableResponse

FieldTypeLabelDescription
pluginPlugin

PluginServiceEnableRequest

FieldTypeLabelDescription
idstring

PluginServiceEnableResponse

FieldTypeLabelDescription
pluginPlugin

PluginServiceInstallRequest

FieldTypeLabelDescription
sourcestringA filesystem path on the daemon's host or a git URL. Untrusted; at most 2 KiB. A relative path is rejected.

PluginServiceInstallResponse

FieldTypeLabelDescription
pluginPlugin

PluginServiceListRequest

PluginServiceListResponse

FieldTypeLabelDescription
pluginsPluginrepeated

PluginServiceRemoveRequest

FieldTypeLabelDescription
idstring

PluginServiceRemoveResponse

PluginKind

How the host runs the plugin.

NameNumberDescription
PLUGIN_KIND_UNSPECIFIED0
PLUGIN_KIND_MCP_PROCESS1
PLUGIN_KIND_GRPC_PROCESS2
PLUGIN_KIND_WASM3

PluginService

Installed plugins (spec section 9). Scope: List needs read; every other RPC needs admin, because a plugin is code that runs on the host.

Method NameRequest TypeResponse TypeDescription
ListPluginServiceListRequestPluginServiceListResponse
InstallPluginServiceInstallRequestPluginServiceInstallResponseInstalls from a local path or a git URL and leaves the plugin disabled until Enable. The manifest is validated and the plugin's declared capabilities are shown for approval before anything runs.
EnablePluginServiceEnableRequestPluginServiceEnableResponse
DisablePluginServiceDisableRequestPluginServiceDisableResponse
RemovePluginServiceRemoveRequestPluginServiceRemoveResponse

<p align="right"><a href="#top">Top</a></p>

aulo/v1/session.proto

Attach

Binds the stream to a chat. Must be the first message and may be sent once.

FieldTypeLabelDescription
chat_idstringULID.

ConverseRequest

A client submission. Names follow the agent loop's Submission type.

FieldTypeLabelDescription
attachAttach
user_turnUserTurn
decide_approvalDecideApproval
interruptInterrupt
switch_modelSwitchModel
takeover_doneTakeoverDone

ConverseResponse

FieldTypeLabelDescription
eventEvent

DecideApproval

Answers an ApprovalRequired. The same decision as ApprovalService.Decide; both reach one approval queue and the first answer wins.

FieldTypeLabelDescription
call_idstringULID.
decisionApprovalDecision

Interrupt

Stops the running turn and its tool calls within 200 ms.

FieldTypeLabelDescription
allboolKill switch: stop every running turn, tool call and speech on the daemon, not only this chat. Requires the control scope.

SwitchModel

Changes the model for this chat from the next turn on.

FieldTypeLabelDescription
modelModelRef

TakeoverDone

The human finished what a TakeoverRequested asked for; the turn resumes only after this arrives.

FieldTypeLabelDescription
call_idstringULID.

UserTurn

A user message. The server answers with TurnStarted.

FieldTypeLabelDescription
textstringAt most 64 KiB; longer text is rejected, not truncated, so a client never sends a prompt the user did not write.

SessionService

Text conversation with the agent. Scope: chat; an Interrupt with all=true needs control.

Method NameRequest TypeResponse TypeDescription
ConverseConverseRequest streamConverseResponse streamOne stream drives one chat. The first request must be an Attach; anything else closes the stream with FAILED_PRECONDITION. The server answers with events of that chat only. Several clients may attach to one chat; each sees every event of it. History before the attach is read with ChatService.ListMessages, not replayed here.

<p align="right"><a href="#top">Top</a></p>

aulo/v1/voice.proto

ListVoicesRequest

FieldTypeLabelDescription
enginestringoptionalDefaults to the active engine.

ListVoicesResponse

FieldTypeLabelDescription
voicesVoicerepeated

SetVoiceRequest

FieldTypeLabelDescription
enginestring
voice_idstring
bot_idstring
chat_idstring

SetVoiceResponse

StartListeningRequest

StartListeningResponse

StopListeningRequest

StopListeningResponse

TalkRequest

FieldTypeLabelDescription
startTalkStart
audiobytesOne frame of microphone audio in the format given in Start, ideally 20 ms (640 bytes of PCM). At most 16 KiB (512 ms) of PCM; a larger frame closes the stream. Opus frames have the smaller caps given on the format. The server buffers audio in a fixed-size ring and counts overflow, so a client that sends faster than real time loses audio.
controlTalkControl

TalkResponse

FieldTypeLabelDescription
eventEvent
tts_audioTtsAudio

TalkStart

FieldTypeLabelDescription
chat_idstringThe chat that receives the final transcripts. ULID.
formatAudioFormatFormat of every audio frame that follows.

TtsAudio

Synthesized speech. Sample rate, channel count and duration come in the TtsChunk event with the same turn_id and seq, which is sent first.

FieldTypeLabelDescription
turn_idstringULID.
sequint32
pcm_s16lebytesSigned 16-bit little-endian PCM. At most 32 KiB per message.

Voice

FieldTypeLabelDescription
enginestringTTS engine id from [voice.tts], for example "kokoro".
idstringEngine-specific voice id. At most 128 bytes.
namestringDisplay name; untrusted when a plugin engine supplies it.
languagestringBCP 47 tag.

AudioFormat

NameNumberDescription
AUDIO_FORMAT_UNSPECIFIED0
AUDIO_FORMAT_PCM_S16LE_16KHZ_MONO1Signed 16-bit little-endian PCM, 16 kHz, mono: the default for remote clients.
AUDIO_FORMAT_OPUS_16KHZ_MONO2Opus (RFC 6716), 16 kHz, mono, for low-bandwidth clients. Every audio frame is exactly one Opus packet, ideally 20 ms. At most 1500 bytes and 6 Opus frames (120 ms); a packet over a cap, an empty packet or one that does not decode closes the stream.

TalkControl

Push-to-talk and playback control inside a Talk stream.

NameNumberDescription
TALK_CONTROL_UNSPECIFIED0
TALK_CONTROL_START_LISTENING1
TALK_CONTROL_STOP_LISTENING2

VoiceService

Server-side voice pipeline for clients that have no audio stack of their own (remote clients) or want the daemon's. Scope: voice; SetVoice also needs control.

Method NameRequest TypeResponse TypeDescription
TalkTalkRequest streamTalkResponse streamThe client streams microphone audio and control; the server runs VAD, STT, the agent and TTS and streams back state, transcripts and synthesized audio. The first request must be a Start; anything else closes the stream with FAILED_PRECONDITION. The stream carries only events about this client's voice session: VoiceStateChanged, SpeechStarted, SpeechEnded, Transcript, TtsChunk, Notice, ApprovalRequired and TakeoverRequested.
StartListeningStartListeningRequestStartListeningResponsePush-to-talk for the daemon's own microphone (local mode). Does nothing useful for remote clients, which use TalkControl on their stream.
StopListeningStopListeningRequestStopListeningResponse
ListVoicesListVoicesRequestListVoicesResponseLists the voices of the active or named TTS engine.
SetVoiceSetVoiceRequestSetVoiceResponseTakes effect from the next utterance; a sentence being spoken finishes.

Scalar Value Types

.proto TypeNotesC++JavaPythonGoC#PHPRuby
doubledoubledoublefloatfloat64doublefloatFloat
floatfloatfloatfloatfloat32floatfloatFloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intintint32intintegerBignum or Fixnum (as required)
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/longint64longinteger/stringBignum
uint32Uses variable-length encoding.uint32intint/longuint32uintintegerBignum or Fixnum (as required)
uint64Uses variable-length encoding.uint64longint/longuint64ulonginteger/stringBignum or Fixnum (as required)
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intintint32intintegerBignum or Fixnum (as required)
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/longint64longinteger/stringBignum
fixed32Always four bytes. More efficient than uint32 if values are often greater than 2^28.uint32intintuint32uintintegerBignum or Fixnum (as required)
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 2^56.uint64longint/longuint64ulonginteger/stringBignum
sfixed32Always four bytes.int32intintint32intintegerBignum or Fixnum (as required)
sfixed64Always eight bytes.int64longint/longint64longinteger/stringBignum
boolboolbooleanbooleanboolboolbooleanTrueClass/FalseClass
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicodestringstringstringString (UTF-8)
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr[]byteByteStringstringString (ASCII-8BIT)