1- import {
2- chatModelOptions ,
3- defaultChatModel ,
4- requestChatCompletion ,
5- streamChatCompletion ,
6- } from './api/completions.js'
1+ import { requestChatCompletion , streamChatCompletion } from './api/completions.js'
72import {
83 formatModelAccessErrorMessage ,
94 isCredentialError ,
105 isModelAccessError ,
116 isModelAccessStatusMessage ,
127 toChatText ,
13- toModelId ,
148 toRepositoryLabel ,
159 toRepositoryUrl ,
1610} from './utils.js'
1711import { createChatKeyControls } from './key-controls.js'
12+ import { createChatModelPicker } from './model-picker.js'
1813import {
1914 buildActiveTabEditorContext ,
2015 normalizeWorkspaceTabContext ,
@@ -177,28 +172,35 @@ export const createChatDrawer = ({
177172 pendingAbortController = null
178173 }
179174
180- const setModelSelectDisabled = isDisabled => {
181- if ( ! ( modelSelect instanceof HTMLSelectElement ) ) {
182- return
183- }
184-
185- modelSelect . disabled = isDisabled
186- }
187-
188175 const keyControls = createChatKeyControls ( {
189176 root : keyRoot ,
190177 input : keyInput ,
191178 addButton : keyAddButton ,
192179 deleteButton : keyDeleteButton ,
193180 onKeyChange : nextKey => {
194- syncModelSelectionForKey ( nextKey )
181+ modelPicker . invalidateCatalogCache ( )
182+ modelPicker . syncModelSelectionForKey ( nextKey )
195183 syncComposerAvailability ( )
184+
185+ if ( open ) {
186+ void modelPicker . loadModelOptionsFromCatalog ( { force : true } )
187+ }
196188 } ,
197189 } )
198190
199191 const getChatKey = ( ) => keyControls . getKey ( )
200192 const hasChatKey = ( ) => keyControls . hasKey ( )
201193
194+ const modelPicker = createChatModelPicker ( {
195+ modelSelect,
196+ getChatKey,
197+ resetModelAccessStatus : ( ) => {
198+ if ( isModelAccessStatusMessage ( statusNode ?. textContent ) ) {
199+ setChatStatus ( 'Idle' , 'neutral' )
200+ }
201+ } ,
202+ } )
203+
202204 const syncComposerAvailability = ( ) => {
203205 const keyPresent = hasChatKey ( )
204206
@@ -211,57 +213,7 @@ export const createChatDrawer = ({
211213 }
212214 }
213215
214- const replaceModelOptions = ( { modelIds, selectedModel } ) => {
215- if ( ! ( modelSelect instanceof HTMLSelectElement ) ) {
216- return
217- }
218-
219- const nextSelectedModel = toModelId ( selectedModel )
220- const nextModelIds = [ ...new Set ( [ defaultChatModel , ...modelIds ] ) ]
221-
222- modelSelect . replaceChildren ( )
223-
224- for ( const modelId of nextModelIds ) {
225- const option = document . createElement ( 'option' )
226- option . value = modelId
227- option . textContent = modelId
228- option . selected = modelId === nextSelectedModel
229- modelSelect . append ( option )
230- }
231-
232- if ( ! nextModelIds . includes ( nextSelectedModel ) ) {
233- modelSelect . value = defaultChatModel
234- }
235- }
236-
237- const getSelectedModel = ( ) => {
238- if ( ! ( modelSelect instanceof HTMLSelectElement ) ) {
239- return defaultChatModel
240- }
241-
242- return toModelId ( modelSelect . value )
243- }
244-
245- const initializeModelOptions = ( ) => {
246- replaceModelOptions ( {
247- modelIds : chatModelOptions ,
248- selectedModel : defaultChatModel ,
249- } )
250- }
251-
252- const syncModelSelectionForKey = key => {
253- const keyPresent = typeof key === 'string' && key . trim ( ) . length > 0
254-
255- setModelSelectDisabled ( ! keyPresent )
256-
257- if ( ! keyPresent && modelSelect instanceof HTMLSelectElement ) {
258- modelSelect . value = defaultChatModel
259- }
260-
261- if ( keyPresent && isModelAccessStatusMessage ( statusNode ?. textContent ) ) {
262- setChatStatus ( 'Idle' , 'neutral' )
263- }
264- }
216+ const getSelectedModel = ( ) => modelPicker . getSelectedModel ( )
265217
266218 const setOpen = nextOpen => {
267219 open = nextOpen === true
@@ -280,6 +232,10 @@ export const createChatDrawer = ({
280232 if ( open && promptInput instanceof HTMLTextAreaElement ) {
281233 promptInput . focus ( )
282234 }
235+
236+ if ( open ) {
237+ void modelPicker . loadModelOptionsFromCatalog ( )
238+ }
283239 }
284240
285241 const setChatStatus = ( text , level = 'neutral' ) => {
@@ -989,8 +945,8 @@ export const createChatDrawer = ({
989945
990946 toggleButton ?. setAttribute ( 'aria-expanded' , 'false' )
991947 drawer ?. setAttribute ( 'hidden' , '' )
992- initializeModelOptions ( )
993- syncModelSelectionForKey ( getChatKey ( ) )
948+ modelPicker . initializeModelOptions ( )
949+ modelPicker . syncModelSelectionForKey ( getChatKey ( ) )
994950 syncComposerAvailability ( )
995951 syncRepositoryLabel ( )
996952 ensureUndoActionsNode ( )
0 commit comments