Files
openclaw/extensions/baseten/index.ts

67 lines
2.6 KiB
TypeScript

/** Baseten provider plugin entrypoint. */
import { buildOpenAICompatibleLiveModelProviderConfig } from "openclaw/plugin-sdk/provider-catalog-live-runtime";
import type { ProviderCatalogContext } from "openclaw/plugin-sdk/provider-catalog-shared";
import { defineSingleProviderPluginEntry } from "openclaw/plugin-sdk/provider-entry";
import { buildProviderReplayFamilyHooks } from "openclaw/plugin-sdk/provider-model-shared";
import { projectBasetenLiveModels, resolveBasetenDynamicModel } from "./models.js";
import { applyBasetenConfig } from "./onboard.js";
import manifest from "./openclaw.plugin.json" with { type: "json" };
import { buildStaticBasetenProvider } from "./provider-catalog.js";
import { createBasetenThinkingWrapper } from "./stream.js";
import { resolveBasetenThinkingProfile } from "./thinking.js";
const PROVIDER_ID = "baseten";
export default defineSingleProviderPluginEntry({
id: PROVIDER_ID,
name: "Baseten Provider",
description: "Official Baseten Model APIs provider plugin",
manifest,
provider: {
label: "Baseten",
docsPath: "/providers/baseten",
manifestAuth: {
applyConfig: applyBasetenConfig,
noteTitle: "Baseten",
noteMessage: [
"Baseten hosts Thinking Machines Lab's Inkling and other frontier models behind one OpenAI-compatible API.",
"Get your API key at: https://app.baseten.co/settings/api_keys",
].join("\n"),
},
catalog: {
order: "simple",
run: async (ctx: ProviderCatalogContext) => {
const { apiKey, discoveryApiKey } = ctx.resolveProviderAuth(PROVIDER_ID);
if (!apiKey) {
return null;
}
if (!discoveryApiKey) {
return { provider: { ...buildStaticBasetenProvider(), apiKey } };
}
return {
provider: await buildOpenAICompatibleLiveModelProviderConfig({
providerId: PROVIDER_ID,
providerConfig: buildStaticBasetenProvider(),
apiKey,
discoveryApiKey,
modelDiscovery: {
timeoutMs: 10_000,
ttlMs: 5 * 60 * 1000,
projectRows: projectBasetenLiveModels,
},
}),
};
},
staticRun: async () => ({ provider: buildStaticBasetenProvider() }),
},
resolveDynamicModel: ({ modelId }) => resolveBasetenDynamicModel(modelId),
...buildProviderReplayFamilyHooks({
family: "openai-compatible",
dropReasoningFromHistory: false,
}),
wrapStreamFn: (ctx) => createBasetenThinkingWrapper(ctx),
resolveThinkingProfile: ({ modelId }) => resolveBasetenThinkingProfile(modelId),
isModernModelRef: () => true,
},
});