跳转至

模型 Provider 开发

Provider 是 Koishi 插件,注册 AI SDK 的 LanguageModel / EmbeddingModel

最小实现

import { createOpenAI } from "@ai-sdk/openai";
import { Context, Schema } from "koishi";
import type { BaseProviderConfig } from "koishi-plugin-yesimbot";

interface Config extends BaseProviderConfig {
  format: "chat" | "responses";
}

export const inject = ["yesimbot"];

export const Config: Schema<Config> = Schema.object({
  id: Schema.string().default("openai"),
  apiKey: Schema.string().role("secret").required(),
  baseURL: Schema.string(),
  chatModels: Schema.array(
    Schema.object({
      id: Schema.string().required(),
      toolCall: Schema.boolean().default(true),
      reasoning: Schema.boolean().default(false),
    }),
  ).default([]),
});

export function apply(ctx: Context, config: Config) {
  ctx.on("ready", () => {
    const client = createOpenAI({ apiKey: config.apiKey, baseURL: config.baseURL });
    const dispose = ctx.yesimbot.model.register({
      id: config.id,
      capabilities: { chat: true, embedding: false },
      chatModels: () => config.chatModels,
      embeddingModels: () => [],
      chat: (modelId) => client.chat(modelId),
      embedding: () => {
        throw new Error("not supported");
      },
    });
    ctx.on("dispose", dispose);
  });
}

注册契约

interface Provider {
  id: string;
  capabilities: { chat: boolean; embedding: boolean };
  chatModels(): ChatModelConfig[];
  embeddingModels(): EmbeddingModelConfig[];
  chat?(modelId: string): LanguageModel;
  embedding?(modelId: string): EmbeddingModel;
}

Provider 不声明图片模态能力,该信息由 models.json 控制。