# Cost model: Build a browser voice agent.

Version 0.2.0 · Updated 2026-09-05 · draft
Architecture source: codex/otto-living-discovery-agenda · 874583e

This specification is adapted from Otto; an independent build has not been verified. It does not grant a license to LaunchTap source code.

## Result

**Base estimate: $0.894 per aggregate conversation hour, rounded to about $0.90.** A planning range across the scenarios below is **$0.40–$2.85/hour** for combined LLM, STT, and TTS usage. This range describes chosen workloads, not a confidence interval or a maximum spend guarantee.

The base case represents six ten-minute website discovery sessions, each ending in a brief. Total hour: 36 minutes of visitor speech, 12 minutes of Otto speech, and 12 minutes of pauses, thinking, and interaction. We conservatively budget Soniox for the full hour rather than discounting every pause.

This is an aggregate usage unit. The app currently has a 45-minute access cookie, 30-minute Soniox maximum session setting, transcript/payload limits and session quotas. No uninterrupted one-hour-session test was performed. Long single conversations also repeatedly resend more context, making their LLM economics different from six shorter conversations.

## Models actually represented

The pinned source defaults to `z-ai/glm-5.3-flash` for the base/report model. The inspected local configuration on the branch's checkout also selects that model and `simba-3.2` speech. It contains no local overrides for question, analysis, validation, or report routing. Hosted environment overrides have not been inspected.

| Work | Default OpenRouter route in this estimate |
| --- | --- |
| Conversational questions and speculative question preparation | GPT-5.6 Luna |
| Incremental living-agenda analysis | GPT-5.6 Luna |
| Reuse, turn/acceptance and answered-resolution checks | GPT-5.6 Luna |
| Final brief synthesis and deeper report evidence review | GLM-5.3 Flash |
| Streaming transcription | Soniox `stt-rt-v5` |
| Speech generation | Speechify `simba-3.2` |

GLM-5.3 Flash is a separate model from full GLM-5.3. The founder's stated selection criterion is a good cost/capability balance; this review does not establish comparative intelligence scores. Deeper work here refers to the job and its reasoning budget, not proof that GLM Flash is intrinsically more intelligent than Luna.

## Rates used

