60 lines
1.4 KiB
TypeScript
60 lines
1.4 KiB
TypeScript
|
import OpenAI from "openai";
|
||
|
import { z } from "zod";
|
||
|
|
||
|
// get meta data from url
|
||
|
export const ServiceCheckerParams = z.object({
|
||
|
query: z.string(),
|
||
|
});
|
||
|
|
||
|
export type ServiceCheckerParams = z.infer<typeof ServiceCheckerParams>;
|
||
|
|
||
|
const ai_token = process.env.OPENAI_API_KEY?.trim();
|
||
|
const openai = new OpenAI({
|
||
|
apiKey: ai_token,
|
||
|
});
|
||
|
|
||
|
export async function service_checker({ query }: ServiceCheckerParams) {
|
||
|
const status_pages = [
|
||
|
"http://192.168.29.85:3001/status/tokio",
|
||
|
"https://ark-status.raj.how/status/ark",
|
||
|
];
|
||
|
|
||
|
// fetch the html of the status pages
|
||
|
const status_page_html_promises = await Promise.allSettled(
|
||
|
status_pages.map(async (url) => {
|
||
|
const res = await fetch(url);
|
||
|
return res.text();
|
||
|
})
|
||
|
);
|
||
|
|
||
|
const status_page_html = status_page_html_promises.map((res) => {
|
||
|
if (res.status === "fulfilled") {
|
||
|
return res.value;
|
||
|
}
|
||
|
return res.reason;
|
||
|
});
|
||
|
|
||
|
const res = await openai.chat.completions.create({
|
||
|
model: "gpt-4o-mini",
|
||
|
messages: [
|
||
|
{
|
||
|
role: "system",
|
||
|
content: `You are a service status bot that takes in a user query about a service and responds with the status of the service.
|
||
|
|
||
|
The HTML of the status pages is: "${status_page_html}".
|
||
|
|
||
|
The user query is: "${query}".
|
||
|
`,
|
||
|
},
|
||
|
{
|
||
|
role: "user",
|
||
|
content: query,
|
||
|
},
|
||
|
],
|
||
|
});
|
||
|
|
||
|
return {
|
||
|
response: res.choices[0].message.content,
|
||
|
};
|
||
|
}
|