Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
b7e48e3
feat: Initial commit
albertoperdomo2 Apr 13, 2026
b575b03
refactor: move llm_d config and phases
albertoperdomo2 Apr 15, 2026
1c707d6
feat: Add llm_d model cache
albertoperdomo2 Apr 16, 2026
be5a512
fix: Lint after rebase
albertoperdomo2 Apr 16, 2026
d97dc9b
refactor: Separate llm_d scheduler profiles
albertoperdomo2 Apr 20, 2026
58abf11
refactor: Rename llm_d capture toolbox
albertoperdomo2 Apr 20, 2026
6155c42
fix: Harden llm_d runtime command handling
albertoperdomo2 Apr 20, 2026
a066d98
fix: Make NFD prepare idempotent
albertoperdomo2 Apr 21, 2026
819b46b
fix: Run llm_d smoke in helper job
albertoperdomo2 Apr 21, 2026
7d4b39b
feat: Add llm_d scheduler profiles
albertoperdomo2 Apr 21, 2026
332adc3
refactor: Split llm_d runtime helpers
albertoperdomo2 May 3, 2026
acc95e9
refactor: Add llm_d phase input boundary
albertoperdomo2 May 3, 2026
f7d0d1a
refactor: Convert llm_d cleanup and model-cache phases to DSL tasks
albertoperdomo2 May 3, 2026
31c8c5f
refactor: Inline llm_d prepare and test task logic
albertoperdomo2 May 3, 2026
2098bcd
chore: Reorder tests within project
albertoperdomo2 May 3, 2026
7698ebe
fix: Install Forge dependencies for pytest CI
albertoperdomo2 May 4, 2026
e1f8862
refactor: Move llm_d shared runtime out of orchestration
albertoperdomo2 May 5, 2026
5ca7bbd
refactor: Normalize llm_d project configuration layout
albertoperdomo2 May 5, 2026
d5186a7
test: Align llm_d runtime coverage with explicit inputs
albertoperdomo2 May 5, 2026
9a5f333
refactor: Deduplicate DSL toolbox path helpers
albertoperdomo2 May 5, 2026
629d3bc
docs: Refresh llm_d layout references
albertoperdomo2 May 5, 2026
6b0ef9e
Merge branch 'main' into feat/downstream-llm-d
albertoperdomo2 May 5, 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
8 changes: 4 additions & 4 deletions .github/workflows/test_toolbox_dsl.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Unit tests for projects/core/dsl (task decorators, execute_tasks, failure/always/skip).
name: Toolbox DSL tests
# Python tests for repo-managed suites discovered via pyproject testpaths.
name: Python test suites

on:
pull_request:
Expand Down Expand Up @@ -29,9 +29,9 @@ jobs:
run: |
set -o errexit
python -m pip install --upgrade pip
python -m pip install pytest pyyaml jinja2 jsonpath_ng
python -m pip install .[dev]

- name: Run projects/core/tests
- name: Run pytest suites
run: |
set -o errexit
# Tree + docstrings (what is being tested), then execute with one line per test + result.
Expand Down
30 changes: 5 additions & 25 deletions projects/core/dsl/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,17 @@ def setup_clean_logger(name: str):
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)

# Only configure if not already configured
if not logger.handlers:
# Create console handler with clean format
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(logging.Formatter("%(message)s"))

logger.addHandler(console_handler)

logger.propagate = False # Don't propagate to root logger
logger.propagate = False
return logger


# Configure clean logging for DSL operations
logger = setup_clean_logger("DSL")


