Sayed223 commited on
Commit
c316ccb
Β·
verified Β·
1 Parent(s): 482b6b9

Update server.py

Browse files
Files changed (1) hide show
  1. server.py +57 -26
server.py CHANGED
@@ -80,36 +80,58 @@ class GradeRequest(BaseModel):
80
  session_id: str
81
 
82
 
83
- # ── Helper: Serialize observation/reward to JSON ──────────────────────────────
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  def serialize_obs(obs: Observation) -> Dict[str, Any]:
85
  """Convert Observation dataclass to JSON-serializable dict."""
 
86
  return {
87
- "ticket_id": obs.ticket_id,
88
- "task_id": obs.task_id,
89
- "status": obs.status,
90
- "sentiment": obs.sentiment,
91
- "priority": obs.priority,
92
- "category": obs.category,
93
- "turn": obs.turn,
94
- "max_turns": obs.max_turns,
95
- "history": obs.history,
96
- "kb_results": obs.kb_results,
97
- "kb_searched": obs.kb_searched,
98
- "empathized": obs.empathized,
99
- "clarified": obs.clarified,
100
- "solution_offered": obs.solution_offered,
101
- "escalated": obs.escalated,
102
- "cumulative_reward": obs.cumulative_reward,
103
- "done": obs.done,
104
  }
105
 
106
 
107
  def serialize_reward(reward: Reward) -> Dict[str, Any]:
108
  """Convert Reward dataclass to JSON-serializable dict."""
109
  return {
110
- "total": reward.total,
111
- "breakdown": reward.breakdown,
112
- "reason": reward.reason,
113
  }
114
 
115
 
@@ -167,11 +189,14 @@ async def reset(request: Optional[Dict[str, Any]] = Body(default=None)) -> JSONR
167
 
168
  print(f"[RESET] Created session {session_id}", flush=True)
169
 
 
 
 
170
  return JSONResponse(
171
  status_code=200,
172
  content={
173
  "session_id": session_id,
174
- "observation": serialize_obs(obs),
175
  "info": {
176
  "task_id": task_id,
177
  "difficulty": TASKS[task_id].difficulty,
@@ -232,11 +257,15 @@ async def step(request: StepRequest) -> JSONResponse:
232
  session["steps"] += 1
233
  session["done"] = result.observation.done
234
 
 
 
 
 
235
  return JSONResponse(
236
  status_code=200,
237
  content={
238
- "observation": serialize_obs(result.observation),
239
- "reward": serialize_reward(result.reward),
240
  "done": result.observation.done,
241
  "info": {
242
  "step": session["steps"],
@@ -273,10 +302,12 @@ async def state_endpoint(session_id: str) -> JSONResponse:
273
  session = _sessions[session_id]
274
  obs = session["observation"]
275
 
 
 
276
  return JSONResponse(
277
  status_code=200,
278
  content={
279
- "observation": serialize_obs(obs),
280
  "info": {
281
  "task_id": session["task_id"],
282
  "steps": session["steps"],
@@ -369,7 +400,7 @@ async def grade_endpoint(request: GradeRequest) -> JSONResponse:
369
  content={
370
  "score": grader_result.score,
371
  "passed": grader_result.passed,
372
- "breakdown": grader_result.breakdown,
373
  "reason": grader_result.reason,
374
  }
375
  )
 
80
  session_id: str
81
 
82
 
83
+ # ── Helper: Make JSON serializable ──────────────────────────────────────────
84
+ def to_json_serializable(obj: Any) -> Any:
85
+ """Convert any object to JSON-serializable format."""
86
+ if obj is None:
87
+ return None
88
+ elif isinstance(obj, (str, int, float, bool)):
89
+ return obj
90
+ elif isinstance(obj, dict):
91
+ return {k: to_json_serializable(v) for k, v in obj.items()}
92
+ elif isinstance(obj, (list, tuple)):
93
+ return [to_json_serializable(item) for item in obj]
94
+ elif hasattr(obj, 'dict') and callable(obj.dict):
95
+ # Pydantic model
96
+ return to_json_serializable(obj.dict())
97
+ elif hasattr(obj, '__dict__'):
98
+ # Regular object with attributes
99
+ return to_json_serializable(obj.__dict__)
100
+ else:
101
+ # Fallback to string representation
102
+ return str(obj)
103
+
104
+
105
  def serialize_obs(obs: Observation) -> Dict[str, Any]:
106
  """Convert Observation dataclass to JSON-serializable dict."""
107
+ # Convert all fields to JSON-serializable format
108
  return {
109
+ "ticket_id": to_json_serializable(obs.ticket_id),
110
+ "task_id": to_json_serializable(obs.task_id),
111
+ "status": to_json_serializable(obs.status),
112
+ "sentiment": to_json_serializable(obs.sentiment),
113
+ "priority": to_json_serializable(obs.priority),
114
+ "category": to_json_serializable(obs.category),
115
+ "turn": to_json_serializable(obs.turn),
116
+ "max_turns": to_json_serializable(obs.max_turns),
117
+ "history": to_json_serializable(obs.history),
118
+ "kb_results": to_json_serializable(obs.kb_results),
119
+ "kb_searched": to_json_serializable(obs.kb_searched),
120
+ "empathized": to_json_serializable(obs.empathized),
121
+ "clarified": to_json_serializable(obs.clarified),
122
+ "solution_offered": to_json_serializable(obs.solution_offered),
123
+ "escalated": to_json_serializable(obs.escalated),
124
+ "cumulative_reward": to_json_serializable(obs.cumulative_reward),
125
+ "done": to_json_serializable(obs.done),
126
  }
127
 
128
 
129
  def serialize_reward(reward: Reward) -> Dict[str, Any]:
130
  """Convert Reward dataclass to JSON-serializable dict."""
131
  return {
132
+ "total": to_json_serializable(reward.total),
133
+ "breakdown": to_json_serializable(reward.breakdown),
134
+ "reason": to_json_serializable(reward.reason),
135
  }
136
 
137
 
 
189
 
190
  print(f"[RESET] Created session {session_id}", flush=True)
191
 
192
+ # Serialize observation to ensure JSON compatibility
193
+ obs_json = serialize_obs(obs)
194
+
195
  return JSONResponse(
196
  status_code=200,
197
  content={
198
  "session_id": session_id,
199
+ "observation": obs_json,
200
  "info": {
201
  "task_id": task_id,
202
  "difficulty": TASKS[task_id].difficulty,
 
257
  session["steps"] += 1
258
  session["done"] = result.observation.done
259
 
260
+ # Serialize for JSON compatibility
261
+ obs_json = serialize_obs(result.observation)
262
+ reward_json = serialize_reward(result.reward)
263
+
264
  return JSONResponse(
265
  status_code=200,
266
  content={
267
+ "observation": obs_json,
268
+ "reward": reward_json,
269
  "done": result.observation.done,
270
  "info": {
271
  "step": session["steps"],
 
302
  session = _sessions[session_id]
303
  obs = session["observation"]
304
 
305
+ obs_json = serialize_obs(obs)
306
+
307
  return JSONResponse(
308
  status_code=200,
309
  content={
310
+ "observation": obs_json,
311
  "info": {
312
  "task_id": session["task_id"],
313
  "steps": session["steps"],
 
400
  content={
401
  "score": grader_result.score,
402
  "passed": grader_result.passed,
403
+ "breakdown": to_json_serializable(grader_result.breakdown),
404
  "reason": grader_result.reason,
405
  }
406
  )