Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
da3bf59
Merge pull request #1056 from dimensionalOS/dev - Pre-Release v0.0.8:…
spomichter Jan 23, 2026
1668860
Merge pull request #1092 - v0.0.9 Release Patch: Git clone change to …
spomichter Jan 23, 2026
e330165
Merge pull request #1336 from dimensionalOS/dev
spomichter Feb 21, 2026
c76620b
Merge pull request #1340 from dimensionalOS/dev
spomichter Feb 21, 2026
5daada5
add docker example
jeff-hykin Mar 5, 2026
1412542
add docker module system
jeff-hykin Mar 5, 2026
b63bf73
fixup
jeff-hykin Mar 5, 2026
580eda4
fix rerun imports
jeff-hykin Mar 5, 2026
5374de6
fixup imports
jeff-hykin Mar 5, 2026
bc66a45
fixup
jeff-hykin Mar 5, 2026
d843609
simplify stop logic
jeff-hykin Mar 5, 2026
30254a1
simplify and explain
jeff-hykin Mar 5, 2026
16565b0
parallel start of docker modules
jeff-hykin Mar 5, 2026
9117017
fix container name to be stable
jeff-hykin Mar 5, 2026
ab150fa
lazy import
jeff-hykin Mar 5, 2026
84c045e
clean up
jeff-hykin Mar 5, 2026
4673a6c
Merge branch 'dev' of github.com:dimensionalOS/dimos into jeff/fix/do…
jeff-hykin Mar 5, 2026
b5f9a4d
Merge branch 'dev' into jeff/fix/docker3
jeff-hykin Mar 5, 2026
9ead3fd
revert
jeff-hykin Mar 5, 2026
b98d5d0
cleanup
jeff-hykin Mar 5, 2026
2fed467
fixup deploy_parallel
jeff-hykin Mar 5, 2026
9b7696b
clean up reconnect logic
jeff-hykin Mar 5, 2026
3ec6070
fixup
jeff-hykin Mar 5, 2026
e06be8e
-
jeff-hykin Mar 5, 2026
06181ed
fix deployment/coordinator timeline
jeff-hykin Mar 5, 2026
d87ab95
fir enforcement of either dockerfile or image pull
jeff-hykin Mar 5, 2026
b3d24ef
fix reconnect system
jeff-hykin Mar 5, 2026
83cb7c7
-
jeff-hykin Mar 5, 2026
d62396b
fix deploy_parallel
jeff-hykin Mar 5, 2026
20aa4f1
better error
jeff-hykin Mar 5, 2026
3459853
clean container name generation
jeff-hykin Mar 5, 2026
5538b65
fixup typing for ModuleProxy
jeff-hykin Mar 5, 2026
52146f2
misc
jeff-hykin Mar 5, 2026
3cf2dff
testing fixup
jeff-hykin Mar 5, 2026
8eaed57
maintain order
jeff-hykin Mar 5, 2026
55c234d
refine
jeff-hykin Mar 6, 2026
d9d4716
make pull out configurable
jeff-hykin Mar 6, 2026
215e9ba
have example show using normal config
jeff-hykin Mar 6, 2026
1f8ab0a
Add DockerWorkerManager
jeff-hykin Mar 6, 2026
4536ce1
add proper cleanup handling if a module fails to deploy correctly
jeff-hykin Mar 6, 2026
59c5cc0
mypy fixup
jeff-hykin Mar 6, 2026
5d46c8b
-
jeff-hykin Mar 6, 2026
c72b380
add docker_build_ssh and image rebuild check
jeff-hykin Mar 7, 2026
6e0a5c5
simplify
jeff-hykin Mar 7, 2026
2b4adae
misc
jeff-hykin Mar 7, 2026
cb83f9a
add docker_build_extra_args
jeff-hykin Mar 7, 2026
7ae8d89
Merge branch 'dev' into jeff/fix/docker3
jeff-hykin Mar 7, 2026
c74c5b9
PR review fixes: better error messages, consistent API, restore insta…
jeff-hykin Mar 7, 2026
45ee6fe
fix pull problem
jeff-hykin Mar 7, 2026
029a863
fix reconnect edgecase and __getattr__ loop edgecase
jeff-hykin Mar 7, 2026
5106445
change the ignore postfix
jeff-hykin Mar 7, 2026
8829761
fix docker defaults, make deploy better
jeff-hykin Mar 8, 2026
068b0ad
misc
jeff-hykin Mar 8, 2026
75268de
fix mypy
jeff-hykin Mar 9, 2026
f38e4be
fix ExceptionGroup edgecase
jeff-hykin Mar 9, 2026
6a08e30
Merge branch 'dev' into jeff/fix/docker3
jeff-hykin Mar 9, 2026
39df404
Merge branch 'dev' of github.com:dimensionalOS/dimos into jeff/fix/do…
jeff-hykin Mar 11, 2026
56518bf
Merge pull request #1526 from dimensionalOS/dev
spomichter Mar 12, 2026
c1fa920
Merge pull request #1530 from dimensionalOS/dev
spomichter Mar 12, 2026
e986d38
Merge pull request #1532 from dimensionalOS/dev
spomichter Mar 12, 2026
f206464
Merge pull request #1537 from dimensionalOS/dev
spomichter Mar 12, 2026
e26e771
Merge remote-tracking branch 'origin' into jeff/fix/docker3
jeff-hykin Mar 13, 2026
5bc5c7d
chore: resolve conflicts with dev
jeff-hykin Mar 13, 2026
985ecd7
fix: update Docker deployment to use ModuleSpec format
jeff-hykin Mar 13, 2026
9802b28
chore: resolve conflicts with dev
jeff-hykin Mar 14, 2026
5d994c1
fix(mypy): cover import-not-found for onnxruntime type: ignore
jeff-hykin Mar 14, 2026
dd3251e
fix: remove section markers from hello_docker.py and untrack .venv
jeff-hykin Mar 14, 2026
9830a8e
style: fix formatting in hello_docker.py
jeff-hykin Mar 14, 2026
cbc4617
fix: address review comments on hello_docker example
jeff-hykin Mar 15, 2026
42366e1
fix: resolve merge conflict with dev (uv.lock)
jeff-hykin Mar 15, 2026
780736c
make timeout not hardcoded
jeff-hykin Mar 15, 2026
66a6567
docs: add clarifying comment for deploy_parallel lambda tuple
jeff-hykin Mar 15, 2026
1d3f123
feat: port rpc_timeouts system from jeff/fix/rosnav3
jeff-hykin Mar 15, 2026
cc2212c
Merge branch 'jeff/fix/docker3' of github.com:dimensionalOS/dimos int…
jeff-hykin Mar 15, 2026
747bbe2
CI code cleanup
jeff-hykin Mar 15, 2026
c2d2643
fixup rpc timeouts, cause they matter for docker
jeff-hykin Mar 15, 2026
427949f
Merge branch 'dev' of github.com:dimensionalOS/dimos into jeff/fix/do…
jeff-hykin Mar 15, 2026
54d4592
better matching logic for rpc_timeouts
jeff-hykin Mar 15, 2026
1598545
enforce RPCSpec's to have rpc_timeouts in constructor
jeff-hykin Mar 15, 2026
8a36843
Remove pr-name-check from this branch
jeff-hykin Mar 15, 2026
7ad090f
fixup rpc timeouts
jeff-hykin Mar 15, 2026
d0563a8
mypy issue on dev
jeff-hykin Mar 15, 2026
639e90c
equality
jeff-hykin Mar 15, 2026
5a41e06
Merge branch 'jeff/fix/docker3' of github.com:dimensionalOS/dimos int…
jeff-hykin Mar 15, 2026
5c85dc2
fix: docker module init + rpc timeout bugs
jeff-hykin Mar 15, 2026
9668e3a
fix(example): use 'cowsay' not '/usr/games/cowsay' per review
jeff-hykin Mar 15, 2026
fba0a71
CI code cleanup
jeff-hykin Mar 16, 2026
f6a5602
Merge origin/dev into jeff/fix/docker3
jeff-hykin Mar 17, 2026
593c418
fix: address Paul's PR review comments
jeff-hykin Mar 17, 2026
4278166
fix(ci): fix _DummyRPC init and mypy type-ignore for rpc_transport kw…
jeff-hykin Mar 19, 2026
47737b0
fix(mypy): add __all__ to vl/create.py for explicit VlModelName export
jeff-hykin Mar 19, 2026
157ce93
fix(test): wrap coordinator in try/finally for proper cleanup on test…
jeff-hykin Mar 19, 2026
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
2 changes: 1 addition & 1 deletion dimos/agents_deprecated/memory/image_embedding.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def __init__(self, model_name: str = "clip", dimensions: int = 512) -> None:
def _initialize_model(self): # type: ignore[no-untyped-def]
"""Initialize the specified embedding model."""
try:
import onnxruntime as ort # type: ignore[import-untyped]
import onnxruntime as ort # type: ignore[import-untyped,import-not-found]
import torch # noqa: F401
from transformers import ( # type: ignore[import-untyped]
AutoFeatureExtractor,
Expand Down
90 changes: 60 additions & 30 deletions dimos/core/docker_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

from __future__ import annotations

import hashlib
import subprocess
from typing import TYPE_CHECKING

Expand All @@ -32,10 +33,11 @@

logger = setup_logger()

# Timeout for quick Docker commands
_BUILD_HASH_LABEL = "dimos.build.hash"

DOCKER_CMD_TIMEOUT = 20

# Sentinel value to detect already-converted Dockerfiles (UUID ensures uniqueness)
# the way of detecting already-converted Dockerfiles (UUID ensures uniqueness)
DIMOS_SENTINEL = "DIMOS-MODULE-CONVERSION-427593ae-c6e8-4cf1-9b2d-ee81a420a5dc"

# Footer appended to Dockerfiles for DimOS module conversion
Expand All @@ -53,28 +55,6 @@
"""


def _run(cmd: list[str], *, timeout: float | None = None) -> subprocess.CompletedProcess[str]:
"""Run a command and return the result."""
return subprocess.run(cmd, capture_output=True, text=True, timeout=timeout, check=False)


def _run_streaming(cmd: list[str]) -> int:
"""Run command and stream output to terminal. Returns exit code."""
result = subprocess.run(cmd, text=True)
return result.returncode


def _docker_bin(cfg: DockerModuleConfig) -> str:
"""Get docker binary path."""
return cfg.docker_bin or "docker"


def _image_exists(docker_bin: str, image_name: str) -> bool:
Copy link
Member Author

Choose a reason for hiding this comment

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

bloat removed

"""Check if a Docker image exists locally."""
r = _run([docker_bin, "image", "inspect", image_name], timeout=DOCKER_CMD_TIMEOUT)
return r.returncode == 0


def _convert_dockerfile(dockerfile: Path) -> Path:
"""Append DimOS footer to Dockerfile. Returns path to converted file."""
content = dockerfile.read_text()
Expand All @@ -85,32 +65,82 @@ def _convert_dockerfile(dockerfile: Path) -> Path:

logger.info(f"Converting {dockerfile.name} to DimOS format")

converted = dockerfile.parent / f".{dockerfile.name}.dimos"
converted = dockerfile.parent / f".{dockerfile.name}.ignore"
converted.write_text(content.rstrip() + "\n" + DIMOS_FOOTER.lstrip("\n"))
return converted


def _compute_build_hash(cfg: DockerModuleConfig) -> str:
"""Hash Dockerfile contents and build args."""
assert cfg.docker_file is not None
digest = hashlib.sha256()
digest.update(cfg.docker_file.read_bytes())
for key, val in sorted(cfg.docker_build_args.items()):
digest.update(f"{key}={val}".encode())
for arg in cfg.docker_build_extra_args:
digest.update(arg.encode())
return digest.hexdigest()


def _get_image_build_hash(cfg: DockerModuleConfig) -> str | None:
"""Read the build hash label from an existing Docker image."""
r = subprocess.run(
[
cfg.docker_bin,
"image",
"inspect",
"-f",
'{{index .Config.Labels "' + _BUILD_HASH_LABEL + '"}}',
cfg.docker_image,
],
capture_output=True,
text=True,
timeout=DOCKER_CMD_TIMEOUT,
check=False,
)
if r.returncode != 0:
return None
value = r.stdout.strip()
# docker prints "<no value>" when the label is missing
return value if value and value != "<no value>" else None


def build_image(cfg: DockerModuleConfig) -> None:
"""Build Docker image using footer mode conversion."""
if cfg.docker_file is None:
raise ValueError("docker_file is required for building Docker images")

build_hash = _compute_build_hash(cfg)
dockerfile = _convert_dockerfile(cfg.docker_file)

context = cfg.docker_build_context or cfg.docker_file.parent
cmd = [_docker_bin(cfg), "build", "-t", cfg.docker_image, "-f", str(dockerfile)]
cmd = [cfg.docker_bin, "build", "-t", cfg.docker_image, "-f", str(dockerfile)]
cmd.extend(["--label", f"{_BUILD_HASH_LABEL}={build_hash}"])
for k, v in cfg.docker_build_args.items():
cmd.extend(["--build-arg", f"{k}={v}"])
cmd.extend(cfg.docker_build_extra_args)
cmd.append(str(context))

logger.info(f"Building Docker image: {cfg.docker_image}")
exit_code = _run_streaming(cmd)
if exit_code != 0:
raise RuntimeError(f"Docker build failed with exit code {exit_code}")
# Stream stdout to terminal so the user sees build progress, but capture
# stderr separately so we can include it in the error message on failure.
result = subprocess.run(cmd, text=True, stderr=subprocess.PIPE)
if result.returncode != 0:
raise RuntimeError(
f"Docker build failed with exit code {result.returncode}\nSTDERR:\n{result.stderr}"
)


def image_exists(cfg: DockerModuleConfig) -> bool:
"""Check if the configured Docker image exists locally."""
return _image_exists(_docker_bin(cfg), cfg.docker_image)
r = subprocess.run(
[cfg.docker_bin, "image", "inspect", cfg.docker_image],
capture_output=True,
text=True,
timeout=DOCKER_CMD_TIMEOUT,
check=False,
)
return r.returncode == 0


__all__ = [
Expand Down
Loading
Loading