Skip to content

Commit 96c02d2

Browse files
committed
Add manual model entry and loading progress for model selection alongside reasoning effort localizations
- in the quick pick that lists api-fetched models, implement option: 'Enter manually' and a separator below it. - when adding a model name manually, the text "Could not fetch models..." is inappropriate - when fetching models from api, should show an appropriate progress notification - translate 'Checking reasoning effort support...' └── apps └── editor └── src ├── i18n │ └── translations │ └── views │ ├── prompt │ │ ├── handlers │ │ │ ├── copy-prompt.ts │ │ │ ├── delete-task.ts │ │ │ ├── handle-pick-api-reasoning-effort.ts │ │ │ ├── handle-undo.ts │ │ │ ├── hash-sign.ts │ │ │ ├── index.ts │ │ │ ├── make-api-call.ts │ │ │ ├── select-edit-format.ts │ │ │ ├── utils │ │ │ │ ├── index.ts │ │ │ │ └── symbols │ │ │ │ ├── git │ │ │ │ │ ├── index.ts │ │ │ │ │ └── replace-git-symbols.ts │ │ │ │ └── index.ts │ │ │ └── voice-input.ts │ │ └── index.ts │ ├── settings │ │ ├── handlers │ │ │ ├── handle-pick-api-reasoning-effort.ts │ │ │ ├── index.ts │ │ │ ├── open-allow-patterns-settings.ts │ │ │ ├── open-ignore-patterns-settings.ts │ │ │ └── select-default-api-configuration.ts │ │ └── index.ts │ └── shared │ └── actions │ └── api │ ├── create │ │ └── interactions │ │ └── initial-select-model.ts │ └── update │ └── interactions │ └── edit-model-for-api-config.ts └── views ├── prompt │ └── backend │ └── message-handlers │ └── handle-pick-api-reasoning-effort.ts ├── settings │ └── backend │ └── message-handlers │ └── handle-pick-api-reasoning-effort.ts └── shared └── actions └── api ├── create │ └── interactions │ └── initial-select-model.ts └── update └── interactions └── edit-model-for-api-config.ts
1 parent a7101c5 commit 96c02d2

10 files changed

Lines changed: 243 additions & 86 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export const translations = {
2+
'views.prompt.handlers.handle-pick-api-reasoning-effort.checking-support': {
3+
en: 'Checking reasoning effort support...',
4+
pl: 'Sprawdzanie obsługi wysiłku rozumowania...',
5+
'zh-cn': '正在检查推理工作量支持...',
6+
ja: '推論エフォートのサポートを確認しています...',
7+
'zh-tw': '正在檢查推理工作量支援...',
8+
de: 'Überprüfung der Unterstützung für Argumentationsaufwand...',
9+
es: 'Comprobando la compatibilidad con el esfuerzo de razonamiento...',
10+
fr: 'Vérification de la prise en charge de l’effort de raisonnement...',
11+
'pt-br': 'Verificando o suporte de esforço de raciocínio...',
12+
ru: 'Проверка поддержки уровня усилий для рассуждения...',
13+
ko: '추론 작업 지원 확인 중...',
14+
it: 'Controllo del supporto per lo sforzo di ragionamento...',
15+
tr: 'Akıl yürütme çabası desteği kontrol ediliyor...',
16+
cs: 'Kontrola podpory úsilí při uvažování...',
17+
hu: 'Érvelési erőfeszítés támogatásának ellenőrzése...',
18+
bg: 'Проверка на поддръжката за усилията за разсъждение...'
19+
}
20+
} as const

‎apps/editor/src/i18n/translations/views/prompt/handlers/index.ts‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { translations as voice_input } from './voice-input'
66
import { translations as copy_prompt } from './copy-prompt'
77
import { translations as handle_undo } from './handle-undo'
88
import { translations as utils } from './utils'
9+
import { translations as handle_pick_api_reasoning_effort } from './handle-pick-api-reasoning-effort'
910

