13 KiB
13 KiB
🔨 OpenAI Carpenter Agent - Guide
En intelligent carpenter agent der bruger OpenAI GPT-4 til at simulere realistiske tømrere som kan teste dit site helt autonomt.
🎯 Hvad Gør Det?
Den OpenAI carpenter agent har to hoveddele:
1. CLI Agent (carpenter-agent-openai.js)
- Interaktiv chat med AI-baserede tømrere
- Genererer realistiske tilbud gennem naturligt sprog
- Lærer fra feedback og kontekst
- Kan køre i både interaktiv og batch-mode
2. Browser Agent (tests/carpenter-agent-openai.spec.js)
- Playwright-baseret UI automation
- OpenAI styrer hvilke klik og input der skal foretages
- Dynamisk læring baseret på UI-struktur
- Intelligente fejlhåndtering og retry-logik
🚀 Installation & Setup
Krav
# Node.js 18+
node --version
# OpenAI API key (kostet $-dollars)
export OPENAI_API_KEY="sk-..."
Få OpenAI API Key
- Gå til https://platform.openai.com
- Opret/log ind på konto
- Gå til "API keys" siden
- Opret ny API key
- Kopi og gem den sikkert
📖 Brug
1. Interaktiv Carpenter Chat
# Standard - Lars Nielsen
node carpenter-agent-openai.js --interactive
# Velg specifik carpenter
node carpenter-agent-openai.js --interactive --carpenter=jannick
# Tilgængelige carpenters: lars, jannick, alexander
Eksempel Dialog:
🔨 Lars Nielsen: Hej! Jeg er Lars Nielsen.
Jeg har 15 år erfaring inden for tag og terrasser.
Hvordan kan jeg hjælpe dig i dag?
👤 Du: Jeg har en tagflade der lækker
🔨 Lars Nielsen: Ah ja, tagligt kan være problematisk.
Hvor stort område cirka? Og hvor gammelt er taget?
👤 Du: Ca 40m² og omkring 20 år gammelt
🔨 Lars Nielsen: ---QUOTE_SUMMARY---
PROJEKT: Tagreparation - Lækket område
...
---END_QUOTE---
2. Automatisk Quote Generation
# Generér 5 tilbud og gem dem
node carpenter-agent-openai.js --generate-quotes=5 --save
# Generér 10 tilbud
node carpenter-agent-openai.js --generate-quotes=10 --save
# Bare generér (print kun til console)
node carpenter-agent-openai.js --generate-quotes=3
Output:
🤖 GENERATING 3 QUOTES WITH AI CARPENTER AGENTS
📝 Quote 1/3
🔨 Carpenter: Lars Nielsen
⏳ Generating...
✅ Quote created: Tagreparation
✅ Quotes saved to: test-results/carpenter-openai-data/ai-quotes-2025-12-23.json
3. Browser UI Tests (Playwright)
# Kør alle carpenter AI browser tests
cd tests
npx playwright test carpenter-agent-openai.spec.js
# Med headed browser (se hvad der sker)
npx playwright test carpenter-agent-openai.spec.js --headed
# Med UI debug mode
npx playwright test carpenter-agent-openai.spec.js --ui
# Se test report
npx playwright show-report
🏗️ Arkitektur
CLI Agent (carpenter-agent-openai.js)
┌─────────────────────┐
│ Carpenter Persona │
│ (Name, Skills) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ System Prompt │ ← Definerer carpenter persona
│ (Role, Behavior) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Conversation Loop │ ← User input
│ (Messages) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ OpenAI GPT-4 │ ← Intelligent response
│ API Call │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Quote Extraction │ ← Parse QUOTE_SUMMARY
│ & Saving │
└─────────────────────┘
Browser Agent (carpenter-agent-openai.spec.js)
┌──────────────────────┐
│ Playwright Page │
│ (Browser Instance) │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Capture Page State │ ← Buttons, inputs, headings
│ (HTML Analysis) │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ OpenAI Decision │ ← "What should I do?"
│ (Context + State) │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Execute Action │ ← Click, fill, type
│ (Playwright) │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Validate Result │ ← Check success
│ & Store Data │
└──────────────────────┘
🔌 API Integration
OpenAI Model Used
- Model:
gpt-4 - Temperature: 0.7-0.8 (kreativ men stabil)
- Max tokens: 1000-1500
System Prompts
Hver carpenter får en detaljeret system prompt:
Du er [Navn], en erfaren tømrer med [XX år] erfaring...
Din rolle:
1. Høre omhyggeligt på kunden
2. Stille opklarende spørgsmål
3. Give praktisk vejledning
4. Estimere realistiske priser
5. Dokumentere projektdetaljer
Når du har nok info, præsentér tilbuddet i format:
---QUOTE_SUMMARY---
PROJEKT: [Navn]
BESKRIVELSE: [Detaljer]
OMRÅDE: [m²]
ESTIMERET VARIGHED: [Tid]
ESTIMERET PRIS: [DKK range]
MATERIALER: [Liste]
NOTER: [Særlige bemærkninger]
---END_QUOTE---
💾 Data Format
Quote Fra CLI Agent
{
"timestamp": "2025-12-23T10:30:00.000Z",
"carpenter": {
"name": "Lars Nielsen",
"experience": "15 år",
"specialty": "Tag og terrasser",
"email": "lars@tommer.dk"
},
"projectName": "Tagreparation - Lækket område",
"description": "Udbedring af lække område på 40m² tagflade",
"area": "40 m²",
"timeline": "3-5 dage",
"price": "DKK 35.000 - 45.000",
"materials": "Tagsten, mørtelmasse, bly, lister",
"notes": "...detaljerede noter..."
}
Test Data Fra Playwright
{
"timestamp": "2025-12-23T10:30:00.000Z",
"carpenter": {
"id": "lars",
"name": "Lars Nielsen",
"specialty": "Tag og terrasser"
},
"project": "En 40m² tagflade med nogle lække steder...",
"steps": 7,
"quoteGenerated": true,
"screenshot": "lars-0-quote.png",
"url": "http://localhost:4032/quote/123"
}
🎭 Carpenter Personas
1. Lars Nielsen (15 år - Tag & Terrasser)
{
approach: "Jeg arbejder metodisk og fokuserer på præcision",
projects: [
"40m² tagflade med lække steder",
"24m² terrasse i løst træ"
]
}
2. Jannick Andersen (12 år - Indendørs Renovering)
{
approach: "Jeg er kreativ og løsningsorienteret",
projects: [
"45m² parketgulv i stue og gang",
"Stor garderobe med skydedøre"
]
}
3. Alexander Ørneby Andersen (8 år - Moderne Bygning)
{
approach: "Jeg holder mig ajour med nye teknologier",
projects: [
"5 nye dørinstallationer",
"Håndværkerspil på 12 vinduer"
]
}
🔧 Tilpasning
Tilføj Ny Carpenter
I carpenter-agent-openai.js eller carpenter-agent-openai.spec.js:
const CARPENTER_PERSONAS = {
anders: {
name: 'Anders Hansen',
experience: '20 år',
specialty: 'Specialiseret snedkeri',
description: 'Du er Anders...',
projects: [
'Projektbeskrivelse 1',
'Projektbeskrivelse 2'
]
}
};
Ændre AI Adfærd
I getSystemPrompt() eller decideNextAction():
// Skift temperature for mere/mindre kreativitet
temperature: 0.9 // Mere kreativ (0-1)
temperature: 0.3 // Mere fokuseret
// Ændre model
model: 'gpt-3.5-turbo' // Billigere, hurtigere
model: 'gpt-4' // Smartere, dyrere
Custom Project Templates
const generateRandomProjectPrompt = (carpenter) => {
const projects = {
anders: [
'Jeg ønsker skræddersyet snedkerarbejde...',
'Jeg har brug for...'
]
};
// ...
}
💰 Omkostninger
OpenAI API kostet ca:
- gpt-4: ~$0.03 pr 1K input tokens, $0.06 pr 1K output tokens
- gpt-3.5-turbo: ~$0.0005 pr 1K input tokens, $0.0015 pr 1K output tokens
Estimeret kostning per carpenter agent run:
5 quotes generations: ~$0.10-0.20
10 UI tests: ~$0.20-0.50
Total monthly (100 runs): ~$10-20
🐛 Troubleshooting
"OPENAI_API_KEY is not set"
# Check if key is set
echo $OPENAI_API_KEY
# Set it if not
export OPENAI_API_KEY="sk-..."
# Or in .env file
echo "OPENAI_API_KEY=sk-..." >> .env
"OpenAI API error: 401 Unauthorized"
- Nøglen er forkert eller udløbet
- Generer ny nøgle fra https://platform.openai.com
"Model not found: gpt-4"
- Dit OpenAI account har ikke GPT-4 adgang
- Brug
gpt-3.5-turboi stedet - Eller request GPT-4 access på OpenAI website
Browser tests timeout
# Øg timeout
npx playwright test --timeout 60000
# Eller i playwright.config.js
timeout: 60000
📊 Eksempel Output
CLI Generation
🤖 GENERATING 3 QUOTES WITH AI CARPENTER AGENTS
📝 Quote 1/3
🔨 Carpenter: Lars Nielsen
⏳ Generating...
✅ Quote created: Tagreparation - Lækket område
Price: DKK 38.500 - 48.000
Timeline: 3-5 dage
📝 Quote 2/3
🔨 Carpenter: Jannick Andersen
⏳ Generating...
✅ Quote created: Parketlægning på 45m²
Price: DKK 42.000 - 56.000
Timeline: 5-7 dage
📝 Quote 3/3
🔨 Carpenter: Alexander Ørneby Andersen
⏳ Generating...
✅ Quote created: Dørinstallation
Price: DKK 15.000 - 22.000
Timeline: 2-3 dage
✅ Quotes saved to: test-results/carpenter-openai-data/ai-quotes-2025-12-23.json
Browser Test
🔨 CARPENTER: Lars Nielsen
📋 PROJECT: En 40m² tagflade med nogle lække steder der skal udbedres
════════════════════════════════════════════════════════════════════════════
🌐 Navigating to application...
🔐 Logging in...
📍 Step 1:
Current page: Tilbudgiveren - Home
🤖 AI thinking...
AI Decision: click button "Opret Tilbud"
→ Executing: click button "Opret Tilbud"
✅ Action succeeded
📍 Step 2:
Current page: Opret nyt tilbud
AI Decision: fill input "Projektbeskrivelse" with "En 40m² tagflade..."
✅ Filled: Projektbeskrivelse = En 40m² tagflade...
[... flere steps ...]
✅ Quote appears to be generated!
✅ Test completed - Data saved to test-results/carpenter-openai-lars-0.json
🚀 NPM Scripts (foreslået)
Tilføj til package.json:
{
"scripts": {
"carpenter:interactive": "node carpenter-agent-openai.js --interactive",
"carpenter:interactive:jannick": "node carpenter-agent-openai.js --interactive --carpenter=jannick",
"carpenter:quotes": "node carpenter-agent-openai.js --generate-quotes=5 --save",
"carpenter:quotes:10": "node carpenter-agent-openai.js --generate-quotes=10 --save",
"carpenter:browser": "cd tests && npx playwright test carpenter-agent-openai.spec.js",
"carpenter:browser:headed": "cd tests && npx playwright test carpenter-agent-openai.spec.js --headed",
"carpenter:browser:ui": "cd tests && npx playwright test carpenter-agent-openai.spec.js --ui"
}
}
Så kan du køre:
npm run carpenter:interactive
npm run carpenter:quotes:10
npm run carpenter:browser:headed
📈 Avanceret Brug
Brug Generated Quotes i Tests
// Load quotes
const quotes = JSON.parse(
fs.readFileSync('test-results/carpenter-openai-data/ai-quotes-2025-12-23.json')
);
// Use in tests
test('Validate AI generated quotes', async () => {
for (const quote of quotes) {
expect(quote.projectName).toBeTruthy();
expect(quote.price).toMatch(/DKK/);
}
});
Streaming Responses
// For real-time updates (advanced)
const stream = await openai.chat.completions.create({
model: 'gpt-4',
stream: true,
messages: [...]
});
for await (const chunk of stream) {
process.stdout.write(
chunk.choices[0]?.delta?.content || ''
);
}
🎓 Learning Resources
Sidst opdateret: December 2025
Status: ✅ Ready for production testing
AI Model: GPT-4
Test Coverage: 6 diverse carpenter profiles & projects