feat(planner): add execution context to prompts
Tests / Test passed: 977

This commit is contained in:
2026-07-16 10:25:20 +08:00
parent 240b7be7b8
commit 358f4623ba
9 changed files with 159 additions and 3 deletions
+23 -2
View File
@@ -42,6 +42,7 @@ TaskSucceededHook = Callable[[str, str, Timeline], None]
StopRequested = Callable[[], bool]
StopReason = Callable[[], "str | None"]
StepProgressCallback = Callable[[int, str, str], None]
DevicePlatformProvider = Callable[[str], str | None]
def is_cancellation_reason(reason: str | None) -> bool:
@@ -68,6 +69,7 @@ class TaskRunner:
skill_embedding_client: EmbeddingClient | None = None,
planner_config: PlannerConfig | None = None,
on_step_progress: StepProgressCallback | None = None,
device_platform_provider: DevicePlatformProvider | None = None,
) -> None:
self.planner_config = planner_config or load_planner_config()
self.planner = planner or self._default_planner()
@@ -98,6 +100,7 @@ class TaskRunner:
else:
self.on_task_succeeded = None
self.on_step_progress = on_step_progress
self.device_platform_provider = device_platform_provider
def run(
self,
@@ -108,7 +111,11 @@ class TaskRunner:
) -> Task:
if self.metadata_store:
self.metadata_store.create_task(task)
context = TaskContext(task_id=task.id, goal=task.goal)
context = TaskContext(
task_id=task.id,
goal=task.goal,
device_platform=self._device_platform(task.device_id),
)
world_handle = self._start_world_view(task.id)
if world_handle is not None:
context.world = world_handle.state
@@ -201,7 +208,9 @@ class TaskRunner:
)
return task
def _interrupt_task(self, task: Task, stop_reason: StopReason | None = None) -> Task:
def _interrupt_task(
self, task: Task, stop_reason: StopReason | None = None
) -> Task:
reason = stop_reason() if stop_reason is not None else None
message = reason or "execution interrupted"
status = "cancelled" if is_cancellation_reason(reason) else "failed"
@@ -307,6 +316,18 @@ class TaskRunner:
return AIPlanner(config=self.planner_config)
return Planner()
def _device_platform(self, device_id: str) -> str | None:
if self.device_platform_provider is None:
return None
try:
return self.device_platform_provider(device_id)
except Exception:
logger.warning(
"device platform lookup failed; continuing without configured platform",
exc_info=True,
)
return None
def _plan(
self,
goal: str,