Live voice agent navigation demo — Gemini Live API + tool calling over a dispatcher console for freight operations management
21 tools with mostly complete schemas and descriptions. Naming is verb-forward and clear (list_, navigate, click, fill, select, check, read_, highlight, submit_, get_, open_, assign_, schedule_, set_, run_, filter_). Descriptions range 50 - 250 chars, meeting the 10 - 1024 baseline. All tools have input schemas with typed properties. However, several tools lack parameter descriptions (select, check, read_text, highlight, run_palette_action, set_activity_note, set_quick_actions, filter_loads), and output schemas are not documented. Error handling is minimal, no recovery guidance or categorization. Tool composition is sound (single responsibility), but some tools like set_quick_actions and set_activity_note are UI-only with limited domain value. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present.
Assign an existing carrier_id to an existing load_id. Confirm uncertain ids first.
Set a checkbox or toggle to checked or unchecked.
Click a button or link identified by its data-agent-id.
Fill a writable input/textarea by agent_id. Require capabilities.fill=true. Do not fill labels, cards, buttons, route params, readouts, or negotiate.load_id. Dates/times are coerced to native input formats; DOM rejections return a retryable format error.
Filter the dispatch loads table.
Read freight load details by load_id, e.g. LD-10824. Use open_load when the user wants the load selected or opened for negotiation.
Output schemas not documented. Tools return data but LLMs cannot plan downstream calls or extract fields without trial-and-error. Affects all 21 tools.
8 tools lack parameter descriptions: select, check, read_text, highlight, run_palette_action, set_activity_note, set_quick_actions, filter_loads. LLMs cannot infer parameter meaning from names alone.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. Affects navigate, click, fill, select, check, submit_form, open_load, assign_carrier, submit_quote, schedule_callback, set_captions, open_palette, run_palette_action, set_activity_note, set_quick_actions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
On /negotiate.html, read load id, lane, distance/weight pricing, suggested rate, flexible quote rules, public negotiator profile, delegation limits, last offer, status, and history count before quoting.
Briefly flash an element before a visible click/fill so the user sees the target.
Return visible agent-addressable elements with id, label, role, state, and capabilities. Use when an agent_id or capability is uncertain. Only target elements whose capability matches the tool, e.g. capabilities.fill=true for fill.
Navigate to a known app page: /, /index.html, /dispatch.html, /carriers.html, /negotiate.html, /contact.html, /map.html. Prefer open_load for load-specific work; only /negotiate.html?load_id=LD-xxxxx is accepted as a load query.
Select/open a freight load by load_id. Use instead of guessed route queries or filling read-only IDs. For negotiation, pass target_page="negotiate" or for_negotiation=true.
Open the command palette with an optional query for find/jump/search requests.
Return the visible text content of an element (for verification or read-back).
Run a known command-palette action_id directly. Discover ids first if uncertain.
On the Contact page, schedule a follow-up callback.
Choose an option in a <select> element by its visible label.
Show a short live activity status message; auto-clears after ttl_seconds.
Toggle the slim captions overlay for the last 1-2 spoken lines.
Replace contextual quick-action chips. Each chip invokes a tool with args when tapped.
Submit a form by its data-agent-id.
On /negotiate.html, submit a USD quote/counteroffer. Any positive amount is valid: no multiple-of-25 rule and no fixed percent band. Confirm the amount unless agent_delegation.enabled=true and it is within max_rate. Include a short carrier-facing note.
No error handling guidance. Tools do not return recovery hints, error categorization (retryable vs fatal), or actionable messages. LLMs cannot self-correct on failure.
filter_loads has empty description (50 chars) and no input schema documentation. Unclear what this tool does or what parameters it accepts.