@@ -200,6 +200,80 @@ public async Task<ApiResult> ApplyApis([FromBody] AiApplyApisRequest req)
200200 }
201201 catch ( Exception ex ) { return ApiResult . Fail ( ex . Message ) ; }
202202 }
203+
204+ // ==================== 自定义助手 ====================
205+
206+ /// <summary>助手列表(管理页)</summary>
207+ [ HttpGet ( "assistants" ) ]
208+ public async Task < ApiResult > Assistants ( )
209+ => ApiResult . Success ( await _db . AiAssistants . Where ( a => a . Deleted == 0 ) . OrderByDescending ( a => a . Id ) . ToListAsync ( ) ) ;
210+
211+ /// <summary>启用的助手(菜单用)</summary>
212+ [ HttpGet ( "assistants/enabled" ) ]
213+ public async Task < ApiResult > EnabledAssistants ( )
214+ => ApiResult . Success ( await _db . AiAssistants . Where ( a => a . Deleted == 0 && a . Enabled == 1 ) . OrderBy ( a => a . Id ) . ToListAsync ( ) ) ;
215+
216+ /// <summary>新增/更新助手</summary>
217+ [ HttpPost ( "assistant/save" ) ]
218+ public async Task < ApiResult > SaveAssistant ( [ FromBody ] AiAssistantSaveRequest req )
219+ {
220+ AiAssistantEntity entity ;
221+ if ( req . Id > 0 )
222+ {
223+ entity = await _db . AiAssistants . FindAsync ( req . Id ) ?? throw new Exception ( "助手不存在" ) ;
224+ }
225+ else
226+ {
227+ entity = new AiAssistantEntity { CreatedAt = DateTime . Now . ToString ( "o" ) , TenantId = _tenant . TenantId } ;
228+ _db . AiAssistants . Add ( entity ) ;
229+ }
230+ entity . AssistantName = req . AssistantName ;
231+ entity . Description = req . Description ;
232+ entity . SystemPrompt = req . SystemPrompt ;
233+ entity . InputParams = req . InputParams ;
234+ entity . OutputParams = req . OutputParams ;
235+ entity . Enabled = req . Enabled ? 1 : 0 ;
236+ entity . UpdatedAt = DateTime . Now . ToString ( "o" ) ;
237+ await _db . SaveChangesAsync ( ) ;
238+ return ApiResult . Success ( entity . Id ) ;
239+ }
240+
241+ /// <summary>删除助手</summary>
242+ [ HttpDelete ( "assistant/{id}" ) ]
243+ public async Task < ApiResult > DeleteAssistant ( long id )
244+ {
245+ var entity = await _db . AiAssistants . FindAsync ( id ) ;
246+ if ( entity == null ) return ApiResult . Fail ( "助手不存在" ) ;
247+ entity . Deleted = 1 ;
248+ await _db . SaveChangesAsync ( ) ;
249+ return ApiResult . Success ( ) ;
250+ }
251+
252+ /// <summary>启用/禁用助手</summary>
253+ [ HttpPost ( "assistant/toggle" ) ]
254+ public async Task < ApiResult > ToggleAssistant ( [ FromBody ] AiAssistantToggleRequest req )
255+ {
256+ var entity = await _db . AiAssistants . FindAsync ( req . Id ) ;
257+ if ( entity == null ) return ApiResult . Fail ( "助手不存在" ) ;
258+ entity . Enabled = req . Enabled ? 1 : 0 ;
259+ entity . UpdatedAt = DateTime . Now . ToString ( "o" ) ;
260+ await _db . SaveChangesAsync ( ) ;
261+ return ApiResult . Success ( ) ;
262+ }
263+
264+ /// <summary>运行助手:输入参数 + 补充说明 → 大模型 → 输出参数(JSON)与原文</summary>
265+ [ HttpPost ( "assistant-run" ) ]
266+ public async Task < ApiResult > RunAssistant ( [ FromBody ] AiAssistantRunRequest req )
267+ {
268+ try
269+ {
270+ var assistant = await _db . AiAssistants . FirstOrDefaultAsync ( a => a . Id == req . AssistantId && a . Deleted == 0 )
271+ ?? throw new Exception ( "助手不存在" ) ;
272+ var result = await _aiService . RunAssistantAsync ( assistant , req . Inputs , req . ExtraText , req . ProviderId , req . Model ) ;
273+ return ApiResult . Success ( result ) ;
274+ }
275+ catch ( Exception ex ) { return ApiResult . Fail ( ex . Message ) ; }
276+ }
203277}
204278
205279public class AiConfigRequest
@@ -264,3 +338,29 @@ public class AiFetchModelsRequest
264338 public string BaseUrl { get ; set ; } = "" ;
265339 public string ApiKey { get ; set ; } = "" ;
266340}
341+
342+ public class AiAssistantSaveRequest
343+ {
344+ public long Id { get ; set ; }
345+ public string AssistantName { get ; set ; } = "" ;
346+ public string ? Description { get ; set ; }
347+ public string ? SystemPrompt { get ; set ; }
348+ public string ? InputParams { get ; set ; }
349+ public string ? OutputParams { get ; set ; }
350+ public bool Enabled { get ; set ; } = true ;
351+ }
352+
353+ public class AiAssistantToggleRequest
354+ {
355+ public long Id { get ; set ; }
356+ public bool Enabled { get ; set ; }
357+ }
358+
359+ public class AiAssistantRunRequest
360+ {
361+ public long AssistantId { get ; set ; }
362+ public long ProviderId { get ; set ; }
363+ public string ? Model { get ; set ; }
364+ public Dictionary < string , object ? > ? Inputs { get ; set ; }
365+ public string ? ExtraText { get ; set ; }
366+ }
0 commit comments