@@ -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