> 技术文档 > 项目实训(6)—— 豆包API的接入_豆包 api

项目实训(6)—— 豆包API的接入_豆包 api

在测试的过程中,发现DS本身以及科大讯飞的语音模型并不是特别适合我们的这个项目,经过筛选之后,我觉得尝试接入多模态能力更强大、语音识别能力更强、流式语音生成更流畅的豆包系列模型。

1.前置准备

在进行API接入之前,首先要获取豆包API的相关配置。
火山引擎账号及豆包API Key:
    1.  访问火山引擎官方网站并注册账号。
    2.  登录控制台后,导航至豆包大模型服务。
    3.  根据指引创建新的豆包应用,并获取应用的API Key。此API Key是进行API请求认证的唯一凭证,其安全性至关重要。

2. 核心实现:`Chatdoubao.cs` 脚本详解

`Chatdoubao.cs` 脚本是本方案中与豆包API进行交互的核心组件。它封装了HTTP请求的构建、发送、响应解析以及错误处理逻辑。

3.1 类定义与核心成员

`Chatdoubao` 类继承自 `LLM`。

using System;using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Networking;public class Chatdoubao : LLM{    // 构造函数:初始化豆包API的固定请求端点    public Chatdoubao()    {        url = \"https://ark.cn-beijing.volces.com/api/v3/chat/completions\";    }    // [SerializeField] private string api_key = \"YOUR_API_KEY_HERE\";    // `api_key`:用于API认证的密钥,应替换为您的实际API Key或通过Unity Inspector进行配置。    [SerializeField] private string api_key = \"74788f67-d691-49da-b625-39a0145514ba\"; // 示例值    // `m_SystemSetting`:定义AI的系统角色或初始行为指令。    // 该设置会作为“system”角色消息发送给API,引导AI的回复风格。    public string m_SystemSetting = string.Empty;    // `m_ModelName`:指定用于对话补全的豆包大模型名称。    // 示例中使用了“doubao-1-5-thinking-pro-250415”,开发者可根据实际需求选择其他可用模型。    public string m_ModelName = \"doubao-1-5-thinking-pro-250415\";    // ... 其他成员 ...}```

Chatdoubao() 构造函数 :在类实例化时,将 `url` 成员变量初始化为豆包大模型的聊天补全API端点。这是一个固定的入口,所有对话请求都将发送至此。
api_key` :此私有字段通过 `[SerializeField]` 属性暴露在Unity Inspector面板,允许开发者在不修改代码的情况下配置API Key。在实际部署中,应考虑更安全的密钥管理方式,避免硬编码。
m_SystemSetting:此字段用于设置AI的预设“角色”或“背景”。例如,可以设置为“你是一个专业的编程助手”,这将在对话开始时作为一条类型为“system”的消息发送给模型,从而影响其后续的对话行为。
m_ModelName:指定与豆包API交互时所使用的具体模型。豆包平台可能提供多种模型,各有其特点和适用场景。通过此字段,开发者可以灵活切换模型。
m_DataList: (假设其在`LLM`基类或`Chatdoubao`内部定义为`List`) 此列表用于维护整个对话的上下文。每次用户发送消息和AI回复后,都会将消息添加到此列表中,以确保后续请求包含完整的对话历史,从而使AI能够理解上下文并进行连贯回复。

3.2 `Start` 方法:对话上下文的初始化

// ... existing code ...private void Start(){    // 在组件初始化时,如果存在系统设定,则将其作为“system”角色消息添加到对话历史中。    // 这确保了每次会话开始时AI都能获得预定义的行为指令。    if (!string.IsNullOrEmpty(m_SystemSetting))    {        m_DataList.Add(new SendData(\"system\", m_SystemSetting));    }}// ... existing code ...```

`Start` 方法在组件首次启用时执行。其核心功能是根据 `m_SystemSetting` 初始化对话的系统消息。这种做法对于设定AI的初始行为模式至关重要,例如定义AI的身份、回答风格或知识范围。

3.3 `PostMsg` 方法:外部调用接口

```csharp// ... existing code .../// /// 发送消息的公共接口。/// /// 用户输入的文本消息。/// 用于处理API返回结果的回调函数。public override void PostMsg(string _msg, Action _callback){    // 调用基类方法,通常会负责将_msg添加到m_DataList,并启动Request协程。    base.PostMsg(_msg, _callback);}// ... existing code ...```

`PostMsg` 方法作为`Chatdoubao`类的公共API,允许外部脚本(如UI管理器或用户输入处理器)方便地发送消息给豆包大模型。该方法的设计旨在提供一个统一的接口,隐藏了内部API通信的复杂性。其内部调用 `base.PostMsg`,通常会负责将用户消息添加到对话历史(`m_DataList`),并触发后续的API请求协程。

 3.4 `Request` 协程:API通信流程解析

`Request` 协程是与豆包API进行实际HTTP通信的核心逻辑,它利用Unity的`UnityWebRequest`类实现异步数据传输。

```csharp// ... existing code .../// /// 调用豆包API接口发送对话请求。/// /// 当前的用户输入文本。/// 处理AI回复的回调函数。public override IEnumerator Request(string _postWord, System.Action _callback){    stopwatch.Restart(); // 启动计时器,用于性能监测    using (UnityWebRequest request = new UnityWebRequest(url, \"POST\"))    {        // 1. 构建请求体数据(JSON格式)        // PostData是自定义的数据结构,用于封装API请求所需的参数。        PostData _postData = new PostData        {            model = m_ModelName,    // 指定LLM模型            messages = m_DataList,  // 完整的对话历史,包含系统消息、用户消息和AI回复            stream = false          // 设置为非流式传输,即一次性获取完整回复        };        // 将C#对象序列化为JSON字符串。        string _jsonText = JsonUtility.ToJson(_postData);        // 将JSON字符串转换为UTF8编码的字节数组,作为HTTP请求体。        byte[] data = System.Text.Encoding.UTF8.GetBytes(_jsonText);        // 设置UnityWebRequest的上传处理器,用于发送请求体。        request.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);        // 设置UnityWebRequest的下载处理器,用于接收响应数据。        request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();        // 2. 设置HTTP请求头        // `Content-Type`头指定请求体的MIME类型为JSON。        request.SetRequestHeader(\"Content-Type\", \"application/json\");        // `Authorization`头用于API认证,采用Bearer Token方案,将API Key作为凭证发送。        request.SetRequestHeader(\"Authorization\", string.Format(\"Bearer {0}\", api_key));        // 3. 发送HTTP请求并等待响应        // `yield return request.SendWebRequest();` 是Unity协程的关键。        // 它会暂停协程的执行,直到HTTP请求完成(无论成功或失败),然后协程会从此处继续执行。        yield return request.SendWebRequest();        // 4. 处理API响应        if (request.responseCode == 200) // HTTP状态码为200表示请求成功        {            string _msgBack = request.downloadHandler.text; // 获取服务器返回的原始响应文本            // 将JSON响应文本反序列化为MessageBack C#对象。            MessageBack _textback = JsonUtility.FromJson(_msgBack);            // 检查反序列化结果和AI回复内容是否存在。            if (_textback != null && _textback.choices.Count > 0)            {                // 提取AI生成的具体回复内容。                string _backMsg = _textback.choices[0].message.content;                // 将AI的回复添加到对话历史中,以备后续轮次对话使用。                m_DataList.Add(new SendData(\"assistant\", _backMsg));                // 通过回调函数将AI回复传递给调用方。                _callback(_backMsg);            }        }        else // 请求失败(非200状态码)        {            string _msgBack = request.downloadHandler.text; // 获取失败响应的详细信息            Debug.LogError($\"豆包API调用失败: {_msgBack}\"); // 记录错误日志,便于调试            _callback($\"API调用失败: {request.responseCode}\"); // 通过回调返回API错误码        }        stopwatch.Stop(); // 停止计时器        Debug.Log(\"豆包API耗时:\" + stopwatch.Elapsed.TotalSeconds); // 打印请求耗时    }}// ... existing code ...```

4. Unity项目中的集成与部署

将`Chatdoubao.cs`脚本集成到Unity项目中的步骤主要有:

1. 创建GameObject:在Unity场景中创建一个新的空GameObject(右键点击Hierarchy面板 -> Create Empty),并将其命名为“DoubaoAPI”或任何您认为合适的名称。此GameObject将作为`Chatdoubao`脚本的载体。

2.附加脚本:将`Chatdoubao.cs`脚本文件从Project面板拖拽到刚刚创建的“DoubaoAPI”GameObject上,或在Inspector面板中点击“Add Component”并搜索`Chatdoubao`。

3.配置API Key和模型参数:选中场景中的“DoubaoAPI”GameObject。在Inspector面板中,您将看到`Chatdoubao`组件的属性。

    ·将`Api Key`字段替换为您在火山引擎获取的实际API Key。

    ·根据需求配置`System Setting`(如“您是一个专业的聊天助手。”)以设定AI的初始行为。

    ·确认或修改`Model Name`为所需的豆包大模型名称。

5. 调用API:在需要与豆包API交互的其他Unity脚本(例如用户输入管理器、对话UI控制器)中,获取`Chatdoubao`组件的引用,并通过其公共方法调用API。

using UnityEngine;using System; // 确保引入System命名空间以使用Actionpublic class ChatInteractionManager : MonoBehaviour{    public Chatdoubao doubaoApiService;    void Start()    {        if (doubaoApiService == null)        {            Debug.LogError(\"Error: Chatdoubao service is not assigned or found in the scene.\");        }    }    public void SendMessageToAI(string userMessage)    {        if (doubaoApiService != null)        {            doubaoApiService.PostMsg(userMessage, (aiResponse) => {                Debug.Log(\"AI Response: \" + aiResponse);                // 在此处实现对AI回复的进一步处理            });        }        else        {            Debug.LogError(\"Chatdoubao service is not available. Cannot send message.\");        }    }   }

最终集成后的效果相当不错,回复速度比DS快了大约三分之一,回复效果也更加贴合项目本身,尤其是很适合进行多场景对话。