diff --git a/package-lock.json b/package-lock.json index 01585614..755c1f5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "twinny", - "version": "3.10.6", + "version": "3.10.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "twinny", - "version": "3.10.6", + "version": "3.10.7", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index d23a6183..ef688bb1 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "twinny", "displayName": "twinny - AI Code Completion and Chat", "description": "Locally hosted AI code completion plugin for vscode", - "version": "3.10.6", + "version": "3.10.7", "icon": "assets/icon.png", "keywords": [ "code-inference", diff --git a/src/common/constants.ts b/src/common/constants.ts index bc0313b2..c8d99dcc 100644 --- a/src/common/constants.ts +++ b/src/common/constants.ts @@ -65,7 +65,8 @@ export const MESSAGE_KEY = { export const SETTING_KEY = { fimModelName: 'fimModelName', chatModelName: 'chatModelName', - apiProvider: 'apiProvider' + apiProvider: 'apiProvider', + apiProviderFim: 'apiProviderFim' } export const CONTEXT_NAME = { diff --git a/src/extension/ollama-service.ts b/src/extension/ollama-service.ts index ca735a49..107bb6a5 100644 --- a/src/extension/ollama-service.ts +++ b/src/extension/ollama-service.ts @@ -1,30 +1,40 @@ import { workspace } from 'vscode' import { Logger } from '../common/logger' -import { ApiModels } from '../common/types' export class OllamaService { - private logger : Logger + private logger: Logger private _config = workspace.getConfiguration('twinny') private _apiHostname = this._config.get('apiHostname') as string private _chatApiPort = this._config.get('chatApiPort') as string private _fimApiPort = this._config.get('fimApiPort') as string private _useTls = this._config.get('useTls') as boolean - private _baseUrl: string + private _baseUrlChat: string + private _baseUrlFim: string - constructor () { + constructor() { this.logger = new Logger() - const useTls = this._useTls; - const port = this._chatApiPort || this._fimApiPort - const protocol = useTls ? 'https' : 'http'; - this._baseUrl = `${protocol}://${this._apiHostname}:${port}` + const useTls = this._useTls + const protocol = useTls ? 'https' : 'http' + this._baseUrlChat = `${protocol}://${this._apiHostname}:${this._chatApiPort}` + this._baseUrlFim = `${protocol}://${this._apiHostname}:${this._fimApiPort}` } - public fetchModels = async (resource = '/api/tags'): Promise => { - const res = await fetch(this._baseUrl + resource) - if (!res.ok) { - this.logger.error(new Error(`${res.status}`)) - throw Error('Failed to get ollama models') + public fetchModels = async (resource = '/api/tags') => { + const chatModelsRes = (await fetch(this._baseUrlChat + resource)) || [] + const fimModelsRes = await fetch(this._baseUrlFim + resource) + const { models: chatModels } = await chatModelsRes.json() + const { models: fimModels } = await fimModelsRes.json() + const models = new Set() + if (Array.isArray(chatModels)) { + for (const model of chatModels) { + models.add(model) + } } - return await res.json() + if (Array.isArray(fimModels)) { + for (const model of fimModels) { + models.add(model) + } + } + return Array.from(models) } } diff --git a/src/extension/providers/sidebar.ts b/src/extension/providers/sidebar.ts index 70c00f64..36046af2 100644 --- a/src/extension/providers/sidebar.ts +++ b/src/extension/providers/sidebar.ts @@ -123,7 +123,7 @@ export class SidebarProvider implements vscode.WebviewViewProvider { this.view?.webview.postMessage({ type: MESSAGE_NAME.twinnyFetchOllamaModels, value: { - data: models.models + data: models } } as ServerMessage) } catch (e) { diff --git a/src/webview/chat.tsx b/src/webview/chat.tsx index abd1ca99..73214032 100644 --- a/src/webview/chat.tsx +++ b/src/webview/chat.tsx @@ -13,12 +13,10 @@ import { ASSISTANT, MESSAGE_KEY, MESSAGE_NAME, - SETTING_KEY, USER } from '../common/constants' import { - useConfigurationSetting, useLanguage, useSelection, useTheme, @@ -56,9 +54,7 @@ export const Chat = () => { const [messages, setMessages] = useState() const [completion, setCompletion] = useState() const [showModelSelect, setShowModelSelect] = useState(false) - const { configurationSetting: apiProvider } = useConfigurationSetting( - SETTING_KEY.apiProvider - ) + const markdownRef = useRef(null) const autoScrollContext = useWorkSpaceContext(MESSAGE_KEY.autoScroll) @@ -291,7 +287,7 @@ export const Chat = () => { onSelect={scrollBottom} language={language} /> - {showModelSelect && } + {showModelSelect && }
{ +export const ModelSelect = () => { const { models, saveModel, fimModelName, chatModelName } = useModels() + const { configurationSetting: apiProvider } = useConfigurationSetting( + SETTING_KEY.apiProvider + ) + const { configurationSetting: apiProviderFim } = useConfigurationSetting( + SETTING_KEY.apiProviderFim + ) const handleOnChangeChat = (e: unknown): void => { const event = e as React.ChangeEvent @@ -30,57 +32,62 @@ export const ModelSelect = ({ apiProvider }: ModelSelectProps) => { saveModel(selectedValue)(SETTING_KEY.fimModelName) } - // TODO: Refactor to map - if (apiProvider !== ApiProviders.Ollama) { - return ( -
+ const isOllamaChat = apiProvider === ApiProviders.Ollama + const isOllamaFim = apiProviderFim === ApiProviders.Ollama + + return ( +
+ {!isOllamaChat ? ( + +
+ + +
+ + ) : (
- + + {models?.map((model, index) => { + return ( + + ) + })} +
+ )} + {!isOllamaFim ? ( +
+
+ + +
+
+ ) : (
- + + {models?.map((model, index) => { + return ( + + ) + })} + +
- - ) - } - - return ( -
-
- - - {models?.map((model, index) => { - return ( - - ) - })} - -
-
- - - {models?.map((model, index) => { - return ( - - ) - })} - - -
+ )}
) }