# AI Prompts Reference

This document describes the prompts used by each AI service. All prompts are optimized for token efficiency while maintaining accuracy.

## Design Principles

1. **Concise system prompts** - Under 100 tokens where possible
2. **Structured output** - JSON format for reliable parsing
3. **Clear field names** - Consistent naming across services
4. **Score ranges** - 0-1 for confidence, 1-10 for quality

## Filtering Prompt

**Purpose:** Evaluate projects against admin-defined criteria

### System Prompt
```
Project screening assistant. Evaluate each project against the criteria.
Return JSON: {"projects": [{project_id, meets_criteria: bool, confidence: 0-1, reasoning: str, quality_score: 1-10, spam_risk: bool}]}
Assess description quality and relevance objectively.
```

### User Prompt Template
```
CRITERIA: {criteria_text}
PROJECTS: {anonymized_project_array}
Evaluate each project against the criteria. Return JSON.
```

### Example Response
```json
{
  "projects": [
    {
      "project_id": "P1",
      "meets_criteria": true,
      "confidence": 0.9,
      "reasoning": "Project focuses on coral reef restoration, matching ocean conservation criteria",
      "quality_score": 8,
      "spam_risk": false
    }
  ]
}
```

---

## Assignment Prompt

**Purpose:** Match jurors to projects by expertise

### System Prompt
```
Match jurors to projects by expertise. Return JSON assignments.
Each: {juror_id, project_id, confidence_score: 0-1, expertise_match_score: 0-1, reasoning: str (1-2 sentences)}
Distribute workload fairly. Avoid assigning jurors at capacity.
```

### User Prompt Template
```
JURORS: {anonymized_juror_array}
PROJECTS: {anonymized_project_array}
CONSTRAINTS: {N} reviews/project, max {M}/juror
EXISTING: {existing_assignments}
Return JSON: {"assignments": [...]}
```

### Example Response
```json
{
  "assignments": [
    {
      "juror_id": "juror_001",
      "project_id": "project_005",
      "confidence_score": 0.85,
      "expertise_match_score": 0.9,
      "reasoning": "Juror expertise in marine biology aligns with coral restoration project"
    }
  ]
}
```

---

## Award Eligibility Prompt

**Purpose:** Determine project eligibility for special awards

### System Prompt
```
Award eligibility evaluator. Evaluate projects against criteria, return JSON.
Format: {"evaluations": [{project_id, eligible: bool, confidence: 0-1, reasoning: str}]}
Be objective. Base evaluation only on provided data. No personal identifiers in reasoning.
```

### User Prompt Template
```
CRITERIA: {criteria_text}
PROJECTS: {anonymized_project_array}
Evaluate eligibility for each project.
```

### Example Response
```json
{
  "evaluations": [
    {
      "project_id": "P3",
      "eligible": true,
      "confidence": 0.95,
      "reasoning": "Project is based in Italy and focuses on Mediterranean biodiversity"
    }
  ]
}
```

---

## Mentor Matching Prompt

**Purpose:** Recommend mentors for projects

### System Prompt
```
Match mentors to projects by expertise. Return JSON.
Format for each project: {"matches": [{project_id, mentor_matches: [{mentor_index, confidence_score: 0-1, expertise_match_score: 0-1, reasoning: str}]}]}
Rank by suitability. Consider expertise alignment and availability.
```

### User Prompt Template
```
PROJECTS:
P1: Category=STARTUP, Issue=HABITAT_RESTORATION, Tags=[coral, reef], Desc=Project description...
P2: ...

MENTORS:
0: Expertise=[marine biology, coral], Availability=2/5
1: Expertise=[business development], Availability=0/3
...

For each project, rank top {N} mentors.
```

### Example Response
```json
{
  "matches": [
    {
      "project_id": "P1",
      "mentor_matches": [
        {
          "mentor_index": 0,
          "confidence_score": 0.92,
          "expertise_match_score": 0.95,
          "reasoning": "Marine biology expertise directly matches coral restoration focus"
        }
      ]
    }
  ]
}
```

---

## Anonymized Data Structure

All projects sent to AI use this structure:

```typescript
interface AnonymizedProjectForAI {
  project_id: string        // P1, P2, etc.
  title: string             // Sanitized (PII removed)
  description: string       // Truncated + PII stripped
  category: string | null   // STARTUP | BUSINESS_CONCEPT
  ocean_issue: string | null
  country: string | null
  region: string | null
  institution: string | null
  tags: string[]
  founded_year: number | null
  team_size: number
  has_description: boolean
  file_count: number
  file_types: string[]
  wants_mentorship: boolean
  submission_source: string
  submitted_date: string | null // YYYY-MM-DD
}
```

### What Gets Stripped
- Team/company names
- Email addresses
- Phone numbers
- External URLs
- Real project/user IDs
- Internal comments

---

## Token Optimization Tips

1. **Batch projects** - Process 15-20 per request
2. **Truncate descriptions** - 300-500 chars based on task
3. **Use abbreviated fields** - `desc` vs `description`
4. **Compress constraints** - Inline in prompt
5. **Request specific fields** - Only what you need

## Prompt Versioning

| Service | Version | Last Updated |
|---------|---------|--------------|
| Filtering | 2.0 | 2025-01 |
| Assignment | 2.0 | 2025-01 |
| Award Eligibility | 2.0 | 2025-01 |
| Mentor Matching | 2.0 | 2025-01 |

## See Also

- [AI System Architecture](./ai-system.md)
- [AI Services Reference](./ai-services.md)
- [AI Configuration Guide](./ai-configuration.md)