1011
export const translations = {
1112
...delete_task,
@@ -15,5 +16,6 @@ export const translations = {
1516
...voice_input,
1617
...copy_prompt,
1718
...handle_undo,
18-
...utils
19+
...utils,
20+
...handle_pick_api_reasoning_effort
1921
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export const translations = {
2+
'views.settings.handlers.handle-pick-api-reasoning-effort.checking-support': {
3+
en: 'Checking reasoning effort support...',
4+
pl: 'Sprawdzanie obsługi wysiłku rozumowania...',
5+
'zh-cn': '正在检查推理工作量支持...',
6+
ja: '推論エフォートのサポートを確認しています...',
7+
'zh-tw': '正在檢查推理工作量支援...',
8+
de: 'Überprüfung der Unterstützung für Argumentationsaufwand...',
9+
es: 'Comprobando la compatibilidad con el esfuerzo de razonamiento...',
10+
fr: 'Vérification de la prise en charge de l’effort de raisonnement...',
11+
'pt-br': 'Verificando o suporte de esforço de raciocínio...',
12+
ru: 'Проверка поддержки уровня усилий для рассуждения...',
13+
ko: '추론 작업 지원 확인 중...',
14+
it: 'Controllo del supporto per lo sforzo di ragionamento...',
15+
tr: 'Akıl yürütme çabası desteği kontrol ediliyor...',
16+
cs: 'Kontrola podpory úsilí při uvažování...',
17+
hu: 'Érvelési erőfeszítés támogatásának ellenőrzése...',
18+
bg: 'Проверка на поддръжката за усилията за разсъждение...'
19+
}
20+
} as const
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { translations as open_allow_patterns_settings } from './open-allow-patterns-settings'
22
import { translations as open_ignore_patterns_settings } from './open-ignore-patterns-settings'
33
import { translations as select_default_api_configuration } from './select-default-api-configuration'
4+
import { translations as handle_pick_api_reasoning_effort } from './handle-pick-api-reasoning-effort'
45

56
export const translations = {
67
...open_allow_patterns_settings,
78
...open_ignore_patterns_settings,
8-
...select_default_api_configuration
9+
...select_default_api_configuration,
10+
...handle_pick_api_reasoning_effort
911
}

‎apps/editor/src/i18n/translations/views/shared/actions/api/create/interactions/initial-select-model.ts‎

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,59 @@ export const translations = {
3737
bg: 'Изберете модел'
3838
},
3939
'views.shared.actions.api.create.interactions.initial-select-model.prompt': {
40-
en: 'Could not fetch models. Please enter a model name (ID).',
41-
pl: 'Nie udało się pobrać modeli. Wprowadź nazwę modelu (ID).',
42-
'zh-cn': '无法获取模型。请输入模型名称(ID)。',
43-
ja: 'モデルを取得できませんでした。モデル名(ID)を入力してください。',
44-
'zh-tw': '無法獲取模型。請輸入模型名稱(ID)。',
45-
de: 'Konnte Modelle nicht abrufen. Bitte gib einen Modellnamen (ID) ein.',
46-
es: 'No se pudieron obtener los modelos. Por favor, introduce un nombre de modelo (ID).',
47-
fr: 'Impossible de récupérer les modèles. Veuillez entrer un nom de modèle (ID).',
48-
'pt-br':
49-
'Não foi possível buscar modelos. Por favor, insira um nome de modelo (ID).',
50-
ru: 'Не удалось получить модели. Пожалуйста, введите имя модели (ID).',
51-
ko: '모델을 가져올 수 없습니다. 모델 이름(ID)을 입력하세요.',
52-
it: 'Impossibile recuperare i modelli. Inserisci un nome del modello (ID).',
53-
tr: 'Modeller alınamadı. Lütfen bir model adı (KİMLİĞİ) girin.',
54-
cs: 'Nepodařilo se načíst modely. Zadejte prosím název modelu (ID).',
55-
hu: 'Nem sikerült letölteni a modelleket. Kérjük, adja meg a modell nevét (ID).',
56-
bg: 'Не успя да извлече модели. Моля, въведете име на модел (ID).'
57-
}
40+
en: 'Enter a model name (ID)',
41+
pl: 'Wprowadź nazwę modelu (ID)',
42+
'zh-cn': '输入模型名称 (ID)',
43+
ja: 'モデル名 (ID) を入力してください',
44+
'zh-tw': '輸入模型名稱 (ID)',
45+
de: 'Geben Sie einen Modellnamen (ID) ein',
46+
es: 'Ingrese el nombre de un modelo (ID)',
47+
fr: 'Entrez un nom de modèle (ID)',
48+
'pt-br': 'Insira um nome de modelo (ID)',
49+
ru: 'Введите имя модели (ID)',
50+
ko: '모델 이름 (ID) 입력',
51+
it: 'Inserisci il nome di un modello (ID)',
52+
tr: 'Bir model adı (ID) girin',
53+
cs: 'Zadejte název modelu (ID)',
54+
hu: 'Adja meg a modell nevét (ID)',
55+
bg: 'Въведете име на модел (ID)'
56+
},
57+
'views.shared.actions.api.create.interactions.initial-select-model.enter-manually':
58+
{
59+
en: 'Enter manually',
60+
pl: 'Wprowadź ręcznie',
61+
'zh-cn': '手动输入',
62+
ja: '手動で入力',
63+
'zh-tw': '手動輸入',
64+
de: 'Manuell eingeben',
65+
es: 'Introducir manualmente',
66+
fr: 'Entrer manuellement',
67+
'pt-br': 'Inserir manualmente',
68+
ru: 'Ввести вручную',
69+
ko: '수동으로 입력',
70+
it: 'Inserisci manualmente',
71+
tr: 'Manuel olarak girin',
72+
cs: 'Zadat ručně',
73+
hu: 'Manuális megadás',
74+
bg: 'Въведете ръчно'
75+
},
76+
'views.shared.actions.api.create.interactions.initial-select-model.fetching-models':
77+
{
78+
en: 'Fetching models...',
79+
pl: 'Pobieranie modeli...',
80+
'zh-cn': '正在获取模型...',
81+
ja: 'モデルを取得しています...',
82+
'zh-tw': '正在獲取模型...',
83+
de: 'Modelle werden abgerufen...',
84+
es: 'Obteniendo modelos...',
85+
fr: 'Récupération des modèles...',
86+
'pt-br': 'Buscando modelos...',
87+
ru: 'Получение моделей...',
88+
ko: '모델을 가져오는 중...',
89+
it: 'Recupero modelli in corso...',
90+
tr: 'Modeller getiriliyor...',
91+
cs: 'Načítání modelů...',
92+
hu: 'Modellek lekérése...',
93+
bg: 'Извличане на модели...'
94+
}
5895
} as const

