> ## Documentation Index
> Fetch the complete documentation index at: https://quwan-b8010aef.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Claude 多模态对话示例

> 使用Claude进行图片理解和多模态对话的完整示例代码

# Claude 多模态对话示例

以下示例展示如何使用Claude的多模态功能，让AI理解和分析图片内容，进行图文结合的智能对话。

## 快速开始

只需要替换 `<API-KEY>` 为你的实际API密钥即可运行。

```bash cURL theme={null}
curl -X POST "https://api.tokenops.ai/v1/messages" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API-KEY>" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-3-7-sonnet-20250219",
    "max_tokens": 1024,
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": "这张图片里有什么？请详细描述一下。"
          },
          {
            "type": "image",
            "source": {
              "type": "base64",
              "media_type": "image/jpeg",
              "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="
            }
          }
        ]
      }
    ]
  }'
```

```python Python theme={null}
import requests
import base64
import json
from PIL import Image
import io

# 配置API密钥和基础URL
API_KEY = "<API-KEY>"
BASE_URL = "https://api.tokenops.ai/v1"

def encode_image_to_base64(image_path):
    """将本地图片编码为base64格式"""
    try:
        with open(image_path, "rb") as image_file:
            return base64.b64encode(image_file.read()).decode('utf-8')
    except Exception as e:
        raise Exception(f"图片编码失败: {e}")

def get_image_media_type(image_path):
    """获取图片的MIME类型"""
    extension = image_path.lower().split('.')[-1]
    media_types = {
        'jpg': 'image/jpeg',
        'jpeg': 'image/jpeg',
        'png': 'image/png',
        'gif': 'image/gif',
        'webp': 'image/webp'
    }
    return media_types.get(extension, 'image/jpeg')

def claude_vision_chat(text_prompt, image_path=None, image_base64=None, media_type=None):
    """
    与Claude进行多模态对话

    Args:
        text_prompt: 文本提示
        image_path: 本地图片路径
        image_base64: base64编码的图片数据
        media_type: 图片MIME类型
    """
    url = f"{BASE_URL}/messages"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {API_KEY}",
        "anthropic-version": "2023-06-01"
    }

    # 构建消息内容
    content = [
        {
            "type": "text",
            "text": text_prompt
        }
    ]

    # 添加图片内容
    if image_path:
        image_base64 = encode_image_to_base64(image_path)
        media_type = get_image_media_type(image_path)

    if image_base64:
        if not media_type:
            media_type = "image/jpeg"

        content.append({
            "type": "image",
            "source": {
                "type": "base64",
                "media_type": media_type,
                "data": image_base64
            }
        })

    data = {
        "model": "claude-3-7-sonnet-20250219",
        "max_tokens": 1024,
        "messages": [
            {
                "role": "user",
                "content": content
            }
        ]
    }

    try:
        response = requests.post(url, headers=headers, json=data)

        if response.status_code == 200:
            result = response.json()
            return result['content'][0]['text']
        else:
            return f"错误: {response.status_code} - {response.text}"

    except Exception as e:
        return f"请求失败: {e}"

def analyze_image_content(image_path):
    """分析图片内容的详细信息"""
    prompt = """请详细分析这张图片，包括：

1. **主要内容**: 图片中的主要对象和场景
2. **视觉元素**: 颜色、构图、光影等
3. **背景环境**: 场景设置和环境特点
4. **人物/对象**: 如果有人物或特殊对象，请描述其特征
5. **情感氛围**: 图片传达的情感或氛围
6. **技术特点**: 拍摄角度、风格等

请用中文回答，内容要详细且有条理。"""

    return claude_vision_chat(prompt, image_path=image_path)

def extract_text_from_image(image_path):
    """从图片中提取文字内容 (OCR)"""
    prompt = """请仔细观察这张图片，提取其中的所有文字内容。

要求：
1. 按从上到下、从左到右的顺序提取文字
2. 保持原有的格式和结构
3. 如果是表格，请用表格格式整理
4. 如果有多种语言，请分别标注语言类型
5. 如果文字不清晰，请标注"模糊"或"不清晰"

请直接输出提取到的文字内容。"""

    return claude_vision_chat(prompt, image_path=image_path)

def compare_images(image1_path, image2_path):
    """比较两张图片的异同"""
    # 读取两张图片
    image1_base64 = encode_image_to_base64(image1_path)
    image2_base64 = encode_image_to_base64(image2_path)

    url = f"{BASE_URL}/messages"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {API_KEY}",
        "anthropic-version": "2023-06-01"
    }

    content = [
        {
            "type": "text",
            "text": """请比较这两张图片，分析它们的相似点和不同点：

**比较维度：**
1. **内容对比**: 主要对象和场景的异同
2. **构图对比**: 布局、角度、比例的差异
3. **色彩对比**: 颜色搭配、明暗对比的区别
4. **风格对比**: 拍摄风格、处理效果的不同
5. **质量对比**: 清晰度、分辨率等技术指标
6. **用途建议**: 分别适合什么场合使用

请详细分析并给出结论。"""
        },
        {
            "type": "image",
            "source": {
                "type": "base64",
                "media_type": get_image_media_type(image1_path),
                "data": image1_base64
            }
        },
        {
            "type": "image",
            "source": {
                "type": "base64",
                "media_type": get_image_media_type(image2_path),
                "data": image2_base64
            }
        }
    ]

    data = {
        "model": "claude-3-7-sonnet-20250219",
        "max_tokens": 1024,
        "messages": [
            {
                "role": "user",
                "content": content
            }
        ]
    }

    try:
        response = requests.post(url, headers=headers, json=data)

        if response.status_code == 200:
            result = response.json()
            return result['content'][0]['text']
        else:
            return f"错误: {response.status_code} - {response.text}"

    except Exception as e:
        return f"请求失败: {e}"

def generate_image_caption(image_path, style="detailed"):
    """为图片生成标题或描述"""
    style_prompts = {
        "simple": "请为这张图片生成一个简洁的标题（不超过10个字）。",
        "detailed": "请为这张图片生成一个详细的描述性标题（20-30字），要生动形象。",
        "poetic": "请为这张图片创作一句诗意的描述，要有美感和意境。",
        "technical": "请从摄影技术角度为这张图片写一段专业的描述。"
    }

    prompt = style_prompts.get(style, style_prompts["detailed"])
    return claude_vision_chat(prompt, image_path=image_path)

def ask_about_image(image_path, question):
    """针对图片内容回答特定问题"""
    prompt = f"关于这张图片，我想问：{question}\n\n请基于图片内容详细回答这个问题。"
    return claude_vision_chat(prompt, image_path=image_path)

# 使用示例
if __name__ == "__main__":
    # 替换为你的图片路径
    sample_image = "sample_photo.jpg"

    print("=== Claude多模态对话示例 ===\n")

    try:
        # 示例1: 基础图片分析
        print("1. 图片内容分析:")
        analysis = analyze_image_content(sample_image)
        print(analysis)
        print("\n" + "="*50 + "\n")

        # 示例2: 文字提取
        print("2. 文字提取 (OCR):")
        text_content = extract_text_from_image(sample_image)
        print(text_content)
        print("\n" + "="*50 + "\n")

        # 示例3: 生成标题
        print("3. 生成图片标题:")
        caption = generate_image_caption(sample_image, style="detailed")
        print(f"详细标题: {caption}")

        simple_caption = generate_image_caption(sample_image, style="simple")
        print(f"简洁标题: {simple_caption}")
        print("\n" + "="*50 + "\n")

        # 示例4: 问答交互
        print("4. 图片问答:")
        questions = [
            "这张图片的主色调是什么？",
            "图片中有几个人？",
            "这是在什么地方拍摄的？",
            "图片的情感氛围如何？"
        ]

        for question in questions:
            answer = ask_about_image(sample_image, question)
            print(f"问: {question}")
            print(f"答: {answer}\n")

        # 示例5: 图片比较（如果有第二张图片）
        second_image = "sample_photo2.jpg"
        try:
            print("5. 图片比较:")
            comparison = compare_images(sample_image, second_image)
            print(comparison)
        except:
            print("5. 图片比较: 需要第二张图片才能进行比较")

    except FileNotFoundError:
        print(f"请确保图片文件 '{sample_image}' 存在")
        print("\n支持的图片格式: JPEG, PNG, GIF, WebP")
        print("推荐图片大小: 小于20MB")

    except Exception as e:
        print(f"程序执行出错: {e}")
```

