refactor: remediation plan Fase 0-4 completata

- Fase 0: env var allineate, SYSTEM_PROMPT deduplicato, .gitignore pulito
- Fase 1: GameContext isolato, ciclo DM unificato, provider thread-safe (contextvars)
- Fase 2: DB schema esteso (current_area_id, combat_state, character_items)
- Fase 3: thread-local connection pool + WAL + busy_timeout
- Fase 4: test suite (32 test, 100% pass)
- heuristic_fallback come parser di riserva (non secondo pilota)
This commit is contained in:
truetype committed 2026-06-27 18:00:03 +02:00
1 parent 90f823fdb9
commit cb45172717
16 files changed
+906 -221

No files matched your search

+8 -7
View File
@@ -4,20 +4,21 @@ import logging
from src.engine import db, tools
from src.engine.config import load_from_env
from src.engine.game_context import GameContext
from src.engine.heuristic_fallback import parse_action as fallback_parse
from src.engine.llm import ask as llm_ask, parse_tool_call
from src.engine.prompts import SYSTEM_PROMPT, build_prompt
from src.engine.state_machine import GameContext, _parse_action
log = logging.getLogger(__name__)
def _llm_decision(ctx: GameContext, player_action: str) -> tuple[str, dict, str]:
prompt = build_prompt(ctx, player_action)
def _llm_decision(ctx: GameContext, player_action: str, current_area_id: str = "") -> tuple[str, dict, str]:
prompt = build_prompt(ctx, player_action, current_area_id=current_area_id)
try:
raw = llm_ask(prompt, system=SYSTEM_PROMPT)
except Exception as e:
log.warning("LLM call failed (%s), fallback a _parse_action", e)
tool, params = _parse_action(player_action, ctx)
log.warning("LLM call failed (%s), fallback a heuristic parser", e)
tool, params = fallback_parse(player_action, ctx.characters)
return tool, params, ""
decision = parse_tool_call(raw)
@@ -28,7 +29,7 @@ def _llm_decision(ctx: GameContext, player_action: str) -> tuple[str, dict, str]
if not tool:
log.info("LLM non ha prodotto tool valido, fallback heuristico")
tool, params = _parse_action(player_action, ctx)
tool, params = fallback_parse(player_action, ctx.characters)
return tool, params, narration
@@ -36,7 +37,7 @@ def _llm_decision(ctx: GameContext, player_action: str) -> tuple[str, dict, str]
def dm_cycle(campaign_id: int, player_action: str) -> dict:
ctx = GameContext.load(campaign_id)
tool_name, tool_params, narration = _llm_decision(ctx, player_action)
tool_name, tool_params, narration = _llm_decision(ctx, player_action, current_area_id=ctx.current_area_id)
result = tools.run(tool_name, **tool_params)