tools
tools
¶
Safe desktop tools for realtime voice sessions (capped step budget).
Classes¶
VoiceToolBudget
¶
Limit chained tool calls inside one TURN.
The cap used to be per-session and never reset: after twelve tool calls spread over a long conversation, every later "joue X" silently failed with "budget exceeded" for the rest of the session. The loop bound it exists for (a model asking for tools forever) is a per-turn problem.
Source code in src/diapason/speech/realtime/tools.py
Functions:¶
gemini_function_declarations
¶
Gemini Live functionDeclarations list.
Source code in src/diapason/speech/realtime/tools.py
openai_tools_schema
¶
OpenAI Realtime session.tools entries.
Source code in src/diapason/speech/realtime/tools.py
execute_voice_tool
¶
execute_voice_tool(
name: str,
arguments: Optional[dict[str, Any]] = None,
allowed: Optional[Sequence[str]] = None,
) -> dict[str, Any]
Run an allow-listed tool through the executor; JSON-serializable payload.
Cette fonction appelait tool.execute(**args) EN DIRECT. Elle sautait
donc ToolExecutor, et avec lui la politique de capacités, le
garde-frontière, le limiteur de débit et — le plus grave — la confirmation
des actions sensibles. Or mail_send et messages_send figurent dans
la liste vocale : une phrase mal comprise pouvait envoyer un courriel ou un
SMS au nom de l'utilisateur, sans que rien ne lui soit demandé.
Le commentaire « never auto-send from live voice — drafts only » ne
protégeait que mail_compose et messages_compose. Les deux outils
d'envoi, eux, passaient à côté.
La liste d'autorisation reste la première barrière ; l'exécuteur est la seconde, et c'est celle qui demande l'accord.