environment-setup-guide
Guide developers through setting up development environments with proper tools, dependencies, and configurations
mistral-observability
Set up comprehensive observability for Mistral AI integrations with metrics, traces, and alerts. Use when implementing monitoring for Mistral AI operations, setting up dashboards, or configuring alerting for Mistral AI integration health. Trigger with phrases like "mistral monitoring", "mistral m...
Full skill instructions
Set up comprehensive observability for Mistral AI integrations.
| Metric | Type | Description |
|---|---|---|
mistral_requests_total | Counter | Total API requests |
mistral_request_duration_seconds | Histogram | Request latency |
mistral_tokens_total | Counter | Tokens used (input/output) |
mistral_errors_total | Counter | Error count by type |
mistral_cost_usd | Counter | Estimated cost |
mistral_cache_hits_total | Counter | Cache hit count |
import { Registry, Counter, Histogram, Gauge } from 'prom-client';
const registry = new Registry();
// Request counter
const requestCounter = new Counter({
name: 'mistral_requests_total',
help: 'Total Mistral AI API requests',
labelNames: ['model', 'status', 'endpoint'],
registers: [registry],
});
// Latency histogram
const requestDuration = new Histogram({
name: 'mistral_request_duration_seconds',
help: 'Mistral AI request duration in seconds',
labelNames: ['model', 'endpoint'],
buckets: [0.1, 0.25, 0.5, 1, 2.5, 5, 10],
registers: [registry],
});
// Token counter
const tokenCounter = new Counter({
name: 'mistral_tokens_total',
help: 'Total tokens used',
labelNames: ['model', 'type'], // type: input, output
registers: [registry],
});
// Error counter
const errorCounter = new Counter({
name: 'mistral_errors_total',
help: 'Mistral AI errors by type',
labelNames: ['model', 'error_type', 'status_code'],
registers: [registry],
});
// Cost gauge (estimated)
const costCounter = new Counter({
name: 'mistral_cost_usd_total',
help: 'Estimated cost in USD',
labelNames: ['model'],
registers: [registry],
});
export { registry, requestCounter, requestDuration, tokenCounter, errorCounter, costCounter };
import Mistral from '@mistralai/mistralai';
import {
requestCounter,
requestDuration,
tokenCounter,
errorCounter,
costCounter,
} from './metrics';
// Pricing per 1M tokens (update as needed)
const PRICING: Record<string, { input: number; output: number }> = {
'mistral-small-latest': { input: 0.20, output: 0.60 },
'mistral-large-latest': { input: 2.00, output: 6.00 },
'mistral-embed': { input: 0.10, output: 0 },
};
export async function instrumentedChat(
client: Mistral,
model: string,
messages: any[],
options?: { temperature?: number; maxTokens?: number }
): Promise<any> {
const timer = requestDuration.startTimer({ model, endpoint: 'chat.complete' });
try {
const response = await client.chat.complete({
model,
messages,
...options,
});
// Record success
requestCounter.inc({ model, status: 'success', endpoint: 'chat.complete' });
// Record tokens
if (response.usage) {
tokenCounter.inc({ model, type: 'input' }, response.usage.promptTokens || 0);
tokenCounter.inc({ model, type: 'output' }, response.usage.completionTokens || 0);
// Estimate cost
const pricing = PRICING[model] || PRICING['mistral-small-latest'];
const cost =
((response.usage.promptTokens || 0) / 1_000_000) * pricing.input +
((response.usage.completionTokens || 0) / 1_000_000) * pricing.output;
costCounter.inc({ model }, cost);
}
return response;
} catch (error: any) {
// Record error
requestCounter.inc({ model, status: 'error', endpoint: 'chat.complete' });
errorCounter.inc({
model,
error_type: error.code || 'unknown',
status_code: error.status?.toString() || 'unknown',
});
throw error;
} finally {
timer();
}
}
import { trace, SpanStatusCode, Span } from '@opentelemetry/api';
const tracer = trace.getTracer('mistral-client');
export async function tracedChat<T>(
operationName: string,
operation: () => Promise<T>,
attributes?: Record<string, string>
): Promise<T> {
return tracer.startActiveSpan(`mistral.${operationName}`, async (span: Span) => {
if (attributes) {
Object.entries(attributes).forEach(([key, value]) => {
span.setAttribute(key, value);
});
}
try {
const result = await operation();
// Add result attributes
if ((result as any).usage) {
span.setAttribute('mistral.input_tokens', (result as any).usage.promptTokens);
span.setAttribute('mistral.output_tokens', (result as any).usage.completionTokens);
}
span.setStatus({ code: SpanStatusCode.OK });
return result;
} catch (error: any) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: error.message,
});
span.recordException(error);
throw error;
} finally {
span.end();
}
});
}
// Usage
const response = await tracedChat(
'chat.complete',
() => client.chat.complete({ model, messages }),
{ model, 'user.id': userId }
);
import pino from 'pino';
const logger = pino({
name: 'mistral',
level: process.env.LOG_LEVEL || 'info',
formatters: {
level: (label) => ({ level: label }),
},
});
interface MistralLogContext {
requestId: string;
model: string;
operation: string;
durationMs: number;
inputTokens?: number;
outputTokens?: number;
cached?: boolean;
error?: string;
}
export function logMistralOperation(context: MistralLogContext): void {
const { error, ...rest } = context;
if (error) {
logger.error({ ...rest, error }, 'Mistral operation failed');
} else {
logger.info(rest, 'Mistral operation completed');
}
}
// Usage
logMistralOperation({
requestId: 'req-123',
model: 'mistral-small-latest',
operation: 'chat.complete',
durationMs: 250,
inputTokens: 100,
outputTokens: 50,
});
# prometheus/mistral_alerts.yaml
groups:
- name: mistral_alerts
rules:
# High error rate
- alert: MistralHighErrorRate
expr: |
rate(mistral_errors_total[5m]) /
rate(mistral_requests_total[5m]) > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "Mistral AI error rate > 5%"
description: "Error rate is {{ $value | humanizePercentage }}"
# High latency
- alert: MistralHighLatency
expr: |
histogram_quantile(0.95,
rate(mistral_request_duration_seconds_bucket[5m])
) > 5
for: 5m
labels:
severity: warning
annotations:
summary: "Mistral AI P95 latency > 5s"
# Rate limit approaching
- alert: MistralRateLimitWarning
expr: |
rate(mistral_errors_total{error_type="rate_limit"}[5m]) > 0
for: 2m
labels:
severity: warning
annotations:
summary: "Mistral AI rate limiting detected"
# High cost
- alert: MistralHighCost
expr: |
increase(mistral_cost_usd_total[1h]) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "Mistral AI cost > $10/hour"
# API unavailable
- alert: MistralUnavailable
expr: |
rate(mistral_errors_total{status_code="503"}[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: "Mistral AI service unavailable"
{
"title": "Mistral AI Monitoring",
"panels": [
{
"title": "Request Rate",
"type": "timeseries",
"targets": [{
"expr": "rate(mistral_requests_total[5m])",
"legendFormat": "{{model}} - {{status}}"
}]
},
{
"title": "Latency P50/P95/P99",
"type": "timeseries",
"targets": [
{
"expr": "histogram_quantile(0.5, rate(mistral_request_duration_seconds_bucket[5m]))",
"legendFormat": "P50"
},
{
"expr": "histogram_quantile(0.95, rate(mistral_request_duration_seconds_bucket[5m]))",
"legendFormat": "P95"
},
{
"expr": "histogram_quantile(0.99, rate(mistral_request_duration_seconds_bucket[5m]))",
"legendFormat": "P99"
}
]
},
{
"title": "Token Usage",
"type": "timeseries",
"targets": [{
"expr": "rate(mistral_tokens_total[5m])",
"legendFormat": "{{model}} - {{type}}"
}]
},
{
"title": "Estimated Cost ($/hour)",
"type": "stat",
"targets": [{
"expr": "increase(mistral_cost_usd_total[1h])"
}]
}
]
}
| Issue | Cause | Solution |
|---|---|---|
| Missing metrics | No instrumentation | Wrap client calls |
| Trace gaps | Missing propagation | Check context headers |
| Alert storms | Wrong thresholds | Tune alert rules |
| High cardinality | Too many labels | Reduce label values |
import express from 'express';
import { registry } from './metrics';
const app = express();
app.get('/metrics', async (req, res) => {
res.set('Content-Type', registry.contentType);
res.send(await registry.metrics());
});
For incident response, see mistral-incident-runbook.
Guide developers through setting up development environments with proper tools, dependencies, and configurations
Implement Exa lint rules, policy enforcement, and automated guardrails. Use when setting up code quality rules for Exa integrations, implementing pre-commit hooks, or configuring CI policy checks for Exa best practices. Trigger with phrases like "exa policy", "exa lint", "exa guardrails", "exa be...
Configure CI/CD pipelines for Documenso integrations. Use when setting up automated testing, deployment pipelines, or continuous integration for Documenso projects. Trigger with phrases like "documenso CI", "documenso GitHub Actions", "documenso pipeline", "documenso automated testing".
Build check model availability and implement fallback chains. Use when building resilient systems or handling model outages. Trigger with phrases like 'openrouter availability', 'openrouter fallback', 'openrouter model down', 'openrouter health check'.
Configure Langfuse enterprise organization management and access control. Use when implementing team access controls, configuring organization settings, or setting up role-based permissions for Langfuse projects. Trigger with phrases like "langfuse RBAC", "langfuse teams", "langfuse organization"...
Execute compliance and security auditing for Cursor usage. Triggers on "cursor compliance", "cursor audit", "cursor security review", "cursor soc2", "cursor gdpr". Use when analyzing or auditing cursor compliance audit. Trigger with phrases like "cursor compliance audit", "cursor audit", "cursor".
Configure Apollo.io CI/CD integration. Use when setting up automated testing, continuous integration, or deployment pipelines for Apollo integrations. Trigger with phrases like "apollo ci", "apollo github actions", "apollo pipeline", "apollo ci/cd", "apollo automated tests".
Create robust Python automation with full logging and safety checks. Use when tasks need complex data processing, authenticated API work, conditional file operations, or error handling beyond simple shell commands.
Configure PostHog across development, staging, and production environments. Use when setting up multi-environment deployments, configuring per-environment secrets, or implementing environment-specific PostHog configurations. Trigger with phrases like "posthog environments", "posthog staging", "po...
Expert in designing and building autonomous AI agents. Masters tool use, memory systems, planning strategies, and multi-agent orchestration. Use when: build agent, AI agent, autonomous agent, tool use, function calling.
Validate insecure deserialization checker operations. Auto-activating skill for Security Fundamentals. Triggers on: insecure deserialization checker, insecure deserialization checker Part of the Security Fundamentals skill category. Use when working with insecure deserialization checker functiona...
Manage path traversal finder operations. Auto-activating skill for Security Fundamentals. Triggers on: path traversal finder, path traversal finder Part of the Security Fundamentals skill category. Use when working with path traversal finder functionality. Trigger with phrases like "path traversa...
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience