diff --git a/src/renderer/static/icons/providers/trustedrouter.png b/src/renderer/static/icons/providers/trustedrouter.png new file mode 100644 index 0000000000..c7e66e8e71 Binary files /dev/null and b/src/renderer/static/icons/providers/trustedrouter.png differ diff --git a/src/shared/model-registry/provider-mapping.ts b/src/shared/model-registry/provider-mapping.ts index b347ff4038..350fdf70d8 100644 --- a/src/shared/model-registry/provider-mapping.ts +++ b/src/shared/model-registry/provider-mapping.ts @@ -17,6 +17,7 @@ export const PROVIDER_ID_MAP: Record = { 'mistral-ai': 'mistral', perplexity: 'perplexity', openrouter: 'openrouter', + trustedrouter: 'trustedrouter', minimax: 'minimax', 'minimax-cn': 'minimax-cn', moonshot: 'moonshotai', diff --git a/src/shared/models/index.ts b/src/shared/models/index.ts index 304c6909a5..1c9e6a2fef 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.TrustedRouter]: 'TrustedRouter 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.TrustedRouter, + label: aiProviderNameHash[ModelProviderEnum.TrustedRouter], + disabled: false, + }, { value: ModelProviderEnum.MistralAI, label: aiProviderNameHash[ModelProviderEnum.MistralAI], diff --git a/src/shared/providers/definitions/models/trustedrouter.ts b/src/shared/providers/definitions/models/trustedrouter.ts new file mode 100644 index 0000000000..d60b02db3b --- /dev/null +++ b/src/shared/providers/definitions/models/trustedrouter.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 TrustedRouter extends OpenAICompatible { + public name = 'TrustedRouter' + public options: Options + constructor(options: Omit, dependencies: ModelDependencies) { + const apiHost = 'https://api.trustedrouter.com/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/trustedrouter.ts b/src/shared/providers/definitions/trustedrouter.ts new file mode 100644 index 0000000000..fbceb3986f --- /dev/null +++ b/src/shared/providers/definitions/trustedrouter.ts @@ -0,0 +1,59 @@ +import { ModelProviderEnum, ModelProviderType } from '../../types' +import { defineProvider } from '../registry' +import TrustedRouter from './models/trustedrouter' + +export const trustedRouterProvider = defineProvider({ + id: ModelProviderEnum.TrustedRouter, + name: 'TrustedRouter', + type: ModelProviderType.OpenAI, + modelsDevProviderId: 'trustedrouter', + curatedModelIds: ['trustedrouter/auto', 'trustedrouter/zdr', 'trustedrouter/e2e', 'trustedrouter/cheap'], + urls: { + website: 'https://trustedrouter.com/', + }, + defaultSettings: { + apiHost: 'https://api.trustedrouter.com/v1', + models: [ + { + modelId: 'trustedrouter/auto', + nickname: 'Auto (routes across healthy providers)', + capabilities: ['tool_use', 'vision'], + contextWindow: 128_000, + }, + { + modelId: 'trustedrouter/zdr', + nickname: 'ZDR (zero-data-retention routes)', + capabilities: ['tool_use'], + contextWindow: 128_000, + }, + { + modelId: 'trustedrouter/e2e', + nickname: 'E2E (end-to-end encrypted routes)', + capabilities: ['tool_use'], + contextWindow: 128_000, + }, + { + modelId: 'trustedrouter/cheap', + nickname: 'Cheap (cost-optimized routes)', + capabilities: ['tool_use'], + contextWindow: 128_000, + }, + ], + }, + createModel: (config) => { + return new TrustedRouter( + { + 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 `TrustedRouter 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 0690010edf..c50a22f23a 100644 --- a/src/shared/providers/index.ts +++ b/src/shared/providers/index.ts @@ -18,6 +18,7 @@ import './definitions/minimax' import './definitions/moonshot' import './definitions/siliconflow' import './definitions/openrouter' +import './definitions/trustedrouter' 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..e1de0322f6 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', + TrustedRouter = 'trustedrouter', Bedrock = 'bedrock', VercelAIGateway = 'vercel-ai-gateway', Custom = 'custom',