Agent Behavior Specification (ABS)
A vendor-neutral, human-readable format for describing the observable behavior of AI agents — what users say, what agents do, and how it should be evaluated. Like OpenAPI for HTTP APIs, ABS gives agent behavior a shared, tool-independent contract.
📖 Full documentation · 📦 GitHub
Install
pip install abslang
Commands
abslang init
Scaffold a new ABS project with an example session and dataset.
abslang init
Creates abs.config.yaml, sessions/order-status.abs.yaml, and sessions/order-status.jsonl (3 rows).
abslang run
Execute ABS sessions against an agent.
# Single session
abslang run sessions/order-status.abs.yaml --agent http://localhost:8080/chat
# With a dataset (parametrized testing — one run per row)
abslang run sessions/order-status.abs.yaml --agent $URL --dataset sessions/order-status.jsonl
# With a single variable override
abslang run sessions/order-status.abs.yaml --agent $URL --var orderId=12345
# All sessions in a directory
abslang run sessions/ --agent $URL --dataset datasets/
# CI mode with JUnit output
abslang run sessions/ --agent $STAGING --dataset datasets/ --format junit --ci > report.xml
| Option | Description |
|---|---|
--agent <url> |
Agent endpoint URL (or set ABS_AGENT_URL) |
--dataset <path> |
JSON/JSONL dataset file |
--var key=value |
Single variable binding (repeatable) |
--filter key:value |
Filter dataset rows |
--agent-format |
openai (default), claude, or gemini |
--agent-auth |
none, api_key, bearer, or oauth2 |
--agent-token |
Auth token or API key |
--adapter llm_judge=<name> |
Route LLM evaluations through an adapter (aievaluator, local, azure) — see below |
--format |
table (default), json, or junit |
--ci |
CI mode (no colors) |
--timeout <n> |
Timeout per session in seconds (default: 300) |
--output <path> |
Write report to file |
--parallel <n> |
Run N dataset rows in parallel |
abslang report
View results from a previous abslang run --output.
abslang report report.json # Table view
abslang report report.json --format json # Machine-readable
abslang report report.json --format junit # CI integration
abslang report report.json --failed # Only failed cases
abslang report report.json --detail 3 # Full trace for row #3
abslang chat
Generate ABS YAML by describing the behavior in plain language.
# Works with OpenAI, Anthropic, or DeepSeek — auto-detects from env
abslang chat
# Or specify a provider
abslang chat --provider openai
abslang chat --provider anthropic
abslang chat --provider deepseek
# You: A customer asks for a refund. The agent should verify the order, process it, and confirm.
# → generates .abs.yaml with evaluations, datasets, and chain checks
Commands inside chat: /save <path>, /force <path>, /quit.
abslang generate-ci
Generate a CI/CD workflow file.
abslang generate-ci --platform github # GitHub Actions
abslang generate-ci --platform gitlab # GitLab CI
LLM judge adapters
Evaluations like llm_judge, Groundedness, and Relevance need an LLM to produce the judgment. abslang routes them through an adapter — you pick where the judgment runs.
Built-in judge (zero setup, llm_judge only):
# Auto-detects OpenAI, Anthropic, or Gemini from env
OPENAI_API_KEY=sk-... abslang run session.abs.yaml --agent $URL
ANTHROPIC_API_KEY=sk-ant-... abslang run session.abs.yaml --agent $URL
AI Evaluator (currently the only adapter available for dimension types):
abslang run session.abs.yaml --agent $URL --adapter llm_judge=aievaluator
Private LLM (Ollama, vLLM, any OpenAI-compatible endpoint):
abslang run session.abs.yaml --agent $URL \
--adapter llm_judge=local \
--adapter-url http://localhost:11434/v1
Other providers (Azure, Vertex AI, LangSmith, Galileo) can ship adapters implementing the same interface. Your session file doesn't change — only the --adapter flag.
Test with the mock agent
# Terminal 1: start mock agent
python tools/mock_agent.py --scenario happy
# Terminal 2: run the example
abslang run examples/order-status.yaml --agent http://localhost:8080/chat
Library usage
from abslang import parse, run
from abslang.runner import AgentConfig
import asyncio
session = parse('session.abs.yaml')
result = asyncio.run(run(session, AgentConfig(
url='http://localhost:8080/chat',
format='openai',
)))
print(result.passed) # True | False
Links
- 📖 Documentation
- 📦 GitHub
- 📋 Specification
- 📝 Examples
- 🐛 Issues
License
Apache 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 abslang-0.1.3.tar.gz.
File metadata
- Download URL: abslang-0.1.3.tar.gz
- Upload date:
- Size: 31.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
47e7d5dfa2007bc37a02e5e1286d63682392b38b02c805055a57c29f14cfddf0
|
|
| MD5 |
f3c336c6bd75e0175949c0f9cef49a26
|
|
| BLAKE2b-256 |
f24d3bd60c319a563dc3d14737d8ae0540ee3b2938dd884bdad3c8c356f73ae8
|
Provenance
The following attestation bundles were made for abslang-0.1.3.tar.gz:
Publisher:
publish-pypi.yml on fvinciarelli/abslang
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
abslang-0.1.3.tar.gz -
Subject digest:
47e7d5dfa2007bc37a02e5e1286d63682392b38b02c805055a57c29f14cfddf0 - Sigstore transparency entry: 2361192242
- Sigstore integration time:
-
Permalink:
fvinciarelli/abslang@95f4f505558f6f07e32d0ae75681b0f3ac801049 -
Branch / Tag:
refs/tags/python-v0.1.3 - Owner: https://github.com/fvinciarelli
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@95f4f505558f6f07e32d0ae75681b0f3ac801049 -
Trigger Event:
push
-
Statement type:
File details
Details for the file abslang-0.1.3-py3-none-any.whl.
File metadata
- Download URL: abslang-0.1.3-py3-none-any.whl
- Upload date:
- Size: 35.0 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 |
1bf035be3e70d45ae9dd2ab5b2166c223316f375b40f4da62e3b9f1b5276b712
|
|
| MD5 |
29fa820c833303af9cd9660a2bfb443f
|
|
| BLAKE2b-256 |
e3f1be28f2f7e6926c00e3de530c5d5e5a7ef999ab38fac3c4d65e0f5c4279bf
|
Provenance
The following attestation bundles were made for abslang-0.1.3-py3-none-any.whl:
Publisher:
publish-pypi.yml on fvinciarelli/abslang
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
abslang-0.1.3-py3-none-any.whl -
Subject digest:
1bf035be3e70d45ae9dd2ab5b2166c223316f375b40f4da62e3b9f1b5276b712 - Sigstore transparency entry: 2361192386
- Sigstore integration time:
-
Permalink:
fvinciarelli/abslang@95f4f505558f6f07e32d0ae75681b0f3ac801049 -
Branch / Tag:
refs/tags/python-v0.1.3 - Owner: https://github.com/fvinciarelli
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@95f4f505558f6f07e32d0ae75681b0f3ac801049 -
Trigger Event:
push
-
Statement type: