feat: AI-assisted compilation and code generation

- New src/ai_assist.nim module with DeepSeek/OpenAI/MiMo API support
- AI explains compiler errors automatically when compilation fails
- New CLI command: cljnim ai '<description>' for code generation
- REPL :ai command for interactive AI assistance
- API keys read from environment vars (DEEPSEEK_API_KEY, OPENAI_API_KEY, MIMO_API_KEY)
- Tests for prompt building and response formatting
- Updated README with AI integration docs
This commit is contained in:
2026-05-08 22:21:27 +03:00
parent 6bed638300
commit 6249d8a251
7 changed files with 382 additions and 32 deletions
+45
View File
@@ -0,0 +1,45 @@
# Tests for AI assistance module (no real API calls)
import unittest, strutils
import os
import ai_assist
suite "AI Config Detection":
test "detectConfig returns empty when no env vars set":
# Note: this test assumes no API keys are set in test environment
# If keys ARE set, it will detect them
let cfg = detectConfig()
# At minimum, the function should not crash
check cfg.timeoutMs >= 0
test "hasAiConfig returns false when no keys set (if env empty)":
let key = getEnv("DEEPSEEK_API_KEY", "")
let okey = getEnv("OPENAI_API_KEY", "")
let mkey = getEnv("MIMO_API_KEY", "")
if key.len == 0 and okey.len == 0 and mkey.len == 0:
check hasAiConfig() == false
suite "Prompt Building":
test "buildErrorPrompt includes filename and source":
let prompt = buildErrorPrompt("type mismatch", "(defn foo [x] x)", "test.clj")
check "test.clj" in prompt
check "type mismatch" in prompt
check "(defn foo [x] x)" in prompt
test "buildGenerationPrompt includes description":
let prompt = buildGenerationPrompt("reverse a list")
check "reverse a list" in prompt
check "Clojure" in prompt
suite "Response Formatting":
test "formatSuggestion shows error when not ok":
let resp = AiResponse(ok: false, suggestion: "No key configured")
let formatted = formatSuggestion(resp)
check "💡 AI:" in formatted
check "No key configured" in formatted
test "formatSuggestion shows suggestion when ok":
let resp = AiResponse(ok: true, suggestion: "Use (reverse coll)")
let formatted = formatSuggestion(resp)
check "💡 AI Suggestion:" in formatted
check "Use (reverse coll)" in formatted