Files
QYZH.InteractiveMagazine/QYZH.InteractiveMagazine.WebApi/Controllers/AiChatController.cs
glz 3c3453668f refactor: 重构AI聊天服务为流式返回,优化OOS路径与仓库初始化逻辑
1. 重构AI聊天接口与实现为流式返回,支持SSE协议
2. 修正BaseRepository的数据库上下文初始化逻辑
3. 更新AutoDotCodeConsumer的OOS存储路径
4. 新增阿里云OSS配置项到appsettings
5. 优化AiChatService的日志与代码注释
2026-06-24 18:25:25 +08:00

63 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.AspNetCore.Mvc;
using QYZH.InteractiveMagazine.IService;
using QYZH.InteractiveMagazine.Models.Dto;
using QYZH.InteractiveMagazine.Models.Enum;
using System.Text.Json;
namespace QYZH.InteractiveMagazine.WebApi.Controllers;
/// <summary>
/// AI聊天控制器
/// </summary>
[Route("api/[controller]")]
[ApiController]
[ApiExplorerSettings(GroupName = nameof(ApiVersionEnum.Platform))]
public class AiChatController : BaseController
{
private readonly IAiChatService _aiChatService;
private readonly ILogger<AiChatController> _logger;
public AiChatController(IAiChatService aiChatService, ILogger<AiChatController> logger)
{
_aiChatService = aiChatService;
_logger = logger;
}
/// <summary>
/// AI聊天流式返回根据需求生成提示词
/// </summary>
/// <param name="input">用户需求消息</param>
/// <returns>SSE流逐块返回AI生成的提示词内容</returns>
[HttpPost]
public async Task ChatAsync([FromBody] AiChatInput input)
{
Response.ContentType = "text/event-stream";
Response.Headers.Append("Cache-Control", "no-cache");
Response.Headers.Append("Connection", "keep-alive");
try
{
await foreach (var chunk in _aiChatService.ChatAsync(input, HttpContext.RequestAborted))
{
var data = JsonSerializer.Serialize(new { content = chunk });
await Response.WriteAsync($"data: {data}\n\n");
await Response.Body.FlushAsync();
}
await Response.WriteAsync("data: [DONE]\n\n");
await Response.Body.FlushAsync();
}
catch (OperationCanceledException)
{
_logger.LogInformation("客户端断开连接AI聊天流式返回终止");
}
catch (Exception ex)
{
_logger.LogError(ex, "AI聊天流式返回异常参数{Input}", input);
var errorData = JsonSerializer.Serialize(new { error = "AI聊天失败请稍后重试" });
await Response.WriteAsync($"data: {errorData}\n\n");
await Response.Body.FlushAsync();
}
}
}