AI Model Hub API 使用文档

为 Halo 插件提供统一的 AI 模型调用能力,支持文本对话和图像生成。


目录


快速开始

第一步:添加依赖

repositories {
    maven { url 'https://jitpack.io' }
}

dependencies {
    compileOnly 'com.github.acanyo:plugin-aimodel-hub:1.0.0-SNAPSHOT'
}

第二步:声明插件依赖

plugin.yaml 中:

spec:
  pluginDependencies:
    aimodel-hub: ">=1.0.0"

第三步:开始使用

import static com.xhhao.aimodelhub.api.ChatModels.*;
import static com.xhhao.aimodelhub.api.ImageModels.*;
import com.xhhao.aimodelhub.api.ChatModels.Provider;

// 文本对话
ChatModels.chat("你好").subscribe(System.out::println);

// 图像生成
ImageModels.generate("一只可爱的猫").subscribe(urls -> urls.forEach(System.out::println));

文本对话 API

使用 ChatModels 静态类调用文本对话。

import static com.xhhao.aimodelhub.api.ChatModels.*;
import com.xhhao.aimodelhub.api.ChatModels.Provider;
import com.xhhao.aimodelhub.api.ChatOptions;
import com.xhhao.aimodelhub.api.ChatMessage;

方法一览

方法

说明

chat(message)

使用默认供应商对话

chat(Provider, message)

指定供应商对话

chat(Provider, apiKey, model, message)

自定义 API Key 对话

chat(Provider, options, message)

完整配置对话

chatStream(...)

流式输出(参数同上)

chat(messages)

多轮对话

withMemory(systemPrompt)

带记忆的对话

基础用法

// 1. 最简单 - 使用默认供应商和全局配置
chat("你好").subscribe(System.out::println);

// 2. 指定供应商
chat(Provider.OPENAI, "你好").subscribe(System.out::println);
chat(Provider.ZHIPU, "你好").subscribe(System.out::println);
chat(Provider.SILICONFLOW, "你好").subscribe(System.out::println);

// 3. 自定义 API Key(不需要 ChatOptions)
chat(Provider.OPENAI, "sk-xxx", "gpt-4o", "你好").subscribe(System.out::println);

// 4. 完整配置(需要调参时)
ChatOptions options = ChatOptions.builder()
    .apiKey("sk-xxx")
    .model("gpt-4o")
    .temperature(0.7)
    .maxTokens(2000)
    .build();
chat(Provider.OPENAI, options, "你好").subscribe(System.out::println);

流式输出

// 基础流式
chatStream("写一篇文章").subscribe(System.out::print);

// 指定供应商
chatStream(Provider.OPENAI, "写一首诗").subscribe(System.out::print);

// 自定义 API Key
chatStream(Provider.OPENAI, "sk-xxx", "gpt-4o", "写一首诗").subscribe(System.out::print);

// 完整配置
chatStream(Provider.OPENAI, options, "写一首诗").subscribe(System.out::print);

多轮对话

List<ChatMessage> messages = List.of(
    ChatMessage.system("你是一个 Java 编程助手"),
    ChatMessage.user("什么是 Spring Boot?"),
    ChatMessage.assistant("Spring Boot 是一个快速开发框架..."),
    ChatMessage.user("如何创建项目?")
);

chat(messages).subscribe(System.out::println);
chat(Provider.OPENAI, messages).subscribe(System.out::println);
chatStream(messages).subscribe(System.out::print);

记忆对话

// 自动管理上下文
ChatModels.withMemory("你是编程助手")
    .flatMap(model -> model.chat("我叫张三"))
    .subscribe(System.out::println);

// 指定供应商
ChatModels.withMemory(Provider.OPENAI, "你是翻译助手")
    .flatMap(model -> model.chat("翻译:Hello"));

图像生成 API

使用 ImageModels 静态类生成图像。

import static com.xhhao.aimodelhub.api.ImageModels.*;
import com.xhhao.aimodelhub.api.ImageModels.Provider;
import com.xhhao.aimodelhub.api.ImageOptions;

图像方法一览

方法

说明

generate(prompt)

使用默认供应商生成

generate(Provider, prompt)

指定供应商生成

generate(Provider, apiKey, model, prompt)

自定义 API Key

generate(Provider, options, prompt)

完整配置生成

图像基础用法

// 1. 最简单
generate("一只可爱的猫").subscribe(urls -> urls.forEach(System.out::println));

// 2. 指定供应商
generate(Provider.OPENAI, "未来城市").subscribe(urls -> ...);
generate(Provider.ZHIPU, "山水画").subscribe(urls -> ...);
generate(Provider.SILICONFLOW, "风景照片").subscribe(urls -> ...);

// 3. 自定义 API Key
generate(Provider.OPENAI, "sk-xxx", "dall-e-3", "一只猫").subscribe(urls -> ...);

