Unity之使用火山引擎实现文字提问流式回复
·
文字提问
设置参数apiKey
调用Request方法,传入对话内容
注册事件,接收回复内容
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
/// <summary>
/// 文本提问
/// </summary>
public class TextQuestions : MonoBehaviour
{
string baseUrl = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
string apiKey = "";
[Header("模型")]
[SerializeField] string model = "doubao-seed-2-0-code-preview-260215";
[Header("深度思考")]
[SerializeField] string thinking = "disabled";
[Header("模型回答最大长度(单位token)")]
[SerializeField] int maxTokens = 4096;
[Header("思考消耗")]
[SerializeField] string reasoningEffort = "minimal";
public event Action<string, bool> onReceive;
public event Action onCompleted;
public event Action OnError;
void OnReceive(string content)
{
var respone = JsonUtility.FromJson<ResponeChatMessage>(content);
onReceive?.Invoke(respone.choices[0].delta.content,
respone.choices[0].finish_reason == "stop");
}
void OnCompleted()
{
onCompleted?.Invoke();
}
public void Request(List<Message> messages)
{
RequestChat requestMessages = new RequestChat
{
messages = messages,
model = model,
thinking = new ThinkingType()
{
type = thinking,
},
max_tokens = maxTokens,
reasoning_effort = reasoningEffort,
};
string jsonData = JsonUtility.ToJson(requestMessages);
StartCoroutine(PostChat(jsonData));
}
IEnumerator PostChat(string jsonData)
{
using (UnityWebRequest request = new UnityWebRequest(baseUrl, UnityWebRequest.kHttpVerbPOST))
{
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
var tTSDownload = new TTSDownload();
tTSDownload.OnObjectReceived += OnReceive;
tTSDownload.OnComplete += OnCompleted;
request.downloadHandler = tTSDownload;
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("Authorization", "Bearer " + apiKey);
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogError("请求失败:" + request.error);
OnError?.Invoke();
}
tTSDownload.OnObjectReceived -= OnReceive;
tTSDownload.OnComplete -= OnCompleted;
}
}
}
[Serializable]
public class RequestChat
{
public string model;
public List<Message> messages;
public ThinkingType thinking;
public int max_tokens;
public string reasoning_effort;
public bool stream = true;
}
[Serializable]
public class ThinkingType
{
public string type;
}
[Serializable]
public class Message
{
public string role;
public string content;
public string thinking;
}
[Serializable]
public class ResponeChatMessage
{
public Choices[] choices;
}
[Serializable]
public class Choices
{
public MessageDelta delta;
public string finish_reason;
public int index;
}
[Serializable]
public class MessageDelta
{
public string content;
public string role;
}
拓展DownloadHandler
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
public class TTSDownload : DownloadHandlerScript
{
private StringBuilder buffer = new StringBuilder();
public event Action<string> OnObjectReceived;
public event Action OnComplete;
public TTSDownload() : base(new byte[4096]) { }
protected override bool ReceiveData(byte[] data, int dataLength)
{
string chunk = Encoding.UTF8.GetString(data, 0, dataLength);
buffer.Append(chunk);
ProcessBuffer();
return true;
}
private void ProcessBuffer()
{
string content = buffer.ToString();
int splitStartIndex = -1;
int braceCount = 0;
int lastProcessed = 0;
for (int i = 0; i < content.Length; i++)
{
if (content[i] == '{')
{
if (braceCount == 0) splitStartIndex = i;
braceCount++;
}
else if (content[i] == '}')
{
braceCount--;
if (braceCount == 0 && splitStartIndex != -1)
{
string obj = content.Substring(splitStartIndex, i - splitStartIndex + 1);
OnObjectReceived?.Invoke(obj);
splitStartIndex = -1;
lastProcessed = i + 1;
}
}
}
if (lastProcessed > 0)
buffer.Remove(0, lastProcessed);
}
protected override void CompleteContent()
{
OnComplete?.Invoke();
}
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)