diff --git a/packages/core/src/plugin/provider/configured.ts b/packages/core/src/plugin/provider/configured.ts index 92b48adc330..89f7d2874a8 100644 --- a/packages/core/src/plugin/provider/configured.ts +++ b/packages/core/src/plugin/provider/configured.ts @@ -1,5 +1,5 @@ import { Effect, Option } from "effect" -import type { Document } from "@opencode-ai/schema/config" +import type { Document, Entry } from "@opencode-ai/schema/config" import { Catalog } from "../../catalog.js" import { Config } from "../../config.js" import { Provider } from "../../provider.js" @@ -9,7 +9,11 @@ export const configuredSettings = Effect.fn("ProviderPlugin.configuredSettings") const current = (yield* catalog.provider.get(id))?.settings const service = yield* Effect.serviceOption(Config.Service) const entries = Option.isSome(service) ? yield* service.value.entries() : [] + return foldSettings(entries, id, current) +}) + +export function foldSettings(entries: readonly Entry[], id: string, initial: Provider.Settings | undefined) { return entries .filter((entry): entry is Document => entry.type === "document") - .reduce((settings, entry) => Provider.mergeOverlay(settings, entry.info.providers?.[id]?.settings), current) -}) + .reduce((settings, entry) => Provider.mergeOverlay(settings, entry.info.providers?.[id]?.settings), initial) +} diff --git a/packages/core/src/plugin/provider/lmstudio.ts b/packages/core/src/plugin/provider/lmstudio.ts index 3266f302615..ce8c257a181 100644 --- a/packages/core/src/plugin/provider/lmstudio.ts +++ b/packages/core/src/plugin/provider/lmstudio.ts @@ -1,11 +1,11 @@ import { define } from "@opencode-ai/plugin/effect/plugin" -import { Document, type Entry } from "@opencode-ai/schema/config" +import type { Entry } from "@opencode-ai/schema/config" import { Duration, Effect, Schedule, Schema, Semaphore, Stream } from "effect" import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" import { Config } from "../../config.js" import { Model } from "../../model.js" -import { Provider } from "../../provider.js" import type { PluginInternal } from "../internal.js" +import { foldSettings } from "./configured.js" const providerID = "lmstudio" @@ -150,13 +150,7 @@ export function make(origin = "http://127.0.0.1:1234", interval: Duration.Input export const LMStudioPlugin = make() function configured(entries: readonly Entry[], origin: string) { - const settings = entries - .filter((entry): entry is Document => entry.type === "document") - .flatMap((entry) => { - const settings = entry.info.providers?.[providerID]?.settings - return settings ? [settings] : [] - }) - .reduce((result, item) => Provider.mergeOverlay(result, item), undefined) + const settings = foldSettings(entries, providerID, undefined) const baseURL = ( typeof settings?.baseURL === "string" ? settings.baseURL : `${origin.replace(/\/+$/, "")}/v1` ).replace(/\/+$/, "") diff --git a/packages/core/src/plugin/provider/ollama.ts b/packages/core/src/plugin/provider/ollama.ts index f6074a6c63c..dceafd0132a 100644 --- a/packages/core/src/plugin/provider/ollama.ts +++ b/packages/core/src/plugin/provider/ollama.ts @@ -1,11 +1,11 @@ import { define } from "@opencode-ai/plugin/effect/plugin" -import { Document, type Entry } from "@opencode-ai/schema/config" +import type { Entry } from "@opencode-ai/schema/config" import { Duration, Effect, Schedule, Schema, Semaphore, Stream } from "effect" import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" import { Config } from "../../config.js" import { Model } from "../../model.js" -import { Provider } from "../../provider.js" import type { PluginInternal } from "../internal.js" +import { foldSettings } from "./configured.js" const providerID = "ollama" @@ -206,13 +206,7 @@ export function make(origin = "http://127.0.0.1:11434", interval: Duration.Input export const OllamaPlugin = make() function configured(entries: readonly Entry[], origin: string) { - const settings = entries - .filter((entry): entry is Document => entry.type === "document") - .flatMap((entry) => { - const settings = entry.info.providers?.[providerID]?.settings - return settings ? [settings] : [] - }) - .reduce((result, item) => Provider.mergeOverlay(result, item), undefined) + const settings = foldSettings(entries, providerID, undefined) const baseURL = ( typeof settings?.baseURL === "string" ? settings.baseURL : `${origin.replace(/\/+$/, "")}/v1` ).replace(/\/+$/, "") diff --git a/packages/core/src/plugin/provider/vllm.ts b/packages/core/src/plugin/provider/vllm.ts index 3f723870b14..a0e4a6b99f8 100644 --- a/packages/core/src/plugin/provider/vllm.ts +++ b/packages/core/src/plugin/provider/vllm.ts @@ -1,11 +1,11 @@ import { define } from "@opencode-ai/plugin/effect/plugin" -import { Document, type Entry } from "@opencode-ai/schema/config" +import type { Entry } from "@opencode-ai/schema/config" import { Duration, Effect, Schedule, Schema, Semaphore, Stream } from "effect" import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" import { Config } from "../../config.js" import { Model } from "../../model.js" -import { Provider } from "../../provider.js" import type { PluginInternal } from "../internal.js" +import { foldSettings } from "./configured.js" const providerID = "vllm" @@ -136,13 +136,7 @@ export function make(origin = "http://127.0.0.1:8000", interval: Duration.Input export const VLLMPlugin = make() function configured(entries: readonly Entry[], origin: string) { - const settings = entries - .filter((entry): entry is Document => entry.type === "document") - .flatMap((entry) => { - const settings = entry.info.providers?.[providerID]?.settings - return settings ? [settings] : [] - }) - .reduce((result, item) => Provider.mergeOverlay(result, item), undefined) + const settings = foldSettings(entries, providerID, undefined) const baseURL = ( typeof settings?.baseURL === "string" ? settings.baseURL : `${origin.replace(/\/+$/, "")}/v1` ).replace(/\/+$/, "")