{{ message }}
feat(showcase/langgraph-python): voice demo (Wave 2a)#4224
Open
AlemTuzlak wants to merge 6 commits intomainfrom
Open
feat(showcase/langgraph-python): voice demo (Wave 2a)#4224AlemTuzlak wants to merge 6 commits intomainfrom
AlemTuzlak wants to merge 6 commits intomainfrom
Conversation
Wire @copilotkit/voice into a langgraph-python /demos/voice route via a dedicated runtime (/api/copilotkit-voice) that mounts TranscriptionServiceOpenAI. The mic button auto-appears in the CopilotChat composer because the runtime advertises audioFileTranscriptionEnabled=true. - Per-demo runtime route /api/copilotkit-voice with transcriptionService - Demo page at /demos/voice with <CopilotChat /> + Play-sample button - SampleAudioButton fetches /demo-audio/sample.wav and POSTs the single-route transcribe envelope to the runtime URL, then writes the transcribed text into the chat textarea via the native setter + synthetic input event so React state stays in sync - Manifest, registry, constraints, docs-links wired; shell bundles regenerated - QA checklist (qa/voice.md) + Playwright E2E spec (tests/e2e/voice.spec.ts) - public/demo-audio/ placeholder committed; sample.wav to be added by user - Allowlist shell-docs / shell-dojo demo-content.json in the binary-size pre-commit hook (they are bundled fixtures, already over 1 MB on main)
Contributor
…e from main Merge with main (-X theirs) dropped the voice entries from the hand-edited manifest + docs-links files because the generated registry / demo-content bundles on main diverged from my local copies. Restore the voice demo entries (manifest features + demos, docs-links, regenerated shell bundles) on top of main's state.
…demo The voice demo adds two new framework deps (@copilotkit/voice, openai) to showcase/packages/langgraph-python. The Dojo example doesn't pin either, so validate-pins emits [FAIL] "is not an exact pin in showcase" for each. Both use the same non-exact spec style as the already-baselined @copilotkit/react-core / @copilotkit/runtime entries (next-channel dist tag + caret range). Bump the drift baseline by 2 so CI accepts the new deps without lowering the overall pin discipline.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
Wave 2a — wire the existing
@copilotkit/voicepackage into alanggraph-python/demos/voiceroute with a dedicated runtime that mountsTranscriptionServiceOpenAI./api/copilotkit-voicewithtranscriptionService: new TranscriptionServiceOpenAI(...)— the only route in this showcase that advertisesaudioFileTranscriptionEnabled: true, so the mic button only appears in this demo./demos/voicewith<CopilotChat />plus a<SampleAudioButton />that bypasses the mic: fetches a bundled/demo-audio/sample.wav, POSTs the single-route transcribe envelope to/api/copilotkit-voice, and writes the transcribed text into the chat textarea (native setter + synthetic input event keeps React state in sync).public/demo-audio/sample.wav— binary to be added by user, see Concerns).qa/voice.md) + Playwright E2E spec (tests/e2e/voice.spec.ts) authored.manifest.yaml+ per-shellregistry.json/demo-content.json+docs-links.jsonwired.voicewas already allowlisted inshowcase/shared/constraints.yaml— no change there.showcase/shell-docs/src/data/demo-content.jsonandshowcase/shell-dojo/src/data/demo-content.jsonare already >1 MB on main; added them tocheck-binaries.sh's allowlist alongside the existingshellone so any commit that regenerates the bundle (like this one) can land.Out of scope (per spec): realtime voice, TTS, continuous dialog, custom mic UI. Those are later waves.
Test plan
pnpm exec tsc --noEmit— new files clean (pre-existing errors in beautiful-chat / headless-complete are untouched baseline).showcase-scripts:test— no new failures vs. main. Remaining Windows-specific CLI-subprocess failures are a baseline (same count on origin/main detached HEAD run); CI on Linux is the source of truth.public/demo-audio/.gitkeep+ README placeholder committed; path is wired).voice.spec.tsruns green 3x against Railway (post-deploy verification).voicerow green forlanggraph-python(post-deploy).Concerns
public/demo-audio/sample.wavbinary must be produced and committed by the user before the demo works end-to-end. The path is wired (demo page, sample button, QA, E2E); the file is currently a placeholder directory./demos/voicedoesn't exist on Railway yet, so the spec was authored (structural selectors, permissive weather/tokyo regex on transcription) but not executed — "3x green against Railway" happens once the service redeploys with this PR.