irgendwas wird erzeug
This commit is contained in:
@@ -18,28 +18,20 @@ const (
|
|||||||
maxTurns = 10
|
maxTurns = 10
|
||||||
)
|
)
|
||||||
|
|
||||||
var systemPrompt = `Du bist ein autonomer Coding-Agent.
|
var systemPrompt = `Du bist ein Coding-Agent. Erledige den gegebenen Task.
|
||||||
|
|
||||||
` + BuildToolPrompt() + `
|
TOOLS:
|
||||||
|
TOOL:READ_FILE:pfad
|
||||||
WICHTIGE REGELN:
|
TOOL:WRITE_FILE:pfad
|
||||||
1. Nutze IMMER relative Pfade (z.B. hello.go, nicht /absoluter/pfad/hello.go)
|
|
||||||
2. Schreibe Dateiinhalt NIEMALS in Markdown-Codeblöcken (keine Backticks)
|
|
||||||
3. Nutze IMMER das <<<...>>> Format für WRITE_FILE
|
|
||||||
4. Wenn der Task erledigt ist, schreibe EXAKT auf einer eigenen Zeile: TASK_COMPLETE
|
|
||||||
|
|
||||||
Beispiel:
|
|
||||||
TOOL:WRITE_FILE:hello.go
|
|
||||||
<<<
|
<<<
|
||||||
package main
|
inhalt
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Println("Hello World")
|
|
||||||
}
|
|
||||||
>>>
|
>>>
|
||||||
TASK_COMPLETE`
|
TOOL:LIST_FILES:pfad
|
||||||
|
|
||||||
|
REGELN:
|
||||||
|
- Nutze relative Pfade
|
||||||
|
- Kein Markdown in Dateiinhalten
|
||||||
|
- Task erledigt: schreibe TASK_COMPLETE`
|
||||||
|
|
||||||
type AgentLoop struct {
|
type AgentLoop struct {
|
||||||
client *openai.Client
|
client *openai.Client
|
||||||
@@ -116,16 +108,29 @@ func (a *AgentLoop) runTask(task prd.Task) error {
|
|||||||
// Frischer Kontext pro Task
|
// Frischer Kontext pro Task
|
||||||
messages := []openai.ChatCompletionMessageParamUnion{
|
messages := []openai.ChatCompletionMessageParamUnion{
|
||||||
openai.SystemMessage(systemPrompt),
|
openai.SystemMessage(systemPrompt),
|
||||||
openai.UserMessage(fmt.Sprintf("Task: %s\nArbeitsverzeichnis: %s", task.Title, a.workDir)),
|
openai.UserMessage(fmt.Sprintf(
|
||||||
|
"Task: %s\nArbeitsverzeichnis: %s",
|
||||||
|
task.Title,
|
||||||
|
a.workDir,
|
||||||
|
)),
|
||||||
}
|
}
|
||||||
|
|
||||||
// System-Prompt und initialen User-Message loggen
|
|
||||||
a.log.ChatMessage("system", systemPrompt)
|
a.log.ChatMessage("system", systemPrompt)
|
||||||
a.log.ChatMessage("user", fmt.Sprintf("Task: %s\nArbeitsverzeichnis: %s", task.Title, a.workDir))
|
a.log.ChatMessage("user", fmt.Sprintf(
|
||||||
|
"Task: %s\nArbeitsverzeichnis: %s",
|
||||||
|
task.Title,
|
||||||
|
a.workDir,
|
||||||
|
))
|
||||||
|
|
||||||
for turn := 0; turn < maxTurns; turn++ {
|
for turn := 0; turn < maxTurns; turn++ {
|
||||||
a.log.Turn(turn + 1)
|
a.log.Turn(turn + 1)
|
||||||
|
|
||||||
|
// Token-Schätzung für Debugging
|
||||||
|
totalChars := 0
|
||||||
|
for _, m := range messages {
|
||||||
|
totalChars += len(fmt.Sprintf("%v", m))
|
||||||
|
}
|
||||||
|
|
||||||
resp, err := a.client.Chat.Completions.New(
|
resp, err := a.client.Chat.Completions.New(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
openai.ChatCompletionNewParams{
|
openai.ChatCompletionNewParams{
|
||||||
@@ -134,7 +139,7 @@ func (a *AgentLoop) runTask(task prd.Task) error {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("API-Fehler: %w", err)
|
return fmt.Errorf("API-Fehler (~%d Zeichen im Kontext): %w", totalChars, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
response := resp.Choices[0].Message.Content
|
response := resp.Choices[0].Message.Content
|
||||||
@@ -142,7 +147,7 @@ func (a *AgentLoop) runTask(task prd.Task) error {
|
|||||||
messages = append(messages, openai.AssistantMessage(response))
|
messages = append(messages, openai.AssistantMessage(response))
|
||||||
|
|
||||||
// Completion Detection
|
// Completion Detection
|
||||||
if strings.Contains(response, "TASK_COMPLETE") {
|
if isTaskComplete(response) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,10 +160,31 @@ func (a *AgentLoop) runTask(task prd.Task) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Kein Tool, kein TASK_COMPLETE → anstupsen
|
// Kein Tool, kein TASK_COMPLETE → anstupsen
|
||||||
nudge := "Bitte fahre fort. Wenn der Task erledigt ist, schreibe TASK_COMPLETE."
|
nudge := "Fahre fort. Wenn der Task erledigt ist, schreibe TASK_COMPLETE."
|
||||||
a.log.ChatMessage("user", nudge)
|
a.log.ChatMessage("user", nudge)
|
||||||
messages = append(messages, openai.UserMessage(nudge))
|
messages = append(messages, openai.UserMessage(nudge))
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("maximale Turns (%d) erreicht ohne TASK_COMPLETE", maxTurns)
|
return fmt.Errorf("maximale Turns (%d) erreicht ohne TASK_COMPLETE", maxTurns)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isTaskComplete erkennt TASK_COMPLETE auch bei häufigen LLM-Tippfehlern
|
||||||
|
func isTaskComplete(response string) bool {
|
||||||
|
if strings.Contains(response, "TASK_COMPLETE") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
typos := []string{
|
||||||
|
"TUTK_COMPLETE",
|
||||||
|
"TASK_COMPLET",
|
||||||
|
"TASK_COMPLETED",
|
||||||
|
"TASK_COMPETE",
|
||||||
|
"TAKS_COMPLETE",
|
||||||
|
}
|
||||||
|
upper := strings.ToUpper(response)
|
||||||
|
for _, t := range typos {
|
||||||
|
if strings.Contains(upper, t) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
1
output/ /home/jacek/projekte/goralphy/output/README.md
Normal file
1
output/ /home/jacek/projekte/goralphy/output/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Das wird die Datei `README.md` mit dem Inhalt `""` erstellen.
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
Wenn Sie möchten, dass die Datei komplett leer bleibt, können Sie auch den Inhalt leer lassen:
|
||||||
|
|
||||||
|
TOOL:WRITE_FILE: /home/jacek/projekte/goralphy/output/README.md --in-content ""
|
||||||
|
|
||||||
|
Bitte beachten Sie, dass dies die `README.md` Datei ersetzen würde, die schon existiert.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Mein Projekt
|
# Mein Projekt
|
||||||
|
|
||||||
## Tasks
|
## Tasks
|
||||||
- [ ] Projektstruktur anlegen
|
- [x] Projektstruktur anlegen
|
||||||
- [ ] Erstelle eine Datei hello.go mit einem Hello World Programm
|
- [x] Erstelle eine Datei hello.go mit einem Hello World Programm
|
||||||
- [ ] Erstelle eine Datei README.md mit einer kurzen Projektbeschreibung
|
- [ ] Erstelle eine Datei README.md mit einer kurzen Projektbeschreibung
|
||||||
|
|||||||
Reference in New Issue
Block a user