Solon v3.2.1

image - 图像生成模型

</> markdown

图像生成模型(ImageModel) 与 聊天生成模型(ChatModel)接口差不多。更简单,只有提示与生成。暂时只提供生成功能,后续会增加修改支持。

1、构建图像生成模型

添加配置

solon.ai.image:
  demo:
    apiUrl: "https://ai.gitee.com/v1/images/generations" # 使用完整地址(而不是 api_base)
    model: "stable-diffusion-3.5-large-turbo"

构建并测试

@Configuration
public class DemoConfig {
    @Bean
    public ImageModel build(@Inject("${solon.ai.chat.image}") ImageConfig config) {
        return ImageModel.of(config).build();
    }

    @Bean
    public void test(ImageModel imageModel) throws IOException {
        //一次性返回
        ImageResponse resp = imageModel.prompt("一只白色的小花猫").call();

        //打印消息
        System.out.println(resp.getImage().getUrl());
    }
}

2、使用选项

imageModel.prompt("一只白色的小花猫")
    .options(o -> o.size("1024x1024"))
    .call();
    
imageModel.prompt("一只白色的小花猫")
    .options(o -> {
        o.optionAdd("negative_prompt", "");
        o.optionAdd("sampler_name", "Euler");
        o.optionAdd("scheduler", "Simple");
        o.optionAdd("steps", 25);
        o.optionAdd("width", 512);
        o.optionAdd("height", 768);
        o.optionAdd("batch_size", 1);
        o.optionAdd("cfg_scale", 1);
        o.optionAdd("distilled_cfg_scale", 3.5);
        o.optionAdd("seed", -1);
        o.optionAdd("n_iter", 1);
    })
    .call();    

3、方言适配

图片生成模型(ImageModel)同样支持方言适配。框架已内置 OllamaImageDialect、DashscopeImageDialect、OpenaiImageDialect(默认) 三种方言(基本够用),自动支持 Ollama 提供的模型接口、Dashscope 提供的模型接口及 Openai 规范的模型接口。

也可以通过定制,实现更多的模型兼容。方言接口:

public interface ImageDialect extends AiModelDialect {
    /**
     * 匹配检测
     *
     * @param config 聊天配置
     */
    boolean matched(ImageConfig config);

    /**
     * 构建请求数据
     *
     * @param config  聊天配置
     * @param options 聊天选项
     * @param prompt  提示语
     */
    String buildRequestJson(ImageConfig config, ImageOptions options, String prompt);

    /**
     * 分析响应数据
     *
     * @param config   聊天配置
     * @param respJson 响应数据
     */
    ImageResponse parseResponseJson(ImageConfig config, String respJson);
}

OllamaImageDialect 适配参考:

public class OllamaImageDialect extends AbstractImageDialect {
    private static OllamaImageDialect instance = new OllamaImageDialect();

    public static OllamaImageDialect getInstance() {
        return instance;
    }

    @Override
    public boolean matched(ImageConfig config) {
        return "ollama".equals(config.getProvider());
    }

    @Override
    public ImageResponse parseResponseJson(ImageConfig config, String respJson) {
        ONode oResp = ONode.load(respJson);

        String model = oResp.get("model").getString();

        if (oResp.contains("error")) {
            return new ImageResponse(model, new ImageException(oResp.get("error").getString()), null, null);
        } else {
            List<Image> data = oResp.get("data").toObjectList(Image.class);

            AiUsage usage = null;
            if (oResp.contains("prompt_eval_count")) {
                int prompt_eval_count = oResp.get("prompt_eval_count").getInt();
                usage = new AiUsage(
                        prompt_eval_count,
                        0,
                        prompt_eval_count
                );
            }

            return new ImageResponse(model, null, data, usage);
        }
    }
}