Skip to content

profile: quickstart LLM leg is keyless (one key, no provider key) - #15

Merged
achris7 merged 4 commits into
mainfrom
docs/profile-keyless-onekey
Jul 19, 2026
Merged

profile: quickstart LLM leg is keyless (one key, no provider key)#15
achris7 merged 4 commits into
mainfrom
docs/profile-keyless-onekey

Conversation

@achris7

@achris7 achris7 commented Jul 19, 2026

Copy link
Copy Markdown
Member

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, model openai/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

  • Documentation
    • Updated the Quickstart “one voice turn, one key” curl examples to standardize request headers and improve the LLM request flow.
    • Added Content-Type: application/json to the Deepgram STT proxy and ElevenLabs TTS proxy examples (alongside X-Floe-Task-Id).
    • Changed the LLM “Reason” example endpoint to .../v1/chat/completions, updated the model to openai/gpt-4o, and removed the X-Floe-Provider-Key header from the example.

achris7 added 2 commits July 18, 2026 14:47
- 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'.
@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The 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 openai/gpt-4o model.

Changes

Voice quickstart examples

Layer / File(s) Summary
Proxy request examples
profile/README.md
Adds JSON content-type headers to STT and TTS requests, and updates the LLM endpoint, provider-key header, and model identifier.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Possibly related PRs

Suggested reviewers: copilot

Poem

A rabbit checks each voice request,
With JSON headers neatly dressed.
The LLM finds its newer route,
GPT-4o joins the hop-and-sprout.
One key, three calls, all set to go!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: the quickstart LLM step is now keyless and no longer needs a provider key.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/profile-keyless-onekey

Comment @coderabbitai help to get the list of available commands.

@achris7
achris7 marked this pull request as ready for review July 19, 2026 22:27
Copilot AI review requested due to automatic review settings July 19, 2026 22:27

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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, model openai/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-floe and floe-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 -d this 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.

Comment thread profile/README.md
Comment thread profile/README.md

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 5aae825 and d75489a.

📒 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).

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 5aae825 and d75489a.

📒 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 -n

Repository: 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]}")
PY

Repository: 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/json to each curl example. curl -d defaults to application/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-8842 is 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-floe description 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.

@achris7
achris7 merged commit f1b735f into main Jul 19, 2026
1 check was pending
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants