@@ -24,117 +24,77 @@ public ChatController(ILogger<ChatController> logger, AIChatService aiChatServic
2424 [ HttpPost ( "message" ) ]
2525 public async Task < IActionResult > SendMessage ( [ FromBody ] ChatMessageRequest request , CancellationToken cancellationToken = default )
2626 {
27- try
27+ if ( string . IsNullOrWhiteSpace ( request . Message ) )
2828 {
29- if ( _AiChatService == null )
30- {
31- return StatusCode ( 503 , new { error = "AI Chat service is not available. Please check the configuration and try again later." } ) ;
32- }
33-
34- if ( string . IsNullOrWhiteSpace ( request . Message ) )
35- {
36- return BadRequest ( new { error = "Message cannot be empty." } ) ;
37- }
38-
39- // Require user authentication for chat
40- if ( ! User . Identity ? . IsAuthenticated ?? true )
41- {
42- return Unauthorized ( new { error = "User must be logged in to use chat." } ) ;
43- }
44-
45- var ( response , responseId ) = await _AiChatService . GetChatCompletion (
46- prompt : request . Message ,
47- systemPrompt : request . SystemPrompt ,
48- previousResponseId : request . PreviousResponseId ,
49- enableContextualSearch : request . EnableContextualSearch ,
50- cancellationToken : cancellationToken ) ;
51-
52- return Ok ( new ChatMessageResponse
53- {
54- Response = response ,
55- ResponseId = responseId ,
56- Timestamp = DateTime . UtcNow
57- } ) ;
29+ return BadRequest ( new { error = "Message cannot be empty." } ) ;
5830 }
59- catch ( OperationCanceledException )
31+
32+ // Require user authentication for chat
33+ if ( ! User . Identity ? . IsAuthenticated ?? true )
6034 {
61- return StatusCode ( 499 , new { error = "Request was cancelled ." } ) ;
35+ return Unauthorized ( new { error = "User must be logged in to use chat ." } ) ;
6236 }
63- catch ( Exception ex )
37+
38+ var ( response , responseId ) = await _AiChatService . GetChatCompletion (
39+ prompt : request . Message ,
40+ systemPrompt : request . SystemPrompt ,
41+ previousResponseId : request . PreviousResponseId ,
42+ enableContextualSearch : request . EnableContextualSearch ,
43+ cancellationToken : cancellationToken ) ;
44+
45+ return Ok ( new ChatMessageResponse
6446 {
65- var sanitizedMessage = request . Message ? . Replace ( " \r " , "" ) . Replace ( " \n " , "" ) ;
66- _Logger . LogError ( ex , "Error processing chat message: {Message}" , sanitizedMessage ) ;
67- return StatusCode ( 500 , new { error = "An error occurred while processing your message. Please try again." } ) ;
68- }
47+ Response = response ,
48+ ResponseId = responseId ,
49+ Timestamp = DateTime . UtcNow
50+ } ) ;
6951 }
7052
7153 [ HttpPost ( "stream" ) ]
7254 public async Task StreamMessage ( [ FromBody ] ChatMessageRequest request , CancellationToken cancellationToken = default )
7355 {
74- try
56+ if ( string . IsNullOrWhiteSpace ( request . Message ) )
7557 {
76- if ( _AiChatService == null )
77- {
78- Response . StatusCode = 503 ;
79- await Response . WriteAsync ( JsonSerializer . Serialize ( new { error = "AI Chat service is not available. Please check the configuration and try again later." } ) , cancellationToken ) ;
80- return ;
81- }
58+ Response . StatusCode = 400 ;
59+ await Response . WriteAsync ( JsonSerializer . Serialize ( new { error = "Message cannot be empty." } ) , cancellationToken ) ;
60+ return ;
61+ }
8262
83- if ( string . IsNullOrWhiteSpace ( request . Message ) )
84- {
85- Response . StatusCode = 400 ;
86- await Response . WriteAsync ( JsonSerializer . Serialize ( new { error = "Message cannot be empty." } ) , cancellationToken ) ;
87- return ;
88- }
63+ // Require user authentication for chat
64+ if ( ! User . Identity ? . IsAuthenticated ?? true )
65+ {
66+ Response . StatusCode = 401 ;
67+ await Response . WriteAsync ( JsonSerializer . Serialize ( new { error = "User must be logged in to use chat." } ) , cancellationToken ) ;
68+ return ;
69+ }
8970
90- // Require user authentication for chat
91- if ( ! User . Identity ? . IsAuthenticated ?? true )
71+ Response . ContentType = "text/event-stream" ;
72+ Response . Headers . CacheControl = "no-cache" ;
73+ Response . Headers . Connection = "keep-alive" ;
74+
75+ await foreach ( var ( text , responseId ) in _AiChatService . GetChatCompletionStream (
76+ prompt : request . Message ,
77+ systemPrompt : request . SystemPrompt ,
78+ previousResponseId : request . PreviousResponseId ,
79+ enableContextualSearch : request . EnableContextualSearch ,
80+ cancellationToken : cancellationToken ) )
81+ {
82+ if ( ! string . IsNullOrEmpty ( text ) )
9283 {
93- Response . StatusCode = 401 ;
94- await Response . WriteAsync ( JsonSerializer . Serialize ( new { error = "User must be logged in to use chat." } ) , cancellationToken ) ;
95- return ;
84+ var eventData = JsonSerializer . Serialize ( new { type = "text" , data = text } ) ;
85+ await Response . WriteAsync ( $ "data: { eventData } \n \n " , cancellationToken ) ;
86+ await Response . Body . FlushAsync ( cancellationToken ) ;
9687 }
9788
98- Response . ContentType = "text/event-stream" ;
99- Response . Headers . CacheControl = "no-cache" ;
100- Response . Headers . Connection = "keep-alive" ;
101-
102- await foreach ( var ( text , responseId ) in _AiChatService . GetChatCompletionStream (
103- prompt : request . Message ,
104- systemPrompt : request . SystemPrompt ,
105- previousResponseId : request . PreviousResponseId ,
106- enableContextualSearch : request . EnableContextualSearch ,
107- cancellationToken : cancellationToken ) )
89+ if ( ! string . IsNullOrEmpty ( responseId ) )
10890 {
109- if ( ! string . IsNullOrEmpty ( text ) )
110- {
111- var eventData = JsonSerializer . Serialize ( new { type = "text" , data = text } ) ;
112- await Response . WriteAsync ( $ "data: { eventData } \n \n ", cancellationToken ) ;
113- await Response . Body . FlushAsync ( cancellationToken ) ;
114- }
115-
116- if ( ! string . IsNullOrEmpty ( responseId ) )
117- {
118- var eventData = JsonSerializer . Serialize ( new { type = "responseId" , data = responseId } ) ;
119- await Response . WriteAsync ( $ "data: { eventData } \n \n ", cancellationToken ) ;
120- await Response . Body . FlushAsync ( cancellationToken ) ;
121- }
91+ var eventData = JsonSerializer . Serialize ( new { type = "responseId" , data = responseId } ) ;
92+ await Response . WriteAsync ( $ "data: { eventData } \n \n ", cancellationToken ) ;
93+ await Response . Body . FlushAsync ( cancellationToken ) ;
12294 }
123-
124- await Response . WriteAsync ( "data: [DONE]\n \n " , cancellationToken ) ;
125- await Response . Body . FlushAsync ( cancellationToken ) ;
126- }
127- catch ( OperationCanceledException )
128- {
129- Response . StatusCode = 499 ;
130- await Response . WriteAsync ( JsonSerializer . Serialize ( new { error = "Request was cancelled." } ) , cancellationToken ) ;
131- }
132- catch ( Exception ex )
133- {
134- var sanitizedMessage = request . Message ? . Replace ( "\n " , "" ) . Replace ( "\r " , "" ) ;
135- _Logger . LogError ( ex , "Error processing streaming chat message: {Message}" , sanitizedMessage ) ;
136- Response . StatusCode = 500 ;
137- await Response . WriteAsync ( JsonSerializer . Serialize ( new { error = "An error occurred while processing your message. Please try again." } ) , cancellationToken ) ;
13895 }
96+
97+ await Response . WriteAsync ( "data: [DONE]\n \n " , cancellationToken ) ;
98+ await Response . Body . FlushAsync ( cancellationToken ) ;
13999 }
140100}
0 commit comments