chore(vendor): import pi 0.85.1
Imported as a linear vendor commit so forge rebases do not replay the upstream root tree. git-subtree-dir: third_party/pi git-subtree-split: d981de1229ef899957bbe968bc8dcda02a21f477
This commit is contained in:
82
third_party/pi/packages/ai/src/providers/radius.ts
vendored
Normal file
82
third_party/pi/packages/ai/src/providers/radius.ts
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
import { piMessagesApi } from "../api/pi-messages.lazy.ts";
|
||||
import { envApiKeyAuth, lazyOAuth } from "../auth/helpers.ts";
|
||||
import { loadRadiusOAuth } from "../auth/oauth/load.ts";
|
||||
import type { Provider } from "../models.ts";
|
||||
import {
|
||||
DEFAULT_RADIUS_GATEWAY,
|
||||
getRadiusModels,
|
||||
getRadiusModelsFromConfig,
|
||||
loadRadiusGatewayConfig,
|
||||
normalizeRadiusGatewayUrl,
|
||||
} from "./radius-config.ts";
|
||||
|
||||
export interface RadiusProviderOptions {
|
||||
id?: string;
|
||||
name?: string;
|
||||
gateway?: string;
|
||||
}
|
||||
|
||||
/** Radius gateway provider with a persisted, dynamically refreshed catalog. */
|
||||
export function radiusProvider(options: RadiusProviderOptions = {}): Provider<"pi-messages"> {
|
||||
const id = options.id ?? "radius";
|
||||
const name = options.name ?? "Radius";
|
||||
const gateway = normalizeRadiusGatewayUrl(options.gateway ?? DEFAULT_RADIUS_GATEWAY);
|
||||
let models = getRadiusModels(id, undefined);
|
||||
const streams = piMessagesApi();
|
||||
|
||||
return {
|
||||
id,
|
||||
name,
|
||||
auth: {
|
||||
apiKey: envApiKeyAuth("Radius API key", ["RADIUS_API_KEY"]),
|
||||
oauth: lazyOAuth({ name, load: () => loadRadiusOAuth({ name, gateway }) }),
|
||||
},
|
||||
getModels: () => models,
|
||||
refreshModels: async (context) => {
|
||||
const stored = context.stored;
|
||||
if (stored) {
|
||||
const restored = stored.models.filter((model) => model.provider === id) as typeof models;
|
||||
if (
|
||||
!(await context.publish({
|
||||
update: () => {
|
||||
models = restored;
|
||||
},
|
||||
}))
|
||||
) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Import catalogs cached by the pre-ModelsStore Radius implementation.
|
||||
if (!stored && context.credential?.type === "oauth") {
|
||||
const legacy = getRadiusModels(id, context.credential);
|
||||
if (legacy.length > 0) {
|
||||
if (
|
||||
!(await context.publish({
|
||||
persist: { models: legacy, checkedAt: Date.now() },
|
||||
update: () => {
|
||||
models = legacy;
|
||||
},
|
||||
}))
|
||||
) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!context.allowNetwork || context.signal.aborted) return;
|
||||
const apiKey = context.credential?.type === "oauth" ? context.credential.access : context.credential?.key;
|
||||
const config = await loadRadiusGatewayConfig(gateway, apiKey, context.signal);
|
||||
if (context.signal.aborted) return;
|
||||
const refreshed = getRadiusModelsFromConfig(id, config);
|
||||
await context.publish({
|
||||
persist: { models: refreshed, checkedAt: Date.now() },
|
||||
update: () => {
|
||||
models = refreshed;
|
||||
},
|
||||
});
|
||||
},
|
||||
stream: (model, context, streamOptions) => streams.stream(model, context, streamOptions),
|
||||
streamSimple: (model, context, streamOptions) => streams.streamSimple(model, context, streamOptions),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user