Skip to content

Commit ed814d8

Browse files
committed
feat: add GET endpoint for retrieving background job as a streamed response
1 parent 00fc120 commit ed814d8

File tree

1 file changed

+75
-2
lines changed

1 file changed

+75
-2
lines changed

src/routes/api/background-jobs.ts

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
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'
38

49
export const ServerRoute = createServerFileRoute(
510
'/api/background-jobs',
@@ -17,7 +22,7 @@ export const ServerRoute = createServerFileRoute(
1722
console.error('Error in background jobs route:', error)
1823

1924
if (error instanceof BackgroundJobError) {
20-
const responseBody = error.message.startsWith('{')
25+
const responseBody = error.message.startsWith('{')
2126
? error.message // Already JSON string for validation errors
2227
: JSON.stringify({ error: error.message })
2328

@@ -33,4 +38,72 @@ export const ServerRoute = createServerFileRoute(
3338
})
3439
}
3540
},
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+
},
36109
})

0 commit comments

Comments
 (0)