Skip to content
Open
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions .githooks/pre-push
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ echo "pre-push: running make typecheck"
make typecheck

# Check extras if they exist and have changes
if [ -d "evaluators/contrib/galileo" ]; then
echo "pre-push: checking evaluators/contrib/galileo"
cd evaluators/contrib/galileo
if [ -d "rules/contrib/galileo" ]; then
echo "pre-push: checking rules/contrib/galileo"
cd rules/contrib/galileo
uv run --extra dev ruff check --config ../../../pyproject.toml src/
uv run --extra dev mypy --config-file ../../../pyproject.toml src/
cd "$REPO_ROOT"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ jobs:
"coverage-server.xml",
"coverage-sdk.xml",
]
contrib_reports = sorted(path.name for path in Path(".").glob("coverage-evaluators-*.xml"))
contrib_reports = sorted(path.name for path in Path(".").glob("coverage-rules-*.xml"))
print(f"files={','.join([*base_reports, *contrib_reports])}")
PY

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr-title.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
server
models
engine
evaluators
rules
ci
docs
infra
Expand Down
38 changes: 19 additions & 19 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,23 +53,23 @@ jobs:
run: |
rm -rf release-dists
mkdir -p release-dists/models
mkdir -p release-dists/evaluators/builtin
mkdir -p release-dists/evaluators/contrib
mkdir -p release-dists/pypi/evaluators
mkdir -p release-dists/rules/builtin
mkdir -p release-dists/rules/contrib
mkdir -p release-dists/pypi/rules
mkdir -p release-dists/sdks/python
mkdir -p release-dists/server

cp -R models/dist release-dists/models/
cp -R evaluators/builtin/dist release-dists/evaluators/builtin/
cp evaluators/builtin/dist/* release-dists/pypi/evaluators/
cp -R rules/builtin/dist release-dists/rules/builtin/
cp rules/builtin/dist/* release-dists/pypi/rules/
cp -R sdks/python/dist release-dists/sdks/python/
cp -R server/dist release-dists/server/

for contrib_dir in evaluators/contrib/*/dist; do
for contrib_dir in rules/contrib/*/dist; do
contrib_name="$(basename "$(dirname "$contrib_dir")")"
mkdir -p "release-dists/evaluators/contrib/$contrib_name"
cp -R "$contrib_dir" "release-dists/evaluators/contrib/$contrib_name/"
cp "$contrib_dir"/* release-dists/pypi/evaluators/
mkdir -p "release-dists/rules/contrib/$contrib_name"
cp -R "$contrib_dir" "release-dists/rules/contrib/$contrib_name/"
cp "$contrib_dir"/* release-dists/pypi/rules/
done

- name: Upload built distributions
Expand Down Expand Up @@ -101,7 +101,7 @@ jobs:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}

publish-evaluators:
publish-rules:
runs-on: ubuntu-latest
needs: [release, publish-models]
if: needs.release.outputs.released == 'true'
Expand All @@ -115,20 +115,20 @@ jobs:
name: release-dists
path: release-dists

- name: Publish evaluator distributions to PyPI
- name: Publish rule distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: release-dists/pypi/evaluators/
packages-dir: release-dists/pypi/rules/
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}

publish-server:
runs-on: ubuntu-latest
needs: [release, publish-evaluators]
needs: [release, publish-rules]
if: >-
always() &&
needs.release.outputs.released == 'true' &&
needs.publish-evaluators.result == 'success'
needs.publish-rules.result == 'success'
permissions:
id-token: write

Expand All @@ -148,11 +148,11 @@ jobs:

publish-sdk:
runs-on: ubuntu-latest
needs: [release, publish-evaluators]
needs: [release, publish-rules]
if: >-
always() &&
needs.release.outputs.released == 'true' &&
needs.publish-evaluators.result == 'success'
needs.publish-rules.result == 'success'
permissions:
id-token: write

Expand All @@ -172,7 +172,7 @@ jobs:

upload-release-assets:
runs-on: ubuntu-latest
needs: [release, publish-models, publish-evaluators, publish-server, publish-sdk]
needs: [release, publish-models, publish-rules, publish-server, publish-sdk]
if: >-
always() &&
needs.release.outputs.released == 'true'
Expand All @@ -194,10 +194,10 @@ jobs:
shopt -s nullglob
assets=(
release-dists/models/dist/*
release-dists/evaluators/builtin/dist/*
release-dists/rules/builtin/dist/*
release-dists/sdks/python/dist/*
release-dists/server/dist/*
release-dists/evaluators/contrib/*/dist/*
release-dists/rules/contrib/*/dist/*
)

if [ ${#assets[@]} -eq 0 ]; then
Expand Down
26 changes: 13 additions & 13 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ Forwarded targets:

## Repo layout (uv workspace members)

- `models/`: shared Pydantic v2 models and evaluator base classes (`models/src/agent_control_models/`)
- `engine/`: **control evaluation engine and evaluator system** — all evaluation logic, evaluator discovery, and evaluator orchestration lives here (`engine/src/agent_control_engine/`)
- `models/`: shared Pydantic v2 models and rule base classes (`models/src/agent_control_models/`)
- `engine/`: **control evaluation engine and rule system** — all evaluation logic, rule discovery, and rule orchestration lives here (`engine/src/agent_control_engine/`)
- `server/`: FastAPI server (`server/src/agent_control_server/`)
- `sdks/python/`: Python SDK — uses engine for evaluation (`sdks/python/src/agent_control/`)
- `evaluators/builtin/`: builtin evaluator implementations (`evaluators/builtin/src/agent_control_evaluators/`)
- `evaluators/contrib/`: optional evaluator packages (e.g., `evaluators/contrib/galileo/`)
- `rules/builtin/`: builtin rule implementations (`rules/builtin/src/agent_control_rules/`)
- `rules/contrib/`: optional rule packages (e.g., `rules/contrib/galileo/`)
- `ui/`: Nextjs based web app to manage agent controls
- `examples/`: runnable examples (ruff has relaxed import rules here)

Expand Down Expand Up @@ -67,16 +67,16 @@ All testing guidance (including "behavior changes require tests") lives in `TEST
4) add SDK wrapper in `sdks/python/src/agent_control/`
5) add tests (server + SDK) and update docs/examples if user-facing

- Add a new builtin evaluator:
1) implement evaluator class extending `Evaluator` in `evaluators/builtin/src/agent_control_evaluators/`
2) use `@register_evaluator` decorator (from `agent_control_evaluators`)
3) add entry point in `evaluators/builtin/pyproject.toml` for auto-discovery
4) add tests in the evaluators/builtin package
5) evaluator is automatically available to server and SDK via `discover_evaluators()`
- Add a new builtin rule:
1) implement rule class extending `Rule` in `rules/builtin/src/agent_control_rules/`
2) use `@register_rule` decorator (from `agent_control_rules`)
3) add entry point in `rules/builtin/pyproject.toml` for auto-discovery
4) add tests in the rules/builtin package
5) rule is automatically available to server and SDK via `discover_rules()`

- Add an external evaluator package:
1) copy `evaluators/contrib/template/` as a starting point
2) implement evaluator class extending `Evaluator` from `agent_control_evaluators`
- Add an external rule package:
1) copy `rules/contrib/template/` as a starting point
2) implement rule class extending `Rule` from `agent_control_rules`
3) add entry point using `org.name` format (e.g., `galileo.luna`)
4) package is discovered automatically when installed alongside agent-control

Expand Down
Loading
Loading