import "dotenv/config"; import cors from "cors"; import express from "express"; import { PORT, PRESETS_DIR, TRACES_DIR, EVAL_CASES_DIR, REPORTS_DIR, TIMEZONE, ASSISTANT_SESSIONS_DIR, AUTORUN_ANNOTATIONS_DIR, AUTORUN_GENERATOR_DIR } from "./config"; import { buildAccountingAgentRouter } from "./routes/accountingAgent"; import { buildAssistantRouter } from "./routes/assistant"; import { buildAutoRunsRouter } from "./routes/autoRuns"; import { buildEvalRouter } from "./routes/eval"; import { buildHistoryRouter } from "./routes/history"; import { buildNormalizeRouter } from "./routes/normalize"; import { buildPresetsRouter } from "./routes/presets"; import { buildTestConnectionRouter } from "./routes/testConnection"; import { InMemoryRuntimeAdapter } from "./runtime/inMemoryRuntimeAdapter"; import { AssistantService } from "./services/assistantService"; import { AssistantSessionStore } from "./services/assistantSessionStore"; import { EvalService } from "./services/evalService"; import { NormalizerService } from "./services/normalizerService"; import { OpenAIResponsesClient } from "./services/openaiResponsesClient"; import type { AppServices } from "./serverContext"; import { ensureDir } from "./utils/files"; import { errorMiddleware, ok } from "./utils/http"; import { logJson } from "./utils/log"; export function createApp(): express.Express { ensureDir(TRACES_DIR); ensureDir(PRESETS_DIR); ensureDir(EVAL_CASES_DIR); ensureDir(REPORTS_DIR); ensureDir(ASSISTANT_SESSIONS_DIR); ensureDir(AUTORUN_ANNOTATIONS_DIR); ensureDir(AUTORUN_GENERATOR_DIR); const app = express(); app.use(cors()); app.use(express.json({ type: ["application/json", "application/*+json"], limit: "2mb" })); const openaiClient = new OpenAIResponsesClient(); const normalizerService = new NormalizerService(openaiClient); const evalService = new EvalService(normalizerService); const assistantSessionStore = new AssistantSessionStore(); const assistantService = new AssistantService(normalizerService, assistantSessionStore); const runtimeAdapter = new InMemoryRuntimeAdapter(); const services: AppServices = { normalizerService, evalService, assistantService, runtimeAdapter }; app.get("/api/health", (_req, res) => { ok(res, { ok: true, service: "llm-normalizer-backend", status: "RUNNING", timezone: TIMEZONE, now: new Date().toISOString() }); }); app.use(buildTestConnectionRouter(openaiClient)); app.use(buildNormalizeRouter(services)); app.use(buildEvalRouter(services)); app.use(buildAssistantRouter(services)); app.use(buildAutoRunsRouter(openaiClient)); app.use(buildHistoryRouter()); app.use(buildPresetsRouter()); app.use(buildAccountingAgentRouter(services)); app.use(errorMiddleware); return app; } if (require.main === module) { const app = createApp(); app.listen(PORT, () => { logJson({ timestamp: new Date().toISOString(), level: "info", service: "llm_normalizer_backend", message: `Backend started on http://localhost:${PORT}` }); }); }