```javascript JavaScript/Node.js theme={null}
const axios = require('axios');
const fs = require('fs');
const path = require('path');

// 配置API密钥和基础URL
const API_KEY = '<API-KEY>';
const BASE_URL = 'https://api.tokenops.ai/v1';

function encodeImageToBase64(imagePath) {
    try {
        const imageBuffer = fs.readFileSync(imagePath);
        return imageBuffer.toString('base64');
    } catch (error) {
        throw new Error(`图片编码失败: ${error.message}`);
    }
}

function getImageMediaType(imagePath) {
    const extension = path.extname(imagePath).toLowerCase();
    const mediaTypes = {
        '.jpg': 'image/jpeg',
        '.jpeg': 'image/jpeg',
        '.png': 'image/png',
        '.gif': 'image/gif',
        '.webp': 'image/webp'
    };
    return mediaTypes[extension] || 'image/jpeg';
}

async function claudeVisionChat(textPrompt, imagePath = null, imageBase64 = null, mediaType = null) {
    const url = `${BASE_URL}/messages`;
    const headers = {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${API_KEY}`,
        'anthropic-version': '2023-06-01'
    };

    // 构建消息内容
    const content = [
        {
            type: 'text',
            text: textPrompt
        }
    ];

    // 添加图片内容
    if (imagePath) {
        imageBase64 = encodeImageToBase64(imagePath);
        mediaType = getImageMediaType(imagePath);
    }

    if (imageBase64) {
        if (!mediaType) {
            mediaType = 'image/jpeg';
        }

        content.push({
            type: 'image',
            source: {
                type: 'base64',
                media_type: mediaType,
                data: imageBase64
            }
        });
    }

    const data = {
        model: 'claude-3-7-sonnet-20250219',
        max_tokens: 1024,
        messages: [
            {
                role: 'user',
                content: content
            }
        ]
    };

    try {
        const response = await axios.post(url, data, { headers });

        if (response.status === 200) {
            return response.data.content[0].text;
        } else {
            return `错误: ${response.status} - ${response.statusText}`;
        }

    } catch (error) {
        return `请求失败: ${error.response?.status} - ${error.response?.data || error.message}`;
    }
}

