73 lines
2.3 KiB
TypeScript
73 lines
2.3 KiB
TypeScript
import { checkApiKey, getServerProfile } from "@/lib/server/server-chat-helpers"
|
|
import { ChatAPIPayload } from "@/types"
|
|
import { OpenAIStream, StreamingTextResponse } from "ai"
|
|
import OpenAI from "openai"
|
|
import { ChatCompletionCreateParamsBase } from "openai/resources/chat/completions.mjs"
|
|
|
|
export const runtime = "edge"
|
|
|
|
export async function POST(request: Request) {
|
|
const json = await request.json()
|
|
const { chatSettings, messages } = json as ChatAPIPayload
|
|
|
|
try {
|
|
const profile = await getServerProfile()
|
|
|
|
checkApiKey(profile.azure_openai_api_key, "Azure OpenAI")
|
|
|
|
const ENDPOINT = profile.azure_openai_endpoint
|
|
const KEY = profile.azure_openai_api_key
|
|
|
|
let DEPLOYMENT_ID = ""
|
|
switch (chatSettings.model) {
|
|
case "gpt-3.5-turbo":
|
|
DEPLOYMENT_ID = profile.azure_openai_35_turbo_id || ""
|
|
break
|
|
case "gpt-4-turbo-preview":
|
|
DEPLOYMENT_ID = profile.azure_openai_45_turbo_id || ""
|
|
break
|
|
case "gpt-4-vision-preview":
|
|
DEPLOYMENT_ID = profile.azure_openai_45_vision_id || ""
|
|
break
|
|
default:
|
|
return new Response(JSON.stringify({ message: "Model not found" }), {
|
|
status: 400
|
|
})
|
|
}
|
|
|
|
if (!ENDPOINT || !KEY || !DEPLOYMENT_ID) {
|
|
return new Response(
|
|
JSON.stringify({ message: "Azure resources not found" }),
|
|
{
|
|
status: 400
|
|
}
|
|
)
|
|
}
|
|
|
|
const azureOpenai = new OpenAI({
|
|
apiKey: KEY,
|
|
baseURL: `${ENDPOINT}/openai/deployments/${DEPLOYMENT_ID}`,
|
|
defaultQuery: { "api-version": "2023-12-01-preview" },
|
|
defaultHeaders: { "api-key": KEY }
|
|
})
|
|
|
|
const response = await azureOpenai.chat.completions.create({
|
|
model: DEPLOYMENT_ID as ChatCompletionCreateParamsBase["model"],
|
|
messages: messages as ChatCompletionCreateParamsBase["messages"],
|
|
temperature: chatSettings.temperature,
|
|
max_tokens: chatSettings.model === "gpt-4-vision-preview" ? 4096 : null, // TODO: Fix
|
|
stream: true
|
|
})
|
|
|
|
const stream = OpenAIStream(response)
|
|
|
|
return new StreamingTextResponse(stream)
|
|
} catch (error: any) {
|
|
const errorMessage = error.error?.message || "An unexpected error occurred"
|
|
const errorCode = error.status || 500
|
|
return new Response(JSON.stringify({ message: errorMessage }), {
|
|
status: errorCode
|
|
})
|
|
}
|
|
}
|