From 7c2f3c340f45cfd12b2ad0dd30e684252bb64f1e Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Fri, 31 Oct 2025 04:06:25 +0200 Subject: [PATCH 01/10] use structlog --- .gitignore | 2 + dimos/agents/agent.py | 2 +- dimos/agents/agent_ctransformers_gguf.py | 2 +- dimos/agents/agent_huggingface_local.py | 2 +- dimos/agents/agent_huggingface_remote.py | 2 +- dimos/agents/cerebras_agent.py | 2 +- dimos/agents/claude_agent.py | 2 +- dimos/agents/memory/base.py | 2 +- dimos/agents/memory/image_embedding.py | 2 +- dimos/agents/memory/spatial_vector_db.py | 2 +- dimos/agents/memory/visual_memory.py | 2 +- dimos/agents/modules/agent_pool.py | 2 +- dimos/agents/modules/base.py | 2 +- dimos/agents/modules/base_agent.py | 2 +- dimos/agents/planning_agent.py | 2 +- dimos/agents/test_agent_image_message.py | 2 +- dimos/agents/test_agent_message_streams.py | 2 +- dimos/agents/test_agent_tools.py | 2 +- .../agents/tokenizer/huggingface_tokenizer.py | 2 +- dimos/agents/tokenizer/openai_tokenizer.py | 2 +- dimos/agents2/agent.py | 2 +- dimos/agents2/spec.py | 2 +- dimos/agents2/temp/run_unitree_agents2.py | 2 +- dimos/agents2/temp/run_unitree_async.py | 2 +- .../agents2/temp/test_unitree_agent_query.py | 2 +- .../temp/test_unitree_skill_container.py | 2 +- dimos/constants.py | 2 + dimos/core/__init__.py | 7 +- dimos/hardware/camera/zed/camera.py | 2 +- dimos/hardware/fake_zed_module.py | 2 +- dimos/hardware/gstreamer_camera.py | 2 +- dimos/manipulation/manip_aio_pipeline.py | 2 +- dimos/manipulation/manip_aio_processer.py | 2 +- dimos/manipulation/manipulation_history.py | 2 +- dimos/manipulation/manipulation_interface.py | 2 +- .../visual_servoing/detection3d.py | 2 +- .../visual_servoing/manipulation_module.py | 2 +- dimos/manipulation/visual_servoing/pbvs.py | 2 +- dimos/mapping/osm/query.py | 2 +- dimos/navigation/bbox_navigation.py | 2 +- dimos/navigation/bt_navigator/navigator.py | 2 +- .../bt_navigator/recovery_server.py | 2 +- .../wavefront_frontier_goal_selector.py | 2 +- dimos/navigation/global_planner/algo.py | 2 +- dimos/navigation/rosnav.py | 2 +- dimos/perception/common/utils.py | 2 +- .../detection/detectors/person/yolo.py | 2 +- dimos/perception/detection/detectors/yolo.py | 2 +- .../grasp_generation/grasp_generation.py | 2 +- dimos/perception/object_detection_stream.py | 2 +- dimos/perception/object_tracker.py | 2 +- dimos/perception/object_tracker_2d.py | 2 +- dimos/perception/object_tracker_3d.py | 2 +- dimos/perception/person_tracker.py | 2 +- dimos/perception/segmentation/sam_2d_seg.py | 2 +- .../perception/test_spatial_memory_module.py | 2 +- dimos/protocol/pubsub/lcmpubsub.py | 2 +- dimos/protocol/pubsub/shmpubsub.py | 2 +- dimos/protocol/pubsub/spec.py | 2 +- dimos/protocol/service/lcmservice.py | 2 +- dimos/robot/agilex/piper_arm.py | 2 +- dimos/robot/agilex/run.py | 2 +- dimos/robot/position_stream.py | 2 +- dimos/robot/ros_bridge.py | 2 +- dimos/robot/ros_command_queue.py | 2 +- dimos/robot/ros_control.py | 2 +- dimos/robot/ros_observable_topic.py | 2 +- dimos/robot/ros_transform.py | 2 +- dimos/robot/test_ros_observable_topic.py | 4 +- dimos/robot/unitree/g1/g1zed.py | 2 +- dimos/robot/unitree/go2/go2.py | 2 +- dimos/robot/unitree_webrtc/depth_module.py | 2 +- dimos/robot/unitree_webrtc/g1_run.py | 2 +- .../modular/connection_module.py | 2 +- .../unitree_webrtc/modular/ivan_unitree.py | 2 +- dimos/robot/unitree_webrtc/rosnav.py | 2 +- .../test_unitree_go2_integration.py | 2 +- .../unitree_webrtc/unitree_b1/connection.py | 2 +- .../unitree_webrtc/unitree_b1/unitree_b1.py | 2 +- dimos/robot/unitree_webrtc/unitree_g1.py | 2 +- .../unitree_g1_skill_container.py | 2 +- .../unitree_webrtc/unitree_skill_container.py | 2 +- dimos/skills/kill_skill.py | 2 +- .../manipulation/force_constraint_skill.py | 2 +- dimos/skills/manipulation/manipulate_skill.py | 2 +- dimos/skills/manipulation/pick_and_place.py | 2 +- .../manipulation/rotation_constraint_skill.py | 2 +- .../translation_constraint_skill.py | 2 +- dimos/skills/speak.py | 2 +- dimos/skills/unitree/unitree_speak.py | 2 +- dimos/skills/visual_navigation_skills.py | 2 +- dimos/stream/audio/node_key_recorder.py | 2 +- dimos/stream/audio/node_microphone.py | 2 +- dimos/stream/audio/node_normalizer.py | 2 +- dimos/stream/audio/node_output.py | 2 +- dimos/stream/audio/node_simulated.py | 2 +- dimos/stream/audio/node_volume_monitor.py | 2 +- dimos/stream/audio/stt/node_whisper.py | 2 +- dimos/stream/audio/text/node_stdout.py | 2 +- dimos/stream/audio/tts/node_openai.py | 2 +- dimos/stream/audio/tts/node_pytts.py | 2 +- dimos/stream/rtsp_video_provider.py | 2 +- dimos/types/timestamped.py | 2 +- dimos/utils/logging_config.py | 181 ++++++++++++------ dimos/utils/threadpool.py | 4 +- .../web/websocket_vis/websocket_vis_module.py | 2 +- pyproject.toml | 1 + tests/test_manipulation_agent.py | 2 +- ...test_manipulation_pipeline_single_frame.py | 2 +- ..._manipulation_pipeline_single_frame_lcm.py | 2 +- tests/test_navigate_to_object_robot.py | 4 +- tests/test_navigation_skills.py | 2 +- tests/test_object_tracking_module.py | 2 +- tests/test_person_following_robot.py | 4 +- tests/test_pick_and_place_module.py | 2 +- tests/test_pick_and_place_skill.py | 2 +- tests/test_planning_agent_web_interface.py | 4 +- tests/test_planning_robot_agent.py | 4 +- tests/test_rtsp_video_provider.py | 2 +- tests/test_unitree_agent_queries_fastapi.py | 4 +- tests/test_zed_module.py | 2 +- tests/visualization_script.py | 2 +- 122 files changed, 261 insertions(+), 180 deletions(-) diff --git a/.gitignore b/.gitignore index 18fd575c85..ec3d1925d5 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,5 @@ yolo11n.pt # symlink one of .envrc.* if you'd like to use .envrc .claude + +/logs diff --git a/dimos/agents/agent.py b/dimos/agents/agent.py index 62765ef706..e5a60d03fe 100644 --- a/dimos/agents/agent.py +++ b/dimos/agents/agent.py @@ -61,7 +61,7 @@ load_dotenv() # Initialize logger for the agent module -logger = setup_logger("dimos.agents") +logger = setup_logger(__file__) # Constants _TOKEN_BUDGET_PARTS = 4 # Number of parts to divide token budget diff --git a/dimos/agents/agent_ctransformers_gguf.py b/dimos/agents/agent_ctransformers_gguf.py index 17d233437d..b6d055a9e6 100644 --- a/dimos/agents/agent_ctransformers_gguf.py +++ b/dimos/agents/agent_ctransformers_gguf.py @@ -33,7 +33,7 @@ load_dotenv() # Initialize logger for the agent module -logger = setup_logger("dimos.agents", level=logging.DEBUG) +logger = setup_logger(__file__, level=logging.DEBUG) from ctransformers import AutoModelForCausalLM as CTransformersModel diff --git a/dimos/agents/agent_huggingface_local.py b/dimos/agents/agent_huggingface_local.py index 69d02bb1d2..0c61d3e166 100644 --- a/dimos/agents/agent_huggingface_local.py +++ b/dimos/agents/agent_huggingface_local.py @@ -43,7 +43,7 @@ load_dotenv() # Initialize logger for the agent module -logger = setup_logger("dimos.agents", level=logging.DEBUG) +logger = setup_logger(__file__, level=logging.DEBUG) # HuggingFaceLLMAgent Class diff --git a/dimos/agents/agent_huggingface_remote.py b/dimos/agents/agent_huggingface_remote.py index 5bb5b293d3..6ff2c5b47b 100644 --- a/dimos/agents/agent_huggingface_remote.py +++ b/dimos/agents/agent_huggingface_remote.py @@ -41,7 +41,7 @@ load_dotenv() # Initialize logger for the agent module -logger = setup_logger("dimos.agents", level=logging.DEBUG) +logger = setup_logger(__file__, level=logging.DEBUG) # HuggingFaceLLMAgent Class diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index e58de812d0..513c322f1d 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -51,7 +51,7 @@ load_dotenv() # Initialize logger for the Cerebras agent -logger = setup_logger("dimos.agents.cerebras") +logger = setup_logger(__file__) # Response object compatible with LLMAgent diff --git a/dimos/agents/claude_agent.py b/dimos/agents/claude_agent.py index c8163de162..2c62cb939f 100644 --- a/dimos/agents/claude_agent.py +++ b/dimos/agents/claude_agent.py @@ -46,7 +46,7 @@ load_dotenv() # Initialize logger for the Claude agent -logger = setup_logger("dimos.agents.claude") +logger = setup_logger(__file__) # Response object compatible with LLMAgent diff --git a/dimos/agents/memory/base.py b/dimos/agents/memory/base.py index eb48dcca44..be5293b680 100644 --- a/dimos/agents/memory/base.py +++ b/dimos/agents/memory/base.py @@ -37,7 +37,7 @@ def __init__(self, connection_type: str = "local", **kwargs) -> None: UnknownConnectionTypeError: If an unrecognized connection type is specified. AgentMemoryConnectionError: If initializing the database connection fails. """ - self.logger = setup_logger(self.__class__.__name__) + self.logger = setup_logger(__file__) self.logger.info("Initializing AgentMemory with connection type: %s", connection_type) self.connection_params = kwargs self.db_connection = ( diff --git a/dimos/agents/memory/image_embedding.py b/dimos/agents/memory/image_embedding.py index 7b6dd88515..53676d9f1a 100644 --- a/dimos/agents/memory/image_embedding.py +++ b/dimos/agents/memory/image_embedding.py @@ -30,7 +30,7 @@ from dimos.utils.data import get_data from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.agents.memory.image_embedding") +logger = setup_logger(__file__) class ImageEmbeddingProvider: diff --git a/dimos/agents/memory/spatial_vector_db.py b/dimos/agents/memory/spatial_vector_db.py index ac5dcc026a..cfc99c537a 100644 --- a/dimos/agents/memory/spatial_vector_db.py +++ b/dimos/agents/memory/spatial_vector_db.py @@ -28,7 +28,7 @@ from dimos.types.robot_location import RobotLocation from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.agents.memory.spatial_vector_db") +logger = setup_logger(__file__) class SpatialVectorDB: diff --git a/dimos/agents/memory/visual_memory.py b/dimos/agents/memory/visual_memory.py index 90f1272fef..7ceef172e7 100644 --- a/dimos/agents/memory/visual_memory.py +++ b/dimos/agents/memory/visual_memory.py @@ -25,7 +25,7 @@ from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.agents.memory.visual_memory") +logger = setup_logger(__file__) class VisualMemory: diff --git a/dimos/agents/modules/agent_pool.py b/dimos/agents/modules/agent_pool.py index 08ef943765..4521647f7d 100644 --- a/dimos/agents/modules/agent_pool.py +++ b/dimos/agents/modules/agent_pool.py @@ -24,7 +24,7 @@ from dimos.core import In, Module, Out, rpc from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.agents.modules.agent_pool") +logger = setup_logger(__file__) class AgentPoolModule(Module): diff --git a/dimos/agents/modules/base.py b/dimos/agents/modules/base.py index 9caaac49cc..a0669065cb 100644 --- a/dimos/agents/modules/base.py +++ b/dimos/agents/modules/base.py @@ -33,7 +33,7 @@ except ImportError: from dimos.agents.modules.gateway import UnifiedGatewayClient -logger = setup_logger("dimos.agents.modules.base") +logger = setup_logger(__file__) # Vision-capable models VISION_MODELS = { diff --git a/dimos/agents/modules/base_agent.py b/dimos/agents/modules/base_agent.py index 0bceb1112e..a97cecab57 100644 --- a/dimos/agents/modules/base_agent.py +++ b/dimos/agents/modules/base_agent.py @@ -29,7 +29,7 @@ except ImportError: from dimos.agents.modules.base import BaseAgent -logger = setup_logger("dimos.agents.modules.base_agent") +logger = setup_logger(__file__) class BaseAgentModule(BaseAgent, Module): diff --git a/dimos/agents/planning_agent.py b/dimos/agents/planning_agent.py index 6dbdbf5866..c90a8c02f3 100644 --- a/dimos/agents/planning_agent.py +++ b/dimos/agents/planning_agent.py @@ -24,7 +24,7 @@ from dimos.skills.skills import AbstractSkill from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.agents.planning_agent") +logger = setup_logger(__file__) # For response validation diff --git a/dimos/agents/test_agent_image_message.py b/dimos/agents/test_agent_image_message.py index c7f84bcefe..528b62f75e 100644 --- a/dimos/agents/test_agent_image_message.py +++ b/dimos/agents/test_agent_image_message.py @@ -28,7 +28,7 @@ from dimos.msgs.sensor_msgs.Image import ImageFormat from dimos.utils.logging_config import setup_logger -logger = setup_logger("test_agent_image_message") +logger = setup_logger(__file__) # Enable debug logging for base module logging.getLogger("dimos.agents.modules.base").setLevel(logging.DEBUG) diff --git a/dimos/agents/test_agent_message_streams.py b/dimos/agents/test_agent_message_streams.py index 22d33b46de..917a91f987 100644 --- a/dimos/agents/test_agent_message_streams.py +++ b/dimos/agents/test_agent_message_streams.py @@ -34,7 +34,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay -logger = setup_logger("test_agent_message_streams") +logger = setup_logger(__file__) class VideoMessageSender(Module): diff --git a/dimos/agents/test_agent_tools.py b/dimos/agents/test_agent_tools.py index fd485ac015..11f313be9a 100644 --- a/dimos/agents/test_agent_tools.py +++ b/dimos/agents/test_agent_tools.py @@ -31,7 +31,7 @@ from dimos.skills.skills import AbstractSkill, SkillLibrary from dimos.utils.logging_config import setup_logger -logger = setup_logger("test_agent_tools") +logger = setup_logger(__file__) # Test Skills diff --git a/dimos/agents/tokenizer/huggingface_tokenizer.py b/dimos/agents/tokenizer/huggingface_tokenizer.py index 34ace64fb0..554dcc20cc 100644 --- a/dimos/agents/tokenizer/huggingface_tokenizer.py +++ b/dimos/agents/tokenizer/huggingface_tokenizer.py @@ -57,7 +57,7 @@ def image_token_count(image_width, image_height, image_detail: str = "high"): """ Calculate the number of tokens in an image. Low detail is 85 tokens, high detail is 170 tokens per 512x512 square. """ - logger = setup_logger("dimos.agents.tokenizer.HuggingFaceTokenizer.image_token_count") + logger = setup_logger(__file__) if image_detail == "low": return 85 diff --git a/dimos/agents/tokenizer/openai_tokenizer.py b/dimos/agents/tokenizer/openai_tokenizer.py index 7fe5017241..9aa4828e23 100644 --- a/dimos/agents/tokenizer/openai_tokenizer.py +++ b/dimos/agents/tokenizer/openai_tokenizer.py @@ -57,7 +57,7 @@ def image_token_count(image_width, image_height, image_detail: str = "high"): """ Calculate the number of tokens in an image. Low detail is 85 tokens, high detail is 170 tokens per 512x512 square. """ - logger = setup_logger("dimos.agents.tokenizer.openai.image_token_count") + logger = setup_logger(__file__) if image_detail == "low": return 85 diff --git a/dimos/agents2/agent.py b/dimos/agents2/agent.py index 04c08b0434..f09305903a 100644 --- a/dimos/agents2/agent.py +++ b/dimos/agents2/agent.py @@ -40,7 +40,7 @@ from dimos.protocol.skill.type import Output from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.protocol.agents2") +logger = setup_logger(__file__) SYSTEM_MSG_APPEND = "\nYour message history will always be appended with a System Overview message that provides situational awareness." diff --git a/dimos/agents2/spec.py b/dimos/agents2/spec.py index 9973b05356..2e7965d257 100644 --- a/dimos/agents2/spec.py +++ b/dimos/agents2/spec.py @@ -39,7 +39,7 @@ from dimos.utils.generic import truncate_display_string from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.agents.modules.base_agent") +logger = setup_logger(__file__) # Dynamically create ModelProvider enum from LangChain's supported providers diff --git a/dimos/agents2/temp/run_unitree_agents2.py b/dimos/agents2/temp/run_unitree_agents2.py index aacfd1b5f4..dc46309a88 100644 --- a/dimos/agents2/temp/run_unitree_agents2.py +++ b/dimos/agents2/temp/run_unitree_agents2.py @@ -37,7 +37,7 @@ from dimos.robot.unitree_webrtc.unitree_skill_container import UnitreeSkillContainer from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.agents2.run_unitree") +logger = setup_logger(__file__) # Load environment variables load_dotenv() diff --git a/dimos/agents2/temp/run_unitree_async.py b/dimos/agents2/temp/run_unitree_async.py index 29213c1c90..2df84fd09b 100644 --- a/dimos/agents2/temp/run_unitree_async.py +++ b/dimos/agents2/temp/run_unitree_async.py @@ -34,7 +34,7 @@ from dimos.robot.unitree_webrtc.unitree_skill_container import UnitreeSkillContainer from dimos.utils.logging_config import setup_logger -logger = setup_logger("run_unitree_async") +logger = setup_logger(__file__) # Load environment variables load_dotenv() diff --git a/dimos/agents2/temp/test_unitree_agent_query.py b/dimos/agents2/temp/test_unitree_agent_query.py index 4990940e6c..d3de00922c 100644 --- a/dimos/agents2/temp/test_unitree_agent_query.py +++ b/dimos/agents2/temp/test_unitree_agent_query.py @@ -34,7 +34,7 @@ from dimos.robot.unitree_webrtc.unitree_skill_container import UnitreeSkillContainer from dimos.utils.logging_config import setup_logger -logger = setup_logger("test_agent_query") +logger = setup_logger(__file__) # Load environment variables load_dotenv() diff --git a/dimos/agents2/temp/test_unitree_skill_container.py b/dimos/agents2/temp/test_unitree_skill_container.py index 16502004ff..2d48c70349 100644 --- a/dimos/agents2/temp/test_unitree_skill_container.py +++ b/dimos/agents2/temp/test_unitree_skill_container.py @@ -30,7 +30,7 @@ from dimos.robot.unitree_webrtc.unitree_skill_container import UnitreeSkillContainer from dimos.utils.logging_config import setup_logger -logger = setup_logger("test_unitree_skills") +logger = setup_logger(__file__) def test_skill_container_creation(): diff --git a/dimos/constants.py b/dimos/constants.py index 17273b6dd3..d5a45906f1 100644 --- a/dimos/constants.py +++ b/dimos/constants.py @@ -16,6 +16,8 @@ DIMOS_PROJECT_ROOT = Path(__file__).parent.parent +DIMOS_LOG_DIR = DIMOS_PROJECT_ROOT / "logs" + """ Constants for shared memory Usually, auto-detection for size would be preferred. Sadly, though, channels are made diff --git a/dimos/core/__init__.py b/dimos/core/__init__.py index a3ded7a003..4f7dbdb3ab 100644 --- a/dimos/core/__init__.py +++ b/dimos/core/__init__.py @@ -23,6 +23,9 @@ from dimos.protocol.rpc.spec import RPCSpec from dimos.protocol.tf import LCMTF, TF, PubSubTF, TFConfig, TFSpec from dimos.utils.actor_registry import ActorRegistry +from dimos.utils.logging_config import setup_logger + +logger = setup_logger(__file__) __all__ = [ "LCMRPC", @@ -91,7 +94,7 @@ def deploy( **kwargs, ): console = Console() - with console.status(f"deploying [green]{actor_class.__name__}", spinner="arc"): + with console.status(f"deploying [green]{actor_class.__name__}\n", spinner="arc"): actor = dask_client.submit( actor_class, *args, @@ -100,7 +103,7 @@ def deploy( ).result() worker = actor.set_ref(actor).result() - print(f"deployed: {colors.blue(actor)} @ {colors.orange('worker ' + str(worker))}") + logger.info("Deployed module.", module=actor._cls.__name__, worker_id=worker) # Register actor deployment in shared memory ActorRegistry.update(str(actor), str(worker)) diff --git a/dimos/hardware/camera/zed/camera.py b/dimos/hardware/camera/zed/camera.py index fdcd93f731..4d2bddc4ee 100644 --- a/dimos/hardware/camera/zed/camera.py +++ b/dimos/hardware/camera/zed/camera.py @@ -31,7 +31,7 @@ from dimos.protocol.tf import TF from dimos.utils.logging_config import setup_logger -logger = setup_logger(__name__) +logger = setup_logger(__file__) class ZEDCamera: diff --git a/dimos/hardware/fake_zed_module.py b/dimos/hardware/fake_zed_module.py index c4c46c33b3..48b5043c72 100644 --- a/dimos/hardware/fake_zed_module.py +++ b/dimos/hardware/fake_zed_module.py @@ -31,7 +31,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay -logger = setup_logger(__name__, level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) class FakeZEDModule(Module): diff --git a/dimos/hardware/gstreamer_camera.py b/dimos/hardware/gstreamer_camera.py index 38ede23ee1..91e98d9f39 100644 --- a/dimos/hardware/gstreamer_camera.py +++ b/dimos/hardware/gstreamer_camera.py @@ -35,7 +35,7 @@ gi.require_version("GstApp", "1.0") from gi.repository import GLib, Gst -logger = setup_logger("dimos.hardware.gstreamer_camera", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) Gst.init(None) diff --git a/dimos/manipulation/manip_aio_pipeline.py b/dimos/manipulation/manip_aio_pipeline.py index 164c7b1774..6a04bd2c6a 100644 --- a/dimos/manipulation/manip_aio_pipeline.py +++ b/dimos/manipulation/manip_aio_pipeline.py @@ -35,7 +35,7 @@ from dimos.perception.pointcloud.utils import create_point_cloud_overlay_visualization from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.perception.manip_aio_pipeline") +logger = setup_logger(__file__) class ManipulationPipeline: diff --git a/dimos/manipulation/manip_aio_processer.py b/dimos/manipulation/manip_aio_processer.py index e0bfc73256..0b162fef13 100644 --- a/dimos/manipulation/manip_aio_processer.py +++ b/dimos/manipulation/manip_aio_processer.py @@ -39,7 +39,7 @@ from dimos.perception.segmentation.sam_2d_seg import Sam2DSegmenter from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.perception.manip_aio_processor") +logger = setup_logger(__file__) class ManipulationProcessor: diff --git a/dimos/manipulation/manipulation_history.py b/dimos/manipulation/manipulation_history.py index a77900ba30..7ec030a7a5 100644 --- a/dimos/manipulation/manipulation_history.py +++ b/dimos/manipulation/manipulation_history.py @@ -41,7 +41,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.types.manipulation_history") +logger = setup_logger(__file__) @dataclass diff --git a/dimos/manipulation/manipulation_interface.py b/dimos/manipulation/manipulation_interface.py index ae63eb79ed..5b48ce45ec 100644 --- a/dimos/manipulation/manipulation_interface.py +++ b/dimos/manipulation/manipulation_interface.py @@ -37,7 +37,7 @@ if TYPE_CHECKING: from reactivex.disposable import Disposable -logger = setup_logger("dimos.robot.manipulation_interface") +logger = setup_logger(__file__) class ManipulationInterface: diff --git a/dimos/manipulation/visual_servoing/detection3d.py b/dimos/manipulation/visual_servoing/detection3d.py index f7371f531a..922ec89c8b 100644 --- a/dimos/manipulation/visual_servoing/detection3d.py +++ b/dimos/manipulation/visual_servoing/detection3d.py @@ -43,7 +43,7 @@ from dimos.perception.segmentation.sam_2d_seg import Sam2DSegmenter from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.manipulation.visual_servoing.detection3d") +logger = setup_logger(__file__) class Detection3DProcessor: diff --git a/dimos/manipulation/visual_servoing/manipulation_module.py b/dimos/manipulation/visual_servoing/manipulation_module.py index a89d43ed7b..e28ffda0c3 100644 --- a/dimos/manipulation/visual_servoing/manipulation_module.py +++ b/dimos/manipulation/visual_servoing/manipulation_module.py @@ -51,7 +51,7 @@ pose_to_matrix, ) -logger = setup_logger("dimos.manipulation.visual_servoing.manipulation_module") +logger = setup_logger(__file__) class GraspStage(Enum): diff --git a/dimos/manipulation/visual_servoing/pbvs.py b/dimos/manipulation/visual_servoing/pbvs.py index 77bf83396e..c52b4b1ca4 100644 --- a/dimos/manipulation/visual_servoing/pbvs.py +++ b/dimos/manipulation/visual_servoing/pbvs.py @@ -33,7 +33,7 @@ from dimos.msgs.vision_msgs import Detection3DArray from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.manipulation.pbvs") +logger = setup_logger(__file__) class PBVS: diff --git a/dimos/mapping/osm/query.py b/dimos/mapping/osm/query.py index 4501525880..566e5d025f 100644 --- a/dimos/mapping/osm/query.py +++ b/dimos/mapping/osm/query.py @@ -22,7 +22,7 @@ _PROLOGUE = "This is an image of an open street map I'm on." _JSON = "Please only respond with valid JSON." -logger = setup_logger(__name__) +logger = setup_logger(__file__) def query_for_one_position(vl_model: VlModel, map_image: MapImage, query: str) -> LatLon | None: diff --git a/dimos/navigation/bbox_navigation.py b/dimos/navigation/bbox_navigation.py index db66ab8349..24fef1e272 100644 --- a/dimos/navigation/bbox_navigation.py +++ b/dimos/navigation/bbox_navigation.py @@ -22,7 +22,7 @@ from dimos.msgs.vision_msgs import Detection2DArray from dimos.utils.logging_config import setup_logger -logger = setup_logger(__name__, level=logging.DEBUG) +logger = setup_logger(__file__, level=logging.DEBUG) class BBoxNavigationModule(Module): diff --git a/dimos/navigation/bt_navigator/navigator.py b/dimos/navigation/bt_navigator/navigator.py index 782e815bb3..e7b51dc5ce 100644 --- a/dimos/navigation/bt_navigator/navigator.py +++ b/dimos/navigation/bt_navigator/navigator.py @@ -36,7 +36,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import apply_transform -logger = setup_logger("dimos.navigation.bt_navigator") +logger = setup_logger(__file__) class NavigatorState(Enum): diff --git a/dimos/navigation/bt_navigator/recovery_server.py b/dimos/navigation/bt_navigator/recovery_server.py index 5b05d35de5..6c9ae20b9c 100644 --- a/dimos/navigation/bt_navigator/recovery_server.py +++ b/dimos/navigation/bt_navigator/recovery_server.py @@ -22,7 +22,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import get_distance -logger = setup_logger("dimos.navigation.bt_navigator.recovery_server") +logger = setup_logger(__file__) class RecoveryServer: diff --git a/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py b/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py index 71677635f5..fe803665fe 100644 --- a/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py +++ b/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py @@ -34,7 +34,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import get_distance -logger = setup_logger("dimos.robot.unitree.frontier_exploration") +logger = setup_logger(__file__) class PointClassification(IntFlag): diff --git a/dimos/navigation/global_planner/algo.py b/dimos/navigation/global_planner/algo.py index 16f8dc3600..81960c3a28 100644 --- a/dimos/navigation/global_planner/algo.py +++ b/dimos/navigation/global_planner/algo.py @@ -18,7 +18,7 @@ from dimos.msgs.nav_msgs import CostValues, OccupancyGrid, Path from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.robot.unitree.global_planner.astar") +logger = setup_logger(__file__) def astar( diff --git a/dimos/navigation/rosnav.py b/dimos/navigation/rosnav.py index f0d04926d3..a165314209 100644 --- a/dimos/navigation/rosnav.py +++ b/dimos/navigation/rosnav.py @@ -57,7 +57,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import euler_to_quaternion -logger = setup_logger("dimos.robot.unitree_webrtc.nav_bot", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) @dataclass diff --git a/dimos/perception/common/utils.py b/dimos/perception/common/utils.py index 2676206bd7..e455242fb2 100644 --- a/dimos/perception/common/utils.py +++ b/dimos/perception/common/utils.py @@ -28,7 +28,7 @@ from dimos.types.vector import Vector from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.perception.common.utils") +logger = setup_logger(__file__) # Optional CuPy support try: # pragma: no cover - optional dependency diff --git a/dimos/perception/detection/detectors/person/yolo.py b/dimos/perception/detection/detectors/person/yolo.py index 6421ab7d1d..a2d0680265 100644 --- a/dimos/perception/detection/detectors/person/yolo.py +++ b/dimos/perception/detection/detectors/person/yolo.py @@ -21,7 +21,7 @@ from dimos.utils.gpu_utils import is_cuda_available from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.perception.detection.yolo.person") +logger = setup_logger(__file__) class YoloPersonDetector(Detector): diff --git a/dimos/perception/detection/detectors/yolo.py b/dimos/perception/detection/detectors/yolo.py index 64e56ad456..e4df7107e5 100644 --- a/dimos/perception/detection/detectors/yolo.py +++ b/dimos/perception/detection/detectors/yolo.py @@ -21,7 +21,7 @@ from dimos.utils.gpu_utils import is_cuda_available from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.perception.detection.yolo_2d_det") +logger = setup_logger(__file__) class Yolo2DDetector(Detector): diff --git a/dimos/perception/grasp_generation/grasp_generation.py b/dimos/perception/grasp_generation/grasp_generation.py index adca8dd3e0..a430353fb3 100644 --- a/dimos/perception/grasp_generation/grasp_generation.py +++ b/dimos/perception/grasp_generation/grasp_generation.py @@ -25,7 +25,7 @@ from dimos.types.manipulation import ObjectData from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.perception.grasp_generation") +logger = setup_logger(__file__) class HostedGraspGenerator: diff --git a/dimos/perception/object_detection_stream.py b/dimos/perception/object_detection_stream.py index a82cbe9db5..d45cd9d310 100644 --- a/dimos/perception/object_detection_stream.py +++ b/dimos/perception/object_detection_stream.py @@ -43,7 +43,7 @@ from dimos.types.manipulation import ObjectData # Initialize logger for the ObjectDetectionStream -logger = setup_logger("dimos.perception.object_detection_stream") +logger = setup_logger(__file__) class ObjectDetectionStream: diff --git a/dimos/perception/object_tracker.py b/dimos/perception/object_tracker.py index f5fa48581a..2385010721 100644 --- a/dimos/perception/object_tracker.py +++ b/dimos/perception/object_tracker.py @@ -42,7 +42,7 @@ yaw_towards_point, ) -logger = setup_logger("dimos.perception.object_tracker") +logger = setup_logger(__file__) class ObjectTracking(Module): diff --git a/dimos/perception/object_tracker_2d.py b/dimos/perception/object_tracker_2d.py index 0256b7beb9..8f9c2bd00b 100644 --- a/dimos/perception/object_tracker_2d.py +++ b/dimos/perception/object_tracker_2d.py @@ -36,7 +36,7 @@ from dimos.msgs.vision_msgs import Detection2DArray from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.perception.object_tracker_2d", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) class ObjectTracker2D(Module): diff --git a/dimos/perception/object_tracker_3d.py b/dimos/perception/object_tracker_3d.py index 231ae26748..95072eb6b2 100644 --- a/dimos/perception/object_tracker_3d.py +++ b/dimos/perception/object_tracker_3d.py @@ -34,7 +34,7 @@ yaw_towards_point, ) -logger = setup_logger("dimos.perception.object_tracker_3d") +logger = setup_logger(__file__) class ObjectTracker3D(ObjectTracker2D): diff --git a/dimos/perception/person_tracker.py b/dimos/perception/person_tracker.py index 16b505578b..8aedcb1344 100644 --- a/dimos/perception/person_tracker.py +++ b/dimos/perception/person_tracker.py @@ -25,7 +25,7 @@ from dimos.perception.detection2d.yolo_2d_det import Yolo2DDetector from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.perception.person_tracker") +logger = setup_logger(__file__) class PersonTrackingStream(Module): diff --git a/dimos/perception/segmentation/sam_2d_seg.py b/dimos/perception/segmentation/sam_2d_seg.py index b13ebc4c65..d5860f61d2 100644 --- a/dimos/perception/segmentation/sam_2d_seg.py +++ b/dimos/perception/segmentation/sam_2d_seg.py @@ -34,7 +34,7 @@ from dimos.utils.gpu_utils import is_cuda_available from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.perception.segmentation.sam_2d_seg") +logger = setup_logger(__file__) class Sam2DSegmenter: diff --git a/dimos/perception/test_spatial_memory_module.py b/dimos/perception/test_spatial_memory_module.py index f89c975d89..5aeec49a1c 100644 --- a/dimos/perception/test_spatial_memory_module.py +++ b/dimos/perception/test_spatial_memory_module.py @@ -30,7 +30,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay -logger = setup_logger("test_spatial_memory_module") +logger = setup_logger(__file__) pubsub.lcm.autoconf() diff --git a/dimos/protocol/pubsub/lcmpubsub.py b/dimos/protocol/pubsub/lcmpubsub.py index ef158ffb30..f9f0732172 100644 --- a/dimos/protocol/pubsub/lcmpubsub.py +++ b/dimos/protocol/pubsub/lcmpubsub.py @@ -29,7 +29,7 @@ from collections.abc import Callable import threading -logger = setup_logger(__name__) +logger = setup_logger(__file__) @runtime_checkable diff --git a/dimos/protocol/pubsub/shmpubsub.py b/dimos/protocol/pubsub/shmpubsub.py index bbbf2192d7..5cc9f55a45 100644 --- a/dimos/protocol/pubsub/shmpubsub.py +++ b/dimos/protocol/pubsub/shmpubsub.py @@ -38,7 +38,7 @@ if TYPE_CHECKING: from collections.abc import Callable -logger = setup_logger("dimos.protocol.pubsub.sharedmemory") +logger = setup_logger(__file__) # -------------------------------------------------------------------------------------- diff --git a/dimos/protocol/pubsub/spec.py b/dimos/protocol/pubsub/spec.py index ef5a4f450f..0810ba1725 100644 --- a/dimos/protocol/pubsub/spec.py +++ b/dimos/protocol/pubsub/spec.py @@ -26,7 +26,7 @@ TopicT = TypeVar("TopicT") -logger = setup_logger(__name__) +logger = setup_logger(__file__) class PubSub(Generic[TopicT, MsgT], ABC): diff --git a/dimos/protocol/service/lcmservice.py b/dimos/protocol/service/lcmservice.py index 1b19a5cfeb..01cca0431b 100644 --- a/dimos/protocol/service/lcmservice.py +++ b/dimos/protocol/service/lcmservice.py @@ -29,7 +29,7 @@ from dimos.protocol.service.spec import Service from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.protocol.service.lcmservice") +logger = setup_logger(__file__) @cache diff --git a/dimos/robot/agilex/piper_arm.py b/dimos/robot/agilex/piper_arm.py index 642d39c7cb..c67cdd21b6 100644 --- a/dimos/robot/agilex/piper_arm.py +++ b/dimos/robot/agilex/piper_arm.py @@ -28,7 +28,7 @@ from dimos.types.robot_capabilities import RobotCapability from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.robot.agilex.piper_arm") +logger = setup_logger(__file__) class PiperArmRobot(Robot): diff --git a/dimos/robot/agilex/run.py b/dimos/robot/agilex/run.py index 90258e5d82..f3a79637c2 100644 --- a/dimos/robot/agilex/run.py +++ b/dimos/robot/agilex/run.py @@ -34,7 +34,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface -logger = setup_logger("dimos.robot.agilex.run") +logger = setup_logger(__file__) # Load environment variables load_dotenv() diff --git a/dimos/robot/position_stream.py b/dimos/robot/position_stream.py index 8cb5966b24..d41c428fc1 100644 --- a/dimos/robot/position_stream.py +++ b/dimos/robot/position_stream.py @@ -28,7 +28,7 @@ from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.robot.position_stream", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) class PositionStreamProvider: diff --git a/dimos/robot/ros_bridge.py b/dimos/robot/ros_bridge.py index b067f88a22..32ef00e4a2 100644 --- a/dimos/robot/ros_bridge.py +++ b/dimos/robot/ros_bridge.py @@ -35,7 +35,7 @@ from dimos.protocol.pubsub.lcmpubsub import LCM, Topic from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.robot.ros_bridge", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) class BridgeDirection(Enum): diff --git a/dimos/robot/ros_command_queue.py b/dimos/robot/ros_command_queue.py index 770f44e1a6..977c725660 100644 --- a/dimos/robot/ros_command_queue.py +++ b/dimos/robot/ros_command_queue.py @@ -31,7 +31,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger for the ros command queue module -logger = setup_logger("dimos.robot.ros_command_queue") +logger = setup_logger(__file__) class CommandType(Enum): diff --git a/dimos/robot/ros_control.py b/dimos/robot/ros_control.py index 2e9eb95204..3acc447887 100644 --- a/dimos/robot/ros_control.py +++ b/dimos/robot/ros_control.py @@ -45,7 +45,7 @@ from dimos.types.vector import Vector from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.robot.ros_control") +logger = setup_logger(__file__) __all__ = ["ROSControl", "RobotMode"] diff --git a/dimos/robot/ros_observable_topic.py b/dimos/robot/ros_observable_topic.py index 7cfc70fd8b..4a17ef2506 100644 --- a/dimos/robot/ros_observable_topic.py +++ b/dimos/robot/ros_observable_topic.py @@ -63,7 +63,7 @@ def to_profile(self) -> QoSProfile: raise ValueError(f"Unknown QoS enum value: {self}") -logger = setup_logger("dimos.robot.ros_control.observable_topic") +logger = setup_logger(__file__) class ROSObservableTopicAbility: diff --git a/dimos/robot/ros_transform.py b/dimos/robot/ros_transform.py index d54eb8cd15..f2f50c9db0 100644 --- a/dimos/robot/ros_transform.py +++ b/dimos/robot/ros_transform.py @@ -24,7 +24,7 @@ from dimos.types.vector import Vector from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.robot.ros_transform") +logger = setup_logger(__file__) __all__ = ["ROSTransformAbility"] diff --git a/dimos/robot/test_ros_observable_topic.py b/dimos/robot/test_ros_observable_topic.py index 0ffed24d35..b2fd638380 100644 --- a/dimos/robot/test_ros_observable_topic.py +++ b/dimos/robot/test_ros_observable_topic.py @@ -25,7 +25,7 @@ class MockROSNode: def __init__(self) -> None: - self.logger = setup_logger("ROS") + self.logger = setup_logger(__file__) self.sub_id_cnt = 0 self.subs = {} @@ -75,7 +75,7 @@ def robot(): class MockRobot(ROSObservableTopicAbility): def __init__(self) -> None: - self.logger = setup_logger("ROBOT") + self.logger = setup_logger(__file__) # Initialize the mock ROS node self._node = MockROSNode() diff --git a/dimos/robot/unitree/g1/g1zed.py b/dimos/robot/unitree/g1/g1zed.py index 607ae3acb6..f380d2430e 100644 --- a/dimos/robot/unitree/g1/g1zed.py +++ b/dimos/robot/unitree/g1/g1zed.py @@ -32,7 +32,7 @@ from dimos.robot.unitree.connection.g1 import G1Connection from dimos.utils.logging_config import setup_logger -logger = setup_logger(__name__) +logger = setup_logger(__file__) class G1ZedDeployResult(TypedDict): diff --git a/dimos/robot/unitree/go2/go2.py b/dimos/robot/unitree/go2/go2.py index 0e78485adc..7c9d68a1f3 100644 --- a/dimos/robot/unitree/go2/go2.py +++ b/dimos/robot/unitree/go2/go2.py @@ -19,7 +19,7 @@ from dimos.robot.unitree.connection import go2 from dimos.utils.logging_config import setup_logger -logger = setup_logger(__name__, level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) def deploy(dimos: DimosCluster, ip: str): diff --git a/dimos/robot/unitree_webrtc/depth_module.py b/dimos/robot/unitree_webrtc/depth_module.py index 9e9b57b24b..651798f79b 100644 --- a/dimos/robot/unitree_webrtc/depth_module.py +++ b/dimos/robot/unitree_webrtc/depth_module.py @@ -25,7 +25,7 @@ from dimos.msgs.sensor_msgs import Image, ImageFormat from dimos.utils.logging_config import setup_logger -logger = setup_logger(__name__) +logger = setup_logger(__file__) class DepthModule(Module): diff --git a/dimos/robot/unitree_webrtc/g1_run.py b/dimos/robot/unitree_webrtc/g1_run.py index b8c0bc77c7..093cd719db 100644 --- a/dimos/robot/unitree_webrtc/g1_run.py +++ b/dimos/robot/unitree_webrtc/g1_run.py @@ -35,7 +35,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface -logger = setup_logger("dimos.robot.unitree_webrtc.g1_run") +logger = setup_logger(__file__) # Load environment variables load_dotenv() diff --git a/dimos/robot/unitree_webrtc/modular/connection_module.py b/dimos/robot/unitree_webrtc/modular/connection_module.py index bad9af22a1..22494b6c32 100644 --- a/dimos/robot/unitree_webrtc/modular/connection_module.py +++ b/dimos/robot/unitree_webrtc/modular/connection_module.py @@ -39,7 +39,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay, TimedSensorStorage -logger = setup_logger("dimos.robot.unitree_webrtc.unitree_go2", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) # Suppress verbose loggers logging.getLogger("aiortc.codecs.h264").setLevel(logging.ERROR) diff --git a/dimos/robot/unitree_webrtc/modular/ivan_unitree.py b/dimos/robot/unitree_webrtc/modular/ivan_unitree.py index e7a2bcabc8..d272e2d6f3 100644 --- a/dimos/robot/unitree_webrtc/modular/ivan_unitree.py +++ b/dimos/robot/unitree_webrtc/modular/ivan_unitree.py @@ -30,7 +30,7 @@ from dimos.robot.unitree_webrtc.modular.connection_module import ConnectionModule from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.robot.unitree_webrtc.unitree_go2", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) def detection_unitree() -> None: diff --git a/dimos/robot/unitree_webrtc/rosnav.py b/dimos/robot/unitree_webrtc/rosnav.py index bd91fafb90..8df25739aa 100644 --- a/dimos/robot/unitree_webrtc/rosnav.py +++ b/dimos/robot/unitree_webrtc/rosnav.py @@ -22,7 +22,7 @@ from dimos.msgs.std_msgs.Bool import Bool from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.robot.unitree_webrtc.nav_bot", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) class NavigationModule(Module): diff --git a/dimos/robot/unitree_webrtc/test_unitree_go2_integration.py b/dimos/robot/unitree_webrtc/test_unitree_go2_integration.py index 7acdfc1980..be72572998 100644 --- a/dimos/robot/unitree_webrtc/test_unitree_go2_integration.py +++ b/dimos/robot/unitree_webrtc/test_unitree_go2_integration.py @@ -31,7 +31,7 @@ from dimos.robot.unitree_webrtc.unitree_go2 import ConnectionModule from dimos.utils.logging_config import setup_logger -logger = setup_logger("test_unitree_go2_integration") +logger = setup_logger(__file__) pubsub.lcm.autoconf() diff --git a/dimos/robot/unitree_webrtc/unitree_b1/connection.py b/dimos/robot/unitree_webrtc/unitree_b1/connection.py index 73285b4d76..45376d647b 100644 --- a/dimos/robot/unitree_webrtc/unitree_b1/connection.py +++ b/dimos/robot/unitree_webrtc/unitree_b1/connection.py @@ -33,7 +33,7 @@ from .b1_command import B1Command # Setup logger with DEBUG level for troubleshooting -logger = setup_logger("dimos.robot.unitree_webrtc.unitree_b1.connection", level=logging.DEBUG) +logger = setup_logger(__file__, level=logging.DEBUG) class RobotMode: diff --git a/dimos/robot/unitree_webrtc/unitree_b1/unitree_b1.py b/dimos/robot/unitree_webrtc/unitree_b1/unitree_b1.py index 04390c2e9e..83a940292d 100644 --- a/dimos/robot/unitree_webrtc/unitree_b1/unitree_b1.py +++ b/dimos/robot/unitree_webrtc/unitree_b1/unitree_b1.py @@ -53,7 +53,7 @@ ROSTFMessage = None ROS_AVAILABLE = False -logger = setup_logger("dimos.robot.unitree_webrtc.unitree_b1", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) class UnitreeB1(Robot, Resource): diff --git a/dimos/robot/unitree_webrtc/unitree_g1.py b/dimos/robot/unitree_webrtc/unitree_g1.py index fc148c54c3..07f47b8266 100644 --- a/dimos/robot/unitree_webrtc/unitree_g1.py +++ b/dimos/robot/unitree_webrtc/unitree_g1.py @@ -70,7 +70,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.websocket_vis.websocket_vis_module import WebsocketVisModule -logger = setup_logger("dimos.robot.unitree_webrtc.unitree_g1", level=logging.INFO) +logger = setup_logger(__file__, level=logging.INFO) # Suppress verbose loggers logging.getLogger("aiortc.codecs.h264").setLevel(logging.ERROR) diff --git a/dimos/robot/unitree_webrtc/unitree_g1_skill_container.py b/dimos/robot/unitree_webrtc/unitree_g1_skill_container.py index 170b577c21..7304f0d880 100644 --- a/dimos/robot/unitree_webrtc/unitree_g1_skill_container.py +++ b/dimos/robot/unitree_webrtc/unitree_g1_skill_container.py @@ -31,7 +31,7 @@ from dimos.robot.unitree_webrtc.unitree_g1 import UnitreeG1 from dimos.robot.unitree_webrtc.unitree_go2 import UnitreeGo2 -logger = setup_logger("dimos.robot.unitree_webrtc.unitree_g1_skill_container") +logger = setup_logger(__file__) # G1 Arm Actions - all use api_id 7106 on topic "rt/api/arm/request" G1_ARM_CONTROLS = [ diff --git a/dimos/robot/unitree_webrtc/unitree_skill_container.py b/dimos/robot/unitree_webrtc/unitree_skill_container.py index e6179adcbb..7f4694da33 100644 --- a/dimos/robot/unitree_webrtc/unitree_skill_container.py +++ b/dimos/robot/unitree_webrtc/unitree_skill_container.py @@ -36,7 +36,7 @@ if TYPE_CHECKING: from dimos.robot.unitree_webrtc.unitree_go2 import UnitreeGo2 -logger = setup_logger("dimos.robot.unitree_webrtc.unitree_skill_container") +logger = setup_logger(__file__) class UnitreeSkillContainer(Module): diff --git a/dimos/skills/kill_skill.py b/dimos/skills/kill_skill.py index b9d02729f5..dabe11c8af 100644 --- a/dimos/skills/kill_skill.py +++ b/dimos/skills/kill_skill.py @@ -24,7 +24,7 @@ from dimos.skills.skills import AbstractSkill, SkillLibrary from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.skills.kill_skill") +logger = setup_logger(__file__) class KillSkill(AbstractSkill): diff --git a/dimos/skills/manipulation/force_constraint_skill.py b/dimos/skills/manipulation/force_constraint_skill.py index 72616c32a3..7139abd5e7 100644 --- a/dimos/skills/manipulation/force_constraint_skill.py +++ b/dimos/skills/manipulation/force_constraint_skill.py @@ -20,7 +20,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger -logger = setup_logger("dimos.skills.force_constraint_skill") +logger = setup_logger(__file__) class ForceConstraintSkill(AbstractManipulationSkill): diff --git a/dimos/skills/manipulation/manipulate_skill.py b/dimos/skills/manipulation/manipulate_skill.py index 7905d4f76c..26e6180c58 100644 --- a/dimos/skills/manipulation/manipulate_skill.py +++ b/dimos/skills/manipulation/manipulate_skill.py @@ -28,7 +28,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger -logger = setup_logger("dimos.skills.manipulate_skill") +logger = setup_logger(__file__) class Manipulate(AbstractManipulationSkill): diff --git a/dimos/skills/manipulation/pick_and_place.py b/dimos/skills/manipulation/pick_and_place.py index 1143ce073a..3ec14c83cb 100644 --- a/dimos/skills/manipulation/pick_and_place.py +++ b/dimos/skills/manipulation/pick_and_place.py @@ -31,7 +31,7 @@ from dimos.skills.skills import AbstractRobotSkill from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.skills.manipulation.pick_and_place") +logger = setup_logger(__file__) def parse_qwen_points_response(response: str) -> tuple[tuple[int, int], tuple[int, int]] | None: diff --git a/dimos/skills/manipulation/rotation_constraint_skill.py b/dimos/skills/manipulation/rotation_constraint_skill.py index ae1bdbb57d..dc3d0a31bb 100644 --- a/dimos/skills/manipulation/rotation_constraint_skill.py +++ b/dimos/skills/manipulation/rotation_constraint_skill.py @@ -22,7 +22,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger -logger = setup_logger("dimos.skills.rotation_constraint_skill") +logger = setup_logger(__file__) class RotationConstraintSkill(AbstractManipulationSkill): diff --git a/dimos/skills/manipulation/translation_constraint_skill.py b/dimos/skills/manipulation/translation_constraint_skill.py index 6e1808744f..b291e52fc2 100644 --- a/dimos/skills/manipulation/translation_constraint_skill.py +++ b/dimos/skills/manipulation/translation_constraint_skill.py @@ -21,7 +21,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger -logger = setup_logger("dimos.skills.translation_constraint_skill") +logger = setup_logger(__file__) class TranslationConstraintSkill(AbstractManipulationSkill): diff --git a/dimos/skills/speak.py b/dimos/skills/speak.py index a1e3abb078..9a01fa5b78 100644 --- a/dimos/skills/speak.py +++ b/dimos/skills/speak.py @@ -23,7 +23,7 @@ from dimos.skills.skills import AbstractSkill from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.skills.speak") +logger = setup_logger(__file__) # Global lock to prevent multiple simultaneous audio playbacks _audio_device_lock = threading.RLock() diff --git a/dimos/skills/unitree/unitree_speak.py b/dimos/skills/unitree/unitree_speak.py index 539ca0cd29..9daef64acb 100644 --- a/dimos/skills/unitree/unitree_speak.py +++ b/dimos/skills/unitree/unitree_speak.py @@ -28,7 +28,7 @@ from dimos.skills.skills import AbstractRobotSkill from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.skills.unitree.unitree_speak") +logger = setup_logger(__file__) # Audio API constants (from go2_webrtc_driver) AUDIO_API = { diff --git a/dimos/skills/visual_navigation_skills.py b/dimos/skills/visual_navigation_skills.py index 8064f28cc9..8650517033 100644 --- a/dimos/skills/visual_navigation_skills.py +++ b/dimos/skills/visual_navigation_skills.py @@ -30,7 +30,7 @@ from dimos.types.vector import Vector from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.skills.visual_navigation", level=logging.DEBUG) +logger = setup_logger(__file__, level=logging.DEBUG) class FollowHuman(AbstractRobotSkill): diff --git a/dimos/stream/audio/node_key_recorder.py b/dimos/stream/audio/node_key_recorder.py index 5e918bae5c..a17ddb380a 100644 --- a/dimos/stream/audio/node_key_recorder.py +++ b/dimos/stream/audio/node_key_recorder.py @@ -25,7 +25,7 @@ from dimos.stream.audio.base import AbstractAudioTransform, AudioEvent from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.audio.key_recorder") +logger = setup_logger(__file__) class KeyRecorder(AbstractAudioTransform): diff --git a/dimos/stream/audio/node_microphone.py b/dimos/stream/audio/node_microphone.py index 1f4bf13499..46e1694a07 100644 --- a/dimos/stream/audio/node_microphone.py +++ b/dimos/stream/audio/node_microphone.py @@ -26,7 +26,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.audio.node_microphone") +logger = setup_logger(__file__) class SounddeviceAudioSource(AbstractAudioEmitter): diff --git a/dimos/stream/audio/node_normalizer.py b/dimos/stream/audio/node_normalizer.py index 064fc3cf6c..3d0a078349 100644 --- a/dimos/stream/audio/node_normalizer.py +++ b/dimos/stream/audio/node_normalizer.py @@ -28,7 +28,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.stream.audio.node_normalizer") +logger = setup_logger(__file__) class AudioNormalizer(AbstractAudioTransform): diff --git a/dimos/stream/audio/node_output.py b/dimos/stream/audio/node_output.py index 3dc93d3757..4638d58fd3 100644 --- a/dimos/stream/audio/node_output.py +++ b/dimos/stream/audio/node_output.py @@ -24,7 +24,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.stream.audio.node_output") +logger = setup_logger(__file__) class SounddeviceAudioOutput(AbstractAudioTransform): diff --git a/dimos/stream/audio/node_simulated.py b/dimos/stream/audio/node_simulated.py index 82de718ced..caa8118a3e 100644 --- a/dimos/stream/audio/node_simulated.py +++ b/dimos/stream/audio/node_simulated.py @@ -24,7 +24,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.stream.audio.node_simulated") +logger = setup_logger(__file__) class SimulatedAudioSource(AbstractAudioEmitter): diff --git a/dimos/stream/audio/node_volume_monitor.py b/dimos/stream/audio/node_volume_monitor.py index e1c5b226a4..42be626fbd 100644 --- a/dimos/stream/audio/node_volume_monitor.py +++ b/dimos/stream/audio/node_volume_monitor.py @@ -23,7 +23,7 @@ from dimos.stream.audio.volume import calculate_peak_volume from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.stream.audio.node_volume_monitor") +logger = setup_logger(__file__) class VolumeMonitorNode(AbstractAudioConsumer, AbstractTextEmitter): diff --git a/dimos/stream/audio/stt/node_whisper.py b/dimos/stream/audio/stt/node_whisper.py index 05ec5274c8..12b2381e2d 100644 --- a/dimos/stream/audio/stt/node_whisper.py +++ b/dimos/stream/audio/stt/node_whisper.py @@ -25,7 +25,7 @@ from dimos.stream.audio.text.base import AbstractTextEmitter from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.stream.audio.stt.node_whisper") +logger = setup_logger(__file__) class WhisperNode(AbstractAudioConsumer, AbstractTextEmitter): diff --git a/dimos/stream/audio/text/node_stdout.py b/dimos/stream/audio/text/node_stdout.py index b0a5fd4ac8..bb2f0bac4e 100644 --- a/dimos/stream/audio/text/node_stdout.py +++ b/dimos/stream/audio/text/node_stdout.py @@ -18,7 +18,7 @@ from dimos.stream.audio.text.base import AbstractTextConsumer from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.stream.audio.text.node_stdout") +logger = setup_logger(__file__) class TextPrinterNode(AbstractTextConsumer): diff --git a/dimos/stream/audio/tts/node_openai.py b/dimos/stream/audio/tts/node_openai.py index 211b2b0246..8abdcbb96b 100644 --- a/dimos/stream/audio/tts/node_openai.py +++ b/dimos/stream/audio/tts/node_openai.py @@ -29,7 +29,7 @@ from dimos.stream.audio.text.base import AbstractTextConsumer, AbstractTextEmitter from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.stream.audio.tts.openai") +logger = setup_logger(__file__) class Voice(str, Enum): diff --git a/dimos/stream/audio/tts/node_pytts.py b/dimos/stream/audio/tts/node_pytts.py index f1543331ef..bc08b191a5 100644 --- a/dimos/stream/audio/tts/node_pytts.py +++ b/dimos/stream/audio/tts/node_pytts.py @@ -19,7 +19,7 @@ from dimos.stream.audio.text.abstract import AbstractTextTransform from dimos.utils.logging_config import setup_logger -logger = setup_logger(__name__) +logger = setup_logger(__file__) class PyTTSNode(AbstractTextTransform): diff --git a/dimos/stream/rtsp_video_provider.py b/dimos/stream/rtsp_video_provider.py index 3aeb651a4d..31ffa648ab 100644 --- a/dimos/stream/rtsp_video_provider.py +++ b/dimos/stream/rtsp_video_provider.py @@ -31,7 +31,7 @@ # Assuming AbstractVideoProvider and exceptions are in the sibling file from .video_provider import AbstractVideoProvider, VideoFrameError, VideoSourceError -logger = setup_logger("dimos.stream.rtsp_video_provider") +logger = setup_logger(__file__) class RtspVideoProvider(AbstractVideoProvider): diff --git a/dimos/types/timestamped.py b/dimos/types/timestamped.py index 0045c73ef4..efffc47cf5 100644 --- a/dimos/types/timestamped.py +++ b/dimos/types/timestamped.py @@ -27,7 +27,7 @@ from dimos.types.weaklist import WeakList from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.timestampAlignment") +logger = setup_logger(__file__) # any class that carries a timestamp should inherit from this # this allows us to work with timeseries in consistent way, allign messages, replay etc diff --git a/dimos/utils/logging_config.py b/dimos/utils/logging_config.py index e12b1e4828..e02ebb972f 100644 --- a/dimos/utils/logging_config.py +++ b/dimos/utils/logging_config.py @@ -12,85 +12,146 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Logging configuration module with color support. - -This module sets up a logger with color output for different log levels. -""" - +from datetime import datetime import logging +import logging.handlers import os +from pathlib import Path +import sys +from typing import Any, Mapping -import colorlog +import structlog +from structlog.processors import CallsiteParameter, CallsiteParameterAdder -logging.basicConfig(format="%(name)s - %(levelname)s - %(message)s") +from dimos.constants import DIMOS_LOG_DIR, DIMOS_PROJECT_ROOT +# Suppress noisy loggers logging.getLogger("aiortc.codecs.h264").setLevel(logging.ERROR) logging.getLogger("lcm_foxglove_bridge").setLevel(logging.ERROR) logging.getLogger("websockets.server").setLevel(logging.ERROR) logging.getLogger("FoxgloveServer").setLevel(logging.ERROR) logging.getLogger("asyncio").setLevel(logging.ERROR) +_LOG_FILE_PATH = None + + +def _get_log_file_path() -> Path: + DIMOS_LOG_DIR.mkdir(parents=True, exist_ok=True) + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + pid = os.getpid() + return DIMOS_LOG_DIR / f"dimos_{timestamp}_{pid}.jsonl" + + +def _configure_structlog() -> Path: + global _LOG_FILE_PATH + + if _LOG_FILE_PATH: + return _LOG_FILE_PATH + + _LOG_FILE_PATH = _get_log_file_path() + + shared_processors = [ + structlog.stdlib.add_log_level, + structlog.stdlib.add_logger_name, + structlog.stdlib.PositionalArgumentsFormatter(), + structlog.processors.TimeStamper(fmt="iso"), + structlog.processors.StackInfoRenderer(), + structlog.processors.UnicodeDecoder(), + CallsiteParameterAdder( + parameters=[ + CallsiteParameter.FUNC_NAME, + CallsiteParameter.LINENO, + ] + ), + ] -def setup_logger( - name: str, level: int | None = None, log_format: str | None = None -) -> logging.Logger: - """Set up a logger with color output. + structlog.configure( + processors=[ + structlog.stdlib.filter_by_level, + *shared_processors, + structlog.stdlib.ProcessorFormatter.wrap_for_formatter, + ], + context_class=dict, + logger_factory=structlog.stdlib.LoggerFactory(), + cache_logger_on_first_use=True, + ) + + return _LOG_FILE_PATH + + +def setup_logger(name: str, level: int | None = None, log_format: str | None = None) -> Any: + """Set up a structured logger using structlog. Args: name: The name of the logger. - level: The logging level (e.g., logging.INFO, logging.DEBUG). - If None, will use DIMOS_LOG_LEVEL env var or default to INFO. - log_format: Optional custom log format. + level: The logging level (kept for compatibility, but ignored). + Log level is controlled by DIMOS_LOG_LEVEL env var. + log_format: Kept for compatibility but ignored. Returns: - A configured logger instance. + A configured structlog logger instance. """ + + # Convert absolute path to relative path + try: + name = str(Path(name).relative_to(DIMOS_PROJECT_ROOT)) + except (ValueError, TypeError): + pass + + log_file_path = _configure_structlog() + if level is None: - # Get level from environment variable or default to INFO level_name = os.getenv("DIMOS_LOG_LEVEL", "INFO") level = getattr(logging, level_name) - if log_format is None: - log_format = "%(log_color)s%(asctime)s - %(name)s - %(levelname)s - %(message)s" - - try: - # Get or create logger - logger = logging.getLogger(name) - - # Remove any existing handlers to avoid duplicates - if logger.hasHandlers(): - logger.handlers.clear() - - # Set logger level first - logger.setLevel(level) - - # Ensure we're not blocked by parent loggers - logger.propagate = False - - # Create and configure handler - handler = colorlog.StreamHandler() - handler.setLevel(level) # Explicitly set handler level - formatter = colorlog.ColoredFormatter( - log_format, - log_colors={ - "DEBUG": "cyan", - "INFO": "green", - "WARNING": "yellow", - "ERROR": "red", - "CRITICAL": "bold_red", - }, - ) - handler.setFormatter(formatter) - logger.addHandler(handler) - - return logger - except Exception as e: - logging.error(f"Failed to set up logger: {e}") - raise - - -# Initialize the logger for this module using environment variable -logger = setup_logger(__name__) - -# Example usage: -# logger.debug("This is a debug message") + stdlib_logger = logging.getLogger(name) + + # Remove any existing handlers. + if stdlib_logger.hasHandlers(): + stdlib_logger.handlers.clear() + + stdlib_logger.setLevel(level) + stdlib_logger.propagate = False + + # Create console handler with pretty formatting. + console_renderer = structlog.dev.ConsoleRenderer( + colors=True, + pad_event=60, + force_colors=False, + sort_keys=True, + exception_formatter=structlog.dev.plain_traceback, + ) + + # Wrapper to remove callsite info before rendering to console. + def console_processor_without_callsite( + logger: Any, method_name: str, event_dict: Mapping[str, Any] + ) -> str: + event_dict = dict(event_dict) + event_dict.pop("func_name", None) + event_dict.pop("lineno", None) + return console_renderer(logger, method_name, event_dict) + + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setLevel(level) + console_formatter = structlog.stdlib.ProcessorFormatter( + processor=console_processor_without_callsite, + ) + console_handler.setFormatter(console_formatter) + stdlib_logger.addHandler(console_handler) + + # Create rotating file handler with JSON formatting. + file_handler = logging.handlers.RotatingFileHandler( + log_file_path, + mode="a", + maxBytes=10 * 1024 * 1024, # 10MiB + backupCount=20, + encoding="utf-8", + ) + file_handler.setLevel(level) + file_formatter = structlog.stdlib.ProcessorFormatter( + processor=structlog.processors.JSONRenderer(), + ) + file_handler.setFormatter(file_formatter) + stdlib_logger.addHandler(file_handler) + + return structlog.get_logger(name) diff --git a/dimos/utils/threadpool.py b/dimos/utils/threadpool.py index 45625e9980..9dd6f5c0a1 100644 --- a/dimos/utils/threadpool.py +++ b/dimos/utils/threadpool.py @@ -23,7 +23,9 @@ from reactivex.scheduler import ThreadPoolScheduler -from .logging_config import logger +from .logging_config import setup_logger + +logger = setup_logger(__file__) def get_max_workers() -> int: diff --git a/dimos/web/websocket_vis/websocket_vis_module.py b/dimos/web/websocket_vis/websocket_vis_module.py index 91e0428f33..723ac066bc 100644 --- a/dimos/web/websocket_vis/websocket_vis_module.py +++ b/dimos/web/websocket_vis/websocket_vis_module.py @@ -39,7 +39,7 @@ from .optimized_costmap import OptimizedCostmapEncoder -logger = setup_logger("dimos.web.websocket_vis") +logger = setup_logger(__file__) class WebsocketVisModule(Module): diff --git a/pyproject.toml b/pyproject.toml index 4a7cec2c6c..9b7364a50c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,6 +45,7 @@ dependencies = [ "asyncio==3.4.3", "go2-webrtc-connect @ git+https://github.com/dimensionalOS/go2_webrtc_connect.git", "tensorzero==2025.7.5", + "structlog>=25.5.0,<26", # Web Extensions "fastapi>=0.115.6", diff --git a/tests/test_manipulation_agent.py b/tests/test_manipulation_agent.py index bd09b23b5e..f10ecf5146 100644 --- a/tests/test_manipulation_agent.py +++ b/tests/test_manipulation_agent.py @@ -35,7 +35,7 @@ from dimos.web.robot_web_interface import RobotWebInterface # Initialize logger for the agent module -logger = setup_logger("dimos.tests.test_manipulation_agent") +logger = setup_logger(__file__) # Load API key from environment load_dotenv() diff --git a/tests/test_manipulation_pipeline_single_frame.py b/tests/test_manipulation_pipeline_single_frame.py index c29b2b2607..88e456b9bd 100644 --- a/tests/test_manipulation_pipeline_single_frame.py +++ b/tests/test_manipulation_pipeline_single_frame.py @@ -45,7 +45,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger("test_pipeline_viz") +logger = setup_logger(__file__) def load_first_frame(data_dir: str): diff --git a/tests/test_manipulation_pipeline_single_frame_lcm.py b/tests/test_manipulation_pipeline_single_frame_lcm.py index 0c2f2bc591..1a97c44572 100644 --- a/tests/test_manipulation_pipeline_single_frame_lcm.py +++ b/tests/test_manipulation_pipeline_single_frame_lcm.py @@ -39,7 +39,7 @@ from dimos.manipulation.manip_aio_processer import ManipulationProcessor from dimos.utils.logging_config import setup_logger -logger = setup_logger("test_pipeline_lcm") +logger = setup_logger(__file__) class LCMDataCollector: diff --git a/tests/test_navigate_to_object_robot.py b/tests/test_navigate_to_object_robot.py index ecf4fd4956..d8d594546d 100644 --- a/tests/test_navigate_to_object_robot.py +++ b/tests/test_navigate_to_object_robot.py @@ -23,9 +23,11 @@ from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl from dimos.robot.unitree.unitree_skills import MyUnitreeSkills from dimos.skills.navigation import Navigate -from dimos.utils.logging_config import logger +from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface +logger = setup_logger(__file__) + def parse_args(): parser = argparse.ArgumentParser(description="Navigate to an object using Qwen vision.") diff --git a/tests/test_navigation_skills.py b/tests/test_navigation_skills.py index 93497de691..ac70077d3c 100644 --- a/tests/test_navigation_skills.py +++ b/tests/test_navigation_skills.py @@ -40,7 +40,7 @@ from dimos.web.robot_web_interface import RobotWebInterface # Setup logging -logger = setup_logger("simple_navigation_test") +logger = setup_logger(__file__) def parse_args(): diff --git a/tests/test_object_tracking_module.py b/tests/test_object_tracking_module.py index 4fc1adac83..7794dbd546 100755 --- a/tests/test_object_tracking_module.py +++ b/tests/test_object_tracking_module.py @@ -32,7 +32,7 @@ from dimos.robot.foxglove_bridge import FoxgloveBridge from dimos.utils.logging_config import setup_logger -logger = setup_logger("test_object_tracking_module") +logger = setup_logger(__file__) # Suppress verbose Foxglove bridge warnings import logging diff --git a/tests/test_person_following_robot.py b/tests/test_person_following_robot.py index f7ee6eaf0d..1e014cf95b 100644 --- a/tests/test_person_following_robot.py +++ b/tests/test_person_following_robot.py @@ -21,9 +21,11 @@ from dimos.robot.unitree.unitree_go2 import UnitreeGo2 from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.utils.logging_config import logger +from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface +logger = setup_logger(__file__) + def main(): # Hardcoded parameters diff --git a/tests/test_pick_and_place_module.py b/tests/test_pick_and_place_module.py index 1bce414a6e..25f0a67834 100644 --- a/tests/test_pick_and_place_module.py +++ b/tests/test_pick_and_place_module.py @@ -39,7 +39,7 @@ from dimos.robot.agilex.piper_arm import PiperArmRobot from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.tests.test_pick_and_place_module") +logger = setup_logger(__file__) # Global for mouse events mouse_click = None diff --git a/tests/test_pick_and_place_skill.py b/tests/test_pick_and_place_skill.py index 78eeb761fb..8cabba66dc 100644 --- a/tests/test_pick_and_place_skill.py +++ b/tests/test_pick_and_place_skill.py @@ -31,7 +31,7 @@ from dimos.skills.manipulation.pick_and_place import PickAndPlace from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.robot.agilex.run_robot") +logger = setup_logger(__file__) async def run_piper_arm(): diff --git a/tests/test_planning_agent_web_interface.py b/tests/test_planning_agent_web_interface.py index 6c88919110..5f6e4acf6a 100644 --- a/tests/test_planning_agent_web_interface.py +++ b/tests/test_planning_agent_web_interface.py @@ -38,12 +38,14 @@ from dimos.agents.planning_agent import PlanningAgent from dimos.robot.unitree.unitree_go2 import UnitreeGo2 from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.utils.logging_config import logger +from dimos.utils.logging_config import setup_logger from dimos.utils.threadpool import make_single_thread_scheduler # from dimos.web.fastapi_server import FastAPIServer from dimos.web.robot_web_interface import RobotWebInterface +logger = setup_logger(__file__) + def main(): # Get environment variables diff --git a/tests/test_planning_robot_agent.py b/tests/test_planning_robot_agent.py index aa16a7cac7..e9ad9b4ac1 100644 --- a/tests/test_planning_robot_agent.py +++ b/tests/test_planning_robot_agent.py @@ -36,10 +36,12 @@ from dimos.agents.planning_agent import PlanningAgent from dimos.robot.unitree.unitree_go2 import UnitreeGo2 from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.utils.logging_config import logger +from dimos.utils.logging_config import setup_logger from dimos.utils.threadpool import make_single_thread_scheduler from dimos.web.robot_web_interface import RobotWebInterface +logger = setup_logger(__file__) + def main(): # Get environment variables diff --git a/tests/test_rtsp_video_provider.py b/tests/test_rtsp_video_provider.py index fb0f075750..7c07f3a13a 100644 --- a/tests/test_rtsp_video_provider.py +++ b/tests/test_rtsp_video_provider.py @@ -25,7 +25,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface -logger = setup_logger("tests.test_rtsp_video_provider") +logger = setup_logger(__file__) import os import sys diff --git a/tests/test_unitree_agent_queries_fastapi.py b/tests/test_unitree_agent_queries_fastapi.py index 0671a53135..a8fdf1b9fb 100644 --- a/tests/test_unitree_agent_queries_fastapi.py +++ b/tests/test_unitree_agent_queries_fastapi.py @@ -33,9 +33,11 @@ from dimos.agents.agent import OpenAIAgent from dimos.robot.unitree.unitree_go2 import UnitreeGo2 from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.utils.logging_config import logger +from dimos.utils.logging_config import setup_logger from dimos.web.fastapi_server import FastAPIServer +logger = setup_logger(__file__) + def main(): # Get environment variables diff --git a/tests/test_zed_module.py b/tests/test_zed_module.py index 03a21ac65d..6faa30f2fd 100644 --- a/tests/test_zed_module.py +++ b/tests/test_zed_module.py @@ -33,7 +33,7 @@ from dimos.protocol.pubsub.lcmpubsub import LCM, Topic from dimos.utils.logging_config import setup_logger -logger = setup_logger("test_zed_module") +logger = setup_logger(__file__) class ZEDVisualizationNode: diff --git a/tests/visualization_script.py b/tests/visualization_script.py index a42b4bf06c..e6df48e01f 100644 --- a/tests/visualization_script.py +++ b/tests/visualization_script.py @@ -72,7 +72,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger("visualization_script") +logger = setup_logger(__file__) def create_point_cloud(color_img, depth_img, intrinsics): From d684d001ba6bb3e67a06cccbe9e9036ffe3abaa2 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Fri, 31 Oct 2025 05:52:10 +0200 Subject: [PATCH 02/10] log exceptions --- dimos/robot/cli/dimos_robot.py | 7 ++++ dimos/utils/logging_config.py | 76 +++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/dimos/robot/cli/dimos_robot.py b/dimos/robot/cli/dimos_robot.py index bafa53e4a9..2a01c1a843 100644 --- a/dimos/robot/cli/dimos_robot.py +++ b/dimos/robot/cli/dimos_robot.py @@ -14,6 +14,7 @@ from enum import Enum import inspect +import sys from typing import Optional, get_args, get_origin import typer @@ -22,6 +23,7 @@ from dimos.core.global_config import GlobalConfig from dimos.protocol import pubsub from dimos.robot.all_blueprints import all_blueprints, get_blueprint_by_name, get_module_by_name +from dimos.utils.logging_config import setup_exception_handler RobotType = Enum("RobotType", {key.replace("-", "_").upper(): key for key in all_blueprints.keys()}) @@ -104,6 +106,9 @@ def run( ), ) -> None: """Run the robot with the specified configuration.""" + # Set up exception handler to log to JSON and display on console + setup_exception_handler() + config: GlobalConfig = ctx.obj pubsub.lcm.autoconf() blueprint = get_blueprint_by_name(robot_type.value) @@ -126,4 +131,6 @@ def show_config(ctx: typer.Context) -> None: if __name__ == "__main__": + # Set up exception handler for the main entry point + setup_exception_handler() main() diff --git a/dimos/utils/logging_config.py b/dimos/utils/logging_config.py index e02ebb972f..cec9d451c0 100644 --- a/dimos/utils/logging_config.py +++ b/dimos/utils/logging_config.py @@ -18,6 +18,7 @@ import os from pathlib import Path import sys +import traceback from typing import Any, Mapping import structlog @@ -63,6 +64,7 @@ def _configure_structlog() -> Path: CallsiteParameter.LINENO, ] ), + structlog.processors.format_exc_info, # Add this to format exception info ] structlog.configure( @@ -114,21 +116,30 @@ def setup_logger(name: str, level: int | None = None, log_format: str | None = N stdlib_logger.propagate = False # Create console handler with pretty formatting. + # We use exception_formatter=None because we handle exceptions + # separately with Rich in the global exception handler console_renderer = structlog.dev.ConsoleRenderer( colors=True, pad_event=60, force_colors=False, sort_keys=True, - exception_formatter=structlog.dev.plain_traceback, + exception_formatter=None, # Don't format exceptions in console logs ) - # Wrapper to remove callsite info before rendering to console. + # Wrapper to remove callsite info and exception details before rendering to console. def console_processor_without_callsite( logger: Any, method_name: str, event_dict: Mapping[str, Any] ) -> str: event_dict = dict(event_dict) + # Remove callsite info event_dict.pop("func_name", None) event_dict.pop("lineno", None) + # Remove exception fields since we handle them with Rich + event_dict.pop("exception", None) + event_dict.pop("exc_info", None) + event_dict.pop("exception_type", None) + event_dict.pop("exception_message", None) + event_dict.pop("traceback_lines", None) return console_renderer(logger, method_name, event_dict) console_handler = logging.StreamHandler(sys.stdout) @@ -155,3 +166,64 @@ def console_processor_without_callsite( stdlib_logger.addHandler(file_handler) return structlog.get_logger(name) + + +def setup_exception_handler() -> None: + """Set up a global exception handler that logs uncaught exceptions to JSON.""" + + def handle_exception(exc_type, exc_value, exc_traceback): + """Handle uncaught exceptions by logging them and then displaying them.""" + + # Don't log KeyboardInterrupt + if issubclass(exc_type, KeyboardInterrupt): + sys.__excepthook__(exc_type, exc_value, exc_traceback) + return + + # Get a logger for uncaught exceptions + logger = setup_logger("uncaught_exception") + + # Log the exception with full traceback to JSON + logger.error( + "Uncaught exception occurred", + exc_info=(exc_type, exc_value, exc_traceback), + exception_type=exc_type.__name__, + exception_message=str(exc_value), + traceback_lines=traceback.format_exception(exc_type, exc_value, exc_traceback), + ) + + # Still display the exception nicely on console using Rich if available + try: + from rich.console import Console + from rich.traceback import Traceback + + console = Console() + tb = Traceback.from_exception(exc_type, exc_value, exc_traceback) + console.print(tb) + except ImportError: + # Fall back to standard exception display if Rich is not available + sys.__excepthook__(exc_type, exc_value, exc_traceback) + + # Set our custom exception handler + sys.excepthook = handle_exception + + +def log_exception(logger: Any, exc_info: tuple | None = None) -> None: + """Helper function to log an exception with traceback to both console and JSON. + + Args: + logger: The structlog logger instance to use + exc_info: Exception info tuple (type, value, traceback) or None to use sys.exc_info() + """ + if exc_info is None: + exc_info = sys.exc_info() + + exc_type, exc_value, exc_traceback = exc_info + + # Log the exception with full traceback + logger.error( + "Exception occurred", + exc_info=exc_info, + exception_type=exc_type.__name__ if exc_type else "Unknown", + exception_message=str(exc_value), + traceback_lines=traceback.format_exception(exc_type, exc_value, exc_traceback), + ) From e8ab7d0f920bcdb712974ebc91506d6817c0737f Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Fri, 31 Oct 2025 07:01:09 +0200 Subject: [PATCH 03/10] remove unneeded code --- dimos/robot/cli/dimos_robot.py | 3 --- dimos/utils/logging_config.py | 32 ++------------------------------ 2 files changed, 2 insertions(+), 33 deletions(-) diff --git a/dimos/robot/cli/dimos_robot.py b/dimos/robot/cli/dimos_robot.py index 2a01c1a843..be6ebfb359 100644 --- a/dimos/robot/cli/dimos_robot.py +++ b/dimos/robot/cli/dimos_robot.py @@ -106,7 +106,6 @@ def run( ), ) -> None: """Run the robot with the specified configuration.""" - # Set up exception handler to log to JSON and display on console setup_exception_handler() config: GlobalConfig = ctx.obj @@ -131,6 +130,4 @@ def show_config(ctx: typer.Context) -> None: if __name__ == "__main__": - # Set up exception handler for the main entry point - setup_exception_handler() main() diff --git a/dimos/utils/logging_config.py b/dimos/utils/logging_config.py index cec9d451c0..eb5709a7fc 100644 --- a/dimos/utils/logging_config.py +++ b/dimos/utils/logging_config.py @@ -81,14 +81,12 @@ def _configure_structlog() -> Path: return _LOG_FILE_PATH -def setup_logger(name: str, level: int | None = None, log_format: str | None = None) -> Any: +def setup_logger(name: str, level: int | None = None) -> Any: """Set up a structured logger using structlog. Args: name: The name of the logger. - level: The logging level (kept for compatibility, but ignored). - Log level is controlled by DIMOS_LOG_LEVEL env var. - log_format: Kept for compatibility but ignored. + level: The logging level. Returns: A configured structlog logger instance. @@ -169,11 +167,7 @@ def console_processor_without_callsite( def setup_exception_handler() -> None: - """Set up a global exception handler that logs uncaught exceptions to JSON.""" - def handle_exception(exc_type, exc_value, exc_traceback): - """Handle uncaught exceptions by logging them and then displaying them.""" - # Don't log KeyboardInterrupt if issubclass(exc_type, KeyboardInterrupt): sys.__excepthook__(exc_type, exc_value, exc_traceback) @@ -205,25 +199,3 @@ def handle_exception(exc_type, exc_value, exc_traceback): # Set our custom exception handler sys.excepthook = handle_exception - - -def log_exception(logger: Any, exc_info: tuple | None = None) -> None: - """Helper function to log an exception with traceback to both console and JSON. - - Args: - logger: The structlog logger instance to use - exc_info: Exception info tuple (type, value, traceback) or None to use sys.exc_info() - """ - if exc_info is None: - exc_info = sys.exc_info() - - exc_type, exc_value, exc_traceback = exc_info - - # Log the exception with full traceback - logger.error( - "Exception occurred", - exc_info=exc_info, - exception_type=exc_type.__name__ if exc_type else "Unknown", - exception_message=str(exc_value), - traceback_lines=traceback.format_exception(exc_type, exc_value, exc_traceback), - ) From 22488d5420913579c61910a6c51233607c9c4a19 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Fri, 7 Nov 2025 05:11:24 +0200 Subject: [PATCH 04/10] code review comment --- dimos/agents/agent.py | 2 +- dimos/agents/agent_ctransformers_gguf.py | 2 +- dimos/agents/agent_huggingface_local.py | 2 +- dimos/agents/agent_huggingface_remote.py | 2 +- dimos/agents/cerebras_agent.py | 2 +- dimos/agents/claude_agent.py | 2 +- dimos/agents/memory/base.py | 2 +- dimos/agents/memory/image_embedding.py | 2 +- dimos/agents/memory/spatial_vector_db.py | 2 +- dimos/agents/memory/visual_memory.py | 2 +- dimos/agents/modules/agent_pool.py | 2 +- dimos/agents/modules/base.py | 2 +- dimos/agents/modules/base_agent.py | 2 +- dimos/agents/modules/simple_vision_agent.py | 2 +- dimos/agents/planning_agent.py | 2 +- dimos/agents/test_agent_image_message.py | 2 +- dimos/agents/test_agent_message_streams.py | 2 +- dimos/agents/test_agent_tools.py | 2 +- dimos/agents/tokenizer/huggingface_tokenizer.py | 2 +- dimos/agents/tokenizer/openai_tokenizer.py | 2 +- dimos/agents2/agent.py | 2 +- dimos/agents2/skills/google_maps_skill_container.py | 2 +- dimos/agents2/skills/gps_nav_skill.py | 2 +- dimos/agents2/skills/navigation.py | 2 +- dimos/agents2/skills/osm.py | 2 +- dimos/agents2/skills/ros_navigation.py | 2 +- dimos/agents2/spec.py | 2 +- dimos/agents2/temp/run_unitree_agents2.py | 2 +- dimos/agents2/temp/run_unitree_async.py | 2 +- dimos/agents2/temp/test_unitree_agent_query.py | 2 +- dimos/agents2/temp/test_unitree_skill_container.py | 2 +- dimos/core/__init__.py | 2 +- dimos/core/rpc_client.py | 2 +- dimos/hardware/camera/zed/camera.py | 2 +- dimos/hardware/fake_zed_module.py | 2 +- dimos/hardware/gstreamer_camera.py | 2 +- dimos/hardware/piper_arm.py | 2 +- dimos/manipulation/manip_aio_pipeline.py | 2 +- dimos/manipulation/manip_aio_processer.py | 2 +- dimos/manipulation/manipulation_history.py | 2 +- dimos/manipulation/manipulation_interface.py | 2 +- dimos/manipulation/visual_servoing/detection3d.py | 2 +- dimos/manipulation/visual_servoing/manipulation_module.py | 2 +- dimos/manipulation/visual_servoing/pbvs.py | 2 +- dimos/mapping/google_maps/google_maps.py | 2 +- dimos/mapping/osm/current_location_map.py | 2 +- dimos/mapping/osm/query.py | 2 +- dimos/navigation/bbox_navigation.py | 2 +- dimos/navigation/bt_navigator/navigator.py | 2 +- dimos/navigation/bt_navigator/recovery_server.py | 2 +- .../wavefront_frontier_goal_selector.py | 2 +- dimos/navigation/global_planner/algo.py | 2 +- dimos/navigation/global_planner/planner.py | 2 +- dimos/navigation/local_planner/local_planner.py | 2 +- dimos/navigation/rosnav.py | 2 +- dimos/perception/common/utils.py | 2 +- dimos/perception/detection/detectors/person/yolo.py | 2 +- dimos/perception/detection/detectors/yolo.py | 2 +- dimos/perception/grasp_generation/grasp_generation.py | 2 +- dimos/perception/object_detection_stream.py | 2 +- dimos/perception/object_tracker.py | 2 +- dimos/perception/object_tracker_2d.py | 2 +- dimos/perception/object_tracker_3d.py | 2 +- dimos/perception/person_tracker.py | 2 +- dimos/perception/segmentation/sam_2d_seg.py | 2 +- dimos/perception/spatial_perception.py | 2 +- dimos/perception/test_spatial_memory_module.py | 2 +- dimos/protocol/pubsub/lcmpubsub.py | 2 +- dimos/protocol/pubsub/shmpubsub.py | 2 +- dimos/protocol/pubsub/spec.py | 2 +- dimos/protocol/rpc/pubsubrpc.py | 2 +- dimos/protocol/service/lcmservice.py | 2 +- dimos/protocol/skill/coordinator.py | 2 +- dimos/robot/agilex/piper_arm.py | 2 +- dimos/robot/agilex/run.py | 2 +- dimos/robot/position_stream.py | 2 +- dimos/robot/ros_bridge.py | 2 +- dimos/robot/ros_command_queue.py | 2 +- dimos/robot/ros_control.py | 2 +- dimos/robot/ros_observable_topic.py | 2 +- dimos/robot/ros_transform.py | 2 +- dimos/robot/test_ros_observable_topic.py | 4 ++-- dimos/robot/unitree/connection/go2.py | 2 +- dimos/robot/unitree/g1/g1zed.py | 2 +- dimos/robot/unitree/go2/go2.py | 2 +- dimos/robot/unitree_webrtc/depth_module.py | 2 +- dimos/robot/unitree_webrtc/g1_run.py | 2 +- dimos/robot/unitree_webrtc/modular/connection_module.py | 2 +- dimos/robot/unitree_webrtc/modular/ivan_unitree.py | 2 +- dimos/robot/unitree_webrtc/rosnav.py | 2 +- .../robot/unitree_webrtc/test_unitree_go2_integration.py | 2 +- dimos/robot/unitree_webrtc/unitree_b1/connection.py | 2 +- dimos/robot/unitree_webrtc/unitree_b1/unitree_b1.py | 2 +- dimos/robot/unitree_webrtc/unitree_g1.py | 2 +- dimos/robot/unitree_webrtc/unitree_g1_skill_container.py | 2 +- dimos/robot/unitree_webrtc/unitree_go2.py | 2 +- dimos/robot/unitree_webrtc/unitree_skill_container.py | 2 +- dimos/robot/utils/robot_debugger.py | 2 +- dimos/skills/kill_skill.py | 2 +- dimos/skills/manipulation/force_constraint_skill.py | 2 +- dimos/skills/manipulation/manipulate_skill.py | 2 +- dimos/skills/manipulation/pick_and_place.py | 2 +- dimos/skills/manipulation/rotation_constraint_skill.py | 2 +- dimos/skills/manipulation/translation_constraint_skill.py | 2 +- dimos/skills/speak.py | 2 +- dimos/skills/unitree/unitree_speak.py | 2 +- dimos/skills/visual_navigation_skills.py | 2 +- dimos/stream/audio/node_key_recorder.py | 2 +- dimos/stream/audio/node_microphone.py | 2 +- dimos/stream/audio/node_normalizer.py | 2 +- dimos/stream/audio/node_output.py | 2 +- dimos/stream/audio/node_simulated.py | 2 +- dimos/stream/audio/node_volume_monitor.py | 2 +- dimos/stream/audio/stt/node_whisper.py | 2 +- dimos/stream/audio/text/node_stdout.py | 2 +- dimos/stream/audio/tts/node_openai.py | 2 +- dimos/stream/audio/tts/node_pytts.py | 2 +- dimos/stream/rtsp_video_provider.py | 2 +- dimos/types/timestamped.py | 2 +- dimos/utils/logging_config.py | 8 ++++++-- dimos/utils/monitoring.py | 2 +- dimos/utils/threadpool.py | 2 +- dimos/web/websocket_vis/websocket_vis_module.py | 2 +- 123 files changed, 129 insertions(+), 125 deletions(-) diff --git a/dimos/agents/agent.py b/dimos/agents/agent.py index e5a60d03fe..c869e8a9ac 100644 --- a/dimos/agents/agent.py +++ b/dimos/agents/agent.py @@ -61,7 +61,7 @@ load_dotenv() # Initialize logger for the agent module -logger = setup_logger(__file__) +logger = setup_logger() # Constants _TOKEN_BUDGET_PARTS = 4 # Number of parts to divide token budget diff --git a/dimos/agents/agent_ctransformers_gguf.py b/dimos/agents/agent_ctransformers_gguf.py index b6d055a9e6..59ffe53b63 100644 --- a/dimos/agents/agent_ctransformers_gguf.py +++ b/dimos/agents/agent_ctransformers_gguf.py @@ -33,7 +33,7 @@ load_dotenv() # Initialize logger for the agent module -logger = setup_logger(__file__, level=logging.DEBUG) +logger = setup_logger(level=logging.DEBUG) from ctransformers import AutoModelForCausalLM as CTransformersModel diff --git a/dimos/agents/agent_huggingface_local.py b/dimos/agents/agent_huggingface_local.py index 0c61d3e166..8bf62b9608 100644 --- a/dimos/agents/agent_huggingface_local.py +++ b/dimos/agents/agent_huggingface_local.py @@ -43,7 +43,7 @@ load_dotenv() # Initialize logger for the agent module -logger = setup_logger(__file__, level=logging.DEBUG) +logger = setup_logger(level=logging.DEBUG) # HuggingFaceLLMAgent Class diff --git a/dimos/agents/agent_huggingface_remote.py b/dimos/agents/agent_huggingface_remote.py index 6ff2c5b47b..750a1287dd 100644 --- a/dimos/agents/agent_huggingface_remote.py +++ b/dimos/agents/agent_huggingface_remote.py @@ -41,7 +41,7 @@ load_dotenv() # Initialize logger for the agent module -logger = setup_logger(__file__, level=logging.DEBUG) +logger = setup_logger(level=logging.DEBUG) # HuggingFaceLLMAgent Class diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 513c322f1d..7bfa03ddad 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -51,7 +51,7 @@ load_dotenv() # Initialize logger for the Cerebras agent -logger = setup_logger(__file__) +logger = setup_logger() # Response object compatible with LLMAgent diff --git a/dimos/agents/claude_agent.py b/dimos/agents/claude_agent.py index 2c62cb939f..6ece56637c 100644 --- a/dimos/agents/claude_agent.py +++ b/dimos/agents/claude_agent.py @@ -46,7 +46,7 @@ load_dotenv() # Initialize logger for the Claude agent -logger = setup_logger(__file__) +logger = setup_logger() # Response object compatible with LLMAgent diff --git a/dimos/agents/memory/base.py b/dimos/agents/memory/base.py index be5293b680..6eaaa6ea63 100644 --- a/dimos/agents/memory/base.py +++ b/dimos/agents/memory/base.py @@ -37,7 +37,7 @@ def __init__(self, connection_type: str = "local", **kwargs) -> None: UnknownConnectionTypeError: If an unrecognized connection type is specified. AgentMemoryConnectionError: If initializing the database connection fails. """ - self.logger = setup_logger(__file__) + self.logger = setup_logger() self.logger.info("Initializing AgentMemory with connection type: %s", connection_type) self.connection_params = kwargs self.db_connection = ( diff --git a/dimos/agents/memory/image_embedding.py b/dimos/agents/memory/image_embedding.py index 53676d9f1a..99ebbcb47f 100644 --- a/dimos/agents/memory/image_embedding.py +++ b/dimos/agents/memory/image_embedding.py @@ -30,7 +30,7 @@ from dimos.utils.data import get_data from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class ImageEmbeddingProvider: diff --git a/dimos/agents/memory/spatial_vector_db.py b/dimos/agents/memory/spatial_vector_db.py index cfc99c537a..7a148241b3 100644 --- a/dimos/agents/memory/spatial_vector_db.py +++ b/dimos/agents/memory/spatial_vector_db.py @@ -28,7 +28,7 @@ from dimos.types.robot_location import RobotLocation from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class SpatialVectorDB: diff --git a/dimos/agents/memory/visual_memory.py b/dimos/agents/memory/visual_memory.py index 7ceef172e7..bc51b35134 100644 --- a/dimos/agents/memory/visual_memory.py +++ b/dimos/agents/memory/visual_memory.py @@ -25,7 +25,7 @@ from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class VisualMemory: diff --git a/dimos/agents/modules/agent_pool.py b/dimos/agents/modules/agent_pool.py index 4521647f7d..fee0fa37dc 100644 --- a/dimos/agents/modules/agent_pool.py +++ b/dimos/agents/modules/agent_pool.py @@ -24,7 +24,7 @@ from dimos.core import In, Module, Out, rpc from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class AgentPoolModule(Module): diff --git a/dimos/agents/modules/base.py b/dimos/agents/modules/base.py index a0669065cb..c452735cca 100644 --- a/dimos/agents/modules/base.py +++ b/dimos/agents/modules/base.py @@ -33,7 +33,7 @@ except ImportError: from dimos.agents.modules.gateway import UnifiedGatewayClient -logger = setup_logger(__file__) +logger = setup_logger() # Vision-capable models VISION_MODELS = { diff --git a/dimos/agents/modules/base_agent.py b/dimos/agents/modules/base_agent.py index a97cecab57..cc82a7c8cc 100644 --- a/dimos/agents/modules/base_agent.py +++ b/dimos/agents/modules/base_agent.py @@ -29,7 +29,7 @@ except ImportError: from dimos.agents.modules.base import BaseAgent -logger = setup_logger(__file__) +logger = setup_logger() class BaseAgentModule(BaseAgent, Module): diff --git a/dimos/agents/modules/simple_vision_agent.py b/dimos/agents/modules/simple_vision_agent.py index b4888fd073..d17f905c3a 100644 --- a/dimos/agents/modules/simple_vision_agent.py +++ b/dimos/agents/modules/simple_vision_agent.py @@ -28,7 +28,7 @@ from dimos.msgs.sensor_msgs import Image from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class SimpleVisionAgentModule(Module): diff --git a/dimos/agents/planning_agent.py b/dimos/agents/planning_agent.py index c90a8c02f3..95236e0f41 100644 --- a/dimos/agents/planning_agent.py +++ b/dimos/agents/planning_agent.py @@ -24,7 +24,7 @@ from dimos.skills.skills import AbstractSkill from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # For response validation diff --git a/dimos/agents/test_agent_image_message.py b/dimos/agents/test_agent_image_message.py index 528b62f75e..3769719e13 100644 --- a/dimos/agents/test_agent_image_message.py +++ b/dimos/agents/test_agent_image_message.py @@ -28,7 +28,7 @@ from dimos.msgs.sensor_msgs.Image import ImageFormat from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Enable debug logging for base module logging.getLogger("dimos.agents.modules.base").setLevel(logging.DEBUG) diff --git a/dimos/agents/test_agent_message_streams.py b/dimos/agents/test_agent_message_streams.py index 917a91f987..4d4276e3e3 100644 --- a/dimos/agents/test_agent_message_streams.py +++ b/dimos/agents/test_agent_message_streams.py @@ -34,7 +34,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay -logger = setup_logger(__file__) +logger = setup_logger() class VideoMessageSender(Module): diff --git a/dimos/agents/test_agent_tools.py b/dimos/agents/test_agent_tools.py index 11f313be9a..84973bc2e4 100644 --- a/dimos/agents/test_agent_tools.py +++ b/dimos/agents/test_agent_tools.py @@ -31,7 +31,7 @@ from dimos.skills.skills import AbstractSkill, SkillLibrary from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Test Skills diff --git a/dimos/agents/tokenizer/huggingface_tokenizer.py b/dimos/agents/tokenizer/huggingface_tokenizer.py index 554dcc20cc..d214752f48 100644 --- a/dimos/agents/tokenizer/huggingface_tokenizer.py +++ b/dimos/agents/tokenizer/huggingface_tokenizer.py @@ -57,7 +57,7 @@ def image_token_count(image_width, image_height, image_detail: str = "high"): """ Calculate the number of tokens in an image. Low detail is 85 tokens, high detail is 170 tokens per 512x512 square. """ - logger = setup_logger(__file__) + logger = setup_logger() if image_detail == "low": return 85 diff --git a/dimos/agents/tokenizer/openai_tokenizer.py b/dimos/agents/tokenizer/openai_tokenizer.py index 9aa4828e23..c22d05bcb0 100644 --- a/dimos/agents/tokenizer/openai_tokenizer.py +++ b/dimos/agents/tokenizer/openai_tokenizer.py @@ -57,7 +57,7 @@ def image_token_count(image_width, image_height, image_detail: str = "high"): """ Calculate the number of tokens in an image. Low detail is 85 tokens, high detail is 170 tokens per 512x512 square. """ - logger = setup_logger(__file__) + logger = setup_logger() if image_detail == "low": return 85 diff --git a/dimos/agents2/agent.py b/dimos/agents2/agent.py index f09305903a..370f1ffc5a 100644 --- a/dimos/agents2/agent.py +++ b/dimos/agents2/agent.py @@ -40,7 +40,7 @@ from dimos.protocol.skill.type import Output from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() SYSTEM_MSG_APPEND = "\nYour message history will always be appended with a System Overview message that provides situational awareness." diff --git a/dimos/agents2/skills/google_maps_skill_container.py b/dimos/agents2/skills/google_maps_skill_container.py index 433914a5e3..c116e2cab3 100644 --- a/dimos/agents2/skills/google_maps_skill_container.py +++ b/dimos/agents2/skills/google_maps_skill_container.py @@ -26,7 +26,7 @@ from dimos.robot.robot import Robot from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class GoogleMapsSkillContainer(SkillContainer, Resource): diff --git a/dimos/agents2/skills/gps_nav_skill.py b/dimos/agents2/skills/gps_nav_skill.py index 80e346790a..342ff248e5 100644 --- a/dimos/agents2/skills/gps_nav_skill.py +++ b/dimos/agents2/skills/gps_nav_skill.py @@ -26,7 +26,7 @@ from dimos.robot.robot import Robot from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class GpsNavSkillContainer(SkillContainer, Resource): diff --git a/dimos/agents2/skills/navigation.py b/dimos/agents2/skills/navigation.py index 9a7b91d68a..6eee38369f 100644 --- a/dimos/agents2/skills/navigation.py +++ b/dimos/agents2/skills/navigation.py @@ -30,7 +30,7 @@ from dimos.types.robot_location import RobotLocation from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class NavigationSkillContainer(SkillModule): diff --git a/dimos/agents2/skills/osm.py b/dimos/agents2/skills/osm.py index ae721bea81..162b6b9800 100644 --- a/dimos/agents2/skills/osm.py +++ b/dimos/agents2/skills/osm.py @@ -22,7 +22,7 @@ from dimos.protocol.skill.skill import skill from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class OsmSkill(SkillModule): diff --git a/dimos/agents2/skills/ros_navigation.py b/dimos/agents2/skills/ros_navigation.py index 973cdcc10f..8b9bc3d684 100644 --- a/dimos/agents2/skills/ros_navigation.py +++ b/dimos/agents2/skills/ros_navigation.py @@ -25,7 +25,7 @@ if TYPE_CHECKING: from dimos.robot.unitree_webrtc.unitree_g1 import UnitreeG1 -logger = setup_logger(__file__) +logger = setup_logger() class RosNavigation(SkillContainer, Resource): diff --git a/dimos/agents2/spec.py b/dimos/agents2/spec.py index 2e7965d257..cd59a35ba3 100644 --- a/dimos/agents2/spec.py +++ b/dimos/agents2/spec.py @@ -39,7 +39,7 @@ from dimos.utils.generic import truncate_display_string from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Dynamically create ModelProvider enum from LangChain's supported providers diff --git a/dimos/agents2/temp/run_unitree_agents2.py b/dimos/agents2/temp/run_unitree_agents2.py index dc46309a88..69b4ce97d2 100644 --- a/dimos/agents2/temp/run_unitree_agents2.py +++ b/dimos/agents2/temp/run_unitree_agents2.py @@ -37,7 +37,7 @@ from dimos.robot.unitree_webrtc.unitree_skill_container import UnitreeSkillContainer from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Load environment variables load_dotenv() diff --git a/dimos/agents2/temp/run_unitree_async.py b/dimos/agents2/temp/run_unitree_async.py index 2df84fd09b..4f2ab32855 100644 --- a/dimos/agents2/temp/run_unitree_async.py +++ b/dimos/agents2/temp/run_unitree_async.py @@ -34,7 +34,7 @@ from dimos.robot.unitree_webrtc.unitree_skill_container import UnitreeSkillContainer from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Load environment variables load_dotenv() diff --git a/dimos/agents2/temp/test_unitree_agent_query.py b/dimos/agents2/temp/test_unitree_agent_query.py index d3de00922c..82f103222e 100644 --- a/dimos/agents2/temp/test_unitree_agent_query.py +++ b/dimos/agents2/temp/test_unitree_agent_query.py @@ -34,7 +34,7 @@ from dimos.robot.unitree_webrtc.unitree_skill_container import UnitreeSkillContainer from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Load environment variables load_dotenv() diff --git a/dimos/agents2/temp/test_unitree_skill_container.py b/dimos/agents2/temp/test_unitree_skill_container.py index 2d48c70349..e9679a4958 100644 --- a/dimos/agents2/temp/test_unitree_skill_container.py +++ b/dimos/agents2/temp/test_unitree_skill_container.py @@ -30,7 +30,7 @@ from dimos.robot.unitree_webrtc.unitree_skill_container import UnitreeSkillContainer from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def test_skill_container_creation(): diff --git a/dimos/core/__init__.py b/dimos/core/__init__.py index 4f7dbdb3ab..b8877329d8 100644 --- a/dimos/core/__init__.py +++ b/dimos/core/__init__.py @@ -25,7 +25,7 @@ from dimos.utils.actor_registry import ActorRegistry from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() __all__ = [ "LCMRPC", diff --git a/dimos/core/rpc_client.py b/dimos/core/rpc_client.py index bfcec5bb71..ef58f6ee46 100644 --- a/dimos/core/rpc_client.py +++ b/dimos/core/rpc_client.py @@ -18,7 +18,7 @@ from dimos.protocol.rpc.lcmrpc import LCMRPC from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class RpcCall: diff --git a/dimos/hardware/camera/zed/camera.py b/dimos/hardware/camera/zed/camera.py index 4d2bddc4ee..e043b64865 100644 --- a/dimos/hardware/camera/zed/camera.py +++ b/dimos/hardware/camera/zed/camera.py @@ -31,7 +31,7 @@ from dimos.protocol.tf import TF from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class ZEDCamera: diff --git a/dimos/hardware/fake_zed_module.py b/dimos/hardware/fake_zed_module.py index 48b5043c72..25ac24fa2f 100644 --- a/dimos/hardware/fake_zed_module.py +++ b/dimos/hardware/fake_zed_module.py @@ -31,7 +31,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) class FakeZEDModule(Module): diff --git a/dimos/hardware/gstreamer_camera.py b/dimos/hardware/gstreamer_camera.py index 91e98d9f39..3fe65199a5 100644 --- a/dimos/hardware/gstreamer_camera.py +++ b/dimos/hardware/gstreamer_camera.py @@ -35,7 +35,7 @@ gi.require_version("GstApp", "1.0") from gi.repository import GLib, Gst -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) Gst.init(None) diff --git a/dimos/hardware/piper_arm.py b/dimos/hardware/piper_arm.py index d27d1df394..32c96f8066 100644 --- a/dimos/hardware/piper_arm.py +++ b/dimos/hardware/piper_arm.py @@ -35,7 +35,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import euler_to_quaternion, quaternion_to_euler -logger = setup_logger(__file__) +logger = setup_logger() class PiperArm: diff --git a/dimos/manipulation/manip_aio_pipeline.py b/dimos/manipulation/manip_aio_pipeline.py index 6a04bd2c6a..247365d66c 100644 --- a/dimos/manipulation/manip_aio_pipeline.py +++ b/dimos/manipulation/manip_aio_pipeline.py @@ -35,7 +35,7 @@ from dimos.perception.pointcloud.utils import create_point_cloud_overlay_visualization from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class ManipulationPipeline: diff --git a/dimos/manipulation/manip_aio_processer.py b/dimos/manipulation/manip_aio_processer.py index 0b162fef13..1be4a5ba96 100644 --- a/dimos/manipulation/manip_aio_processer.py +++ b/dimos/manipulation/manip_aio_processer.py @@ -39,7 +39,7 @@ from dimos.perception.segmentation.sam_2d_seg import Sam2DSegmenter from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class ManipulationProcessor: diff --git a/dimos/manipulation/manipulation_history.py b/dimos/manipulation/manipulation_history.py index 7ec030a7a5..9ab19bb75d 100644 --- a/dimos/manipulation/manipulation_history.py +++ b/dimos/manipulation/manipulation_history.py @@ -41,7 +41,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() @dataclass diff --git a/dimos/manipulation/manipulation_interface.py b/dimos/manipulation/manipulation_interface.py index 5b48ce45ec..fdbc115174 100644 --- a/dimos/manipulation/manipulation_interface.py +++ b/dimos/manipulation/manipulation_interface.py @@ -37,7 +37,7 @@ if TYPE_CHECKING: from reactivex.disposable import Disposable -logger = setup_logger(__file__) +logger = setup_logger() class ManipulationInterface: diff --git a/dimos/manipulation/visual_servoing/detection3d.py b/dimos/manipulation/visual_servoing/detection3d.py index 922ec89c8b..7aa6fa13c7 100644 --- a/dimos/manipulation/visual_servoing/detection3d.py +++ b/dimos/manipulation/visual_servoing/detection3d.py @@ -43,7 +43,7 @@ from dimos.perception.segmentation.sam_2d_seg import Sam2DSegmenter from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class Detection3DProcessor: diff --git a/dimos/manipulation/visual_servoing/manipulation_module.py b/dimos/manipulation/visual_servoing/manipulation_module.py index e28ffda0c3..3a4715a8a9 100644 --- a/dimos/manipulation/visual_servoing/manipulation_module.py +++ b/dimos/manipulation/visual_servoing/manipulation_module.py @@ -51,7 +51,7 @@ pose_to_matrix, ) -logger = setup_logger(__file__) +logger = setup_logger() class GraspStage(Enum): diff --git a/dimos/manipulation/visual_servoing/pbvs.py b/dimos/manipulation/visual_servoing/pbvs.py index c52b4b1ca4..5d731be9d1 100644 --- a/dimos/manipulation/visual_servoing/pbvs.py +++ b/dimos/manipulation/visual_servoing/pbvs.py @@ -33,7 +33,7 @@ from dimos.msgs.vision_msgs import Detection3DArray from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class PBVS: diff --git a/dimos/mapping/google_maps/google_maps.py b/dimos/mapping/google_maps/google_maps.py index e75de042f4..c21a9d8543 100644 --- a/dimos/mapping/google_maps/google_maps.py +++ b/dimos/mapping/google_maps/google_maps.py @@ -27,7 +27,7 @@ from dimos.mapping.utils.distance import distance_in_meters from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class GoogleMaps: diff --git a/dimos/mapping/osm/current_location_map.py b/dimos/mapping/osm/current_location_map.py index 88942935af..2e8a41f888 100644 --- a/dimos/mapping/osm/current_location_map.py +++ b/dimos/mapping/osm/current_location_map.py @@ -19,7 +19,7 @@ from dimos.models.vl.base import VlModel from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class CurrentLocationMap: diff --git a/dimos/mapping/osm/query.py b/dimos/mapping/osm/query.py index 566e5d025f..1cce73ea0b 100644 --- a/dimos/mapping/osm/query.py +++ b/dimos/mapping/osm/query.py @@ -22,7 +22,7 @@ _PROLOGUE = "This is an image of an open street map I'm on." _JSON = "Please only respond with valid JSON." -logger = setup_logger(__file__) +logger = setup_logger() def query_for_one_position(vl_model: VlModel, map_image: MapImage, query: str) -> LatLon | None: diff --git a/dimos/navigation/bbox_navigation.py b/dimos/navigation/bbox_navigation.py index 24fef1e272..5d7d4d8cc7 100644 --- a/dimos/navigation/bbox_navigation.py +++ b/dimos/navigation/bbox_navigation.py @@ -22,7 +22,7 @@ from dimos.msgs.vision_msgs import Detection2DArray from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__, level=logging.DEBUG) +logger = setup_logger(level=logging.DEBUG) class BBoxNavigationModule(Module): diff --git a/dimos/navigation/bt_navigator/navigator.py b/dimos/navigation/bt_navigator/navigator.py index e7b51dc5ce..c301479841 100644 --- a/dimos/navigation/bt_navigator/navigator.py +++ b/dimos/navigation/bt_navigator/navigator.py @@ -36,7 +36,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import apply_transform -logger = setup_logger(__file__) +logger = setup_logger() class NavigatorState(Enum): diff --git a/dimos/navigation/bt_navigator/recovery_server.py b/dimos/navigation/bt_navigator/recovery_server.py index 6c9ae20b9c..9385aba269 100644 --- a/dimos/navigation/bt_navigator/recovery_server.py +++ b/dimos/navigation/bt_navigator/recovery_server.py @@ -22,7 +22,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import get_distance -logger = setup_logger(__file__) +logger = setup_logger() class RecoveryServer: diff --git a/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py b/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py index fe803665fe..ac4929c9f2 100644 --- a/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py +++ b/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py @@ -34,7 +34,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import get_distance -logger = setup_logger(__file__) +logger = setup_logger() class PointClassification(IntFlag): diff --git a/dimos/navigation/global_planner/algo.py b/dimos/navigation/global_planner/algo.py index 81960c3a28..37ab39af6e 100644 --- a/dimos/navigation/global_planner/algo.py +++ b/dimos/navigation/global_planner/algo.py @@ -18,7 +18,7 @@ from dimos.msgs.nav_msgs import CostValues, OccupancyGrid, Path from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def astar( diff --git a/dimos/navigation/global_planner/planner.py b/dimos/navigation/global_planner/planner.py index 89ac134b08..831cefc6f4 100644 --- a/dimos/navigation/global_planner/planner.py +++ b/dimos/navigation/global_planner/planner.py @@ -22,7 +22,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import euler_to_quaternion -logger = setup_logger(__file__) +logger = setup_logger() import math diff --git a/dimos/navigation/local_planner/local_planner.py b/dimos/navigation/local_planner/local_planner.py index 0a569f00ed..f9b97c16fb 100644 --- a/dimos/navigation/local_planner/local_planner.py +++ b/dimos/navigation/local_planner/local_planner.py @@ -31,7 +31,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import get_distance, normalize_angle, quaternion_to_euler -logger = setup_logger(__file__) +logger = setup_logger() class BaseLocalPlanner(Module): diff --git a/dimos/navigation/rosnav.py b/dimos/navigation/rosnav.py index a165314209..a18af4e0b3 100644 --- a/dimos/navigation/rosnav.py +++ b/dimos/navigation/rosnav.py @@ -57,7 +57,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.transform_utils import euler_to_quaternion -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) @dataclass diff --git a/dimos/perception/common/utils.py b/dimos/perception/common/utils.py index e455242fb2..0290d7dca7 100644 --- a/dimos/perception/common/utils.py +++ b/dimos/perception/common/utils.py @@ -28,7 +28,7 @@ from dimos.types.vector import Vector from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Optional CuPy support try: # pragma: no cover - optional dependency diff --git a/dimos/perception/detection/detectors/person/yolo.py b/dimos/perception/detection/detectors/person/yolo.py index a2d0680265..a8245a43b6 100644 --- a/dimos/perception/detection/detectors/person/yolo.py +++ b/dimos/perception/detection/detectors/person/yolo.py @@ -21,7 +21,7 @@ from dimos.utils.gpu_utils import is_cuda_available from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class YoloPersonDetector(Detector): diff --git a/dimos/perception/detection/detectors/yolo.py b/dimos/perception/detection/detectors/yolo.py index e4df7107e5..f95c454aa6 100644 --- a/dimos/perception/detection/detectors/yolo.py +++ b/dimos/perception/detection/detectors/yolo.py @@ -21,7 +21,7 @@ from dimos.utils.gpu_utils import is_cuda_available from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class Yolo2DDetector(Detector): diff --git a/dimos/perception/grasp_generation/grasp_generation.py b/dimos/perception/grasp_generation/grasp_generation.py index a430353fb3..e93b7244bd 100644 --- a/dimos/perception/grasp_generation/grasp_generation.py +++ b/dimos/perception/grasp_generation/grasp_generation.py @@ -25,7 +25,7 @@ from dimos.types.manipulation import ObjectData from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class HostedGraspGenerator: diff --git a/dimos/perception/object_detection_stream.py b/dimos/perception/object_detection_stream.py index d45cd9d310..c5b0bc645f 100644 --- a/dimos/perception/object_detection_stream.py +++ b/dimos/perception/object_detection_stream.py @@ -43,7 +43,7 @@ from dimos.types.manipulation import ObjectData # Initialize logger for the ObjectDetectionStream -logger = setup_logger(__file__) +logger = setup_logger() class ObjectDetectionStream: diff --git a/dimos/perception/object_tracker.py b/dimos/perception/object_tracker.py index 2385010721..0b804a73b7 100644 --- a/dimos/perception/object_tracker.py +++ b/dimos/perception/object_tracker.py @@ -42,7 +42,7 @@ yaw_towards_point, ) -logger = setup_logger(__file__) +logger = setup_logger() class ObjectTracking(Module): diff --git a/dimos/perception/object_tracker_2d.py b/dimos/perception/object_tracker_2d.py index 8f9c2bd00b..5d02f0686d 100644 --- a/dimos/perception/object_tracker_2d.py +++ b/dimos/perception/object_tracker_2d.py @@ -36,7 +36,7 @@ from dimos.msgs.vision_msgs import Detection2DArray from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) class ObjectTracker2D(Module): diff --git a/dimos/perception/object_tracker_3d.py b/dimos/perception/object_tracker_3d.py index 95072eb6b2..7bac48236a 100644 --- a/dimos/perception/object_tracker_3d.py +++ b/dimos/perception/object_tracker_3d.py @@ -34,7 +34,7 @@ yaw_towards_point, ) -logger = setup_logger(__file__) +logger = setup_logger() class ObjectTracker3D(ObjectTracker2D): diff --git a/dimos/perception/person_tracker.py b/dimos/perception/person_tracker.py index 8aedcb1344..89db75f83f 100644 --- a/dimos/perception/person_tracker.py +++ b/dimos/perception/person_tracker.py @@ -25,7 +25,7 @@ from dimos.perception.detection2d.yolo_2d_det import Yolo2DDetector from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class PersonTrackingStream(Module): diff --git a/dimos/perception/segmentation/sam_2d_seg.py b/dimos/perception/segmentation/sam_2d_seg.py index d5860f61d2..dda5808874 100644 --- a/dimos/perception/segmentation/sam_2d_seg.py +++ b/dimos/perception/segmentation/sam_2d_seg.py @@ -34,7 +34,7 @@ from dimos.utils.gpu_utils import is_cuda_available from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class Sam2DSegmenter: diff --git a/dimos/perception/spatial_perception.py b/dimos/perception/spatial_perception.py index 7d00ee67f9..1583984410 100644 --- a/dimos/perception/spatial_perception.py +++ b/dimos/perception/spatial_perception.py @@ -47,7 +47,7 @@ _VISUAL_MEMORY_PATH = _SPATIAL_MEMORY_DIR / "visual_memory.pkl" -logger = setup_logger(__file__) +logger = setup_logger() class SpatialMemory(Module): diff --git a/dimos/perception/test_spatial_memory_module.py b/dimos/perception/test_spatial_memory_module.py index 5aeec49a1c..fc2629f256 100644 --- a/dimos/perception/test_spatial_memory_module.py +++ b/dimos/perception/test_spatial_memory_module.py @@ -30,7 +30,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay -logger = setup_logger(__file__) +logger = setup_logger() pubsub.lcm.autoconf() diff --git a/dimos/protocol/pubsub/lcmpubsub.py b/dimos/protocol/pubsub/lcmpubsub.py index f9f0732172..1eaac677ca 100644 --- a/dimos/protocol/pubsub/lcmpubsub.py +++ b/dimos/protocol/pubsub/lcmpubsub.py @@ -29,7 +29,7 @@ from collections.abc import Callable import threading -logger = setup_logger(__file__) +logger = setup_logger() @runtime_checkable diff --git a/dimos/protocol/pubsub/shmpubsub.py b/dimos/protocol/pubsub/shmpubsub.py index 5cc9f55a45..d65e31743b 100644 --- a/dimos/protocol/pubsub/shmpubsub.py +++ b/dimos/protocol/pubsub/shmpubsub.py @@ -38,7 +38,7 @@ if TYPE_CHECKING: from collections.abc import Callable -logger = setup_logger(__file__) +logger = setup_logger() # -------------------------------------------------------------------------------------- diff --git a/dimos/protocol/pubsub/spec.py b/dimos/protocol/pubsub/spec.py index 0810ba1725..ecdcbbfbe1 100644 --- a/dimos/protocol/pubsub/spec.py +++ b/dimos/protocol/pubsub/spec.py @@ -26,7 +26,7 @@ TopicT = TypeVar("TopicT") -logger = setup_logger(__file__) +logger = setup_logger() class PubSub(Generic[TopicT, MsgT], ABC): diff --git a/dimos/protocol/rpc/pubsubrpc.py b/dimos/protocol/rpc/pubsubrpc.py index 033cb7a5e2..b7d4f5070a 100644 --- a/dimos/protocol/rpc/pubsubrpc.py +++ b/dimos/protocol/rpc/pubsubrpc.py @@ -32,7 +32,7 @@ if TYPE_CHECKING: from types import FunctionType -logger = setup_logger(__file__) +logger = setup_logger() MsgT = TypeVar("MsgT") TopicT = TypeVar("TopicT") diff --git a/dimos/protocol/service/lcmservice.py b/dimos/protocol/service/lcmservice.py index 01cca0431b..b2c90c203c 100644 --- a/dimos/protocol/service/lcmservice.py +++ b/dimos/protocol/service/lcmservice.py @@ -29,7 +29,7 @@ from dimos.protocol.service.spec import Service from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() @cache diff --git a/dimos/protocol/skill/coordinator.py b/dimos/protocol/skill/coordinator.py index a672ceacee..8687c0fd1f 100644 --- a/dimos/protocol/skill/coordinator.py +++ b/dimos/protocol/skill/coordinator.py @@ -35,7 +35,7 @@ from dimos.protocol.skill.utils import interpret_tool_call_args from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() @dataclass diff --git a/dimos/robot/agilex/piper_arm.py b/dimos/robot/agilex/piper_arm.py index c67cdd21b6..292bd84f0c 100644 --- a/dimos/robot/agilex/piper_arm.py +++ b/dimos/robot/agilex/piper_arm.py @@ -28,7 +28,7 @@ from dimos.types.robot_capabilities import RobotCapability from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class PiperArmRobot(Robot): diff --git a/dimos/robot/agilex/run.py b/dimos/robot/agilex/run.py index f3a79637c2..da4438efc0 100644 --- a/dimos/robot/agilex/run.py +++ b/dimos/robot/agilex/run.py @@ -34,7 +34,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface -logger = setup_logger(__file__) +logger = setup_logger() # Load environment variables load_dotenv() diff --git a/dimos/robot/position_stream.py b/dimos/robot/position_stream.py index d41c428fc1..1f120528d8 100644 --- a/dimos/robot/position_stream.py +++ b/dimos/robot/position_stream.py @@ -28,7 +28,7 @@ from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) class PositionStreamProvider: diff --git a/dimos/robot/ros_bridge.py b/dimos/robot/ros_bridge.py index 32ef00e4a2..f42ee45f6a 100644 --- a/dimos/robot/ros_bridge.py +++ b/dimos/robot/ros_bridge.py @@ -35,7 +35,7 @@ from dimos.protocol.pubsub.lcmpubsub import LCM, Topic from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) class BridgeDirection(Enum): diff --git a/dimos/robot/ros_command_queue.py b/dimos/robot/ros_command_queue.py index 977c725660..82eebd79f6 100644 --- a/dimos/robot/ros_command_queue.py +++ b/dimos/robot/ros_command_queue.py @@ -31,7 +31,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger for the ros command queue module -logger = setup_logger(__file__) +logger = setup_logger() class CommandType(Enum): diff --git a/dimos/robot/ros_control.py b/dimos/robot/ros_control.py index 3acc447887..6a6bc63dca 100644 --- a/dimos/robot/ros_control.py +++ b/dimos/robot/ros_control.py @@ -45,7 +45,7 @@ from dimos.types.vector import Vector from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() __all__ = ["ROSControl", "RobotMode"] diff --git a/dimos/robot/ros_observable_topic.py b/dimos/robot/ros_observable_topic.py index 4a17ef2506..c8b31fff44 100644 --- a/dimos/robot/ros_observable_topic.py +++ b/dimos/robot/ros_observable_topic.py @@ -63,7 +63,7 @@ def to_profile(self) -> QoSProfile: raise ValueError(f"Unknown QoS enum value: {self}") -logger = setup_logger(__file__) +logger = setup_logger() class ROSObservableTopicAbility: diff --git a/dimos/robot/ros_transform.py b/dimos/robot/ros_transform.py index f2f50c9db0..db59290813 100644 --- a/dimos/robot/ros_transform.py +++ b/dimos/robot/ros_transform.py @@ -24,7 +24,7 @@ from dimos.types.vector import Vector from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() __all__ = ["ROSTransformAbility"] diff --git a/dimos/robot/test_ros_observable_topic.py b/dimos/robot/test_ros_observable_topic.py index b2fd638380..a5332b017b 100644 --- a/dimos/robot/test_ros_observable_topic.py +++ b/dimos/robot/test_ros_observable_topic.py @@ -25,7 +25,7 @@ class MockROSNode: def __init__(self) -> None: - self.logger = setup_logger(__file__) + self.logger = setup_logger() self.sub_id_cnt = 0 self.subs = {} @@ -75,7 +75,7 @@ def robot(): class MockRobot(ROSObservableTopicAbility): def __init__(self) -> None: - self.logger = setup_logger(__file__) + self.logger = setup_logger() # Initialize the mock ROS node self._node = MockROSNode() diff --git a/dimos/robot/unitree/connection/go2.py b/dimos/robot/unitree/connection/go2.py index 3dcda0f7d7..452e5ca6f7 100644 --- a/dimos/robot/unitree/connection/go2.py +++ b/dimos/robot/unitree/connection/go2.py @@ -37,7 +37,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) class Go2ConnectionProtocol(Protocol): diff --git a/dimos/robot/unitree/g1/g1zed.py b/dimos/robot/unitree/g1/g1zed.py index f380d2430e..a9bb0466e3 100644 --- a/dimos/robot/unitree/g1/g1zed.py +++ b/dimos/robot/unitree/g1/g1zed.py @@ -32,7 +32,7 @@ from dimos.robot.unitree.connection.g1 import G1Connection from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class G1ZedDeployResult(TypedDict): diff --git a/dimos/robot/unitree/go2/go2.py b/dimos/robot/unitree/go2/go2.py index 7c9d68a1f3..df7c6af8be 100644 --- a/dimos/robot/unitree/go2/go2.py +++ b/dimos/robot/unitree/go2/go2.py @@ -19,7 +19,7 @@ from dimos.robot.unitree.connection import go2 from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) def deploy(dimos: DimosCluster, ip: str): diff --git a/dimos/robot/unitree_webrtc/depth_module.py b/dimos/robot/unitree_webrtc/depth_module.py index 651798f79b..98ea80043e 100644 --- a/dimos/robot/unitree_webrtc/depth_module.py +++ b/dimos/robot/unitree_webrtc/depth_module.py @@ -25,7 +25,7 @@ from dimos.msgs.sensor_msgs import Image, ImageFormat from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class DepthModule(Module): diff --git a/dimos/robot/unitree_webrtc/g1_run.py b/dimos/robot/unitree_webrtc/g1_run.py index 093cd719db..b525537210 100644 --- a/dimos/robot/unitree_webrtc/g1_run.py +++ b/dimos/robot/unitree_webrtc/g1_run.py @@ -35,7 +35,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface -logger = setup_logger(__file__) +logger = setup_logger() # Load environment variables load_dotenv() diff --git a/dimos/robot/unitree_webrtc/modular/connection_module.py b/dimos/robot/unitree_webrtc/modular/connection_module.py index 22494b6c32..719618a8e9 100644 --- a/dimos/robot/unitree_webrtc/modular/connection_module.py +++ b/dimos/robot/unitree_webrtc/modular/connection_module.py @@ -39,7 +39,7 @@ from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay, TimedSensorStorage -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) # Suppress verbose loggers logging.getLogger("aiortc.codecs.h264").setLevel(logging.ERROR) diff --git a/dimos/robot/unitree_webrtc/modular/ivan_unitree.py b/dimos/robot/unitree_webrtc/modular/ivan_unitree.py index d272e2d6f3..7ab33df69c 100644 --- a/dimos/robot/unitree_webrtc/modular/ivan_unitree.py +++ b/dimos/robot/unitree_webrtc/modular/ivan_unitree.py @@ -30,7 +30,7 @@ from dimos.robot.unitree_webrtc.modular.connection_module import ConnectionModule from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) def detection_unitree() -> None: diff --git a/dimos/robot/unitree_webrtc/rosnav.py b/dimos/robot/unitree_webrtc/rosnav.py index 8df25739aa..7a8bbd6a5d 100644 --- a/dimos/robot/unitree_webrtc/rosnav.py +++ b/dimos/robot/unitree_webrtc/rosnav.py @@ -22,7 +22,7 @@ from dimos.msgs.std_msgs.Bool import Bool from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) class NavigationModule(Module): diff --git a/dimos/robot/unitree_webrtc/test_unitree_go2_integration.py b/dimos/robot/unitree_webrtc/test_unitree_go2_integration.py index be72572998..2d9ae4820b 100644 --- a/dimos/robot/unitree_webrtc/test_unitree_go2_integration.py +++ b/dimos/robot/unitree_webrtc/test_unitree_go2_integration.py @@ -31,7 +31,7 @@ from dimos.robot.unitree_webrtc.unitree_go2 import ConnectionModule from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() pubsub.lcm.autoconf() diff --git a/dimos/robot/unitree_webrtc/unitree_b1/connection.py b/dimos/robot/unitree_webrtc/unitree_b1/connection.py index 45376d647b..adaba00798 100644 --- a/dimos/robot/unitree_webrtc/unitree_b1/connection.py +++ b/dimos/robot/unitree_webrtc/unitree_b1/connection.py @@ -33,7 +33,7 @@ from .b1_command import B1Command # Setup logger with DEBUG level for troubleshooting -logger = setup_logger(__file__, level=logging.DEBUG) +logger = setup_logger(level=logging.DEBUG) class RobotMode: diff --git a/dimos/robot/unitree_webrtc/unitree_b1/unitree_b1.py b/dimos/robot/unitree_webrtc/unitree_b1/unitree_b1.py index 83a940292d..aa27b8be51 100644 --- a/dimos/robot/unitree_webrtc/unitree_b1/unitree_b1.py +++ b/dimos/robot/unitree_webrtc/unitree_b1/unitree_b1.py @@ -53,7 +53,7 @@ ROSTFMessage = None ROS_AVAILABLE = False -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) class UnitreeB1(Robot, Resource): diff --git a/dimos/robot/unitree_webrtc/unitree_g1.py b/dimos/robot/unitree_webrtc/unitree_g1.py index 07f47b8266..6a1eeba9a0 100644 --- a/dimos/robot/unitree_webrtc/unitree_g1.py +++ b/dimos/robot/unitree_webrtc/unitree_g1.py @@ -70,7 +70,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.websocket_vis.websocket_vis_module import WebsocketVisModule -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) # Suppress verbose loggers logging.getLogger("aiortc.codecs.h264").setLevel(logging.ERROR) diff --git a/dimos/robot/unitree_webrtc/unitree_g1_skill_container.py b/dimos/robot/unitree_webrtc/unitree_g1_skill_container.py index 7304f0d880..9df568b0c1 100644 --- a/dimos/robot/unitree_webrtc/unitree_g1_skill_container.py +++ b/dimos/robot/unitree_webrtc/unitree_g1_skill_container.py @@ -31,7 +31,7 @@ from dimos.robot.unitree_webrtc.unitree_g1 import UnitreeG1 from dimos.robot.unitree_webrtc.unitree_go2 import UnitreeGo2 -logger = setup_logger(__file__) +logger = setup_logger() # G1 Arm Actions - all use api_id 7106 on topic "rt/api/arm/request" G1_ARM_CONTROLS = [ diff --git a/dimos/robot/unitree_webrtc/unitree_go2.py b/dimos/robot/unitree_webrtc/unitree_go2.py index b91433ead8..0e54c7f850 100644 --- a/dimos/robot/unitree_webrtc/unitree_go2.py +++ b/dimos/robot/unitree_webrtc/unitree_go2.py @@ -68,7 +68,7 @@ from dimos.utils.testing import TimedSensorReplay from dimos.web.websocket_vis.websocket_vis_module import WebsocketVisModule -logger = setup_logger(__file__, level=logging.INFO) +logger = setup_logger(level=logging.INFO) # Suppress verbose loggers logging.getLogger("aiortc.codecs.h264").setLevel(logging.ERROR) diff --git a/dimos/robot/unitree_webrtc/unitree_skill_container.py b/dimos/robot/unitree_webrtc/unitree_skill_container.py index 7f4694da33..527d0939ff 100644 --- a/dimos/robot/unitree_webrtc/unitree_skill_container.py +++ b/dimos/robot/unitree_webrtc/unitree_skill_container.py @@ -36,7 +36,7 @@ if TYPE_CHECKING: from dimos.robot.unitree_webrtc.unitree_go2 import UnitreeGo2 -logger = setup_logger(__file__) +logger = setup_logger() class UnitreeSkillContainer(Module): diff --git a/dimos/robot/utils/robot_debugger.py b/dimos/robot/utils/robot_debugger.py index b3cfb195ce..9b5ddd6fe6 100644 --- a/dimos/robot/utils/robot_debugger.py +++ b/dimos/robot/utils/robot_debugger.py @@ -17,7 +17,7 @@ from dimos.core.resource import Resource from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class RobotDebugger(Resource): diff --git a/dimos/skills/kill_skill.py b/dimos/skills/kill_skill.py index dabe11c8af..e967099200 100644 --- a/dimos/skills/kill_skill.py +++ b/dimos/skills/kill_skill.py @@ -24,7 +24,7 @@ from dimos.skills.skills import AbstractSkill, SkillLibrary from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class KillSkill(AbstractSkill): diff --git a/dimos/skills/manipulation/force_constraint_skill.py b/dimos/skills/manipulation/force_constraint_skill.py index 7139abd5e7..e04bd887a7 100644 --- a/dimos/skills/manipulation/force_constraint_skill.py +++ b/dimos/skills/manipulation/force_constraint_skill.py @@ -20,7 +20,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger -logger = setup_logger(__file__) +logger = setup_logger() class ForceConstraintSkill(AbstractManipulationSkill): diff --git a/dimos/skills/manipulation/manipulate_skill.py b/dimos/skills/manipulation/manipulate_skill.py index 26e6180c58..fb00b2c5c6 100644 --- a/dimos/skills/manipulation/manipulate_skill.py +++ b/dimos/skills/manipulation/manipulate_skill.py @@ -28,7 +28,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger -logger = setup_logger(__file__) +logger = setup_logger() class Manipulate(AbstractManipulationSkill): diff --git a/dimos/skills/manipulation/pick_and_place.py b/dimos/skills/manipulation/pick_and_place.py index 3ec14c83cb..8ac3269c06 100644 --- a/dimos/skills/manipulation/pick_and_place.py +++ b/dimos/skills/manipulation/pick_and_place.py @@ -31,7 +31,7 @@ from dimos.skills.skills import AbstractRobotSkill from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def parse_qwen_points_response(response: str) -> tuple[tuple[int, int], tuple[int, int]] | None: diff --git a/dimos/skills/manipulation/rotation_constraint_skill.py b/dimos/skills/manipulation/rotation_constraint_skill.py index dc3d0a31bb..3d95925902 100644 --- a/dimos/skills/manipulation/rotation_constraint_skill.py +++ b/dimos/skills/manipulation/rotation_constraint_skill.py @@ -22,7 +22,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger -logger = setup_logger(__file__) +logger = setup_logger() class RotationConstraintSkill(AbstractManipulationSkill): diff --git a/dimos/skills/manipulation/translation_constraint_skill.py b/dimos/skills/manipulation/translation_constraint_skill.py index b291e52fc2..bb8189e338 100644 --- a/dimos/skills/manipulation/translation_constraint_skill.py +++ b/dimos/skills/manipulation/translation_constraint_skill.py @@ -21,7 +21,7 @@ from dimos.utils.logging_config import setup_logger # Initialize logger -logger = setup_logger(__file__) +logger = setup_logger() class TranslationConstraintSkill(AbstractManipulationSkill): diff --git a/dimos/skills/speak.py b/dimos/skills/speak.py index 9a01fa5b78..1c73434f3d 100644 --- a/dimos/skills/speak.py +++ b/dimos/skills/speak.py @@ -23,7 +23,7 @@ from dimos.skills.skills import AbstractSkill from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Global lock to prevent multiple simultaneous audio playbacks _audio_device_lock = threading.RLock() diff --git a/dimos/skills/unitree/unitree_speak.py b/dimos/skills/unitree/unitree_speak.py index 9daef64acb..09845ae13f 100644 --- a/dimos/skills/unitree/unitree_speak.py +++ b/dimos/skills/unitree/unitree_speak.py @@ -28,7 +28,7 @@ from dimos.skills.skills import AbstractRobotSkill from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Audio API constants (from go2_webrtc_driver) AUDIO_API = { diff --git a/dimos/skills/visual_navigation_skills.py b/dimos/skills/visual_navigation_skills.py index 8650517033..c4f94b0136 100644 --- a/dimos/skills/visual_navigation_skills.py +++ b/dimos/skills/visual_navigation_skills.py @@ -30,7 +30,7 @@ from dimos.types.vector import Vector from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__, level=logging.DEBUG) +logger = setup_logger(level=logging.DEBUG) class FollowHuman(AbstractRobotSkill): diff --git a/dimos/stream/audio/node_key_recorder.py b/dimos/stream/audio/node_key_recorder.py index a17ddb380a..c2d6bfffd4 100644 --- a/dimos/stream/audio/node_key_recorder.py +++ b/dimos/stream/audio/node_key_recorder.py @@ -25,7 +25,7 @@ from dimos.stream.audio.base import AbstractAudioTransform, AudioEvent from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class KeyRecorder(AbstractAudioTransform): diff --git a/dimos/stream/audio/node_microphone.py b/dimos/stream/audio/node_microphone.py index 46e1694a07..0f13da4465 100644 --- a/dimos/stream/audio/node_microphone.py +++ b/dimos/stream/audio/node_microphone.py @@ -26,7 +26,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class SounddeviceAudioSource(AbstractAudioEmitter): diff --git a/dimos/stream/audio/node_normalizer.py b/dimos/stream/audio/node_normalizer.py index 3d0a078349..9e05079960 100644 --- a/dimos/stream/audio/node_normalizer.py +++ b/dimos/stream/audio/node_normalizer.py @@ -28,7 +28,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class AudioNormalizer(AbstractAudioTransform): diff --git a/dimos/stream/audio/node_output.py b/dimos/stream/audio/node_output.py index 4638d58fd3..4b8011320a 100644 --- a/dimos/stream/audio/node_output.py +++ b/dimos/stream/audio/node_output.py @@ -24,7 +24,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class SounddeviceAudioOutput(AbstractAudioTransform): diff --git a/dimos/stream/audio/node_simulated.py b/dimos/stream/audio/node_simulated.py index caa8118a3e..dd805355a3 100644 --- a/dimos/stream/audio/node_simulated.py +++ b/dimos/stream/audio/node_simulated.py @@ -24,7 +24,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class SimulatedAudioSource(AbstractAudioEmitter): diff --git a/dimos/stream/audio/node_volume_monitor.py b/dimos/stream/audio/node_volume_monitor.py index 42be626fbd..1578fe2494 100644 --- a/dimos/stream/audio/node_volume_monitor.py +++ b/dimos/stream/audio/node_volume_monitor.py @@ -23,7 +23,7 @@ from dimos.stream.audio.volume import calculate_peak_volume from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class VolumeMonitorNode(AbstractAudioConsumer, AbstractTextEmitter): diff --git a/dimos/stream/audio/stt/node_whisper.py b/dimos/stream/audio/stt/node_whisper.py index 12b2381e2d..ec31032406 100644 --- a/dimos/stream/audio/stt/node_whisper.py +++ b/dimos/stream/audio/stt/node_whisper.py @@ -25,7 +25,7 @@ from dimos.stream.audio.text.base import AbstractTextEmitter from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class WhisperNode(AbstractAudioConsumer, AbstractTextEmitter): diff --git a/dimos/stream/audio/text/node_stdout.py b/dimos/stream/audio/text/node_stdout.py index bb2f0bac4e..61d6138cea 100644 --- a/dimos/stream/audio/text/node_stdout.py +++ b/dimos/stream/audio/text/node_stdout.py @@ -18,7 +18,7 @@ from dimos.stream.audio.text.base import AbstractTextConsumer from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class TextPrinterNode(AbstractTextConsumer): diff --git a/dimos/stream/audio/tts/node_openai.py b/dimos/stream/audio/tts/node_openai.py index 8abdcbb96b..2b9332affc 100644 --- a/dimos/stream/audio/tts/node_openai.py +++ b/dimos/stream/audio/tts/node_openai.py @@ -29,7 +29,7 @@ from dimos.stream.audio.text.base import AbstractTextConsumer, AbstractTextEmitter from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class Voice(str, Enum): diff --git a/dimos/stream/audio/tts/node_pytts.py b/dimos/stream/audio/tts/node_pytts.py index bc08b191a5..af5f7abbed 100644 --- a/dimos/stream/audio/tts/node_pytts.py +++ b/dimos/stream/audio/tts/node_pytts.py @@ -19,7 +19,7 @@ from dimos.stream.audio.text.abstract import AbstractTextTransform from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class PyTTSNode(AbstractTextTransform): diff --git a/dimos/stream/rtsp_video_provider.py b/dimos/stream/rtsp_video_provider.py index 31ffa648ab..8a9ae1350c 100644 --- a/dimos/stream/rtsp_video_provider.py +++ b/dimos/stream/rtsp_video_provider.py @@ -31,7 +31,7 @@ # Assuming AbstractVideoProvider and exceptions are in the sibling file from .video_provider import AbstractVideoProvider, VideoFrameError, VideoSourceError -logger = setup_logger(__file__) +logger = setup_logger() class RtspVideoProvider(AbstractVideoProvider): diff --git a/dimos/types/timestamped.py b/dimos/types/timestamped.py index efffc47cf5..67369741b7 100644 --- a/dimos/types/timestamped.py +++ b/dimos/types/timestamped.py @@ -27,7 +27,7 @@ from dimos.types.weaklist import WeakList from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # any class that carries a timestamp should inherit from this # this allows us to work with timeseries in consistent way, allign messages, replay etc diff --git a/dimos/utils/logging_config.py b/dimos/utils/logging_config.py index eb5709a7fc..b57d076bc7 100644 --- a/dimos/utils/logging_config.py +++ b/dimos/utils/logging_config.py @@ -13,6 +13,7 @@ # limitations under the License. from datetime import datetime +import inspect import logging import logging.handlers import os @@ -81,17 +82,20 @@ def _configure_structlog() -> Path: return _LOG_FILE_PATH -def setup_logger(name: str, level: int | None = None) -> Any: +def setup_logger(level: int | None = None) -> Any: """Set up a structured logger using structlog. Args: - name: The name of the logger. level: The logging level. Returns: A configured structlog logger instance. """ + caller_frame = inspect.stack()[1] + name = caller_frame.filename + print("filename:", name) + # Convert absolute path to relative path try: name = str(Path(name).relative_to(DIMOS_PROJECT_ROOT)) diff --git a/dimos/utils/monitoring.py b/dimos/utils/monitoring.py index 17415781b5..4aadf14b95 100644 --- a/dimos/utils/monitoring.py +++ b/dimos/utils/monitoring.py @@ -32,7 +32,7 @@ from dimos.utils.actor_registry import ActorRegistry from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def print_data_table(data) -> None: diff --git a/dimos/utils/threadpool.py b/dimos/utils/threadpool.py index 9dd6f5c0a1..0a6c6da451 100644 --- a/dimos/utils/threadpool.py +++ b/dimos/utils/threadpool.py @@ -25,7 +25,7 @@ from .logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def get_max_workers() -> int: diff --git a/dimos/web/websocket_vis/websocket_vis_module.py b/dimos/web/websocket_vis/websocket_vis_module.py index 723ac066bc..e51d3bc900 100644 --- a/dimos/web/websocket_vis/websocket_vis_module.py +++ b/dimos/web/websocket_vis/websocket_vis_module.py @@ -39,7 +39,7 @@ from .optimized_costmap import OptimizedCostmapEncoder -logger = setup_logger(__file__) +logger = setup_logger() class WebsocketVisModule(Module): From 009c6ba8e49a8d7092ea9e2024a2f551e486008b Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Tue, 11 Nov 2025 06:21:07 +0200 Subject: [PATCH 05/10] update setup.sh path --- docker/navigation/README.md | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/docker/navigation/README.md b/docker/navigation/README.md index f518cf7674..94f52e0bc2 100644 --- a/docker/navigation/README.md +++ b/docker/navigation/README.md @@ -7,25 +7,12 @@ This directory contains Docker configuration files to run DimOS and the ROS auto **For fresh Ubuntu systems**, use the automated setup script: ```bash -curl -fsSL https://raw.githubusercontent.com/dimensionalOS/dimos/dimos-rosnav-docker/docker/navigation/setup.sh | bash -``` - -Or download and run locally: - -```bash -wget https://raw.githubusercontent.com/dimensionalOS/dimos/dimos-rosnav-docker/docker/navigation/setup.sh -chmod +x setup.sh -./setup.sh +wget https://raw.githubusercontent.com/dimensionalOS/dimos/refs/heads/dev/docker/navigation/setup.sh?token=GHSAT0AAAAAADHM56ULLVHMU72XDZSKOZAM2ISY24A +bash setup.sh ``` **Installation time:** Approximately 20-30 minutes depending on your internet connection. -**After installation, start the demo:** -```bash -cd ~/dimos/docker/navigation -./start.sh --all -``` - **Options:** ```bash ./setup.sh --help # Show all options From 3d147797cb5e4f74cbb1a3cdd61e303d72e6d7d9 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Tue, 11 Nov 2025 06:39:59 +0200 Subject: [PATCH 06/10] write in XDG location if not a repo --- dimos/utils/logging_config.py | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/dimos/utils/logging_config.py b/dimos/utils/logging_config.py index b57d076bc7..50d105d881 100644 --- a/dimos/utils/logging_config.py +++ b/dimos/utils/logging_config.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from collections.abc import Mapping from datetime import datetime import inspect import logging @@ -19,8 +20,9 @@ import os from pathlib import Path import sys +import tempfile import traceback -from typing import Any, Mapping +from typing import Any import structlog from structlog.processors import CallsiteParameter, CallsiteParameterAdder @@ -37,11 +39,32 @@ _LOG_FILE_PATH = None +def _get_log_directory() -> Path: + # Check if running from a git repository + if (DIMOS_PROJECT_ROOT / ".git").exists(): + log_dir = DIMOS_LOG_DIR + else: + # Running from an installed package - use XDG_STATE_HOME + xdg_state_home = os.getenv("XDG_STATE_HOME") + if xdg_state_home: + log_dir = Path(xdg_state_home) / "dimos" / "logs" + else: + log_dir = Path.home() / ".local" / "state" / "dimos" / "logs" + + try: + log_dir.mkdir(parents=True, exist_ok=True) + except (PermissionError, OSError): + log_dir = Path(tempfile.gettempdir()) / "dimos" / "logs" + log_dir.mkdir(parents=True, exist_ok=True) + + return log_dir + + def _get_log_file_path() -> Path: - DIMOS_LOG_DIR.mkdir(parents=True, exist_ok=True) + log_dir = _get_log_directory() timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") pid = os.getpid() - return DIMOS_LOG_DIR / f"dimos_{timestamp}_{pid}.jsonl" + return log_dir / f"dimos_{timestamp}_{pid}.jsonl" def _configure_structlog() -> Path: @@ -94,7 +117,6 @@ def setup_logger(level: int | None = None) -> Any: caller_frame = inspect.stack()[1] name = caller_frame.filename - print("filename:", name) # Convert absolute path to relative path try: From 2ce16fa61d17429ed11099fa9170ac1e53b270f8 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Thu, 20 Nov 2025 02:35:20 +0200 Subject: [PATCH 07/10] update in new files --- dimos/navigation/demo_ros_navigation.py | 2 +- dimos/robot/unitree_webrtc/mujoco_connection.py | 2 +- dimos/simulation/mujoco/mujoco_process.py | 2 +- dimos/simulation/mujoco/shared_memory.py | 2 +- dimos/utils/logging_config.py | 2 +- tests/test_manipulation_agent.py | 2 +- tests/test_manipulation_pipeline_single_frame.py | 2 +- tests/test_manipulation_pipeline_single_frame_lcm.py | 2 +- tests/test_navigate_to_object_robot.py | 2 +- tests/test_navigation_skills.py | 2 +- tests/test_object_tracking_module.py | 2 +- tests/test_person_following_robot.py | 2 +- tests/test_pick_and_place_module.py | 2 +- tests/test_pick_and_place_skill.py | 2 +- tests/test_rtsp_video_provider.py | 2 +- tests/test_unitree_agent_queries_fastapi.py | 2 +- tests/test_zed_module.py | 2 +- tests/visualization_script.py | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/dimos/navigation/demo_ros_navigation.py b/dimos/navigation/demo_ros_navigation.py index fac19e1b24..2391f4e58b 100644 --- a/dimos/navigation/demo_ros_navigation.py +++ b/dimos/navigation/demo_ros_navigation.py @@ -24,7 +24,7 @@ from dimos.protocol import pubsub from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def main() -> None: diff --git a/dimos/robot/unitree_webrtc/mujoco_connection.py b/dimos/robot/unitree_webrtc/mujoco_connection.py index 897914385a..c13e9fb913 100644 --- a/dimos/robot/unitree_webrtc/mujoco_connection.py +++ b/dimos/robot/unitree_webrtc/mujoco_connection.py @@ -44,7 +44,7 @@ ODOM_FREQUENCY = 50 -logger = setup_logger(__file__) +logger = setup_logger() T = TypeVar("T") diff --git a/dimos/simulation/mujoco/mujoco_process.py b/dimos/simulation/mujoco/mujoco_process.py index e5a9b30569..dd98a283da 100755 --- a/dimos/simulation/mujoco/mujoco_process.py +++ b/dimos/simulation/mujoco/mujoco_process.py @@ -45,7 +45,7 @@ from dimos.simulation.mujoco.shared_memory import ShmReader from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class MockController: diff --git a/dimos/simulation/mujoco/shared_memory.py b/dimos/simulation/mujoco/shared_memory.py index 3398f4e01a..ba555574ce 100644 --- a/dimos/simulation/mujoco/shared_memory.py +++ b/dimos/simulation/mujoco/shared_memory.py @@ -25,7 +25,7 @@ from dimos.simulation.mujoco.constants import VIDEO_HEIGHT, VIDEO_WIDTH from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Video buffer: VIDEO_WIDTH x VIDEO_HEIGHT x 3 RGB _video_size = VIDEO_WIDTH * VIDEO_HEIGHT * 3 diff --git a/dimos/utils/logging_config.py b/dimos/utils/logging_config.py index 50d105d881..a1ec6efee3 100644 --- a/dimos/utils/logging_config.py +++ b/dimos/utils/logging_config.py @@ -193,7 +193,7 @@ def console_processor_without_callsite( def setup_exception_handler() -> None: - def handle_exception(exc_type, exc_value, exc_traceback): + def handle_exception(exc_type, exc_value, exc_traceback) -> None: # Don't log KeyboardInterrupt if issubclass(exc_type, KeyboardInterrupt): sys.__excepthook__(exc_type, exc_value, exc_traceback) diff --git a/tests/test_manipulation_agent.py b/tests/test_manipulation_agent.py index f10ecf5146..7651d38fef 100644 --- a/tests/test_manipulation_agent.py +++ b/tests/test_manipulation_agent.py @@ -35,7 +35,7 @@ from dimos.web.robot_web_interface import RobotWebInterface # Initialize logger for the agent module -logger = setup_logger(__file__) +logger = setup_logger() # Load API key from environment load_dotenv() diff --git a/tests/test_manipulation_pipeline_single_frame.py b/tests/test_manipulation_pipeline_single_frame.py index 88e456b9bd..bbf2d5220f 100644 --- a/tests/test_manipulation_pipeline_single_frame.py +++ b/tests/test_manipulation_pipeline_single_frame.py @@ -45,7 +45,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def load_first_frame(data_dir: str): diff --git a/tests/test_manipulation_pipeline_single_frame_lcm.py b/tests/test_manipulation_pipeline_single_frame_lcm.py index 1a97c44572..1d2dc1ded7 100644 --- a/tests/test_manipulation_pipeline_single_frame_lcm.py +++ b/tests/test_manipulation_pipeline_single_frame_lcm.py @@ -39,7 +39,7 @@ from dimos.manipulation.manip_aio_processer import ManipulationProcessor from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class LCMDataCollector: diff --git a/tests/test_navigate_to_object_robot.py b/tests/test_navigate_to_object_robot.py index d8d594546d..44c57011cc 100644 --- a/tests/test_navigate_to_object_robot.py +++ b/tests/test_navigate_to_object_robot.py @@ -26,7 +26,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface -logger = setup_logger(__file__) +logger = setup_logger() def parse_args(): diff --git a/tests/test_navigation_skills.py b/tests/test_navigation_skills.py index ac70077d3c..b659715e98 100644 --- a/tests/test_navigation_skills.py +++ b/tests/test_navigation_skills.py @@ -40,7 +40,7 @@ from dimos.web.robot_web_interface import RobotWebInterface # Setup logging -logger = setup_logger(__file__) +logger = setup_logger() def parse_args(): diff --git a/tests/test_object_tracking_module.py b/tests/test_object_tracking_module.py index 7794dbd546..24f0b7b675 100755 --- a/tests/test_object_tracking_module.py +++ b/tests/test_object_tracking_module.py @@ -32,7 +32,7 @@ from dimos.robot.foxglove_bridge import FoxgloveBridge from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Suppress verbose Foxglove bridge warnings import logging diff --git a/tests/test_person_following_robot.py b/tests/test_person_following_robot.py index 1e014cf95b..a9faa663ce 100644 --- a/tests/test_person_following_robot.py +++ b/tests/test_person_following_robot.py @@ -24,7 +24,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface -logger = setup_logger(__file__) +logger = setup_logger() def main(): diff --git a/tests/test_pick_and_place_module.py b/tests/test_pick_and_place_module.py index 25f0a67834..ef1858c6b6 100644 --- a/tests/test_pick_and_place_module.py +++ b/tests/test_pick_and_place_module.py @@ -39,7 +39,7 @@ from dimos.robot.agilex.piper_arm import PiperArmRobot from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() # Global for mouse events mouse_click = None diff --git a/tests/test_pick_and_place_skill.py b/tests/test_pick_and_place_skill.py index 8cabba66dc..95576a40d3 100644 --- a/tests/test_pick_and_place_skill.py +++ b/tests/test_pick_and_place_skill.py @@ -31,7 +31,7 @@ from dimos.skills.manipulation.pick_and_place import PickAndPlace from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() async def run_piper_arm(): diff --git a/tests/test_rtsp_video_provider.py b/tests/test_rtsp_video_provider.py index 7c07f3a13a..a834075619 100644 --- a/tests/test_rtsp_video_provider.py +++ b/tests/test_rtsp_video_provider.py @@ -25,7 +25,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface -logger = setup_logger(__file__) +logger = setup_logger() import os import sys diff --git a/tests/test_unitree_agent_queries_fastapi.py b/tests/test_unitree_agent_queries_fastapi.py index a8fdf1b9fb..e144b8856c 100644 --- a/tests/test_unitree_agent_queries_fastapi.py +++ b/tests/test_unitree_agent_queries_fastapi.py @@ -36,7 +36,7 @@ from dimos.utils.logging_config import setup_logger from dimos.web.fastapi_server import FastAPIServer -logger = setup_logger(__file__) +logger = setup_logger() def main(): diff --git a/tests/test_zed_module.py b/tests/test_zed_module.py index 6faa30f2fd..40c9addce6 100644 --- a/tests/test_zed_module.py +++ b/tests/test_zed_module.py @@ -33,7 +33,7 @@ from dimos.protocol.pubsub.lcmpubsub import LCM, Topic from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class ZEDVisualizationNode: diff --git a/tests/visualization_script.py b/tests/visualization_script.py index e6df48e01f..18ddd60eb9 100644 --- a/tests/visualization_script.py +++ b/tests/visualization_script.py @@ -72,7 +72,7 @@ ) from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def create_point_cloud(color_img, depth_img, intrinsics): From 27bdaa83098c79867862c195719c42839c5f9751 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Thu, 27 Nov 2025 02:34:09 +0200 Subject: [PATCH 08/10] fix mypy --- dimos/core/transport.py | 3 +- .../contact_graspnet_pytorch/inference.py | 8 +++-- dimos/models/vl/moondream_hosted.py | 22 ++++++------ dimos/models/vl/test_moondream_hosted.py | 34 ++++++++++--------- dimos/utils/logging_config.py | 15 +++++--- 5 files changed, 47 insertions(+), 35 deletions(-) diff --git a/dimos/core/transport.py b/dimos/core/transport.py index 3fe2ae00b1..03bb073327 100644 --- a/dimos/core/transport.py +++ b/dimos/core/transport.py @@ -14,7 +14,6 @@ from __future__ import annotations -import traceback from typing import Any, TypeVar import dimos.core.colors as colors @@ -26,7 +25,7 @@ TypeVar, ) -from dimos.core.stream import In, RemoteIn, Transport +from dimos.core.stream import In, Transport from dimos.protocol.pubsub.jpeg_shm import JpegSharedMemory from dimos.protocol.pubsub.lcmpubsub import LCM, JpegLCM, PickleLCM, Topic as LCMTopic from dimos.protocol.pubsub.shmpubsub import PickleSharedMemory, SharedMemory diff --git a/dimos/models/manipulation/contact_graspnet_pytorch/inference.py b/dimos/models/manipulation/contact_graspnet_pytorch/inference.py index 9168049422..57d3a48354 100644 --- a/dimos/models/manipulation/contact_graspnet_pytorch/inference.py +++ b/dimos/models/manipulation/contact_graspnet_pytorch/inference.py @@ -4,8 +4,12 @@ from contact_graspnet_pytorch import config_utils # type: ignore[import-not-found] from contact_graspnet_pytorch.checkpoints import CheckpointIO # type: ignore[import-not-found] -from contact_graspnet_pytorch.contact_grasp_estimator import GraspEstimator # type: ignore[import-not-found] -from contact_graspnet_pytorch.data import load_available_input_data # type: ignore[import-not-found] +from contact_graspnet_pytorch.contact_grasp_estimator import ( + GraspEstimator, # type: ignore[import-not-found] +) +from contact_graspnet_pytorch.data import ( + load_available_input_data, # type: ignore[import-not-found] +) import numpy as np from dimos.utils.data import get_data diff --git a/dimos/models/vl/moondream_hosted.py b/dimos/models/vl/moondream_hosted.py index 6754f4177c..528517d4c7 100644 --- a/dimos/models/vl/moondream_hosted.py +++ b/dimos/models/vl/moondream_hosted.py @@ -1,6 +1,6 @@ +from functools import cached_property import os import warnings -from functools import cached_property import moondream as md # type: ignore[import-untyped] import numpy as np @@ -34,19 +34,19 @@ def _to_pil_image(self, image: Image | np.ndarray) -> PILImage.Image: # type: i stacklevel=3, ) image = Image.from_numpy(image) - + rgb_image = image.to_rgb() return PILImage.fromarray(rgb_image.data) def query(self, image: Image | np.ndarray, query: str, **kwargs) -> str: # type: ignore[no-untyped-def, type-arg] pil_image = self._to_pil_image(image) - + result = self._client.query(pil_image, query) return result.get("answer", str(result)) # type: ignore[no-any-return] def caption(self, image: Image | np.ndarray, length: str = "normal") -> str: # type: ignore[type-arg] """Generate a caption for the image. - + Args: image: Input image length: Caption length ("normal", "short", "long") @@ -61,14 +61,14 @@ def query_detections(self, image: Image, query: str, **kwargs) -> ImageDetection Args: image: Input image query: Object query (e.g., "person", "car") - max_objects: Maximum number of objects to detect (not directly supported by hosted API args in docs, + max_objects: Maximum number of objects to detect (not directly supported by hosted API args in docs, but we handle the output) Returns: ImageDetections2D containing detected bounding boxes """ pil_image = self._to_pil_image(image) - + # API docs: detect(image, object) -> {"objects": [...]} result = self._client.detect(pil_image, query) objects = result.get("objects", []) @@ -109,25 +109,25 @@ def query_detections(self, image: Image, query: str, **kwargs) -> ImageDetection def point(self, image: Image, query: str) -> list[tuple[float, float]]: """Get coordinates of specific objects in an image. - + Args: image: Input image query: Object query - + Returns: List of (x, y) pixel coordinates """ pil_image = self._to_pil_image(image) result = self._client.point(pil_image, query) points = result.get("points", []) - + pixel_points = [] height, width = image.height, image.width - + for p in points: x_norm = p.get("x", 0.0) y_norm = p.get("y", 0.0) pixel_points.append((x_norm * width, y_norm * height)) - + return pixel_points diff --git a/dimos/models/vl/test_moondream_hosted.py b/dimos/models/vl/test_moondream_hosted.py index dd18b993a6..1f3d59d1b9 100644 --- a/dimos/models/vl/test_moondream_hosted.py +++ b/dimos/models/vl/test_moondream_hosted.py @@ -1,13 +1,15 @@ import os import time + import pytest + from dimos.models.vl.moondream_hosted import MoondreamHostedVlModel from dimos.msgs.sensor_msgs import Image from dimos.perception.detection.type import ImageDetections2D # Skip all tests in this module if API key is missing pytestmark = pytest.mark.skipif( - not os.getenv("MOONDREAM_API_KEY"), + not os.getenv("MOONDREAM_API_KEY"), reason="MOONDREAM_API_KEY not set" ) @@ -22,7 +24,7 @@ def test_image(): pytest.skip(f"Test image not found at {image_path}") return Image.from_file(image_path) -def test_caption(model, test_image): +def test_caption(model, test_image) -> None: """Test generating a caption.""" print("\n--- Testing Caption ---") caption = model.caption(test_image) @@ -30,7 +32,7 @@ def test_caption(model, test_image): assert isinstance(caption, str) assert len(caption) > 0 -def test_query(model, test_image): +def test_query(model, test_image) -> None: """Test querying the image.""" print("\n--- Testing Query ---") question = "Is there an xbox controller in the image?" @@ -42,35 +44,35 @@ def test_query(model, test_image): # The answer should likely be positive given the user's prompt assert "yes" in answer.lower() or "controller" in answer.lower() -def test_query_latency(model, test_image): +def test_query_latency(model, test_image) -> None: """Test that a simple query returns in under 1 second.""" print("\n--- Testing Query Latency ---") question = "What is this?" - + # Warmup (optional, but good practice if first call establishes connection) - # model.query(test_image, "warmup") - + # model.query(test_image, "warmup") + start_time = time.perf_counter() model.query(test_image, question) end_time = time.perf_counter() - + duration = end_time - start_time print(f"Query took {duration:.4f} seconds") - + assert duration < 1.0, f"Query took too long: {duration:.4f}s > 1.0s" @pytest.mark.parametrize("subject", ["xbox controller", "lip balm"]) -def test_detect(model, test_image, subject): +def test_detect(model, test_image, subject: str) -> None: """Test detecting objects.""" print(f"\n--- Testing Detect: {subject} ---") detections = model.query_detections(test_image, subject) - + assert isinstance(detections, ImageDetections2D) print(f"Found {len(detections.detections)} detections for {subject}") - + # We expect to find at least one of each in the provided test image assert len(detections.detections) > 0 - + for det in detections.detections: assert det.is_valid() assert det.name == subject @@ -80,15 +82,15 @@ def test_detect(model, test_image, subject): assert 0 <= y1 < y2 <= test_image.height @pytest.mark.parametrize("subject", ["xbox controller", "lip balm"]) -def test_point(model, test_image, subject): +def test_point(model, test_image, subject: str) -> None: """Test pointing at objects.""" print(f"\n--- Testing Point: {subject} ---") points = model.point(test_image, subject) - + print(f"Found {len(points)} points for {subject}: {points}") assert isinstance(points, list) assert len(points) > 0 - + for x, y in points: assert isinstance(x, (int, float)) assert isinstance(y, (int, float)) diff --git a/dimos/utils/logging_config.py b/dimos/utils/logging_config.py index a1ec6efee3..ca5b2f979c 100644 --- a/dimos/utils/logging_config.py +++ b/dimos/utils/logging_config.py @@ -22,6 +22,7 @@ import sys import tempfile import traceback +from types import TracebackType from typing import Any import structlog @@ -75,7 +76,7 @@ def _configure_structlog() -> Path: _LOG_FILE_PATH = _get_log_file_path() - shared_processors = [ + shared_processors: list[Any] = [ structlog.stdlib.add_log_level, structlog.stdlib.add_logger_name, structlog.stdlib.PositionalArgumentsFormatter(), @@ -142,12 +143,14 @@ def setup_logger(level: int | None = None) -> Any: # Create console handler with pretty formatting. # We use exception_formatter=None because we handle exceptions # separately with Rich in the global exception handler + console_renderer = structlog.dev.ConsoleRenderer( colors=True, pad_event=60, force_colors=False, sort_keys=True, - exception_formatter=None, # Don't format exceptions in console logs + # Don't format exceptions in console logs + exception_formatter=None, # type: ignore[arg-type] ) # Wrapper to remove callsite info and exception details before rendering to console. @@ -193,14 +196,18 @@ def console_processor_without_callsite( def setup_exception_handler() -> None: - def handle_exception(exc_type, exc_value, exc_traceback) -> None: + def handle_exception( + exc_type: type[BaseException], + exc_value: BaseException, + exc_traceback: TracebackType | None, + ) -> None: # Don't log KeyboardInterrupt if issubclass(exc_type, KeyboardInterrupt): sys.__excepthook__(exc_type, exc_value, exc_traceback) return # Get a logger for uncaught exceptions - logger = setup_logger("uncaught_exception") + logger = setup_logger() # Log the exception with full traceback to JSON logger.error( From b47641a74fcabcbc87e71641de4ea08ddc10e2f2 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 3 Dec 2025 04:02:22 +0200 Subject: [PATCH 09/10] update latest --- dimos/agents2/cli/web.py | 2 +- dimos/agents2/ollama_agent.py | 2 +- dimos/agents2/skills/speak_skill.py | 2 +- dimos/core/stream.py | 2 +- dimos/robot/unitree/connection/g1.py | 2 +- dimos/robot/unitree/connection/g1sim.py | 2 +- dimos/utils/logging_config.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dimos/agents2/cli/web.py b/dimos/agents2/cli/web.py index cb589ac5ce..514c9300fb 100644 --- a/dimos/agents2/cli/web.py +++ b/dimos/agents2/cli/web.py @@ -28,7 +28,7 @@ if TYPE_CHECKING: from dimos.stream.audio.base import AudioEvent -logger = setup_logger(__name__) +logger = setup_logger() class WebInput(Module): diff --git a/dimos/agents2/ollama_agent.py b/dimos/agents2/ollama_agent.py index 26179d7418..48c4a23100 100644 --- a/dimos/agents2/ollama_agent.py +++ b/dimos/agents2/ollama_agent.py @@ -16,7 +16,7 @@ from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def ensure_ollama_model(model_name: str) -> None: diff --git a/dimos/agents2/skills/speak_skill.py b/dimos/agents2/skills/speak_skill.py index 0623824266..5567410b69 100644 --- a/dimos/agents2/skills/speak_skill.py +++ b/dimos/agents2/skills/speak_skill.py @@ -24,7 +24,7 @@ from dimos.stream.audio.tts.node_openai import OpenAITTSNode, Voice from dimos.utils.logging_config import setup_logger -logger = setup_logger("dimos.agents2.skills.speak_skill") +logger = setup_logger() class SpeakSkill(SkillModule): diff --git a/dimos/core/stream.py b/dimos/core/stream.py index aa58904678..30a015fa6e 100644 --- a/dimos/core/stream.py +++ b/dimos/core/stream.py @@ -40,7 +40,7 @@ T = TypeVar("T") -logger = setup_logger(__file__) +logger = setup_logger() class ObservableMixin(Generic[T]): diff --git a/dimos/robot/unitree/connection/g1.py b/dimos/robot/unitree/connection/g1.py index 044249b18a..c515535965 100644 --- a/dimos/robot/unitree/connection/g1.py +++ b/dimos/robot/unitree/connection/g1.py @@ -24,7 +24,7 @@ from dimos.robot.unitree.connection.connection import UnitreeWebRTCConnection from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() class G1Connection(Module): diff --git a/dimos/robot/unitree/connection/g1sim.py b/dimos/robot/unitree/connection/g1sim.py index 07602fd736..8a81c06af9 100644 --- a/dimos/robot/unitree/connection/g1sim.py +++ b/dimos/robot/unitree/connection/g1sim.py @@ -34,7 +34,7 @@ if TYPE_CHECKING: from dimos.robot.unitree_webrtc.mujoco_connection import MujocoConnection -logger = setup_logger(__file__) +logger = setup_logger() class G1SimConnection(Module): diff --git a/dimos/utils/logging_config.py b/dimos/utils/logging_config.py index ca5b2f979c..d846342359 100644 --- a/dimos/utils/logging_config.py +++ b/dimos/utils/logging_config.py @@ -106,7 +106,7 @@ def _configure_structlog() -> Path: return _LOG_FILE_PATH -def setup_logger(level: int | None = None) -> Any: +def setup_logger(*, level: int | None = None) -> Any: """Set up a structured logger using structlog. Args: From 54872724ab03a4cdd5fe746d7f5cf41042a10661 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 3 Dec 2025 04:07:31 +0200 Subject: [PATCH 10/10] fix mypy error --- dimos/robot/unitree_webrtc/unitree_g1_blueprints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dimos/robot/unitree_webrtc/unitree_g1_blueprints.py b/dimos/robot/unitree_webrtc/unitree_g1_blueprints.py index 8f8f480ada..0ebceac51e 100644 --- a/dimos/robot/unitree_webrtc/unitree_g1_blueprints.py +++ b/dimos/robot/unitree_webrtc/unitree_g1_blueprints.py @@ -20,7 +20,7 @@ """ from dimos_lcm.foxglove_msgs import SceneUpdate # type: ignore[import-untyped] -from dimos_lcm.foxglove_msgs.ImageAnnotations import ( +from dimos_lcm.foxglove_msgs.ImageAnnotations import ( # type: ignore[import-untyped] ImageAnnotations, ) from dimos_lcm.sensor_msgs import CameraInfo # type: ignore[import-untyped]