Skip to content

Commit dad6c46

Browse files
pythonHuangclaude
andcommitted
fix: 补提交助手模型参数功能遗漏的AiService改动-ChatAsync/ChatMessagesAsync扩展温度/最大输出/随机种子/深度思考参数(请求体透传enable_thinking/max_tokens/seed),StartConversationAsync快照助手模型参数到会话,ConversationChatAsync/EndConversationAsync/RunAssistantAsync按会话或助手参数调用
Co-Authored-By: Claude Code <noreply@anthropic.com>
1 parent aaf407d commit dad6c46

1 file changed

Lines changed: 40 additions & 23 deletions

File tree

‎Juggle.Application/Services/Impl/AiService.cs‎

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,15 @@ private async Task<AiConfig> ResolveConfigAsync(long? providerId)
9797
// ==================== 对话 ====================
9898

9999
/// <summary>调用大模型对话(OpenAI 兼容接口)。providerId 指定供应商,0=第一个启用供应商;modelOverride 可在供应商可用模型内切换。</summary>
100-
public async Task<string> ChatAsync(string systemPrompt, string userPrompt, long providerId = 0, AiConfig? config = null, string? modelOverride = null)
100+
public async Task<string> ChatAsync(string systemPrompt, string userPrompt, long providerId = 0, AiConfig? config = null, string? modelOverride = null,
101+
double? temperature = null, int? maxTokens = null, int? seed = null, bool enableThinking = false)
101102
{
102103
var messages = new List<(string Role, string Content)>
103104
{
104105
("system", systemPrompt),
105106
("user", userPrompt)
106107
};
107-
return await ChatMessagesAsync(messages, providerId, config, modelOverride);
108+
return await ChatMessagesAsync(messages, providerId, config, modelOverride, temperature, maxTokens, seed, enableThinking);
108109
}
109110

110111
/// <summary>视觉对话:文本 + 图片(OpenAI 兼容多模态 content 数组)。</summary>
@@ -149,8 +150,9 @@ public async Task<string> ChatWithImagesAsync(string systemPrompt, string userTe
149150
return doc.RootElement.GetProperty("choices")[0].GetProperty("message").GetProperty("content").GetString()?.Trim() ?? "";
150151
}
151152

