feat(connectors): add Ollama and LM Studio as a local auth kind
Both servers expose OpenAI-compatible /v1/chat/completions and /v1/models, so we route them through pi-ai's `openai-completions` API the same way Fireworks does — but with a per-installation base URL the user enters during onboarding instead of a hardcoded one. The shared schemas grow a `local` credential payload carrying just the baseUrl; the credential resolver surfaces it on `ResolvedCredential.baseUrl`, the runtime bridge forwards it through `prepareRun`, and the worker plumbs it into `resolveModel` so the streamed Model<openai-completions> targets the user's server. The local-cost path short-circuits to zero in cost-writer since users bill their own hardware, and the live model list is fetched from the saved baseUrl by `fetchLocalConnectorModels` (Ollama and LM Studio both speak the standard OpenAI catalog shape). Onboarding ships a new LocalProviderCard and the Settings panel a LocalForm; both default to the catalog's per-connector localhost URL and accept any custom URL.
This commit is contained in:
1 parent
07d9c00fab
commit
a532120649
26 files changed
+504
-18
No files matched your search
@@ -184,8 +184,18 @@ export function createMainRuntimeSupport(state: MainRuntimeState) {
|
||||
// user has selected a company; the onboarding path uses this
|
||||
// catalog directly because no company exists yet.
|
||||
const { getConnectorDefinition } = await import("./connectors");
|
||||
const { resolveModels } = await import("./model-resolver");
|
||||
const { resolveModels, fetchLocalConnectorModels } = await import("./model-resolver");
|
||||
const definition = getConnectorDefinition(connectorId as ConnectorId);
|
||||
if (definition.auth.type === "local") {
|
||||
// Local servers' catalogs depend on the user's installed/loaded
|
||||
// models. Read the saved baseUrl and ask the server directly.
|
||||
const piRuntime = requireServiceGraph().getPiRuntime();
|
||||
const credentials = piRuntime?.credentialStore.read(connectorId);
|
||||
const baseUrl = credentials?.kind === "local" ? credentials.value.baseUrl : null;
|
||||
if (!baseUrl) return [];
|
||||
const models = await fetchLocalConnectorModels(baseUrl);
|
||||
return models.map((m) => ({ id: m.id, label: m.name }));
|
||||
}
|
||||
return resolveModels(definition.provider).map((m) => ({ id: m.id, label: m.name }));
|
||||
},
|
||||
logger: log,
|
||||
|
||||
Reference in new issue
Block a user