refactor(server): config system (#11081)

This commit is contained in:
forehalo
2025-03-27 12:32:28 +00:00
parent 7091111f85
commit 0ea38680fa
274 changed files with 7583 additions and 5841 deletions
@@ -1,9 +1,8 @@
import assert from 'node:assert';
import {
config as falConfig,
stream as falStream,
} from '@fal-ai/serverless-client';
import { Injectable } from '@nestjs/common';
import { z, ZodType } from 'zod';
import {
@@ -12,6 +11,7 @@ import {
metrics,
UserFriendlyError,
} from '../../../base';
import { CopilotProvider } from './provider';
import {
CopilotCapability,
CopilotChatOptions,
@@ -20,7 +20,7 @@ import {
CopilotProviderType,
CopilotTextToImageProvider,
PromptMessage,
} from '../types';
} from './types';
export type FalConfig = {
apiKey: string;
@@ -71,17 +71,19 @@ type FalPrompt = {
}[];
};
@Injectable()
export class FalProvider
extends CopilotProvider<FalConfig>
implements CopilotTextToImageProvider, CopilotImageToImageProvider
{
static readonly type = CopilotProviderType.FAL;
static readonly capabilities = [
override type = CopilotProviderType.FAL;
override readonly capabilities = [
CopilotCapability.TextToImage,
CopilotCapability.ImageToImage,
CopilotCapability.ImageToText,
];
readonly availableModels = [
override readonly models = [
// text to image
'fast-turbo-diffusion',
// image to image
@@ -96,27 +98,15 @@ export class FalProvider
'llava-next',
];
constructor(private readonly config: FalConfig) {
assert(FalProvider.assetsConfig(config));
override configured(): boolean {
return !!this.config.apiKey;
}
protected override setup() {
super.setup();
falConfig({ credentials: this.config.apiKey });
}
static assetsConfig(config: FalConfig) {
return !!config.apiKey;
}
get type(): CopilotProviderType {
return FalProvider.type;
}
getCapabilities(): CopilotCapability[] {
return FalProvider.capabilities;
}
async isModelAvailable(model: string): Promise<boolean> {
return this.availableModels.includes(model);
}
private extractArray<T>(value: T | T[] | undefined): T[] {
if (Array.isArray(value)) return value;
return value ? [value] : [];
@@ -211,7 +201,7 @@ export class FalProvider
model: string = 'llava-next',
options: CopilotChatOptions = {}
): Promise<string> {
if (!this.availableModels.includes(model)) {
if (!(await this.isModelAvailable(model))) {
throw new CopilotPromptInvalid(`Invalid model: ${model}`);
}
@@ -269,7 +259,7 @@ export class FalProvider
private async buildResponse(
messages: PromptMessage[],
model: string = this.availableModels[0],
model: string = this.models[0],
options: CopilotImageOptions = {}
) {
// by default, image prompt assumes there is only one message
@@ -300,10 +290,10 @@ export class FalProvider
// ====== image to image ======
async generateImages(
messages: PromptMessage[],
model: string = this.availableModels[0],
model: string = this.models[0],
options: CopilotImageOptions = {}
): Promise<Array<string>> {
if (!this.availableModels.includes(model)) {
if (!(await this.isModelAvailable(model))) {
throw new CopilotPromptInvalid(`Invalid model: ${model}`);
}
@@ -333,7 +323,7 @@ export class FalProvider
async *generateImagesStream(
messages: PromptMessage[],
model: string = this.availableModels[0],
model: string = this.models[0],
options: CopilotImageOptions = {}
): AsyncIterable<string> {
try {