diff --git a/.changeset/bright-voices-appear.md b/.changeset/bright-voices-appear.md new file mode 100644 index 00000000000..99f4b8638db --- /dev/null +++ b/.changeset/bright-voices-appear.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Show voice transcription automatically when you are signed in with the Kilo provider. diff --git a/packages/kilo-docs/pages/code-with-ai/features/speech-to-text.md b/packages/kilo-docs/pages/code-with-ai/features/speech-to-text.md index e66a937f10d..c98ae767c66 100644 --- a/packages/kilo-docs/pages/code-with-ai/features/speech-to-text.md +++ b/packages/kilo-docs/pages/code-with-ai/features/speech-to-text.md @@ -5,11 +5,7 @@ description: Dictate prompts through your signed-in Kilo account. # Voice Transcription -{% callout type="warning" title="Experimental feature" %} -Speech to Text is experimental. Expect issues and changes as it matures. -{% /callout %} - -Use voice input in prompt fields instead of typing. Transcription uses your Kilo account through Kilo Gateway. +Use voice input in prompt fields instead of typing. When the Kilo provider is enabled and you are signed in, the microphone appears automatically and transcription uses your account through Kilo Gateway. --- @@ -43,29 +39,15 @@ Enable and sign in to the Kilo provider to use voice input in prompt fields. Req --- -## Enable input +## Choose a model -Voice input is experimental and must be enabled: - -1. Open Kilo Code settings -2. Open **Experimental** settings -3. Enable the **Speech to Text** experiment - -Kilo stores this toggle in your global Kilo CLI config (`~/.config/kilo/kilo.jsonc`), not VS Code user settings: - -```json -{ - "experimental": { - "speech_to_text": true - } -} -``` +You can optionally choose a transcription model in **Settings** > **Experimental** > **Speech to Text Model**. Kilo stores this choice as `experimental.speech_to_text_model` in your global Kilo CLI config (`~/.config/kilo/kilo.jsonc`). --- ## Record prompts -Once enabled, a microphone button appears in prompt fields: +When you are signed in to the enabled Kilo provider, a microphone button appears in prompt fields: 1. Click the microphone button to start recording 2. Speak your message clearly @@ -87,13 +69,12 @@ The feature includes real-time audio level visualization and voice activity dete **Microphone button not appearing:** -- Ensure the Speech to Text experiment is enabled -- Verify FFmpeg is installed and in your PATH - Enable and sign in to the Kilo provider **Transcription errors:** - Confirm the Kilo provider remains enabled and signed in +- Verify FFmpeg is installed and in your PATH - Check your internet connection - Try speaking more clearly or adjusting your microphone settings @@ -101,7 +82,7 @@ The feature includes real-time audio level visualization and voice activity dete ## Know limits -Speech to Text is experimental and may have limitations: +Voice transcription has these requirements: - Requires an active internet connection - Requires Kilo Gateway access through your Kilo account diff --git a/packages/kilo-docs/pages/getting-started/settings/index.md b/packages/kilo-docs/pages/getting-started/settings/index.md index f9645eca76c..97eed247fc9 100644 --- a/packages/kilo-docs/pages/getting-started/settings/index.md +++ b/packages/kilo-docs/pages/getting-started/settings/index.md @@ -193,22 +193,22 @@ Use this option only if you are certain you want to remove all Kilo Code data or The new extension exposes experimental features via the **Experimental** tab in Settings (click the gear icon {% codicon name="gear" /%} → Experimental). -Available experimental toggles include: +Available experimental settings include: -- **Share mode** — `manual`, `auto`, or `disabled` session sharing -- **LSP integration** — expose language server diagnostics to the agent -- **Paste summary** — summarize large clipboard pastes before including them -- **Speech to Text**: enable voice transcription in chat -- **Batch tool** — allow the agent to batch multiple tool calls in one step +- **Share mode** - `manual`, `auto`, or `disabled` session sharing +- **LSP integration** - expose language server diagnostics to the agent +- **Paste summary** - summarize large clipboard pastes before including them +- **Speech to Text Model** - optionally select the transcription model +- **Batch tool** - allow the agent to batch multiple tool calls in one step - **Agent Manager Tool** - allow agents to start Agent Manager local and worktree sessions from chat -- **OpenTelemetry** — enable Kilo telemetry and optional OTLP export when configured +- **OpenTelemetry** - enable Kilo telemetry and optional OTLP export when configured -Speech to Text is enabled from this Experimental tab. Kilo stores that toggle in your global Kilo CLI config (`~/.config/kilo/kilo.jsonc`), not VS Code user settings: +Voice input appears automatically when the Kilo provider is enabled and you are signed in. Choosing **Speech to Text Model** stores `experimental.speech_to_text_model` in your global Kilo CLI config (`~/.config/kilo/kilo.jsonc`): ```json { "experimental": { - "speech_to_text": true + "speech_to_text_model": "openai/gpt-4o-mini-transcribe" } } ``` diff --git a/packages/kilo-vscode/tests/unit/config-scope.test.ts b/packages/kilo-vscode/tests/unit/config-scope.test.ts index 866f57adf74..eca588a5d1b 100644 --- a/packages/kilo-vscode/tests/unit/config-scope.test.ts +++ b/packages/kilo-vscode/tests/unit/config-scope.test.ts @@ -33,17 +33,15 @@ describe("splitConfigByScope", () => { expect(split.project).toEqual({}) }) - it("writes speech-to-text experimental settings to global config", () => { + it("writes the speech-to-text model setting to global config", () => { const split = splitConfigByScope({ experimental: { - speech_to_text: true, speech_to_text_model: "openai/gpt-4o-mini-transcribe", }, }) expect(split.global).toEqual({ experimental: { - speech_to_text: true, speech_to_text_model: "openai/gpt-4o-mini-transcribe", }, }) diff --git a/packages/kilo-vscode/tests/unit/speech-to-text-availability.test.ts b/packages/kilo-vscode/tests/unit/speech-to-text-availability.test.ts index f507dfc865a..2e6de323033 100644 --- a/packages/kilo-vscode/tests/unit/speech-to-text-availability.test.ts +++ b/packages/kilo-vscode/tests/unit/speech-to-text-availability.test.ts @@ -5,17 +5,18 @@ import { } from "../../webview-ui/src/components/speech-to-text/availability" import { DEFAULT_SPEECH_TO_TEXT_MODEL } from "../../src/speech-to-text/models" -describe("speech-to-text config availability", () => { +describe("speech-to-text availability", () => { const providers = ["kilo"] const profile = {} - it("enables speech input from resolved config when Kilo access exists", () => { - expect(canUseSpeechToText({ experimental: { speech_to_text: true } }, providers, profile)).toBe(true) + it("shows speech input by default when Kilo access exists", () => { + expect(canUseSpeechToText({}, providers, profile)).toBe(true) }) - it("hides speech input when the config flag is false or unset", () => { - expect(canUseSpeechToText({ experimental: { speech_to_text: false } }, providers, profile)).toBe(false) - expect(canUseSpeechToText({}, providers, profile)).toBe(false) + it("hides speech input without a signed-in, enabled Kilo provider", () => { + expect(canUseSpeechToText({}, [], profile)).toBe(false) + expect(canUseSpeechToText({}, providers, null)).toBe(false) + expect(canUseSpeechToText({ disabled_providers: ["kilo"] }, providers, profile)).toBe(false) }) it("normalizes configured and unknown transcription models", () => { diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/ExperimentalTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/ExperimentalTab.tsx index 3e5a1467c51..bcef6fcf384 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/ExperimentalTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/ExperimentalTab.tsx @@ -204,10 +204,10 @@ const ExperimentalTab: Component = () => { @@ -216,37 +216,23 @@ const ExperimentalTab: Component = () => { placement="top" inactive={kiloReady()} > - updateExperimental("speech_to_text", checked)} + item.value === speechModel())} - value={(item) => item.value} - label={(item) => `${item.label} (${item.provider})`} - onSelect={(item) => - updateExperimental("speech_to_text_model", item?.value ?? DEFAULT_SPEECH_TO_TEXT_MODEL.id) - } - variant="secondary" - size="small" - triggerVariant="settings" - disabled={!kiloReady()} - placeholder={DEFAULT_SPEECH_TO_TEXT_MODEL.label} - /> - - { - test("parses speech-to-text enablement and model", () => { +describe("Config.Info experimental speech-to-text model", () => { + test("parses the selected speech-to-text model", () => { const parsed = Config.Info.zod.parse({ experimental: { - speech_to_text: true, speech_to_text_model: "openai/gpt-4o-mini-transcribe", }, }) - expect(parsed.experimental?.speech_to_text).toBe(true) expect(parsed.experimental?.speech_to_text_model).toBe("openai/gpt-4o-mini-transcribe") }) - test("preserves explicit disabled speech-to-text", () => { - const parsed = Config.Info.zod.parse({ experimental: { speech_to_text: false } }) - expect(parsed.experimental?.speech_to_text).toBe(false) - }) - test("keeps existing experimental defaults", () => { - const parsed = Config.Info.zod.parse({ experimental: { speech_to_text: true } }) + const parsed = Config.Info.zod.parse({ experimental: { speech_to_text_model: "google/chirp-3" } }) expect(parsed.experimental?.openTelemetry).toBe(true) }) }) diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 066d3fd4c5e..6a015482c58 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1429,7 +1429,6 @@ export type Config = { codebase_search?: boolean semantic_indexing?: boolean agent_manager_tool?: boolean - speech_to_text?: boolean speech_to_text_model?: string openTelemetry?: boolean primary_tools?: Array diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 624758a6049..1dcc30124fb 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -16771,9 +16771,6 @@ "agent_manager_tool": { "type": "boolean" }, - "speech_to_text": { - "type": "boolean" - }, "speech_to_text_model": { "type": "string" },