mistral-local-dev-loop
Sets up a fast development environment for Mistral AI, including hot reloading, unit testing, and API mocking.
Install
mkdir -p .claude/skills/mistral-local-dev-loop && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8176" && unzip -o skill.zip -d .claude/skills/mistral-local-dev-loop && rm skill.zipInstalls to .claude/skills/mistral-local-dev-loop
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Configure Mistral AI local development with hot reload, testing, andKey capabilities
- →Set up a project scaffold for Mistral AI integrations
- →Configure hot reload with `tsx` for development
- →Implement unit tests with Vitest mocking
- →Set up integration tests against the live Mistral API
- →Manage environment variables for Mistral projects
How it works
This skill establishes a local development workflow by providing a project structure, package configurations, environment setup, and examples for unit and integration testing with Mistral AI.
Inputs & outputs
When to use mistral-local-dev-loop
- →Initialize new Mistral AI project
- →Configure hot-reload development loop
- →Mock API calls for unit tests
- →Set up project-wide type definitions
About this skill
Mistral AI Local Dev Loop
Overview
Set up a fast, reproducible local development workflow for Mistral AI integrations: project scaffold, environment config, hot reload with tsx, unit tests with Vitest mocking, and integration tests against the live API.
Prerequisites
- Completed
mistral-install-authsetup - Node.js 18+ with npm/pnpm
MISTRAL_API_KEYset in environment
Instructions
Step 1: Project Structure
my-mistral-project/
├── src/
│ ├── mistral/
│ │ ├── client.ts # Singleton client
│ │ ├── config.ts # Config with Zod validation
│ │ └── types.ts # TypeScript types
│ └── index.ts
├── tests/
│ ├── unit/
│ │ └── mistral.test.ts
│ └── integration/
│ └── mistral.integration.test.ts
├── .env.local # Local secrets (git-ignored)
├── .env.example # Template for team
├── tsconfig.json
├── vitest.config.ts
└── package.json
Step 2: Package Configuration
package.json
{
"type": "module",
"scripts": {
"dev": "tsx watch src/index.ts",
"build": "tsc",
"test": "vitest run",
"test:watch": "vitest",
"test:integration": "vitest run tests/integration/",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@mistralai/mistralai": "^1.0.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"dotenv": "^16.0.0",
"tsx": "^4.0.0",
"typescript": "^5.0.0",
"vitest": "^1.0.0"
}
}
tsconfig.json
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"outDir": "dist",
"rootDir": "src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
Step 3: Environment Setup
# Create environment template
cat > .env.example << 'EOF'
MISTRAL_API_KEY=your-api-key-here
MISTRAL_MODEL=mistral-small-latest
LOG_LEVEL=debug
EOF
cp .env.example .env.local
echo '.env.local' >> .gitignore
echo '.env' >> .gitignore
Step 4: Client Module
// src/mistral/client.ts
import { Mistral } from '@mistralai/mistralai';
import 'dotenv/config';
let instance: Mistral | null = null;
export function getMistralClient(): Mistral {
if (!instance) {
const apiKey = process.env.MISTRAL_API_KEY;
if (!apiKey) throw new Error('MISTRAL_API_KEY not set');
instance = new Mistral({ apiKey, timeoutMs: 30_000 });
}
return instance;
}
export function resetClient(): void {
instance = null;
}
Step 5: Unit Tests with Mocking
vitest.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
globals: true,
environment: 'node',
include: ['tests/**/*.test.ts'],
coverage: { provider: 'v8', reporter: ['text', 'json'] },
},
});
tests/unit/mistral.test.ts
import { describe, it, expect, vi, beforeEach } from 'vitest';
// Mock the entire SDK
vi.mock('@mistralai/mistralai', () => ({
Mistral: vi.fn().mockImplementation(() => ({
chat: {
complete: vi.fn().mockResolvedValue({
id: 'test-id',
model: 'mistral-small-latest',
choices: [{
index: 0,
message: { role: 'assistant', content: 'Mocked response' },
finishReason: 'stop',
}],
usage: { promptTokens: 10, completionTokens: 5, totalTokens: 15 },
}),
stream: vi.fn().mockImplementation(async function* () {
yield { data: { choices: [{ delta: { content: 'Streamed ' } }] } };
yield { data: { choices: [{ delta: { content: 'response' } }] } };
}),
},
embeddings: {
create: vi.fn().mockResolvedValue({
data: [{ embedding: new Array(1024).fill(0.1) }],
usage: { totalTokens: 5 },
}),
},
models: {
list: vi.fn().mockResolvedValue({ data: [{ id: 'mistral-small-latest' }] }),
},
})),
}));
describe('Mistral Client', () => {
beforeEach(() => { vi.clearAllMocks(); });
it('should complete chat', async () => {
const { Mistral } = await import('@mistralai/mistralai');
const client = new Mistral({ apiKey: 'test' });
const response = await client.chat.complete({
model: 'mistral-small-latest',
messages: [{ role: 'user', content: 'Test' }],
});
expect(response.choices?.[0]?.message?.content).toBe('Mocked response');
expect(response.usage?.totalTokens).toBe(15);
});
it('should generate embeddings', async () => {
const { Mistral } = await import('@mistralai/mistralai');
const client = new Mistral({ apiKey: 'test' });
const response = await client.embeddings.create({
model: 'mistral-embed',
inputs: ['test text'],
});
expect(response.data[0].embedding).toHaveLength(1024);
});
});
Step 6: Integration Test (Live API)
// tests/integration/mistral.integration.test.ts
import { describe, it, expect } from 'vitest';
import { Mistral } from '@mistralai/mistralai';
const apiKey = process.env.MISTRAL_API_KEY;
describe.skipIf(!apiKey)('Mistral Integration', () => {
const client = new Mistral({ apiKey: apiKey! });
it('should list models', async () => {
const models = await client.models.list();
expect(models.data?.length).toBeGreaterThan(0);
}, 10_000);
it('should complete chat', async () => {
const response = await client.chat.complete({
model: 'mistral-small-latest',
messages: [{ role: 'user', content: 'Reply with "ok"' }],
maxTokens: 10,
temperature: 0,
});
expect(response.choices?.[0]?.message?.content).toBeTruthy();
}, 15_000);
it('should generate embeddings', async () => {
const response = await client.embeddings.create({
model: 'mistral-embed',
inputs: ['test'],
});
expect(response.data[0].embedding).toHaveLength(1024);
}, 10_000);
});
Output
- Working dev environment with hot reload (
tsx watch) - Unit tests with full SDK mocking
- Integration tests against live API (skip when no key)
- Environment variable management with
.env.local
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Module not found | Missing dependency | Run npm install |
| Env not loaded | Missing .env.local | Copy from .env.example |
| Integration timeout | Slow API response | Increase test timeout |
| Mock type errors | SDK interface changed | Update mock to match current SDK |
Resources
Next Steps
See mistral-sdk-patterns for production-ready code patterns.
Prerequisites
Limitations
- →Integration tests are skipped if `MISTRAL_API_KEY` is not set
- →Mock type errors can occur if the SDK interface changes
How it compares
This skill provides a structured project setup and testing framework specifically for Mistral AI, rather than a generic development environment.
Compared to similar skills
mistral-local-dev-loop side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| mistral-local-dev-loop (this skill) | 0 | 27d | Review | Intermediate |
| svelte-expert | 11 | 9mo | No flags | Intermediate |
| zod-4 | 12 | 7mo | No flags | Intermediate |
| develop-ai-functions-example | 5 | 6mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
svelte-expert
Raudbjorn
Expert Svelte/SvelteKit development assistant for building components, utilities, and applications. Use when creating Svelte components, SvelteKit applications, implementing reactive patterns, handling state management, working with stores, transitions, animations, or any Svelte/SvelteKit development task. Includes comprehensive documentation access, code validation with svelte-autofixer, and playground link generation.
zod-4
prowler-cloud
Zod 4 schema validation patterns. Trigger: When creating or updating Zod v4 schemas for validation/parsing (forms, request payloads, adapters), including v3 -> v4 migration patterns.
develop-ai-functions-example
vercel
Develop examples for AI SDK functions. Use when creating, running, or modifying examples under examples/ai-functions/src to validate provider support, demonstrate features, or create test fixtures.
adk-engineer
jeremylongshore
Execute software engineer specializing in creating production-ready ADK agents with best practices, code structure, testing, and deployment automation. Use when asked to "build ADK agent", "create agent code", or "engineer ADK application". Trigger with relevant phrases based on skill purpose.
1k-dev-commands
OneKeyHQ
Development commands — yarn scripts for dev servers, building, linting, testing, and troubleshooting.
web-renderer-test
remotion-dev
Add a test case to the web renderer