> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coze.cn/llms.txt
> Use this file to discover all available pages before exploring further.

在智能眼镜等终端场景中，用户常常需要通过语音指令触发智能体，并上传图片以实现图片理解功能。这种多模态交互方式能够显著提升用户体验，尤其是在需要快速获取信息或进行复杂任务处理时。你可以选择基于对话 OpenAPI 或音视频通话来实现这一功能。
## 方式一：基于对话 OpenAPI 实现 {#e571ee42}
### 步骤一：创建并发布智能体 {#41028665}
创建**单 Agent（自主规划模式）​**类型的智能体，选择**豆包·视觉理解·Pro** 模型或其他支持视觉理解的模型。调试后将智能体发布为 **API**。
![Image=800x378](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b57d5a1d68a94a159e3f4ec11f388559~tplv-goo7wpa0wc-image.image)
### 步骤二：调用发起对话 API 实现多模态交互 {#3b10e80a}
#### 实现方法 {#45d0d081}

1. 调用[上传文件](/developer_guides/upload_files) API，将图片和语音文件上传到扣子编程，并获取对应的 `file_id`。
2. 调用[发起对话](/developer_guides/chat_v3) API，在 `messages` 中同时传入图片和语音文件的 `file_id`。智能体将结合语音内容和图片内容进行联合理解，并返回对图片的理解结果。

#### 示例代码 {#45b1a1d7}
示例代码如下，完整的示例代码请参见 [audio_chat_with_vision_image](https://github.com/coze-dev/coze-cookbook/blob/main/examples/audio_chat_with_vision_image/http_chat.py) 示例项目源码。
```Python
 # 将语音和图片上传到 coze
    audio_file = coze.files.upload(file=audio_path)
    image_file = coze.files.upload(file=image_path)

 # 调用 /v3/chat 发起对话, 传入语音和图片的 file id
    stream = coze.chat.stream(
        bot_id=bot_id,
        user_id=secrets.token_urlsafe(),
        additional_messages=[
            Message.build_user_question_objects(
                [
                    MessageObjectString.build_image(file_id=image_file.id),
                    MessageObjectString.build_audio(file_id=audio_file.id),
                ]
            )
        ],
    )
    print(f"对话开始 logid: {stream.response.logid}")
```

成功调用后，智能体将返回图片的理解结果，返回示例如下：
![Image=800x204](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/bfb367b51c2841359608bbdd11f3730d~tplv-goo7wpa0wc-image.image)
## 方式二：基于语音通话 SDK {#6f016c7b}
### 步骤一：搭建对话流 {#973ea5cf}

1. 创建一个对话流，对话流的节点概览如下图所示，在对话流中添加大模型节点用于理解图片。
   ![Image=800x182](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d0d0b2a913114f8b849c938d43a8abe4~tplv-goo7wpa0wc-image.image)
   对话流中各节点的配置和参数如下表所示。
   <!-- @cols-width: 149,422,259 -->
   | | | | \
   |**节点** |**参数配置** |**示例图** |
   |---|---|---|
   | | | | \
   |开始 |开始节点添加一个类型为 image 的输入参数，参数名称可以自定义，但需与代码中一致，本文以 image 为例。 |![Image=300x223](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/bf7e7431218c494d907560e22d3ffb7d~tplv-goo7wpa0wc-image.image) |
   | | | | \
   |大模型 |* 模型选择**豆包·视觉理解·Pro** 模型或其他支持视觉理解的模型。 |\
   | |* 输入参数：输入中添加 `input` 和 `image`变量，变量的值分别引用开始节点的 `USER_INPUT` 和 `image`。 |\
   | |* 系统提示词：使用以下示例 Markdown 信息，表示将用户输入的数据传入 LLM 进行处理。 |\
   | |   ```Markdown |\
   | |   用户输入：{{input}} |\
   | |   图片：{{image}} |\
   | |   ``` |\
   | | |\
   | | |\
   | | |![Image=300x640](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2a0bfd6088b44641a3224ccf0bc8a8c2~tplv-goo7wpa0wc-image.image) |
   | | | | \
   |结束 |新增 `output` 输出参数，并在**参数值**区域选择引用大模型节点的 `output` 参数。 |![Image=300x330](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1a9570bf4fa4496ca2e39283bc8659cc~tplv-goo7wpa0wc-image.image) |

2. 创建智能体并将智能体设置为**单 Agent（对话流模式）**，在智能体中添加对话流。
   ![Image=600x288](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/dd9aa447364d4c4c9d4c55e905f5f20c~tplv-goo7wpa0wc-image.image)
3. 将智能体发布为 **API**。

### 步骤二：对话中发送音频和图片 {#d39475a0}
通过 WebSocket 或 RTC 进行音视频通话时，通过上行事件中的 `parameters` 参数，将图片发送给对话流。本文以 WebSocket 为例介绍具体实现方法。
#### 实现方法 {#1ff270d7}

1. 建立 WebSocket 连接时，在 URL 路径的 Query 参数中设置 `bot_id`。
2. 建立 WebSocket 连接后，发送 `chat.update` 上行事件，在 `data.chat_config.parameters` 参数中传入 image 输入参数的值，并传递给对话流，事件的详细说明请参见 [双向流式对话上行事件](/developer_guides/streaming_chat_event)。
3. 通过 WebSocket 与智能体进行实时语音交互时，通过 `input_audio_buffer.append` 上行事件，流式上传音频数据，事件的详细说明请参见[流式上传音频片段](/developer_guides/streaming_chat_event#98463f78)。

#### 示例代码 {#d052ec92}
示例代码如下，完整的示例代码请参见 [websocket_chat.py ](https://github.com/coze-dev/coze-cookbook/blob/main/examples/audio_chat_with_vision_image/websocket_chat.py)示例项目源码。
```Python
    chat = coze.websockets.chat.create(
        bot_id=bot_id,
        on_event=WebsocketsChatEventHandler(),
    )

    # 建立 websocket 链接
    async with chat() as client:
        print("建立 websocket 链接成功")
        # 发送 chat_flow 参数
        await client.chat_update(
            ChatUpdateEvent.Data.model_validate(
                {
                    "chat_config": ChatUpdateEvent.ChatConfig.model_validate(
                        {
                            "parameters": {
                                "image": json.dumps(
                                    {
                                        "file_id": image_file.id,
                                    }
                                ),
                            }
                        }
                    )
                }
            )
        )
        # 发送语音数据
        for delta in split_bytes_by_length(audio_data, 1024):
            await client.input_audio_buffer_append(
                InputAudioBufferAppendEvent.Data.model_validate(
                    {
                        "delta": delta,
                    }
                )
            )
            await asyncio.sleep(len(delta) * 1.0 / 24000 / 2)  # 模拟真实说话间隔
        await client.input_audio_buffer_complete()
        await client.wait()
```


成功建立连接并发送数据后，智能体将根据语音和图片内容返回相应的对话结果，返回示例如下：
![Image=1280x272](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b0c21e21f4e54926a12bc6582939f2e3~tplv-goo7wpa0wc-image.image)

