Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
e286ae2
feat(cli): add /model --vision for a fallback vision model
yiliang114 Jun 23, 2026
193ab67
Merge branch 'main' into feat/model-vision-fallback
yiliang114 Jun 23, 2026
9a5ff76
fix(cli): add vision model description translations
yiliang114 Jun 23, 2026
3c01111
feat(cli): warn on non-image-capable /model --vision pin; cover modal…
yiliang114 Jun 23, 2026
7625698
fix(cli): translate the non-image-capable vision model warning
yiliang114 Jun 23, 2026
14de333
fix(vision-bridge): stop showing the image transcription twice
yiliang114 Jun 24, 2026
512c288
fix(cli): register vision model i18n strings and cover /model --vision
yiliang114 Jun 24, 2026
19fc954
Merge branch 'main' into feat/model-vision-fallback
yiliang114 Jun 24, 2026
b1e4dac
refactor(vision-bridge): remove dead VisionBridgeResult.transcript field
yiliang114 Jun 24, 2026
bfd3715
test(cli): cover vision-model branches; dedupe fast/vision helpers
yiliang114 Jun 24, 2026
96bde28
test(cli): vision-mode coverage + register --vision completion i18n key
yiliang114 Jun 24, 2026
7841846
Merge branch 'main' into feat/model-vision-fallback
wenshao Jun 25, 2026
6fc4d96
fix(core): exclude primary model from explicit vision bridge selection
yiliang114 Jun 25, 2026
741128e
chore(core): log vision bridge transcription for traceability
yiliang114 Jun 25, 2026
75b24fc
test: cover vision model helpers and vision-model dialog dispatch
yiliang114 Jun 25, 2026
05dddbc
fix(cli): render vision bridge notice as a dim tip, drop doubled marker
yiliang114 Jun 25, 2026
447a678
test(cli): assert VISION_NOTICE type for mid-turn vision bridge notice
yiliang114 Jun 26, 2026
998a4e6
test(cli): cover vision_notice classification and rendering
yiliang114 Jun 26, 2026
14168a6
Merge branch 'main' into feat/model-vision-fallback
yiliang114 Jun 26, 2026
5a45221
fix(vision): harden vision-bridge model selection + UX
yiliang114 Jun 27, 2026
1619e4e
fix(vision): fail-closed bridge routing, ambiguity guards, i18n, sett…
yiliang114 Jun 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/qwen-code-pr-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,9 @@ jobs:
github.event.pull_request.state == 'open' &&
!github.event.pull_request.draft &&
needs.authorize.outputs.should_review == 'true'
# Stays on hosted: the 30-minute environment wait timer would otherwise idle a self-hosted ECS slot for the whole wait (GitHub allocates the runner before evaluating the environment timer).
# Stays on hosted: the environment wait timer would otherwise idle a self-hosted ECS slot for the whole wait (GitHub allocates the runner before evaluating the environment timer).
runs-on: 'ubuntu-latest'
# Configured in repo settings with a 30-minute wait timer.
# Wait timer is configured in repo settings (Settings → Environments → qwen-pr-review-delay), currently 10 minutes.
environment:
name: 'qwen-pr-review-delay'
deployment: false
Expand Down
1 change: 1 addition & 0 deletions packages/cli/src/config/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2006,6 +2006,7 @@ export async function loadCliConfig(
? false
: (settings.memory?.autoSkillConfirm ?? true),
fastModel: settings.fastModel || undefined,
visionModel: settings.visionModel || undefined,
// Use separated hooks if provided, otherwise fall back to merged hooks
userHooks: bareMode
? undefined
Expand Down
11 changes: 11 additions & 0 deletions packages/cli/src/config/settingsSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1247,6 +1247,17 @@ const SETTINGS_SCHEMA = {
showInDialog: true,
},

visionModel: {
type: 'string',
label: 'Vision Model',
category: 'Model',
requiresRestart: false,
default: '',
description:
'Image-capable model used as the vision bridge: when a text-only main model receives an image, it is transcribed by this model first. Set with /model --vision. Leave empty to auto-pick a same-provider vision model.',
showInDialog: true,
Comment thread
yiliang114 marked this conversation as resolved.
},

voiceModel: {
type: 'string',
label: 'Voice Model',
Expand Down
10 changes: 10 additions & 0 deletions packages/cli/src/i18n/locales/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -1433,13 +1433,21 @@ export default {
'Switch the model for this session (--fast for suggestion model, [model-id] to switch immediately).',
'Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, [model-id] to switch immediately).':
'Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, [model-id] to switch immediately).',
'Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, --vision for the vision bridge model, [model-id] to switch immediately).':
'Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, --vision for the vision bridge model, [model-id] to switch immediately).',
"⚠ '{{model}}' is not a known image-capable model; the vision bridge may fail on images.":
"⚠ '{{model}}' is not a known image-capable model; the vision bridge may fail on images.",
'Set a lighter model for prompt suggestions and speculative execution':
'Set a lighter model for prompt suggestions and speculative execution',
'Toggle voice dictation input': 'Toggle voice dictation input',
'Set the model for voice transcription':
'Set the model for voice transcription',
'Set the image-capable model used to transcribe images for a text-only main model':
'Set the image-capable model used to transcribe images for a text-only main model',
'Select Fast Model': 'Select Fast Model',
'Select Vision Model': 'Select Vision Model',
'Select Voice Model': 'Select Voice Model',
'Vision Model': 'Vision Model',
'Voice Model': 'Voice Model',
'Selected voice model is unavailable.':
'Selected voice model is unavailable.',
Expand Down Expand Up @@ -1686,6 +1694,8 @@ export default {
'not set': 'not set',
'Current voice model: {{voiceModel}}\nUse "/model --voice <model-id>" to set voice model.':
'Current voice model: {{voiceModel}}\nUse "/model --voice <model-id>" to set voice model.',
'Current vision model: {{visionModel}}\nUse "/model --vision <model-id>" to set the vision bridge model.':
'Current vision model: {{visionModel}}\nUse "/model --vision <model-id>" to set the vision bridge model.',
"Voice model '{{modelName}}' is ambiguous. Configure a unique model id before using /model --voice.":
"Voice model '{{modelName}}' is ambiguous. Configure a unique model id before using /model --voice.",
none: 'none',
Expand Down
10 changes: 10 additions & 0 deletions packages/cli/src/i18n/locales/zh-TW.js
Original file line number Diff line number Diff line change
Expand Up @@ -1230,12 +1230,20 @@ export default {
'切換此會話的模型(--fast 可設置建議模型)',
'Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, [model-id] to switch immediately).':
'切換此會話的模型(--fast 可設置建議模型,--voice 可設置語音轉寫模型,[model-id] 可立即切換)',
'Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, --vision for the vision bridge model, [model-id] to switch immediately).':
'切換此會話的模型(--fast 可設置建議模型,--voice 可設置語音轉寫模型,--vision 可設置視覺橋接模型,[model-id] 可立即切換)',
"⚠ '{{model}}' is not a known image-capable model; the vision bridge may fail on images.":
"⚠ '{{model}}' 不是已知的圖像能力模型;視覺橋接處理圖片時可能會失敗。",
'Set a lighter model for prompt suggestions and speculative execution':
'設置用於輸入建議和推測執行的輕量模型',
'Toggle voice dictation input': '切換語音聽寫輸入',
'Set the model for voice transcription': '設定語音轉寫模型',
'Set the image-capable model used to transcribe images for a text-only main model':
'設定用於為純文字主模型轉寫圖像的圖像能力模型',
'Select Fast Model': '選擇快速模型',
'Select Vision Model': '選擇視覺模型',
'Select Voice Model': '選擇語音模型',
'Vision Model': '視覺模型',
'Voice Model': '語音模型',
'Selected voice model is unavailable.': '所選語音模型不可用。',
"Voice model '{{model}}' is configured more than once. Remove duplicate model ids before selecting it for voice transcription.":
Expand Down Expand Up @@ -1439,6 +1447,8 @@ export default {
'not set': '未設置',
'Current voice model: {{voiceModel}}\nUse "/model --voice <model-id>" to set voice model.':
'當前語音模型:{{voiceModel}}\n使用 "/model --voice <model-id>" 設置語音模型。',
'Current vision model: {{visionModel}}\nUse "/model --vision <model-id>" to set the vision bridge model.':
'當前視覺模型:{{visionModel}}\n使用 "/model --vision <model-id>" 設置視覺橋接模型。',
"Voice model '{{modelName}}' is ambiguous. Configure a unique model id before using /model --voice.":
"語音模型 '{{modelName}}' 不唯一。請先配置唯一的模型 ID,再使用 /model --voice。",
none: '無',
Expand Down
10 changes: 10 additions & 0 deletions packages/cli/src/i18n/locales/zh.js
Original file line number Diff line number Diff line change
Expand Up @@ -1344,12 +1344,20 @@ export default {
'切换此会话的模型(--fast 可设置建议模型)',
'Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, [model-id] to switch immediately).':
'切换此会话的模型(--fast 可设置建议模型,--voice 可设置语音转写模型,[model-id] 可立即切换)',
'Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, --vision for the vision bridge model, [model-id] to switch immediately).':
'切换此会话的模型(--fast 可设置建议模型,--voice 可设置语音转写模型,--vision 可设置视觉桥接模型,[model-id] 可立即切换)',
"⚠ '{{model}}' is not a known image-capable model; the vision bridge may fail on images.":
"⚠ '{{model}}' 不是已知的图像能力模型;视觉桥接处理图片时可能会失败。",
'Set a lighter model for prompt suggestions and speculative execution':
'设置用于输入建议和推测执行的轻量模型',
'Toggle voice dictation input': '切换语音听写输入',
'Set the model for voice transcription': '设置语音转写模型',
'Set the image-capable model used to transcribe images for a text-only main model':
'设置用于为纯文本主模型转写图像的图像能力模型',
'Select Fast Model': '选择快速模型',
'Select Vision Model': '选择视觉模型',
'Select Voice Model': '选择语音模型',
'Vision Model': '视觉模型',
'Voice Model': '语音模型',
'Selected voice model is unavailable.': '所选语音模型不可用。',
"Voice model '{{model}}' is configured more than once. Remove duplicate model ids before selecting it for voice transcription.":
Expand Down Expand Up @@ -1581,6 +1589,8 @@ export default {
'not set': '未设置',
'Current voice model: {{voiceModel}}\nUse "/model --voice <model-id>" to set voice model.':
'当前语音模型:{{voiceModel}}\n使用 "/model --voice <model-id>" 设置语音模型。',
'Current vision model: {{visionModel}}\nUse "/model --vision <model-id>" to set the vision bridge model.':
'当前视觉模型:{{visionModel}}\n使用 "/model --vision <model-id>" 设置视觉桥接模型。',
"Voice model '{{modelName}}' is ambiguous. Configure a unique model id before using /model --voice.":
"语音模型 '{{modelName}}' 不唯一。请先配置唯一的模型 ID,再使用 /model --voice。",
none: '无',
Expand Down
3 changes: 3 additions & 0 deletions packages/cli/src/ui/AppContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,7 @@ export const AppContainer = (props: AppContainerProps) => {
isModelDialogOpen,
isFastModelMode,
isVoiceModelMode,
isVisionModelMode,
openModelDialog,
closeModelDialog,
} = useModelCommand();
Expand Down Expand Up @@ -3627,6 +3628,7 @@ export const AppContainer = (props: AppContainerProps) => {
isModelDialogOpen,
isFastModelMode,
isVoiceModelMode,
isVisionModelMode,
isTrustDialogOpen,
activeArenaDialog,
isPermissionsDialogOpen,
Expand Down Expand Up @@ -3765,6 +3767,7 @@ export const AppContainer = (props: AppContainerProps) => {
isModelDialogOpen,
isFastModelMode,
isVoiceModelMode,
isVisionModelMode,
isTrustDialogOpen,
activeArenaDialog,
isPermissionsDialogOpen,
Expand Down
Loading
Loading