Files
openclaw/src/plugin-sdk/provider-catalog-shared.ts
2026-04-04 12:18:45 +01:00

64 lines
1.8 KiB
TypeScript

// Shared provider catalog helpers for provider plugins.
//
// Keep provider-owned exports out of this subpath so plugin loaders can import it
// without recursing through provider-specific facades.
import { resolveProviderRequestCapabilities } from "./provider-http.js";
import type { ModelProviderConfig } from "./provider-model-shared.js";
export type { ProviderCatalogContext, ProviderCatalogResult } from "../plugins/types.js";
export {
buildPairedProviderApiKeyCatalog,
buildSingleProviderApiKeyCatalog,
findCatalogTemplate,
} from "../plugins/provider-catalog.js";
function withStreamingUsageCompat(provider: ModelProviderConfig): ModelProviderConfig {
if (!Array.isArray(provider.models) || provider.models.length === 0) {
return provider;
}
let changed = false;
const models = provider.models.map((model) => {
if (model.compat?.supportsUsageInStreaming !== undefined) {
return model;
}
changed = true;
return {
...model,
compat: {
...model.compat,
supportsUsageInStreaming: true,
},
};
});
return changed ? { ...provider, models } : provider;
}
export function supportsNativeStreamingUsageCompat(params: {
providerId: string;
baseUrl: string | undefined;
}): boolean {
return resolveProviderRequestCapabilities({
provider: params.providerId,
api: "openai-completions",
baseUrl: params.baseUrl,
capability: "llm",
transport: "stream",
}).supportsNativeStreamingUsageCompat;
}
export function applyProviderNativeStreamingUsageCompat(params: {
providerId: string;
providerConfig: ModelProviderConfig;
}): ModelProviderConfig {
return supportsNativeStreamingUsageCompat({
providerId: params.providerId,
baseUrl: params.providerConfig.baseUrl,
})
? withStreamingUsageCompat(params.providerConfig)
: params.providerConfig;
}