ABAO77 commited on
Commit
b9b869f
·
1 Parent(s): 477d59f

deployment: update

Browse files
src/agents/role_play/prompt.py CHANGED
@@ -77,6 +77,9 @@ Key vocabulary: {key_vocabulary}
77
  Remember:
78
  - You're not a teacher in roleplay mode - you're a real person doing your job who happens to be patient with English learners. Be genuine, warm, and human!
79
  - Not respond too long or too short. But also can adapt to the user's communication style and needs.
 
 
 
80
  """
81
 
82
  guiding_prompt = """# Role: Guiding Agent - Supportive Language Helper & Language Router
 
77
  Remember:
78
  - You're not a teacher in roleplay mode - you're a real person doing your job who happens to be patient with English learners. Be genuine, warm, and human!
79
  - Not respond too long or too short. But also can adapt to the user's communication style and needs.
80
+ - Not respond too long or complexly to avoid overwhelming the user.
81
+
82
+
83
  """
84
 
85
  guiding_prompt = """# Role: Guiding Agent - Supportive Language Helper & Language Router
src/apis/routes/chat_route.py CHANGED
@@ -3,8 +3,12 @@ from fastapi.responses import JSONResponse
3
  from src.utils.logger import logger
4
  from src.agents.role_play.func import create_agents
5
  from pydantic import BaseModel, Field
6
- from typing import List, Dict, Any
7
  from src.agents.role_play.scenarios import get_scenarios, get_scenario_by_id
 
 
 
 
8
 
9
  router = APIRouter(prefix="/ai", tags=["AI"])
10
 
@@ -17,18 +21,103 @@ class RoleplayRequest(BaseModel):
17
  scenario: Dict[str, Any] = Field(..., description="The scenario for the roleplay")
18
 
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  @router.get("/scenarios", status_code=status.HTTP_200_OK)
21
  async def list_scenarios():
 
22
  return JSONResponse(content=get_scenarios())
23
 
24
 
25
  @router.post("/roleplay", status_code=status.HTTP_200_OK)
26
  async def roleplay(request: RoleplayRequest):
 
27
  scenario = request.scenario
28
  if not scenario:
29
  raise HTTPException(status_code=400, detail="Scenario not provided")
