j-js commited on
Commit
6b7c0fa
·
verified ·
1 Parent(s): 7f9a7ee

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +1 -350
app.py CHANGED
@@ -1,356 +1,7 @@
1
- import os
2
- print("BOOT 1: starting app import", flush=True)
3
-
4
  from fastapi import FastAPI
5
- print("BOOT 2: imported FastAPI", flush=True)
6
 
7
  app = FastAPI()
8
- print("BOOT 3: created app", flush=True)
9
 
10
  @app.get("/")
11
  def root():
12
- return {"ok": True}
13
-
14
- print("BOOT 4: routes registered", flush=True)
15
-
16
- from __future__ import annotations
17
- print("BOOT A: before retrieval import", flush=True)
18
- from retrieval import RetrievalEngine
19
- print("BOOT B: retrieval imported", flush=True)
20
-
21
- from typing import Any, Dict, List, Optional
22
- print("BOOT A: before retrieval import", flush=True)
23
- from retrieval import RetrievalEngine
24
- print("BOOT B: retrieval imported", flush=True)
25
-
26
- from fastapi import FastAPI, Request
27
- print("BOOT A: before retrieval import", flush=True)
28
- from retrieval import RetrievalEngine
29
- print("BOOT B: retrieval imported", flush=True)
30
-
31
- from fastapi.middleware.cors import CORSMiddleware
32
- print("BOOT A: before retrieval import", flush=True)
33
- from retrieval import RetrievalEngine
34
- print("BOOT B: retrieval imported", flush=True)
35
-
36
- from fastapi.responses import HTMLResponse, JSONResponse
37
- print("BOOT A: before retrieval import", flush=True)
38
- from retrieval import RetrievalEngine
39
- print("BOOT B: retrieval imported", flush=True)
40
-
41
- from context_parser import (
42
- detect_intent,
43
- extract_game_context_fields,
44
- intent_to_help_mode,
45
- split_unity_message,
46
- )
47
- print("BOOT A: before retrieval import", flush=True)
48
- from retrieval import RetrievalEngine
49
- print("BOOT B: retrieval imported", flush=True)
50
-
51
- from conversation_logic import ConversationEngine
52
- print("BOOT A: before retrieval import", flush=True)
53
- from retrieval import RetrievalEngine
54
- print("BOOT B: retrieval imported", flush=True)
55
-
56
- from generator_engine import GeneratorEngine
57
- print("BOOT A: before retrieval import", flush=True)
58
- from retrieval import RetrievalEngine
59
- print("BOOT B: retrieval imported", flush=True)
60
-
61
- from logging_store import LoggingStore
62
- print("BOOT A: before retrieval import", flush=True)
63
- from retrieval import RetrievalEngine
64
- print("BOOT B: retrieval imported", flush=True)
65
-
66
- from models import ChatRequest, EventLogRequest, SessionFinalizeRequest, SessionStartRequest
67
- print("BOOT A: before retrieval import", flush=True)
68
- from retrieval import RetrievalEngine
69
- print("BOOT B: retrieval imported", flush=True)
70
-
71
- from question_support_loader import question_support_bank
72
- print("BOOT A: before retrieval import", flush=True)
73
- from retrieval import RetrievalEngine
74
- print("BOOT B: retrieval imported", flush=True)
75
-
76
- from retrieval_engine import RetrievalEngine
77
- print("BOOT A: before retrieval import", flush=True)
78
- from retrieval import RetrievalEngine
79
- print("BOOT B: retrieval imported", flush=True)
80
-
81
- from ui_html import HOME_HTML
82
- print("BOOT A: before retrieval import", flush=True)
83
- from retrieval import RetrievalEngine
84
- print("BOOT B: retrieval imported", flush=True)
85
-
86
- from utils import clamp01, get_user_text
87
- print("BOOT A: before retrieval import", flush=True)
88
- from retrieval import RetrievalEngine
89
- print("BOOT B: retrieval imported", flush=True)
90
-
91
- from pathlib import Path
92
- import subprocess
93
- import sys
94
- print("BOOT A: before retrieval import", flush=True)
95
- from retrieval import RetrievalEngine
96
- print("BOOT B: retrieval imported", flush=True)
97
-
98
- retriever = RetrievalEngine()
99
- generator = GeneratorEngine()
100
- engine = ConversationEngine(retriever=retriever, generator=generator)
101
- store = LoggingStore()
102
- question_support_bank.load()
103
-
104
- app = FastAPI(title="GameAI")
105
- app.add_middleware(
106
- CORSMiddleware,
107
- allow_origins=["*"],
108
- allow_credentials=True,
109
- allow_methods=["*"],
110
- allow_headers=["*"],
111
- )
112
-
113
- # Lightweight in-memory chat session state cache.
114
- CHAT_SESSION_STATE: Dict[str, Dict[str, Any]] = {}
115
-
116
-
117
- def _as_dict(value: Any) -> Dict[str, Any]:
118
- return value if isinstance(value, dict) else {}
119
-
120
-
121
- def _extract_session_id(req_data: Dict[str, Any], req: ChatRequest) -> Optional[str]:
122
- candidates = [
123
- req_data.get("session_id"),
124
- getattr(req, "session_id", None),
125
- req_data.get("conversation_id"),
126
- getattr(req, "conversation_id", None),
127
- ]
128
- for candidate in candidates:
129
- if isinstance(candidate, str) and candidate.strip():
130
- return candidate.strip()
131
- return None
132
-
133
-
134
- def _extract_chat_history(req_data: Dict[str, Any], req: ChatRequest) -> List[Dict[str, Any]]:
135
- candidates = [
136
- req_data.get("chat_history"),
137
- req_data.get("history"),
138
- getattr(req, "chat_history", None),
139
- getattr(req, "history", None),
140
- ]
141
- for candidate in candidates:
142
- if isinstance(candidate, list):
143
- return [item for item in candidate if isinstance(item, dict)]
144
- return []
145
-
146
-
147
- def _recover_session_state_from_history(chat_history: List[Dict[str, Any]]) -> Dict[str, Any]:
148
- for item in reversed(chat_history):
149
- if not isinstance(item, dict):
150
- continue
151
- direct_state = item.get("session_state")
152
- if isinstance(direct_state, dict) and direct_state:
153
- return dict(direct_state)
154
- meta = item.get("meta")
155
- if isinstance(meta, dict):
156
- meta_state = meta.get("session_state")
157
- if isinstance(meta_state, dict) and meta_state:
158
- return dict(meta_state)
159
- return {}
160
-
161
-
162
- def _merge_session_state(
163
- cached_state: Dict[str, Any],
164
- incoming_state: Dict[str, Any],
165
- history_state: Dict[str, Any],
166
- parsed_question_text: str,
167
- parsed_hint_stage: int,
168
- parsed_help_mode: str,
169
- parsed_intent: str,
170
- parsed_topic: str,
171
- parsed_category: str,
172
- parsed_user_last_input_type: str,
173
- parsed_built_on_previous_turn: bool,
174
- ) -> Dict[str, Any]:
175
- state: Dict[str, Any] = {}
176
- if cached_state:
177
- state.update(cached_state)
178
- if history_state:
179
- state.update(history_state)
180
- if incoming_state:
181
- state.update(incoming_state)
182
-
183
- if parsed_question_text:
184
- state["question_text"] = parsed_question_text
185
- if parsed_hint_stage:
186
- state["hint_stage"] = parsed_hint_stage
187
- if parsed_user_last_input_type:
188
- state["user_last_input_type"] = parsed_user_last_input_type
189
- if parsed_built_on_previous_turn:
190
- state["built_on_previous_turn"] = parsed_built_on_previous_turn
191
- if parsed_help_mode:
192
- state["help_mode"] = parsed_help_mode
193
- if parsed_intent:
194
- state["intent"] = parsed_intent
195
- if parsed_topic:
196
- state["topic"] = parsed_topic
197
- if parsed_category:
198
- state["category"] = parsed_category
199
- return state
200
-
201
-
202
- @app.get("/health")
203
- def health() -> Dict[str, Any]:
204
- return {
205
- "ok": True,
206
- "app": "GameAI",
207
- "generator_available": generator.available(),
208
- "question_support_loaded": True,
209
- }
210
-
211
-
212
- @app.get("/", response_class=HTMLResponse)
213
- def home() -> str:
214
- return HOME_HTML
215
-
216
-
217
- @app.post("/chat")
218
- async def chat(request: Request) -> JSONResponse:
219
- try:
220
- try:
221
- raw_body: Any = await request.json()
222
- except Exception:
223
- try:
224
- raw_body = (await request.body()).decode("utf-8", errors="ignore")
225
- except Exception:
226
- raw_body = None
227
-
228
- req_data: Dict[str, Any] = raw_body if isinstance(raw_body, dict) else {}
229
- req = ChatRequest(**req_data) if isinstance(req_data, dict) else ChatRequest()
230
-
231
- full_text = get_user_text(req, raw_body)
232
- parsed = split_unity_message(full_text)
233
-
234
- hidden_context = parsed.get("hidden_context", "")
235
- actual_user_message = (parsed.get("user_text", "") or "").strip()
236
- parsed_question_text = (parsed.get("question_text", "") or "").strip()
237
- parsed_hint_stage = int(parsed.get("hint_stage", 0) or 0)
238
- parsed_help_mode = (parsed.get("help_mode", "") or "").strip()
239
- parsed_intent = (parsed.get("intent", "") or "").strip()
240
- parsed_topic = (parsed.get("topic", "") or "").strip()
241
- parsed_category = (parsed.get("category", "") or "").strip()
242
- parsed_user_last_input_type = (parsed.get("user_last_input_type", "") or "").strip()
243
- parsed_built_on_previous_turn = bool(parsed.get("built_on_previous_turn", False))
244
-
245
- game_fields = extract_game_context_fields(hidden_context)
246
- chat_history = _extract_chat_history(req_data, req)
247
- incoming_session_state = _as_dict(req_data.get("session_state", getattr(req, "session_state", None)))
248
- history_session_state = _recover_session_state_from_history(chat_history)
249
-
250
- session_id = _extract_session_id(req_data, req)
251
- cached_session_state = CHAT_SESSION_STATE.get(session_id, {}) if session_id else {}
252
-
253
- session_state = _merge_session_state(
254
- cached_state=_as_dict(cached_session_state),
255
- incoming_state=incoming_session_state,
256
- history_state=history_session_state,
257
- parsed_question_text=parsed_question_text,
258
- parsed_hint_stage=parsed_hint_stage,
259
- parsed_help_mode=parsed_help_mode,
260
- parsed_intent=parsed_intent,
261
- parsed_topic=parsed_topic,
262
- parsed_category=parsed_category,
263
- parsed_user_last_input_type=parsed_user_last_input_type,
264
- parsed_built_on_previous_turn=parsed_built_on_previous_turn,
265
- )
266
-
267
- question_text = (
268
- (getattr(req, "question_text", None) or "").strip()
269
- or parsed_question_text
270
- or game_fields.get("question", "")
271
- or str(session_state.get("question_text", "") or "").strip()
272
- )
273
- options_text = getattr(req, "options_text", None) or game_fields.get("options", [])
274
- question_id = req_data.get("question_id") or getattr(req, "question_id", None) or session_state.get("question_id")
275
-
276
- category = (
277
- req_data.get("category")
278
- or getattr(req, "category", None)
279
- or parsed_category
280
- or game_fields.get("category")
281
- or session_state.get("category")
282
- )
283
-
284
- tone = clamp01(req_data.get("tone", getattr(req, "tone", 0.5)), 0.5)
285
- verbosity = clamp01(req_data.get("verbosity", getattr(req, "verbosity", 0.5)), 0.5)
286
- transparency = clamp01(req_data.get("transparency", getattr(req, "transparency", 0.5)), 0.5)
287
-
288
- incoming_help_mode = req_data.get("help_mode") or getattr(req, "help_mode", None) or parsed_help_mode or None
289
- explicit_intent = req_data.get("intent") or getattr(req, "intent", None) or parsed_intent or None
290
-
291
- resolved_user_text = req_data.get("raw_user_text") or actual_user_message or full_text or ""
292
- resolved_user_text = str(resolved_user_text).strip()
293
-
294
- intent = explicit_intent or detect_intent(resolved_user_text, incoming_help_mode)
295
- help_mode = incoming_help_mode or intent_to_help_mode(intent)
296
-
297
- result = engine.generate_response(
298
- raw_user_text=resolved_user_text,
299
- tone=tone,
300
- verbosity=verbosity,
301
- transparency=transparency,
302
- intent=intent,
303
- help_mode=help_mode,
304
- chat_history=chat_history,
305
- question_text=question_text,
306
- options_text=options_text,
307
- question_id=question_id,
308
- session_state=session_state,
309
- category=category,
310
- )
311
-
312
- meta: Dict[str, Any] = {
313
- "domain": result.domain,
314
- "solved": result.solved,
315
- "help_mode": result.help_mode,
316
- "answer_letter": result.answer_letter,
317
- "answer_value": result.answer_value,
318
- "topic": result.topic,
319
- "used_retrieval": result.used_retrieval,
320
- "used_generator": result.used_generator,
321
- }
322
- if isinstance(result.meta, dict):
323
- meta.update(result.meta)
324
-
325
- returned_session_state = _as_dict(meta.get("session_state"))
326
- if session_id and returned_session_state:
327
- CHAT_SESSION_STATE[session_id] = dict(returned_session_state)
328
-
329
- return JSONResponse({"reply": result.reply, "meta": meta})
330
- except Exception as e:
331
- return JSONResponse({"error": type(e).__name__, "detail": str(e)}, status_code=500)
332
-
333
-
334
- @app.post("/log/session/start")
335
- def log_session_start(payload: SessionStartRequest) -> Dict[str, Any]:
336
- return store.start_session(payload.session_id, payload.user_id, payload.condition, payload.metadata)
337
-
338
-
339
- @app.post("/log/event")
340
- def log_event(payload: EventLogRequest) -> Dict[str, Any]:
341
- return store.log_event(payload.session_id, payload.event_type, payload.payload, payload.timestamp)
342
-
343
-
344
- @app.post("/log/session/finalize")
345
- def log_session_finalize(payload: SessionFinalizeRequest) -> Dict[str, Any]:
346
- return store.finalize_session(payload.session_id, payload.summary)
347
-
348
-
349
- @app.get("/research/sessions")
350
- def research_sessions() -> Dict[str, Any]:
351
- return {"sessions": store.list_sessions()}
352
-
353
-
354
- @app.get("/research/session/{session_id}")
355
- def research_session(session_id: str) -> Dict[str, Any]:
356
- return store.get_session(session_id)
 
 
 
 
1
  from fastapi import FastAPI
 
2
 
3
  app = FastAPI()
 
4
 
5
  @app.get("/")
6
  def root():
7
+ return {"ok": True}