// /api/health
import { CohereClientV2, CohereError } from 'cohere-ai';
const cohere = new CohereClientV2();
export async function GET() {
const start = Date.now();
let cohereStatus: 'healthy' | 'degraded' | 'down' = 'down';
try {
// Cheapest possible health check — minimal chat
await cohere.chat({
model: 'command-r7b-12-2024',
messages: [{ role: 'user', content: 'ping' }],
maxTokens: 1,
});
cohereStatus = 'healthy';
} catch (err) {
if (err instanceof CohereError && err.statusCode === 429) {
cohereStatus = 'degraded'; // Rate limited but reachable
}
}
return Response.json({
status: cohereStatus === 'healthy' ? 'ok' : 'degraded',
cohere: {
status: cohereStatus,
latencyMs: Date.now() - start,
},
timestamp: new Date().toISOString(),
});
}
class CohereCircuitBreaker {
private failures = 0;
private lastFailure = 0;
private state: 'closed' | 'open' | 'half-open' = 'closed';
constructor(
private threshold = 5,
private resetMs = 60_000
) {}
async call<T>(fn: () => Promise<T>, fallback?: () => T): Promise<T> {
if (this.state === 'open') {
if (Date.now() - this.lastFailure > this.resetMs) {
this.state = 'half-open';
} else if (fallback) {
return fallback();
} else {
throw new Error('Cohere circuit breaker is open');
}
}
try {
const result = await fn();
this.failures = 0;
this.state = 'closed';
return result;
} catch (err) {
this.failures++;
this.lastFailure = Date.now();
if (this.failures >= this.threshold) {
this.state = 'open';
console.error(`Cohere circuit breaker OPEN after ${this.failures} failures`);
}
throw err;
}
}
}
const breaker = new CohereCircuitBreaker();
# Pre-flight
curl -sf https://staging.example.com/api/health | jq '.cohere'
curl -s https://status.cohere.com/api/v2/status.json | jq '.status'
# Deploy with canary (10% traffic)
kubectl apply -f k8s/production.yaml
kubectl rollout pause deployment/app
# Monitor for 10 minutes: error rate, latency, 429s
# Check: No increase in CohereError rate
# Check: P95 latency < 5s for chat, < 500ms for embed/rerank
# Proceed to 100%
kubectl rollout resume deployment/app
kubectl rollout status deployment/app