El endpoint del chat no limita tokens de entrada/salida ni la frecuencia de llamadas al LLM. Un script automatizado puede vaciar el presupuesto mensual de una clínica en minutos o saturar la cola de procesamiento.
✓ Rate limiting diferenciado + capping de tokens por request
import rateLimit from 'express-rate-limit';
import { z } from 'zod';
const aiLimiter = rateLimit({
windowMs: 60 * 1000,
max: 20,
keyGenerator: (req) => req.user.id,
standardHeaders: true,
});
const ChatSchema = z.object({
message: z.string().min(1).max(2000),
conversation_id: z.string().uuid(),
});
app.post('/api/ai/chat', authenticate, aiLimiter, async (req, res) => {
const data = ChatSchema.parse(req.body);
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-6',
max_tokens: 1024,
messages: [{ role: 'user', content: data.message }],
system: SYSTEM_PROMPT,
});
return res.json({ reply: response.content[0].text });
});