Skip to content
Merged
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
21 changes: 14 additions & 7 deletions Docs/Bot_Commands_User_Guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,13 @@
* **示例**: `设置模型 gpt-4-turbo`
* **权限**: 普通管理员或全局管理员。

* **设置当前聊天使用的生图模型**
* **指令格式**: `设置生图模型 <模型名称>`
* **功能**: 为当前聊天(群组或私聊)设置 `generate_image` 默认使用的图片生成模型;未设置时使用全局默认生图模型。
* **示例**: `设置生图模型 gpt-image-2`,或 `设置生图模型 image-01`
* **权限**: 普通管理员或全局管理员。
* **相关指令**: `选择生图模型` 显示可用生图模型并通过编号选择,`生图模型` / `查看生图模型` 查看当前生图模型,`清除生图模型` 恢复使用全局默认。

### 2. 全局管理员指令

以下指令仅限机器人全局管理员(在 `Env.cs` 中配置的 `AdminId`)使用。
Expand Down Expand Up @@ -195,11 +202,11 @@
2. 机器人回复: `生图工具已开启...`
3. 管理员发送: `关闭生图工具`
4. 机器人回复: `生图工具已关闭,并会从 LLM 工具提示词中隐藏。`
5. 管理员发送: `设置生图模型`
6. 机器人回复: `请输入生图使用的模型名称...`
7. 管理员发送: `gpt-image-2`
8. 机器人回复: `生图模型已设置为: gpt-image-2...`
* **说明**: 生图工具使用内置工具 `generate_image`,默认模型为 `gpt-image-2`。API 地址和 API Key 不在工具参数中填写,而是来自该模型关联的 LLM 渠道;因此可通过 `新建渠道` / `编辑渠道` 自定义 OpenAI-compatible API 地址,例如 `https://api.openai.com/v1` 或自建兼容网关。
5. 管理员发送: `设置默认生图模型`
6. 机器人回复: `请输入没有群级配置时使用的默认生图模型名称...`
7. 管理员发送: `gpt-image-2`,或 MiniMax 的 `image-01` / `image-01-live`
8. 机器人回复: `默认生图模型已设置为: gpt-image-2...`
* **说明**: 生图工具使用内置工具 `generate_image`,默认优先使用当前群通过 `设置生图模型 <模型名>` 或 `选择生图模型` 配置的模型;群内未配置时使用全局默认 `gpt-image-2`。OpenAI-compatible 模型调用 `/v1/images/generations`;MiniMax `image-01` / `image-01-live` 调用 `/v1/image_generation`。API 地址和 API Key 不在工具参数中填写,而是来自该模型关联的 LLM 渠道;因此可通过 `新建渠道` / `编辑渠道` 自定义 API 地址,例如 `https://api.openai.com/v1`、`https://api.minimaxi.com` 或自建兼容网关。
* **指令**: `新建渠道`
* **功能**: 开始创建新的LLM(大语言模型)API渠道的流程,包括名称、网关地址、API类型 (OpenAI/Ollama)、API Key、最大并行数和优先级。
* **指令**: `编辑渠道`
Expand All @@ -220,8 +227,8 @@
* **功能**: 设置用于图片分析的LLM模型名称。此过程会询问模型名称。
* **指令**: `开启生图工具` / `关闭生图工具` / `生图工具状态`
* **功能**: 开启、关闭或查看 LLM 生图内置工具。关闭后工具不会注入到 LLM 工具提示词或 native tool definitions 中。
* **指令**: `设置生图模型`
* **功能**: 设置生图工具默认使用的模型名称,默认 `gpt-image-2`。需要将该模型通过 `添加模型` 关联到一个带自定义 API 地址的 LLM 渠道。
* **指令**: `设置默认生图模型`
* **功能**: 设置没有群级生图模型配置时使用的全局默认模型,内置默认 `gpt-image-2`;MiniMax 可用 `image-01` / `image-01-live`。需要将该模型通过 `添加模型` 关联到一个带自定义 API 地址的 LLM 渠道。

* **MCP服务器管理** (在群组中由全局管理员发送,会触发交互式配置流程)
* **说明**: 以下指令用于管理MCP (Model Context Protocol) 服务器。它们会启动一个多步骤的对话流程(状态机),机器人会依次询问配置所需的各项信息。请按照机器人的提示逐步回复。
Expand Down
11 changes: 8 additions & 3 deletions Docs/README_MCP.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,20 @@ TelegramSearchBot 内置了以下工具,通过 `BuiltInToolAttribute` 标记

| 工具名称 | 描述 | 参数 |
|---------|------|------|
| `generate_image` | 通过 OpenAI-compatible Image API 生成图片,默认模型 `gpt-image-2`,保存到本地并可直接发送到当前聊天 | `prompt`, `model?`, `size?`, `quality?`, `output_format?`, `background?`, `moderation?`, `count?`, `send_to_chat?`, `caption?`, `reply_to_message_id?`, `timeout_seconds?` |
| `generate_image` | 通过配置的图片 API 生成图片,默认使用当前群的生图模型;未配置时使用全局默认 `gpt-image-2`;OpenAI-compatible 模型走 `/v1/images/generations`,MiniMax `image-01` / `image-01-live` 走 `/v1/image_generation`;图片保存到本地并可直接发送到当前聊天 | `prompt`, `model?`, `size?`, `quality?`, `output_format?`, `background?`, `moderation?`, `aspect_ratio?`, `minimax_response_format?`, `seed?`, `prompt_optimizer?`, `aigc_watermark?`, `style_type?`, `style_weight?`, `count?`, `send_to_chat?`, `caption?`, `reply_to_message_id?`, `timeout_seconds?` |

