7.1 KiB
7.1 KiB
goralphy
Projekt
Autonomer Go Coding-Agent ähnlich wie Ralphy. Nutzt lokale LLMs via OpenAI-kompatibler API (Docker AI, Port 12434). Die lokalen LLMs sind klein und laufen auf einem Rechner mit 16GB RAM – daher ist die Planung und Task-Aufteilung in atomare Schritte besonders wichtig.
Das Projekt unterstützt mehrere spezialisierte Agenten die zusammenarbeiten:
- Planner-Agent: Zerlegt PRD.md in atomare, ausführbare Tasks
- Code-Agent: Führt Tasks aus, schreibt Code, dokumentiert
- Test-Agent: Führt Tests aus, analysiert Fehler, gibt Feedback an Code-Agent
- Research-Agent: Recherchiert Fragen basierend auf konfigurierbaren Quellen (GitHub, Google, Reddit, StackOverflow)
Jeder Agent dokumentiert Erkenntnisse in .agent-session.md damit Fortschritte
nachvollziehbar sind und Agenten voneinander lernen können.
Aktueller Implementierungsstand
Fertig ✅
main.go– Flag-Parsing, Modell-Auswahl via /v1/models APIagent/loop.go– Worker-Loop mit Tool Calling + XML-Fallback Parseragent/tools.go– ToolExecutor: write_file, read_file, list_files (rekursiv), task_completeagent/logger.go– Verbose-Logging mit --verbose Flagagent/session.go– Session-Persistenz in .agent-session.mdprd/parser.go– PRD.md Checkbox-Parser + MarkTaskComplete
In Arbeit 🔄
agent/planner.go– Planner-Agent (Grundgerüst vorhanden, noch nicht in loop.go integriert)
Geplant 📋
agent/code.go– Code-Agentagent/test.go– Test-Agentagent/research.go– Research-Agent
Architektur
Dateien
main.go– Einstiegspunkt, Flag-Parsing, Modell-Auswahlagent/loop.go– Haupt-Loop, koordiniert alle Agentenagent/tools.go– Tool-Executor (Filesystem-Operationen)agent/logger.go– Strukturiertes Loggingagent/session.go– Session-Persistenzagent/planner.go– Planner-Agentagent/code.go– Code-Agent (geplant)agent/test.go– Test-Agent (geplant)agent/research.go– Research-Agent (geplant)prd/parser.go– PRD.md Parser
Agent Interface
Jeder Agent implementiert dieses Interface:
type Agent interface {
Run(task Task) (Result, error)
Name() string
}
type Task struct {
ID int
Title string
Description string
OriginTask string
}
type Result struct {
Success bool
Output string
Findings string // wird in .agent-session.md dokumentiert
}
Jeder Agent bekommt:
- Einen
*openai.Clientfür LLM-Calls - Einen
*ToolExecutorfür Filesystem-Zugriff - Einen
*Loggerfür strukturiertes Logging - Einen
*Sessionfür Persistenz
Wichtige Konventionen
- Go Modulname:
llm-agent - LLM Endpoint:
http://127.0.0.1:12434/v1 - Default Modell:
docker.io/ai/qwen3-coder:latest - Arbeitsverzeichnis:
./output(per--workdirFlag) - PRD-Datei:
PRD.md(per--prdFlag) - Session-Datei:
{workdir}/.agent-session.md - Pfade: immer relativ zum workdir, niemals absolut
- Kontext: frischer Kontext pro Task (kein Context-Bloat)
- Fehlerbehandlung: maxRetries=3 mit exponential Backoff
Bekannte Probleme & Workarounds
| Problem | Workaround |
|---|---|
| Modell nutzt XML-Format statt JSON Tool Calling | XML-Fallback Parser in loop.go (parseXMLToolCalls) |
| Kleine Modelle (3B) halten sich nicht an Formate | Mindestens 7B Modell empfohlen |
go run zeigt auf /tmp |
os.Getwd() statt os.Executable() |
| LLM schreibt absoluten Pfad | sanitizePath() extrahiert relativen Teil |
TASK_COMPLETE ohne Arbeit in Turn 0 |
Guard in runTask() – prüft ob Tool-Call stattfand |
| API Timeout bei großen Modellen | context.WithTimeout auf 5 Minuten |
Commands
# Bauen
go build -o llm-agent .
# Starten
go run main.go --workdir output --prd PRD.md
go run main.go --workdir output --prd PRD.md --verbose
go run main.go --workdir output --prd PRD.md --verbose --model docker.io/ai/qwen3-coder:latest
# Tests
go test ./...
go test -v ./agent/...
go test -cover ./agent/...
Vorgehensweise für Claude Code
- Verfeinere Agent-Interface und Basis-Architektur
- Integriere
planner.goinloop.go - Implementiere
code.go(Code-Agent) - Teste Code-Agent mit einfachen Tasks
- Implementiere
test.go(Test-Agent) - Verbinde Code-Agent und Test-Agent in Feedback-Loop
- Implementiere
research.go(Research-Agent)
Spätere Erweiterungen
- Vektor-Datenbank: Speicherung von Agenten-Erkenntnissen und Code-Snippets für Wiederverwendbarkeit und Lernen zwischen Sessions
- Git-Integration: Automatische Commits pro Task, Steuerung via Pull Requests, Zusammenarbeit mehrerer Agenten auf separaten Branches
- Discord-Integration: Echtzeit-Monitoring und Interaktion mit Agenten über Discord Chat
- Streaming: LLM-Antworten Wort für Wort ausgeben statt auf einmal warten
Session-Format (.agent-session.md)
# Agent Session
Started: 2026-03-04 20:00:00
Model: docker.io/ai/qwen3-coder:latest
PRD: output/PRD.md
## Plan
### Erstelle go.mod[1]
Origin: Projektstruktur anlegen
Description: Erstelle go.mod mit Modulname llm-agent...
## Tasks
### ✅ Erstelle go.mod
Status: complete
Started: 2026-03-04 20:00:01
Completed: 2026-03-04 20:00:45
### ❌ Erstelle main.go
Status: failed
Attempts: 3
Error: maximale Turns (10) erreicht ohne task_complete
### ⏳ Erstelle README.md
Status: pending
Tool-Übersicht
Tool-Übersicht
| Tool | Parameter | Beschreibung |
|---|---|---|
write_file |
path, content |
Datei schreiben, Verzeichnisse werden automatisch erstellt |
read_file |
path |
Dateiinhalt lesen |
list_files |
path, recursive? |
Verzeichnis auflisten, optional rekursiv |
delete_file |
path |
Datei löschen |
move_file |
from, to |
Datei verschieben oder umbenennen |
run_command |
command, args[], workdir? |
Beliebigen Shell-Befehl ausführen (z.B. go build, go test) |
run_tests |
path?, flags[]? |
go test ./... ausführen, gibt Ergebnis und Fehler zurück |
git_command |
args[] |
Beliebigen git-Befehl ausführen (z.B. ["commit", "-m", "msg"]) |
git_status |
– | git status – zeigt geänderte Dateien |
git_diff |
path? |
git diff – zeigt Änderungen |
git_commit |
message, files[]? |
Dateien stagen und committen |
git_log |
limit? |
Letzte Commits anzeigen |
web_search |
query, sources[]? |
Websuche, optionale Quellen: github, stackoverflow, reddit, google |
fetch_url |
url |
Inhalt einer URL abrufen und als Text zurückgeben |
task_complete |
summary? |
Task als erledigt markieren, optionale Zusammenfassung |
task_failed |
reason |
Task explizit als fehlgeschlagen markieren mit Begründung |
Sicherheitsregeln
| Tool | Einschränkung |
|---|---|
write_file, delete_file, move_file |
Nur innerhalb workdir |
run_command |
Konfigurierbare Whitelist erlaubter Befehle |
git_command |
Nur im Projekt-Root, kein git push ohne Bestätigung |
web_search, fetch_url |
Optional deaktivierbar per Flag --no-network |