fix: harden task recovery and DR contract handling
This commit is contained in:
@@ -37,7 +37,9 @@ class BrainService:
|
||||
if type(timeout) not in (int,float) or not math.isfinite(timeout) or not 0<timeout<=3600:raise InferenceError('INVALID_TIMEOUT')
|
||||
request=dict(capability=capability,prompt=prompt,input=goal)
|
||||
if observation:request['observation']=observation
|
||||
raw=self.backend.infer(request,goal['timeout'],cancel)
|
||||
try:raw=self.backend.infer(request,goal['timeout'],cancel)
|
||||
except InferenceError:raise
|
||||
except Exception as ex:raise InferenceError('INFERENCE_FAILED',str(ex)) from ex
|
||||
if cancel is not None and cancel.is_set():raise InferenceError('CANCELED')
|
||||
if not isinstance(raw,str) or len(raw.encode())>262144:raise InferenceError('OUTPUT_TOO_LARGE')
|
||||
return raw
|
||||
@@ -49,6 +51,10 @@ class BrainService:
|
||||
if type(goal.get(key)) is not int or goal[key]<1:raise InferenceError('INVALID_INPUT')
|
||||
if not goal.get('task_id') or goal['constraints'].get('route') not in ROUTES:raise InferenceError('INVALID_INPUT')
|
||||
known=validate_known(goal.get('known_info',{}))
|
||||
from .intent import conflicts_with_instruction
|
||||
confirmed=(goal['task_revision']>1 and goal['constraints'].get('clarification_confirmed') is True)
|
||||
if conflicts_with_instruction(goal['instruction'],known,goal.get('context',{}),clarification_confirmed=confirmed):
|
||||
raise InferenceError('SEMANTIC_MISMATCH','structured information contradicts explicit instruction')
|
||||
complete=('items' in known and 'destination' in known) or all(k in known for k in ('target_name','quantity','source_location','destination'))
|
||||
if not complete:
|
||||
from .intent import extract
|
||||
@@ -71,6 +77,8 @@ class BrainService:
|
||||
try:plan=validate_plan(data)
|
||||
except ApiError as ex:raise InferenceError('PLAN_INVALID',str(ex))
|
||||
if plan['schema_version']!=2 or plan['route']!=goal['constraints']['route']:raise InferenceError('PLAN_INVALID')
|
||||
if conflicts_with_instruction(goal['instruction'],plan['slots'],goal.get('context',{}),clarification_confirmed=confirmed):
|
||||
raise InferenceError('SEMANTIC_MISMATCH','model plan contradicts explicit instruction')
|
||||
# Explicit user-confirmed structured slots are an independent check.
|
||||
expected=plan['slots']
|
||||
if 'items' not in known and known:
|
||||
@@ -90,7 +98,7 @@ class BrainService:
|
||||
obs=self._snapshot(obs)
|
||||
raw=self._call('shelf',goal,'Identify target in this one registered shelf. JSON only {status:SUCCEEDED|NOT_FOUND|AMBIGUOUS,shelf_id,side_id,column_id,tier_id,confidence}. Never guess missing row/column. Target and input: '+canonical(goal),cancel,obs)
|
||||
data=strict_json(raw)
|
||||
if data.get('status') in ('NOT_FOUND','AMBIGUOUS'):result=dict(status=data['status'],error_code=data['status'])
|
||||
if data.get('status') in ('NOT_FOUND','AMBIGUOUS'):result=dict(status=data['status'],error_code=data['status'],observation_id=observation.observation_id,observed_at=observation.stamp_ns)
|
||||
else:
|
||||
if set(data)!={'status','shelf_id','side_id','column_id','tier_id','confidence'} or data['status']!='SUCCEEDED' or data['shelf_id']!=observation.shelf_id or any(not isinstance(data[k],str) or not data[k].strip() or len(data[k])>100 for k in ('side_id','column_id')) or not isinstance(data['tier_id'],str) or len(data['tier_id'])>100 or (data['tier_id'] and not data['tier_id'].strip()):raise InferenceError('SHELF_INVALID')
|
||||
c=data['confidence']
|
||||
@@ -106,7 +114,8 @@ class BrainService:
|
||||
obs=self._snapshot(obs)
|
||||
raw=self._call('localize3d',goal,'Diagnostic object-center estimate only, never grasp point or navigation pose. Return JSON {point:[x,y,z]} or {status:NOT_FOUND|AMBIGUOUS}. Input: '+canonical(goal),cancel,obs)
|
||||
data=strict_json(raw)
|
||||
if data.get('status') in ('NOT_FOUND','AMBIGUOUS'):result=dict(status=data['status'],geometry_valid=False)
|
||||
if data.get('status') in ('NOT_FOUND','AMBIGUOUS'):
|
||||
result=dict(status=data['status'],geometry_valid=False,error_code=data['status'],observation_id=observation.observation_id,observed_at=observation.stamp_ns,calibration_id=observation.calibration_id,geometry_epoch=observation.geometry_epoch)
|
||||
else:
|
||||
point=data['point']
|
||||
if set(data)!={'point'} or not isinstance(point,list) or len(point)!=3 or any(type(v) not in (int,float) or not math.isfinite(v) for v in point):raise InferenceError('POINT_INVALID')
|
||||
|
||||
Reference in New Issue
Block a user