Robot WebUI HTTP interface declarations
This source-derived index records handler signatures, explicit return values and errors. Detailed behavior guides supplement this index; delegated service results must be traced into their implementation.
GET /api/robot/config
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 57
robot_config(request: Request)
Handler results (source expressions):
{'robot': adapter_context_robot(), 'profile': await adapter(request).robot_profile(), 'storageRoot': str(storage_root()), 'configsDir': str(configs_dir()), 'available': configs_dir().exists()}
GET /api/robot/config/schema
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 74
robot_config_schema()
Handler results (source expressions):
read_structured(schema_path, default={'title': 'Robot Config', 'type': 'object', 'properties': {}, 'source': str(schema_path)})
GET /api/robot/config/{name}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 85
robot_config_by_name(name: str)
Handler results (source expressions):
{'name': name, 'path': None, 'data': {}}
{'name': name, 'path': str(path), 'data': read_structured(path, default={})}
POST /api/robot/config/{name}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 94
save_robot_config(name: str, payload: dict)
Handler results (source expressions):
{'ok': True, 'name': name, 'path': str(path)}
GET /api/virtual-project
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 101
virtual_project(request: Request)
Handler results (source expressions):
_virtual_project_payload(root, project, project_names, project_dir(project))
root / name
sophia_dir
GET /api/settings/nodes
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 189
settings_nodes(request: Request)
Handler results (source expressions):
await adapter(request).list_settings_nodes()
GET /api/settings/nodes/{node_name:path}/description
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 194
settings_node_description(request: Request, node_name: str)
Handler results (source expressions):
await adapter(request).describe_settings_node(node_name)
GET /api/settings/nodes/{node_name:path}/configuration
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 199
settings_node_configuration(request: Request, node_name: str)
Handler results (source expressions):
await adapter(request).get_settings_node_configuration(node_name)
POST /api/settings/nodes/{node_name:path}/configuration
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 204
save_settings_node_configuration(request: Request, node_name: str, payload: dict)
Handler results (source expressions):
await adapter(request).save_settings_node_configuration(node_name, payload)
POST /api/settings/nodes/{node_name:path}/save
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 209
save_settings_node_file(request: Request, node_name: str)
Handler results (source expressions):
await adapter(request).save_settings_node_file(node_name)
POST /api/settings/nodes/{node_name:path}/reset
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 214
reset_settings_node_configuration(request: Request, node_name: str)
Handler results (source expressions):
await adapter(request).reset_settings_node_configuration(node_name)
GET /api/settings/nodes/{node_name:path}/saved-file
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 219
settings_node_saved_file(request: Request, node_name: str)
Handler results (source expressions):
await adapter(request).settings_node_saved_file(node_name)
DELETE /api/settings/nodes/{node_name:path}/saved-file
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 224
delete_settings_node_saved_file(request: Request, node_name: str)
Handler results (source expressions):
await adapter(request).delete_settings_node_saved_file(node_name)
GET /api/settings/suggestions
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 229
settings_suggestions(request: Request)
Handler results (source expressions):
await adapter(request).settings_suggestions()
GET /api/monitor/status
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 234
monitor_status(request: Request)
Handler results (source expressions):
await adapter(request).monitor_status()
GET /api/faces
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 239
faces()
Handler results (source expressions):
{'faces': face_store.list_faces()}
GET /api/faces/recognition-settings
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 244
face_recognition_settings(request: Request)
Handler results (source expressions):
await adapter(request).face_recognition_settings()
POST /api/faces/recognition-settings
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 249
save_face_recognition_settings(request: Request, payload: dict)
Handler results (source expressions):
{**saved, **updated}
Explicit handler errors:
HTTPException(status_code=400, detail={'error': 'missing_threshold'})
POST /api/faces
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 259
save_face(payload: dict)
Handler results (source expressions):
{'ok': True, 'face': face}
DELETE /api/faces/{face_id}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 270
delete_face(face_id: str)
Handler results (source expressions):
{'ok': face_store.delete_face(face_id), 'id': face_id}
GET /api/faces/images/{image_path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 275
face_image(image_path: str)
Handler results (source expressions):
FileResponse(path)
Explicit handler errors:
HTTPException(status_code=404, detail='Image not found')
POST /api/faces/{face_id}/images
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 286
add_face_image(request: Request, face_id: str, file: UploadFile=File(...))
Handler results (source expressions):
{'ok': True, 'embedded': True, 'face': face_store.find_face(face['id']), 'image': image, 'embedding': {key: value for key, value in stored_embedding.items() if key != 'embedding'}}
{'ok': True, 'embedded': False, 'embedding_error': embedding_error, 'face': face_store.find_face(face['id']), 'image': image}
POST /api/faces/{face_id}/regenerate
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 408
regenerate_face_embeddings(request: Request, face_id: str)
Handler results (source expressions):
await _regenerate_face_embeddings(request, face_ids=[face_id])
Explicit handler errors:
HTTPException(status_code=404, detail='Face not found')
POST /api/faces/regenerate
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 415
regenerate_all_face_embeddings(request: Request)
Handler results (source expressions):
await _regenerate_face_embeddings(request)
POST /api/faces/search
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 420
search_face(request: Request, payload: dict)
Handler results (source expressions):
face_store.search_embedding(embedding, threshold=_face_recognition_threshold(threshold), model=payload.get('model'))
Explicit handler errors:
HTTPException(status_code=400, detail='Missing embedding')
GET /api/faces/live-candidates
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 435
face_live_candidates(request: Request)
Handler results (source expressions):
await adapter(request).face_live_candidates()
GET /api/teleops/state
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 440
teleops_state(request: Request)
Handler results (source expressions):
await adapter(request).teleops_state()
GET /api/teleops/catalog
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 445
teleops_catalog(request: Request)
Handler results (source expressions):
await adapter(request).teleops_catalog()
GET /api/teleops/settings
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 450
teleops_settings(request: Request)
Handler results (source expressions):
await adapter(request).teleops_settings()
POST /api/teleops/command
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 455
teleops_command(request: Request, payload: dict)
Handler results (source expressions):
await adapter(request).handle_command(message)
POST /api/settings/trees/{tree_name:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 462
save_tree(tree_name: str, payload: dict)
Handler results (source expressions):
{'ok': True, 'path': str(path)}
GET /api/settings/trees/{tree_name:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 469
get_tree(tree_name: str)
Handler results (source expressions):
{'path': str(path), 'data': read_structured(path, default={})}
DELETE /api/settings/trees/{tree_name:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 475
remove_tree(tree_name: str)
Handler results (source expressions):
{'ok': True, 'path': str(path)}
GET /api/motors
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 483
motors(request: Request)
Handler results (source expressions):
await adapter(request).list_motors()
GET /api/motors/states
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 488
motor_states(request: Request)
Handler results (source expressions):
await adapter(request).motor_states()
POST /api/motors/control
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 493
motor_control(request: Request, payload: dict)
Handler results (source expressions):
await adapter(request).set_motor_control(payload)
POST /api/motors/command
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 498
motor_command(request: Request, payload: dict)
Handler results (source expressions):
await adapter(request).send_motor_command(payload)
POST /api/motors/torque
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 503
motor_torque(request: Request, payload: dict)
Handler results (source expressions):
await adapter(request).set_motor_torque(payload)
GET /api/motors/config
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 508
motors_config(request: Request)
Handler results (source expressions):
{'configsDir': str(configs_dir()), 'files': list_files(configs_dir(), suffixes={'.yaml', '.yml', '.json'}), **config}
POST /api/motors/config
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 518
save_motors_config(request: Request, payload: dict)
Handler results (source expressions):
result
{'ok': True, 'path': str(path)}
GET /api/navigation/locations
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 528
navigation_locations()
Handler results (source expressions):
{'ok': False, 'locations': [], 'error': 'Navigation is unsupported in the ROS2 WebUI adapter.'}
POST /api/navigation/go-to
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 533
navigation_go_to(payload: dict)
Handler results (source expressions):
{'ok': False, 'error': 'Navigation is unsupported in the ROS2 WebUI adapter.', 'received': payload}
POST /api/navigation/go-to-position
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 538
navigation_go_to_position(payload: dict)
Handler results (source expressions):
{'ok': False, 'error': 'Navigation is unsupported in the ROS2 WebUI adapter.', 'received': payload}
POST /api/navigation/stop
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 543
navigation_stop(payload: dict)
Handler results (source expressions):
{'ok': False, 'error': 'Navigation is unsupported in the ROS2 WebUI adapter.', 'received': payload}
GET /api/performances
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 548
performances(request: Request, tree: bool=False)
Handler results (source expressions):
{'root': str(performances_dir()), 'items': list_files(performances_dir(), suffixes={'.yaml', '.yml', '.json', '.properties'})}
performance_tree(robot_name)
GET /api/performances/current
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 559
current_performance_payload(request: Request)
Handler results (source expressions):
await adapter(request).performance_current_payload()
GET /api/performances/{item_path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 564
performance_item(request: Request, item_path: str)
Handler results (source expressions):
load_performance(adapter(request).robot_name, item_path)
Explicit handler errors:
HTTPException(status_code=400, detail=str(error))
POST /api/performances/{item_path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 572
save_performance_item(request: Request, item_path: str, payload: dict)
Handler results (source expressions):
save_performance(adapter(request).robot_name, item_path, payload)
Explicit handler errors:
HTTPException(status_code=409, detail={'error': 'Performance changed since it was loaded', 'id': error.item_id, 'currentRevision': error.current_revision})
HTTPException(status_code=400, detail=str(error))
DELETE /api/performances/{item_path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 589
delete_performance_item(request: Request, item_path: str)
Handler results (source expressions):
delete_performance(adapter(request).robot_name, item_path)
Explicit handler errors:
HTTPException(status_code=400, detail=str(error))
POST /api/performance-folders/{folder_path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 597
create_performance_folder(request: Request, folder_path: str)
Handler results (source expressions):
create_folder(adapter(request).robot_name, folder_path)
Explicit handler errors:
HTTPException(status_code=400, detail=str(error))
POST /api/performance-move/{item_path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 605
move_performance_item(request: Request, item_path: str, payload: dict)
Handler results (source expressions):
move_performance(adapter(request).robot_name, item_path, payload)
Explicit handler errors:
HTTPException(status_code=400, detail=str(error))
GET /api/performance-properties
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 613
root_performance_properties(request: Request)
Handler results (source expressions):
read_properties(adapter(request).robot_name)
GET /api/performance-properties/{property_path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 618
performance_properties(request: Request, property_path: str)
Handler results (source expressions):
read_properties(adapter(request).robot_name, property_path)
Explicit handler errors:
HTTPException(status_code=400, detail=str(error))
POST /api/performance-properties/{property_path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 626
save_performance_properties(request: Request, property_path: str, payload: dict)
Handler results (source expressions):
write_properties(adapter(request).robot_name, property_path, payload)
Explicit handler errors:
HTTPException(status_code=400, detail=str(error))
GET /api/performance-catalog
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 634
performance_catalog(request: Request)
Handler results (source expressions):
await adapter(request).performance_catalog()
POST /api/performance-runtime/speech-length
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 639
performance_speech_length(request: Request, payload: dict)
Handler results (source expressions):
await adapter(request).performance_speech_length(payload)
POST /api/performance-runtime/animation-length
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 644
performance_animation_length(request: Request, payload: dict)
Handler results (source expressions):
await adapter(request).performance_animation_length(payload)
POST /api/performance-runtime/arm-animation-length
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 649
performance_arm_animation_length(request: Request, payload: dict)
Handler results (source expressions):
await adapter(request).performance_arm_animation_length(payload)
POST /api/performance-runtime/tts-preview
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 654
performance_tts_preview(request: Request, payload: dict)
Handler results (source expressions):
await adapter(request).performance_tts_preview(payload)
POST /api/performance-runtime/preview
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 659
performance_preview(request: Request, payload: dict)
Handler results (source expressions):
await adapter(request).performance_preview(payload)
GET /api/performance-runtime/autopause
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 664
performance_autopause(request: Request)
Handler results (source expressions):
await adapter(request).performance_autopause()
GET /api/compat/legacy-routes
Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 670
legacy_routes()
Handler results (source expressions):
{'routes': [{'legacy': '#/teleops', 'modern': '#/teleops'}, {'legacy': '#/performances', 'modern': '#/performances'}, {'legacy': '#/motors', 'modern': '#/motors'}, {'legacy': '#/settings', 'modern': '#/settings'}, {'legacy': '#/virtual', 'modern': '#/virtual'}, {'legacy': '#/admin/motors', 'modern': '#/admin/motors'}]}
GET /api/health
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 360
health()
Handler results (source expressions):
{'ok': True, 'service': 'webui', 'uptimeSec': round(time.time() - app.state.started_at, 3), 'clients': len(app.state.event_hub.clients), 'adapter': adapter_health}
GET /api/version
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 371
version()
Handler results (source expressions):
{'name': 'webui', 'version': '0.1.0', 'protocolVersion': 1}
GET /api/status
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 379
status()
Handler results (source expressions):
{'latest': app.state.event_hub.latest, 'clients': len(app.state.event_hub.clients)}
GET /api/video/fov.mjpg
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 386
fov_mjpeg(frames: int | None=None)
Handler results (source expressions):
StreamingResponse(stream_frames(), media_type=f'multipart/x-mixed-replace; boundary={boundary}', headers={**NO_STORE_HEADERS, 'X-Accel-Buffering': 'no'})
f'--{boundary}\r\nContent-Type: {content_type}\r\nContent-Length: {len(data)}\r\n\r\n'.encode('ascii') + data + b'\r\n'
Explicit handler errors:
HTTPException(status_code=503, detail='No FOV image frame is available yet.')
GET /api/video/fov.jpg
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 437
fov_jpeg(after: int | None=None, timeout: float=0.5)
Handler results (source expressions):
Response(content=data, media_type=frame.get('content_type') or 'image/jpeg', headers=headers)
_camera_unavailable_response()
Response(status_code=204, headers=NO_STORE_HEADERS)
GET /api/tts/files
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 469
tts_files(path: str='')
Handler results (source expressions):
_tts_directory_metadata(tts_static_dir, requested)
Explicit handler errors:
HTTPException(status_code=404, detail='TTS path not found.')
GET /api/asr/files
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 479
asr_files(path: str='')
Handler results (source expressions):
_audio_directory_metadata(asr_static_dir, requested, 'asr')
Explicit handler errors:
HTTPException(status_code=404, detail='ASR path not found.')
GET/POST/PUT/PATCH/DELETE /api/{path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 489
unknown_api_route(path: str)
Explicit handler errors:
HTTPException(status_code=404, detail=f'Unknown API route: /api/{path}')
GET /monitor/status
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 493
legacy_monitor_status()
Handler results (source expressions):
await app.state.robot_adapter.monitor_status()
GET /robot_config_schema
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 497
legacy_robot_config_schema()
Handler results (source expressions):
await robot_config_schema()
GET /robot_config/{name}
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 502
legacy_robot_config(name: str)
Handler results (source expressions):
await robot_config_by_name(name)
GET /motors/get/{name}
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 507
legacy_motors(name: str)
Handler results (source expressions):
data
GET /attention_regions/{name}
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 513
removed_legacy_attention_regions(name: str)
Explicit handler errors:
HTTPException(status_code=404, detail='Attention regions are removed from the API.')
WEBSOCKET /ws
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 517
websocket_endpoint(websocket: WebSocket)
WEBSOCKET /ws/audio
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 590
audio_websocket_endpoint(websocket: WebSocket)
GET /tts
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 611
tts_root()
Handler results (source expressions):
RedirectResponse(url='/#/tts')
GET /tts/
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 611
tts_root()
Handler results (source expressions):
RedirectResponse(url='/#/tts')
GET /tts/{path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 615
tts_file(path: str)
Handler results (source expressions):
_not_found_redirect(f'/tts/{path}')
FileResponse(requested)
RedirectResponse(url=_tts_hash_path(_relative_tts_path(tts_static_dir, requested)))
GET /asr
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 628
asr_root()
Handler results (source expressions):
RedirectResponse(url='/#/asr')
GET /asr/
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 628
asr_root()
Handler results (source expressions):
RedirectResponse(url='/#/asr')
GET /asr/{path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 632
asr_file(path: str)
Handler results (source expressions):
_not_found_redirect(f'/asr/{path}')
FileResponse(requested)
RedirectResponse(url=_asr_hash_path(relative))
GET /
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 649
index()
Handler results (source expressions):
_not_found_redirect('/')
FileResponse(static_dir / 'index.html', headers=NO_STORE_HEADERS)
GET /{path:path}
Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 655
spa_fallback(path: str)
Handler results (source expressions):
_not_found_redirect(f'/{path}')
FileResponse(requested)