diff --git a/app/lib/modules/llm/providers/cerebras.ts b/app/lib/modules/llm/providers/cerebras.ts new file mode 100644 index 00000000..bb61d5fc --- /dev/null +++ b/app/lib/modules/llm/providers/cerebras.ts @@ -0,0 +1,73 @@ +import { BaseProvider, getOpenAILikeModel } from '~/lib/modules/llm/base-provider'; +import type { ModelInfo } from '~/lib/modules/llm/types'; +import type { IProviderSetting } from '~/types/model'; +import type { LanguageModelV1 } from 'ai'; + +export default class CerebrasProvider extends BaseProvider { + name = 'Cerebras'; + baseUrl = 'https://api.cerebras.ai/v1'; + getApiKeyLink = 'https://cloud.cerebras.ai/platform'; + + config = { + baseUrlKey: 'CEREBRAS_API_BASE_URL', + apiTokenKey: 'CEREBRAS_API_KEY', + }; + + staticModels: ModelInfo[] = []; + + async getDynamicModels( + apiKeys?: Record, + settings?: IProviderSetting, + serverEnv: Record = {}, + ): Promise { + const { baseUrl, apiKey } = this.getProviderBaseUrlAndKey({ + apiKeys, + providerSettings: { ...settings, baseUrl: this.baseUrl }, + serverEnv, + defaultBaseUrlKey: `${this.config.baseUrlKey}`, + defaultApiTokenKey: `${this.config.apiTokenKey}`, + }); + + if (!baseUrl || !apiKey) { + return []; + } + + const response = await fetch(`${baseUrl}/models`, { + headers: { + Authorization: `Bearer ${apiKey}`, + }, + }); + + const res = (await response.json()) as any; + + return res.data.map((model: any) => ({ + name: model.id, + label: model.id, + provider: this.name, + maxTokenAllowed: 8000, + })); + } + + getModelInstance(options: { + model: string; + serverEnv: Env; + apiKeys?: Record; + providerSettings?: Record; + }): LanguageModelV1 { + const { model, serverEnv, apiKeys, providerSettings } = options; + + const { baseUrl, apiKey } = this.getProviderBaseUrlAndKey({ + apiKeys, + providerSettings: { ...providerSettings?.[this.name], baseUrl: this.baseUrl }, + serverEnv: serverEnv as any, + defaultBaseUrlKey: `${this.config.baseUrlKey}`, + defaultApiTokenKey: `${this.config.apiTokenKey}`, + }); + + if (!baseUrl || !apiKey) { + throw new Error(`Missing configuration for ${this.name} provider`); + } + + return getOpenAILikeModel(baseUrl, apiKey, model); + } +} diff --git a/app/lib/modules/llm/registry.ts b/app/lib/modules/llm/registry.ts index 6edba6d8..9ddf435c 100644 --- a/app/lib/modules/llm/registry.ts +++ b/app/lib/modules/llm/registry.ts @@ -16,6 +16,7 @@ import XAIProvider from './providers/xai'; import HyperbolicProvider from './providers/hyperbolic'; import AmazonBedrockProvider from './providers/amazon-bedrock'; import GithubProvider from './providers/github'; +import CerebrasProvider from './providers/cerebras'; export { AnthropicProvider, @@ -36,4 +37,5 @@ export { LMStudioProvider, AmazonBedrockProvider, GithubProvider, + CerebrasProvider, };