@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
56 lines (49 loc) • 2.16 kB
text/typescript
import { ModelProvider } from 'model-bank';
import { createOpenAICompatibleRuntime } from '../../core/openaiCompatibleFactory';
import { processMultiProviderModelList } from '../../utils/modelParse';
import { NovitaModelCard } from './type';
const formatPrice = (price?: number) => {
if (price === undefined || price === null) return undefined;
// Convert Novita price to desired unit: e.g. 5700 -> 0.57
if (typeof price !== 'number') return undefined;
if (price === -1) return undefined;
return Number((price / 10_000).toPrecision(5));
};
export const LobeNovitaAI = createOpenAICompatibleRuntime({
baseURL: 'https://api.novita.ai/v3/openai',
constructorOptions: {
defaultHeaders: {
'X-Novita-Source': 'lobechat',
},
},
debug: {
chatCompletion: () => process.env.DEBUG_NOVITA_CHAT_COMPLETION === '1',
},
models: async ({ client }) => {
const modelsPage = (await client.models.list()) as any;
const modelList: NovitaModelCard[] = modelsPage.data;
const formattedModels = modelList.map((m) => {
const mm = m as any;
const features: string[] = Array.isArray(mm.features) ? mm.features : [];
const inputModalities: string[] = Array.isArray(mm.input_modalities) ? mm.input_modalities : [];
return {
contextWindowTokens: mm.context_size ?? mm.max_output_tokens ?? undefined,
created: mm.created,
description: mm.description ?? '',
displayName: mm.display_name ?? mm.title ?? mm.id,
functionCall: features.includes('function-calling') || false,
id: mm.id,
maxOutput: typeof mm.max_output_tokens === 'number' ? mm.max_output_tokens : undefined,
pricing: {
input: formatPrice(mm.input_token_price_per_m),
output: formatPrice(mm.output_token_price_per_m),
},
reasoning: features.includes('reasoning') || false,
type: mm.model_type ?? undefined,
vision: inputModalities.includes('image') || features.includes('vision') || false,
} as any;
});
return await processMultiProviderModelList(formattedModels, 'novita');
},
provider: ModelProvider.Novita,
});