diff --git a/src/renderer/static/icons/providers/openpaths.png b/src/renderer/static/icons/providers/openpaths.png new file mode 100644 index 0000000000..73681c0dc0 Binary files /dev/null and b/src/renderer/static/icons/providers/openpaths.png differ diff --git a/src/shared/models/index.ts b/src/shared/models/index.ts index 304c6909a5..6fe6a88082 100644 --- a/src/shared/models/index.ts +++ b/src/shared/models/index.ts @@ -28,6 +28,7 @@ export const aiProviderNameHash: Record = { [ModelProviderEnum.Perplexity]: 'Perplexity API', [ModelProviderEnum.XAI]: 'xAI API', [ModelProviderEnum.OpenRouter]: 'OpenRouter API', + [ModelProviderEnum.OpenPaths]: 'OpenPaths API', [ModelProviderEnum.Bedrock]: 'AWS Bedrock', [ModelProviderEnum.VercelAIGateway]: 'Vercel AI Gateway', [ModelProviderEnum.Custom]: 'Custom Provider', @@ -115,6 +116,11 @@ export const AIModelProviderMenuOptionList = [ label: aiProviderNameHash[ModelProviderEnum.OpenRouter], disabled: false, }, + { + value: ModelProviderEnum.OpenPaths, + label: aiProviderNameHash[ModelProviderEnum.OpenPaths], + disabled: false, + }, { value: ModelProviderEnum.MistralAI, label: aiProviderNameHash[ModelProviderEnum.MistralAI], diff --git a/src/shared/providers/definitions/models/openpaths.ts b/src/shared/providers/definitions/models/openpaths.ts new file mode 100644 index 0000000000..e384efcc2b --- /dev/null +++ b/src/shared/providers/definitions/models/openpaths.ts @@ -0,0 +1,28 @@ +import OpenAICompatible, { type OpenAICompatibleSettings } from '../../../models/openai-compatible' +import type { ModelDependencies } from '../../../types/adapters' + +interface Options extends OpenAICompatibleSettings {} + +export default class OpenPaths extends OpenAICompatible { + public name = 'OpenPaths' + public options: Options + constructor(options: Omit, dependencies: ModelDependencies) { + const apiHost = 'https://openpaths.io/v1' + super( + { + apiKey: options.apiKey, + apiHost, + model: options.model, + temperature: options.temperature, + topP: options.topP, + maxOutputTokens: options.maxOutputTokens, + stream: options.stream, + }, + dependencies + ) + this.options = { + ...options, + apiHost, + } + } +} diff --git a/src/shared/providers/definitions/openpaths.ts b/src/shared/providers/definitions/openpaths.ts new file mode 100644 index 0000000000..c92c85c001 --- /dev/null +++ b/src/shared/providers/definitions/openpaths.ts @@ -0,0 +1,79 @@ +import { ModelProviderEnum, ModelProviderType } from '../../types' +import { defineProvider } from '../registry' +import OpenPaths from './models/openpaths' + +export const openPathsProvider = defineProvider({ + id: ModelProviderEnum.OpenPaths, + name: 'OpenPaths', + type: ModelProviderType.OpenAI, + curatedModelIds: [ + 'openpaths/auto', + 'openpaths/auto-code', + 'openpaths/auto-fast', + 'openpaths/auto-cheap', + 'openpaths/auto-reasoning', + 'openpaths/auto-vision', + 'openpaths/auto-image', + ], + urls: { + website: 'https://openpaths.io', + apiKey: 'https://openpaths.io/account', + models: 'https://openpaths.io/v1/models', + }, + defaultSettings: { + apiHost: 'https://openpaths.io/v1', + models: [ + { + modelId: 'openpaths/auto', + nickname: 'Auto', + capabilities: ['tool_use', 'reasoning', 'vision'], + }, + { + modelId: 'openpaths/auto-code', + nickname: 'Auto Code', + capabilities: ['tool_use', 'reasoning'], + }, + { + modelId: 'openpaths/auto-fast', + nickname: 'Auto Fast', + capabilities: ['tool_use'], + }, + { + modelId: 'openpaths/auto-cheap', + nickname: 'Auto Cheap', + capabilities: ['tool_use'], + }, + { + modelId: 'openpaths/auto-reasoning', + nickname: 'Auto Reasoning', + capabilities: ['tool_use', 'reasoning'], + }, + { + modelId: 'openpaths/auto-vision', + nickname: 'Auto Vision', + capabilities: ['tool_use', 'vision'], + }, + { + modelId: 'openpaths/auto-image', + nickname: 'Auto Image', + capabilities: ['vision'], + }, + ], + }, + createModel: (config) => { + return new OpenPaths( + { + apiKey: config.effectiveApiKey, + model: config.model, + temperature: config.settings.temperature, + topP: config.settings.topP, + maxOutputTokens: config.settings.maxTokens, + stream: config.settings.stream, + }, + config.dependencies + ) + }, + getDisplayName: (modelId, providerSettings) => { + return `OpenPaths API (${providerSettings?.models?.find((m) => m.modelId === modelId)?.nickname || modelId})` + }, +}) diff --git a/src/shared/providers/index.ts b/src/shared/providers/index.ts index 06742110e7..50db1d9b09 100644 --- a/src/shared/providers/index.ts +++ b/src/shared/providers/index.ts @@ -17,6 +17,7 @@ import './definitions/minimax' import './definitions/moonshot' import './definitions/siliconflow' import './definitions/openrouter' +import './definitions/openpaths' import './definitions/ollama' import './definitions/lmstudio' import './definitions/azure' diff --git a/src/shared/types/provider.ts b/src/shared/types/provider.ts index 8f12db4f03..03a5e4a9da 100644 --- a/src/shared/types/provider.ts +++ b/src/shared/types/provider.ts @@ -25,6 +25,7 @@ export enum ModelProviderEnum { Perplexity = 'perplexity', XAI = 'xAI', OpenRouter = 'openrouter', + OpenPaths = 'openpaths', Bedrock = 'bedrock', VercelAIGateway = 'vercel-ai-gateway', Custom = 'custom', diff --git a/src/shared/utils/llm_utils.ts b/src/shared/utils/llm_utils.ts index 2df5666a1a..a2bfc2bb84 100644 --- a/src/shared/utils/llm_utils.ts +++ b/src/shared/utils/llm_utils.ts @@ -129,6 +129,7 @@ export function isOpenAICompatible(providerId: string, _modelId: string) { ModelProviderEnum.OpenAI, ModelProviderEnum.SiliconFlow, ModelProviderEnum.OpenRouter, + ModelProviderEnum.OpenPaths, ModelProviderEnum.Ollama, ModelProviderEnum.ChatGLM6B, ModelProviderEnum.XAI,