multimodal.md 2.7 KB

多模态支持

多模态消息(文本 + 图片)支持,遵循 OpenAI API 规范。


架构层次

Prompt 层 (SimplePrompt) → OpenAI 格式消息 → Provider 层适配 → 模型 API

关键原则

  • 遵循 OpenAI API 消息格式规范
  • 模型适配封装在 Provider 层
  • 应用层通过 Prompt 层统一处理

核心实现

1. Prompt 层多模态支持

实现位置agent/llm/prompts/wrapper.py:SimplePrompt

功能:构建 OpenAI 格式的多模态消息

# 使用示例
prompt = SimplePrompt("task.prompt")
messages = prompt.build_messages(
    text="内容",
    images="path/to/image.png"  # 或 images=["img1.png", "img2.png"]
)

关键方法

  • build_messages(**context) - 构建消息列表,支持 images 参数
  • _build_image_content(image) - 将图片路径转为 OpenAI 格式(data URL)

消息格式(OpenAI 规范):

[
  {"role": "system", "content": "系统提示"},
  {
    "role": "user",
    "content": [
      {"type": "text", "text": "..."},
      {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}
    ]
  }
]

2. Gemini Provider 适配

实现位置agent/llm/gemini.py:_convert_messages_to_gemini

功能:将 OpenAI 多模态格式转换为 Gemini 格式

转换规则

  • 检测 content 是否为数组(多模态标志)
  • {"type": "text"} → Gemini {"text": "..."}
  • {"type": "image_url"} → Gemini {"inline_data": {"mime_type": "...", "data": "..."}}

关键逻辑

# 处理多模态消息
if isinstance(content, list):
    parts = []
    for item in content:
        if item.get("type") == "text":
            parts.append({"text": item.get("text")})
        elif item.get("type") == "image_url":
            # 解析 data URL 并转换
            mime_type, base64_data = parse_data_url(url)
            parts.append({"inline_data": {"mime_type": mime_type, "data": base64_data}})

使用方式

.prompt 文件

标准 .prompt 文件格式:

---
model: gemini-2.5-flash
temperature: 0.3
---

$system$
系统提示...

$user$
用户提示:%text%

应用层调用

参考示例examples/feature_extract/run.py

# 1. 加载 prompt
prompt = SimplePrompt("task.prompt")

# 2. 构建消息(自动处理图片)
messages = prompt.build_messages(text="...", images="img.png")

# 3. 调用 Agent
runner = AgentRunner(llm_call=create_gemini_llm_call())
result = await runner.call(messages=messages, model="gemini-2.5-flash")

扩展支持

当前支持

  • 图片格式:PNG, JPEG, GIF, WebP
  • 输入方式:文件路径或 base64 data URL

未来扩展

  • 音频、视频等其他模态
  • 资源缓存和异步加载