All files / src/llm-provider proxy-llm.provider.ts

44.44% Statements 16/36
0% Branches 0/8
33.33% Functions 1/3
41.17% Lines 14/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 746x             6x 6x 6x 6x 6x 6x     6x   6x 6x 6x 6x 6x 6x                                                                                                      
import { Injectable } from '@nestjs/common';
import {
  LlmProvider,
  LlmProviderRequest,
  LlmModel,
  LlmResponse,
} from './llm-provider.interface';
import { GeminiLlmProvider } from '../gemini/gemini-llm.provider';
import { OpenRouterLlmProvider } from './openrouter-llm.provider';
import { ZaiLlmProvider } from './zai-llm.provider';
import { AlibabaLlmProvider } from './alibaba-llm.provider';
import { OllamaLlmProvider } from './ollama-llm.provider';
import { OpenaiLlmProvider } from './openai-llm.provider';
 
@Injectable()
export class ProxyLlmProvider implements LlmProvider {
  constructor(
    private readonly geminiProvider: GeminiLlmProvider,
    private readonly openRouterProvider: OpenRouterLlmProvider,
    private readonly zaiProvider: ZaiLlmProvider,
    private readonly alibabaProvider: AlibabaLlmProvider,
    private readonly ollamaProvider: OllamaLlmProvider,
    private readonly openaiProvider: OpenaiLlmProvider,
  ) {}
 
  async getModels(): Promise<LlmModel[]> {
    const geminiModels = await this.geminiProvider.getModels();
    const openRouterModels = await this.openRouterProvider.getModels();
    const zaiModels = await this.zaiProvider.getModels();
    const alibabaModels = await this.alibabaProvider.getModels();
    const ollamaModels = await this.ollamaProvider.getModels();
    const openaiModels = await this.openaiProvider.getModels();
    return [
      ...geminiModels,
      ...ollamaModels,
      ...alibabaModels,
      ...zaiModels,
      ...openRouterModels,
      ...openaiModels,
    ];
  }
 
  async generateContent(request: LlmProviderRequest): Promise<LlmResponse> {
    const { modelId } = request;
 
    Iif (modelId?.startsWith('ollama/')) {
      return this.ollamaProvider.generateContent(request);
    }
 
    Iif (modelId?.startsWith('alibaba/')) {
      return this.alibabaProvider.generateContent(request);
    }
 
    Iif (modelId?.startsWith('zai/')) {
      return this.zaiProvider.generateContent(request);
    }
 
    Iif (modelId?.startsWith('openai/')) {
      return this.openaiProvider.generateContent(request);
    }
 
    // Check if it's an OpenRouter model
    // OpenRouter models usually have a slash (e.g., openai/gpt-3.5-turbo)
    // whereas local Gemini models are IDs like 'gemini-1.5-pro'
    const isOpenRouter = modelId && modelId.includes('/');
 
    if (!isOpenRouter) {
      return this.geminiProvider.generateContent(request);
    } else {
      return this.openRouterProvider.generateContent(request);
    }
  }
}