‎apps/editor/src/views/prompt/backend/message-handlers/handle-pick-api-reasoning-effort.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { edit_reasoning_effort_for_api_config } from '@/views/shared/actions/api
55
import { ModelProvidersManager } from '@/services/model-providers-manager'
66
import { dictionary } from '@shared/constants/dictionary'
77
import { verify_reasoning_effort } from '@/views/shared/actions/api/create/interactions'
8+
import { t } from '@/i18n'
89

910
export const handle_pick_api_reasoning_effort = async (
1011
prompt_view_provider: PromptViewProvider,
@@ -31,7 +32,9 @@ export const handle_pick_api_reasoning_effort = async (
3132
await vscode.window.withProgress(
3233
{
3334
location: vscode.ProgressLocation.Notification,
34-
title: 'Checking reasoning effort validity...',
35+
title: t(
36+
'views.prompt.handlers.handle-pick-api-reasoning-effort.checking-support'
37+
),
3538
cancellable: true
3639
},
3740
async (_progress, token) => {

‎apps/editor/src/views/settings/backend/message-handlers/handle-pick-api-reasoning-effort.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ModelProvidersManager } from '@/services/model-providers-manager'
44
import { dictionary } from '@shared/constants/dictionary'
55
import { edit_reasoning_effort_for_api_config } from '@/views/shared/actions/api/update/interactions'
66
import { verify_reasoning_effort } from '@/views/shared/actions/api/create/interactions'
7+
import { t } from '@/i18n'
78

89
export const handle_pick_api_reasoning_effort = async (
910
provider: SettingsViewProvider,
@@ -29,7 +30,9 @@ export const handle_pick_api_reasoning_effort = async (
2930
await vscode.window.withProgress(
3031
{
3132
location: vscode.ProgressLocation.Notification,
32-
title: 'Checking reasoning effort validity...',
33+
title: t(
34+
'views.settings.handlers.handle-pick-api-reasoning-effort.checking-support'
35+
),
3336
cancellable: true
3437
},
3538
async (_progress, token) => {

‎apps/editor/src/views/shared/actions/api/create/interactions/initial-select-model.ts‎

Lines changed: 89 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -23,67 +23,104 @@ export const initial_select_model = async (
2323
`Base URL not found for model provider ${model_provider.name}`
2424
)
2525

26-
const models = await model_fetcher.get_models({
27-
base_url,
28-
api_key: model_provider.api_key
29-
})
26+
const models = await vscode.window.withProgress(
27+
{
28+
location: vscode.ProgressLocation.Notification,
29+
title: t(
30+
'views.shared.actions.api.create.interactions.initial-select-model.fetching-models'
31+
),
32+
cancellable: false
33+
},
34+
async () => {
35+
return await model_fetcher.get_models({
36+
base_url: base_url as string,
37+
api_key: model_provider.api_key
38+
})
39+
}
40+
)
3041

3142
if (models.length > 0) {
32-
const model_items = models.map((model) => ({
33-
label: model.name || model.id,
34-
description: model.name ? model.id : undefined,
35-
detail: model.description
36-
}))
43+
const manual_entry_item: vscode.QuickPickItem = {
44+
label: `$(add) ${t(
45+
'views.shared.actions.api.create.interactions.initial-select-model.enter-manually'
46+
)}`,
47+
alwaysShow: true
48+
}
49+
50+
const separator_item: vscode.QuickPickItem = {
51+
label: '',
52+
kind: vscode.QuickPickItemKind.Separator
53+
}
54+
55+
const model_items: vscode.QuickPickItem[] = [
56+
manual_entry_item,
57+
separator_item,
58+
...models.map((model) => ({
59+
label: model.name || model.id,
60+
description: model.name ? model.id : undefined,
61+
detail: model.description
62+
}))
63+
]
3764

3865
let last_selected_model_id: string | undefined
3966

4067
while (true) {
41-
const selected_model = await new Promise<string | undefined>(
42-
(resolve) => {
43-
const quick_pick = vscode.window.createQuickPick()
44-
quick_pick.items = model_items
45-
quick_pick.title = t(
46-
'views.shared.actions.api.create.interactions.initial-select-model.title'
68+
const selected_model_item = await new Promise<
69+
vscode.QuickPickItem | undefined
70+
>((resolve) => {
71+
const quick_pick =
72+
vscode.window.createQuickPick<vscode.QuickPickItem>()
73+
quick_pick.items = model_items
74+
quick_pick.title = t(
75+
'views.shared.actions.api.create.interactions.initial-select-model.title'
76+
)
77+
quick_pick.placeholder = t(
78+
'views.shared.actions.api.create.interactions.initial-select-model.placeholder'
79+
)
80+
quick_pick.buttons = [vscode.QuickInputButtons.Back]
81+
82+
if (last_selected_model_id) {
83+
const active = model_items.find(
84+
(item) =>
85+
item !== separator_item &&
86+
item !== manual_entry_item &&
87+
(item.description || item.label) === last_selected_model_id
4788
)
48-
quick_pick.placeholder = t(
49-
'views.shared.actions.api.create.interactions.initial-select-model.placeholder'
50-
)
51-
quick_pick.buttons = [vscode.QuickInputButtons.Back]
52-
53-
if (last_selected_model_id) {
54-
const active = model_items.find(
55-
(item) =>
56-
(item.description || item.label) === last_selected_model_id
57-
)
58-
if (active) quick_pick.activeItems = [active]
59-
}
60-
61-
let accepted = false
62-
const disposables: vscode.Disposable[] = []
63-
64-
disposables.push(
65-
quick_pick.onDidAccept(() => {
66-
accepted = true
67-
const selected = quick_pick.selectedItems[0]
68-
resolve(selected.description || selected.label)
69-
quick_pick.hide()
70-
}),
71-
quick_pick.onDidTriggerButton((button) => {
72-
if (button === vscode.QuickInputButtons.Back) {
73-
quick_pick.hide()
74-
}
75-
}),
76-
quick_pick.onDidHide(() => {
77-
if (!accepted) resolve(undefined)
78-
disposables.forEach((d) => d.dispose())
79-
quick_pick.dispose()
80-
})
81-
)
82-
quick_pick.show()
89+
if (active) quick_pick.activeItems = [active]
8390
}
84-
)
8591

86-
if (!selected_model) return undefined
92+
let accepted = false
93+
const disposables: vscode.Disposable[] = []
94+
95+
disposables.push(
96+
quick_pick.onDidAccept(() => {
97+
accepted = true
98+
resolve(quick_pick.selectedItems[0])
99+
quick_pick.hide()
100+
}),
101+
quick_pick.onDidTriggerButton((button) => {
102+
if (button === vscode.QuickInputButtons.Back) {
103+
quick_pick.hide()
104+
}
105+
}),
106+
quick_pick.onDidHide(() => {
107+
if (!accepted) resolve(undefined)
108+
disposables.forEach((d) => d.dispose())
109+
quick_pick.dispose()
110+
})
111+
)
112+
quick_pick.show()
113+
})
114+
115+
if (!selected_model_item) return undefined
116+
117+
if (selected_model_item === manual_entry_item) {
118+
break
119+
}
120+
121+
const selected_model = (
122+
selected_model_item.description || selected_model_item.label
123+
).trim()
87124

88125
last_selected_model_id = selected_model
89126

0 commit comments

Comments
 (0)