@@ -29,11 +29,13 @@ export async function GET() {
2929 return NextResponse . json ( data )
3030 } catch ( error ) {
3131 const { message } = ( error as Error )
32-
33- if ( message . includes ( "fetch failed" ) ) {
34- return NextResponse . json ( { message : "Server is not available" } , { status : 200 } )
32+
33+ // Gracefully handle missing endpoint or server unavailability
34+ // Return empty object to allow chat to be displayed
35+ if ( message . includes ( "fetch failed" ) || message . includes ( "Not Found" ) || message . includes ( "NOT_FOUND" ) || message . includes ( "could not be found" ) ) {
36+ return NextResponse . json ( { message } , { status : 200 } )
3537 }
36-
38+
3739 console . error ( error )
3840 return NextResponse . json ( { error : message } , { status : 400 } )
3941 }
@@ -52,6 +54,7 @@ export async function POST(request: NextRequest) {
5254 const writer = writable . getWriter ( )
5355
5456 try {
57+ // Verify authentication via getClient
5558 const session = await getClient ( )
5659
5760 if ( session instanceof NextResponse ) {
@@ -62,10 +65,11 @@ export async function POST(request: NextRequest) {
6265
6366 // Validate request body
6467 const validation = validateBody ( chatRequest , body ) ;
65-
68+
6669 if ( ! validation . success ) {
6770 writer . write ( encoder . encode ( `event: error status: ${ 400 } data: ${ JSON . stringify ( validation . error ) } \n\n` ) )
6871 writer . close ( )
72+
6973 return new Response ( readable , {
7074 headers : {
7175 "Content-Type" : "text/event-stream" ,
@@ -78,14 +82,15 @@ export async function POST(request: NextRequest) {
7882 const { messages, graphName, key, model } = validation . data
7983
8084 try {
81-
82- const requestBody = {
83- "chat_request" : {
84- messages,
85- } ,
85+ const requestBody : Record < string , unknown > = {
86+ chat_request : { messages } ,
8687 "graph_name" : graphName ,
87- key,
88- model,
88+ "model" : model || "gpt-4o-mini" ,
89+ }
90+
91+ // Only add key if provided
92+ if ( key ) {
93+ requestBody . key = key
8994 }
9095
9196 const response = await fetch ( `${ CHAT_URL } text_to_cypher` , {
@@ -100,38 +105,47 @@ export async function POST(request: NextRequest) {
100105 throw new Error ( `Error: ${ await response . text ( ) } ` ) ;
101106 }
102107
108+ // Handle streaming SSE response from text-to-cypher
103109 const reader = response . body ?. getReader ( ) ;
104110 const decoder = new TextDecoder ( ) ;
105111
106112 const processStream = async ( ) => {
107113 if ( ! reader ) return ;
108114
109115 const { done, value } = await reader . read ( ) ;
110- if ( done ) return ;
116+ if ( done ) {
117+ writer . close ( ) ;
118+ return ;
119+ }
111120
112121 const chunk = decoder . decode ( value , { stream : true } ) ;
113-
114122 const lines = chunk . split ( '\n' ) . filter ( line => line ) ;
115- let isResult = false
116-
123+ let isResult = false ;
117124
118125 lines . forEach ( line => {
119- const data = JSON . parse ( line . split ( "data:" ) [ 1 ] )
120- const type : EventType = Object . keys ( data ) [ 0 ] as EventType
126+ if ( line . startsWith ( 'data: ' ) ) {
127+ try {
128+ const data = JSON . parse ( line . slice ( 6 ) ) ; // Remove 'data: ' prefix
129+ const type : EventType = Object . keys ( data ) [ 0 ] as EventType
121130
122- isResult = type === "Result" || type === "Error"
131+ isResult = type === "Result" || type === "Error"
123132
124- writer . write ( encoder . encode ( `event: ${ type } data: ${ data [ type ] } \n\n` ) )
125- } )
133+ writer . write ( encoder . encode ( `event: ${ type } data: ${ data [ type ] } \n\n` ) )
134+ } catch ( parseError ) {
135+ console . error ( "Failed to parse SSE data:" , line , parseError )
136+ }
137+ }
138+ } ) ;
126139
140+ // Continue processing the stream unless we received Result or Error
127141 if ( ! isResult ) {
128- processStream ( ) ;
142+ await processStream ( ) ;
129143 } else {
130144 writer . close ( ) ;
131145 }
132146 } ;
133147
134- processStream ( )
148+ await processStream ( ) ;
135149 } catch ( error ) {
136150 console . error ( error )
137151 writer . write ( encoder . encode ( `event: error status: ${ 400 } data: ${ JSON . stringify ( ( error as Error ) . message ) } \n\n` ) )
0 commit comments