Spaces:
Running
Running
ckonteos80 commited on
Commit ·
d7b7cac
1
Parent(s): fe6fbbd
Revise README and homepage content/styles
Browse filesExpand and restructure README with full project overview, gameplay, technical architecture, AI pipeline, data logging, and configurable parameters; rename title to "NoExit", change emoji and license to MIT. Update index.html copy (new heading, condensed description, rewritten features list with links) and add CSS for improved feature list layout, links, and notes. These changes clarify functionality, surface documentation links, and improve presentation on the landing page.
- README.md +99 -5
- index.html +45 -9
README.md
CHANGED
|
@@ -1,11 +1,105 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
colorFrom: gray
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
-
license:
|
| 9 |
---
|
| 10 |
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: NoExit
|
| 3 |
+
emoji: 🚪
|
| 4 |
colorFrom: gray
|
| 5 |
+
colorTo: red
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
license: mit
|
| 9 |
---
|
| 10 |
|
| 11 |
+
# NoExit
|
| 12 |
+
|
| 13 |
+
A real-time, text-driven 2D game built in Unity where the player is locked in a room with two AI-generated characters who remember everything you tell them.
|
| 14 |
+
|
| 15 |
+
Inspired by Sartre's *Huis Clos* — there is no exit.
|
| 16 |
+
|
| 17 |
+
---
|
| 18 |
+
|
| 19 |
+
## Gameplay
|
| 20 |
+
|
| 21 |
+
Type freely to converse with two characters whose names, backstories, and personalities are generated at runtime. Every piece of personal information the player reveals is silently extracted and stored — and the characters will bring it up again.
|
| 22 |
+
|
| 23 |
+
- Type text to talk; press **Enter** to submit
|
| 24 |
+
- Press **Enter** again to dismiss a dialogue box
|
| 25 |
+
- Arrow keys move the player character
|
| 26 |
+
- Point and click movement
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
---
|
| 30 |
+
|
| 31 |
+
## Technical Architecture
|
| 32 |
+
|
| 33 |
+
### Engine & Rendering
|
| 34 |
+
- **Unity 2D** (Universal Render Pipeline)
|
| 35 |
+
- **TextMeshPro** for all UI text
|
| 36 |
+
- **Light2D** for atmosphere and reactive flicker effects
|
| 37 |
+
- WebGL build served via Hugging Face Spaces
|
| 38 |
+
|
| 39 |
+
---
|
| 40 |
+
|
| 41 |
+
### AI Pipeline
|
| 42 |
+
|
| 43 |
+
All AI calls route through Hugging Face Spaces — no API keys are exposed to the client.
|
| 44 |
+
|
| 45 |
+
#### Dialogue Model
|
| 46 |
+
**Endpoint:** `jejunepixels-noexit-proxy.hf.space/chat`
|
| 47 |
+
|
| 48 |
+
A proxy Space that forwards chat completion requests. Includes automatic retry logic (up to 2 retries, 10s delay) to handle cold starts.
|
| 49 |
+
|
| 50 |
+
#### Personal Information Extractor
|
| 51 |
+
Scans every line of dialogue — from both the player and the characters — for personally identifying information using a small LLM. Two switchable backends:
|
| 52 |
+
|
| 53 |
+
| Backend | Endpoint | Model |
|
| 54 |
+
|---|---|---|
|
| 55 |
+
| Custom FastAPI | `jejunepixels-qwen3-4B-info-extractor-fastapi.hf.space/extract` | Qwen3 4B |
|
| 56 |
+
| HF Gradio Space | `jejunepixels-qwen3-0-6b-info-extractor-api.hf.space/extract` | Qwen3 0.6B |
|
| 57 |
+
|
| 58 |
+
Returns extracted information as a string, or `"none"` if nothing personal was found.
|
| 59 |
+
|
| 60 |
+
---
|
| 61 |
+
|
| 62 |
+
### Character Generation
|
| 63 |
+
|
| 64 |
+
At game start, two characters are generated procedurally via sequential LLM calls: first a name, then a full backstory and personality description using that name. The resulting description becomes each character's permanent system prompt for all future dialogue.
|
| 65 |
+
|
| 66 |
+
---
|
| 67 |
+
|
| 68 |
+
### Addressing System
|
| 69 |
+
|
| 70 |
+
Once a character has accumulated personal information about the player, an LLM routing call (capped at 10 tokens) decides which character should respond to the next player message — Character 1, Character 2, or both. Falls back to both responding after 3 failed attempts.
|
| 71 |
+
|
| 72 |
+
---
|
| 73 |
+
|
| 74 |
+
### Reactive Events
|
| 75 |
+
|
| 76 |
+
A timer-based event system fires unprompted questions at the player during pauses in conversation. If the player has revealed personal information, the question targets a specific piece of what was shared. Otherwise it asks a generic get-to-know-you question. Each fired event schedules the next one randomly.
|
| 77 |
+
|
| 78 |
+
---
|
| 79 |
+
|
| 80 |
+
### Dialogue Display
|
| 81 |
+
|
| 82 |
+
- Words reveal one by one with a typewriter effect
|
| 83 |
+
- Up to 3 dialogue boxes can be active simultaneously
|
| 84 |
+
- AABB overlap detection repositions boxes to prevent collisions
|
| 85 |
+
- Player input is locked while any dialogue is displaying
|
| 86 |
+
- When personal information is detected, the scene lighting flickers
|
| 87 |
+
|
| 88 |
+
---
|
| 89 |
+
|
| 90 |
+
### Data Logging
|
| 91 |
+
|
| 92 |
+
Every AI interaction is logged locally in JSONL format using `system / user / assistant` triplet structure, across four separate files for dialogue, info extraction, addressing decisions, and character generation. Intended for fine-tuning and analysis.
|
| 93 |
+
|
| 94 |
+
---
|
| 95 |
+
|
| 96 |
+
## Configurable Parameters
|
| 97 |
+
|
| 98 |
+
| Parameter | Description |
|
| 99 |
+
|---|---|
|
| 100 |
+
| Dialogue model | Model ID used for character dialogue and addressing |
|
| 101 |
+
| Info model | Model ID used for information extraction |
|
| 102 |
+
| Temperature | Separate values for dialogue and character generation |
|
| 103 |
+
| Max dialogue tokens | Token cap per character response (default: 150) |
|
| 104 |
+
| Max addressing tokens | Token cap for routing decisions (default: 10) |
|
| 105 |
+
| Info extractor backend | Toggle between Qwen3 4B (FastAPI) and 0.6B (Gradio) |
|
index.html
CHANGED
|
@@ -74,6 +74,7 @@
|
|
| 74 |
margin-bottom: 40px;
|
| 75 |
color: #d4d4d4;
|
| 76 |
font-family: 'Helvetica Neue', Arial, sans-serif;
|
|
|
|
| 77 |
}
|
| 78 |
|
| 79 |
.features {
|
|
@@ -103,6 +104,20 @@
|
|
| 103 |
line-height: 1.6;
|
| 104 |
color: #c8c8c8;
|
| 105 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 106 |
|
| 107 |
.features li:before {
|
| 108 |
content: "→";
|
|
@@ -112,6 +127,28 @@
|
|
| 112 |
font-weight: bold;
|
| 113 |
}
|
| 114 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
.play-button {
|
| 116 |
display: inline-block;
|
| 117 |
margin-top: 40px;
|
|
@@ -246,23 +283,22 @@
|
|
| 246 |
<body>
|
| 247 |
<div class="content-wrapper">
|
| 248 |
<div class="container">
|
| 249 |
-
<h1>
|
| 250 |
<div class="subtitle">Inspired by the one act play "No Exit"<br>by Jean-Paul Sartre</div>
|
| 251 |
|
| 252 |
<div class="description">
|
| 253 |
-
|
| 254 |
-
Inspired by Sartre's existentialist masterpiece, this interactive experiment explores whether
|
| 255 |
-
hell really is other people—even when those people are algorithms. Rendered in atmospheric
|
| 256 |
-
pixel art, choose your words carefully; they're watching, learning, and judging.
|
| 257 |
</div>
|
| 258 |
|
| 259 |
<div class="features">
|
| 260 |
-
<h2>
|
| 261 |
<ul>
|
| 262 |
-
<li>
|
| 263 |
-
<li>
|
| 264 |
-
<li>
|
|
|
|
| 265 |
</ul>
|
|
|
|
| 266 |
</div>
|
| 267 |
|
| 268 |
<div class="status-panel">
|
|
|
|
| 74 |
margin-bottom: 40px;
|
| 75 |
color: #d4d4d4;
|
| 76 |
font-family: 'Helvetica Neue', Arial, sans-serif;
|
| 77 |
+
text-align: left;
|
| 78 |
}
|
| 79 |
|
| 80 |
.features {
|
|
|
|
| 104 |
line-height: 1.6;
|
| 105 |
color: #c8c8c8;
|
| 106 |
}
|
| 107 |
+
|
| 108 |
+
.features li strong {
|
| 109 |
+
display: block;
|
| 110 |
+
color: #e8e8e8;
|
| 111 |
+
font-weight: 700;
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
.features li span {
|
| 115 |
+
display: block;
|
| 116 |
+
font-size: 0.85em;
|
| 117 |
+
color: #999;
|
| 118 |
+
margin-top: 3px;
|
| 119 |
+
line-height: 1.5;
|
| 120 |
+
}
|
| 121 |
|
| 122 |
.features li:before {
|
| 123 |
content: "→";
|
|
|
|
| 127 |
font-weight: bold;
|
| 128 |
}
|
| 129 |
|
| 130 |
+
.features a {
|
| 131 |
+
color: #D4AF37;
|
| 132 |
+
text-decoration: underline;
|
| 133 |
+
text-underline-offset: 3px;
|
| 134 |
+
transition: color 0.2s ease;
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
.features a:hover {
|
| 138 |
+
color: #fff;
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
.features-note {
|
| 142 |
+
margin-top: 20px;
|
| 143 |
+
font-size: 1.1em;
|
| 144 |
+
color: #999;
|
| 145 |
+
font-family: 'Helvetica Neue', Arial, sans-serif;
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
.features-note a {
|
| 149 |
+
font-size: 1em;
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
.play-button {
|
| 153 |
display: inline-block;
|
| 154 |
margin-top: 40px;
|
|
|
|
| 283 |
<body>
|
| 284 |
<div class="content-wrapper">
|
| 285 |
<div class="container">
|
| 286 |
+
<h1>Hell Is Other Chatbots</h1>
|
| 287 |
<div class="subtitle">Inspired by the one act play "No Exit"<br>by Jean-Paul Sartre</div>
|
| 288 |
|
| 289 |
<div class="description">
|
| 290 |
+
In Sartre's No Exit, hell is sharing a room with other people for all eternity. Now hell might be sharing an eternity with other LLMs.
|
|
|
|
|
|
|
|
|
|
| 291 |
</div>
|
| 292 |
|
| 293 |
<div class="features">
|
| 294 |
+
<h2>Features</h2>
|
| 295 |
<ul>
|
| 296 |
+
<li><strong>Character Generation</strong><span>Each playthrough seeds three distinct personalities</span></li>
|
| 297 |
+
<li><strong>Dialogue Engine</strong><span>Multi-turn LLM conversations powered by API, with per-character system prompts and personality conditioning</span></li>
|
| 298 |
+
<li><strong>Persistent Memory</strong><span>A fine-tuned <a href="https://huggingface.co/spaces/jejunepixels/qwen3-0.6B-info-extractor-demo" target="_blank" rel="noopener noreferrer">Qwen3-0.6B</a> model extracts character details revealed in dialogue and saves them to a persistent database in Unity. The room lights flicker each time a detail is logged. These details are injected into each character's system prompt, so they remember you across turns.</span></li>
|
| 299 |
+
<li><strong>LLM-Based Addressing</strong><span>Infers who the user is speaking to, based on information the characters have publicly shared</span></li>
|
| 300 |
</ul>
|
| 301 |
+
<p class="features-note">For full documentation, see the <a href="https://huggingface.co/spaces/jejunepixels/noexit/edit/main/README.md" target="_blank" rel="noopener noreferrer">README</a>.</p>
|
| 302 |
</div>
|
| 303 |
|
| 304 |
<div class="status-panel">
|