Bot & Automation
AI Creator Studio Telegram
/root/hermes-projects/AI Creator Studio Telegram
apps/api/src/server.ts
text
import cors from "@fastify/cors";
import helmet from "@fastify/helmet";
import Fastify from "fastify";
import {
GENERATION_MODES,
buildResourceEstimate,
generationEstimateSchema,
logger,
providerStatusSnapshot,
type GenerationEstimateInput,
usageSnapshot,
} from "@ai-creator/core";
import { enhancePrompt } from "@ai-creator/prompts";
const port = Number(process.env.PORT ?? 8080);
const host = process.env.HOST ?? "0.0.0.0";
const app = Fastify({
logger: false,
genReqId: () => crypto.randomUUID(),
});
await app.register(helmet);
await app.register(cors, {
origin: process.env.APP_BASE_URL ? [process.env.APP_BASE_URL] : true,
});
app.get("/health", async () => ({
status: "ok",
service: "ai-creator-studio-telegram-api",
timestamp: new Date().toISOString(),
}));
app.get("/generation/modes", async () => ({
modes: GENERATION_MODES,
}));
app.post("/generation/estimate", async (request, reply) => {
const parsed = generationEstimateSchema.safeParse(request.body);
if (!parsed.success) {
return reply.status(400).send({
error: {
code: "VALIDATION_ERROR",
message: "Request is not valid.",
safeDetail: parsed.error.issues.map((issue) => issue.message).join(", "),
},
});
}
const enhancedPrompt = enhancePrompt({
prompt: parsed.data.prompt,
preset: parsed.data.preset,
mode: parsed.data.mode,
});
const resourceEstimate = buildResourceEstimate(parsed.data as GenerationEstimateInput);
return {
estimateId: crypto.randomUUID(),
enhancedPrompt,
workflowPlan: {
mode: parsed.data.mode,
providerPreference: ["auto"],
steps: ["prompt_enhancement", "provider_selection", "generation", "validation", "storage"],
},
resourceEstimate,
confirmationRequired: true,
};
});
app.get("/users/:id/usage", async () => usageSnapshot());
app.get("/users/:id/projects", async () => ({
projects: [],
emptyState: {
title: "No projects yet",
description: "Create your first image or video generation from Telegram.",
},
}));
app.get("/providers/status", async () => ({
providers: providerStatusSnapshot(),
}));
app.setErrorHandler((error: Error & { code?: string }, request, reply) => {
logger.error("api_request_failed", {
requestId: request.id,
errorCode: error.code,
message: error.message,
});
return reply.status(500).send({
error: {
code: "INTERNAL_ERROR",
message: "Something went wrong.",
safeDetail: "Please try again later or contact admin if the problem continues.",
},
});
});
try {
await app.listen({ port, host });
logger.info("api_started", { port, host });
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown startup error";
logger.error("api_start_failed", { message });
process.exit(1);
}