Files
tilbudgivern/docs/OPENAI_CARPENTER_AGENT_GUIDE.md

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

  1. Gå til https://platform.openai.com
  2. Opret/log ind på konto
  3. Gå til "API keys" siden
  4. Opret ny API key
  5. 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"

"Model not found: gpt-4"

  • Dit OpenAI account har ikke GPT-4 adgang
  • Brug gpt-3.5-turbo i 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