Skip to content
dsh.fish
Bundle

werewolf-engine

9人局狼人杀多Agent游戏引擎(DeepSeek Harness 插件):自动主持、角色技能、警长竞选、投票、复盘、人类席位、跨局知识库、素材管线

Source
VegeFin
stars
1 stars
License
MIT
Updated
Updated yesterday

Readme

English | [简体中文](README.zh.md)

# Evolving-Werewolf

> **AI players get stronger with every game.**

**Cross-game knowledge accumulation and evolution**: After each game, the engine automatically distills post-game review experience, writing it into a knowledge base partitioned by role (wolf faction / good faction / seer / witch / hunter strategy, etc.). At the start of the next game, these experiences are injected into the new batch of player agents' personas as skills. **AI players learn from every win and loss — developing stealthier kill strategies, more accurate seer checks, smarter voting patterns.** The more games played, the stronger the AI becomes.

### How It Evolves

```
Game 1: AI players act on rules and personality seeds, may make beginner mistakes
        ↓ Post-game auto-review → distill experience entries into knowledge.json
Game 2: New AI players carry previous game's experience, avoid known pitfalls
        ↓ Another review → knowledge base grows
Game N: AI players have dozens of games' experience, tighter speech logic,
        sharper voting, stealthier wolf plays, deeper good-faction reasoning
```

Human players don't face fixed-strategy AI, but an **opponent collective that continuously evolves with accumulated game experience**.

### Other Features

Beyond the evolution mechanism, this is a complete 9-player Werewolf engine (3 Wolves / 1 Seer / 1 Witch / 1 Hunter / 3 Villagers), running on **DeepSeek Harness (DSH)**:

- **Engine-hosted**: No LLM gamemaster — all flows driven by a state machine. Saves tokens, zero information distortion.
- **Full role abilities**: Wolf two-round discussion + majority vote, Seer verification, Witch save/poison (first-night self-save, one potion per night), Hunter's last shot.
- **Standard day flow**: Sheriff election → campaign speeches → withdrawal declarations → sheriff vote → sheriff sets speech direction → sequential speeches → recorded public vote (sheriff 1.5x vote weight, tie → revote).
- **Information isolation**: Kill target only visible to wolves and witch; night death cause not public; each role's channel is private; incremental delivery only sends "information the player hasn't seen yet".
- **Anti-stuck mechanism**: 60s nudge + 180s timeout skip + running-aware (slow players not killed prematurely) + advancement mutex lock.
- **Death freeze + snapshot review**: Eliminated players' info frozen, post-game outputs causally clean decision trajectory reviews.
- **Human seat + browser panel**: `humanSeat` randomly assigns a human seat, actions via HTTP panel, fully competing with AI agents.
- **Asset pipeline**: Integrated Zhipu AI vision (GLM-4V-Flash) + image generation (CogView-3-Flash), free tier is sufficient for UI avatars and character art.
- **Personality seeds**: 9 personality types randomly assigned, diverse player styles.

---

## Installation

### Prerequisites

- [Node.js](https://nodejs.org/) >= 18
- [DSH (DeepSeek Harness)](https://www.npmjs.com/package/@deepseek-ai/dsh) — install globally:
  ```bash
  npm install -g @deepseek-ai/dsh
  ```

### Install Plugin to DSH

```bash
# 1. Clone the repo
git clone https://github.com/VegeFin/Evolving-Werewolf.git
cd Evolving-Werewolf

# 2. Install dependencies (runtime dep: @deepseek-ai/dsh-tools)
pnpm install   # or npm install

# 3. Add to DSH web profile
dsh plugin --profile web add ./

# 4. Restart DSH
dsh web
```

After restart, `werewolf_*` tools are globally available. The plugin auto-loads with the profile.

### Configuration

#### image-config.json (Asset Pipeline API Key)

```bash
cp image-config.example.json image-config.json
```

Edit `image-config.json`, fill in your Zhipu API Key (register free at [open.bigmodel.cn](https://open.bigmodel.cn)):

```json
{
  "apiKey": "your-api-key",
  "baseURL": "https://open.bigmodel.cn/api/paas/v4",
  "visionModel": "glm-4v-flash",
  "drawModel": "cogview-3-flash",
  "drawSize": "1024x1024",
  "assetDir": "ui/assets"
}
```

> The asset pipeline is optional. Without it, only the image analysis/generation tools are affected — core gameplay is fully functional.

#### knowledge.json (Knowledge Base Seed)

```bash
cp knowledge.example.json knowledge.json
```

The engine automatically distills experience and writes it to `knowledge.json` after each game. `knowledge.example.json` provides 8 initial seed entries.

---

## Usage

### Host Perspective

Call tools in a DSH agent session:

| Tool | Purpose | Caller |
|---|---|---|
| `werewolf_start` | Start game: random role assignment, spawn 8 player agents, begin with human player. Omit `humanSeat` for auto-random 1-9. Set `humanSeat=0` for 9-agent self-evolving game. | Host |
| `werewolf_act` | Player action (18 actions) | Player |
| `werewolf_status` | View public state; host sees full role table and review report | All |
| `werewolf_ask_rule` | Query rules/role abilities | All |
| `werewolf_abort` | Host aborts the game | Host |
| `werewolf_look` | Analyze image with vision model | Host |
| `werewolf_draw` | Generate image with text-to-image model | Host |
| `werewolf_assets_status` | Check asset pipeline status | Host |

`werewolf_start` return value includes `hostGuide` (host instructions) and `panelUrl` (human player panel URL).

### Player Actions (werewolf_act)

| action | Description | Phase |
|---|---|---|
| `speech` + `text` | Give a speech | day-speech / day-sheriff-speech |
| `vote` + `target` | Cast exile vote (0=abstain) | day-vote |
| `sheriff_vote` + `target` | Vote for sheriff | day-sheriff-vote |
| `sheriff_run` / `sheriff_not` | Run for sheriff / decline | day-sheriff-run |
| `sheriff_stay` / `sheriff_quit` | Stay in / withdraw | day-sheriff-quit |
| `direction` + `text=left/right` | Sheriff sets speech direction | day-direct |
| `pass_sheriff` + `target` | Sheriff passes badge on elimination | sheriff-pass |
| `kill` + `target` + `text` | Wolf kills target | night-wolves |
| `seer` + `target` | Seer verifies target | night-seer |
| `witch_save` / `witch_poison`+`target` / `witch_none` | Witch uses potion | night-witch |
| `hunter` + `target` | Hunter shoots (0=don't shoot) | night/day-hunter |
| `alive` | Online confirmation | any |
| `review` + `text` | Submit post-game review | review |

### Human Player Panel

After game start, visit `http://127.0.0.1:<port>/werewolf/panel` in your browser. The panel provides:

- Identity card (seat, role)
- Event stream (categorized by kind: wolf/seer/witch/death/sheriff/info)
- Speech stage (displayed sequentially)
- Action area (gate-driven: forms only shown when it's your turn)

---

## Directory Structure

```
Evolving-Werewolf/
├── lib/
│   └── index.js              # Static engine main file (v33, pure host)
├── ui/
│   ├── panel.html            # Human player panel (HTTP route)
│   ├── assets/               # Avatars and character art (PNG)
│   └── protos/               # UI prototype HTML (dev reference)
├── archive/                  # Dynamic version source archive (dev/debug, zero-restart)
│   ├── dev/
│   │   ├── wwdev-engine.host.js    # Engine dynamic version
│   │   ├── wwim6-assets.host.js    # Asset pipeline dynamic version
│   │   └── wwui10-panel.host.js    # Panel dynamic version
│   ├── v32.host.js           # v32 host archive
│   ├── v32.client.js         # v32 client archive
│   └── werewolf-v21.host.source.js  # v21 original archive
├── cordis.patch.yml          # DSH bundle patch config
├── image-config.example.json # API Key config template
├── knowledge.example.json    # Knowledge base seed template
├── package.json
├── PROGRESS.md               # Version history and progress
└── .gitignore
```

### Public vs Private

| File | Status | Notes |
|---|---|---|
| `lib/index.js` | Public | Engine main code |
| `ui/` | Public | Panel, images, prototypes |
| `archive/` | Public | Dynamic version archive (dev reference) |
| `*.example.json` | Public | Config templates |
| `package.json` / `cordis.patch.yml` | Public | Package metadata |
| `*.md` | Public | Documentation |
| `knowledge.json` | Public | Runtime knowledge base data |
| `image-config.json` | **gitignore** | Contains real API Key |
| `last-review.json` | **gitignore** | Last game review data |
| `review-processed.json` | **gitignore** | Review processing marker |
| `node_modules/` | **gitignore** | Dependencies |
| `.ww-tmp/` | **gitignore** | Subprocess temp files |

---

## Architecture

### Layer Division

```
Host Layer
├── Werewolf Engine (this plugin)
│   ├── State machine (game object, in-memory)
│   ├── Tool registration (werewolf_*, globally visible)
│   ├── timer heartbeat (30s timeout/nudge check)
│   ├── webServer routes (/werewolf/panel + /werewolf/api/* + /werewolf-assets/*)
│   └── Message delivery (subagents.followup / Agent.steer fallback)
└── DSH infrastructure (subagents / agents / tools / webServer / timer / fs / subprocess)

Agent Layer
├── Host (current session): werewolf_start / status / abort
└── 9 players (continuable subagents)
    ├── persona = rulebook + identity + personality seed + historical experience
    ├── toolFilter = only werewolf_act / status / ask_rule
    └── Actions via werewolf_act
```

### State Machine Phases

```
setup → night-wolves → night-seer → night-witch → night-settle
     → day-sheriff-run → day-sheriff-speech → day-sheriff-quit → day-sheriff-vote
     → day-direct → day-speech → day-vote → (night-*) loop
     → gameover → review
```

### Key Service Dependencies (inject declaration)

```js
inject: ['subagents', 'agents', 'tools', 'webServer']
```

Cordis service-driven activation: waits for all four services to be ready before executing `apply()`, preventing early route registration exit.

---

## Rule Implementation

- **Roles**: 3 Wolves + 1 Seer + 1 Witch + 1 Hunter + 3 Villagers, `shuffle` random assignment.
- **Wolves**: Random order two-round discussion, majority vote (tie → first voter breaks tie).
- **Seer**: Verify 1 alive player each night, result is private.
- **Witch**: One heal + one poison potion; first night can self-save; after heal used, no longer informed of kill target.
- **Hunter**: Can shoot when eliminated by wolf kill or vote (not when poisoned).
- **Sheriff**: Elected, 1.5x vote weight, sets speech direction, passes badge on elimination.
- **Voting**: Recorded public vote; tie → second round limited to tied players.
- **Win condition**: All wolves eliminated → good faction wins; all gods or all villagers eliminated → wolves win (faction annihilation).

---

## Development

### Static vs Dynamic Version

| Mode | File | Characteristics |
|---|---|---|
| Static (production) | `lib/index.js` | Standard Cordis plugin, auto-loaded by `dsh web`, restart to take effect |
| Dynamic (development) | `archive/dev/*.host.js` | `cordis_define` injected into memory, zero-restart code changes, lost on restart |

Use dynamic version for development iteration, then consolidate into `lib/index.js`. Dynamic version uses `harness.defineTool`, static version uses `defineTool` from `@deepseek-ai/dsh-tools`.

---

## Known Limitations

- One game takes ~15-40 minutes (9 players × LLM rounds per phase).
- Game state is in plugin memory, cleared on restart.
- Player agent sessions are persistent cold archives, accumulate across games (manual cleanup or auto-release active layer on game start).
- Review knowledge base is memory-level (valid cross-game within process, cleared on restart; can be persisted to `knowledge.json`).

---

## License

MIT

Install

dsh plugin --profile web add github:VegeFin/Evolving-Werewolf

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source