// 4. 完整配置
ImageOptions options = ImageOptions.builder()
    .apiKey("sk-xxx")
    .model("dall-e-3")
    .size("1024x1792")
    .quality("hd")
    .style("vivid")
    .build();
generate(Provider.OPENAI, options, "印象派日落").subscribe(urls -> ...);

硅基流动特有参数

ImageOptions options = ImageOptions.builder()
    .apiKey("sk-your-api-key")
    .model("black-forest-labs/FLUX.1-schnell")
    .size("1024x1024")
    .steps(20)                          // 采样步数
    .guidanceScale(7)                   // 引导系数
    .seed(12345L)                       // 随机种子
    .negativePrompt("低质量, 模糊, 变形")  // 负面提示词
    .build();

generate(Provider.SILICONFLOW, options, "高质量的风景照片")
    .subscribe(urls -> urls.forEach(System.out::println));

ChatOptions 参数详解

ChatOptions 用于配置文本对话模型的所有参数:

ChatOptions options = ChatOptions.builder()
    
    // ==================== 基础参数 ====================
    .apiKey("sk-xxx")            // API Key(自定义调用时必填)
    .model("gpt-4o")             // 模型名称
    .baseUrl("https://...")      // 自定义 API 地址(兼容 OpenAI 格式的服务)
    
    // ==================== 生成参数 ====================
    .temperature(0.7)            // 温度 0-2,越高越随机创意,越低越确定
    .topP(0.9)                   // 核采样 0-1,与 temperature 二选一调整
    .maxTokens(2000)             // 最大生成 Token 数
    .frequencyPenalty(0.0)       // 频率惩罚 -2~2,减少重复词
    .presencePenalty(0.0)        // 存在惩罚 -2~2,鼓励新话题
    .stop(List.of("END", "###")) // 停止词列表
    .seed(12345)                 // 随机种子,相同种子产生相同输出
    .user("user-123")            // 用户标识,用于追踪
    
    // ==================== 网络参数 ====================
    .timeout(Duration.ofSeconds(60))  // 请求超时时间
    .maxRetries(3)                    // 最大重试次数
    .customHeaders(Map.of(            // 自定义请求头
        "X-Custom-Header", "value"
    ))
    
    // ==================== OpenAI 特有 ====================
    .organizationId("org-xxx")        // OpenAI 组织 ID
    .projectId("proj-xxx")            // OpenAI 项目 ID
    .maxCompletionTokens(1000)        // o1 系列模型的最大完成 Token
    .logitBias(Map.of(50256, -100))   // Token 偏置
    .responseFormat("json_object")    // 响应格式: text/json_object/json_schema
    .strictJsonSchema(true)           // 严格 JSON Schema 模式
    .parallelToolCalls(true)          // 是否并行调用工具
    .strictTools(true)                // 严格工具模式
    
    // ==================== 硅基流动特有 ====================
    .enableThinking(true)             // 开启思维模式(推理模型如 DeepSeek-R1)
    .thinkingBudget(4096)             // 思维链 Token 预算 128-32768
    .minP(0.1)                        // 动态过滤阈值 0-1(Qwen3 模型)
    .topK(50)                         // Top-K 采样
    .repetitionPenalty(1.1)           // 重复惩罚
    .n(1)                             // 生成数量
    
    // ==================== 智谱特有 ====================
    .requestId("req-xxx")             // 请求追踪 ID
    .webSearch(true)                  // 联网搜索(GLM-4 支持)
    .toolChoice("auto")               // 工具选择: auto/none/required
    
    // ==================== 调试 ====================
    .logRequests(true)                // 记录请求日志
    .logResponses(true)               // 记录响应日志
    
    .build();

参数说明表

参数

类型

范围

说明

temperature

Double

0-2

控制随机性,0=确定性,2=最随机

topP

Double

0-1

核采样,只考虑概率累计达到 P 的 Token

maxTokens

Integer

1-128000

最大生成 Token 数,不同模型上限不同

frequencyPenalty

Double

-2~2

减少已出现词的频率

presencePenalty

Double

-2~2

鼓励生成新的话题

seed

Integer

-

固定随机种子,实现可复现输出

timeout

Duration

-

请求超时时间

maxRetries

Integer

0-10

失败重试次数

快捷方法

// 快速创建
ChatOptions options = ChatOptions.of("sk-xxx", "gpt-4o");

// 包含 baseUrl
ChatOptions options = ChatOptions.of("sk-xxx", "https://api.example.com", "model-name");

ImageOptions 参数详解

ImageOptions 用于配置图像生成模型的所有参数:

