From 9aa3a613479bd2483a3e74e5ef75ace2259fed66 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 21 Aug 2024 14:04:37 +0700 Subject: [PATCH] feat: openrouter model settings (#3422) --- core/src/browser/extension.ts | 12 ++++++-- .../resources/settings.json | 10 +++++++ .../src/index.ts | 28 +++++++++++++------ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/core/src/browser/extension.ts b/core/src/browser/extension.ts index e39caf206..def85093e 100644 --- a/core/src/browser/extension.ts +++ b/core/src/browser/extension.ts @@ -118,10 +118,18 @@ export abstract class BaseExtension implements ExtensionType { setting.extensionName = this.name }) try { - await fs.mkdir(extensionSettingFolderPath) + if (!(await fs.existsSync(extensionSettingFolderPath))) + await fs.mkdir(extensionSettingFolderPath) const settingFilePath = await joinPath([extensionSettingFolderPath, this.settingFileName]) - if (await fs.existsSync(settingFilePath)) return + // Persists new setting only + if (await fs.existsSync(settingFilePath)) { + const oldSettings = JSON.parse(await fs.readFileSync(settingFilePath, 'utf-8')) + if (Array.isArray(oldSettings)) + settings = oldSettings.concat( + settings.filter((e) => !oldSettings.some((o) => o.key === e.key)) + ) + } await fs.writeFileSync(settingFilePath, JSON.stringify(settings, null, 2)) } catch (err) { console.error(err) diff --git a/extensions/inference-openrouter-extension/resources/settings.json b/extensions/inference-openrouter-extension/resources/settings.json index 85040e96b..891ffec86 100644 --- a/extensions/inference-openrouter-extension/resources/settings.json +++ b/extensions/inference-openrouter-extension/resources/settings.json @@ -19,5 +19,15 @@ "value": "", "type": "password" } + }, + { + "key": "openrouter-model", + "title": "Model", + "description": "If the model parameter is omitted, the user or payer's default is used. Otherwise, remember to select a value for model from the [supported models](https://openrouter.ai/docs/models) or API, and include the organization prefix.", + "controllerType": "input", + "controllerProps": { + "placeholder": "Leave empty for default model", + "value": "" + } } ] diff --git a/extensions/inference-openrouter-extension/src/index.ts b/extensions/inference-openrouter-extension/src/index.ts index 5417503e5..75d1188a8 100644 --- a/extensions/inference-openrouter-extension/src/index.ts +++ b/extensions/inference-openrouter-extension/src/index.ts @@ -8,22 +8,16 @@ import { RemoteOAIEngine } from '@janhq/core' import { PayloadType } from '@janhq/core' -import { ChatCompletionRole } from '@janhq/core' declare const SETTINGS: Array declare const MODELS: Array enum Settings { apiKey = 'openrouter-api-key', + model = 'openrouter-model', chatCompletionsEndPoint = 'chat-completions-endpoint', } -enum RoleType { - user = 'USER', - chatbot = 'CHATBOT', - system = 'SYSTEM', -} - /** * A class that implements the InferenceExtension interface from the @janhq/core package. * The class provides methods for initializing and stopping a model, and for making inference requests. @@ -32,6 +26,7 @@ enum RoleType { export default class JanInferenceOpenRouterExtension extends RemoteOAIEngine { inferenceUrl: string = '' provider: string = 'openrouter' + model?: string | undefined override async onLoad(): Promise { super.onLoad() @@ -45,6 +40,9 @@ export default class JanInferenceOpenRouterExtension extends RemoteOAIEngine { Settings.chatCompletionsEndPoint, '' ) + this.model = await this.getSetting(Settings.model, '') + // Openrouter uses default model on no model param set + if (!this.model?.length) this.model = undefined if (this.inferenceUrl.length === 0) { SETTINGS.forEach((setting) => { if (setting.key === Settings.chatCompletionsEndPoint) { @@ -54,6 +52,14 @@ export default class JanInferenceOpenRouterExtension extends RemoteOAIEngine { } } + override async headers(): Promise { + return { + 'Content-Type': 'application/json', + 'HTTP-Referer': 'https://jan.ai', + 'Authorization': `Bearer ${this.apiKey}`, + } + } + onSettingUpdate(key: string, value: T): void { if (key === Settings.apiKey) { this.apiKey = value as string @@ -69,8 +75,14 @@ export default class JanInferenceOpenRouterExtension extends RemoteOAIEngine { } else { this.inferenceUrl = value } + } else if (key === Settings.model) { + this.model = + typeof value === 'string' && value.length > 0 ? value : undefined } } - transformPayload = (payload: PayloadType)=>({...payload,model:"openrouter/auto"}) + transformPayload = (payload: PayloadType) => ({ + ...payload, + model: this.model, + }) }