Antares CLI
Model-assisted, file-level vulnerability localization for source repositories, powered by Foundation AI Antares models.
Antares reports candidate files for human review. It does not currently provide line-level locations, code snippets, or remediation, and model results can vary between identical runs. Treat every result as a lead to verify, not as proof that code is vulnerable or safe.
Model access: Follow the current access instructions on each Hugging Face model card. If authentication is required, authenticate the model server that downloads the weights.
Requirements and installation
Antares CLI requires:
- Python 3.11 or later;
uvfor the installation commands below;- Linux or macOS (native Windows is not currently supported);
- a streaming OpenAI-compatible inference endpoint implementing
POST /v1/completions; and - standard POSIX inspection utilities.
ripgrep(rg) andtreeare recommended.
Install the released CLI from PyPI:
uv tool install cisco-antares-cli
Install from a source checkout instead:
uv tool install .
Or install a downloaded wheel:
uv tool install ./dist/cisco_antares_cli-*.whl
For development:
uv sync --group dev
Use uv tool upgrade cisco-antares-cli to upgrade an existing PyPI installation.
Serve and configure a model
Antares requires a streaming OpenAI-compatible POST /v1/completions
endpoint. Chat completions are not equivalent: their server-side chat template
changes the raw Antares tool prompt. The served model name must exactly match
the model ID configured in the CLI.
This contract is validated with vLLM 0.19.1; pin that version when reproducing the tested setup. Replace the repository and served name with the exact checkpoint you intend to run:
export HF_TOKEN="your-hugging-face-token"
export MODEL_REPOSITORY="your-org/your-antares-checkpoint"
export SERVED_MODEL_NAME="your-exact-model-id"
vllm serve "$MODEL_REPOSITORY" \
--served-model-name "$SERVED_MODEL_NAME" \
--host 0.0.0.0 \
--port 8000 \
--trust-remote-code \
--dtype bfloat16 \
--max-model-len 16384 \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.90 \
--generation-config vllm
HF_TOKEN is used by the model server to download weights. It is separate from
the optional credential used by Antares to call an authenticated inference
endpoint. Use a single GPU with enough VRAM for the selected checkpoint and its
16K context; only increase tensor parallelism when one GPU cannot hold it.
Create a user-owned profile in ~/.antares/profiles.toml. The endpoint-neutral
defaults match the Antares deployment contract even when the exact model ID is
not in the CLI's small display catalog: raw completions, 16,384 context tokens,
4,096 maximum output tokens, temperature 0.3, top-p 1.0, frequency penalty 0.3,
the Antares stop tokens, and a 300-second cold-start timeout. The values are
shown explicitly here for reproducibility and may be omitted from the profile:
[profiles.hosted-antares]
display_name = "Hosted Antares"
model = "your-exact-model-id"
backend = "remote"
endpoint_env = "ANTARES_ENDPOINT"
api_key_env = "ANTARES_API_KEY"
context_window = 16384
remote_timeout_seconds = 300
[profiles.hosted-antares.generation]
max_tokens = 4096
temperature = 0.3
top_p = 1.0
frequency_penalty = 0.3
stop_tokens = ["<|end_of_text|>", "<|start_of_role|>"]
use_completions_api = true
Point the profile at the full completions route. Set the credential only when the inference endpoint requires bearer authentication:
export ANTARES_ENDPOINT="http://localhost:8000/v1/completions"
export ANTARES_API_KEY="your-endpoint-key"
Confirm that the configured model ID and endpoint are the intended values, then run an explicit CWE query or a repository-aware sweep:
antares models list
antares query ./your-project --cwe CWE-89 --profile hosted-antares
antares sweep ./your-project --profile hosted-antares
Antares sends the configured model value unchanged. Profiles are connection
configuration, not aliases: do not rely on a provider to rewrite the model ID.
Running antares without a subcommand opens the setup wizard when both stdin
and stdout are interactive terminals. In non-interactive environments it prints
help instead.
Models
| Canonical model ID | Hugging Face model | Intended use |
|---|---|---|
antares-350m |
fdtn-ai/antares-350m | Lower-resource and quick scans |
antares-1b |
fdtn-ai/antares-1b | General code audits and deeper scans |
The model card for the checkpoint you host is the source of truth for access
requirements and weight metadata. Antares sends the model ID selected with
--model, ANTARES_MODEL, or a profile exactly as provided. It does not map
legacy names to these canonical IDs.
Command modes
| Command | Behavior |
|---|---|
antares query PATH --cwe CWE-... |
Runs one investigation for one or more explicit CWE IDs. |
antares sweep PATH |
Runs one independent investigation per explicit or automatically selected CWE. |
antares plan PATH |
Shows automatic selection and rationale without model inference. |
antares models list |
Lists configured inference profiles. |
antares runs ... |
Inspects local run history and investigation traces. |
antares tool query --stdin |
Runs a query from a JSON request and prints JSON. |
antares tool sweep --stdin |
Runs a sweep from a JSON request and prints JSON. |
PATH must be an existing, readable repository directory. Add request-specific
guidance with --query (-q). For a sweep, that guidance is applied to every
CWE investigation.
Sensitive files are excluded from local profiling, immutable snapshots, and model tools by default. When a scan genuinely requires one, authorize only that exact repository-relative file at runtime:
antares query ./your-project \
--cwe CWE-798 \
--allow-sensitive-file .env.example \
--allow-sensitive-file tests/fixtures/test-key.pem
Repeat --allow-sensitive-file for additional files. Globs, directories,
symlinks, absolute paths, parent traversal, missing files, and unprotected files
are rejected. The equivalent tool JSON field is an array named
allow_sensitive_files.
Run antares COMMAND --help for the complete option reference.
Sweep selection and tool budgets
When --cwe is omitted, a sweep selects up to 50 CWE targets and executes up
to 8 investigations concurrently by default:
# Change the number of selected targets.
antares sweep ./your-project --max-cwes 20
# Change concurrency independently (1-32).
antares sweep ./your-project --workers 4
--max-cwes controls the number of automatically selected targets, capped by
the eligible catalog entries. --workers controls endpoint concurrency. An
explicit --cwe list preserves the requested order and is not truncated by
--max-cwes:
antares sweep ./your-project --cwe CWE-89,CWE-78,CWE-918
Automatic selection uses the bundled MITRE CWE 4.20 taxonomy (released 2026-04-30; 969 weaknesses) and repository evidence. Candidate scopes are:
auto: repository-aware selection from the non-deprecated catalog;top25: the bundled MITRE CWE Top 25 set; andowasp: the bundled MITRE view of the OWASP Top Ten.
Use --cwe-level to filter automatic candidates to pillar, class, base,
variant, or compound; the default is all. Inspect the exact selection
without contacting an inference endpoint:
antares plan ./your-project
antares plan ./your-project --scope top25
antares plan ./your-project --scope owasp --cwe-level base --max-cwes 20
antares plan ./your-project --format json
Each investigation may make up to 15 model-requested repository tool calls by default.
Set a value from 1 through 50 with --tool-budget. A query receives one budget;
each sweep target receives its own budget.
antares query ./your-project --cwe CWE-89 --tool-budget 30
antares sweep ./your-project --tool-budget 30
Output and exit status
Every completed query or sweep saves JSON, Markdown, and SARIF reports by
default. Antares creates one private directory per execution under
~/.local/share/antares-cli/reports/ (or $ANTARES_DATA_DIR/reports/) and
prints a clickable path when the scan finishes:
Reports (JSON, Markdown, SARIF) → …/reports/EXECUTION_ID
Each report directory contains report.json, report.md, and report.sarif.
Omitting --report-format is equivalent to --report-format all; both save all
three files. Use --output to choose a different directory. Use a named
--report-format when a consumer needs one format, or repeat the option for a
subset:
# Save all three formats in a chosen directory.
antares query ./your-project --cwe CWE-89 --output ./reports/order-audit
# Explicitly save all three formats (the same behavior as omitting this option).
antares query ./your-project --cwe CWE-89 --report-format all
# Save only JSON.
antares query ./your-project --cwe CWE-89 --report-format json
# Save JSON and SARIF.
antares sweep ./your-project \
--report-format json --report-format sarif
# Do not save shareable report artifacts.
antares query ./your-project --cwe CWE-89 --no-report
--format json, --format markdown, and --format sarif serialize one format
to stdout for pipelines. Saved reports are still generated unless
--no-report is present. The report-directory link, selection diagnostics, and
warnings are written to stderr so machine-readable stdout stays valid. Using
--format disables the sweep TUI.
Without --format, query renders a human-readable scan summary followed by
finding cards. An interactive sweep uses the TUI; use --no-tui for the same
headless terminal summary. The summary reports completion status, finding and
affected-file counts, CWE coverage, duration, and operational warnings before
showing findings. Markdown reports use the same outcome-first organization and
group findings by filename, then by canonical CWE ID and name.
Serialized reports and antares tool responses omit local invocation details,
Git metadata, Python executable paths, and private investigation-trace paths.
They retain the target directory label, model/request metadata, and any explicit
--query text; do not put secrets in scan instructions.
Findings identify files and CWE IDs. submission_rank is the model's one-based
ordering within one investigation; sweep ranks are local to each CWE and are not
a global ranking. SARIF locations are file-level and currently use note severity.
For the query and sweep commands:
| Exit code | Meaning |
|---|---|
0 |
The requested work completed. Findings may still be present. |
1 |
The work completed with findings and --fail-on-findings was set. |
2 |
The invocation or configuration was invalid, or model/worker failure left the result incomplete. |
Incomplete results are still emitted with warnings before exit 2. Antares then
attempts to record an incomplete history entry; an unwritable history directory
produces a warning without discarding the result.
Use --fail-on-findings in CI only when candidate findings should fail the job.
JSON automation interface
antares tool accepts a JSON object on stdin (up to 1,000,000 characters) and
prints a JSON result on stdout.
Shared request fields:
| Field | Type | Default | Notes |
|---|---|---|---|
target |
string | . |
Existing, readable repository directory. |
cwe_ids |
string or string array | none | Required for query; optional for sweep. |
query |
string or null | null | Additional investigation instructions. |
profile |
string or null | null | Named connection profile. |
model |
string or null | configured model | Served model ID, sent exactly as provided. |
backend |
string or null | remote |
Inference backend. |
endpoint |
string or null | configured endpoint | OpenAI-compatible endpoint. |
api_key |
string or null | configured credential | Prefer an environment variable or profile. |
tool_budget |
integer | 15 |
Range 1-50, per investigation. |
Sweep-only fields:
| Field | Type | Default | Notes |
|---|---|---|---|
workers |
integer | 8 |
Concurrent investigations, range 1-32. |
selection.scope |
string | auto |
auto, top25, or owasp. |
selection.cwe_level |
string | all |
all, pillar, class, base, variant, or compound. |
selection.max_cwes |
integer | 50 |
Positive automatic-selection limit. |
The three selection fields may alternatively be supplied at the top level.
Do not supply the same field in both locations; ambiguous requests are rejected.
printf '%s\n' \
'{"target":"./your-project","cwe_ids":["CWE-89"],"tool_budget":20}' \
| antares tool query --stdin
printf '%s\n' \
'{"target":"./your-project","workers":4,"selection":{"scope":"owasp","cwe_level":"base","max_cwes":20}}' \
| antares tool sweep --stdin
Tool commands exit 2 when operational failures make a result incomplete; candidate findings alone do not change their exit status.
Configuration
Antares contains model behavior defaults but no hosted inference connection. The simplest runtime configuration uses environment variables:
| Variable | Purpose |
|---|---|
ANTARES_ENDPOINT |
Base URL for the inference endpoint. |
ANTARES_API_KEY |
Optional bearer credential for that endpoint. |
ANTARES_MODEL |
Required served model ID, sent exactly as provided. |
ANTARES_REMOTE_TIMEOUT_SECONDS |
Total inference request deadline; defaults to 300 seconds for cold starts. |
ANTARES_IGNORE_PATHS |
Comma-separated paths or a JSON string array to exclude. |
ANTARES_DATA_DIR |
Local history and trace directory. |
For named connections, create ~/.antares/profiles.toml:
[profiles.local-vllm]
display_name = "Local vLLM"
model = "antares-1b"
backend = "remote"
endpoint = "http://localhost:8000/v1/completions"
api_key_env = "ANTARES_API_KEY"
Endpoint URLs and credentials can both be resolved indirectly:
[profiles.managed-runtime]
model = "antares-1b"
backend = "remote"
endpoint_env = "INFERENCE_ENDPOINT"
api_key_env = "INFERENCE_API_KEY"
Keep profiles outside repositories and keep credential values in environment variables or a secret manager, not in TOML. Inspect available profiles with:
antares models list
antares query ./your-project --cwe CWE-89 --profile local-vllm
A repository .antares.toml is deliberately untrusted. Its only accepted
setting is ignore_paths; model, endpoint, backend, credential, timeout, and
data-directory values in that file are ignored. It cannot authorize sensitive
files; --allow-sensitive-file or the matching tool JSON field must be supplied
for each invocation.
ignore_paths = [
".env",
"secrets/**",
"generated/**",
]
Repository isolation and data handling
query and sweep send request instructions, repository paths, the initial file
list, and source content selected during model-requested inspection to the
configured inference endpoint. Only scan code that you are authorized to send
to that endpoint; Antares does not control endpoint-side logging or retention.
plan performs local profiling only and does not contact an inference endpoint.
Before inference, Antares creates a temporary snapshot of eligible repository files. The model's command executor runs inside that snapshot, never in the working copy. Write permissions are removed, symlinks that resolve outside the repository are discarded, and model-issued commands are restricted to a parsed allowlist of read-only inspection utilities without network clients.
Files matching .env*, private-key extensions (.pem, .key, .p12, .pfx,
.jks, and .keystore), common credential filenames, or credential directories
such as .ssh, .aws, .azure, .docker, .gnupg, .kube, and gcloud are
omitted unless individually authorized. Authorized relative paths are retained
in run metadata for auditability; file contents are never added to authorization
logs.
The snapshot excludes these directory names by default:
.antares-data .git .gradle .hg .mypy_cache
.nox .pytest_cache .ruff_cache .svn .tox
.venv .worktrees __pycache__ node_modules venv
Repository .gitignore rules are not automatically applied. Source-bearing
directories named build, dist, target, or vendor are scanned by default;
add generated or irrelevant instances to .antares.toml before scanning.
Snapshot limits are 100,000 files, 2 GiB total, and 256 MiB for any one file.
If a repository exceeds a limit, Antares stops before inference and identifies
the path or budget to reduce with ignore_paths.
Run history and trace exports
Every successful or failed scan attempts to record local provenance. By default Antares
uses ~/.local/share/antares-cli; set ANTARES_DATA_DIR to choose another
location. If the default location has no writable parent, Antares falls back to
.antares-data in the current directory. Default report bundles use the same
data root under reports/; run records and investigation traces remain under
their existing private directories.
If history persistence fails, Antares warns on stderr and preserves completed
terminal or JSON output. An explicitly requested --export cannot be built
without its private history record and exits 2 after preserving any report that
was already written. Export filenames must end in .tar.gz.
Private local investigation traces may contain prompts, model responses, source excerpts, tool commands and results, request instructions, repository paths, and Git metadata. They persist until you remove them. Review them with:
antares runs list
antares runs show RUN_ID --summary
antares runs trace RUN_ID
antares runs trace RUN_ID --cat
Create a portable bundle from a completed scan or from history:
antares query ./your-project --cwe CWE-89 --export run.tar.gz
antares runs export RUN_ID --output run.tar.gz
Portable exports redact raw trace message content, tool arguments, tool-result
summaries, ingest paths and queries, endpoint URLs, and known credential fields.
They retain run provenance, request metadata, invocation data, repository and
finding file paths, Git metadata, model configuration, findings, and errors.
Request metadata may include --query text. Inspect every bundle before sharing
it and never place secrets in request instructions.
Git provenance includes the repository root, commit, branch, and sanitized origin
URL when available. Antares deliberately does not inspect working-tree status:
git status can execute repository-configured content filters in an untrusted
target. Targets whose .git marker is a file (including linked worktrees and
submodules) omit Git provenance rather than following an external Git directory.
Shell completion
Generate a completion script from the live command tree for bash, zsh,
fish, powershell, or pwsh:
antares completion zsh
Save or source the generated script using the normal completion mechanism for your shell. PowerShell completion generation does not imply native Windows scan support.
Licensing and third-party notices
Antares CLI includes a derived snapshot of the MITRE Common Weakness
Enumeration taxonomy. The required MITRE copyright designation and license are
reproduced in THIRD_PARTY_NOTICES.md and shipped
beside the CWE data inside the Python package. The current upstream terms are
available from the official CWE Terms of
Use.
The MITRE terms apply only to the CWE-derived content. Antares CLI source code is licensed under the Apache License 2.0.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cisco_antares_cli-0.1.0.tar.gz.
File metadata
- Download URL: cisco_antares_cli-0.1.0.tar.gz
- Upload date:
- Size: 604.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ade5f4c5d1b55a245c5b4c15b0a09200353603ba3e3d683d3da21f5908b307a3
|
|
| MD5 |
59fe9d54e2f4dcd60cf326fc4b5a5d14
|
|
| BLAKE2b-256 |
03f30f3601cad306c491e840ce30dd61f025555f46f964af9fabd5bef172df9c
|
Provenance
The following attestation bundles were made for cisco_antares_cli-0.1.0.tar.gz:
Publisher:
release.yml on cisco-foundation-ai/antares-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cisco_antares_cli-0.1.0.tar.gz -
Subject digest:
ade5f4c5d1b55a245c5b4c15b0a09200353603ba3e3d683d3da21f5908b307a3 - Sigstore transparency entry: 2521022820
- Sigstore integration time:
-
Permalink:
cisco-foundation-ai/antares-cli@bcea940c8f2f42f8b81819662f5593380415cb34 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/cisco-foundation-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@bcea940c8f2f42f8b81819662f5593380415cb34 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cisco_antares_cli-0.1.0-py3-none-any.whl.
File metadata
- Download URL: cisco_antares_cli-0.1.0-py3-none-any.whl
- Upload date:
- Size: 545.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2f712733ec15014794124b5f21de0f9143b21b331570d9ae1ef9cc9537a8759
|
|
| MD5 |
6f2c404dc9789e7143d05be66a148a2e
|
|
| BLAKE2b-256 |
0724909c00700dc12720e1ee91ee50c49af5969538d90041936ef97681cc0c95
|
Provenance
The following attestation bundles were made for cisco_antares_cli-0.1.0-py3-none-any.whl:
Publisher:
release.yml on cisco-foundation-ai/antares-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cisco_antares_cli-0.1.0-py3-none-any.whl -
Subject digest:
c2f712733ec15014794124b5f21de0f9143b21b331570d9ae1ef9cc9537a8759 - Sigstore transparency entry: 2521022853
- Sigstore integration time:
-
Permalink:
cisco-foundation-ai/antares-cli@bcea940c8f2f42f8b81819662f5593380415cb34 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/cisco-foundation-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@bcea940c8f2f42f8b81819662f5593380415cb34 -
Trigger Event:
push
-
Statement type: