242 lines
7.7 KiB
Markdown
242 lines
7.7 KiB
Markdown
# Mortdecai API — Pay With Data
|
|
|
|
A public inference API for the Mortdecai Minecraft AI model where users earn access by contributing training data.
|
|
|
|
## Concept
|
|
|
|
Every AI model gets better with more data. Most APIs charge money. This one charges data.
|
|
|
|
Users submit training examples — prompt/response pairs verified against a real Minecraft server — and earn credits for inference calls. The model improves from every contribution, which improves the API for everyone.
|
|
|
|
---
|
|
|
|
## How It Works
|
|
|
|
```
|
|
┌──────────┐ ┌──────────────┐ ┌─────────────┐
|
|
│ User │────▶│ API Gateway │────▶│ Mortdecai │
|
|
│ Client │◀────│ (credits, │◀────│ (Ollama) │
|
|
│ │ │ validation)│ │ │
|
|
└──────────┘ └──────┬───────┘ └─────────────┘
|
|
│
|
|
┌──────┴───────┐
|
|
│ Validation │
|
|
│ Server │
|
|
│ (RCON test) │
|
|
└──────────────┘
|
|
```
|
|
|
|
### 1. Get an API Key
|
|
|
|
Register and receive an API key with an initial credit balance.
|
|
|
|
### 2. Use Credits for Inference
|
|
|
|
```bash
|
|
curl -X POST https://api.mortdec.ai/v1/generate \
|
|
-H "Authorization: Bearer mk_your_api_key" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"mode": "sudo",
|
|
"prompt": "give me a diamond sword with sharpness 5",
|
|
"player": "Steve",
|
|
"server_context": {"version": "1.21.x"}
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"commands": ["give Steve minecraft:diamond_sword[enchantments={sharpness:5}] 1"],
|
|
"reasoning": "Diamond sword with sharpness 5 enchantment in 1.21 component syntax",
|
|
"risk_level": 3,
|
|
"credits_remaining": 99
|
|
}
|
|
```
|
|
|
|
Each call costs 1 credit.
|
|
|
|
### 3. Earn Credits by Contributing Data
|
|
|
|
```bash
|
|
curl -X POST https://api.mortdec.ai/v1/contribute \
|
|
-H "Authorization: Bearer mk_your_api_key" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"prompt": "sudo give me a trident with riptide 3 and loyalty 3",
|
|
"expected_output": {
|
|
"commands": ["give Steve minecraft:trident[enchantments={riptide:3,loyalty:3}] 1"],
|
|
"reasoning": "Riptide and loyalty are mutually exclusive in vanilla Minecraft"
|
|
},
|
|
"notes": "This should fail — riptide and loyalty cannot coexist"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"accepted": false,
|
|
"reason": "Correct! Riptide and loyalty are mutually exclusive. This is a valuable negative example.",
|
|
"credits_earned": 15,
|
|
"credits_remaining": 114,
|
|
"validation": {
|
|
"schema_valid": true,
|
|
"rcon_tested": true,
|
|
"rcon_result": "error — conflicting enchantments",
|
|
"duplicate": false,
|
|
"quality_score": 0.92
|
|
}
|
|
}
|
|
```
|
|
|
|
Accepted contributions earn 5-20 credits depending on quality:
|
|
|
|
| Quality | Credits | What makes it valuable |
|
|
|---------|---------|----------------------|
|
|
| Basic | 5 | Valid format, correct command |
|
|
| Good | 10 | Uncommon prompt phrasing or edge case |
|
|
| Excellent | 15 | Negative example, error correction, or novel scenario |
|
|
| Exceptional | 20 | New command pattern, modded content, or bug discovery |
|
|
|
|
Rejected contributions earn 0 credits but don't cost anything.
|
|
|
|
---
|
|
|
|
## Credit System
|
|
|
|
| Tier | Starting Credits | Monthly Refresh | Earn Rate |
|
|
|------|-----------------|----------------|-----------|
|
|
| **Free** | 100 | 100 | 5-20 per accepted contribution |
|
|
| **Contributor** | 500 | Unlimited* | Same |
|
|
| **Paid** | Per purchase | N/A | Optional contributions |
|
|
|
|
*Contributor tier requires maintaining a positive contribution rate (at least 10 accepted submissions per month).
|
|
|
|
### Credit Economics
|
|
|
|
- 1 inference call = 1 credit
|
|
- 1 accepted basic contribution = 5 credits (5 free inferences)
|
|
- 1 accepted excellent contribution = 15 credits (15 free inferences)
|
|
- Average user contributes 2-3 examples per session = 10-45 credits earned
|
|
|
|
The math works: heavy API users are also heavy contributors. The model improves proportionally to usage.
|
|
|
|
---
|
|
|
|
## Validation Pipeline
|
|
|
|
Every contribution goes through automated validation before credits are awarded:
|
|
|
|
```
|
|
Contribution → Schema Check → Dedup → RCON Test → Quality Score → Accept/Reject
|
|
```
|
|
|
|
### Schema Check
|
|
- Valid JSON format
|
|
- Required fields present (prompt, expected_output)
|
|
- Commands use correct Minecraft 1.21 syntax
|
|
- No forbidden commands (ban, op, stop, etc.)
|
|
|
|
### Deduplication
|
|
- Compare against existing training dataset
|
|
- Fuzzy match on prompt similarity (>90% = duplicate)
|
|
- Same prompt from multiple users: first contributor gets full credit, subsequent get 2 credits for validation
|
|
|
|
### RCON Verification
|
|
- Commands executed on a sandboxed Minecraft server
|
|
- Success/failure recorded
|
|
- Error messages captured for error-correction training pairs
|
|
|
|
### Quality Scoring
|
|
- Novelty: how different is this from existing data? (0-1)
|
|
- Correctness: did RCON succeed? (0-1)
|
|
- Complexity: multi-command, enchantments, execute chains score higher
|
|
- Category balance: underrepresented categories score higher
|
|
|
|
---
|
|
|
|
## Abuse Prevention
|
|
|
|
| Attack | Defense |
|
|
|--------|---------|
|
|
| Garbage submissions | Schema validation + RCON testing rejects invalid data |
|
|
| Duplicate farming | Fuzzy dedup, diminishing returns on similar prompts |
|
|
| Bot accounts | Rate limit: max 50 contributions/hour per key |
|
|
| Prompt injection in training data | All contributions sandboxed, reviewed before merge |
|
|
| Adversarial training data | Anomaly detection: flag keys with >80% rejection rate |
|
|
| Credit farming without using API | Credits expire after 90 days |
|
|
|
|
---
|
|
|
|
## API Endpoints
|
|
|
|
### Inference
|
|
|
|
```
|
|
POST /v1/generate
|
|
POST /v1/pray (God mode — dramatic responses)
|
|
POST /v1/translate (Sudo mode — command translation only)
|
|
```
|
|
|
|
### Data Contribution
|
|
|
|
```
|
|
POST /v1/contribute Submit a training example
|
|
GET /v1/contribute/schema Get the expected format
|
|
GET /v1/contribute/needed Get categories where data is most needed
|
|
```
|
|
|
|
### Account
|
|
|
|
```
|
|
GET /v1/account Credits, contribution stats, tier
|
|
GET /v1/account/history Recent inference and contribution history
|
|
POST /v1/account/register Create a new API key
|
|
```
|
|
|
|
### Meta
|
|
|
|
```
|
|
GET /v1/model/info Current model version, training stats
|
|
GET /v1/model/categories What the model knows, with coverage scores
|
|
GET /v1/health API status
|
|
```
|
|
|
|
---
|
|
|
|
## What Makes This Different
|
|
|
|
Most ML APIs treat users as consumers. This treats them as collaborators.
|
|
|
|
- **Users with niche servers** contribute data the core team would never generate (modded commands, custom plugins, unusual configurations)
|
|
- **Users who find bugs** get rewarded for reporting them as negative examples
|
|
- **Power users** naturally generate the most valuable edge cases because they push the model hardest
|
|
- **The model gets better for everyone** with every contribution
|
|
|
|
It's a flywheel: better model → more users → more contributions → better model.
|
|
|
|
---
|
|
|
|
## Implementation Status
|
|
|
|
**Phase 1** (Current): Concept and API design
|
|
**Phase 2**: API gateway with credit system
|
|
**Phase 3**: Contribution validation pipeline
|
|
**Phase 4**: Public beta
|
|
|
|
The core model (Mortdecai v4) is running on a live Minecraft server. The API layer and contribution system are being designed.
|
|
|
|
---
|
|
|
|
## Tech Stack
|
|
|
|
- **Model**: Mortdecai v4 (Qwen3.5-9B fine-tuned, QLoRA)
|
|
- **Inference**: Ollama on consumer GPUs
|
|
- **API**: FastAPI + SQLite for credits/keys
|
|
- **Validation**: Sandboxed Paper 1.21 server with RCON
|
|
- **Training**: Automated pipeline — contributions → validation → merge → retrain
|
|
|
|
---
|
|
|
|
Learn more at [mortdec.ai](https://mortdec.ai)
|