feat(ai_image): base_url 设置项支持自定义 OpenAI 兼容网关 v1.1.0

generateOpenAI 支持配置 base_url 指向 OpenAI 兼容网关(如本机
llmsproxy),为空保持官方直连。已实测经 llmsproxy→siliconflow
(Kwai-Kolors/Kolors) 生图出有效 PNG。
This commit is contained in:
JianFeeeee
2026-08-26 19:47:01 +08:00
parent 6184736fd4
commit cd1984e26e
2 changed files with 25 additions and 5 deletions

View File

@ -2,11 +2,16 @@
"name": "ai_image", "name": "ai_image",
"name_zh": "AI绘图", "name_zh": "AI绘图",
"name_en": "AI Image", "name_en": "AI Image",
"version": "1.0.0", "version": "1.1.0",
"description": "AI 图像生成插件,支持 OpenAI DALL·E / Stable Diffusion", "description": "AI 图像生成插件,支持 OpenAI DALL·E / Stable Diffusion",
"author": "HomeAgent", "author": "HomeAgent",
"entry": "plugin.so", "entry": "plugin.so",
"tags": ["ai", "image", "draw", "generate"], "tags": [
"ai",
"image",
"draw",
"generate"
],
"targets": "linux/amd64", "targets": "linux/amd64",
"outdir": "dist", "outdir": "dist",
"bundle": true, "bundle": true,

View File

@ -21,6 +21,7 @@ type Plugin struct {
provider string provider string
model string model string
size string size string
baseURL string
} }
func NewPluginFactory(name string, config map[string]interface{}) (sdk.Plugin, error) { func NewPluginFactory(name string, config map[string]interface{}) (sdk.Plugin, error) {
@ -111,6 +112,11 @@ func (p *Plugin) Start(s *sdk.PluginSDK) error {
DisplayName: "API Key", Description: "OpenAI / Stable Diffusion API Key", DisplayName: "API Key", Description: "OpenAI / Stable Diffusion API Key",
Category: "ai_image", Secret: true, Category: "ai_image", Secret: true,
}) })
s.Settings().RegisterDef(sdk.ConfigDef{
Key: "base_url", Default: "", Type: "string",
DisplayName: "Base URL", Description: "自定义 OpenAI 兼容网关地址(不带 /v1 尾缀,如 http://127.0.0.1:8081为空走官方 https://api.openai.com",
Category: "ai_image",
})
s.Settings().RegisterDef(sdk.ConfigDef{ s.Settings().RegisterDef(sdk.ConfigDef{
Key: "provider", Default: "openai", Type: "string", Key: "provider", Default: "openai", Type: "string",
DisplayName: "Provider", Description: "Image generation provider: openai / stability", DisplayName: "Provider", Description: "Image generation provider: openai / stability",
@ -131,6 +137,7 @@ func (p *Plugin) Start(s *sdk.PluginSDK) error {
p.provider = getSetting(s.Settings(), "provider", "openai") p.provider = getSetting(s.Settings(), "provider", "openai")
p.model = getSetting(s.Settings(), "model", "dall-e-3") p.model = getSetting(s.Settings(), "model", "dall-e-3")
p.size = getSetting(s.Settings(), "size", "1024x1024") p.size = getSetting(s.Settings(), "size", "1024x1024")
p.baseURL = strings.TrimRight(strings.TrimSpace(getSetting(s.Settings(), "base_url", "")), "/")
tp := p.name + "_" tp := p.name + "_"
s.RegisterTool(tp+"generate", sdk.ToolDef{ s.RegisterTool(tp+"generate", sdk.ToolDef{
@ -209,6 +216,14 @@ func (p *Plugin) handleGenerate(args map[string]interface{}) (interface{}, error
} }
func (p *Plugin) generateOpenAI(prompt, model, size string, n int, apiKey string) (interface{}, error) { func (p *Plugin) generateOpenAI(prompt, model, size string, n int, apiKey string) (interface{}, error) {
// 上游地址base_url 非空时走自定义网关(如本机 llmsproxy约定不带 /v1 尾缀;
// 为空保持官方直连。兼容误配了 /v1 尾缀的情况(去重)。
endpoint := "https://api.openai.com/v1/images/generations"
if p.baseURL != "" {
base := strings.TrimSuffix(p.baseURL, "/v1")
endpoint = base + "/v1/images/generations"
}
body := openAIReq{ body := openAIReq{
Model: model, Model: model,
Prompt: prompt, Prompt: prompt,
@ -218,7 +233,7 @@ func (p *Plugin) generateOpenAI(prompt, model, size string, n int, apiKey string
} }
b, _ := json.Marshal(body) b, _ := json.Marshal(body)
req, _ := http.NewRequest("POST", "https://api.openai.com/v1/images/generations", bytes.NewReader(b)) req, _ := http.NewRequest("POST", endpoint, bytes.NewReader(b))
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+apiKey) req.Header.Set("Authorization", "Bearer "+apiKey)