1
1
import { createServerFileRoute } from '@tanstack/react-start/server'
2
- import { handleJobStatusRequest , BackgroundJobError } from '@/lib/background-jobs'
2
+ import {
3
+ handleJobStatusRequest ,
4
+ BackgroundJobError ,
5
+ } from '@/lib/background-jobs'
6
+ import { streamText } from '@/lib/streaming'
7
+ import OpenAI from 'openai'
3
8
4
9
export const ServerRoute = createServerFileRoute (
5
10
'/api/background-jobs' ,
@@ -17,7 +22,7 @@ export const ServerRoute = createServerFileRoute(
17
22
console . error ( 'Error in background jobs route:' , error )
18
23
19
24
if ( error instanceof BackgroundJobError ) {
20
- const responseBody = error . message . startsWith ( '{' )
25
+ const responseBody = error . message . startsWith ( '{' )
21
26
? error . message // Already JSON string for validation errors
22
27
: JSON . stringify ( { error : error . message } )
23
28
@@ -33,4 +38,72 @@ export const ServerRoute = createServerFileRoute(
33
38
} )
34
39
}
35
40
} ,
41
+ async GET ( { request } ) {
42
+ const url = new URL ( request . url )
43
+ const backgroundJobId = url . searchParams . get ( 'id' )
44
+
45
+ if ( ! backgroundJobId ) {
46
+ return new Response (
47
+ JSON . stringify ( { error : 'Background job ID is required' } ) ,
48
+ {
49
+ status : 400 ,
50
+ headers : { 'Content-Type' : 'application/json' } ,
51
+ } ,
52
+ )
53
+ }
54
+
55
+ const client = new OpenAI ( )
56
+
57
+ try {
58
+ const response = await client . responses . retrieve ( backgroundJobId , {
59
+ stream : true ,
60
+ } )
61
+
62
+ return streamText ( response )
63
+ } catch ( error ) {
64
+ console . error ( 'Error retrieving OpenAI response:' , error )
65
+
66
+ if ( error instanceof OpenAI . APIError ) {
67
+ const statusCode = error . status || 500
68
+ let clientMessage = 'Failed to check background job status'
69
+
70
+ switch ( statusCode ) {
71
+ case 404 :
72
+ clientMessage = 'Background job not found'
73
+ break
74
+ case 401 :
75
+ clientMessage = 'Authentication failed'
76
+ break
77
+ case 403 :
78
+ clientMessage = 'Access denied'
79
+ break
80
+ case 429 :
81
+ clientMessage = 'Rate limit exceeded'
82
+ break
83
+ }
84
+
85
+ return new Response (
86
+ JSON . stringify ( {
87
+ status : 'failed' ,
88
+ error : clientMessage ,
89
+ } ) ,
90
+ {
91
+ status : 200 ,
92
+ headers : { 'Content-Type' : 'application/json' } ,
93
+ } ,
94
+ )
95
+ }
96
+
97
+ return new Response (
98
+ JSON . stringify ( {
99
+ status : 'failed' ,
100
+ error : 'Internal server error' ,
101
+ } ) ,
102
+ {
103
+ status : 500 ,
104
+ headers : { 'Content-Type' : 'application/json' } ,
105
+ } ,
106
+ )
107
+ }
108
+ } ,
36
109
} )
0 commit comments