diff --git a/package.json b/package.json index 54bb671..fc4759f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "word-gpt-plus", - "version": "0.3.4", + "version": "0.4.0", "private": true, "scripts": { "dev": "vue-cli-service serve --port 3000", @@ -29,7 +29,7 @@ }, "devDependencies": { "@picgo/bump-version": "^1.1.2", - "@types/office-js": "^1.0.376", + "@types/office-js": "^1.0.377", "@typescript-eslint/eslint-plugin": "^6.14.0", "@typescript-eslint/parser": "^6.14.0", "@vue/cli-plugin-babel": "^5.0.8", diff --git a/release/docker/manifest.xml b/release/docker/manifest.xml deleted file mode 100644 index a2b3e30..0000000 --- a/release/docker/manifest.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - 6b20e038-5f8e-4e3b-8481-976c5a9c0bc3 - - - 1.0.0.0 - Kuingsmile - en-US - - - - - - - - - - - - - - AppDomain1 - AppDomain2 - AppDomain3 - - - - - - - - - - - - - ReadWriteDocument - - - - - - - - - - - - - - - - - - <!-- Description of the Getting Started callout. resid points to a LongString resource --> - <Description resid="GetStarted.Description"/> - - <!-- Point to a url resource which details how the add-in should be used. --> - <LearnMoreUrl resid="GetStarted.LearnMoreUrl"/> - </GetStarted> - <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called. - Think of the FunctionFile as the code behind ExecuteFunction. --> - <FunctionFile resid="Commands.Url" /> - - <!-- PrimaryCommandSurface is the main Office Ribbon. --> - <ExtensionPoint xsi:type="PrimaryCommandSurface"> - <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. --> - <OfficeTab id="TabHome"> - <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. --> - <Group id="CommandsGroup"> - <!-- Label for your group. resid must point to a ShortString resource. --> - <Label resid="CommandsGroup.Label" /> - <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. --> - <!-- Use PNG icons. All URLs on the resources section must use HTTPS. --> - <Icon> - <bt:Image size="16" resid="Icon.16x16" /> - <bt:Image size="32" resid="Icon.32x32" /> - <bt:Image size="80" resid="Icon.80x80" /> - </Icon> - - <!-- Control. It can be of type "Button" or "Menu". --> - <Control xsi:type="Button" id="TaskpaneButton"> - <Label resid="TaskpaneButton.Label" /> - <Supertip> - <!-- ToolTip title. resid must point to a ShortString resource. --> - <Title resid="TaskpaneButton.Label" /> - <!-- ToolTip description. resid must point to a LongString resource. --> - <Description resid="TaskpaneButton.Tooltip" /> - </Supertip> - <Icon> - <bt:Image size="16" resid="Icon.16x16" /> - <bt:Image size="32" resid="Icon.32x32" /> - <bt:Image size="80" resid="Icon.80x80" /> - </Icon> - - <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. --> - <Action xsi:type="ShowTaskpane"> - <TaskpaneId>ButtonId1</TaskpaneId> - <!-- Provide a url resource id for the location that will be displayed on the task pane. --> - <SourceLocation resid="Taskpane.Url" /> - </Action> - </Control> - </Group> - </OfficeTab> - </ExtensionPoint> - </DesktopFormFactor> - </Host> - </Hosts> - - <!-- You can use resources across hosts and form factors. --> - <Resources> - <bt:Images> - <bt:Image id="Icon.16x16" DefaultValue="http://106.54.217.17:8088//assets/icon-16.png"/> - <bt:Image id="Icon.32x32" DefaultValue="http://106.54.217.17:8088//assets/icon-32.png"/> - <bt:Image id="Icon.80x80" DefaultValue="http://106.54.217.17:8088//assets/icon-80.png"/> - </bt:Images> - <bt:Urls> - <bt:Url id="GetStarted.LearnMoreUrl" DefaultValue="https://go.microsoft.com/fwlink/?LinkId=276812" /> - <bt:Url id="Commands.Url" DefaultValue="http://106.54.217.17:8088//commands.html" /> - <bt:Url id="Taskpane.Url" DefaultValue="http://106.54.217.17:8088//index.html" /> - </bt:Urls> - <!-- ShortStrings max characters==125. --> - <bt:ShortStrings> - <bt:String id="GetStarted.Title" DefaultValue="Get started with chatGPT!" /> - <bt:String id="CommandsGroup.Label" DefaultValue="GPT" /> - <bt:String id="TaskpaneButton.Label" DefaultValue="GPT Plus" /> - </bt:ShortStrings> - <!-- LongStrings max characters==250. --> - <bt:LongStrings> - <bt:String id="GetStarted.Description" DefaultValue="Your sample add-in loaded successfully. Go to the HOME tab and click the 'Show Taskpane' button to get started." /> - <bt:String id="TaskpaneButton.Tooltip" DefaultValue="Click to Show a Taskpane" /> - </bt:LongStrings> - </Resources> - </VersionOverrides> - <!-- End Add-in Commands Mode integration. --> - -</OfficeApp> diff --git a/src/api/gemini.ts b/src/api/gemini.ts index 3309b7b..e3187e6 100644 --- a/src/api/gemini.ts +++ b/src/api/gemini.ts @@ -24,7 +24,6 @@ async function createChatCompletionStream (options: ChatCompletionStreamOptions) const model = genAI.getGenerativeModel({ model: options.geminiModel ?? 'gemini-pro' }) - console.log('historyDialog', options.historyDialog.value) const chat = model.startChat({ history: options.historyDialog.value, generationConfig @@ -32,8 +31,6 @@ async function createChatCompletionStream (options: ChatCompletionStreamOptions) const result = await chat.sendMessage(options.messages) const response = await result.response const text = response.text() - console.log('text', text) - console.log('response', response) updateResultAndHistory(text, options.messages, options.result, options.historyDialog) } catch (error: any) { handleError(error, options.result, options.errorIssue) diff --git a/src/api/index.ts b/src/api/index.ts index 4672330..07f90f3 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -4,6 +4,7 @@ import azure from './azure' import palm from './palm' import common from './common' import gemini from './gemini' +import ollama from './ollama' export default { webapi, @@ -11,5 +12,6 @@ export default { azure, palm, gemini, - common + common, + ollama } diff --git a/src/api/ollama.ts b/src/api/ollama.ts new file mode 100644 index 0000000..814bb8c --- /dev/null +++ b/src/api/ollama.ts @@ -0,0 +1,50 @@ +import { Ref } from 'vue' +import axios from 'axios' + +async function createChatCompletionStream ( + ollamaEndpoint: string, + ollamaModel: string, + messages: any[], + result: Ref<string>, + historyDialog: Ref<any[]>, + errorIssue: Ref<boolean>, + loading: Ref<boolean>, + temperature?: number +): Promise<void> { + const formatedEndpoint = ollamaEndpoint.replace(/\/$/, '') + const url = `${formatedEndpoint}/api/chat` + const headers = { + 'Content-Type': 'application/json' + } + const body = { + model: ollamaModel, + options: { + temperature + }, + stream: false, + messages + } + let response + try { + response = await axios.post(url, body, { + headers + }) + if (response.status !== 200) { + throw new Error(`Status code: ${response.status}`) + } + result.value = response.data?.message?.content?.replace(/\\n/g, '\n') ?? '' + historyDialog.value.push({ + role: 'assistant', + content: result.value + }) + } catch (error) { + console.error(error) + result.value = String(error) + errorIssue.value = true + } + loading.value = false +} + +export default { + createChatCompletionStream +} diff --git a/src/i18n/index.ts b/src/i18n/index.ts index a07e121..5868bcf 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -28,6 +28,7 @@ const messages = { settingModel: 'Model', settingBasePath: 'Forward domain', settingReplyLanguage: 'Reply', + settingOllamaEndpoint: 'endpoint', settingProxy: 'Proxy', settingClickToShow: 'Click to set', settingEnableProxy: 'Enable proxy', @@ -86,6 +87,7 @@ const messages = { settingModel: '选择模型', settingBasePath: '转发域名', settingReplyLanguage: '回复语言', + settingOllamaEndpoint: 'endpoint', settingProxy: '代理', settingClickToShow: '点击设置', settingEnableProxy: '启用代理', diff --git a/src/pages/HomePage.vue b/src/pages/HomePage.vue index 5e51586..3702224 100644 --- a/src/pages/HomePage.vue +++ b/src/pages/HomePage.vue @@ -210,7 +210,7 @@ {{ $t('start') }} </el-button> <el-button - v-if="['web-api', 'azure', 'official', 'gemini'].includes(api)" + v-if="['web-api', 'azure', 'official', 'gemini', 'ollama'].includes(api)" class="api-button" type="success" size="default" @@ -398,7 +398,7 @@ <script lang="ts" setup> import { onBeforeMount, ref } from 'vue' import { useRouter } from 'vue-router' -import { localStorageKey, languageMap, buildInPrompt, availableModels, availableModelsForPalm, availableModelsForGemini } from '@/utils/constant' +import { localStorageKey, languageMap, buildInPrompt, availableModels, availableModelsForPalm, availableModelsForGemini, availableModelsForOllama } from '@/utils/constant' import { promptDbInstance } from '@/store/promtStore' import { IStringKeyMap } from '@/types' import { CirclePlus, Remove } from '@element-plus/icons-vue' @@ -412,7 +412,7 @@ const replyLanguageList = Object.values(languageMap).map((key) => ({ value: key })) -const api = ref<'web-api' | 'official' | 'azure' | 'palm' | 'gemini'>('official') +const api = ref<'web-api' | 'official' | 'azure' | 'palm' | 'gemini' | 'ollama'>('official') const apiKey = ref('') const accessToken = ref('') const azureAPIKey = ref('') @@ -443,6 +443,10 @@ const geminiMaxTokens = ref(800) const geminiTemperature = ref(0.7) const geminiModel = ref('gemini-pro') +const ollamaEndpoint = ref('') +const ollamaModel = ref('llama2') +const ollamaTemperature = ref(0.7) + const systemPrompt = ref('') const systemPromptSelected = ref('') const systemPromptList = ref<IStringKeyMap[]>([]) @@ -554,7 +558,7 @@ function handelPromptChange (val: string) { } onBeforeMount(async () => { - api.value = localStorage.getItem(localStorageKey.api) as 'web-api' | 'official' | 'azure' | 'palm' | 'gemini' || 'official' + api.value = localStorage.getItem(localStorageKey.api) as 'web-api' | 'official' | 'azure' | 'palm' | 'gemini' | 'ollama' || 'official' replyLanguage.value = localStorage.getItem(localStorageKey.replyLanguage) || 'English' localLanguage.value = localStorage.getItem(localStorageKey.localLanguage) || 'en' apiKey.value = localStorage.getItem(localStorageKey.apiKey) || '' @@ -599,6 +603,16 @@ onBeforeMount(async () => { } else { geminiModel.value = availableModelsForGemini['gemini-pro'] } + ollamaEndpoint.value = localStorage.getItem(localStorageKey.ollamaEndpoint) || '' + const ollamaModelTemp = localStorage.getItem(localStorageKey.ollamaModel) || availableModelsForOllama.llama2 + if (Object.keys(availableModelsForOllama).includes(ollamaModelTemp)) { + ollamaModel.value = availableModelsForOllama[ollamaModelTemp] + } else if (Object.values(availableModelsForOllama).includes(ollamaModelTemp)) { + ollamaModel.value = ollamaModelTemp + } else { + ollamaModel.value = availableModelsForOllama.llama2 + } + ollamaTemperature.value = forceNumber(localStorage.getItem(localStorageKey.ollamaTemperature)) || 0.7 insertType.value = localStorage.getItem(localStorageKey.insertType) || 'replace' as 'replace' | 'append' | 'newLine' | 'NoAction' systemPrompt.value = localStorage.getItem(localStorageKey.defaultSystemPrompt) || 'Act like a personal assistant.' await getSystemPromptList() @@ -747,6 +761,23 @@ async function template (taskType: keyof typeof buildInPrompt | 'custom') { geminiModel: geminiModel.value } ) + } else if (api.value === 'ollama' && ollamaEndpoint.value) { + historyDialog.value = [ + { + role: 'user', + content: systemMessage + '\n' + userMessage + } + ] + await API.ollama.createChatCompletionStream( + ollamaEndpoint.value, + ollamaModel.value, + historyDialog.value, + result, + historyDialog, + errorIssue, + loading, + ollamaTemperature.value + ) } else { ElMessage.error('Set API Key or Access Token first') return @@ -891,6 +922,27 @@ async function continueChat () { errorIssue.value = true console.error(error) } + } else if (api.value === 'ollama') { + try { + historyDialog.value.push({ + role: 'user', + content: 'continue' + }) + await API.ollama.createChatCompletionStream( + ollamaEndpoint.value, + ollamaModel.value, + historyDialog.value, + result, + historyDialog, + errorIssue, + loading, + ollamaTemperature.value + ) + } catch (error) { + result.value = String(error) + errorIssue.value = true + console.error(error) + } } else if (api.value === 'web-api') { try { const config = API.webapi.setUnofficalConfig(accessToken.value) diff --git a/src/pages/SettingsPage.vue b/src/pages/SettingsPage.vue index eeaa99e..7f021fb 100644 --- a/src/pages/SettingsPage.vue +++ b/src/pages/SettingsPage.vue @@ -89,6 +89,28 @@ @blur="handleAccessTokenChange" /> </el-form-item> + <el-form-item + v-if="false" + > + <template #label> + <span> + {{ $t('settingModel') }} + </span> + </template> + <el-select + v-model="webModel" + size="small" + :placeholder="$t('settingModel')" + @change="handleWebModelChange" + > + <el-option + v-for="item in webModelList" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> <el-form-item v-if="api === 'official'" > @@ -104,6 +126,76 @@ @blur="handleApiKeyChange" /> </el-form-item> + <el-form-item + v-if="api === 'official'" + > + <template #label> + <span> + {{ $t('settingBasePath') }} + </span> + </template> + <el-input + v-model="basePath" + :placeholder="$t('settingBasePath')" + size="small" + @blur="handleBasePathChange" + /> + </el-form-item> + <el-form-item + v-if="api === 'official'" + > + <template #label> + <span> + {{ $t('settingModel') }} + </span> + </template> + <el-select + v-model="model" + size="small" + :placeholder="$t('settingModel')" + @change="handleModelChange" + > + <el-option + v-for="item in modelList" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + <el-form-item + v-if="api === 'official'" + > + <template #label> + <span> + {{ $t('settingTemperature') }} + </span> + </template> + <el-input-number + v-model="temperature" + :min="0" + :max="2" + :step="0.1" + size="small" + @change="handleTemperatureChange" + /> + </el-form-item> + <el-form-item + v-if="api === 'official'" + > + <template #label> + <span> + {{ $t('settingMaxTokens') }} + </span> + </template> + <el-input-number + v-model="maxTokens" + :min="1" + :step="1" + size="small" + @change="handleMaxTokensChange" + /> + </el-form-item> <el-form-item v-if="api === 'azure'" > @@ -212,6 +304,28 @@ @blur="handlePalmAPIEndpointChange" /> </el-form-item> + <el-form-item + v-if="api === 'palm'" + > + <template #label> + <span> + {{ $t('settingModel') }} + </span> + </template> + <el-select + v-model="palmModel" + size="small" + :placeholder="$t('settingModel')" + @change="handlePalmModelChange" + > + <el-option + v-for="item in palmModelList" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> <el-form-item v-if="api === 'palm'" > @@ -316,66 +430,22 @@ </el-select> </el-form-item> <el-form-item - v-if="api === 'palm'" - > - <template #label> - <span> - {{ $t('settingModel') }} - </span> - </template> - <el-select - v-model="palmModel" - size="small" - :placeholder="$t('settingModel')" - @change="handlePalmModelChange" - > - <el-option - v-for="item in palmModelList" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </el-form-item> - <el-form-item - v-if="api === 'official'" + v-if="api === 'ollama'" > <template #label> <span> - {{ $t('settingBasePath') }} + {{ $t('settingOllamaEndpoint') }} </span> </template> <el-input - v-model="basePath" - :placeholder="$t('settingBasePath')" + v-model="ollamaEndpoint" + :placeholder="$t('settingOllamaEndpoint')" size="small" - @blur="handleBasePathChange" + @blur="handleOllamaEndpointChange" /> </el-form-item> <el-form-item - v-if="api === 'official'" - > - <template #label> - <span> - {{ $t('settingModel') }} - </span> - </template> - <el-select - v-model="model" - size="small" - :placeholder="$t('settingModel')" - @change="handleModelChange" - > - <el-option - v-for="item in modelList" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </el-form-item> - <el-form-item - v-if="false" + v-if="api === 'ollama'" > <template #label> <span> @@ -383,13 +453,13 @@ </span> </template> <el-select - v-model="webModel" + v-model="ollamaModel" size="small" :placeholder="$t('settingModel')" - @change="handleWebModelChange" + @change="handleOllamaModelChange" > <el-option - v-for="item in webModelList" + v-for="item in ollamaModelList" :key="item.value" :label="item.label" :value="item.value" @@ -397,7 +467,7 @@ </el-select> </el-form-item> <el-form-item - v-if="api === 'official'" + v-if="api === 'ollama'" > <template #label> <span> @@ -405,28 +475,12 @@ </span> </template> <el-input-number - v-model="temperature" + v-model="ollamaTemperature" :min="0" - :max="2" + :max="1" :step="0.1" size="small" - @change="handleTemperatureChange" - /> - </el-form-item> - <el-form-item - v-if="api === 'official'" - > - <template #label> - <span> - {{ $t('settingMaxTokens') }} - </span> - </template> - <el-input-number - v-model="maxTokens" - :min="1" - :step="1" - size="small" - @change="handleMaxTokensChange" + @change="handleOllamaTemperatureChange" /> </el-form-item> <el-form-item> @@ -458,7 +512,7 @@ <script lang="ts" setup> import { onBeforeMount, ref } from 'vue' import { useI18n } from 'vue-i18n' -import { languageMap, availableModels, localStorageKey, availableModelsForPlus, availableModelsForPalm, availableModelsForGemini } from '@/utils/constant' +import { languageMap, availableModels, localStorageKey, availableModelsForPlus, availableModelsForPalm, availableModelsForGemini, availableModelsForOllama } from '@/utils/constant' import { useRouter } from 'vue-router' import { forceNumber } from '@/utils/common' @@ -500,7 +554,12 @@ const geminiModelList = Object.keys(availableModelsForGemini).map((key) => ({ value: availableModelsForGemini[key] })) -const api = ref<'official' | 'web-api' | 'azure' | 'palm' | 'gemini'>('official') +const ollamaModelList = Object.keys(availableModelsForOllama).map((key) => ({ + label: key, + value: availableModelsForOllama[key] +})) + +const api = ref<'official' | 'web-api' | 'azure' | 'palm' | 'gemini' | 'ollama'>('official') const currentUILanguage = ref('en') const replyLanguage = ref('English') // web API @@ -529,6 +588,10 @@ const geminiAPIKey = ref('') const geminiModel = ref(availableModelsForGemini['gemini-pro']) const geminiTemperature = ref(0.7) const geminiMaxTokens = ref(800) +// ollama API +const ollamaEndpoint = ref('') +const ollamaModel = ref(availableModelsForOllama.llama2) +const ollamaTemperature = ref(0.7) const apiList = [ { @@ -546,6 +609,10 @@ const apiList = [ { label: 'gemini', value: 'gemini' + }, + { + label: 'ollama', + value: 'ollama' } ] @@ -557,7 +624,7 @@ onBeforeMount(() => { function initData () { // common - api.value = localStorage.getItem(localStorageKey.api) as 'official' | 'web-api' | 'azure'| 'palm' | 'gemini' || 'official' + api.value = localStorage.getItem(localStorageKey.api) as 'official' | 'web-api' | 'azure'| 'palm' | 'gemini' | 'ollama' || 'official' currentUILanguage.value = localStorage.getItem(localStorageKey.localLanguage) || 'en' replyLanguage.value = localStorage.getItem(localStorageKey.replyLanguage) || 'English' // web API @@ -607,6 +674,17 @@ function initData () { } else { geminiModel.value = availableModelsForGemini['gemini-pro'] } + // ollama API + ollamaEndpoint.value = localStorage.getItem(localStorageKey.ollamaEndpoint) || '' + const ollamaModelTemp = localStorage.getItem(localStorageKey.ollamaModel) || availableModelsForOllama.llama2 + if (Object.keys(availableModelsForOllama).includes(ollamaModelTemp)) { + ollamaModel.value = availableModelsForOllama[ollamaModelTemp] + } else if (Object.values(availableModelsForOllama).includes(ollamaModelTemp)) { + ollamaModel.value = ollamaModelTemp + } else { + ollamaModel.value = availableModelsForOllama.llama2 + } + ollamaTemperature.value = forceNumber(localStorage.getItem(localStorageKey.ollamaTemperature)) || 0.7 } // common @@ -708,6 +786,18 @@ function handleGeminiModelChange (val: string) { localStorage.setItem(localStorageKey.geminiModel, val) } +function handleOllamaEndpointChange () { + localStorage.setItem(localStorageKey.ollamaEndpoint, ollamaEndpoint.value) +} + +function handleOllamaModelChange (val: string) { + localStorage.setItem(localStorageKey.ollamaModel, val) +} + +function handleOllamaTemperatureChange () { + localStorage.setItem(localStorageKey.ollamaTemperature, ollamaTemperature.value.toString()) +} + function backToHome () { router.push('/') } diff --git a/src/utils/common.ts b/src/utils/common.ts index bc0de9c..a23541c 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1,5 +1,5 @@ export interface Auth { - type: 'web-api' | 'official' | 'azure' | 'palm' | 'gemini'; + type: 'web-api' | 'official' | 'azure' | 'palm' | 'gemini' | 'ollama' [propName: string]: any; } @@ -10,7 +10,8 @@ export function checkAuth (auth: Auth): boolean { (auth.type === 'official' && !!auth.apiKey) || (auth.type === 'azure' && !!auth.azureAPIKey) || (auth.type === 'palm' && !!auth.palmAPIKey) || - (auth.type === 'gemini' && !!auth.geminiAPIKey)) + (auth.type === 'gemini' && !!auth.geminiAPIKey) || + (auth.type === 'ollama')) ) } diff --git a/src/utils/constant.ts b/src/utils/constant.ts index 0688597..6db95aa 100644 --- a/src/utils/constant.ts +++ b/src/utils/constant.ts @@ -78,6 +78,25 @@ export const availableModelsForGemini: IStringKeyMap = { 'gemini-pro': 'gemini-pro' } +// Ollama API 可用的模型 +export const availableModelsForOllama: IStringKeyMap = { + llama2: 'llama2', + mistral: 'mistral', + 'dolphin-phi': 'dolphin-phi', + phi: 'phi', + 'neural-chat': 'neural-chat', + 'starlinh-lm': 'starlinh-lm', + codellama: 'codellama', + 'llama2-uncensored': 'llama2-uncensored', + 'llama2:13b': 'llama2:13b', + 'llama2:70b': 'llama2:70b', + 'orca-mini': 'orca-mini', + vicuna: 'vicuna', + llava: 'llava', + 'gemma:2b': 'gemma:2b', + 'gemma:7b': 'gemma:7b' +} + export enum localStorageKey { // common api = 'api', @@ -110,6 +129,10 @@ export enum localStorageKey { geminiMaxTokens = 'geminiMaxTokens', geminiTemperature = 'geminiTemperature', geminiModel = 'geminiModel', + // ollama api + ollamaEndpoint = 'ollamaEndpoint', + ollamaModel = 'ollamaModel', + ollamaTemperature = 'ollamaTemperature', // proxy enableProxy = 'enableProxy', proxy = 'proxy', diff --git a/yarn.lock b/yarn.lock index b867388..02a9cdc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1748,10 +1748,10 @@ resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== -"@types/office-js@^1.0.376": - version "1.0.376" - resolved "https://registry.yarnpkg.com/@types/office-js/-/office-js-1.0.376.tgz#b6c85d60b74080d7237f7bd44dba297fd0493f04" - integrity sha512-tK9AxUYH5+Af47VrHq+Mx8sFL8fWBCXs0zUm4k1EIi8uFFO295lj5VQq+Iqp6yZQkQeuYSWMEOBCSRrut0UaNA== +"@types/office-js@^1.0.377": + version "1.0.377" + resolved "https://registry.yarnpkg.com/@types/office-js/-/office-js-1.0.377.tgz#838d0e0fc52d4f2f7911e22d6313b69ccddd7867" + integrity sha512-q8hB7tmTqRkxmB8voriZe7MNyrvZhtpo+BN60ZcZNyZubp0IgDg4e23HvY1KKXCECEUDi3DCIcABS09OF6mLrg== "@types/parse-json@^4.0.0": version "4.0.0"