disclaw/tasks/DIS-153.md
Nick Tabeling c1a63036e6
Some checks failed
CI / build-and-test (ubuntu-latest) (pull_request) Has been cancelled
CI / build-and-test (windows-latest) (pull_request) Has been cancelled
CI / lint (pull_request) Has been cancelled
chore: mark DIS-153 done
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 09:52:58 +02:00

76 lines
2.3 KiB
Markdown

---
id: DIS-153
status: done
phase: 1.5
priority: p2
labels: [phase:1.5, type:feat, priority:p2]
branch: refinement/model-selection
assignee: developer-agent
started: 2026-04-13
pr: "#62"
merged: 2026-04-13
---
# DIS-153: Model-Auswahl pro Agent
## Ziel
Beim Erstellen eines Agents kann das Claude-Modell ausgewählt werden.
`/new-agent` zeigt ein Discord-Select-Menü mit verfügbaren Modellen.
Der Agent verwendet ausschließlich das konfigurierte Modell.
## Kontext
Verschiedene Agents haben unterschiedliche Anforderungen: ein einfacher
Research-Agent kommt mit Haiku aus, ein Code-Agent braucht Sonnet oder Opus.
## Scope
### Verfügbare Modelle (hardcodierte Allowlist)
```typescript
export const ALLOWED_MODELS = [
{ id: "claude-opus-4-6", label: "Claude Opus 4.6 (leistungsstark, langsamer)" },
{ id: "claude-sonnet-4-6", label: "Claude Sonnet 4.6 (Standard, empfohlen)" },
{ id: "claude-haiku-4-5-20251001", label: "Claude Haiku 4.5 (schnell, günstig)" },
] as const;
export type AllowedModel = typeof ALLOWED_MODELS[number]["id"];
```
### `agent.yaml` Erweiterung
```yaml
name: my-agent
channel_id: "123456789"
role: Developer
model: claude-sonnet-4-6 # neu, default: claude-sonnet-4-6
```
### `/new-agent`-Command (`src/commands/new-agent.ts`)
- Discord `StringSelectMenuBuilder` mit den 3 Modellen als Optionen
- Nach Auswahl: `model` in `agent.yaml` speichern
- Kein Freitext-Feld — nur Auswahl aus der Allowlist
### `src/agent/runner.ts`
- `agent.yaml` lesen und `model`-Feld auslesen
- `--model <id>` zu den Claude-CLI-Args hinzufügen
- Fallback: wenn kein Model in `agent.yaml``claude-sonnet-4-6`
### Zod-Schema (`src/agent/schema.ts`)
- `model: z.enum([...ALLOWED_MODELS.map(m => m.id)]).default("claude-sonnet-4-6")`
## Definition of Done
- [ ] `agent.yaml` hat `model`-Feld (Zod-validiert, Allowlist)
- [ ] `/new-agent` zeigt Select-Menü (kein Freitext)
- [ ] Runner übergibt `--model <id>` an Claude CLI
- [ ] Ungültiges Modell in `agent.yaml` → klare Fehlermeldung beim Start
- [ ] Unit-Test: Runner-Args enthalten `--model`
- [ ] `npm run build && npm test` grün
## Dateien (erwartet)
- `src/agent/schema.ts`
- `src/agent/identity.ts`
- `src/commands/new-agent.ts`
- `src/agent/runner.ts`
- `src/config/models.ts` (Allowlist)
- `tests/unit/runner-model.test.ts`
## Abhängigkeiten
Keine harten. Kann parallel zu DIS-151 laufen.