[A2A协议与实现-06]如何将一个MAF Agent发布为A2A服务[JSON-RPC]

这个系列之前的文章对A2A协议本身提供了系统介绍,而且还提供了针对LangChain的A2A服务构建方式。借助于A2A SDK,MAF针对A2A提供了很好的支持,这篇文章通过几个简单的例子演示如何在一个ASP.NET Core应用构建A2A Server。A2A自身并未绑定到具体的传输协议,MAF分别提供针对JSON-RPC和HTTP-JSON两种协议的支持,本篇文章主要关注前者,下一篇会介绍后者。

1. 构建A2A服务器

我们常见一个简单ASP.NET Core应用,并添加针对如下NuGet包的引用。我们依然使用基于OpenAI的GPT模型,所以将相关的设置写入.env文件中,并利用DotNetEnv写入环境变量。

  • DotNetEnv
  • Microsoft.Agents.AI
  • Microsoft.Agents.AI.A2A
  • Microsoft.Agents.AI.Hosting.A2A.AspNetCore
  • Microsoft.Agents.AI.OpenAI

我们定义了如下这个StartA2aServerAsync静态来完成所有的工作,它的参数分别表示指定的服务器监听地址和针对A2A Server的设置。如代码所示,我们创建了一个AIAgent对象和一个描述它的AgentCard。我们调用WebApplicationMapWellKnownAgentCard扩展方法注册了一个GET终结点发布AgentCard,调用MapA2AJsonRpc扩展方法注册了POST终结点以JSON-PRC协议调用指定的AIAgent。在这之前,我们调用了IServiceCollectionAddA2AServerAddAIAgent扩展方法注册了依赖的服务。

csharp 复制代码
static async Task StartA2aServerAsync(Uri url, Action<A2AServerRegistrationOptions>? configureOptions = null)
{
    Env.Load();
    var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
    var endpoint = Environment.GetEnvironmentVariable("OPENAI_BASE_URL")!;
    var agent = new OpenAIClient(new ApiKeyCredential(apiKey), new OpenAIClientOptions { Endpoint = new Uri(endpoint) })
    .GetChatClient(model: "gpt-5.4-mini")
    .AsIChatClient()
    .AsAIAgent(name: "a2a-agent");

    var agentCard = new AgentCard
    {
        Name = "a2a-agent",
        Description = "Agent for A2A testing.",
        Version = "1.0.0",
        DefaultInputModes = ["text", "text/plain"],
        DefaultOutputModes = ["text", "text/plain"],
        SupportedInterfaces = [
            new AgentInterface{
            ProtocolBinding = "JSONRPC",
            ProtocolVersion = "2.0",
            Url = $"{url}/json-rpc"
        }],
        Capabilities = new AgentCapabilities { Streaming = true, PushNotifications = true },
        Skills = [
           new A2A.AgentSkill
       {
            Id="skill-1",
            Name="1st skill",
            Description="this is 1st skill for testing",
            Tags=["t1", "t2", "T3"]
       }
        ],
    };

    var buidler = WebApplication.CreateBuilder();
    buidler.Services
        .AddA2AServer(agent.Name, configureOptions)
        .AddAIAgent(agent.Name, (services, anme) => agent);
    buidler.WebHost.UseUrls(url.ToString());
    var app = buidler.Build();    
    app.MapWellKnownAgentCard(agentCard);
    app.MapA2AJsonRpc(agent, "/json-rpc");
    await app.StartAsync();
}

2. 读取AgentCard信息

MapWellKnownAgentCard方法调用会以标准的路径.well-known/agent-card.json来发布AgentCard的内容。所以我们可以直接请求此路径便可得到承载Agent基本信息的AgentCard。在如下的演示程序中,我们调用上面定义的这个StartA2aServerAsync方法以指定的URL构建并启动A2A Server。然后直接利用创建的HttpClient对目标地址发送一个GET请求,并将读取的内容反序列化成AgentCard对象。 我们最后调用WriteJsonAsync方法以格式化JSON的形式将其输出。

csharp 复制代码
var url = new Uri("http://localhost:3721/");
await StartA2aServerAsync(url);

using var httpClient = new HttpClient {  BaseAddress = url};
var agentCard = await httpClient.GetFromJsonAsync<AgentCard>(".well-known/agent-card.json");
WriteJson(agentCard);

static void WriteJson(object message)
{
    Console.WriteLine(JsonSerializer.Serialize(message, new JsonSerializerOptions {
        Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
        WriteIndented = true,        
    }));
}

输出:

json 复制代码
{
  "Name": "a2a-agent",
  "Description": "Agent for A2A testing.",
  "Version": "1.0.0",
  "DocumentationUrl": null,
  "IconUrl": null,
  "SupportedInterfaces": [
    {
      "Url": "http://localhost:3721//json-rpc",
      "ProtocolBinding": "JSONRPC",
      "Tenant": null,
      "ProtocolVersion": "2.0"
    }
  ],
  "Capabilities": {
    "Streaming": true,
    "PushNotifications": true,
    "Extensions": null,
    "ExtendedAgentCard": null
  },
  "Provider": null,
  "Skills": [
    {
      "Id": "skill-1",
      "Name": "1st skill",
      "Description": "this is 1st skill for testing",
      "Tags": [
        "t1",
        "t2",
        "T3"
      ],
      "Examples": null,
      "InputModes": null,
      "OutputModes": null,
      "SecurityRequirements": null
    }
  ],
  "DefaultInputModes": [
    "text",
    "text/plain"
  ],
  "DefaultOutputModes": [
    "text",
    "text/plain"
  ],
  "SecuritySchemes": null,
  "SecurityRequirements": null,
  "Signatures": null
}

