import type { TemplateResult } from 'lit'; import type { OpenAI } from 'openai'; import type { ChatMessage } from '../chat/logic.js'; export type Vendor = { key: string; color: string; initData: () => Data; renderConfigEditor: (data: Data, refresh: () => void) => TemplateResult; }; export type ServiceImpl = { name: string; method: (data: Data) => M; vendor: Vendor; }; export type ServiceKind = { type: string; title: string; getImpl: (implName: string) => ServiceImpl | undefined; implList: ServiceImpl[]; implService: (impl: ServiceImpl) => void; }; export const createVendor = ( config: Vendor ): Vendor => { return config; }; const createServiceKind = (config: { type: string; title: string; }): ServiceKind => { const implList = [] as ServiceImpl[]; return { type: config.type, title: config.title, getImpl: implName => { return implList.find(v => v.name === implName); }, implList, implService: impl => { implList.push(impl as never); }, }; }; export const TextServiceKind = createServiceKind<{ generateText(messages: ChatMessage[]): Promise; }>({ type: 'text-service', title: 'Text service', }); export const ChatServiceKind = createServiceKind<{ chat(messages: Array): AsyncIterable; }>({ type: 'chat-service', title: 'Chat service', }); export const Text2ImageServiceKind = createServiceKind<{ generateImage(prompt: string): Promise; }>({ type: 'text-to-image-service', title: 'Text to image service', }); export const EmbeddingServiceKind = createServiceKind<{ generateEmbedding(text: string): Promise; generateEmbeddings(textList: string[]): Promise; }>({ type: 'embedding-service', title: 'Embedding service', }); export const Image2TextServiceKind = createServiceKind<{ generateText( messages: Array ): Promise; }>({ type: 'image-to-text-service', title: 'Image to text service', }); export const Image2ImageServiceKind = createServiceKind<{ generateImage(prompt: string, image: string): Promise; }>({ type: 'image-to-image-service', title: 'Image to image service', }); export const FastImage2ImageServiceKind = createServiceKind<{ createFastRequest(): (prompt: string, image: string) => Promise; }>({ type: 'fast-image-to-image-service', title: 'Fast image to image service', }); export const allKindService = [ TextServiceKind, ChatServiceKind, Text2ImageServiceKind, Image2TextServiceKind, Image2ImageServiceKind, FastImage2ImageServiceKind, EmbeddingServiceKind, ]; export type AllServiceKind = (typeof allKindService)[number]; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type GetMethod> = Kind extends ServiceKind ? M : never;