diff options
| author | Dax Raad <[email protected]> | 2025-05-18 02:43:01 -0400 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-05-26 12:40:17 -0400 |
| commit | d0d67029f4baad7389b5ba072379c2ff44a22dc4 (patch) | |
| tree | cb81e86662c14c20687bf5bac488dda911a9855e /js/src/llm | |
| parent | a34d020bc6b252e842f042d935c7a0e6444460cf (diff) | |
| download | opencode-d0d67029f4baad7389b5ba072379c2ff44a22dc4.tar.gz opencode-d0d67029f4baad7389b5ba072379c2ff44a22dc4.zip | |
process
Diffstat (limited to 'js/src/llm')
| -rw-r--r-- | js/src/llm/llm.ts | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/js/src/llm/llm.ts b/js/src/llm/llm.ts new file mode 100644 index 000000000..0ae3bbd87 --- /dev/null +++ b/js/src/llm/llm.ts @@ -0,0 +1,59 @@ +import { App } from "../app"; +import { Log } from "../util/log"; + +import { createAnthropic } from "@ai-sdk/anthropic"; +import type { LanguageModel, Provider } from "ai"; +import { generateText, NoSuchModelError } from "ai"; + +export namespace LLM { + const log = Log.create({ service: "llm" }); + + export class ModelNotFoundError extends Error { + constructor(public readonly model: string) { + super(); + } + } + + const state = App.state("llm", async (app) => { + const providers: Provider[] = []; + + if (process.env["ANTHROPIC_API_KEY"] || app.config.providers?.anthropic) { + log.info("loaded anthropic"); + const provider = createAnthropic({ + apiKey: app.config.providers?.anthropic?.apiKey, + baseURL: app.config.providers?.anthropic?.baseURL, + headers: app.config.providers?.anthropic?.headers, + }); + providers.push(provider); + } + + return { + models: new Map<string, LanguageModel>(), + providers, + }; + }); + + export async function providers() { + return state().then((state) => state.providers); + } + + export async function findModel(model: string) { + const s = await state(); + if (s.models.has(model)) { + return s.models.get(model)!; + } + log.info("loading", { model }); + for (const provider of s.providers) { + try { + const match = provider.languageModel(model); + log.info("found", { model }); + s.models.set(model, match); + return match; + } catch (e) { + if (e instanceof NoSuchModelError) continue; + throw e; + } + } + throw new ModelNotFoundError(model); + } +} |
