tfrere's picture
update
a61ba58
from fastapi import APIRouter, HTTPException, Header
from typing import Optional
import traceback
from core.session_manager import SessionManager
from core.constants import GameConfig
from api.models import ChatMessage, StoryResponse, Choice
router = APIRouter()
def get_chat_router(session_manager: SessionManager, story_generator):
@router.post("/chat", response_model=StoryResponse)
async def chat_endpoint(
chat_message: ChatMessage,
x_session_id: Optional[str] = Header(None)
):
try:
if not x_session_id:
raise HTTPException(status_code=400, detail="Session ID is required")
print(f"Processing chat message for session {x_session_id}:", chat_message)
# Get game state for this session
game_state = session_manager.get_session(x_session_id)
print(f"Retrieved game state for session {x_session_id}: {'found' if game_state else 'not found'}")
if game_state is None:
raise HTTPException(
status_code=400,
detail="Invalid session ID. Generate a universe first to start a new game session."
)
# Vérifier que l'univers est configuré
has_universe = game_state.has_universe()
print(f"Universe configured for session {x_session_id}: {has_universe}")
print(f"Universe details: style={game_state.universe_style}, genre={game_state.universe_genre}, epoch={game_state.universe_epoch}")
if not has_universe:
raise HTTPException(
status_code=400,
detail="Universe not configured for this session. Generate a universe first."
)
# Handle restart
if chat_message.message.lower() == "restart":
print(f"Handling restart for session {x_session_id}")
# On garde le même univers mais on réinitialise l'histoire
game_state.reset()
game_state.set_universe(
style=game_state.universe_style,
genre=game_state.universe_genre,
epoch=game_state.universe_epoch,
base_story=game_state.universe_story
)
previous_choice = "none"
else:
previous_choice = f"Choice {chat_message.choice_id}" if chat_message.choice_id else "none"
# Generate story segment
llm_response = await story_generator.generate_story_segment(
session_id=x_session_id,
game_state=game_state,
previous_choice=previous_choice
)
# Add segment to history
game_state.add_to_history(
llm_response.story_text,
previous_choice,
llm_response.image_prompts,
llm_response.time,
llm_response.location
)
# Pour la première étape, on ne garde qu'un seul prompt d'image
if game_state.story_beat == 0 and len(llm_response.image_prompts) > 1:
llm_response.image_prompts = [llm_response.image_prompts[0]]
# Prepare response
response = StoryResponse(
story_text=llm_response.story_text,
choices=llm_response.choices,
raw_choices=llm_response.raw_choices,
time=llm_response.time,
location=llm_response.location,
is_first_step=game_state.story_beat == 0,
image_prompts=llm_response.image_prompts,
is_death=llm_response.is_death,
is_victory=llm_response.is_victory
)
# Increment story beat
game_state.story_beat += 1
return response
except Exception as e:
print(f"Error in chat_endpoint: {str(e)}")
print("Traceback:", traceback.format_exc())
raise HTTPException(status_code=500, detail=str(e))
return router