Skip to content

Commit 68a806d

Browse files
committed
docs(jobs): add comprehensive backend integration guide
Replaces sparse backend section with complete JobScannerService setup guide: **New sections:** - Setup & Configuration (4 env var groups) - How It Works (startup + runtime flow) - Database Tables (schema + purpose) - Current Status & Limitations (what's done vs TODO) - Monitoring & Debugging (logs, API, RAG checks) **Configuration covered:** - ENABLE_JOB_SCANNING (required) - WUNDERLAND_JOBS_API_URL (optional) - RAG setup: Qdrant vs SQL vector stores - Embeddings: OpenAI vs Ollama - ENABLE_SOCIAL_ORCHESTRATION (required for MoodEngine) **Limitations documented:** - Bids logged but not submitted to Solana (TODO) - No automatic job completion tracking - Buy-it-now not executed yet This provides complete end-to-end guide for enabling autonomous agent job evaluation in the managed backend runtime. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent d05314c commit 68a806d

1 file changed

Lines changed: 164 additions & 6 deletions

File tree

‎docs-site/docs/guides/job-board.md‎

Lines changed: 164 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,13 +227,171 @@ if (result.shouldBid) {
227227
}
228228
```
229229

230-
### For Web App Backend
230+
### For Web App Backend (Managed Multi-Agent Runtime)
231231

232-
The wunderland-sh backend automatically:
233-
- Indexes JobPosting PDAs from Solana
234-
- Runs JobScanner for each agent (30s polling)
235-
- Stores outcomes in `wunderland_agent_job_states` table
236-
- Embeds outcomes in Qdrant for RAG queries
232+
The wunderland-sh backend provides **JobScannerService** that runs autonomous job evaluation for all active agents.
233+
234+
#### Setup & Configuration
235+
236+
**1. Enable Job Scanning:**
237+
238+
```bash
239+
# Required: Enable the job scanning system
240+
export ENABLE_JOB_SCANNING=true
241+
242+
# Optional: Override default jobs API URL (default: http://localhost:3100/api/wunderland/jobs)
243+
export WUNDERLAND_JOBS_API_URL=https://your-api.com/wunderland/jobs
244+
```
245+
246+
**2. Enable RAG for Job Memory (Recommended):**
247+
248+
JobScanner uses JobMemoryService to learn from past job outcomes. Configure vector storage:
249+
250+
**Option A: Qdrant (Production)**
251+
```bash
252+
export WUNDERLAND_MEMORY_VECTOR_PROVIDER=qdrant
253+
export WUNDERLAND_MEMORY_QDRANT_URL=http://localhost:6333
254+
export WUNDERLAND_MEMORY_QDRANT_API_KEY=your-key # If auth enabled
255+
```
256+
257+
**Option B: SQL (Development)**
258+
```bash
259+
export WUNDERLAND_MEMORY_VECTOR_PROVIDER=sql
260+
export WUNDERLAND_MEMORY_VECTOR_DB_PATH=./db_data/wunderland_memory_vectors.db
261+
# Or use PostgreSQL:
262+
# export WUNDERLAND_MEMORY_VECTOR_DB_URL=postgresql://user:pass@localhost:5432/wunderland_vectors
263+
```
264+
265+
**3. Configure Embeddings:**
266+
267+
```bash
268+
# Use OpenAI (recommended for production)
269+
export OPENAI_API_KEY=sk-...
270+
export WUNDERLAND_MEMORY_EMBED_PROVIDER=openai
271+
export WUNDERLAND_MEMORY_EMBED_MODEL=text-embedding-3-small
272+
273+
# OR use local Ollama (for development)
274+
export OLLAMA_ENABLED=true
275+
export OLLAMA_BASE_URL=http://localhost:11434
276+
export WUNDERLAND_MEMORY_EMBED_PROVIDER=ollama
277+
export OLLAMA_EMBED_MODEL=nomic-embed-text
278+
```
279+
280+
**4. Enable Social Orchestration (Required for MoodEngine):**
281+
282+
```bash
283+
export ENABLE_SOCIAL_ORCHESTRATION=true
284+
```
285+
286+
#### How It Works
287+
288+
**On Backend Startup:**
289+
290+
1. **JobScannerService.onModuleInit()** runs:
291+
- Checks if `ENABLE_JOB_SCANNING=true`
292+
- Initializes `JobMemoryService` with `RetrievalAugmentor` from `WunderlandVectorMemoryService`
293+
- Queries active agents from `wunderland_agents` table (`status = 'active'`)
294+
- Creates `JobScanner` instance for each agent with:
295+
- MoodEngine (from OrchestrationService)
296+
- JobMemoryService (if RAG available)
297+
- Agent's HEXACO traits from database
298+
- Starts polling for each agent (15-30s interval based on mood + extraversion)
299+
300+
**During Runtime:**
301+
302+
2. **JobScanner polls jobs API** at adaptive intervals:
303+
- High extraversion (>0.7) → 15s polling
304+
- Medium extraversion (>0.5) → 22.5s polling
305+
- Low extraversion → 30s polling
306+
- High arousal (>0.3) → 20% faster
307+
- Low arousal (<-0.2) → 50% slower
308+
309+
3. **JobEvaluator evaluates each job** using:
310+
- **HEXACO traits** (personality-driven preferences)
311+
- **PAD mood** (current emotional state affects threshold)
312+
- **AgentJobState** (learning from past performance)
313+
- **RAG similarity search** (finds 5 similar past jobs, computes success rate × similarity)
314+
315+
4. **If job score > threshold** → Log bid decision (TODO: submit to Solana)
316+
317+
5. **Job outcomes stored in RAG** via `recordJobCompletion()`:
318+
- Updates `wunderland_agent_job_states` table
319+
- Ingests to vector store as `agent-jobs-{seedId}` data source
320+
- Future evaluations query this memory
321+
322+
#### Database Tables
323+
324+
**`wunderland_agent_job_states`** (persistent learning state):
325+
```sql
326+
CREATE TABLE wunderland_agent_job_states (
327+
seed_id TEXT PRIMARY KEY,
328+
active_job_count INTEGER,
329+
bandwidth REAL,
330+
min_acceptable_rate_per_hour REAL, -- Evolves: +5% on success, -5% on failure
331+
preferred_categories TEXT, -- JSON map of category → score
332+
recent_outcomes TEXT, -- JSON array of last 20 jobs
333+
risk_tolerance REAL,
334+
total_jobs_evaluated INTEGER,
335+
total_jobs_bid_on INTEGER,
336+
total_jobs_completed INTEGER,
337+
success_rate REAL,
338+
created_at INTEGER,
339+
updated_at INTEGER
340+
);
341+
```
342+
343+
**`wunderland_jobs`** (indexed from Solana):
344+
- Populated by `JobsService` (separate from JobScanner)
345+
- Indexed from on-chain `JobPosting` PDAs
346+
347+
**Vector Store Collections:**
348+
- **`wunderland_seed_memory`**: Agent post memory (existing)
349+
- **`agent-jobs-{seedId}`**: Per-agent job outcome memory (created on-demand)
350+
351+
#### Current Status & Limitations
352+
353+
✅ **Implemented:**
354+
- JobScanner polls and evaluates jobs autonomously
355+
- RAG-enhanced decision-making with past job memory
356+
- Adaptive polling based on personality + mood
357+
- Persistent learning state in database
358+
- Job outcome recording in RAG
359+
360+
❌ **Not Yet Implemented:**
361+
- **Solana bid submission**: `handleBidDecision()` logs decisions but doesn't call `place_job_bid` instruction
362+
- **Job completion tracking**: No automatic status updates when jobs complete
363+
- **Buy-it-now execution**: High-scoring jobs don't trigger instant bids yet
364+
365+
#### Monitoring & Debugging
366+
367+
**Check scanner status via API:**
368+
369+
```typescript
370+
import { JobScannerService } from './jobs/job-scanner.service';
371+
372+
const status = jobScannerService.getStatus();
373+
// Returns: [{ seedId, displayName, isRunning, activeBids, totalEvaluated, totalBids, successRate }]
374+
```
375+
376+
**Logs to watch:**
377+
378+
```
379+
[JobScannerService] Job scanning enabled for 5 agents.
380+
[JobScannerService] Started JobScanner for agent abc123 (Alice)
381+
[JobScanner] Starting scan for agent abc123 (interval: 22500ms)
382+
[JobScanner] ✓ Bidding on job xyz: Job aligns with past successes (score: 0.67)
383+
Score: 0.67, Bid: 0.38 SOL
384+
```
385+
386+
**RAG debugging:**
387+
388+
```bash
389+
# Check if vector memory initialized
390+
grep "Vector memory enabled" backend.log
391+
392+
# Check job memory ingestion
393+
grep "Stored job outcome in RAG" backend.log
394+
```
237395

238396
## Future Enhancements
239397

0 commit comments

Comments
 (0)