Expand All @@ -45,30 +42,23 @@ def log_task_header(task_name: str, task_doc: str, rel_filename: str, line_no: i

def log_execution_banner(function_args: dict = None, log_file: str = None):
"""Log the execution banner with function info and arguments"""
# Get the caller's filename and function name for the header
frame = inspect.currentframe()
caller_frame = (
frame.f_back.f_back
) # Go back 2 frames (this func -> execute_tasks -> actual caller)
caller_frame = frame.f_back.f_back
filename = caller_frame.f_code.co_filename

rel_filename = _get_forge_relative_path(filename)

# Use parent directory name as function name for toolbox operations
function_name = _get_toolbox_function_name(filename)

# Print execution header
logger.info("")
logger.info("===============================================================================")
logger.info(f"| FILE: {rel_filename}")
logger.info(f"| COMMAND: {function_name}")

if function_args:
# Display arguments in YAML format
logger.info("| ARGUMENTS:")

for key, value in function_args.items():
if key == "function_args": # Skip the function_args parameter itself
if key == "function_args":
continue
if value is None:
continue
Expand All @@ -83,19 +73,13 @@ def log_execution_banner(function_args: dict = None, log_file: str = None):

def log_completion_banner(function_args: dict = None, status: str = "SUCCESS"):
"""Log the completion banner with function info and completion status"""
# Get the caller's filename and function name for the header
frame = inspect.currentframe()
caller_frame = (
frame.f_back.f_back
) # Go back 2 frames (this func -> execute_tasks -> actual caller)
caller_frame = frame.f_back.f_back
filename = caller_frame.f_code.co_filename

rel_filename = _get_forge_relative_path(filename)

# Use parent directory name as function name for toolbox operations
function_name = _get_toolbox_function_name(filename)

# Print completion header
logger.info("")
logger.info("===============================================================================")
logger.info(f"| {rel_filename}")
Expand All @@ -115,8 +99,4 @@ def _get_forge_relative_path(filename):

def _get_toolbox_function_name(filename):
"""Extract toolbox function name from file path (parent directory name)"""
filename_path = Path(filename)

# For paths like projects/llm_d/toolbox/capture_isvc_state/main.py
# Return the parent directory name: capture_isvc_state
return filename_path.parent.name
return Path(filename).parent.name
23 changes: 7 additions & 16 deletions projects/core/dsl/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,13 @@
from projects.core.library.run import SignalError

from .context import create_task_parameters
from .log import log_completion_banner, log_execution_banner, logger
from .log import (
_get_forge_relative_path,
_get_toolbox_function_name,
log_completion_banner,
log_execution_banner,
logger,
)
from .script_manager import get_script_manager

# Import from task.py to avoid circular imports
Expand Down Expand Up @@ -471,18 +477,3 @@ def _generate_restart_script(function_args: dict, caller_frame, meta_dir):
os.chmod(restart_file, 0o755)

logger.debug(f"Generated restart script: {restart_file}")


def _get_forge_relative_path(filename):
"""Get file path relative to FORGE home directory (forge root)"""

return Path(filename).relative_to(env.FORGE_HOME)


def _get_toolbox_function_name(filename):
"""Extract toolbox function name from file path (parent directory name)"""
filename_path = Path(filename)

# For paths like projects/llm_d/toolbox/capture_isvc_state/main.py
# Return the parent directory name: capture_isvc_state
return filename_path.parent.name
19 changes: 17 additions & 2 deletions projects/core/library/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -472,8 +472,6 @@ def init(orchestration_dir, *, apply_config_overrides=True):

project = Config(config_path)

env.ARTIFACT_DIR / VARIABLE_OVERRIDES_FILENAME

if not apply_config_overrides:
logger.info(
"config.init: running with 'apply_config_overrides=False', "
Expand All @@ -489,3 +487,20 @@ def init(orchestration_dir, *, apply_config_overrides=True):
project.apply_config_overrides()
project.apply_presets_from_project_args()
project.apply_config_overrides() # reapply so that the value overrides are applied last


def reload(orchestration_dir, *, apply_config_overrides=True):
global project

project = None

artifact_config = env.ARTIFACT_DIR / "config.yaml"
if artifact_config.exists():
artifact_config.unlink()

presets_applied = env.ARTIFACT_DIR / "presets_applied"
if presets_applied.exists():
presets_applied.unlink()

init(orchestration_dir, apply_config_overrides=apply_config_overrides)
return project
Loading
Loading