管理员命令:
- `开启生图工具`:允许 `generate_image` 注入到 LLM 工具提示词和 native tool definitions。
- `关闭生图工具`:隐藏 `generate_image`,关闭后 LLM 不会看到该工具。
- `生图工具状态`:查看开关状态和默认生图模型。
- `设置生图模型`:设置默认生图模型,默认 `gpt-image-2`。
- `设置默认生图模型`:设置无群级配置时使用的全局默认生图模型,内置默认 `gpt-image-2`;MiniMax 可设置为 `image-01` 或 `image-01-live`。
- 群内普通管理员可发送 `选择生图模型` 从已识别的图片生成模型里按编号选择,也可用 `设置生图模型 <模型名>` 直接设置当前群的生图模型,或用 `清除生图模型` 恢复使用全局默认。

API 地址和 API Key 来自该模型关联的 LLM 渠道,因此可通过 `新建渠道` / `编辑渠道` 自定义 OpenAI-compatible 网关地址,例如 `https://api.openai.com/v1`。
生图模型识别优先使用模型能力 `image_generation` / `text_to_image`;没有能力数据时,会按常见模型名兜底识别 `gpt-image-*`、`dall-e*`、MiniMax `image-01` / `image-01-live`、`imagen`、`flux`、`stable-diffusion`、`sdxl` 等名称。

API 地址和 API Key 来自该模型关联的 LLM 渠道,因此可通过 `新建渠道` / `编辑渠道` 自定义网关地址,例如 `https://api.openai.com/v1` 或 `https://api.minimaxi.com`。配置 MiniMax 时,渠道类型建议选择 `MiniMax`,再通过 `添加模型` 关联 `image-01` / `image-01-live`。

MiniMax 不支持选择输出文件格式;`output_format` 仅用于 OpenAI-compatible 图片接口。MiniMax 的 URL 响应会按实际 Content-Type 或 URL 扩展名保存,base64 响应默认按 PNG 保存。

**文件大小限制**:
- 本地 Bot API(内置或外部): 最大 2GB
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
- Anthropic Claude API
- 可配置多模型通道管理
- **MCP (Model Context Protocol) 工具支持**
- **GPT Image 生图工具**: 内置 `generate_image`,默认 `gpt-image-2`,API 地址可通过 LLM 渠道自定义
- **生图工具**: 内置 `generate_image`,按当前群配置选择生图模型,未配置时默认 `gpt-image-2`,支持 OpenAI-compatible Image API 与 MiniMax `image-01` / `image-01-live`,API 地址可通过 LLM 渠道自定义
5. 高级功能:
- 短链接映射服务
- 消息扩展存储
Expand Down Expand Up @@ -160,7 +160,7 @@
## MCP (Model Context Protocol) 支持
通过MCP协议扩展机器人能力,支持外部工具服务器:
- ✅ **内置工具**: 发送文件、搜索、URL处理等24+内置工具
- ✅ **内置生图**: 管理员可用 `开启生图工具` / `关闭生图工具` 控制是否向 LLM 注入 `generate_image`,默认模型 `gpt-image-2`
- ✅ **内置生图**: 管理员可用 `开启生图工具` / `关闭生图工具` 控制是否向 LLM 注入 `generate_image`,群内可用 `选择生图模型` 或 `设置生图模型 <模型名>` 配置当前群生图模型,未配置时使用全局默认 `gpt-image-2`
- ✅ **外部MCP服务器**: 可动态添加第三方MCP服务器
- ✅ **管理员管理**: 通过指令管理MCP服务器(`新建渠道`等)

Expand Down
21 changes: 21 additions & 0 deletions TelegramSearchBot.Common/Model/AI/ModelWithCapabilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ public class ModelWithCapabilities {
/// </summary>
public bool SupportsEmbedding => GetCapabilityBool("embedding") || GetCapabilityBool("text_embedding");

/// <summary>
/// 是否是图片生成模型
/// </summary>
public bool SupportsImageGeneration => GetCapabilityBool("image_generation") || GetCapabilityBool("text_to_image") || IsKnownImageGenerationModelName(ModelName);

/// <summary>
/// 获取布尔类型的能力值
/// </summary>
Expand Down Expand Up @@ -74,5 +79,21 @@ public void SetCapability(string capabilityName, string value) {
public void SetCapability(string capabilityName, bool value) {
Capabilities[capabilityName] = value.ToString().ToLower();
}

public static bool IsKnownImageGenerationModelName(string modelName) {
if (string.IsNullOrWhiteSpace(modelName)) {
return false;
}

var lowerName = modelName.Trim().ToLowerInvariant();
return lowerName.Contains("gpt-image") ||
lowerName.Contains("dall-e") ||
lowerName.Equals("image-01") ||
lowerName.Equals("image-01-live") ||
lowerName.Contains("imagen") ||
lowerName.Contains("flux") ||
lowerName.Contains("stable-diffusion") ||
lowerName.Contains("sdxl");
}
}
}
Loading
Loading