152-
/// <summary>多轮对话:完整消息列表(system + 历史消息)一次性发送。</summary>
153-
public async Task<string> ChatMessagesAsync(List<(string Role, string Content)> messages, long providerId = 0, AiConfig? config = null, string? modelOverride = null)
153+
/// <summary>多轮对话:完整消息列表(system + 历史消息)一次性发送(支持温度/最大输出/随机种子/深度思考等模型参数)。</summary>
154+
public async Task<string> ChatMessagesAsync(List<(string Role, string Content)> messages, long providerId = 0, AiConfig? config = null, string? modelOverride = null,
155+
double? temperature = null, int? maxTokens = null, int? seed = null, bool enableThinking = false)
154156
{
155157
var cfg = config ?? await ResolveConfigAsync(providerId > 0 ? providerId : null);
156158
if (!string.IsNullOrEmpty(modelOverride)) cfg.Model = modelOverride;
@@ -161,16 +163,21 @@ public async Task<string> ChatMessagesAsync(List<(string Role, string Content)>
161163
if (!url.EndsWith("/chat/completions", StringComparison.OrdinalIgnoreCase))
162164
url += "/chat/completions";
163165

166+
var payload = new Dictionary<string, object?>
167+
{
168+
["model"] = cfg.Model,
169+
["messages"] = messages.Select(m => new { role = m.Role, content = m.Content }).ToArray(),
170+
["temperature"] = temperature ?? 0.2
171+
};
172+
if (maxTokens is > 0) payload["max_tokens"] = maxTokens.Value;
173+
if (seed.HasValue) payload["seed"] = seed.Value;
174+
if (enableThinking) payload["enable_thinking"] = true;
175+
164176
var client = _httpClientFactory.CreateClient();
165177
client.Timeout = TimeSpan.FromSeconds(180);
166178
using var reqMsg = new HttpRequestMessage(HttpMethod.Post, url);
167179
reqMsg.Headers.TryAddWithoutValidation("Authorization", $"Bearer {cfg.ApiKey}");
168-
reqMsg.Content = new StringContent(JsonSerializer.Serialize(new
169-
{
170-
model = cfg.Model,
171-
messages = messages.Select(m => new { role = m.Role, content = m.Content }).ToArray(),
172-
temperature = 0.2
173-
}), Encoding.UTF8, "application/json");
180+
reqMsg.Content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
174181

175182
using var resp = await client.SendAsync(reqMsg);
176183
var body = await resp.Content.ReadAsStringAsync();
@@ -798,7 +805,11 @@ public async Task<object> RunAssistantAsync(AiAssistantEntity assistant, Diction
798805
sb.AppendLine($"请只输出 JSON(不要解释、不要 markdown 围栏),字段:{names},其中 {descs}。");
799806
}
800807

801-
var content = await ChatAsync(assistant.SystemPrompt ?? "你是一个智能助手。", sb.ToString(), providerId, modelOverride: model);
808+
var content = await ChatAsync(assistant.SystemPrompt ?? "你是一个智能助手。", sb.ToString(),
809+
providerId > 0 ? providerId : assistant.ProviderId,
810+
modelOverride: string.IsNullOrWhiteSpace(model) ? assistant.Model : model,
811+
temperature: assistant.Temperature, maxTokens: assistant.MaxTokens,
812+
seed: assistant.Seed, enableThinking: assistant.EnableThinking == 1);
802813

803814
var outputs = new Dictionary<string, object?>();
804815
if (outputParams.Count > 0)
@@ -842,16 +853,20 @@ public async Task<AiConversationEntity> StartConversationAsync(AiAssistantEntity
842853
{
843854
var conv = new AiConversationEntity
844855
{
845-
AssistantId = assistant.Id,
846-
AssistantName = assistant.AssistantName,
847-
SystemPrompt = assistant.SystemPrompt,
848-
InputParams = assistant.InputParams,
849-
OutputParams = assistant.OutputParams,
850-
ProviderId = providerId,
851-
Model = model,
852-
Messages = "[]",
853-
Status = 0,
854-
CreatedAt = DateTime.Now.ToString("o")
856+
AssistantId = assistant.Id,
857+
AssistantName = assistant.AssistantName,
858+
SystemPrompt = assistant.SystemPrompt,
859+
InputParams = assistant.InputParams,
860+
OutputParams = assistant.OutputParams,
861+
ProviderId = providerId > 0 ? providerId : assistant.ProviderId,
862+
Model = string.IsNullOrWhiteSpace(model) ? assistant.Model : model,
863+
Temperature = assistant.Temperature,
864+
MaxTokens = assistant.MaxTokens,
865+
Seed = assistant.Seed,
866+
EnableThinking = assistant.EnableThinking,
867+
Messages = "[]",
868+
Status = 0,
869+
CreatedAt = DateTime.Now.ToString("o")
855870
};
856871
// 输入参数并入系统上下文(每轮对话可见)
857872
var inputParams = ParseParamList(assistant.InputParams);
@@ -879,7 +894,8 @@ public async Task<string> ConversationChatAsync(AiConversationEntity conv, strin
879894
history.Add(("user", userContent));
880895
var messages = new List<(string, string)> { ("system", conv.SystemPrompt ?? "") };
881896
messages.AddRange(history);
882-
var reply = await ChatMessagesAsync(messages, providerId, null, model);
897+
var reply = await ChatMessagesAsync(messages, providerId, null, model,
898+
conv.Temperature, conv.MaxTokens, conv.Seed, conv.EnableThinking == 1);
883899
history.Add(("assistant", reply));
884900
conv.Messages = JsonSerializer.Serialize(history.Select(m => new { role = m.Role, content = m.Content }));
885901
if (string.IsNullOrEmpty(conv.Title))
@@ -903,7 +919,8 @@ public async Task<object> EndConversationAsync(AiConversationEntity conv, long p
903919
var messages = new List<(string, string)> { ("system", conv.SystemPrompt ?? "") };
904920
messages.AddRange(ParseMessages(conv.Messages));
905921
messages.Add(("user", $"请根据以上对话生成最终结果,只输出 JSON(不要解释、不要 markdown 围栏),字段:{names},其中 {descs}。"));
906-
finalReply = await ChatMessagesAsync(messages, providerId, null, model);
922+
finalReply = await ChatMessagesAsync(messages, providerId, null, model,
923+
conv.Temperature, conv.MaxTokens, conv.Seed, conv.EnableThinking == 1);
907924
try
908925
{
909926
var json = ExtractJson(finalReply);

0 commit comments

Comments
 (0)