profile: quickstart LLM leg is keyless (one key, no provider key) - #15
Conversation
- Subtitle: 'One key for your voice agent's entire bill — LLM, voice, telephony, data' (generic line kept as the second sentence). - Add the 40% vs 100% framing (token router meters LLM only; Floe meters the whole call). - Name budget-aware routing as a feature with the concrete result.budgetAdvisory detail (was buried inside 'context-aware budgets'). - Quickstart is now a voice turn (STT -> LLM -> TTS on one key, one task budget), not an AgentKit + Exa web-search example. - Voice marketplace row: Deepgram · ElevenLabs · Venice AI · Twilio (soon); fix the malformed Compute row. - Repos: add floe-guard (public) and eve-floe (reference voice agent); cookbook link already canonical. - Drop ElizaOS from the frameworks table (consistent with the docs).
The LLM step used /v1/llm/chat/completions (BYOK), which requires the caller's own OpenAI key — contradicting the 'one key' pitch. Switch to the keyless gateway (/v1/chat/completions): only the Floe key, Floe holds the upstream key, model 'openai/gpt-4o'.
📝 WalkthroughWalkthroughThe profile README Quickstart now standardizes JSON headers for STT and TTS proxy calls and updates the LLM endpoint, removes the provider-key header, and uses the ChangesVoice quickstart examples
Estimated code review effort: 1 (Trivial) | ~5 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
…onekey # Conflicts: # profile/README.md
There was a problem hiding this comment.
Pull request overview
Updates the org profile README quickstart to align with the “one key” positioning by switching the LLM leg to the keyless gateway endpoint so STT + LLM + TTS can all be demonstrated under the single Floe key.
Changes:
- Replace the quickstart’s LLM call with the keyless gateway (
/v1/chat/completions, modelopenai/gpt-4o) and reframe the quickstart as a single voice turn (STT → LLM → TTS) under one task ID. - Refresh positioning copy (voice-first + 40% vs 100% metering) and clarify “budget-aware routing” via
result.budgetAdvisory. - Update marketplace/framework/repo listings (e.g., voice vendors, add
eve-floeandfloe-guard, remove ElizaOS).
Comments suppressed due to low confidence (1)
profile/README.md:55
- The proxy fetch call uses a JSON envelope, but the command doesn't set
Content-Type: application/json. With curl-dthis typically defaults to form encoding and can break server-side JSON parsing.
curl -X POST https://credit-api.floelabs.xyz/v1/proxy/fetch \
-H "Authorization: Bearer $FLOE_API_KEY" \
-H "X-Floe-Task-Id: call-8842" \
-d '{"url":"<ELEVENLABS_TTS_ENDPOINT>","method":"POST","body":"{...text...}"}'
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@profile/README.md`:
- Line 107: Update the eve-floe entry in the profile README table so its
description accurately reflects the linked repository’s Vercel Eve spend-control
template, or replace the URL with the intended voice-agent repository while
preserving the table format.
- Around line 42-58: Replace the hardcoded X-Floe-Task-Id value call-8842 in all
three STT, LLM, and TTS curl examples with a generated or user-supplied per-turn
task ID variable, and reference that same variable consistently across the
requests.
- Around line 40-55: Add the Content-Type: application/json header to all three
curl examples: the Deepgram request, the chat completions request, and the
ElevenLabs request, while preserving their existing Authorization, task ID, and
payload options.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: ad59fa3b-1fec-46d1-9d73-ce12aeec18da
📒 Files selected for processing (1)
profile/README.md
curl -d defaults to application/x-www-form-urlencoded, so the JSON bodies would fail to parse when copy/pasted. Add the header to all three legs (STT, LLM, TTS).
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@profile/README.md`:
- Line 107: Update the eve-floe entry in the profile README table so its
description accurately reflects the linked repository’s Vercel Eve spend-control
template, or replace the URL with the intended voice-agent repository while
preserving the table format.
- Around line 42-58: Replace the hardcoded X-Floe-Task-Id value call-8842 in all
three STT, LLM, and TTS curl examples with a generated or user-supplied per-turn
task ID variable, and reference that same variable consistently across the
requests.
- Around line 40-55: Add the Content-Type: application/json header to all three
curl examples: the Deepgram request, the chat completions request, and the
ElevenLabs request, while preserving their existing Authorization, task ID, and
payload options.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: ad59fa3b-1fec-46d1-9d73-ce12aeec18da
📒 Files selected for processing (1)
profile/README.md
🛑 Comments failed to post (3)
profile/README.md (3)
40-55: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
sed -n '1,120p' profile/README.md | cat -nRepository: Floe-Labs/.github
Length of output: 7391
🏁 Script executed:
python3 - <<'PY' import sys, pathlib p = pathlib.Path('profile/README.md') text = p.read_text() lines = text.splitlines() for i in range(max(0,39), min(len(lines),55)): print(f"{i+1:4d}: {lines[i]}") PYRepository: Floe-Labs/.github
Length of output: 1055
🏁 Script executed:
rg -n --hidden --glob '!**/.git/**' -e 'credit-api\.floelabs\.xyz|/v1/proxy/fetch|/v1/chat/completions|Content-Type: application/json|X-Floe-Task-Id' .Repository: Floe-Labs/.github
Length of output: 743
Add
Content-Type: application/jsonto each curl example.curl -ddefaults toapplication/x-www-form-urlencoded, so these JSON requests may be rejected unless the header is set explicitly.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@profile/README.md` around lines 40 - 55, Add the Content-Type: application/json header to all three curl examples: the Deepgram request, the chat completions request, and the ElevenLabs request, while preserving their existing Authorization, task ID, and payload options.
42-58: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Do not hardcode the task ID.
call-8842is reused for every copy-pasted invocation. Since this ID groups the STT, LLM, and TTS legs under one task budget, later unrelated turns can be merged into the same budget. Generate or require a fresh ID per voice turn.Proposed fix
+export FLOE_TASK_ID="<UNIQUE_TASK_ID_PER_VOICE_TURN>" + -H "X-Floe-Task-Id: call-8842" \ + -H "X-Floe-Task-Id: $FLOE_TASK_ID" \Apply the variable to all three requests.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.export FLOE_TASK_ID="<UNIQUE_TASK_ID_PER_VOICE_TURN>" -H "X-Floe-Task-Id: $FLOE_TASK_ID" \ -d '{"url":"<DEEPGRAM_STT_ENDPOINT>","method":"POST","body":"{...audio...}"}' # 2 · Reason (any LLM) — keyless: only your Floe key, same ledger curl -X POST https://credit-api.floelabs.xyz/v1/chat/completions \ -H "Authorization: Bearer $FLOE_API_KEY" \ -H "X-Floe-Task-Id: $FLOE_TASK_ID" \ -d '{"model":"openai/gpt-4o","messages":[{"role":"user","content":"Book Friday at 2pm."}]}' # 3 · Speak (ElevenLabs) — through the Floe proxy curl -X POST https://credit-api.floelabs.xyz/v1/proxy/fetch \ -H "Authorization: Bearer $FLOE_API_KEY" \ -H "X-Floe-Task-Id: $FLOE_TASK_ID" \ -d '{"url":"<ELEVENLABS_TTS_ENDPOINT>","method":"POST","body":"{...text...}"}' All three legs share `X-Floe-Task-Id`, so one task budget caps the whole conversation — STT, LLM, and TTS together, on one ledger.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@profile/README.md` around lines 42 - 58, Replace the hardcoded X-Floe-Task-Id value call-8842 in all three STT, LLM, and TTS curl examples with a generated or user-supplied per-turn task ID variable, and reference that same variable consistently across the requests.
107-107: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Align the
eve-floedescription with the linked repository.The row calls this a “Reference voice agent,” but the linked repository documents a Vercel Eve spend-control template rather than a voice-agent implementation. Update the description or point to the intended voice repository. (github.com)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@profile/README.md` at line 107, Update the eve-floe entry in the profile README table so its description accurately reflects the linked repository’s Vercel Eve spend-control template, or replace the URL with the intended voice-agent repository while preserving the table format.
The quickstart's LLM step used
/v1/llm/chat/completions(bring-your-own-key), which requires the caller's own OpenAI key — contradicting the "one key" pitch.Switch to the keyless gateway (
/v1/chat/completions): only the Floe key, Floe holds the upstream model key, modelopenai/gpt-4o. Now STT, LLM, and TTS all move on the single Floe key.Verified against
apps/api/src/routes/gateway.ts+keyless-inference.md. Landed on the branch after #14 merged, so it needs its own PR.Summary by CodeRabbit
Content-Type: application/jsonto the Deepgram STT proxy and ElevenLabs TTS proxy examples (alongsideX-Floe-Task-Id)..../v1/chat/completions, updated the model toopenai/gpt-4o, and removed theX-Floe-Provider-Keyheader from the example.