如何从Unity C#通过上下文向Watson Conversation发送字符串?
嘿,我来帮你搞定Unity里用C#给Watson Assistant(之前叫Conversation)传自定义字符串的事儿,核心就是上下文的操作,我一步步给你讲清楚:
第一步:补全必要的命名空间引用
首先确保你已经导入了Watson的Unity SDK,然后在脚本开头加上这些命名空间:
using UnityEngine; using IBM.Watson.Assistant.v2; using IBM.Watson.Assistant.v2.Model; using IBM.Cloud.SDK.Core.Authentication.Iam; using IBM.Cloud.SDK.Core.Http;
第二步:初始化Watson客户端与会话
Watson Assistant v2版本要求必须创建会话并复用会话ID,所以先在脚本里初始化客户端和会话:
private AssistantService _assistant; private string _sessionId; void Start() { // 用你的Watson API Key初始化IAM认证 IamAuthenticator authenticator = new IamAuthenticator(apikey: "你的Watson API Key"); // 创建Assistant客户端,指定API版本(选一个合适的,比如2021-06-14) _assistant = new AssistantService("2021-06-14", authenticator); // 设置你的Watson服务URL _assistant.SetServiceUrl("你的Watson服务URL"); // 创建会话,成功后会拿到sessionId _assistant.CreateSession(OnCreateSession, OnFailure); } // 会话创建成功的回调 private void OnCreateSession(DetailedResponse<SessionResponse> response, IBMError error) { if (error == null) { _sessionId = response.Result.SessionId; Debug.Log("会话创建成功,ID:" + _sessionId); // 这里可以调用发送消息的方法测试了 SendMessageWithCustomContext("你好,Watson!", "这是我要传递的自定义字符串"); } else { Debug.LogError("创建会话失败:" + error.Message); } } // 通用失败回调 private void OnFailure(IBMError error) { Debug.LogError("请求出错:" + error.Message); }
第三步:给上下文添加自定义变量并发送请求
这部分是核心,你需要把自定义字符串放到上下文的Global字典里,然后随消息请求一起发送:
public void SendMessageWithCustomContext(string inputText, string customStringValue) { if (string.IsNullOrEmpty(_sessionId)) { Debug.LogError("会话ID为空,请先创建会话"); return; } // 初始化上下文对象 MessageContext context = new MessageContext(); // 初始化Global字典,用来存自定义变量 context.Global = new Dictionary<string, object>(); // 添加自定义变量,比如键叫"user_custom_data",值就是你要传的字符串 context.Global.Add("user_custom_data", customStringValue); // 构造消息请求,把上下文和输入文本传进去 MessageRequest messageRequest = new MessageRequest() { Input = new MessageInput() { Text = inputText }, Context = context }; // 发送请求到Watson _assistant.Message(OnMessageResponse, OnFailure, _sessionId, messageRequest); }
第四步:处理响应并访问上下文
发送请求后,你可以在回调里拿到Watson的回复,同时也能访问返回的上下文(后续多轮对话可以复用这个上下文来保持会话状态):
private void OnMessageResponse(DetailedResponse<MessageResponse> response, IBMError error) { if (error == null) { // 打印Watson的回复文本 if (response.Result.Output.Generic != null && response.Result.Output.Generic.Count > 0) { foreach (var item in response.Result.Output.Generic) { if (item.ResponseType == "text") { Debug.Log("Watson回复:" + item.Text); } } } // 访问返回的上下文,比如取出我们之前传的自定义变量 MessageContext returnedContext = response.Result.Context; if (returnedContext.Global != null && returnedContext.Global.ContainsKey("user_custom_data")) { string savedValue = returnedContext.Global["user_custom_data"].ToString(); Debug.Log("上下文里的自定义变量值:" + savedValue); } } else { Debug.LogError("消息发送失败:" + error.Message); } }
额外提示:多轮对话复用上下文
如果是多轮对话,不要每次都新建上下文,应该用上一轮响应返回的上下文,这样Watson能记住会话状态。比如修改发送方法:
public void SendMessageWithExistingContext(string inputText, string customStringValue, MessageContext existingContext = null) { if (string.IsNullOrEmpty(_sessionId)) { Debug.LogError("会话ID为空,请先创建会话"); return; } // 如果没有传入上下文,就新建一个;否则用传入的上下文 MessageContext context = existingContext ?? new MessageContext(); // 确保Global字典已初始化 if (context.Global == null) { context.Global = new Dictionary<string, object>(); } // 更新或添加自定义变量 if (context.Global.ContainsKey("user_custom_data")) { context.Global["user_custom_data"] = customStringValue; } else { context.Global.Add("user_custom_data", customStringValue); } MessageRequest messageRequest = new MessageRequest() { Input = new MessageInput() { Text = inputText }, Context = context }; _assistant.Message(OnMessageResponse, OnFailure, _sessionId, messageRequest); }
这样你在后续对话里,把上一轮的returnedContext传进去就行啦。
内容的提问来源于stack exchange,提问作者grunter-hokage
相关产品推荐
相关产品推荐

