diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChat.cs b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChat.cs
index 202a568..9fb0e0b 100644
--- a/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChat.cs
+++ b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChat.cs
@@ -13,6 +13,7 @@ using System.Net.Http.Json;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Serialization;
+using HuanMeng.MiaoYu.Code.Chat.Claude.Model;
namespace HuanMeng.MiaoYu.Code.Chat.Claude
{
@@ -21,6 +22,13 @@ namespace HuanMeng.MiaoYu.Code.Chat.Claude
///
public class ClaudeChat(ClaudeChatConfig claudeChatConfig, IHttpClientFactory factory) : IChat
{
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
public async Task MessagesAsync(BaseChatParams chatParams)
{
var claudeChatChatParams = chatParams as ClaudeChatChatParams;
@@ -52,20 +60,71 @@ namespace HuanMeng.MiaoYu.Code.Chat.Claude
};
string json = JsonConvert.SerializeObject(chatParams, settings);
var content = new StringContent(json, Encoding.UTF8, "application/json");
- //HttpClientHandler httpClientHandler = new HttpClientHandler();
- //HttpContent httpContent = new JsonContent();
var response = await httpClient.PostAsync(claudeChatConfig.RequestUrl, content);
if (response.IsSuccessStatusCode)
{
- var chatInfo = response.Content.ReadFromJsonAsync();
+ var chatInfo = await response.Content.ReadFromJsonAsync();
+ return chatInfo;
}
}
- throw new NotImplementedException();
+ return null;
}
- public IAsyncEnumerable MessagesStreamAsync(BaseChatParams chatParams)
+ public async IAsyncEnumerable MessagesStreamAsync(BaseChatParams chatParams)
{
- throw new NotImplementedException();
+ var claudeChatChatParams = chatParams as ClaudeChatChatStreamParams;
+ if (claudeChatChatParams == null)
+ {
+ throw new ArgumentException("参数异常");
+ }
+ //添加默认值
+ if (claudeChatChatParams.MaxTokens == 0)
+ {
+ claudeChatChatParams.MaxTokens = claudeChatConfig.MaxTokens;
+ }
+ claudeChatChatParams.Stream = true;
+ //添加默认值
+ if (!string.IsNullOrEmpty(claudeChatChatParams.Model))
+ {
+ claudeChatChatParams.Model = claudeChatChatParams.Model;
+ }
+ //去线程池里拿http线程
+ using (var httpClient = factory.CreateClient())
+ {
+ // 设置请求头
+ httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
+ httpClient.DefaultRequestHeaders.Add("x-api-key", claudeChatConfig.ApiKey);
+ httpClient.DefaultRequestHeaders.Add("anthropic-version", claudeChatConfig.AnthropicVersion);
+
+ var settings = new JsonSerializerSettings
+ {
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ };
+ string json = JsonConvert.SerializeObject(chatParams, settings);
+ var content = new StringContent(json, Encoding.UTF8, "application/json");
+ var response = await httpClient.PostAsync(claudeChatConfig.RequestUrl, content);
+ if (response.IsSuccessStatusCode)
+ {
+ var chatInfo = await response.Content.ReadFromJsonAsync();
+ if (chatInfo?.Type == "message_delta")
+ {
+ claudeChatChatParams.OutCharResponse.Usage.OutputTokens = chatInfo.Usage?.OutputTokens ?? 0;
+ }
+ else if (chatInfo?.Type == "content_block_start")
+ {
+ claudeChatChatParams.OutCharResponse = chatInfo?.Message ?? new ClaudeChatResponse();
+ }
+ else if (chatInfo?.Type == "content_block_delta")
+ {
+ var text = chatInfo?.Delta?.Text ?? "";
+ if (!string.IsNullOrEmpty(text))
+ {
+ yield return text;
+ }
+ }
+ claudeChatChatParams.OutObj.Add(chatInfo);
+ }
+ }
}
}
}
diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChatChatParams.cs b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChatChatParams.cs
index a74971c..56e99f7 100644
--- a/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChatChatParams.cs
+++ b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChatChatParams.cs
@@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace HuanMeng.MiaoYu.Code.Chat.Claude
{
///
- /// Claude3 请求的参数
+ /// Claude3 请求的参数
///
public class ClaudeChatChatParams : BaseClaudeChatChatParams
{
diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChatChatStreamParams.cs b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChatChatStreamParams.cs
new file mode 100644
index 0000000..50edb61
--- /dev/null
+++ b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Claude/ClaudeChatChatStreamParams.cs
@@ -0,0 +1,31 @@
+using HuanMeng.MiaoYu.Code.Chat.Claude.Model;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HuanMeng.MiaoYu.Code.Chat.Claude
+{
+ ///
+ /// 实时流
+ ///
+ public class ClaudeChatChatStreamParams : BaseClaudeChatChatParams
+ {
+ ///
+ /// 视频流
+ ///
+ public bool Stream { get; set; }
+
+ ///
+ /// 返回消息内容
+ ///
+ public ClaudeChatResponse OutCharResponse { get; set; }
+
+ ///
+ ///
+ ///
+ public List