mirror of
https://github.com/ItzCrazyKns/Perplexica.git
synced 2025-11-20 20:18:15 +00:00
feat(models): add new base classes
This commit is contained in:
7
src/lib/models/base/embedding.ts
Normal file
7
src/lib/models/base/embedding.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
abstract class BaseEmbedding<CONFIG> {
|
||||||
|
constructor(protected config: CONFIG) {}
|
||||||
|
abstract embedText(texts: string[]): Promise<number[][]>;
|
||||||
|
abstract embedChunks(chunks: Chunk[]): Promise<number[][]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default BaseEmbedding;
|
||||||
26
src/lib/models/base/llm.ts
Normal file
26
src/lib/models/base/llm.ts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import {
|
||||||
|
GenerateObjectInput,
|
||||||
|
GenerateObjectOutput,
|
||||||
|
GenerateOptions,
|
||||||
|
GenerateTextInput,
|
||||||
|
GenerateTextOutput,
|
||||||
|
StreamObjectOutput,
|
||||||
|
StreamTextOutput,
|
||||||
|
} from '../types';
|
||||||
|
|
||||||
|
abstract class BaseLLM<CONFIG> {
|
||||||
|
constructor(protected config: CONFIG) {}
|
||||||
|
abstract withOptions(options: GenerateOptions): this;
|
||||||
|
abstract generateText(input: GenerateTextInput): Promise<GenerateTextOutput>;
|
||||||
|
abstract streamText(
|
||||||
|
input: GenerateTextInput,
|
||||||
|
): AsyncGenerator<StreamTextOutput>;
|
||||||
|
abstract generateObject<T>(
|
||||||
|
input: GenerateObjectInput,
|
||||||
|
): Promise<GenerateObjectOutput<T>>;
|
||||||
|
abstract streamObject<T>(
|
||||||
|
input: GenerateObjectInput,
|
||||||
|
): AsyncGenerator<StreamObjectOutput<T>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default BaseLLM;
|
||||||
47
src/lib/models/base/provider.ts
Normal file
47
src/lib/models/base/provider.ts
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import { Embeddings } from '@langchain/core/embeddings';
|
||||||
|
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
||||||
|
import { ModelList, ProviderMetadata } from '../types';
|
||||||
|
import { UIConfigField } from '@/lib/config/types';
|
||||||
|
import BaseLLM from './llm';
|
||||||
|
import BaseEmbedding from './embedding';
|
||||||
|
|
||||||
|
abstract class BaseModelProvider<CONFIG> {
|
||||||
|
constructor(
|
||||||
|
protected id: string,
|
||||||
|
protected name: string,
|
||||||
|
protected config: CONFIG,
|
||||||
|
) {}
|
||||||
|
abstract getDefaultModels(): Promise<ModelList>;
|
||||||
|
abstract getModelList(): Promise<ModelList>;
|
||||||
|
abstract loadChatModel(modelName: string): Promise<BaseLLM<any>>;
|
||||||
|
abstract loadEmbeddingModel(modelName: string): Promise<BaseEmbedding<any>>;
|
||||||
|
static getProviderConfigFields(): UIConfigField[] {
|
||||||
|
throw new Error('Method not implemented.');
|
||||||
|
}
|
||||||
|
static getProviderMetadata(): ProviderMetadata {
|
||||||
|
throw new Error('Method not Implemented.');
|
||||||
|
}
|
||||||
|
static parseAndValidate(raw: any): any {
|
||||||
|
/* Static methods can't access class type parameters */
|
||||||
|
throw new Error('Method not Implemented.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ProviderConstructor<CONFIG> = {
|
||||||
|
new (id: string, name: string, config: CONFIG): BaseModelProvider<CONFIG>;
|
||||||
|
parseAndValidate(raw: any): CONFIG;
|
||||||
|
getProviderConfigFields: () => UIConfigField[];
|
||||||
|
getProviderMetadata: () => ProviderMetadata;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const createProviderInstance = <P extends ProviderConstructor<any>>(
|
||||||
|
Provider: P,
|
||||||
|
id: string,
|
||||||
|
name: string,
|
||||||
|
rawConfig: unknown,
|
||||||
|
): InstanceType<P> => {
|
||||||
|
const cfg = Provider.parseAndValidate(rawConfig);
|
||||||
|
return new Provider(id, name, cfg) as InstanceType<P>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default BaseModelProvider;
|
||||||
Reference in New Issue
Block a user