如何正确读取和处理InvokeAgentResponse中的Amazon.BedrockAgentRuntime.Model.ResponseStream
解决Amazon Bedrock Agent响应流提取纯文本的问题
问题分析
InvokeAgentAsync返回的Completion是流式响应对象(ResponseStream),并非直接的文本内容,因此直接调用ToString()只会返回类型名称,无法获取实际响应文本。
解决方案
通过StreamReader异步读取流式对象的内容,将其转换为纯文本。以下是修改后的完整实现:
public class AgentClient : IAgentClient { private readonly AmazonBedrockAgentRuntimeClient _client; private readonly BedrockSettings _settings; public AgentClient() { _settings = new BedrockSettings(); var credentials = new BasicAWSCredentials(_settings.AccessKeyId, _settings.SecretAccessKey); var config = new AmazonBedrockAgentRuntimeConfig { RegionEndpoint = Amazon.RegionEndpoint.GetBySystemName(_settings.Region) }; _client = new AmazonBedrockAgentRuntimeClient(credentials, config); } public async Task<string> QueryAgentAsync(string sessionId, string inputText) { try { var request = new InvokeAgentRequest { SessionId = sessionId, AgentId = _settings.AgentId, AgentAliasId = _settings.AgentAliasId, InputText = inputText, EnableTrace = true }; var agentResponse = await _client.InvokeAgentAsync(request); if (agentResponse.Completion == null) { throw new Exception("Completion is undefined in the response."); } // 读取流式响应内容为纯文本 using var streamReader = new StreamReader(agentResponse.Completion); var responseText = await streamReader.ReadToEndAsync(); Console.WriteLine("Agent Response Content: " + responseText); return responseText; } catch (Exception ex) { Console.WriteLine($"Error invoking agent: {ex.Message}"); return null; } } }
关键说明
- 流读取逻辑:使用
StreamReader的ReadToEndAsync()方法异步读取整个响应流,确保获取完整的文本内容。 - 资源释放:用
using语句包裹StreamReader,自动处理流的释放,避免资源泄漏。 - 返回类型调整:将方法返回类型从
Task<ResponseStream>改为Task<string>,直接返回纯文本,匹配你的需求。
若需保留流式处理(如大文本场景),可直接操作ResponseStream对象,但需确保使用完毕后手动释放资源。
内容的提问来源于stack exchange,提问作者Naveen Fernando
相关产品推荐
相关产品推荐