| Provider/model | Budget rate | Source and qualification |
| --- | --- | --- |
| GPT-5.6 Luna | $0.20/M input; $1.20/M output tokens | [OpenAI pricing](https://developers.openai.com/api/docs/models/gpt-5.6-luna); also reflected in [OpenRouter's comparison](https://openrouter.ai/compare/openai/gpt-5.6-luna/qwen/qwen3.7-flash). No cache/temporary discount assumed. |
| GLM-5.3 Flash | $0.15/M input; $0.50/M output tokens | Non-promotional provider prices on [OpenRouter](https://openrouter.ai/z-ai/glm-5.3-flash). Some routes show $0.075/$0.25 promotions, with a banner ending September 9; do not budget ongoing operation around that discount. |
| Soniox streaming STT | Approximately $0.12 per audio hour | [Soniox pricing](https://soniox.com/pricing). Actual billing is token-based: audio input $2/M, text input/output $4/M; advertised hourly equivalent is an approximation. Context and transcription volume can change it. |
| Speechify TTS | $10/M billable characters | [Speechify Starter pricing](https://speechify.ai/pricing). Whitespace and SSML tags are excluded by its billing FAQ. Applies advertised API pricing as a planning assumption; actual account terms/model eligibility need confirmation. |

We use **five billable characters per spoken word** and **150 words per minute** as English speech assumptions. That is 750 billable characters per generated minute. Speechify is charged for text generated into speech, including wasted preparation where billed—not for an entire hour of wall-clock conversation and not solely the seconds the visitor heard.

## Base LLM worksheet

All token counts are estimates. Input counts include repeated transcript, system instructions, domain context, and supplied analysis. They are not just the user's new words. Output estimates cover ordinary generated output; the additional reserve below allows for variability, reasoning, retries, and repairs, but is not a measured or guaranteed upper bound.

| Work across six sessions | Calls | Average input tokens/call | Average output tokens/call | Cost |
| --- | ---: | ---: | ---: | ---: |
| Conversation/preparation, Luna | 180 | 3,000 | 90 | $0.12744 |
| Agenda analysis, Luna | 120 | 5,000 | 1,000 | $0.26400 |
| Lightweight checks, Luna | 180 | 3,500 | 30 | $0.13248 |
| Six report drafts + six deeper reviews, GLM Flash | 12 | 8,000 | 1,500 | $0.02340 |
| **LLM subtotal** | | | | **$0.54732** |
| 20% additional-work reserve | | | | $0.109464 |
| **Budgeted LLM usage** | | | | **$0.656784** |

Assume about twenty committed visitor turns per ten-minute session. The 180 conversational generations budget 120 useful responses plus sixty extra speculative/replacement generations. Exact reuse can avoid some work; failed or outdated preparation can add it. The 180 checks pool answered-resolution verification, changed-answer reuse, ambiguous turns, and acceptance checks. Internal model calls are not equivalent to HTTP request counts.

The independent analyst budget is a maximum, not a predicted usage rate: this example uses two analyses per minute, well below its ten-start browser ceiling. Raising that rate raises costs. The full transcript remains input to multiple calls; the architecture does not make background analysis free.

## Add speech

```text
STT = 1 hour × approximately $0.12/hour
    = $0.12

TTS = 12 spoken minutes × 150 words/minute × 5 billable characters/word
      × 1.30 preparation/waste allowance × $10 / 1,000,000
    = 11,700 billable characters × $10 / 1,000,000
    = $0.117

Total = $0.656784 LLM + $0.12 STT + $0.117 TTS
      = $0.893784 ≈ $0.90 per aggregate conversation hour
```

The 30% TTS allowance includes speculative speech that does not get used, interrupted output generated beyond playback, and other variation. It is an assumption to replace with actual billed characters. We do not count routine prerecorded fillers: this branch no longer plays them.

## Sensitivity

| Scenario | LLM including reserve | STT | TTS including waste | Combined/hour |
| --- | ---: | ---: | ---: | ---: |
| Lighter prompts/work | $0.216 | $0.120 | $0.069 | **$0.405** |
| Base | $0.657 | $0.120 | $0.117 | **$0.894** |
| More analysis, longer context, more regeneration | $2.492 | $0.120 | $0.240 | **$2.852** |

Lighter scenario: conversation 90 × 2,000 input / 70 output; analysis 60 × 3,000 / 600; checks 90 × 2,200 / 25; reports/reviews 12 × 5,000 / 1,000; 20% LLM reserve; eight minutes of speech with 15% TTS waste.

Heavier scenario: conversation 300 × 6,000 / 120; analysis 240 × 9,000 / 1,600; checks 360 × 6,500 / 50; report/review/repair calls 18 × 14,000 / 2,500; 35% LLM reserve; twenty minutes of speech with 60% TTS waste. This assumes larger supplied context as well as more requests. It is a workload scenario, not what the current compact prompts necessarily consume.

If full GLM-5.3 were intended instead, its reviewed standard listings show $1.40/M input and $4.40/M output—different economics. Replacing only the base report/review rows would raise the base combined estimate to about $1.12/hour. Replacing both incremental analysis and report/review with full GLM would make it about $2.45/hour under the same request/token assumptions. Those are hypothetical routing changes, not the current implementation. [Full GLM-5.3 pricing](https://openrouter.ai/z-ai/glm-5.3)

## What this excludes

Hosting, storage, bandwidth, monitoring, human review, implementation and maintenance, taxes, payment/credit-purchase fees, and account-specific minimums or contract terms are outside this API usage estimate. No telephony is used. No cache savings, free credits, or negotiated rates are assumed.

Speechify Starter has a $10 monthly price with an included allowance. At low traffic, the allocated monthly invoice can materially exceed the $0.117 TTS usage equivalent. Allocate the actual monthly plan/overage invoice across usage; do not add the entire plan price and charge included characters again. Shared allowances used by other products also affect allocation.

Do not compare this directly with a managed platform's all-in per-minute price and call the difference profit. Such a comparison must include hosting, operational features, support, engineering ownership, and comparable behavior.

The [platform comparison](https://launchtap.com/resources/browser-voice-agent/comparison.md) applies this workload to published ElevenLabs, Vapi, Retell, Speechify, and OpenAI pricing, separating platform charges, provider usage, and incomplete native-audio estimates.

## Replace estimates with billing evidence

The current model adapter consumes streamed content but does not retain complete provider token usage/cost records. The project has latency diagnostics, not a complete unit-economics ledger.

Instrument model purpose/provider/actual model, input/cached/output/reasoning tokens, billed cost, retry/repair counts, and prepared-work reuse. Meter generated TTS characters and STT usage from provider records, including canceled attempts when billed. Associate metadata with a session without logging the private transcript. Reconcile against invoices.

Report API cost per aggregate minute, per completed useful brief, and per started session so abandoned sessions remain in the economics. Measure actual conversation outcomes and real-audio latency alongside cost before putting a measured cost/performance claim in the article.
