本文回答什么问题:nanobot 怎么支持图像生成?怎么支持音频转录?多模态 Provider 怎么注册?和 LLM Provider 什么关系?
目标读者 :想加多模态能力的开发者
预计阅读时间 :10 分钟
源码版本 :GitHub HKUDS/nanobot main 分支主线代码(仓库相对路径)
nanobot 把"图像生成"和"音频转录"独立成 2 个 Provider 接口,与 LLM Provider 并列。本章聚焦这两个独立接口的设计。
1. 整体定位:为什么多模态独立
LLM Provider 接口(chat(messages, tools))只能输出文本。但 LLM Tool 可能需要:
- 生成图像(image tool 调用)
- 转录音频(audio tool 处理附件)
如果把多模态塞进 chat(),LLMProvider 抽象就膨胀。独立接口保持 LLMProvider 简洁,多模态各管各。
核心要点速查(建议收藏)
- 核心文件 :
nanobot/providers/image_generation.py(约 200 行)+nanobot/audio/transcription.py(约 150 行) - 2 个独立接口 :
ImageGenerator.generate(prompt, ...)/Transcriber.transcribe(audio_path, ...) - 图像后端 11 个(DALL-E / SD / Imagen / 等)
- 音频后端 6 个(Whisper / Deepgram / Google / 等)
- 与 LLM 关系 Tool 调用 image / audio,内部走注册表
2. ImageGenerator 接口
python
# nanobot/providers/image_generation.py L20-L80
from abc import ABC, abstractmethod
class ImageGenerator(ABC):
@abstractmethod
async def generate(
self,
prompt: str,
*,
size: str = "1024x1024",
n: int = 1,
model: str | None = None,
) -> list[ImageResult]:
"""生成图像。返回 URL 或 base64。"""
@dataclass
class ImageResult:
url: str # https://... 或 base64://...
revised_prompt: str # DALL-E 3 自动改写后的 prompt
model: str
11 个内置后端(L82-L130):
| 后端 | 模型 | 适用 |
|---|---|---|
OpenAIImage |
DALL-E 2/3 | OpenAI 通用 |
StabilityAI |
SDXL / SD3 | 自托管友好 |
Replicate |
任意 SD 模型 | 多模型聚合 |
BlackForestLabs |
FLUX | 高质量 |
Together |
多模型 | 便宜 |
Fireworks |
多模型 | 快 |
LeptonAI |
多模型 | 自托管 |
AzureDALLE |
DALL-E | Azure 部署 |
BedrockStable |
SDXL | AWS |
VertexImagen |
Imagen | GCP |
Unconfigured |
占位 | 未配置 |
3. Transcriber 接口
python
# nanobot/audio/transcription.py L20-L60
class Transcriber(ABC):
@abstractmethod
async def transcribe(
self,
audio_path: Path | bytes,
*,
language: str = "auto",
model: str | None = None,
) -> TranscriptResult:
"""转录音频。返回文本 + 时间戳。"""
@dataclass
class TranscriptResult:
text: str
segments: list[Segment] # [{start, end, text}]
language: str
model: str
6 个内置后端:
| 后端 | 模型 | 适用 |
|---|---|---|
OpenAIWhisper |
whisper-1 | 通用 |
Deepgram |
nova-2 | 实时流 |
GoogleSpeech |
Chirp | 多语种 |
AzureSpeech |
多模型 | Azure |
BedrockWhisper |
whisper | AWS |
LocalWhisper |
whisper.cpp | 本地 |
4. 注册表(类似 LLM Provider)
python
IMAGE_GENERATORS = {
"openai": OpenAIImage,
"stability": StabilityAI,
"replicate": Replicate,
# ...
}
TRANSCRIBERS = {
"openai_whisper": OpenAIWhisper,
"deepgram": Deepgram,
# ...
}
与 LLM Provider 共用 ProviderSpec 模式(详见第 18 章)。
5. Tool 怎么调用
python
# nanobot/agent/tools/image.py
class ImageGenTool(Tool):
async def execute(self, *, prompt: str, n: int = 1) -> ToolResult:
generator = self._registry.get("image", self._spec.image_backend)
results = await generator.generate(prompt=prompt, n=n)
# 返回 markdown 嵌入图像
return ToolResult(content=f"")
python
# nanobot/agent/tools/audio.py
class AudioTool(Tool):
async def execute(self, *, audio_path: str) -> ToolResult:
transcriber = self._registry.get("transcription", self._spec.audio_backend)
result = await transcriber.transcribe(audio_path)
return ToolResult(content=result.text)
6. 实战:启用多模态
yaml
# config.yaml
imageBackend: openai
transcriptionBackend: openai_whisper
providers:
openai:
apiKey: "sk-..."
bash
# LLM 自动用 image 工具生成图像
nanobot chat --text="生成一张日落海滩的图像"
7. 实战:加自定义后端
python
# nanobot/providers/my_image.py
from nanobot.providers.image_generation import ImageGenerator, ImageResult
class MyImageGenerator(ImageGenerator):
async def generate(self, prompt, *, size="1024x1024", n=1, model=None):
# 调你自己的 SDK
return [ImageResult(url="https: # ...", revised_prompt=prompt, model="my-model")]
# 注册
IMAGE_GENERATORS["my"] = MyImageGenerator
8. 4 个常见误区
误区 1 · 多模态会消耗很多 token?
A :图像通常不算 token(输出独立)。但有些 LLM(Claude / GPT-4V)接收图像作为输入时算 token。
误区 2 · DALL-E 3 输出 URL 过期?
A:------DALL-E URL 1 小时过期。要永久保存需下载到本地。
误区 3 · Whisper 支持中文吗?
A 😦whisper-1 自动识别 99 种语言)。但中文用 language="zh" 提高准确率。
误区 4 · 图像生成能调多次吗?
A :n=4 生成 4 张。但 LLM Tool 调用默认 n=1(避免生成多张浪费)。
9. 小结
- 2 个独立接口 ImageGenerator / Transcriber
- 11 图像后端 + 6 转录后端 内置
- Tool 调用 image / audio tool
- 自定义 注册新后端
本文要点速查
- 2 个独立接口 见 §2-3
- 后端清单 见 §2 + §3
- Tool 怎么调 见 §5
- 下一步:第 22 章《BaseChannel 抽象》------ 跳出 LLM Provider,看聊天通道
按角色推荐
- 聊天通道开发者:选读(知道多模态后端)
- LLM Agent 开发者:选读(知道 image / audio tool)
- 系统架构师:选读
- Tool / MCP 工具开发者:必读(自定义图像 / 音频工具必读)
- LLM Provider 适配者:选读
下一步
- 第 22 章《BaseChannel 抽象与 ChannelManager》 ------ 17 通道的统一契约(主题群"聊天通道",第 4 周)
tags :#nanobot #AI Agent #LLM #Python #源码解析 #多模态 #图像生成 #音频转录