You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:04:16