ckonteos80 commited on
Commit
d7b7cac
·
1 Parent(s): fe6fbbd

Revise README and homepage content/styles

Browse files

Expand 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.

Files changed (2) hide show
  1. README.md +99 -5
  2. index.html +45 -9
README.md CHANGED
@@ -1,11 +1,105 @@
1
  ---
2
- title: Noexit
3
- emoji: 👀
4
  colorFrom: gray
5
- colorTo: gray
6
  sdk: static
7
  pinned: false
8
- license: cc-by-nc-2.0
9
  ---
10
 
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>No Exit</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
- What happens when you're locked in a room with AI characters who won't let you leave?
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>Experience</h2>
261
  <ul>
262
- <li>3 AI-Powered Characters with Memory & Personality</li>
263
- <li>Atmospheric Generative Pixel Art</li>
264
- <li>Existential Dialogues & Moral Dilemmas</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">