2026-09-20 12:18:52 +08:00
|
|
|
"""Explicit integration fixture: BrainService -> Coordinator -> C++ simulation."""
|
|
|
|
|
from robot_bt_coordinator.backends import DemoBackend
|
|
|
|
|
from robot_bt_coordinator.plan import canonical
|
|
|
|
|
from robot_bt_coordinator.plan_v2 import make_plan
|
|
|
|
|
from .backends import FixtureBackend
|
|
|
|
|
from .service import BrainService
|
|
|
|
|
class BrainDemoBackend(DemoBackend):
|
|
|
|
|
def __init__(self,executable,state_dir,site):
|
|
|
|
|
super().__init__(executable,state_dir);self.site=site
|
|
|
|
|
def fixture(request):
|
|
|
|
|
g=request['input'];known=g['known_info']
|
|
|
|
|
if 'items' not in known:
|
|
|
|
|
missing=[k for k in ('target_name','source_location','destination') if not known.get(k)]
|
|
|
|
|
if missing:return canonical({'missing_information':missing})
|
|
|
|
|
known={'items':[{'target_name':known['target_name'],'source_location':known['source_location'],'quantity':known.get('quantity',1)}],'destination':known['destination']}
|
|
|
|
|
if 'destination' not in known:return canonical({'missing_information':['destination']})
|
|
|
|
|
return canonical(make_plan(g['instruction'],known,site['execution_route']))
|
|
|
|
|
self.brain=BrainService(FixtureBackend(fixture),self.state_dir/'planning_records')
|
|
|
|
|
def start_planning(self,t):
|
|
|
|
|
self.plans.append(t)
|
2026-09-20 13:36:48 +08:00
|
|
|
result=self.brain.plan(dict(task_id=t['task_id'],task_revision=t['task_revision'],planning_generation=t['planning_generation'],instruction=t['request']['instruction'],known_info=t['request']['known_info'],context=self.site,constraints={'schema_version':2,'route':self.site['execution_route'],'clarification_confirmed':t.get('clarification_confirmed') is True},timeout=10))
|
2026-09-20 12:18:52 +08:00
|
|
|
event=dict(type='plan',task_id=t['task_id'],task_revision=t['task_revision'],planning_generation=t['planning_generation'],status=result['status'],error_code=result.get('error_code',''),planning_record_ref=result['record_ref'])
|
|
|
|
|
if result['status']=='NEEDS_CLARIFICATION':event['questions']=result['plan']['missing_information']
|
|
|
|
|
else:event['plan']=result.get('plan')
|
|
|
|
|
self.emit(event)
|