LMS.service/LMS.service/Controllers/ForwardController.cs

74 lines
2.3 KiB
C#

using LMS.DAO;
using LMS.Repository.Forward;
using LMS.service.Service;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using static LMS.Common.Enums.ResponseCodeEnum;
namespace LMS.service.Controllers;
[Route("lms/[controller]/[action]")]
[ApiController]
public class ForwardController(ForwardWordService forwardWordService) : ControllerBase
{
private readonly ForwardWordService _forwardWordService = forwardWordService;
/// <summary>
/// 转发OpenAi格式的请求
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult<APIResponseModel<object>>> ForwardWord([FromBody] ForwardModel request)
{
if (!ModelState.IsValid)
{
return APIResponseModel<object>.CreateErrorResponseModel(ResponseCode.ParameterError);
}
return await _forwardWordService.ForwardWord(request);
}
/// <summary>
/// 流式转发
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> ForwardWordStream([FromBody] ForwardModel req)
{
try
{
HttpContext.Response.ContentType = "text/event-stream";
HttpContext.Response.Headers.Add("Cache-Control", "no-cache");
HttpContext.Response.Headers.Add("Connection", "keep-alive");
var settings = new JsonSerializerSettings
{
ContractResolver = new LowercaseContractResolver(),
Formatting = Formatting.Indented
};
await foreach (var s in _forwardWordService.ForwardWordStream(req))
{
// 确保遵循SSE的消息格式
//var data = "data: " + JsonConvert.SerializeObject(s, settings) + "\n\n";
await Response.WriteAsync(s);
await Response.Body.FlushAsync(); // 确保即时发送
}
}
catch (Exception e)
{
return BadRequest(e.Message);
}
return new EmptyResult();
}
public class LowercaseContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
return propertyName.ToLower();
}
}
}