import { OPENAI_API_HOST, OPENAI_API_TYPE, OPENAI_API_VERSION, OPENAI_ORGANIZATION } from '@/utils/app/const'; import { OpenAIModel, OpenAIModelID, OpenAIModels } from '@/types/openai'; export const config = { runtime: 'edge', }; const handler = async (req: Request): Promise => { try { const { key } = (await req.json()) as { key: string; }; let url = `${OPENAI_API_HOST}/v1/models`; if (OPENAI_API_TYPE === 'azure') { url = `${OPENAI_API_HOST}/openai/deployments?api-version=${OPENAI_API_VERSION}`; } const response = await fetch(url, { headers: { 'Content-Type': 'application/json', ...(OPENAI_API_TYPE === 'openai' && { Authorization: `Bearer ${key ? key : process.env.OPENAI_API_KEY}` }), ...(OPENAI_API_TYPE === 'azure' && { 'api-key': `${key ? key : process.env.OPENAI_API_KEY}` }), ...((OPENAI_API_TYPE === 'openai' && OPENAI_ORGANIZATION) && { 'OpenAI-Organization': OPENAI_ORGANIZATION, }), }, }); if (response.status === 401) { return new Response(response.body, { status: 500, headers: response.headers, }); } else if (response.status !== 200) { console.error( `OpenAI API returned an error ${ response.status }: ${await response.text()}`, ); throw new Error('OpenAI API returned an error'); } const json = await response.json(); const models: OpenAIModel[] = json.data .map((model: any) => { const model_name = (OPENAI_API_TYPE === 'azure') ? model.model : model.id; for (const [key, value] of Object.entries(OpenAIModelID)) { if (value === model_name) { return { id: model.id, name: OpenAIModels[value].name, }; } } }) .filter(Boolean); return new Response(JSON.stringify(models), { status: 200 }); } catch (error) { console.error(error); return new Response('Error', { status: 500 }); } }; export default handler;