Agentic Systems
Agentic Systems gives Python applications one explicit, testable model for building and evaluating agentic workflows across deterministic and model-backed runtimes.
It does so through a computational grammar for building, executing, observing, and evaluating intelligent systems.
Its Python API turns that grammar into explicit, composable abstractions: tools, skills, agents, systems, graphs, environments, evals, contracts, lineage memory and stable human-readable outputs. Runtime and Provider remain separate concepts, so the same computational model supports deterministic execution, OpenAI, AWS Bedrock Runtime and OpenAI-compatible vLLM endpoints through explicit runtime selection.
Use it when agentic workloads need to be observable, testable, portable and ready for repeated execution, not just notebook demos.
Agentic Systems 2.0 keeps explicit traceability between its API, documentation, tutorials, and tests.
API -> Docs -> Tutorials -> explicit automated or manual evidence
Public concepts are defined in the API, explained in the documentation, taught through the canonical tutorials, and checked by explicit release gates.
Release status: 2.0.0 is the Provider x Framework architecture: 78 stable top-level exports, 370 traced export/member IDs, 10 shared contract scenarios, four real Framework adapters, and no silent fallback.
Installation
pip install agentic-systems
import agentic_systems as toolkit
Install the Agentic Systems skill
The v2.0.0 GitHub release includes a credential-free skill ZIP whose archive
root is agentic-systems/.
Expand-Archive .\agentic-systems-skill-2.0.0.zip `
-DestinationPath "$env:USERPROFILE\.codex\skills" -Force
unzip agentic-systems-skill-2.0.0.zip -d ~/.codex/skills
Restart or reload Codex, then invoke $agentic-systems. OpenAI Skills upload
surfaces that accept a ZIP can consume the same artifact. Download the
standalone skill and the complete ten-system Studio from the
v2.0.0 release.
Release assets:
agentic-systems-skill-2.0.0.zip: Codex/OpenAI skill package.agentic-systems-studio-2.0.0.zip: portable Studio with ten nested systems.SHA256SUMS-2.0.0.txt: hashes for the Python and product artifacts.
For an installed-package smoke test and provider notebook setup, follow First Run Onboarding.
Why Agentic Systems
Agent prototypes usually break when they leave the demo path because the important questions are not represented in code:
- Which provider actually ran this workload?
- Which tools were available and which ones were called?
- What evidence supports the answer?
- Can the same behavior be evaluated again?
- Can the same agent run locally, with OpenAI, with Bedrock or with vLLM?
- Can deterministic tools and language-model reasoning share one execution contract?
Agentic Systems represents those concerns as a computational grammar: runtime, tools, contracts, result envelopes, lineage, environments, eval reports and human output are first-class concepts in the same API.
What You Can Build
| Layer | What it gives you |
|---|---|
| Tools | Typed executable capabilities with structured results. |
| Skills | Packaged tools, instructions, contracts, assets and metadata. |
| Agents | Context transformed into actions through deterministic or LM-backed execution. |
| Systems | A native workspace that registers runtime, tools, skills, agents and environments. |
| Graphs | Explicit state, nodes and edges for orchestrating agents and systems. |
| Environments | Episodic execution over records, transitions, rewards and history. |
| Evals | Repeatable validation cases with pass/fail reporting. |
| Lineage Memory | Human-readable explanation of what happened and why. |
| Integrations | Native, LangGraph, OpenAI Agents, and Strands execution over explicit Providers. |
Core Model
Tool -> Skill -> Agent -> System -> Graph -> Environment -> Eval
Runtime, Provider, Contracts, Lineage Memory and Human Output support the whole cycle.
The grammar does not hide complexity. It makes intelligent computation explicit, inspectable, portable and reusable across execution backends.
Runtime And Providers
Runtime selection is explicit and inspectable:
scheduler = toolkit.scheduler(timeout_s=30, max_retries=0, max_tool_calls=5)
runtime = toolkit.runtime(provider="auto", scheduler=scheduler)
toolkit.show(runtime.describe())
Canonical providers:
| Provider | Use |
|---|---|
bedrock-runtime |
AWS Bedrock Runtime provider path. |
openai-runtime |
Direct OpenAI provider path. |
vllm-runtime |
Client path for an existing OpenAI-compatible vLLM endpoint. |
python-runtime |
Local deterministic execution for tools, policies and smoke tests. |
auto |
Selects a concrete provider from environment signals before execution. |
Default provider="auto" priority is bedrock-runtime, then openai-runtime, vllm-runtime, and ollama-runtime. Override it with provider_priority=[...] or AGENTIC_SYSTEMS_PROVIDER_PRIORITY=.... Bedrock is considered configured only when both a region and an AWS authentication signal are present. That signal may be the standard AWS credential chain (signed with SigV4) or the native AWS_BEARER_TOKEN_BEDROCK API key; both use the same boto3 bedrock-runtime Provider and a region alone does not outrank another usable Provider.
Canonical framework facades:
| Framework | Use |
|---|---|
langgraph |
LangGraph graph orchestration. |
openai-agents |
OpenAI Agents Runner, native Tools, handoffs, guardrails, sessions and MCP. |
strands |
strands.Agent, native Tools/MCP, hooks and lifecycle. |
Providers decide where inference runs. The selected Framework always owns its orchestration loop, and RunResult.meta["framework_adapter"] records the adapter that executed. Configuration details live in docs/ONBOARDING_FIRST_RUN.md, docs/CLI.md and the layered tutorials/core, tutorials/providers and tutorials/frameworks paths.
From Zero-to-Hero
1. Deterministic Tool Agent
import agentic_systems as toolkit
@toolkit.tool
def add(a: int, b: int) -> dict:
"""Add two integers."""
return {"result": a + b}
agent = toolkit.agent(
name="calculator",
instructions="Use the available tools and return a structured answer.",
tools=[add],
runtime=toolkit.runtime(provider="python-runtime"),
)
result = agent.run({"tool": "add", "input": {"a": 2, "b": 3}})
toolkit.human_result(result)
2. Provider-Backed Agent
runtime = toolkit.runtime(provider="auto")
agent = toolkit.agent(
name="portable_calculator",
instructions="Use tools when useful. Return a concise final answer.",
tools=[add],
runtime=runtime,
)
result = agent.run("Add 10 and 20 using the tool.")
toolkit.human_result(result, pretty=False, show_lineage=True)
3. Native AgenticSystem
Use AgenticSystem when you want a single system boundary that owns runtime, tools, skills, agents and diagnostics.
system = toolkit.system(runtime=toolkit.runtime(provider="python-runtime"))
@system.tool
def multiply(a: int, b: int) -> dict:
return {"result": a * b}
agent = system.agent(
name="multiplier",
instructions="Use registered tools to solve arithmetic requests.",
)
inspection = system.inspect()
inspection.raise_if_errors()
toolkit.show(inspection.to_dict(), title="Static inspection")
print(inspection.human_text())
result = agent.run({"tool": "multiply", "input": {"a": 6, "b": 7}})
toolkit.human_result(result)
4. Skills
A skill packages tools, instructions, contracts, assets and metadata.
skill = toolkit.skill(
name="calculator_skill",
description="Arithmetic tools and instructions.",
tools=[add],
prompts={"instructions": "Use arithmetic tools and return a structured answer."},
)
agent = toolkit.agent(
name="skill_agent",
instructions=skill.instructions,
skills=[skill],
runtime=toolkit.runtime(provider="python-runtime"),
)
5. Graphs
Graphs coordinate state, nodes and edges. They do not replace tools, agents or systems; they orchestrate them.
system = toolkit.system(runtime=toolkit.runtime(provider="python-runtime"))
@system.tool
def double(value: int) -> dict:
return {"value": value * 2, "ok": True}
agent = system.agent(
name="doubler",
instructions="Call double when the input asks for a doubled value.",
tools=["double"],
)
agent_step = toolkit.agent_node(
agent,
input="input",
output=lambda result, _state: {"result": result},
trace=None,
)
graph = toolkit.graph(
nodes={"agent_step": agent_step},
edges=[("START", "agent_step"), ("agent_step", "END")],
engine="portable",
)
state = {
"input": {"tool": "double", "input": {"value": 21}},
"history": [],
}
next_state = graph.run(state)
toolkit.show(next_state, title="Graph state")
6. Environments And Evals
Use environments when execution is episodic. Use evals when behavior must be checked repeatedly.
records = [
{"input": {"tool": "double", "input": {"value": 21}}},
]
def reward_fn(state, row, action, env) -> float:
return 1.0 if state.get("result", {}).get("ok") else 0.0
environment = system.environment(records, graph=graph, reward_fn=reward_fn)
environment.reset(seed=0)
environment.step()
toolkit.show(toolkit.environment_summary(environment), title="Environment summary")
cases = [
{
"name": "double_21",
"input": {"tool": "double", "input": {"value": 21}},
"expected": {"data_contains": {"value": 42, "ok": True}},
}
]
report = system.eval(agent, cases)
toolkit.human_result(report)
report.raise_if_failed()
7. Results, Lineage And Human Output
Every execution returns a stable RunResult envelope with answer, evidence, usage, validation, errors and tool events.
result.final # user-facing answer dictionary
result.data # reusable evidence payload
result.text # text fallback
result.tool_events # executed tool events
result.usage # runtime usage metadata
result.validation # contract validation
result.errors # structured errors
Render one execution or a batch with human_result.
toolkit.human_result(result, pretty=False, show_lineage=True)
toolkit.human_result([result_a, result_b], pretty=False)
Use output schemas when the expected response fields matter:
schema = toolkit.output_schema(["procedure", "final_result"])
answer = toolkit.final_answer(
{"procedure": ["2 + 3"], "final_result": 5},
schema=schema,
)
Lineage Memory explains what happened, how it happened and why the result is supported.
memory = result.lineage(
name="calculator.run",
question="What is 2 + 3?",
goal="Explain the answer from tool evidence.",
)
toolkit.show(memory)
memory.to_prompt_context(max_chars=1200)
Integrations
Use integrations when an external framework should own orchestration while Agentic Systems keeps the same tools, runtime, contracts, lineage and human output conventions.
runtime = toolkit.runtime(provider="auto")
agent = toolkit.agent(
name="portable_agent",
runtime=runtime,
framework="openai-agents",
)
Integration-specific arguments stay owned by the selected framework. Agentic Systems keeps a thin facade; it does not reinterpret or hide framework-specific behavior.
CLI
The package exposes diagnostics and inspection commands:
agentic-systems version
agentic-systems doctor --json
agentic-systems runtime --provider auto --json
agentic-systems api --tier public --json
agentic-systems public-api --all --json
The CLI is for inspection, diagnostics and packaging smoke tests. It should not contain business logic.
Tutorials
The canonical learning path is layered by responsibility:
| Layer | Purpose | Default execution |
|---|---|---|
| tutorials/core | Agentic Systems grammar and composition | Python Runtime, Native Framework, portable Graph |
| tutorials/providers | Inference boundary | Explicit preflight; external execution when configured |
| tutorials/frameworks | Native orchestration SDK | Real SDK offline; Provider auto is optional |
| tutorials/api | Exact public contract | Generated manifest, documentation and CLI/Pytest traceability |
Provider notebooks use one public route and choose Run All:
| Provider | Readiness inputs | Notebook |
|---|---|---|
| OpenAI | OPENAI_API_KEY; OPENAI_MODEL optional | tutorials/providers/01_openai.ipynb |
| vLLM | VLLM_BASE_URL and VLLM_MODEL | tutorials/providers/03_vllm.ipynb |
| Bedrock | Region plus SigV4 credentials or AWS_BEARER_TOKEN_BEDROCK | tutorials/providers/02_bedrock.ipynb |
| Ollama | OLLAMA_MODEL; OLLAMA_BASE_URL optional | tutorials/providers/04_ollama.ipynb |
The Framework notebooks execute LangGraph, OpenAI Agents and Strands SDKs for real with python-runtime; the matrix notebook covers all 20 declared pairs. Optional RUN_LIVE=1 changes only the Provider. RUN_LIVE=0 forces a fully offline validation.
The full ordered inventory of 21 Python notebooks and their 21 CLI mirrors lives in tutorials/README.md. There is no active examples/ root or duplicate notebook route.
Documentation
Use the documentation map to choose the user guide, conceptual model, API/CLI reference or current engineering contracts. Version history is recorded in the changelog; published artifact evidence belongs to GitHub Releases.
Quality Gate
Current verified status:
Version: 2.0.0
PyPI package: agentic-systems
Tests: run `python -m pytest` for the current count
Core coverage: 100.00%
Coverage scope: Bedrock facade and internal package excluded from core; separately gated at 100%
Canonical notebooks: 17 deterministic executed; 3 live Provider notebooks checked statically
Run validation locally:
python -m pytest -q -W error::RuntimeWarning
python -m ruff check src tests
python -m compileall -q src tests tutorials
agentic-systems doctor --json
For full coverage validation:
python -m pytest --cov=agentic_systems --cov-report=term-missing -q
python -m pytest tests/providers -q --cov-config=.coveragerc-bedrock --cov=agentic_systems.providers.bedrock_runtime --cov=agentic_systems.providers.bedrock --cov-report=term-missing
Design Principles
One public import.
Explicit runtime selection.
Provider and framework separation.
Typed tools and predictable payloads.
Stable result envelopes.
Contracts before hidden behavior.
Lineage before opaque answers.
Evaluation before claims.
Diagnostics without leaking secrets.
Tutorials as executable API documentation.
Contact
Author: Jacobo Gerardo Gonzalez Leon
E-Mail 1: jacobogerardo.gonzalez@bbva.com
E-Mail 2: jacoboggleon@gmail.com
LinkedIn: https://www.linkedin.com/in/jacoboggleon/
GitHub Repo: https://www.github.com/JacoboGGLeon/agentic_systems
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 agentic_systems-2.0.0.tar.gz.
File metadata
- Download URL: agentic_systems-2.0.0.tar.gz
- Upload date:
- Size: 187.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59278bb23c4040ba1abf98c41bd42cb96698221d5449818a1aa0dd4be495d5b4
|
|
| MD5 |
b23a6fc0eced85ebfa39675ea34115db
|
|
| BLAKE2b-256 |
466e3bf0190d4227a3e76793ffadfd4350744459e4fe61f068250af3f275c8af
|
File details
Details for the file agentic_systems-2.0.0-py3-none-any.whl.
File metadata
- Download URL: agentic_systems-2.0.0-py3-none-any.whl
- Upload date:
- Size: 214.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28793337cb99d6affe5f76290d65bf1cce29b2989b9da4f562feb7f4afb91494
|
|
| MD5 |
7e30207d503d893a8a673b59c297ab9b
|
|
| BLAKE2b-256 |
bfabf511d5f399ca7eb0a6569fa9ee2d3dea9f7ba6ee8dbc6c8174eb300d9be1
|