async function analyzeImageContent(imagePath) {
    const prompt = `请详细分析这张图片，包括：

1. **主要内容**: 图片中的主要对象和场景
2. **视觉元素**: 颜色、构图、光影等
3. **背景环境**: 场景设置和环境特点
4. **人物/对象**: 如果有人物或特殊对象，请描述其特征
5. **情感氛围**: 图片传达的情感或氛围
6. **技术特点**: 拍摄角度、风格等

请用中文回答，内容要详细且有条理。`;

    return await claudeVisionChat(prompt, imagePath);
}

async function extractTextFromImage(imagePath) {
    const prompt = `请仔细观察这张图片，提取其中的所有文字内容。

要求：
1. 按从上到下、从左到右的顺序提取文字
2. 保持原有的格式和结构
3. 如果是表格，请用表格格式整理
4. 如果有多种语言，请分别标注语言类型
5. 如果文字不清晰，请标注"模糊"或"不清晰"

请直接输出提取到的文字内容。`;

    return await claudeVisionChat(prompt, imagePath);
}

async function generateImageCaption(imagePath, style = 'detailed') {
    const stylePrompts = {
        simple: '请为这张图片生成一个简洁的标题（不超过10个字）。',
        detailed: '请为这张图片生成一个详细的描述性标题（20-30字），要生动形象。',
        poetic: '请为这张图片创作一句诗意的描述，要有美感和意境。',
        technical: '请从摄影技术角度为这张图片写一段专业的描述。'
    };

    const prompt = stylePrompts[style] || stylePrompts.detailed;
    return await claudeVisionChat(prompt, imagePath);
}

async function askAboutImage(imagePath, question) {
    const prompt = `关于这张图片，我想问：${question}\n\n请基于图片内容详细回答这个问题。`;
    return await claudeVisionChat(prompt, imagePath);
}