ImageOptions options = ImageOptions.builder()
    
    // ==================== 基础参数 ====================
    .apiKey("sk-xxx")               // API Key
    .model("dall-e-3")              // 模型名称
    .baseUrl("https://...")         // 自定义 API 地址
    
    // ==================== 生成参数 ====================
    .size("1024x1024")              // 图片尺寸
    .quality("hd")                  // 质量: standard/hd (DALL-E 3)
    .n(1)                           // 生成数量 (DALL-E 3 只支持 1)
    .style("vivid")                 // 风格: vivid/natural (DALL-E 3)
    .watermark(false)               // 是否加水印
    
    // ==================== 网络参数 ====================
    .timeout(Duration.ofSeconds(120))  // 超时时间(图像生成较慢)
    .maxRetries(2)                     // 最大重试次数
    
    // ==================== 硅基流动特有 ====================
    .steps(20)                      // 采样步数 1-50
    .guidanceScale(7)               // 引导系数 1-20
    .seed(12345L)                   // 随机种子
    .negativePrompt("低质量")        // 负面提示词
    .imageFormat("png")             // 输出格式: png/jpeg
    
    .build();

支持的图片尺寸

供应商

模型

支持的尺寸

OpenAI

dall-e-2

256x256, 512x512, 1024x1024

OpenAI

dall-e-3

1024x1024, 1024x1792, 1792x1024

智谱

cogview-3

1024x1024, 768x1024, 1024x768

硅基流动

FLUX 系列

自定义,如 1024x1024


支持的供应商和模型

文本对话模型

供应商

Provider 枚举

默认模型

推荐模型

OpenAI

Provider.OPENAI

gpt-4o-mini

gpt-4o, gpt-4o-mini, gpt-4-turbo, o1-preview

智谱 AI

Provider.ZHIPU

glm-4-flash

glm-4, glm-4-flash, glm-4-plus

硅基流动

Provider.SILICONFLOW

Qwen/Qwen3-8B

Qwen 系列, DeepSeek 系列

图像生成模型

供应商

Provider

默认模型

推荐模型

OpenAI

Provider.OPENAI

dall-e-3

dall-e-2, dall-e-3

智谱 AI

Provider.ZHIPU

cogview-3-flash

cogview-3, cogview-3-flash

硅基流动

Provider.SILICONFLOW

FLUX.1-schnell

FLUX.1-schnell, FLUX.1-dev, Stable Diffusion


错误处理

chat(Provider.OPENAI, "你好")
    .onErrorResume(e -> {
        if (e instanceof AiModelException) {
            AiModelException aiError = (AiModelException) e;
            System.err.println("AI 错误: " + aiError.getMessage());
        }
        return Mono.just("抱歉,AI 服务暂时不可用");
    })
    .subscribe(System.out::println);

常见错误

错误

原因

解决方案

API Key 未配置

插件设置中未填写 API Key

在 Halo 后台配置

请求超时

网络问题或模型响应慢

增加 timeout 配置

Token 超限

输入+输出超过模型限制

减少输入或 maxTokens

余额不足

API 账户余额用尽

充值或更换 API Key


最佳实践

1. 合理设置 Temperature

// 代码生成:低温度,确定性高
ChatOptions codeOptions = ChatOptions.builder()
    .apiKey("sk-xxx")
    .temperature(0.2)
    .build();

chat(Provider.OPENAI, codeOptions, "写一个快速排序").subscribe(System.out::println);

// 创意写作:高温度,更有创意
ChatOptions creativeOptions = ChatOptions.builder()
    .apiKey("sk-xxx")
    .temperature(0.9)
    .build();

chat(Provider.OPENAI, creativeOptions, "写一首诗").subscribe(System.out::println);

2. 使用系统提示定义角色

List<ChatMessage> messages = List.of(
    ChatMessage.system("""
        你是一个专业的技术文档编写助手。
        规则:
        1. 使用清晰简洁的语言
        2. 提供代码示例
        3. 使用 Markdown 格式
        """),
    ChatMessage.user(userQuestion)
);

chat(messages).subscribe(System.out::println);

3. 流式输出提升用户体验

// 在 Web 应用中使用 SSE 推送
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
    return ChatModels.chatStream(Provider.OPENAI, message);
}

4. 记忆对话

// 使用 withMemory 自动管理上下文
ChatModels.withMemory("你是一个专业的编程助手")
    .flatMap(model -> model.chat("你好"))
    .subscribe(System.out::println);

5. 错误重试策略

chat(Provider.OPENAI, "你好")
    .retryWhen(Retry.backoff(3, Duration.ofSeconds(1))
        .filter(e -> e instanceof TimeoutException))
    .subscribe(System.out::println);

日志记录

所有通过 ChatModelsImageModels 的调用都会自动记录日志,包括:

  • 调用者插件名称

  • 模型供应商和名称

  • Token 使用量(输入/输出/总计)

  • 调用耗时

  • 成功/失败状态

  • 错误信息

在 Halo 后台 "工具" → "AI 调用日志" 中查看统计和详情。