Catalog PyPI
Back to packageRELEASE DETAILS

0.6.0

PyPI

abslang

Agent Behavior Specification — describe, run, and evaluate AI agent interactions from the command line

agentaibehaviorevaluationllmopenapispecificationtesting
Published29 Sept 2026
Direct dependencies10
Transitive dependenciesNot calculated

README

Version 0.6.0 documentation

ABS — Agent Behavior Specification

Specify how your AI agents behave — then verify it.

PyPI version npm version Tests License

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
OptionDescription
--agent <url>Agent endpoint URL (or set ABS_AGENT_URL)
--dataset <path>JSON/JSONL dataset file
--var key=valueSingle variable binding (repeatable)
--filter key:valueFilter dataset rows
--agent-formatopenai (default), responses, claude, or gemini
--agent-authnone, api_key, bearer, or oauth2
--agent-tokenAuth token or API key
--agent-refresh-urlOAuth2 token refresh URL
--agent-refresh-tokenOAuth2 refresh token
--agent-client-idOAuth2 client ID
--agent-modelModel/deployment for model endpoints (e.g. Azure OpenAI Responses) — omit when the agent owns its model
--agent-forward-authForward the caller's Authorization header to the agent
--agent-authorizationRaw Authorization header value to forward
--adapter llm_judge=<name>Route LLM evaluations through an adapter (aievaluator, azure, aws, google) — see below
--judge-base-urlBuilt-in judge on a custom OpenAI-compatible endpoint (Azure/Foundry, Ollama, vLLM)
--judge-api-keyBuilt-in judge API key (overrides ABS_JUDGE_API_KEY / OPENAI_API_KEY)
--judge-api-key-headerHeader for the judge key (default Authorization; use api-key for Azure)
--judge-modelBuilt-in judge model or Azure deployment name
--formattable (default), json, or junit
--ciCI 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
--log-formatpretty (default) or jsonl (one event per line)
--log-levelerror, warn, info (default), debug
--log-fileWrite machine-readable JSONL events to a file
--no-log-contentOmit trace content and reasons from logs (privacy)

You can also run the module directly: python -m abslang run ....

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 + safety dimensions):

# 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

Point the same judge at any OpenAI-compatible endpoint — CLI flags override the ABS_JUDGE_BASE_URL, ABS_JUDGE_API_KEY, ABS_JUDGE_API_KEY_HEADER, and ABS_JUDGE_MODEL environment variables:

abslang run session.abs.yaml --agent $URL \
  --judge-base-url "https://<resource>.openai.azure.com/openai/v1" \
  --judge-api-key "$AZURE_OPENAI_API_KEY" \
  --judge-api-key-header api-key \
  --judge-model gpt-4o-mini

Azure AI Foundry (quality dimensions + agentic evaluators):

pip install "abslang[azure]"
export AZURE_OPENAI_ENDPOINT=... AZURE_OPENAI_KEY=... AZURE_OPENAI_DEPLOYMENT=...
abslang run session.abs.yaml --agent $URL --adapter azure

AWS Bedrock (LLM-as-judge):

pip install "abslang[aws]"
export AWS_REGION=us-east-1
abslang run session.abs.yaml --agent $URL --adapter aws

Google Vertex AI (quality + safety):

pip install "abslang[google]"
export GOOGLE_CLOUD_PROJECT=... GOOGLE_CLOUD_LOCATION=us-central1
abslang run session.abs.yaml --agent $URL --adapter google

AI Evaluator (free tier):

abslang run session.abs.yaml --agent $URL --adapter llm_judge=aievaluator

Safety dimensions (Violence, HateUnfairness, Sexual, SelfHarm) work with the built-in judge out of the box — no criteria required. Other providers 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

License

Apache 2.0

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 10

Native requirements
10 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
click
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
click>=8.0runtime
httpx
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
httpx>=0.27runtime
jsonschema
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
jsonschema>=4.0runtime
pyyaml
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pyyaml>=6.0runtime
rich
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
rich>=13.0runtime
aievaluator
Environment
{
  "extras": "",
  "marker": "extra == \"ai\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
aievaluator; extra == "ai"runtime
boto3
Environment
{
  "extras": "",
  "marker": "extra == \"aws\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
boto3; extra == "aws"runtime
azure-ai-evaluation
Environment
{
  "extras": "",
  "marker": "extra == \"azure\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
azure-ai-evaluation; extra == "azure"runtime
azure-ai-projects
Environment
{
  "extras": "",
  "marker": "extra == \"azure-cloud\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
azure-ai-projects; extra == "azure-cloud"runtime
google-cloud-aiplatform
Environment
{
  "extras": "",
  "marker": "extra == \"google\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
google-cloud-aiplatform; extra == "google"runtime

Distribution files

2 collected
abslang-0.6.0-py3-none-any.whl

bdist_wheel · 87.3 KB · Python py3

Source file
abslang-0.6.0.tar.gz

sdist · 100.21 KB · Python source

Source file

Repository

PENDING
fvinciarelli/abslang

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 17:37 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:21c4d45c0da1f2dacf4dfcd57a427c38f20bdbebc5741ee003fc5fcad4a64155

Other collected versions

View all collected versions →