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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .github/requirements-ci.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,5 @@ pytest==9.0.3
PyYAML==6.0.3
sniffio==1.3.1
typing_extensions==4.16.0
setuptools==68.1.2; python_version == "3.12"
wheel==0.42.0; python_version == "3.12"
38 changes: 38 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,48 @@ jobs:
run: python -m unittest discover -s .github/scripts -p 'test_*.py'
- name: Core and OpenClaw fixture tests
run: python -m unittest discover -s hermes-owner-mode/tests
- name: Installed wheel setup resources
if: matrix.python == '3.12'
env:
PIP_NO_INDEX: '1'
PIP_DISABLE_PIP_VERSION_CHECK: '1'
run: |
python tools/package_assets.py --check
python -m unittest discover -s packaging -p 'test_*.py'
python -m pip wheel --no-deps --no-build-isolation --wheel-dir "$RUNNER_TEMP/flashalign-wheel" .
python packaging/check_wheel.py "$RUNNER_TEMP"/flashalign-wheel/aevonix_flashalign-*.whl
- name: Shared engine gate and replay tests
env:
PYTHONPATH: engines/common
run: python -m unittest discover -s engines/tests
- name: SGLang lifecycle protocol tests
run: python -m unittest discover -s engines/common -p test_sglang_lifecycle.py
- name: Portable benchmark evidence
if: matrix.python == '3.12'
working-directory: benchmarks/evidence/qwen-sglang-20261101
run: |
python -B -S recompute.py
python -B -S -m unittest -q test_recompute
- name: Install CPU tensor test dependency
if: matrix.python == '3.12'
run: |
python -m pip install --index-url https://download.pytorch.org/whl/cpu 'torch==2.13.0+cpu'
python -m pip install 'safetensors==0.8.0'
- name: Verify CPU tensor test dependency
if: matrix.python == '3.12'
run: python -c "import torch, safetensors; assert torch.__version__ == '2.13.0+cpu'; assert safetensors.__version__ == '0.8.0'"
- name: Projection generation and failed-hook rollback tests
if: matrix.python == '3.12'
env:
PYTHONPATH: engines/vllm
CUDA_VISIBLE_DEVICES: ''
run: python -m pytest -q engines/vllm/tests/test_generations.py
- name: SGLang graph-generation contract tests
if: matrix.python == '3.12'
env:
PYTHONPATH: engines/sglang
CUDA_VISIBLE_DEVICES: ''
run: python -m pytest -q engines/sglang/tests/test_graph_contract.py
- name: Native DeepSeek contract and lifecycle tests
run: python -m pytest -q engines/vllm-deepseek-native/tests
- name: Shell and JavaScript syntax
Expand Down
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,30 @@
# Changelog

## 1.2.0

- Keep one active Hermes plugin registration per process across duplicate loads and reloads.
- Include fixed identity-verification reasons in each request's audit record.
- Profile staging, activation, rollback and retirement through local administration.
- Immutable generations and worker recovery contracts for serving adapters.
- Status, doctor and terminal dashboard commands.
- Pinned FR443 collection, durable semantic judging and evidence exports.
- Distinguish a busy evaluation lock from invalid evaluation data.
- Qwen FR443 results and a paired SGLang timing study with reproducible data.
- Artifact-bound profile evaluation and controlled calibration sweeps.
- Shared request authentication and extensible engine, model, channel and profile registries.
- Complete runtime installation for managed engines and harnesses.
- Include engine kits, starter profiles and harness assets in the Python package.
- Check container memory limits before starting native DeepSeek.
- Automatic native profile-control startup and SSH profile staging for remote TensorFold deployments.
- Preserve saved profile state across restarts, including an empty inventory or deactivated aliases.
- Keep managed SSH forwards attached to their supervisor when SSH multiplexing is enabled.
- Record managed launch attempts before starting workers and preserve ownership through interrupted starts.
- Preserve the active Hermes policy and refresh message observers across plugin reloads and host renderer replacements.
- Share one configurable shutdown deadline across managed engine workers.
- Verify external engine resources are stopped before confirming managed shutdown.
- Report reused prefix tokens in the DeepSeek TensorFold runtime.
- Handle atomic status-file replacement without interrupting a managed engine.

## 1.0.0

Initial Aevonix FlashAlign release:
Expand Down
45 changes: 40 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**ReAlign models instantly, on demand.**

By Aevonix Research · Version 1.1.1
By Aevonix Research · Version 1.2.0

