|
7 | 7 |
|
8 | 8 | const svelteDispatch = createEventDispatcher(); |
9 | 9 |
|
| 10 | + const DEFAULT_PROVIDER = 'openai'; |
| 11 | + const DEFAULT_MODEL = 'gpt-4o-mini'; |
| 12 | +
|
10 | 13 | /** @type {import('$agentTypes').AgentModel[]} */ |
11 | 14 | export let agents = []; |
12 | 15 |
|
13 | | - /** @type {any[]} */ |
14 | | - export let providers = []; |
| 16 | + /** @type {import('$commonTypes').LlmConfig[]} */ |
| 17 | + export let llmConfigs = []; |
15 | 18 |
|
16 | 19 | /** @type {boolean} */ |
17 | 20 | export let disabled = false; |
|
28 | 31 | /** @type {any[]} */ |
29 | 32 | let modelOptions = []; |
30 | 33 |
|
31 | | - /** @type {import('$agentTypes').AgentModel | null} */ |
| 34 | + /** @type {import('$agentTypes').AgentModel?} */ |
32 | 35 | let selectedAgent = null; |
33 | 36 | /** @type {any} */ |
34 | 37 | let selectedTemplate = null; |
35 | | - /** @type {any} */ |
| 38 | + /** @type {import('$commonTypes').LlmConfig?} */ |
36 | 39 | let selectedProvider = null; |
37 | 40 | /** @type {any} */ |
38 | 41 | let selectedModel = null; |
39 | 42 |
|
40 | 43 | $: { |
41 | | - agentOptions = collectAgentOptions(agents); |
| 44 | + collectAgentOptions(agents); |
| 45 | + collectLlmOptions(llmConfigs); |
42 | 46 | } |
43 | 47 |
|
44 | 48 | /** |
45 | 49 | * @param {import('$agentTypes').AgentModel[]} agents |
46 | 50 | */ |
47 | 51 | function collectAgentOptions(agents) { |
48 | | - return agents?.map(x => ({ |
| 52 | + agentOptions = agents?.map(x => ({ |
49 | 53 | id: x.id, |
50 | 54 | name: x.name |
51 | 55 | }))?.sort((a, b) => a.name.localeCompare(b.name)) || []; |
52 | 56 | } |
53 | 57 |
|
| 58 | + /** @param {import('$commonTypes').LlmConfig[]} llmConfigs */ |
| 59 | + function collectLlmOptions(llmConfigs) { |
| 60 | + providerOptions = llmConfigs?.map(x => ({ |
| 61 | + id: x.provider, |
| 62 | + name: x.provider |
| 63 | + }))?.sort((a, b) => a.name.localeCompare(b.name)) || []; |
| 64 | + } |
| 65 | +
|
54 | 66 | /** @param {any} e */ |
55 | 67 | function selectAgent(e) { |
56 | 68 | const selected = e.target.value || null; |
57 | 69 | selectedTemplate = null; |
58 | | - selectedAgent = agents.find(x => x.id === selected) || null; |
| 70 | + selectedAgent = agents?.find(x => x.id === selected) || null; |
59 | 71 | templateOptions = selectedAgent?.templates?.map(x => ({ |
60 | 72 | id: x.name, |
61 | 73 | name: x.name, |
62 | 74 | content: x.content |
63 | 75 | })) || []; |
64 | 76 |
|
| 77 | + const provider = selectedAgent?.llm_config?.provider || DEFAULT_PROVIDER; |
| 78 | + const model = selectedAgent?.llm_config?.model || DEFAULT_MODEL; |
| 79 | + selectedProvider = llmConfigs?.find(x => x.provider === provider) || null; |
| 80 | + onProviderChanged(model); |
| 81 | +
|
65 | 82 | svelteDispatch('agentSelected', { |
66 | | - selectedAgent: selectedAgent |
| 83 | + selectedAgent: selectedAgent, |
| 84 | + selectedTemplate: selectedTemplate, |
| 85 | + selectedProvider: selectedProvider?.provider, |
| 86 | + selectedModel: selectedModel?.name |
67 | 87 | }); |
68 | 88 | } |
69 | 89 |
|
70 | 90 | /** @param {any} e */ |
71 | 91 | function selectTemplate(e) { |
72 | 92 | const selected = e.target.value || null; |
73 | | - selectedTemplate = templateOptions.find(x => x.name === selected) || null; |
74 | | - svelteDispatch('templateSelected', { |
75 | | - selectedTemplate: selectedTemplate |
| 93 | + selectedTemplate = templateOptions.find(x => x.id === selected) || null; |
| 94 | + svelteDispatch('agentSelected', { |
| 95 | + selectedAgent: selectedAgent, |
| 96 | + selectedTemplate: selectedTemplate, |
| 97 | + selectedProvider: selectedProvider?.provider, |
| 98 | + selectedModel: selectedModel?.name |
76 | 99 | }); |
77 | 100 | } |
78 | 101 |
|
79 | 102 | /** @param {any} e */ |
80 | 103 | function selectProvider(e) { |
| 104 | + const selected = e.target.value || null; |
| 105 | + selectedProvider = llmConfigs?.find(x => x.provider === selected) || null; |
| 106 | + onProviderChanged(); |
81 | 107 |
|
| 108 | + svelteDispatch('llmSelected', { |
| 109 | + selectedProvider: selectedProvider?.provider, |
| 110 | + selectedModel: selectedModel?.name |
| 111 | + }); |
82 | 112 | } |
83 | 113 |
|
84 | 114 | /** @param {any} e */ |
85 | 115 | function selectModel(e) { |
| 116 | + const selected = e.target.value || null; |
| 117 | + selectedModel = modelOptions.find(x => x.id === selected); |
| 118 | +
|
| 119 | + svelteDispatch('llmSelected', { |
| 120 | + selectedProvider: selectedProvider?.provider, |
| 121 | + selectedModel: selectedModel?.name |
| 122 | + }); |
| 123 | + } |
| 124 | +
|
| 125 | + /** @param {any?} targetModel */ |
| 126 | + function onProviderChanged(targetModel = null) { |
| 127 | + modelOptions = selectedProvider?.models?.map(x => ({ |
| 128 | + id: x.name, |
| 129 | + name: x.name |
| 130 | + }))?.sort((a, b) => a.name.localeCompare(b.name)) || []; |
86 | 131 |
|
| 132 | + if (!!targetModel) { |
| 133 | + selectedModel = modelOptions.find(x => x.name === targetModel) || null; |
| 134 | + } else { |
| 135 | + selectedModel = modelOptions.length > 0 ? modelOptions[0] : null; |
| 136 | + } |
87 | 137 | } |
88 | 138 | </script> |
89 | 139 |
|
|
153 | 203 | <div class="instruct-setting-item"> |
154 | 204 | <div class="instruct-setting-dropdown"> |
155 | 205 | <div class="text-primary fw-bold mb-1">LLM Provider</div> |
156 | | - <select class="form-select" id="provider" value={selectedProvider?.id || null} disabled={disabled} on:change={e => selectProvider(e)}> |
| 206 | + <select class="form-select" id="provider" value={selectedProvider?.provider || null} disabled={disabled} on:change={e => selectProvider(e)}> |
157 | 207 | <option value={null} disabled selected>{$_('Select Provider')}</option> |
158 | 208 | {#each providerOptions as op} |
159 | | - <option value={`${op.id}`} selected={op.id === selectedProvider?.id}>{$_(`${op.name}`)}</option> |
| 209 | + <option value={`${op.id}`} selected={op.id === selectedProvider?.provider}>{$_(`${op.name}`)}</option> |
160 | 210 | {/each} |
161 | 211 | </select> |
162 | 212 | </div> |
|
0 commit comments