feat: 兼容cline
This commit is contained in:
@@ -1,10 +1,13 @@
|
|||||||
namespace Yi.Framework.AiHub.Application.Contracts.Dtos.OpenAiDto;
|
using System.Collections;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace Yi.Framework.AiHub.Application.Contracts.Dtos.OpenAiDto;
|
||||||
|
|
||||||
public class ChatCompletionsInput
|
public class ChatCompletionsInput
|
||||||
{
|
{
|
||||||
public List<OpenAiMessage> Messages { get; set; }
|
public List<OpenAiMessage> Messages { get; set; }
|
||||||
|
|
||||||
public bool Stream { get; set; }
|
public bool? Stream { get; set; }
|
||||||
|
|
||||||
public string? Prompt { get; set; }
|
public string? Prompt { get; set; }
|
||||||
public string Model { get; set; }
|
public string Model { get; set; }
|
||||||
@@ -16,6 +19,32 @@ public class ChatCompletionsInput
|
|||||||
|
|
||||||
public class OpenAiMessage
|
public class OpenAiMessage
|
||||||
{
|
{
|
||||||
public string Role { get; set; }
|
public string? Role { get; set; }
|
||||||
public string Content { get; set; }
|
public object? Content { get; set; }
|
||||||
|
|
||||||
|
public string ConvertContent()
|
||||||
|
{
|
||||||
|
if (Content is string content)
|
||||||
|
{
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Content is JsonElement jsonElement && jsonElement.ValueKind == JsonValueKind.Array)
|
||||||
|
{
|
||||||
|
var contentItems = jsonElement.Deserialize<List<ContentItem>>();
|
||||||
|
var currentContentItem = contentItems.FirstOrDefault();
|
||||||
|
if (currentContentItem.type == "text")
|
||||||
|
{
|
||||||
|
return currentContentItem.text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new UserFriendlyException("当前格式暂不支持");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContentItem
|
||||||
|
{
|
||||||
|
public string? type { get; set; }
|
||||||
|
public string? text { get; set; }
|
||||||
}
|
}
|
||||||
@@ -36,27 +36,31 @@ public class OpenApiService : ApplicationService
|
|||||||
/// <param name="input"></param>
|
/// <param name="input"></param>
|
||||||
/// <param name="cancellationToken"></param>
|
/// <param name="cancellationToken"></param>
|
||||||
[HttpPost("openApi/v1/chat/completions")]
|
[HttpPost("openApi/v1/chat/completions")]
|
||||||
public async Task ChatCompletionsAsync(ChatCompletionsInput input, CancellationToken cancellationToken)
|
public async Task ChatCompletionsAsync([FromBody]ChatCompletionsInput input, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
//前面都是校验,后面才是真正的调用
|
//前面都是校验,后面才是真正的调用
|
||||||
var httpContext = this._httpContextAccessor.HttpContext;
|
var httpContext = this._httpContextAccessor.HttpContext;
|
||||||
|
|
||||||
var userId = await _tokenManager.GetUserIdAsync(GetTokenByHttpContext(httpContext));
|
var userId = await _tokenManager.GetUserIdAsync(GetTokenByHttpContext(httpContext));
|
||||||
var history = new List<ChatMessage>();
|
var history = new List<ChatMessage>();
|
||||||
foreach (var aiChatContextDto in input.Messages)
|
foreach (var aiChatContextDto in input.Messages)
|
||||||
{
|
{
|
||||||
if (aiChatContextDto.Role == "assistant")
|
if (aiChatContextDto.Role == "assistant")
|
||||||
{
|
{
|
||||||
history.Add(ChatMessage.CreateAssistantMessage(aiChatContextDto.Content));
|
history.Add(ChatMessage.CreateAssistantMessage(aiChatContextDto.ConvertContent()));
|
||||||
}
|
}
|
||||||
else if (aiChatContextDto.Role == "user")
|
else if (aiChatContextDto.Role == "user")
|
||||||
{
|
{
|
||||||
history.Add(ChatMessage.CreateUserMessage(aiChatContextDto.Content));
|
history.Add(ChatMessage.CreateUserMessage(aiChatContextDto.ConvertContent()));
|
||||||
|
}
|
||||||
|
else if (aiChatContextDto.Role == "system")
|
||||||
|
{
|
||||||
|
history.Add(ChatMessage.CreateSystemMessage(aiChatContextDto.ConvertContent()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//是否使用流式传输
|
//是否使用流式传输
|
||||||
if (input.Stream)
|
if (input.Stream == true)
|
||||||
{
|
{
|
||||||
//ai网关代理httpcontext
|
//ai网关代理httpcontext
|
||||||
await _aiGateWayManager.CompleteChatStreamForStatisticsAsync(_httpContextAccessor.HttpContext, input.Model,
|
await _aiGateWayManager.CompleteChatStreamForStatisticsAsync(_httpContextAccessor.HttpContext, input.Model,
|
||||||
|
|||||||
Reference in New Issue
Block a user