[![Stock DeepSeek V4.1 Flash refuses to help make a realistic-looking ID for a theatrical role; with FlashAlign on, the same model answers it](assets/demo/flashalign-promo-preview.gif)](https://aevonix.github.io/FlashAlign/)

Expand All @@ -18,7 +18,7 @@ changing them. Run it directly, with Hermes or OpenClaw, or through your own
harness. Managed inference runs on Linux with NVIDIA GPUs. See
[compatibility](docs/compatibility.md) for DGX Spark support and engine requirements.

The V1 starter profiles focus on refusal reduction. Future profiles could also
The starter profiles focus on refusal reduction. Future profiles could also
increase refusals for public or higher-risk tasks.

Restricting abliteration to verified users and channels reduces the risk of an
Expand Down Expand Up @@ -70,9 +70,9 @@ See [compatibility](docs/compatibility.md#engines-and-models) for hardware
requirements, pinned checkpoints and feature limits, and
[validation](docs/validation.md) for tested configurations and results.

Switching happens per request among profiles already loaded by the engine.
Loading a new model or profile happens beforehand and can require an engine
restart.
Switching happens per request. Engines that advertise profile hot loading can
also add compatible profiles without a restart. Loading another model still
requires its own engine setup. See [profile management](docs/profile-lifecycle.md).

Use `--model-path /path/to/model` to select a model. Run `bash ./install.sh` to
connect to an engine that is already running. See the
Expand Down Expand Up @@ -103,6 +103,38 @@ bash ./install.sh --detect
The [setup guide](docs/setup.md) covers connection and activation. The engine's
effective-profile response confirms that the selected profile is active.

## Check and manage your deployment

After setup, run:

```sh
bash ./flashalign.sh status
bash ./flashalign.sh doctor --probe
bash ./flashalign.sh dashboard
bash ./flashalign.sh profile list
```

Status reads runtime metadata. Doctor sends a synthetic request only with
`--probe`. The dashboard shows measured values when the engine provides them.
See [operations](docs/operations.md), [profile management](docs/profile-lifecycle.md)
and [benchmarks](docs/benchmarks.md).

## Measured results

On Qwen3.8-27B, the automated FR443 judge counted **289 refusals in 443 stock
responses** and **11 in 443 profile responses**. The suite includes safe,
harmful and unsafe requests. Human audit and broader capability testing remain
pending. [Full results and settings](docs/qwen-fr443-results.md).

A separate Qwen/SGLang timing study measured **1.324× end-to-end completion-token
throughput** for the opt-in graph Owner Mode path compared with the previous
release's eager path. This was a fixed 256-token workload with three pairs of
engine starts, not a decode-speed measurement. [Timing results and reproducible data](docs/qwen-sglang-timing.md).

A fixed follow-up passed completion and GSM8K, but did not establish all
capability gates. Eager remains the default and graphs remain opt-in.
[Quality results and limits](docs/qwen-sglang-quality.md).

## Choose when to apply FlashAlign

**Verified contacts** is the default. It applies a profile to messages from an
Expand Down Expand Up @@ -197,6 +229,8 @@ requirements.
## Documentation

- [Setup and activation](docs/setup.md)
- [Status, doctor and dashboard](docs/operations.md)
- [Live profile management](docs/profile-lifecycle.md)
- [Managed engine setup](docs/engine-setup.md)
- [Agent-assisted setup](docs/agent-setup.md)
- [Harness and model compatibility](docs/compatibility.md)
Expand All @@ -208,6 +242,7 @@ requirements.
- [Hermes configuration](hermes-owner-mode/README.md)
- [OpenClaw adapter](openclaw-owner-mode/README.md)
- [Engine API](docs/engine-contract.md)
- [Extension interfaces](docs/extending.md)
- [Security model and vulnerability reports](SECURITY.md)
- [Development and tests](CONTRIBUTING.md)
- [Vector logos and brand kit](assets/brand/README.md)
Expand Down
7 changes: 7 additions & 0 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,13 @@ does not establish permission to redistribute every compatible checkpoint.

## Installed dependencies

The refusal-evaluation judge includes rubric text from
[Blackfrost-AI/r1-false-refusal-443](https://github.com/Blackfrost-AI/r1-false-refusal-443)
at revision `a2a8051a3f4ff2593f6b6e9c22f9929b3244c742`, under Apache-2.0.
See the [rubric notice](flashalign/notices/BLACKFROST-NOTICE.md) and included
[license](flashalign/notices/APACHE-2.0.txt). The source prompt corpus is not
bundled; its underlying datasets retain their applicable source terms.

The dependency declarations in `pyproject.toml`, `hermes-owner-mode/requirements*.txt`
and each engine package record the installed packages and version constraints.
They include HTTP and configuration libraries, NumPy, safetensors,
Expand Down
7 changes: 7 additions & 0 deletions benchmarks/evaluation-limits.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"max_response_bytes": 16777216,
"max_events": 65536,
"max_sse_event_bytes": 16777216,
"max_record_bytes": 67108864,
"max_judge_request_bytes": 67108864
}
Loading