- POST /api/transcribe: download audio from URL, call Whisper API, return transcript - Types: TranscribeRequestSchema (Zod), TranscribeResponse, SUPPORTED_AUDIO_TYPES - Guards: 25MB size limit, 30s download timeout, 120s Whisper timeout, 429 rate limit - Config: OPENAI_API_KEY, OPENAI_BASE_URL, WHISPER_MODEL env vars - 12 new tests (schema validation + constants) - Registered in server.ts alongside extract + task routes
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
/**
|
|
* Extraction Service — Fastify server entry point.
|
|
*
|
|
* Modules: extract, tasks.
|
|
* Port: 4005 (configurable via PORT env var).
|
|
* Product-agnostic: all data scoped by productId.
|
|
*
|
|
* Depends on a Python sidecar running LangExtract (default port 4006).
|
|
*/
|
|
|
|
// Resolve secrets from configured provider BEFORE config parsing
|
|
import { resolveSecrets, LYSNR_SECRETS } from '@bytelyst/config';
|
|
await resolveSecrets([
|
|
LYSNR_SECRETS.COSMOS_KEY,
|
|
LYSNR_SECRETS.COSMOS_ENDPOINT,
|
|
LYSNR_SECRETS.JWT_SECRET,
|
|
LYSNR_SECRETS.GEMINI_API_KEY,
|
|
]);
|
|
|
|
import { createServiceApp, startService } from '@bytelyst/fastify-core';
|
|
import { extractRoutes } from './modules/extract/routes.js';
|
|
import { taskRoutes } from './modules/tasks/routes.js';
|
|
import { transcribeRoutes } from './modules/transcribe/routes.js';
|
|
import { config } from './lib/config.js';
|
|
|
|
const app = await createServiceApp({
|
|
name: 'extraction-service',
|
|
version: '0.1.0',
|
|
description: 'LLM-powered structured extraction via LangExtract — product-agnostic',
|
|
corsOrigin: config.CORS_ORIGIN,
|
|
swagger: {
|
|
title: 'Extraction Service',
|
|
description: 'LLM-powered structured extraction via LangExtract',
|
|
port: config.PORT,
|
|
},
|
|
metrics: true,
|
|
});
|
|
|
|
// Register route modules
|
|
await app.register(extractRoutes, { prefix: '/api' });
|
|
await app.register(taskRoutes, { prefix: '/api' });
|
|
await app.register(transcribeRoutes, { prefix: '/api' });
|
|
|
|
await startService(app, { port: config.PORT, host: config.HOST });
|