Skip to content

Commit 5884a8e

Browse files
committed
example changed with var names
1 parent e43e62e commit 5884a8e

18 files changed

+632
-449
lines changed

bindings/ceylon/ceylon/base/playground.py

+2
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ async def play(self, workers: Optional[List[BaseAgent]] = None):
114114
logger.warning("Received Ctrl+C, initiating force close...")
115115
await self.force_close()
116116
except Exception as e:
117+
import traceback
118+
traceback.print_exc()
117119
logger.error(f"Error in playground: {e}")
118120
await self.force_close()
119121
finally:

bindings/ceylon/ceylon/llm/agent.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ async def execute_task(self, task: TaskMessage) -> None:
8080

8181
if response:
8282
# Cache successful response
83-
self.response_cache[task.task_id] = response
83+
self.response_cache[task.id] = response
8484

8585
# Print the response
8686
logger.info("\nGenerated Content:")
@@ -100,10 +100,10 @@ async def execute_task(self, task: TaskMessage) -> None:
100100
task.metadata['response_timestamp'] = response.timestamp
101101
task.metadata.update(response.metadata)
102102

103-
logger.info(f"{self.name}: Completed task {task.task_id}")
103+
logger.info(f"{self.name}: Completed task {task.id}")
104104

105105
# Remove from active tasks and broadcast completion
106-
del self.active_tasks[task.task_id]
106+
del self.active_tasks[task.id]
107107
await self.broadcast_message(task)
108108

109109
# Request new task
@@ -112,7 +112,7 @@ async def execute_task(self, task: TaskMessage) -> None:
112112
raise Exception("Failed to get valid LLM response")
113113