// 使用示例
(async () => {
    try {
        const sampleImage = 'sample_photo.jpg';

        console.log('=== Claude多模态对话示例 ===\n');

        // 检查图片文件是否存在
        if (!fs.existsSync(sampleImage)) {
            console.log(`请确保图片文件 '${sampleImage}' 存在`);
            console.log('\n支持的图片格式: JPEG, PNG, GIF, WebP');
            console.log('推荐图片大小: 小于20MB');
            return;
        }

        // 示例1: 基础图片分析
        console.log('1. 图片内容分析:');
        const analysis = await analyzeImageContent(sampleImage);
        console.log(analysis);
        console.log('\n' + '='.repeat(50) + '\n');

        // 示例2: 文字提取
        console.log('2. 文字提取 (OCR):');
        const textContent = await extractTextFromImage(sampleImage);
        console.log(textContent);
        console.log('\n' + '='.repeat(50) + '\n');

        // 示例3: 生成标题
        console.log('3. 生成图片标题:');
        const caption = await generateImageCaption(sampleImage, 'detailed');
        console.log(`详细标题: ${caption}`);

        const simpleCaption = await generateImageCaption(sampleImage, 'simple');
        console.log(`简洁标题: ${simpleCaption}`);
        console.log('\n' + '='.repeat(50) + '\n');

        // 示例4: 问答交互
        console.log('4. 图片问答:');
        const questions = [
            '这张图片的主色调是什么？',
            '图片中有几个人？',
            '这是在什么地方拍摄的？',
            '图片的情感氛围如何？'
        ];

        for (const question of questions) {
            const answer = await askAboutImage(sampleImage, question);
            console.log(`问: ${question}`);
            console.log(`答: ${answer}\n`);
        }

    } catch (error) {
        console.error('程序执行出错:', error.message);
    }
})();
```

## Claude多模态功能特点

### 1. 支持的图片格式

* **JPEG/JPG**: 最常用的图片格式
* **PNG**: 支持透明背景
* **GIF**: 静态GIF图片
* **WebP**: 现代图片格式，文件更小

### 2. 图片大小限制

* **最大文件大小**: 20MB
* **推荐大小**: 5MB以下以获得更好的处理速度
* **分辨率**: 支持高分辨率图片，但会自动调整以优化处理

### 3. 分析能力

* **对象识别**: 识别图片中的人、动物、物体等
* **场景理解**: 理解图片的环境和背景
* **文字识别**: 提取图片中的文字内容 (OCR)
* **情感分析**: 分析图片传达的情感和氛围
* **技术分析**: 评估构图、光影、色彩等技术要素

## 消息格式说明

### 文本和图片组合

```json theme={null}
{
  "role": "user",
  "content": [
    {
      "type": "text",
      "text": "请分析这张图片"
    },
    {
      "type": "image",
      "source": {
        "type": "base64",
        "media_type": "image/jpeg",
        "data": "base64编码的图片数据"
      }
    }
  ]
}
```

### 多张图片对比

```json theme={null}
{
  "role": "user",
  "content": [
    {
      "type": "text",
      "text": "请比较这两张图片"
    },
    {
      "type": "image",
      "source": {
        "type": "base64",
        "media_type": "image/jpeg",
        "data": "第一张图片的base64数据"
      }
    },
    {
      "type": "image",
      "source": {
        "type": "base64",
        "media_type": "image/png",
        "data": "第二张图片的base64数据"
      }
    }
  ]
}
```

## 应用场景

### 内容创作

* **图片描述**: 为图片生成标题和描述
* **社交媒体**: 创建有吸引力的文案
* **博客写作**: 根据图片内容创作文章

### 商业应用

* **产品分析**: 分析产品图片的特点
* **品牌监控**: 识别品牌元素和标识
* **市场调研**: 分析竞品图片内容

### 教育培训

* **学习辅助**: 解释图表、公式、示意图
* **作业检查**: 分析学生提交的图片作业
* **知识问答**: 基于图片内容回答问题

### 技术应用

* **文档数字化**: 提取纸质文档的文字内容
* **数据录入**: 从图片中提取结构化信息
* **质量检测**: 分析产品图片的质量问题

## 最佳实践

### 1. 图片质量优化

* **清晰度**: 确保图片清晰，避免模糊
* **光线**: 保持良好的光线条件
* **角度**: 选择合适的拍摄角度
* **背景**: 避免复杂的背景干扰

### 2. 提示词设计

* **具体明确**: 提出具体的问题和要求
* **结构化**: 使用编号或标题组织问题
* **上下文**: 提供必要的背景信息
* **格式要求**: 明确指定输出格式

### 3. 性能优化

* **图片压缩**: 适当压缩图片以提高传输速度
* **批量处理**: 合理安排批量图片分析的时间
* **缓存结果**: 对重复分析的图片进行结果缓存

## 注意事项

1. **隐私保护**: 不要上传包含个人隐私信息的图片
2. **内容合规**: 确保图片内容符合使用政策
3. **网络稳定**: 大文件上传需要稳定的网络连接
4. **费用控制**: 多模态功能的费用通常高于纯文本
5. **准确性**: AI分析结果可能存在误差，重要信息需人工验证


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.