Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added
- **Requesty Image Provider**: Dedicated OpenAI-compatible image generation provider (aliases `requesty` / `rq`)
- Base URL `https://router.requesty.ai/v1`, `/chat/completions` endpoint returning an image URL
- Verified image models: `google/gemini-3.1-flash-image-preview` (default), `vertex/gemini-2.5-flash-image`
- Configuration: `image_provider: requesty`
- New files: `internal/image/requesty.go`, `internal/image/requesty_test.go`
- Updated: `internal/image/provider.go`, `internal/config/config.go`, and provider docs

## [2.9.0] - 2026-06-26

### Added
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ md2wechat generate_cover --article article.md
md2wechat generate_infographic --article article.md --preset infographic-comparison
```

支持 Volcengine、ModelScope、OpenRouter、OpenAI、Gemini 等服务。配置见 [docs/IMAGE_PROVISIONERS.md](docs/IMAGE_PROVISIONERS.md)。
支持 Volcengine、ModelScope、OpenRouter、Requesty、OpenAI、Gemini 等服务。配置见 [docs/IMAGE_PROVISIONERS.md](docs/IMAGE_PROVISIONERS.md)。

使用宿主 Agent 的 Image Gen:

Expand Down
1 change: 1 addition & 0 deletions docs/AGENT-GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ md2wechat providers list --json
- `tuzi` — 图子 AI
- `modelscope` / `ms` — ModelScope
- `openrouter` / `or` — OpenRouter
- `requesty` / `rq` — Requesty
- `gemini` / `google` — Google Gemini
- `volcengine` / `volc` — 火山引擎

Expand Down
2 changes: 1 addition & 1 deletion docs/CONFIG.md
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ image:
| `api.image_model` | 否 | 图片模型 | `gpt-image-2` |
| `api.image_size` | 否 | 默认图片执行尺寸/宽高比 | 跟随当前 provider,例如 `openai=auto`、`volcengine=2K` |

当前内置 provider:`openai`、`tuzi`、`modelscope` (`ms`)、`openrouter` (`or`)、`gemini` (`google`)、`volcengine` (`volc`)。
当前内置 provider:`openai`、`tuzi`、`modelscope` (`ms`)、`openrouter` (`or`)、`requesty` (`rq`)、`gemini` (`google`)、`volcengine` (`volc`)。

### 图片处理配置

Expand Down
1 change: 1 addition & 0 deletions docs/DISCOVERY.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ md2wechat providers show volcengine --json
- `tuzi`
- `modelscope` / `ms`
- `openrouter` / `or`
- `requesty` / `rq`
- `gemini` / `google`
- `volcengine` / `volc`

Expand Down
55 changes: 53 additions & 2 deletions docs/IMAGE_PROVISIONERS.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ md2wechat 支持多种图片生成服务,可以在 Markdown 中使用 AI 生

```yaml
api:
# 图片服务提供者: openai, tuzi, modelscope, openrouter, gemini, volcengine
# 图片服务提供者: openai, tuzi, modelscope, openrouter, requesty, gemini, volcengine
image_provider: "tuzi"

# API 配置
Expand Down Expand Up @@ -362,6 +362,57 @@ OpenRouter 支持三种分辨率等级(通过尺寸自动判断):

---

### Requesty

Requesty 提供统一的 OpenAI 兼容 API 接口,支持多种图片生成模型。

#### 配置示例

```yaml
api:
image_provider: "requesty"
image_key: "sk-..."
# image_base_url 可选,默认为 https://router.requesty.ai/v1
image_model: "google/gemini-3.1-flash-image-preview"
image_size: "16:9" # 支持比例格式或 WIDTHxHEIGHT
```

或使用环境变量:

```bash
export IMAGE_PROVIDER="requesty"
export IMAGE_API_KEY="sk-..."
export IMAGE_MODEL="google/gemini-3.1-flash-image-preview"
export IMAGE_SIZE="16:9"
```

#### 支持的模型

| 模型 | 说明 |
|------|------|
| `google/gemini-3.1-flash-image-preview` | Gemini 3.1 Flash(默认,推荐)|
| `vertex/gemini-2.5-flash-image` | Gemini 2.5 Flash |

#### 支持的尺寸

Requesty 支持两种尺寸配置方式(与 OpenRouter 一致),可在配置文件中设置 `image_size`,也可通过命令行 `--size` 参数覆盖。宽高比与 WIDTHxHEIGHT 映射规则同上文 OpenRouter 一节。

#### 分辨率等级

Requesty 支持三种分辨率等级(通过尺寸自动判断):