114114
except Exception as e:
115-
logger.error(f"Error executing LLM task {task.task_id}: {e}")
115+
logger.error(f"Error executing LLM task {task.id}: {e}")
116116
task.status = TaskStatus.FAILED
117117
task.metadata = task.metadata or {}
118118
task.metadata['error'] = str(e)
@@ -177,7 +177,7 @@ async def _call_llm(self, task: TaskMessage) -> LLMResponse:
177177
return LLMResponse(
178178
content=response_text,
179179
metadata={
180-
'task_id': task.task_id,
180+
'task_id': task.id,
181181
'usage': usage.__dict__,
182182
'model_name': self.llm_model.model_name
183183
}

bindings/ceylon/ceylon/llm/task_pl.py

+180
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
from dataclasses import dataclass, field
2+
from typing import Any, Dict, Optional, List
3+
import asyncio
4+
import uuid
5+
6+
from loguru import logger
7+
from ceylon import on, on_connect, Worker, AgentDetail
8+
9+
from .base_playground import BasePlayGround
10+
from .manager import TaskManager, TaskMessage, TaskGroup, TaskStatus
11+
12+
13+
@dataclass
14+
class TaskRequest:
15+
task_id: str
16+
task_type: str
17+
instructions: str
18+
required_role: str
19+
metadata: Dict[str, Any] = field(default_factory=dict)
20+
21+
22+
@dataclass
23+
class TaskResponse:
24+
task_id: str
25+
status: TaskStatus
26+
result: Optional[Any] = None
27+
error_message: Optional[str] = None
28+
runtime_stats: Dict[str, Any] = field(default_factory=dict)
29+
30+
31+
@dataclass
32+
class TaskProgressUpdate:
33+
task_id: str
34+
progress: float # 0.0 to 1.0
35+
status: TaskStatus
36+
message: Optional[str] = None
37+
38+
39+
class TaskWorker(Worker):
40+
def __init__(self, name: str, role: str):
41+
super().__init__(name=name, role=role)
42+
self.active_task: Optional[TaskMessage] = None
43+
44+
@on(TaskRequest)
45+
async def handle_task_request(self, request: TaskRequest, time: int):
46+
try:
47+
if self.active_task:
48+
# Already processing a task
49+
return
50+
51+
logger.info(f"Worker {self.name} received task: {request.task_id}")
52+
53+
# Process task (simulated work)
54+
self.active_task = TaskMessage(
55+
task_id=request.task_id,
56+
name=f"Task-{request.task_id[:8]}",
57+
instructions=request.instructions,
58+
required_role=request.required_role
59+
)
60+
61+
# Send progress updates
62+
await self.broadcast_message(TaskProgressUpdate(
63+
task_id=request.task_id,
64+
progress=0.0,
65+
status=TaskStatus.IN_PROGRESS,
66+
message="Starting task"
67+
))
68+
69+
# Simulate work
70+
await asyncio.sleep(2)
71+
72+
# Send completion
73+
response = TaskResponse(
74+
task_id=request.task_id,
75+
status=TaskStatus.COMPLETED,
76+
result={"processed": True},
77+
runtime_stats={
78+
"duration": 2.0,
79+
"memory_used": "100MB"
80+
}
81+
)
82+
await self.broadcast_message(response)
83+
self.active_task = None
84+
85+
except Exception as e:
86+
logger.error(f"Error processing task {request.task_id}: {e}")
87+
await self.broadcast_message(TaskResponse(
88+
task_id=request.task_id,
89+
status=TaskStatus.FAILED,
90+
error_message=str(e)
91+
))
92+
self.active_task = None
93+
94+
95+
class TaskPlayGround(BasePlayGround):
96+
def __init__(self, name="task_playground", port=8888):
97+
super().__init__(name=name, port=port)
98+
self.task_manager = TaskManager()
99+
self.task_responses: Dict[str, TaskResponse] = {}
100+
self.task_events: Dict[str, asyncio.Event] = {}
101+
self.task_progress: Dict[str, float] = {}
102+
103+
@on(TaskResponse)
104+
async def handle_task_response(self, response: TaskResponse, time: int):
105+
"""Handle task completion responses from workers"""
106+
logger.info(f"Received task response for {response.task_id}: {response.status}")
107+
108+
self.task_responses[response.task_id] = response
109+
if response.task_id in self.task_events:
110+
self.task_events[response.task_id].set()
111+
112+
if response.status == TaskStatus.COMPLETED:
113+
task = self.task_manager.tasks.get(response.task_id)
114+
if task:
115+
task.completed = True
116+
all_completed = await self.task_manager.handle_task_completion(task)
117+
if all_completed:
118+
logger.info("All tasks completed")
119+
await self.finish()
120+
121+
@on(TaskProgressUpdate)
122+
async def handle_progress_update(self, update: TaskProgressUpdate, time: int):
123+
"""Handle task progress updates"""
124+
self.task_progress[update.task_id] = update.progress
125+
logger.debug(f"Task {update.task_id} progress: {update.progress:.1%}")
126+
127+
@on_connect("*")
128+
async def handle_worker_connection(self, topic: str, agent: AgentDetail):
129+
"""Register new workers with the task manager"""
130+
self.task_manager.register_worker(agent.name, agent.role)
131+
await super().on_llm_agent_connected(topic, agent)
132+
133+
async def submit_task(self, task_type: str, instructions: str, role: str,
134+
metadata: Optional[Dict[str, Any]] = None) -> TaskResponse:
135+
"""Submit a task and wait for its completion"""
136+
task_id = str(uuid.uuid4())
137+
request = TaskRequest(
138+
task_id=task_id,
139+
task_type=task_type,
140+
instructions=instructions,
141+
required_role=role,
142+
metadata=metadata or {}
143+
)
144+
145+
# Setup completion event
146+
self.task_events[task_id] = asyncio.Event()
147+
148+
# Send request
149+
await self.broadcast_message(request)
150+
151+
try:
152+
# Wait for completion
153+
await asyncio.wait_for(self.task_events[task_id].wait(), timeout=30.0)
154+
return self.task_responses[task_id]
155+
except asyncio.TimeoutError:
156+
return TaskResponse(
157+
task_id=task_id,
158+
status=TaskStatus.FAILED,
159+
error_message="Task timed out"
160+
)
161+
finally:
162+
# Cleanup
163+
self.task_events.pop(task_id, None)
164+
165+
def get_task_progress(self, task_id: str) -> float:
166+
"""Get current progress for a task"""
167+
return self.task_progress.get(task_id, 0.0)
168+
169+
async def close(self):
170+
"""Clean shutdown of playground"""
171+
# Cancel any pending tasks
172+
for task_id, event in self.task_events.items():
173+
event.set()
174+
175+
# Clear state
176+
self.task_responses.clear()
177+
self.task_events.clear()
178+
self.task_progress.clear()
179+
180+
await self.force_close()

bindings/ceylon/ceylon/task/data.py

+10-80
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22
# Licensed under the Apache License, Version 2.0 (See LICENSE.md or http://www.apache.org/licenses/LICENSE-2.0).
33
#
44
#
5-
import uuid
6-
from dataclasses import dataclass, field
5+
from dataclasses import dataclass
76
from enum import Enum
8-
from typing import Optional, Set, List, Dict, Callable, Any
9-
10-
from loguru import logger
7+
from typing import Any, Dict, Optional
118

129

1310
class TaskStatus(Enum):
@@ -17,85 +14,18 @@ class TaskStatus(Enum):
1714
FAILED = "failed"
1815

1916

20-
@dataclass
21-
class TaskMessage:
22-
task_id: str
23-
name: str
24-
instructions: str
25-
required_role: str=None
26-
parent_id: Optional[str] = None
27-
group_id: Optional[str] = None # Reference to TaskGroup
28-
subtask_ids: Set[str] = field(default_factory=set)
29-
assigned_to: Optional[str] = None
30-
completed: bool = False
31-
start_time: Optional[float] = None
32-
end_time: Optional[float] = None
33-
max_concurrent: int = 3
34-
status: TaskStatus = TaskStatus.PENDING
35-
metadata: Optional[Dict[str, Any]] = None
36-
result: Optional[Any] = None
37-
38-
3917
@dataclass
4018
class TaskRequest:
41-
requester: str
42-
role: str
43-
task_type: str
44-
priority: int = 1
45-
46-
47-
@dataclass
48-
class TaskStatusUpdate:
4919
task_id: str
50-
status: TaskStatus
51-
message: Optional[str] = None
52-
group_id: Optional[str] = None
53-
54-
55-
class GoalStatus(Enum):
56-
NOT_STARTED = "not_started"
57-
IN_PROGRESS = "in_progress"
58-
ACHIEVED = "achieved"
59-
FAILED = "failed"
60-
61-
62-
@dataclass
63-
class TaskGroupGoal:
64-
name: str
65-
description: str
66-
check_condition: Callable[[Dict[str, 'TaskGroup'], Dict[str, TaskMessage]], bool]
67-
success_message: str
68-
failure_message: str
69-
status: GoalStatus = GoalStatus.NOT_STARTED
20+
task_type: str
21+
data: Any
22+
metadata: Dict[str, Any] = None
7023

7124

7225
@dataclass
73-
class TaskGroup:
26+
class TaskResponse:
7427
task_id: str
75-
name: str
76-
description: str
77-
subtasks: List[TaskMessage]
78-
goal: Optional[TaskGroupGoal] = None
79-
id: str = field(default_factory=lambda: str(uuid.uuid4()))
80-
dependencies: Dict[str, List[str]] = field(default_factory=dict)
81-
depends_on: List[str] = field(default_factory=list)
82-
required_by: List[str] = field(default_factory=list)
83-
status: TaskStatus = TaskStatus.PENDING
84-
priority: int = 1
85-
86-
def check_goal(self, task_groups: Dict[str, 'TaskGroup'], completed_tasks: Dict[str, TaskMessage]) -> bool:
87-
"""Check if the group's goal has been achieved"""
88-
print(f"Checking goal for group {self.name} {self.goal} ")
89-
if not self.goal:
90-
return False
91-
92-
if self.goal.status == GoalStatus.ACHIEVED:
93-
return True
94-
95-
if self.goal.check_condition(task_groups, completed_tasks):
96-
self.goal.status = GoalStatus.ACHIEVED
97-
logger.debug(f"\nGoal Achieved for group {self.name}: {self.goal.name}")
98-
logger.debug(self.goal.success_message)
99-
return True
100-
101-
return False
28+
result: Any
29+
status: str # 'success' or 'error'
30+
error_message: Optional[str] = None
31+
metadata: Dict[str, Any] = None

0 commit comments

Comments
 (0)