3. 阻塞式调用Agent

A2A针对Agent的调用提供了阻塞式流式 两种。在如下针对阻塞式调用的演示程序中,我们创建了一个SendMessageRequest对象作为请求,相当于是构建了一个角色为User的ChatMessage。并将其作为输入调用我们定义的InvokeAsync方法来以A2A的方式远程调用Agent。由于采用JSON-RPC协议,所以每个请求都需要携带对应的Method。根据前面针对A2A协议的介绍,我们知道阻塞式Agent调用采用的JSON-RPC Method是就是SendMessage

csharp 复制代码
var url = new Uri("http://localhost:3721/");
await StartA2aServerAsync(url);
using var httpClient = new HttpClient { BaseAddress = url };
var request = new SendMessageRequest
{
    Message = new Message
    {
        Role = Role.User,
        Parts = [Part.FromText("给出战国四公子的名字")]
    }
};
var response = await InvokeAsync<SendMessageResponse>("SendMessage", request);
foreach (var part in response.Message.Parts)
{
    Console.Write(part.Text);
}

输出:

markdown 复制代码
战国四公子通常指:

1. **齐国孟尝君**------田文
2. **赵国平原君**------赵胜
3. **魏国信陵君**------魏无忌
4. **楚国春申君**------黄歇

调用InvokeAsync方法以SendMessageResponse对象的形式返回Agent的响应。SendMessageResponseMessage属性返回一个类似于ChatMessageMessage对象,正如ChatMessage利用Contents属性返回承载的内容一样,这里的消息将内容置于Parts属性中。我们将每个Part的文本内容依次输出来。

InvokeAsync方法定义如下,泛型类型TResponse表示作为调用结果的类型。如代码所示,我们将指定的参数作为MethodParams创建了作为JSON-RPC请求的JsonRpcRequest对象,并将其作为输入调用HttpClientPostAsJsonAsync方法,并得到作为响应的JsonRpcResponse对象。我们最后将JsonRpcResponseResult反序列化成TResponse对象并返回。

csharp 复制代码
async Task<TResponse> InvokeAsync<TResponse>( string method, object request)
{    
    var rpcRequest = new JsonRpcRequest
    {
        Method = method,
        Id = new JsonRpcId(Guid.NewGuid().ToString()),
        Params = new JsonElement?(JsonSerializer.SerializeToElement(request, A2AJsonUtilities.DefaultOptions))
    };
    var response = await httpClient.PostAsJsonAsync("json-rpc", rpcRequest);
    response.EnsureSuccessStatusCode();
    var rpcResponse = await response.Content.ReadFromJsonAsync<JsonRpcResponse>();
    return rpcResponse.Result.Deserialize<TResponse>(A2AJsonUtilities.DefaultOptions);
}

如下所示的是请求和响应的内容:

json 复制代码
{
  "jsonrpc": "2.0",
  "id": "c67e011b-1a35-4d84-ad92-1d2d6501722f",
  "method": "SendMessage",
  "params": {
    "message": {
      "role": "ROLE_USER",
      "parts": [ { "text": "给出战国四公子的名字" } ],
      "messageId": ""
    }
  }
}
json 复制代码
{
  "jsonrpc": "2.0",
  "id": "39462512-1b92-4bad-8dfc-bce1ea7fee57",
  "result": {
    "message": {
      "role": "ROLE_AGENT",
      "parts": [ { "text": "战国四公子通常指:\n\n1. **齐国孟尝君**------田文  \n2. **赵国平原君**------赵胜  \n3. **魏国信陵君**------魏无忌  \n4. **楚国春申君**------黄歇" } ],
      "messageId": "chatcmpl-E5hscNfOnLYm4sZP3mbb8mae4Cise",
      "contextId": "b1fae2390f46492d92af504ad67cdd5d"
    }
  }
}

4. 流式调用Agent

由于流式调用Agent可以实时输出生成的内容,在应用上的体现主要表示为逐字输出实时返回的内容,能够带来更好的用户体验。在如下所示的演示程序中,我们创建相同的方式创建了SendMessageRequest对象,并将它作为输入调用StreamAsync<StreamResponse>方法以流的形式远程调用Agent。由于流式调用对应的JSON-RPC方法名称为SendStreamingMessage,我们将它作为调用StreamAsync<StreamResponse>方法的第一个参数。该方法返回一个IAsyncEnumerable<StreamResponse>对象,我们异步迭代每个StreamResponse,并将它的消息携带的所有文本内容输出来。

