feat(inference): 集成 GPT Image 2 异步文生图 API

- 新增 GptImage2Config 配置(yuntts 等 GPT Image 2 兼容服务)
- 新增 gptimage.go 异步客户端:提交任务 → 轮询状态 → 下载图片
- GenerateImages 优先级调整为:GPT Image 2 > OpenAI 兼容 ImageGen > Mock
- 支持环境变量 GEN2D_GPT_IMAGE2_* 系列配置
This commit is contained in:
2026-05-25 12:36:37 +08:00
parent 74c1725473
commit d9d3b51262
5 changed files with 325 additions and 9 deletions
+31 -6
View File
@@ -9,11 +9,12 @@ import (
// Config 应用全局配置。
type Config struct {
Server ServerConfig `mapstructure:"server"`
Database DatabaseConfig `mapstructure:"database"`
JWT JWTConfig `mapstructure:"jwt"`
LLM LLMConfig `mapstructure:"llm"`
ImageGen ImageGenConfig `mapstructure:"image_gen"`
Server ServerConfig `mapstructure:"server"`
Database DatabaseConfig `mapstructure:"database"`
JWT JWTConfig `mapstructure:"jwt"`
LLM LLMConfig `mapstructure:"llm"`
ImageGen ImageGenConfig `mapstructure:"image_gen"`
GptImage2 GptImage2Config `mapstructure:"gpt_image2"`
}
// ServerConfig HTTP 服务配置。
@@ -43,7 +44,7 @@ type LLMConfig struct {
MaxTokens int `mapstructure:"max_tokens"`
}
// ImageGenConfig 文生图模型配置。
// ImageGenConfig 文生图模型配置(OpenAI 兼容同步 API)。
type ImageGenConfig struct {
BaseURL string `mapstructure:"base_url"`
APIKey string `mapstructure:"api_key"`
@@ -55,6 +56,16 @@ type ImageGenConfig struct {
CFGScale float64 `mapstructure:"cfg_scale"`
}
// GptImage2Config GPT Image 2 异步生图模型配置(yuntts 等兼容服务)。
type GptImage2Config struct {
BaseURL string `mapstructure:"base_url"`
APIKey string `mapstructure:"api_key"`
AspectRatio string `mapstructure:"aspect_ratio"`
XChannel string `mapstructure:"x_channel"`
PollMaxWait int `mapstructure:"poll_max_wait"` // 轮询最大等待秒数, 默认 120
PollInterval int `mapstructure:"poll_interval"` // 轮询间隔秒数, 默认 3
}
// Load 从 YAML 配置文件和环境变量加载配置。
// 优先级:环境变量 > YAML 文件 > 默认值。
func Load() *Config {
@@ -111,6 +122,13 @@ func setDefaults(v *viper.Viper) {
v.SetDefault("image_gen.num_images", 1)
v.SetDefault("image_gen.steps", 30)
v.SetDefault("image_gen.cfg_scale", 7.0)
v.SetDefault("gpt_image2.base_url", "https://www.yuntts.com/api/v1")
v.SetDefault("gpt_image2.api_key", "")
v.SetDefault("gpt_image2.aspect_ratio", "1:1")
v.SetDefault("gpt_image2.x_channel", "default")
v.SetDefault("gpt_image2.poll_max_wait", 120)
v.SetDefault("gpt_image2.poll_interval", 3)
}
func bindEnvVars(v *viper.Viper) {
@@ -135,4 +153,11 @@ func bindEnvVars(v *viper.Viper) {
v.BindEnv("image_gen.num_images", "GEN2D_IMAGE_NUM_IMAGES")
v.BindEnv("image_gen.steps", "GEN2D_IMAGE_STEPS")
v.BindEnv("image_gen.cfg_scale", "GEN2D_IMAGE_CFG_SCALE")
v.BindEnv("gpt_image2.base_url", "GEN2D_GPT_IMAGE2_BASE_URL")
v.BindEnv("gpt_image2.api_key", "GEN2D_GPT_IMAGE2_API_KEY")
v.BindEnv("gpt_image2.aspect_ratio", "GEN2D_GPT_IMAGE2_ASPECT_RATIO")
v.BindEnv("gpt_image2.x_channel", "GEN2D_GPT_IMAGE2_X_CHANNEL")
v.BindEnv("gpt_image2.poll_max_wait", "GEN2D_GPT_IMAGE2_POLL_MAX_WAIT")
v.BindEnv("gpt_image2.poll_interval", "GEN2D_GPT_IMAGE2_POLL_INTERVAL")
}