summaryrefslogtreecommitdiffhomepage
path: root/js/src/llm
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-05-18 02:43:01 -0400
committerDax Raad <[email protected]>2025-05-26 12:40:17 -0400
commitd0d67029f4baad7389b5ba072379c2ff44a22dc4 (patch)
treecb81e86662c14c20687bf5bac488dda911a9855e /js/src/llm
parenta34d020bc6b252e842f042d935c7a0e6444460cf (diff)
downloadopencode-d0d67029f4baad7389b5ba072379c2ff44a22dc4.tar.gz
opencode-d0d67029f4baad7389b5ba072379c2ff44a22dc4.zip
process
Diffstat (limited to 'js/src/llm')
-rw-r--r--js/src/llm/llm.ts59
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);
+ }
+}