这个系列之前的文章对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。我们调用WebApplication的MapWellKnownAgentCard扩展方法注册了一个GET终结点发布AgentCard,调用MapA2AJsonRpc扩展方法注册了POST终结点以JSON-PRC协议调用指定的AIAgent。在这之前,我们调用了IServiceCollection的AddA2AServer和AddAIAgent扩展方法注册了依赖的服务。
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的响应。SendMessageResponse的Message属性返回一个类似于ChatMessage的Message对象,正如ChatMessage利用Contents属性返回承载的内容一样,这里的消息将内容置于Parts属性中。我们将每个Part的文本内容依次输出来。
InvokeAsync方法定义如下,泛型类型TResponse表示作为调用结果的类型。如代码所示,我们将指定的参数作为Method和Params创建了作为JSON-RPC请求的JsonRpcRequest对象,并将其作为输入调用HttpClient的PostAsJsonAsync方法,并得到作为响应的JsonRpcResponse对象。我们最后将JsonRpcResponse的Result反序列化成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"}}}