Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 0 additions & 22 deletions dimos/stream/video_operators.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import cv2
import numpy as np
from reactivex import Observable, Observer, create, operators as ops
import zmq

if TYPE_CHECKING:
from dimos.stream.frame_processor import FrameProcessor
Expand Down Expand Up @@ -215,27 +214,6 @@ def with_optical_flow(
ops.map(frame_processor.visualize_flow),
)

@staticmethod
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this random change have to do with this PR @paul-nechifor

def with_zmq_socket(
socket: zmq.Socket, # type: ignore[type-arg]
scheduler: Any | None = None,
) -> Callable[[Observable], Observable]: # type: ignore[type-arg]
def send_frame(frame, socket) -> None: # type: ignore[no-untyped-def]
_, img_encoded = cv2.imencode(".jpg", frame)
socket.send(img_encoded.tobytes())
# print(f"Frame received: {frame.shape}")

# Use a default scheduler if none is provided
if scheduler is None:
from reactivex.scheduler import ThreadPoolScheduler

scheduler = ThreadPoolScheduler(1) # Single-threaded pool for isolation

return lambda source: source.pipe(
ops.observe_on(scheduler), # Ensure this part runs on its own thread
ops.do_action(lambda frame: send_frame(frame, socket)),
)

@staticmethod
def encode_image() -> Callable[[Observable], Observable]: # type: ignore[type-arg]
"""
Expand Down
2 changes: 1 addition & 1 deletion docker/python/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,4 @@ COPY . /app/

# Install dependencies with UV (10-100x faster than pip)
RUN uv pip install --upgrade 'pip>=24' 'setuptools>=70' 'wheel' 'packaging>=24' && \
uv pip install '.[cpu,sim,drone]'
uv pip install '.[misc,cpu,sim,drone,unitree,web,perception,visualization]'
176 changes: 93 additions & 83 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,88 +29,75 @@ requires-python = ">=3.10"
readme = "README.md"

dependencies = [
# Core requirements
"opencv-python",
"numba>=0.60.0", # Python 3.12 support
"llvmlite>=0.42.0", # Required by numba 0.60+
"python-dotenv",
"openai",
"anthropic>=0.19.0",
"cerebras-cloud-sdk",
"moondream",
# Transport Protocols
"dimos-lcm",
"PyTurboJPEG==1.8.2",

# Core
"numpy>=1.26.4",
"rerun-sdk>=0.20.0",
"scipy>=1.15.1",
"reactivex",
"asyncio==3.4.3",
"sortedcontainers==2.4.0",
"pydantic",
"python-dotenv",

# Multiprocess
"dask[complete]==2025.5.1",
"plum-dispatch==2.5.7",

# Logging
"structlog>=25.5.0,<26",
"colorlog==6.9.0",

# Core Msgs
"opencv-python",
"open3d",

# CLI
"pydantic-settings>=2.11.0,<3",
"textual==3.7.1",
"terminaltexteffects==0.12.2",
"typer>=0.19.2,<1",
"plotext==5.3.2",

# Used for calculating the occupancy map.
"numba>=0.60.0", # First version supporting Python 3.12
"llvmlite>=0.42.0", # Required by numba 0.60+
]


[project.scripts]
lcmspy = "dimos.utils.cli.lcmspy.run_lcmspy:main"
foxglove-bridge = "dimos.utils.cli.foxglove_bridge.run_foxglove_bridge:main"
skillspy = "dimos.utils.cli.skillspy.skillspy:main"
agentspy = "dimos.utils.cli.agentspy.agentspy:main"
humancli = "dimos.utils.cli.human.humanclianim:main"
dimos = "dimos.robot.cli.dimos:main"

[project.optional-dependencies]
misc = [
# Core requirements
"cerebras-cloud-sdk",
"yapf==0.40.2",
"typeguard",
"empy==3.3.4",
"catkin_pkg",
"lark",
"plum-dispatch==2.5.7",
"ffmpeg-python",
"tiktoken>=0.8.0",
"Flask>=2.2",
"python-multipart==0.0.20",
"reactivex",
"asyncio==3.4.3",
"unitree-webrtc-connect-leshy>=2.0.7",
"tensorzero==2025.7.5",
"structlog>=25.5.0,<26",

# Web Extensions
"fastapi>=0.115.6",
"sse-starlette>=2.2.1",
"uvicorn>=0.34.0",

# MCP Server
"mcp>=1.0.0",

# Agents
"langchain>=1,<2",
"langchain-chroma>=1,<2",
"langchain-core>=1,<2",
"langchain-openai>=1,<2",
"langchain-text-splitters>=1,<2",
"langchain-huggingface>=1,<2",
"langchain-ollama>=1,<2",
"bitsandbytes>=0.48.2,<1.0; sys_platform == 'linux'",
"ollama>=0.6.0",

# Class Extraction
"pydantic",

# Developer Specific
"ipykernel",

# Unitree webrtc streaming
"pycryptodome",
"sounddevice",
"pyaudio",
"requests",
"wasmtime",

# Image
"PyTurboJPEG==1.8.2",

# Audio
"openai-whisper",
"soundfile",

# Hugging Face
"transformers[torch]==4.49.0",

# Vector Embedding
"sentence_transformers",

# Perception Dependencies
"ultralytics>=8.3.70",
"filterpy>=1.4.5",
"scipy>=1.15.1",
"scikit-learn",
"Pillow",
"clip",
"timm>=1.0.15",
"lap>=0.5.12",
"opencv-contrib-python==4.10.0.84",

# embedding models
Expand All @@ -120,41 +107,65 @@ dependencies = [
"tensorboard==2.20.0",

# Mapping
"open3d",
"googlemaps>=4.10.0",

# Inference
"onnx",
"einops==0.8.1",
# Multiprocess
"dask[complete]==2025.5.1",

# LCM / DimOS utilities
"dimos-lcm==0.1.0",

# CLI
"pydantic-settings>=2.11.0,<3",
"typer>=0.19.2,<1",
"plotext==5.3.2",

# Teleop
"pygame>=2.6.1",
# Hardware SDKs
"xarm-python-sdk>=1.17.0",
]

"numba>=0.60.0", # First version supporting Python 3.12
"llvmlite>=0.42.0", # Required by numba 0.59+
visualization = [
"rerun-sdk>=0.20.0",
]

[project.scripts]
lcmspy = "dimos.utils.cli.lcmspy.run_lcmspy:main"
foxglove-bridge = "dimos.utils.cli.foxglove_bridge.run_foxglove_bridge:main"
skillspy = "dimos.utils.cli.skillspy.skillspy:main"
agentspy = "dimos.utils.cli.agentspy.agentspy:main"
humancli = "dimos.utils.cli.human.humanclianim:main"
dimos = "dimos.robot.cli.dimos:main"
agents = [
"langchain>=1,<2",
"langchain-chroma>=1,<2",
"langchain-core>=1,<2",
"langchain-openai>=1,<2",
"langchain-text-splitters>=1,<2",
"langchain-huggingface>=1,<2",
"langchain-ollama>=1,<2",
"bitsandbytes>=0.48.2,<1.0; sys_platform == 'linux'",
"ollama>=0.6.0",
"anthropic>=0.19.0",

# Audio
"openai",
"openai-whisper",
"sounddevice",

# MCP Server
"mcp>=1.0.0",
]

web = [
"fastapi>=0.115.6",
"sse-starlette>=2.2.1",
"uvicorn>=0.34.0",
"ffmpeg-python",
"soundfile",
]

perception = [
"ultralytics>=8.3.70",
"filterpy>=1.4.5",
"Pillow",
"lap>=0.5.12",
"transformers[torch]==4.49.0",
"moondream",
]

unitree = [
"dimos[agents,web,perception,visualization]",
"unitree-webrtc-connect-leshy>=2.0.7"
]

[project.optional-dependencies]
manipulation = [
# Contact Graspnet Dependencies
"h5py>=3.7.0",
Expand Down Expand Up @@ -215,7 +226,6 @@ dev = [
"pytest-env==1.1.5",
"pytest-timeout==2.4.0",
"coverage>=7.0", # Required for numba compatibility (coverage.types)
"textual==3.7.1",
"requests-mock==1.12.1",
"terminaltexteffects==0.12.2",
"watchdog>=3.0.0",
Expand Down
Loading
Loading