csharp 复制代码
var url = new Uri("http://localhost:3721/");
await StartA2aServerAsync(url);
using var httpClient = new HttpClient { BaseAddress = url };
var request = new SendMessageRequest
{
    Message = new Message
    {
        Role = Role.User,
        Parts = [Part.FromText("给出战国四公子的名字")]
    }
};
await foreach (var response in StreamAsync<StreamResponse>("SendStreamingMessage", request))
{
    foreach (var part in response .Message.Parts)
    {
        Console.Write(part.Text);
    }
}

输出:

markdown 复制代码
战国四公子是:

1. **孟尝君** ------ 田文,齐国
2. **平原君** ------ 赵胜,赵国
3. **信陵君** ------ 魏无忌,魏国
4. **春申君** ------ 黄歇,楚国

如下所示的是StreamAsync方法的定义。我们采用与InvokeAsync类似的方式将原始的输入对象封装成JsonRpcRequest。由于我们构建的A2A Server会采用SSE协议实现流式输出,所以整个过程就是一个采用SseParser解析每个SSE数据项,并反序列化生成并输出结果的过程

csharp 复制代码
async IAsyncEnumerable<TResult> StreamAsync<TResult>( string method, object request,)
{
    var rpcRequest = new JsonRpcRequest
    {
        Method = method,
        Id = new JsonRpcId(Guid.NewGuid().ToString()),
        Params = new JsonElement?(JsonSerializer.SerializeToElement(request, A2AJsonUtilities.DefaultOptions))
    };

    using var content = new JsonRpcContent(rpcRequest);
    using var requestMessage = new HttpRequestMessage(HttpMethod.Post, "json-rpc")
    {
        Content = content,
    };
    requestMessage.Headers.TryAddWithoutValidation("A2A-Version", "1.0");
    requestMessage.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/event-stream"));

    var response = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);
    response.EnsureSuccessStatusCode();

    var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
    using (response)
    using (stream)
    {
        await foreach (var sseItem in SseParser.Create(stream).EnumerateAsync())
        {
            var rpcResponse = JsonSerializer.Deserialize<JsonRpcResponse>(sseItem.Data, A2AJsonUtilities.DefaultOptions);
            var result = rpcResponse.Result.Deserialize<TResult>(A2AJsonUtilities.DefaultOptions);
            yield return result;
        }
    }
}

如下所示的是请求和响应的内容

json 复制代码
{
  "jsonrpc": "2.0",
  "id": "0c81ee1f-6328-4b78-96b9-6409dbcd7d27",
  "method": "SendStreamingMessage",
  "params": {
    "message": {
      "role": "ROLE_USER",
      "parts": [ { "text": "给出战国四公子的名字" } ],
      "messageId": ""
    }
  }
}
复制代码
data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[],"messageId":"","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":""}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"战"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"国"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"四"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"公"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"子"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"是"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":":\n\n"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"1"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"."}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" **"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"孟"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"尝"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"君"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"**"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" ------"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" "}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"田"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"文"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":","}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"齐"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"国"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"  \n"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"2"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"."}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" **"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"平"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"原"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"君"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"**"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" ------"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" "}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"赵"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"胜"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":","}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"赵"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"国"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"  \n"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"3"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"."}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" **"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"信"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"陵"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"君"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"**"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" ------"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" 魏"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"无"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"忌"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":","}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"魏"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"国"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"  \n"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"4"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"."}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" **"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"春"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"申"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"君"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"**"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" ------"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":" 黄"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"歇"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":","}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"楚"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[{"text":"国"}],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}

data: {"jsonrpc":"2.0","id":"0c81ee1f-6328-4b78-96b9-6409dbcd7d27","result":{"message":{"role":"ROLE_AGENT","parts":[],"messageId":"chatcmpl-E5huMZZnvxPuvrQbPfe8xxgGZO0QB","contextId":"142cb8956f654bb789e2d53a32af35e2"}}}
相关推荐
神奇霸王龙1 小时前
AI视频Prompt结构化实战指南:可灵/万相/豆包
人工智能·ai·prompt·aigc·音视频·ai编程
浮生望1 小时前
Workflow 与 Agent:一条流水线和一个思考者,AI 工程的两种范式
agent·workflow
码流怪侠5 小时前
GitHub 2026年7月热门项目全景盘点:Agent Skills 生态炸裂,开源世界正在重写规则
程序员·github·agent
艾斯特_5 小时前
工作流与多Agent协作:LangGraph、MCP和A2A的应用分层
人工智能·python·ai
腾视科技AIoT5 小时前
私有云时代来临:AI NAS如何重塑你的数字生活?
人工智能·ai·生活·nas·企业存储·ainas·家庭存储
清泓y5 小时前
RAG 技术
算法·ai
曦尧5 小时前
Instatic:一体化自托管可视化 CMS,押注「干净静态页」对抗 SaaS 订阅锁定
ai·自动化
Jackson__6 小时前
AI Agent 的能力从哪里来?一文讲清后训练、上下文学习和外部能力
前端·agent·ai编程
冬奇Lab6 小时前
AI 评测系列(05):Agent 评测——工具调用准确率与轨迹质量
人工智能·agent