13 Commits
Author SHA1 Message Date
zhayujieandcowagent dc6393a6b3 fix: honor configured ASR model instead of hardcoding whisper-1
The voice bridge sent a fixed whisper-1 for every ASR request, ignoring
the user's picked engine. Now it forwards the configured voice_to_text_model
(empty means let the gateway pick its default). Also expose default/doubao/
whisper-1/baidu as ASR options and fix the empty 'default' option rendering
blank in both the web console and the desktop app.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-18 10:55:08 +08:00
zhayujieandcowagent 73af516902 refactor(web): move ConfigHandler and ModelsHandler into channel/web/api/
ModelsHandler was 2.3k lines, a third of what was left in web_channel.py
and the largest handler in the console by a wide margin. Both are pure
moves; the modules take only the imports their code actually reaches for.

They are re-exported from web_channel.py because build_app() resolves the
URL table against that module's globals, which is also why the tests can
keep importing them from there. What could not stay is the patch targets:
patching channel.web.web_channel.conf no longer reaches a handler that
reads conf out of its own module, so those tests now name the module the
handler actually lives in.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-17 16:02:11 +08:00
zhayujieandCursor 19470e616d fix(tests): stop two model cases depending on import order and a dropped model
The web stub is installed only when web.py is not already imported, so in a
full run these handlers resolved the real header() and died without a
request context; patching the name the handler uses makes them independent
of what ran first. The routing case builds its model via __new__, so it
also needed the per-session override fields __init__ would have set.
Dropped the deepseek-chat assertion: a6eb7843 removed it from the dropdown
deliberately, and the non-v4 path it guarded is covered by the case that
sets that model as the active one.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 16:43:10 +08:00
zhayujie e45ebff194 feat(models): register GLM-5.3 reasoning capability and replace qwen3.8-max-preview with qwen3.8-max 2026-08-20 11:52:03 +08:00
zhayujieandCursor 0b6938845b fix(desktop): avoid false onboarding and fix first dropdown option selection
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 10:52:34 +08:00
chimyves 3627428dd5 feat: desktop voice input and custom providers for ASR/TTS
- Desktop chat input gets a mic button (matching the web console): record
  via MediaRecorder, transcribe through /api/voice/asr, and fill the
  recognized text into the input box
- ASR/TTS capability cards list user-created custom vendors: expand
  custom:<id> cards in _asr_capability/_tts_capability and accept them as
  the current TTS provider
- Route custom vendors at runtime via CustomVoice (OpenAI-compatible
  /audio/transcriptions and /audio/speech) using the vendor's own
  credentials; voice factory now handles custom / custom:<id>
- Desktop Models tab: ASR card allows a custom model name; TTS card gets
  a free-form model input for custom vendors
- Desktop Models tab regression: seed the free-form model input with the
  saved model so custom-vendor model names are visible again

Closes #3050
2026-08-16 02:35:34 +08:00
tshicheng 2a30e4fb9d feat(reasoning): add Kimi effort settings 2026-08-04 13:14:20 +08:00
tshicheng 94034f48f8 feat(reasoning): add DashScope effort settings 2026-08-04 13:13:17 +08:00
tshicheng 270425dd72 fix(reasoning): store effort per model 2026-08-04 13:12:02 +08:00
tshicheng 48cadc6317 feat(reasoning): add Claude effort support 2026-08-03 19:22:07 +08:00
tshicheng 54ef91b6f9 feat(config): expose reasoning effort for native providers 2026-08-03 19:22:03 +08:00
zhayujie e861d98007 feat(models): support ASR model selection in web console 2026-06-02 15:05:35 +08:00
nightwhite cd88b23b5d fix: persist ASR model in models API 2026-06-02 13:01:20 +08:00