Files
sproutclaw/packages/ai/src/providers/images/register-builtins.ts
2026-05-05 09:30:15 +02:00

76 lines
2.1 KiB
TypeScript

import { registerImagesApiProvider } from "../../images-api-registry.js";
import type {
AssistantImages,
AssistantImagesEvent,
ImagesContext,
ImagesFunction,
ImagesModel,
ImagesOptions,
} from "../../types.js";
import { AssistantImagesEventStream } from "../../utils/event-stream.js";
import type { imagesOpenRouter as imagesOpenRouterFunction } from "./openrouter.js";
interface OpenRouterImagesProviderModule {
imagesOpenRouter: typeof imagesOpenRouterFunction;
}
let openRouterImagesProviderModulePromise: Promise<OpenRouterImagesProviderModule> | undefined;
function forwardImagesStream(target: AssistantImagesEventStream, source: AsyncIterable<AssistantImagesEvent>): void {
(async () => {
for await (const event of source) {
target.push(event);
}
target.end();
})();
}
function createLazyLoadErrorImages(model: ImagesModel<"openrouter-images">, error: unknown): AssistantImages {
return {
api: model.api,
provider: model.provider,
model: model.id,
output: [],
stopReason: "error",
errorMessage: error instanceof Error ? error.message : String(error),
timestamp: Date.now(),
};
}
function loadOpenRouterImagesProviderModule(): Promise<OpenRouterImagesProviderModule> {
openRouterImagesProviderModulePromise ||= import("./openrouter.js").then(
(module) => module as OpenRouterImagesProviderModule,
);
return openRouterImagesProviderModulePromise;
}
export const imagesOpenRouter: ImagesFunction<"openrouter-images", ImagesOptions> = (
model: ImagesModel<"openrouter-images">,
context: ImagesContext,
options?: ImagesOptions,
) => {
const outer = new AssistantImagesEventStream();
loadOpenRouterImagesProviderModule()
.then((module) => {
const inner = module.imagesOpenRouter(model, context, options);
forwardImagesStream(outer, inner);
})
.catch((error) => {
const images = createLazyLoadErrorImages(model, error);
outer.push({ type: "error", reason: "error", error: images });
outer.end(images);
});
return outer;
};
export function registerBuiltInImagesApiProviders(): void {
registerImagesApiProvider({
api: "openrouter-images",
images: imagesOpenRouter,
});
}
registerBuiltInImagesApiProviders();