Azure PersistentAgent 如何获取并下载模型生成的文件?
结论:documented_codes.txt 只是助手消息中提到的文件名,不能证明文件已经生成,也不能直接用于下载。示例里的 fileId 来自 client.Files.UploadFile(...),标识的是上传给 Agent 的输入文件。MessageImageFileContent 只用于处理图片消息内容,无法用来查找文本文件。
先确认运行是否成功
当前代码会等待 Run 离开 Queued 或 InProgress 状态,但没有检查最终状态。如果运行失败或尚未完成,助手仍可能返回看似成功的文本。请先检查 run.Status;如果不是 RunStatus.Completed,再查看 run.LastError?.Message。
查找生成文件的标识
下载文件需要从服务返回的文件引用中获取生成文件的 ID。有些 API 流程还需要 container_id。不能根据 documented_codes.txt 这个名称推导出 ID。
当前代码遍历的是消息内容,只处理 MessageTextContent 和 MessageImageFileContent。其中这段代码:
else if (contentItem is MessageImageFileContent imageFileItem)
{
Console.Write($"<image from ID: {imageFileItem.FileId}");
}
只能输出图片内容对应的 ID。请根据所用的 SDK 版本和 API 流程,检查 Run 的工具调用输出及消息注释,确认响应中是否包含生成文件的引用。如果响应里只有助手的文字回复和文件名,就还没有可用于下载的文件 ID。需要让 Agent 返回实际的文件引用,或确认文件生成步骤是否成功。
根据所用 API 下载文件
下载方式取决于生成文件所属的 API 和 SDK 版本。较新的 Microsoft Foundry C# 示例会从响应的 ContainerFileCitationMessageAnnotation 中读取 ContainerId 和 FileId,再用 ContainerClient.DownloadContainerFile(...) 获取文件内容并写入本地文件。例如:
ContainerClient containerClient = projectClient.ProjectOpenAIClient.GetContainerClient();
BinaryData fileData = containerClient.DownloadContainerFile(
containerId: containerAnnotation.ContainerId,
fileId: containerAnnotation.FileId);
File.WriteAllBytes("documented_codes.txt", fileData.ToArray());
这个示例适用于响应中包含该类注释且使用容器客户端的 API 流程。你的代码使用的是 Azure.AI.Agents.Persistent 的线程与消息接口,不能直接假设它会返回相同类型的注释。请核对当前安装的 SDK 版本和对应 API,并使用该版本实际提供的文件内容下载操作。Files.GetFile(fileId) 返回的是文件信息,不是文件内容;Microsoft Learn 的 API 说明对此有明确区分。当前 Foundry C# 下载示例展示了从文件注释中提取容器和文件 ID,再下载内容的流程:Code Interpreter 文件下载示例。
清理资源前保存文件
先下载并保存文件,再删除 Thread 或 Agent。示例末尾的删除代码无法帮助获取文件 ID。排查时如果还需要查看运行和消息记录,可以暂时保留相关资源,等确认已拿到文件内容后再清理。
备注:内容仅供参考。