| 等级 | 说明 |
|------|------|
| 1K | 标准分辨率 |
| 2K | 较高分辨率(默认)|
| 4K | 最高分辨率 |

#### 获取 API Key

前往 [Requesty](https://requesty.ai) 注册并获取 API Key。

---

### Google Gemini

直接调用 Google Gemini API,使用官方 Go SDK,无需通过第三方平台。
Expand Down Expand Up @@ -500,7 +551,7 @@ md2wechat convert article.md --preview
### Q: 提示 "参数配置有误" 怎么办?

**A:** 请检查:
1. `image_provider` 是否为 `openai`、`tuzi`、`modelscope`、`openrouter`、`gemini` 或 `volcengine`
1. `image_provider` 是否为 `openai`、`tuzi`、`modelscope`、`openrouter`、`requesty`、`gemini` 或 `volcengine`
2. `image_model` 是否在支持的模型列表中
3. `image_size` 是否在支持的尺寸列表中
4. **ModelScope 只支持 `WIDTHxHEIGHT`**
Expand Down
10 changes: 10 additions & 0 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,16 @@ func applyImageProviderDefaults(cfg *Config) {
if cfg.ImageSize == "" {
cfg.ImageSize = "1:1"
}
case "requesty", "rq":
if cfg.ImageAPIBase == "" {
cfg.ImageAPIBase = "https://router.requesty.ai/v1"
}
if cfg.ImageModel == "" {
cfg.ImageModel = "google/gemini-3.1-flash-image-preview"
}
if cfg.ImageSize == "" {
cfg.ImageSize = "1:1"
}
case "gemini", "google":
if cfg.ImageModel == "" {
cfg.ImageModel = "gemini-3.1-flash-image-preview"
Expand Down
34 changes: 33 additions & 1 deletion internal/image/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,20 @@ var providerRegistry = []ProviderMeta{
},
SupportsSize: true,
},
{
Name: "requesty",
Aliases: []string{"rq"},
Description: "Requesty image generation provider",
RequiredConfig: []string{"IMAGE_API_KEY"},
OptionalConfig: []string{"IMAGE_API_BASE", "IMAGE_MODEL", "IMAGE_SIZE"},
DefaultBaseURL: "https://router.requesty.ai/v1",
DefaultModel: "google/gemini-3.1-flash-image-preview",
SupportedModels: []ProviderModelMeta{
{Name: "google/gemini-3.1-flash-image-preview", Description: "Gemini 3.1 Flash image via Requesty", Default: true},
{Name: "vertex/gemini-2.5-flash-image", Description: "Gemini 2.5 Flash image via Requesty"},
},
SupportsSize: true,
},
{
Name: "gemini",
Aliases: []string{"google"},
Expand Down Expand Up @@ -252,6 +266,11 @@ func NewProvider(cfg *config.Config) (Provider, error) {
return nil, err
}
return NewOpenRouterProvider(cfg)
case "requesty", "rq":
if err := validateRequestyConfig(cfg); err != nil {
return nil, err
}
return NewRequestyProvider(cfg)
case "gemini", "google":
if err := validateGeminiConfig(cfg); err != nil {
return nil, err
Expand All @@ -271,7 +290,7 @@ func NewProvider(cfg *config.Config) (Provider, error) {
return nil, &config.ConfigError{
Field: "ImageProvider",
Message: fmt.Sprintf("未知的图片服务提供者: %s", cfg.ImageProvider),
Hint: "支持的提供者: openai, tuzi, modelscope (或 ms), openrouter (或 or), gemini (或 google), volcengine (或 volc)",
Hint: "支持的提供者: openai, tuzi, modelscope (或 ms), openrouter (或 or), requesty (或 rq), gemini (或 google), volcengine (或 volc)",
}
}
}
Expand Down Expand Up @@ -340,6 +359,19 @@ func validateOpenRouterConfig(cfg *config.Config) error {
return nil
}

// validateRequestyConfig 验证 Requesty 配置
func validateRequestyConfig(cfg *config.Config) error {
if cfg.ImageAPIKey == "" {
return &config.ConfigError{
Field: "ImageAPIKey",
Message: "使用 Requesty 图片服务需要配置 API Key",
Hint: "在配置文件中设置 api.image_key 或环境变量 IMAGE_API_KEY,前往 requesty.ai 获取",
}
}
// Requesty API Base 有默认值,可以为空
return nil
}

// validateGeminiConfig 验证 Google Gemini 配置
func validateGeminiConfig(cfg *config.Config) error {
if cfg.ImageAPIKey == "" {
Expand Down
Loading