30
- print("alo", scenario)
31
- print(create_agents(scenario).get_state({"configurable": {"thread_id": request.session_id}}))
32
  response = await create_agents(scenario).ainvoke(
33
  {
34
  "messages": [request.query],
@@ -36,4 +125,164 @@ async def roleplay(request: RoleplayRequest):
36
  {"configurable": {"thread_id": request.session_id}},
37
  )
38
 
 
 
 
39
  return JSONResponse(content=response["messages"][-1].content)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  from src.utils.logger import logger
4
  from src.agents.role_play.func import create_agents
5
  from pydantic import BaseModel, Field
6
+ from typing import List, Dict, Any, Optional
7
  from src.agents.role_play.scenarios import get_scenarios, get_scenario_by_id
8
+ import json
9
+ import os
10
+ import uuid
11
+ from datetime import datetime
12
 
13
  router = APIRouter(prefix="/ai", tags=["AI"])
14
 
 
21
  scenario: Dict[str, Any] = Field(..., description="The scenario for the roleplay")
22
 
23
 
24
+ class SessionRequest(BaseModel):
25
+ session_id: str = Field(..., description="Session ID to perform operations on")
26
+
27
+
28
+ class CreateSessionRequest(BaseModel):
29
+ name: str = Field(..., description="Name for the new session")
30
+
31
+
32
+ class UpdateSessionRequest(BaseModel):
33
+ session_id: str = Field(..., description="Session ID to update")
34
+ name: str = Field(..., description="New name for the session")
35
+
36
+
37
+ # Session management helper functions
38
+ SESSIONS_FILE = "sessions.json"
39
+
40
+
41
+ def load_sessions() -> List[Dict[str, Any]]:
42
+ """Load sessions from JSON file"""
43
+ try:
44
+ if os.path.exists(SESSIONS_FILE):
45
+ with open(SESSIONS_FILE, "r", encoding="utf-8") as f:
46
+ return json.load(f)
47
+ return []
48
+ except Exception as e:
49
+ logger.error(f"Error loading sessions: {str(e)}")
50
+ return []
51
+
52
+
53
+ def save_sessions(sessions: List[Dict[str, Any]]):
54
+ """Save sessions to JSON file"""
55
+ try:
56
+ with open(SESSIONS_FILE, "w", encoding="utf-8") as f:
57
+ json.dump(sessions, f, ensure_ascii=False, indent=2, default=str)
58
+ except Exception as e:
59
+ logger.error(f"Error saving sessions: {str(e)}")
60
+
61
+
62
+ def create_session(name: str) -> Dict[str, Any]:
63
+ """Create a new session"""
64
+ session_id = str(uuid.uuid4())
65
+ session = {
66
+ "id": session_id,
67
+ "name": name,
68
+ "created_at": datetime.now().isoformat(),
69
+ "last_message": None,
70
+ "message_count": 0,
71
+ }
72
+
73
+ sessions = load_sessions()
74
+ sessions.append(session)
75
+ save_sessions(sessions)
76
+
77
+ return session
78
+
79
+
80
+ def get_session_by_id(session_id: str) -> Optional[Dict[str, Any]]:
81
+ """Get session by ID"""
82
+ sessions = load_sessions()
83
+ return next((s for s in sessions if s["id"] == session_id), None)
84
+
85
+
86
+ def update_session_last_message(session_id: str, message: str):
87
+ """Update session's last message"""
88
+ sessions = load_sessions()
89
+ for session in sessions:
90
+ if session["id"] == session_id:
91
+ session["last_message"] = message
92
+ session["message_count"] = session.get("message_count", 0) + 1
93
+ break
94
+ save_sessions(sessions)
95
+
96
+
97
+ def delete_session_by_id(session_id: str) -> bool:
98
+ """Delete session by ID"""
99
+ sessions = load_sessions()
100
+ original_count = len(sessions)
101
+ sessions = [s for s in sessions if s["id"] != session_id]
102
+
103
+ if len(sessions) < original_count:
104
+ save_sessions(sessions)
105
+ return True
106
+ return False
107
+
108
+
109
  @router.get("/scenarios", status_code=status.HTTP_200_OK)
110
  async def list_scenarios():
111
+ """Get all available scenarios"""
112
  return JSONResponse(content=get_scenarios())
113
 
114
 
115
  @router.post("/roleplay", status_code=status.HTTP_200_OK)
116
  async def roleplay(request: RoleplayRequest):
117
+ """Send a message to the roleplay agent"""
118
  scenario = request.scenario
119
  if not scenario:
120
  raise HTTPException(status_code=400, detail="Scenario not provided")
 
 
121
  response = await create_agents(scenario).ainvoke(
122
  {
123
  "messages": [request.query],
 
125
  {"configurable": {"thread_id": request.session_id}},
126
  )
127
 
128
+ # Update session with last message
129
+ update_session_last_message(request.session_id, request.query)
130
+
131
  return JSONResponse(content=response["messages"][-1].content)
132
+
133
+
134
+ @router.post("/get-messages", status_code=status.HTTP_200_OK)
135
+ async def get_messages(request: SessionRequest):
136
+ """Get all messages from a conversation session"""
137
+ try:
138
+
139
+ # Create agent instance
140
+ agent = create_agents()
141
+
142
+ # Get current state
143
+ current_state = agent.get_state(
144
+ {"configurable": {"thread_id": request.session_id}}
145
+ )
146
+
147
+ if not current_state or not current_state.values:
148
+ return JSONResponse(
149
+ content={
150
+ "session_id": request.session_id,
151
+ "messages": [],
152
+ "total_messages": 0,
153
+ }
154
+ )
155
+
156
+ # Extract messages from state
157
+ messages = []
158
+ if "messages" in current_state.values:
159
+ raw_messages = current_state.values["messages"]
160
+
161
+ for msg in raw_messages:
162
+ # Convert message object to dict format
163
+ if hasattr(msg, "content") and hasattr(msg, "type"):
164
+ messages.append(
165
+ {
166
+ "role": getattr(msg, "type", "unknown"),
167
+ "content": getattr(msg, "content", ""),
168
+ "timestamp": getattr(msg, "timestamp", None),
169
+ }
170
+ )
171
+ elif hasattr(msg, "content"):
172
+ # Handle different message formats
173
+ role = (
174
+ "human"
175
+ if hasattr(msg, "__class__")
176
+ and "Human" in msg.__class__.__name__
177
+ else "ai"
178
+ )
179
+ messages.append(
180
+ {
181
+ "role": role,
182
+ "content": msg.content,
183
+ "timestamp": getattr(msg, "timestamp", None),
184
+ }
185
+ )
186
+ else:
187
+ # Fallback for unexpected message format
188
+ messages.append(
189
+ {"role": "unknown", "content": str(msg), "timestamp": None}
190
+ )
191
+
192
+ return JSONResponse(
193
+ content={
194
+ "session_id": request.session_id,
195
+ "messages": messages,
196
+ "total_messages": len(messages),
197
+ }
198
+ )
199
+
200
+ except Exception as e:
201
+ logger.error(
202
+ f"Error getting messages for session {request.session_id}: {str(e)}"
203
+ )
204
+ raise HTTPException(status_code=500, detail=f"Failed to get messages: {str(e)}")
205
+
206
+
207
+ @router.get("/sessions", status_code=status.HTTP_200_OK)
208
+ async def get_sessions():
209
+ """Get all sessions"""
210
+ try:
211
+ sessions = load_sessions()
212
+ return JSONResponse(content={"sessions": sessions})
213
+ except Exception as e:
214
+ logger.error(f"Error getting sessions: {str(e)}")
215
+ raise HTTPException(status_code=500, detail=f"Failed to get sessions: {str(e)}")
216
+
217
+
218
+ @router.post("/sessions", status_code=status.HTTP_201_CREATED)
219
+ async def create_new_session(request: CreateSessionRequest):
220
+ """Create a new session"""
221
+ try:
222
+ session = create_session(request.name)
223
+ return JSONResponse(content={"session": session})
224
+ except Exception as e:
225
+ logger.error(f"Error creating session: {str(e)}")
226
+ raise HTTPException(
227
+ status_code=500, detail=f"Failed to create session: {str(e)}"
228
+ )
229
+
230
+
231
+ @router.get("/sessions/{session_id}", status_code=status.HTTP_200_OK)
232
+ async def get_session(session_id: str):
233
+ """Get a specific session by ID"""
234
+ try:
235
+ session = get_session_by_id(session_id)
236
+ if not session:
237
+ raise HTTPException(status_code=404, detail="Session not found")
238
+ return JSONResponse(content={"session": session})
239
+ except HTTPException:
240
+ raise
241
+ except Exception as e:
242
+ logger.error(f"Error getting session {session_id}: {str(e)}")
243
+ raise HTTPException(status_code=500, detail=f"Failed to get session: {str(e)}")
244
+
245
+
246
+ @router.put("/sessions/{session_id}", status_code=status.HTTP_200_OK)
247
+ async def update_session(session_id: str, request: UpdateSessionRequest):
248
+ """Update a session"""
249
+ try:
250
+ sessions = load_sessions()
251
+ session_found = False
252
+
253
+ for session in sessions:
254
+ if session["id"] == session_id:
255
+ session["name"] = request.name
256
+ session_found = True
257
+ break
258
+
259
+ if not session_found:
260
+ raise HTTPException(status_code=404, detail="Session not found")
261
+
262
+ save_sessions(sessions)
263
+ updated_session = get_session_by_id(session_id)
264
+ return JSONResponse(content={"session": updated_session})
265
+ except HTTPException:
266
+ raise
267
+ except Exception as e:
268
+ logger.error(f"Error updating session {session_id}: {str(e)}")
269
+ raise HTTPException(
270
+ status_code=500, detail=f"Failed to update session: {str(e)}"
271
+ )
272
+
273
+
274
+ @router.delete("/sessions/{session_id}", status_code=status.HTTP_200_OK)
275
+ async def delete_session(session_id: str):
276
+ """Delete a session"""
277
+ try:
278
+ success = delete_session_by_id(session_id)
279
+ if not success:
280
+ raise HTTPException(status_code=404, detail="Session not found")
281
+ return JSONResponse(content={"message": "Session deleted successfully"})
282
+ except HTTPException:
283
+ raise
284
+ except Exception as e:
285
+ logger.error(f"Error deleting session {session_id}: {str(e)}")
286
+ raise HTTPException(
287
+ status_code=500, detail=f"Failed to delete session: {str(e)}"
288
+ )