Skip to content

添加新的 LLM 步骤

假设你要添加一个新的名为 AwesomeLLM 的支持。

步骤 1: 创建新 LLM 的核心实现

src/ 目录下创建一个新的文件夹,例如 src/awesome_llm/,并在其中创建 awesome_llm-core.jsawesome_llm-strategy.js

src/awesome_llm/awesome_llm-core.js

这个文件将包含与 AwesomeLLM 实际 API 交互的逻辑。你需要实现 generateContentlistModels 方法,并且可能需要处理认证、请求重试等。

javascript
// src/awesome_llm/awesome_llm-core.js
import axios from 'axios';

export class AwesomeLLMApiService {
    constructor(config) {
        // 初始化配置,例如 API Key 和基础 URL
        this.config = config;
        this.apiKey = config.AWESOME_LLM_API_KEY;
        this.baseUrl = config.AWESOME_LLM_BASE_URL;
        this.axiosInstance = axios.create({
            baseURL: this.baseUrl,
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${this.apiKey}`
            }
        });
    }

    async generateContent(model, requestBody) {
        // 实现与 AwesomeLLM API 的内容生成交互
        // 返回 AwesomeLLM 原生格式的响应
        const response = await this.axiosInstance.post(`/v1/models/${model}/generate`, requestBody);
        return response.data;
    }

    async *generateContentStream(model, requestBody) {
        // 如果 AwesomeLLM 支持流式生成,实现流式逻辑
        // 否则,可以简单调用 generateContent 并模拟流式响应
        const response = await this.generateContent(model, requestBody);
        yield response; // 简单示例,实际流式处理会更复杂
    }

    async listModels() {
        // 实现获取 AwesomeLLM 可用模型列表的逻辑
        // 返回 AwesomeLLM 原生格式的模型列表
        const response = await this.axiosInstance.get('/v1/models');
        return response.data;
    }
}

src/awesome_llm/awesome_llm-strategy.js

这个文件将实现 ProviderStrategy 接口,处理 AwesomeLLM 特有的逻辑。

javascript
// src/awesome_llm/awesome_llm-strategy.js
import { ProviderStrategy } from '../provider-strategy.js';
import { extractSystemPromptFromRequestBody, MODEL_PROTOCOL_PREFIX } from '../common.js';

class AwesomeLLMStrategy extends ProviderStrategy {
    extractModelAndStreamInfo(req, requestBody) {
        // 从请求中提取模型名称和是否流式请求
        const model = requestBody.model;
        const isStream = requestBody.stream === true;
        return { model, isStream };
    }

    extractResponseText(response) {
        // 从 AwesomeLLM 原生响应中提取文本内容
        return response.generated_text || '';
    }

    extractPromptText(requestBody) {
        // 从 AwesomeLLM 请求体中提取提示词
        return requestBody.prompt || '';
    }

    async applySystemPromptFromFile(config, requestBody) {
        // 根据配置,将系统提示词应用到 AwesomeLLM 请求体
        // 例如:requestBody.system_prompt = newSystemText;
        return requestBody;
    }

    async manageSystemPrompt(requestBody) {
        // 管理系统提示词,例如写入文件
        const incomingSystemText = extractSystemPromptFromRequestBody(requestBody, MODEL_PROTOCOL_PREFIX.AWESOME_LLM);
        await this._updateSystemPromptFile(incomingSystemText, MODEL_PROTOCOL_PREFIX.AWESOME_LLM);
    }
}

export { AwesomeLLMStrategy };

步骤 2: 更新 src/common.js

src/common.js 中添加新的 MODEL_PROVIDERMODEL_PROTOCOL_PREFIX

javascript
// src/common.js
export const MODEL_PROTOCOL_PREFIX = {
    // ... 现有内容
    AWESOME_LLM: 'awesome_llm', // 新增
}

export const MODEL_PROVIDER = {
    // ... 现有内容
    AWESOME_LLM_CUSTOM: 'awesome_llm-custom', // 新增
}

步骤 3: 更新 src/adapter.js

src/adapter.js 中创建 AwesomeLLMApiServiceAdapter,并将其添加到 getServiceAdapter 工厂函数中。

javascript
// src/adapter.js
import { AwesomeLLMApiService } from './awesome_llm/awesome_llm-core.js'; // 导入 AwesomeLLM Service

// AwesomeLLM API 服务适配器
export class AwesomeLLMApiServiceAdapter extends ApiServiceAdapter {
    constructor(config) {
        super();
        this.awesomeLLMApiService = new AwesomeLLMApiService(config);
    }

    async generateContent(model, requestBody) {
        return this.awesomeLLMApiService.generateContent(model, requestBody);
    }

    async *generateContentStream(model, requestBody) {
        yield* this.awesomeLLMApiService.generateContentStream(model, requestBody);
    }

    async listModels() {
        return this.awesomeLLMApiService.listModels();
    }
}

// ... (getServiceAdapter 函数)
export function getServiceAdapter(config) {
    const provider = config.MODEL_PROVIDER;
    if (!serviceInstances[provider]) {
        switch (provider) {
            // ... 现有内容
            case MODEL_PROVIDER.AWESOME_LLM_CUSTOM: // 新增
                serviceInstances[provider] = new AwesomeLLMApiServiceAdapter(config);
                break;
            default:
                throw new Error(`Unsupported model provider: ${provider}`);
        }
    }
    return serviceInstances[provider];
}

步骤 4: 更新 src/provider-strategies.js

src/provider-strategies.js 中导入新的策略,并添加到工厂中。

javascript
// src/provider-strategies.js
import { AwesomeLLMStrategy } from './awesome_llm/awesome_llm-strategy.js'; // 导入新策略

class ProviderStrategyFactory {
    static getStrategy(providerProtocol) {
        switch (providerProtocol) {
            // ... 现有内容
            case MODEL_PROTOCOL_PREFIX.AWESOME_LLM: // 新增
                return new AwesomeLLMStrategy();
            default:
                throw new Error(`Unsupported provider protocol: ${providerProtocol}`);
        }
    }
}

步骤 5: 更新 src/convert.js (可选但推荐)

如果 AwesomeLLM 的 API 格式与 OpenAI、Gemini 或 Claude 差异较大,或者你希望支持与其他 LLM 之间的请求/响应转换,你需要在 src/convert.js 中添加相应的转换函数。

例如,如果你想将 OpenAI 请求转换为 AwesomeLLM 请求:

javascript
// src/convert.js
// ... (现有内容)

export function toAwesomeLLMRequestFromOpenAI(openaiRequest) {
    // 转换逻辑
    const awesomeLLMRequest = {
        prompt: openaiRequest.messages.map(m => m.content).join('\n'),
        // ... 其他参数
    };
    return awesomeLLMRequest;
}

// ... (convertData 函数中添加新的转换映射)
const conversionMap = {
    request: {
        // ... 现有内容
        [MODEL_PROTOCOL_PREFIX.AWESOME_LLM]: {
            [MODEL_PROTOCOL_PREFIX.OPENAI]: toAwesomeLLMRequestFromOpenAI,
            // ... 其他从其他 LLM 转换为 AwesomeLLM 的转换
        },
    },
    // ... 其他类型(response, streamChunk, modelList)的转换
};

步骤 6: 配置 api-server.js (可选)

如果你希望通过命令行参数为 AwesomeLLM 配置 API 密钥或基础 URL,你需要在 api-server.jsinitializeConfig 函数中添加相应的解析逻辑。

通过以上步骤,你就可以成功地将新的 LLM 集成到 AIClient-2-API 项目中,并利用其统一的 API 代理功能。