Claude-code-plugins-plus-skills mistral-debug-bundle
install
source · Clone the upstream repo
git clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jeremylongshore/claude-code-plugins-plus-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/saas-packs/mistral-pack/skills/mistral-debug-bundle" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-skills-mistral-debug-bundle && rm -rf "$T"
manifest:
plugins/saas-packs/mistral-pack/skills/mistral-debug-bundle/SKILL.mdsource content
Mistral AI Debug Bundle
Current State
!
node --version 2>/dev/null || echo 'N/A'
!python3 --version 2>/dev/null || echo 'N/A'
Overview
Collect all necessary diagnostic information for Mistral AI support tickets. Creates a redacted bundle with environment info, SDK versions, API connectivity test, available models, and recent error logs.
Prerequisites
- Mistral AI SDK installed
- Access to application logs
set (for connectivity test)MISTRAL_API_KEY
Instructions
Step 1: Complete Debug Script
#!/bin/bash # mistral-debug-bundle.sh — Creates redacted support bundle set -e BUNDLE_DIR="mistral-debug-$(date +%Y%m%d-%H%M%S)" mkdir -p "$BUNDLE_DIR" echo "Creating Mistral AI debug bundle..." # === Environment Info === cat > "$BUNDLE_DIR/summary.txt" << EOF === Mistral AI Debug Bundle === Generated: $(date -u +%Y-%m-%dT%H:%M:%SZ) Hostname: $(hostname) --- Environment --- Node.js: $(node --version 2>/dev/null || echo 'not installed') Python: $(python3 --version 2>/dev/null || echo 'not installed') npm: $(npm --version 2>/dev/null || echo 'not installed') OS: $(uname -a) MISTRAL_API_KEY: ${MISTRAL_API_KEY:+[SET, length=${#MISTRAL_API_KEY}]}${MISTRAL_API_KEY:-[NOT SET]} EOF # === SDK Versions === echo -e "\n--- SDK Versions ---" >> "$BUNDLE_DIR/summary.txt" npm list @mistralai/mistralai 2>/dev/null >> "$BUNDLE_DIR/summary.txt" \ || echo "Node SDK: not installed" >> "$BUNDLE_DIR/summary.txt" pip show mistralai 2>/dev/null | grep -E "^(Name|Version)" >> "$BUNDLE_DIR/summary.txt" \ || echo "Python SDK: not installed" >> "$BUNDLE_DIR/summary.txt" # === API Connectivity === echo -e "\n--- API Connectivity ---" >> "$BUNDLE_DIR/summary.txt" if [ -n "${MISTRAL_API_KEY:-}" ]; then HTTP_STATUS=$(curl -s -o "$BUNDLE_DIR/api-response.json" -w "%{http_code}" \ -H "Authorization: Bearer ${MISTRAL_API_KEY}" \ https://api.mistral.ai/v1/models 2>/dev/null) echo "HTTP Status: $HTTP_STATUS" >> "$BUNDLE_DIR/summary.txt" if [ "$HTTP_STATUS" = "200" ]; then echo -e "\n--- Available Models ---" >> "$BUNDLE_DIR/summary.txt" jq -r '.data[].id' "$BUNDLE_DIR/api-response.json" >> "$BUNDLE_DIR/summary.txt" 2>/dev/null fi rm -f "$BUNDLE_DIR/api-response.json" else echo "Skipped (no API key)" >> "$BUNDLE_DIR/summary.txt" fi # === Dependencies === if [ -f "package.json" ]; then echo -e "\n--- Dependencies ---" >> "$BUNDLE_DIR/summary.txt" jq '{dependencies, devDependencies}' package.json 2>/dev/null >> "$BUNDLE_DIR/summary.txt" fi # === Recent Logs (redacted) === echo "--- Recent Logs (redacted) ---" > "$BUNDLE_DIR/logs.txt" if [ -d "logs" ]; then grep -i "mistral\|error\|429\|401\|500" logs/*.log 2>/dev/null | tail -100 >> "$BUNDLE_DIR/logs.txt" fi # === Config (redacted) === if [ -f ".env" ]; then sed 's/=.*/=***REDACTED***/' .env > "$BUNDLE_DIR/config-redacted.txt" fi # === Reproduction Script === cat > "$BUNDLE_DIR/reproduce.sh" << 'SCRIPT' #!/bin/bash set -euo pipefail curl -X POST https://api.mistral.ai/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${MISTRAL_API_KEY}" \ -d '{"model":"mistral-small-latest","messages":[{"role":"user","content":"ping"}]}' 2>&1 echo -e "\nExit code: $?" SCRIPT chmod +x "$BUNDLE_DIR/reproduce.sh" # === Package === tar -czf "$BUNDLE_DIR.tar.gz" "$BUNDLE_DIR" rm -rf "$BUNDLE_DIR" echo "Bundle: $BUNDLE_DIR.tar.gz" echo "IMPORTANT: Review for sensitive data before sharing!"
Step 2: TypeScript Debug Helper
import { Mistral } from '@mistralai/mistralai'; interface DebugInfo { timestamp: string; nodeVersion: string; apiKeySet: boolean; apiKeyLength: number; connectivity: 'ok' | 'auth_error' | 'network_error' | 'unknown_error'; availableModels: string[]; latencyMs: number; lastError?: { message: string; status?: number }; } async function collectDebugInfo(error?: Error): Promise<DebugInfo> { const info: DebugInfo = { timestamp: new Date().toISOString(), nodeVersion: process.version, apiKeySet: !!process.env.MISTRAL_API_KEY, apiKeyLength: process.env.MISTRAL_API_KEY?.length ?? 0, connectivity: 'unknown_error', availableModels: [], latencyMs: 0, }; if (error) { info.lastError = { message: error.message, status: (error as any).status, }; } if (info.apiKeySet) { const start = performance.now(); try { const client = new Mistral({ apiKey: process.env.MISTRAL_API_KEY }); const models = await client.models.list(); info.connectivity = 'ok'; info.availableModels = models.data?.map(m => m.id) ?? []; info.latencyMs = Math.round(performance.now() - start); } catch (e: any) { info.latencyMs = Math.round(performance.now() - start); info.connectivity = e.status === 401 ? 'auth_error' : 'network_error'; } } return info; } // Usage in catch blocks try { await client.chat.complete({ model: 'mistral-small-latest', messages }); } catch (error) { const debug = await collectDebugInfo(error as Error); console.error('Debug info:', JSON.stringify(debug, null, 2)); }
Step 3: Request/Response Logger for Debugging
function createDebugClient(): Mistral { const client = new Mistral({ apiKey: process.env.MISTRAL_API_KEY }); // Wrap chat.complete to log request/response metadata const originalComplete = client.chat.complete.bind(client.chat); client.chat.complete = async (params: any) => { const start = performance.now(); console.debug('[MISTRAL REQUEST]', { model: params.model, messageCount: params.messages?.length, hasTools: !!params.tools?.length, temperature: params.temperature, }); try { const response = await originalComplete(params); console.debug('[MISTRAL RESPONSE]', { durationMs: Math.round(performance.now() - start), finishReason: response.choices?.[0]?.finishReason, usage: response.usage, hasToolCalls: !!response.choices?.[0]?.message?.toolCalls?.length, }); return response; } catch (error: any) { console.debug('[MISTRAL ERROR]', { durationMs: Math.round(performance.now() - start), status: error.status, message: error.message, }); throw error; } }; return client; }
Sensitive Data Rules
ALWAYS REDACT: API keys, passwords, PII (emails, names), internal URLs SAFE TO INCLUDE: Error messages, stack traces, SDK versions, HTTP status codes, model IDs
Output
containing:mistral-debug-YYYYMMDD-HHMMSS.tar.gz
— environment, SDK versions, API statussummary.txt
— recent redacted error logslogs.txt
— config with secrets maskedconfig-redacted.txt
— minimal reproduction scriptreproduce.sh
Error Handling
| Item | Purpose |
|---|---|
| Environment versions | Compatibility check |
| SDK version | Version-specific bug identification |
| API connectivity test | Network/auth diagnosis |
| Available models | Key scope verification |
| Error logs (redacted) | Root cause analysis |
Resources
Next Steps
For rate limit issues, see
mistral-rate-limits. For common errors, see mistral-common-errors.