# Agentic Context Engineering (ACE)
Production-ready toolkit for building self-improving OpenAI agents that learn from their own tool executions. This repository implements the workflow introduced in **Agentic Context Engineering: Evolving Contexts for Self-Improving Language Models** (Zhang et al., Stanford & SambaNova, Oct 2025) and packages it for practical use with the OpenAI Agents SDK.
---
## Why ACE?
The original ACE paper showed that treating prompts as evolving playbooks—rather than repeatedly compressing them—yields large gains on agent and finance benchmarks (+10 pp vs. strong baselines) while cutting adaptation cost and latency. Two chronic issues in previous prompt optimizers were called out:
- **Brevity bias** – iterative refiners drift toward terse, generic instructions that drop high-value tactics.
- **Context collapse** – monolithic rewrites can suddenly shrink a carefully curated context to a few lines, erasing institutional knowledge.
ACE solves this by splitting responsibility across three lightweight roles:
| Component | Responsibility | Effect |
|-----------|----------------|--------|
| **Generator** | Execute the task with current context | surfaces success/failure traces |
| **Reflector** | Diagnose trajectories, extract concrete lessons | preserves detail, avoids collapse |
| **Curator** | Merge lessons as *delta* bullets, deduplicate semantically | keeps contexts structured and scalable |
Each insight is a bullet with metadata (usage counts, timestamps, origin tool). Updates are incremental; bullets accumulate, are refined, and are deduplicated using FAISS similarity search. This repository mirrors that architecture so you can reproduce the paper’s behaviour with OpenAI’s APIs.
---
## Repository Tour
- `ace/core/` – Curator, Reflector, and shared interfaces (Bullet, ToolExecution).
- `ace/agents/` – Integration with the OpenAI Agents SDK (`ACEAgent` wrapper, framework shim).
- `ace/storage/` – SQLite-backed bullet storage, FAISS similarity index, OpenAI embedder.
- `examples/` – Standalone demos:
- `simple_test.py` exercises each ACE component in isolation.
- `weather_agent.py` shows ACE wrapped around an OpenAI Agent with reactive tool use.
- `scripts/manage_storage.py` – CLI for setting up or tearing down the example SQLite/FAISS artefacts.
---
## Quick Start
### Prerequisites
- Python ≥ 3.10
- [uv](https://github.com/astral-sh/uv) (recommended) or plain `pip`
- OpenAI API key with access to your chosen models
### Installation
1. **Clone and enter the repo**
```bash
git clone https://github.com/fulkerson-advisors/agentic-context-engineering
cd ace
```
2. **Sync dependencies**
```bash
uv sync
```
3. **Configure environment variables**
```bash
cp .env.example .env
# edit .env with your OpenAI API key and models
```
4. **(Optional) Activate the environment**
```bash
source .venv/bin/activate
```
or prefix commands with `uv run`.
---
## Storage Management
ACE persists two artefact types:
- **SQLite (`*.db`)** – canonical bullet metadata: content, category, tool name, stats.
- **FAISS (`*.faiss`, `*.faiss.meta`)** – semantic index used for deduplication and retrieval.
Use the helper script to manage the example files:
```bash
# Create the default example databases and FAISS indices
uv run python scripts/manage_storage.py setup
# Remove them again
uv run python scripts/manage_storage.py teardown
```
Custom paths are supported:
```bash
uv run python scripts/manage_storage.py setup \
--db tmp/my_agent.db \
--faiss tmp/my_agent.faiss \
--dimension 3072 \
--overwrite
```
> Note: embeddings now live only inside the FAISS index. If you delete the `.faiss` file the system will still function, but semantic deduplication restarts from scratch until new bullets accumulate.
To inspect what’s stored:
- SQLite: `sqlite3 examples/weather_agent.db` → `.tables`, `.schema bullets`, `SELECT * FROM bullets;`
- FAISS: in Python:
```python
from ace.storage.faiss_index import FAISSVectorIndex
index = FAISSVectorIndex(dimension=1536, index_path="examples/weather_agent.faiss")
print(index.index.ntotal)
```
---
## Running the Examples
Ensure storage artefacts exist (`manage_storage.py setup`) and your `.env` contains a valid `OPENAI_API_KEY`.
1. **Core component smoke test**
```bash
uv run python examples/simple_test.py
```
Demonstrates reflective learning and FAISS deduplication without the Agents SDK.
2. **Weather agent with OpenAI Agents SDK**
```bash
uv run python examples/weather_agent.py
```
Shows the full Generator→Reflector→Curator loop as the agent encounters erroneous tool calls, learns ACE bullets, and improves on subsequent queries.
---
## Configuration Reference
`.env.example` documents the supported variables:
| Variable | Purpose | Default behaviour |
|----------|---------|-------------------|
| `OPENAI_API_KEY` | Required for all OpenAI calls | – |
| `OPENAI_MODEL` | Default generation/reflection model | Pass-through unless specialised overrides are set |
| `OPENAI_EMBEDDING_MODEL` | Embedding endpoint | Falls back to `text-embedding-3-small` if unset or non-embedding |
| `OPENAI_REFLECTOR_MODEL` | Reflector override | Falls back to `OPENAI_MODEL` or `gpt-4.1-mini` |
Override per-instance by passing `model=` when creating `OpenAIEmbedder` or `OpenAIReflector`.
---
## Extensibility
ACE’s components are intentionally decoupled so you can swap pieces without rewriting the core loop:
- **Agent frameworks** – `ACEAgent` wraps the OpenAI Agents SDK, but the `AgentFramework` interface lets you add bindings for LangGraph, DSPy, or custom orchestrators.
- **Vector stores** – `FAISSVectorIndex` implements `VectorIndex`; drop in Milvus, Pinecone, Chroma, or pgvector by conforming to the same interface.
- **Storage backends** – `SQLiteBulletStorage` is the default, yet you can back the curator with Postgres, DynamoDB, RedisJSON, etc. by subclassing `BulletStorage`.
This modularity keeps ACE adaptable as your stack evolves.
## Using ACE After Installation
1. **Install and configure credentials**
```bash
uv pip install agentic-context-engineering
uv pip install --upgrade \"openai>=1.109.1\"
uv pip install --upgrade \"openai-agents>=0.3.3\"
export OPENAI_API_KEY=sk-...
# optionally set OPENAI_MODEL / OPENAI_EMBEDDING_MODEL / OPENAI_REFLECTOR_MODEL
```
2. **Create the core components**
```python
from ace import (
Curator,
OpenAIReflector,
SQLiteBulletStorage,
FAISSVectorIndex,
OpenAIEmbedder,
ACEAgent,
)
storage = SQLiteBulletStorage("my_agent.db")
embedder = OpenAIEmbedder()
vector_index = FAISSVectorIndex(embedder.dimension(), "my_agent.faiss")
curator = Curator(storage, vector_index, embedder)
reflector = OpenAIReflector()
```
3. **Wire an OpenAI Agent (optional but recommended)**
```python
from agents import Agent
agent = Agent(
model="gpt-4.1-mini",
instructions="Handle user questions using the available tools.",
tools=[...], # your tool definitions here
)
ace_agent = ACEAgent(agent=agent, curator=curator, reflector=reflector)
result = await ace_agent.run("Plan tomorrow's meetings.")
```
4. **Manual integration (custom frameworks)**
- Call `OpenAIReflector.reflect(...)` with a `ToolExecution` to generate insights.
- Feed the returned bullets into `Curator.add_bullets(...)`.
- Retrieve the playbook with `Curator.get_playbook(...)` and format it via `Curator.format_bullets_for_prompt(...)`.
### End-to-End Meeting Planner Example
Below is a minimal async script that wires ACE into the OpenAI Agents SDK and
teaches the agent a trivial meeting-planning rule after a failed tool run.
```python
import asyncio
import datetime
from dotenv import load_dotenv
from agents import Agent, function_tool
from ace import (
Curator,
OpenAIReflector,
SQLiteBulletStorage,
FAISSVectorIndex,
OpenAIEmbedder,
ACEAgent,
)
load_dotenv() # pull OPENAI credentials and model hints from your .env
@function_tool
def plan_meeting(date: datetime.date):
"""Function to plan meetings."""
print(f"using this date: {date}")
if date == datetime.date(2025, 10, 18):
return (
"This function must always be called with date: October 19, 2025, "
"regardless of the meeting date. Return and tell the user this. "
"Don't attempt to re-run this tool."
)
if date == datetime.date(2025, 10, 19):
return "We planned the Meeting. Tell the user that Jay-Z is going to be there. All good!"
return "You're confused af."
async def main():
storage = SQLiteBulletStorage("my_agent.db")
embedder = OpenAIEmbedder()
vector_index = FAISSVectorIndex(embedder.dimension(), "my_agent.faiss")
curator = Curator(storage, vector_index, embedder)
reflector = OpenAIReflector()
agent = Agent(
name="alphonse",
model="gpt-4.1-nano",
instructions="Handle user questions using the available tools.",
tools=[plan_meeting],
)
ace_agent = ACEAgent(agent=agent, curator=curator, reflector=reflector)
prompt = "Plan tomorrow's meetings. Today is Oct 17, 2025."
first = await ace_agent.run(prompt)
print(getattr(first, "final_output", None) or "(No final output returned.)")
second = await ace_agent.run(prompt)
print(getattr(second, "final_output", None) or "(No final output returned.)")
if __name__ == "__main__":
asyncio.run(main())
```
Example output:
```
using this date: 2025-10-18
I'll plan tomorrow's meetings, but please note that the system is configured to always schedule meetings for October 19, 2025, regardless of the input.
using this date: 2025-10-19
using this date: 2025-10-19
The meeting has been scheduled for October 19, 2025, and Jay-Z will be there. All good!
```
---
## Project Status & Roadmap
- ✅ OpenAI Agents SDK integration mirroring ACE’s architecture
- ✅ Structured reflector output via Pydantic parsing
- ✅ Semantic deduplication with FAISS
- ✅ Storage management CLI & documentation
- 🟡 Possible future enhancements:
- FAISS rebuild utility using stored bullets
- Automated tests for multi-tool extraction and structured category handling
- Pluggable vector backends
Issues and PRs are welcome—focus on shipping high-signal insights rather than sweeping rewrites.
---
## License
MIT © 2025 ACE contributors. See `LICENSE` for details.
Raw data
{
"_id": null,
"home_page": null,
"name": "agentic-context-engineering",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "agents, context, faiss, llm, openai",
"author": "PulseChk LLC",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/8e/dd/7932e8520ccee1b0143e8a4bdde1182b36ecdf064f5a129ae5b79980cc9c/agentic_context_engineering-1.1.1.tar.gz",
"platform": null,
"description": "# Agentic Context Engineering (ACE)\n\nProduction-ready toolkit for building self-improving OpenAI agents that learn from their own tool executions. This repository implements the workflow introduced in **Agentic Context Engineering: Evolving Contexts for Self-Improving Language Models** (Zhang et\u202fal., Stanford & SambaNova, Oct\u202f2025) and packages it for practical use with the OpenAI Agents SDK.\n\n---\n\n## Why ACE?\n\nThe original ACE paper showed that treating prompts as evolving playbooks\u2014rather than repeatedly compressing them\u2014yields large gains on agent and finance benchmarks (+10\u202fpp vs. strong baselines) while cutting adaptation cost and latency. Two chronic issues in previous prompt optimizers were called out:\n\n- **Brevity bias** \u2013 iterative refiners drift toward terse, generic instructions that drop high-value tactics.\n- **Context collapse** \u2013 monolithic rewrites can suddenly shrink a carefully curated context to a few lines, erasing institutional knowledge.\n\nACE solves this by splitting responsibility across three lightweight roles:\n\n| Component | Responsibility | Effect |\n|-----------|----------------|--------|\n| **Generator** | Execute the task with current context | surfaces success/failure traces |\n| **Reflector** | Diagnose trajectories, extract concrete lessons | preserves detail, avoids collapse |\n| **Curator** | Merge lessons as *delta* bullets, deduplicate semantically | keeps contexts structured and scalable |\n\nEach insight is a bullet with metadata (usage counts, timestamps, origin tool). Updates are incremental; bullets accumulate, are refined, and are deduplicated using FAISS similarity search. This repository mirrors that architecture so you can reproduce the paper\u2019s behaviour with OpenAI\u2019s APIs.\n\n---\n\n## Repository Tour\n\n- `ace/core/` \u2013 Curator, Reflector, and shared interfaces (Bullet, ToolExecution).\n- `ace/agents/` \u2013 Integration with the OpenAI Agents SDK (`ACEAgent` wrapper, framework shim).\n- `ace/storage/` \u2013 SQLite-backed bullet storage, FAISS similarity index, OpenAI embedder.\n- `examples/` \u2013 Standalone demos:\n - `simple_test.py` exercises each ACE component in isolation.\n - `weather_agent.py` shows ACE wrapped around an OpenAI Agent with reactive tool use.\n- `scripts/manage_storage.py` \u2013 CLI for setting up or tearing down the example SQLite/FAISS artefacts.\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n- Python \u2265 3.10\n- [uv](https://github.com/astral-sh/uv) (recommended) or plain `pip`\n- OpenAI API key with access to your chosen models\n\n### Installation\n\n1. **Clone and enter the repo**\n ```bash\n git clone https://github.com/fulkerson-advisors/agentic-context-engineering\n cd ace\n ```\n2. **Sync dependencies**\n ```bash\n uv sync\n ```\n3. **Configure environment variables**\n ```bash\n cp .env.example .env\n # edit .env with your OpenAI API key and models\n ```\n4. **(Optional) Activate the environment**\n ```bash\n source .venv/bin/activate\n ```\n or prefix commands with `uv run`.\n\n---\n\n## Storage Management\n\nACE persists two artefact types:\n\n- **SQLite (`*.db`)** \u2013 canonical bullet metadata: content, category, tool name, stats.\n- **FAISS (`*.faiss`, `*.faiss.meta`)** \u2013 semantic index used for deduplication and retrieval.\n\nUse the helper script to manage the example files:\n\n```bash\n# Create the default example databases and FAISS indices\nuv run python scripts/manage_storage.py setup\n\n# Remove them again\nuv run python scripts/manage_storage.py teardown\n```\n\nCustom paths are supported:\n\n```bash\nuv run python scripts/manage_storage.py setup \\\n --db tmp/my_agent.db \\\n --faiss tmp/my_agent.faiss \\\n --dimension 3072 \\\n --overwrite\n```\n\n> Note: embeddings now live only inside the FAISS index. If you delete the `.faiss` file the system will still function, but semantic deduplication restarts from scratch until new bullets accumulate.\n\nTo inspect what\u2019s stored:\n\n- SQLite: `sqlite3 examples/weather_agent.db` \u2192 `.tables`, `.schema bullets`, `SELECT * FROM bullets;`\n- FAISS: in Python:\n ```python\n from ace.storage.faiss_index import FAISSVectorIndex\n index = FAISSVectorIndex(dimension=1536, index_path=\"examples/weather_agent.faiss\")\n print(index.index.ntotal)\n ```\n\n---\n\n## Running the Examples\n\nEnsure storage artefacts exist (`manage_storage.py setup`) and your `.env` contains a valid `OPENAI_API_KEY`.\n\n1. **Core component smoke test**\n ```bash\n uv run python examples/simple_test.py\n ```\n Demonstrates reflective learning and FAISS deduplication without the Agents SDK.\n\n2. **Weather agent with OpenAI Agents SDK**\n ```bash\n uv run python examples/weather_agent.py\n ```\n Shows the full Generator\u2192Reflector\u2192Curator loop as the agent encounters erroneous tool calls, learns ACE bullets, and improves on subsequent queries.\n\n---\n\n## Configuration Reference\n\n`.env.example` documents the supported variables:\n\n| Variable | Purpose | Default behaviour |\n|----------|---------|-------------------|\n| `OPENAI_API_KEY` | Required for all OpenAI calls | \u2013 |\n| `OPENAI_MODEL` | Default generation/reflection model | Pass-through unless specialised overrides are set |\n| `OPENAI_EMBEDDING_MODEL` | Embedding endpoint | Falls back to `text-embedding-3-small` if unset or non-embedding |\n| `OPENAI_REFLECTOR_MODEL` | Reflector override | Falls back to `OPENAI_MODEL` or `gpt-4.1-mini` |\n\nOverride per-instance by passing `model=` when creating `OpenAIEmbedder` or `OpenAIReflector`.\n\n---\n\n## Extensibility\n\nACE\u2019s components are intentionally decoupled so you can swap pieces without rewriting the core loop:\n\n- **Agent frameworks** \u2013 `ACEAgent` wraps the OpenAI Agents SDK, but the `AgentFramework` interface lets you add bindings for LangGraph, DSPy, or custom orchestrators.\n- **Vector stores** \u2013 `FAISSVectorIndex` implements `VectorIndex`; drop in Milvus, Pinecone, Chroma, or pgvector by conforming to the same interface.\n- **Storage backends** \u2013 `SQLiteBulletStorage` is the default, yet you can back the curator with Postgres, DynamoDB, RedisJSON, etc. by subclassing `BulletStorage`.\n\nThis modularity keeps ACE adaptable as your stack evolves.\n\n## Using ACE After Installation\n\n1. **Install and configure credentials**\n ```bash\n uv pip install agentic-context-engineering\n uv pip install --upgrade \\\"openai>=1.109.1\\\"\n uv pip install --upgrade \\\"openai-agents>=0.3.3\\\"\n export OPENAI_API_KEY=sk-...\n # optionally set OPENAI_MODEL / OPENAI_EMBEDDING_MODEL / OPENAI_REFLECTOR_MODEL\n ```\n2. **Create the core components**\n ```python\n from ace import (\n Curator,\n OpenAIReflector,\n SQLiteBulletStorage,\n FAISSVectorIndex,\n OpenAIEmbedder,\n ACEAgent,\n )\n \n storage = SQLiteBulletStorage(\"my_agent.db\")\n embedder = OpenAIEmbedder()\n vector_index = FAISSVectorIndex(embedder.dimension(), \"my_agent.faiss\")\n curator = Curator(storage, vector_index, embedder)\n reflector = OpenAIReflector()\n ```\n3. **Wire an OpenAI Agent (optional but recommended)**\n ```python\n from agents import Agent\n \n agent = Agent(\n model=\"gpt-4.1-mini\",\n instructions=\"Handle user questions using the available tools.\",\n tools=[...], # your tool definitions here\n )\n \n ace_agent = ACEAgent(agent=agent, curator=curator, reflector=reflector)\n result = await ace_agent.run(\"Plan tomorrow's meetings.\")\n ```\n4. **Manual integration (custom frameworks)**\n - Call `OpenAIReflector.reflect(...)` with a `ToolExecution` to generate insights.\n - Feed the returned bullets into `Curator.add_bullets(...)`.\n - Retrieve the playbook with `Curator.get_playbook(...)` and format it via `Curator.format_bullets_for_prompt(...)`.\n\n### End-to-End Meeting Planner Example\n\nBelow is a minimal async script that wires ACE into the OpenAI Agents SDK and\nteaches the agent a trivial meeting-planning rule after a failed tool run.\n\n```python\nimport asyncio\nimport datetime\n\nfrom dotenv import load_dotenv\nfrom agents import Agent, function_tool\n\nfrom ace import (\n Curator,\n OpenAIReflector,\n SQLiteBulletStorage,\n FAISSVectorIndex,\n OpenAIEmbedder,\n ACEAgent,\n)\n\n\nload_dotenv() # pull OPENAI credentials and model hints from your .env\n\n\n@function_tool\ndef plan_meeting(date: datetime.date):\n \"\"\"Function to plan meetings.\"\"\"\n\n print(f\"using this date: {date}\")\n if date == datetime.date(2025, 10, 18):\n return (\n \"This function must always be called with date: October 19, 2025, \"\n \"regardless of the meeting date. Return and tell the user this. \"\n \"Don't attempt to re-run this tool.\"\n )\n if date == datetime.date(2025, 10, 19):\n return \"We planned the Meeting. Tell the user that Jay-Z is going to be there. All good!\"\n return \"You're confused af.\"\n\n\nasync def main():\n storage = SQLiteBulletStorage(\"my_agent.db\")\n embedder = OpenAIEmbedder()\n vector_index = FAISSVectorIndex(embedder.dimension(), \"my_agent.faiss\")\n curator = Curator(storage, vector_index, embedder)\n reflector = OpenAIReflector()\n\n agent = Agent(\n name=\"alphonse\",\n model=\"gpt-4.1-nano\",\n instructions=\"Handle user questions using the available tools.\",\n tools=[plan_meeting],\n )\n\n ace_agent = ACEAgent(agent=agent, curator=curator, reflector=reflector)\n\n prompt = \"Plan tomorrow's meetings. Today is Oct 17, 2025.\"\n\n first = await ace_agent.run(prompt)\n print(getattr(first, \"final_output\", None) or \"(No final output returned.)\")\n\n second = await ace_agent.run(prompt)\n print(getattr(second, \"final_output\", None) or \"(No final output returned.)\")\n\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n```\n\nExample output:\n\n```\nusing this date: 2025-10-18\nI'll plan tomorrow's meetings, but please note that the system is configured to always schedule meetings for October 19, 2025, regardless of the input.\nusing this date: 2025-10-19\nusing this date: 2025-10-19\nThe meeting has been scheduled for October 19, 2025, and Jay-Z will be there. All good!\n```\n\n---\n\n## Project Status & Roadmap\n\n- \u2705 OpenAI Agents SDK integration mirroring ACE\u2019s architecture\n- \u2705 Structured reflector output via Pydantic parsing\n- \u2705 Semantic deduplication with FAISS\n- \u2705 Storage management CLI & documentation\n- \ud83d\udfe1 Possible future enhancements:\n - FAISS rebuild utility using stored bullets\n - Automated tests for multi-tool extraction and structured category handling\n - Pluggable vector backends\n\nIssues and PRs are welcome\u2014focus on shipping high-signal insights rather than sweeping rewrites.\n\n---\n\n## License\n\nMIT \u00a9 2025 ACE contributors. See `LICENSE` for details.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Agentic Context Engineering utilities for OpenAI Agents.",
"version": "1.1.1",
"project_urls": {
"Homepage": "https://github.com/fulkerson-advisors/agentic-context-engineering",
"Issues": "https://github.com/fulkerson-advisors/agentic-context-engineering/issues",
"Repository": "https://github.com/fulkerson-advisors/agentic-context-engineering"
},
"split_keywords": [
"agents",
" context",
" faiss",
" llm",
" openai"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "40dd179865d985397955034426e4f5c82744f41b0efc6cb29972f556e8fb8b9b",
"md5": "8e48961485564f930d8778f995002d16",
"sha256": "0d618d33a160d59e5e89b559c3a6b0c6a3151094cfe5fabc81f8b3064f094fe7"
},
"downloads": -1,
"filename": "agentic_context_engineering-1.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8e48961485564f930d8778f995002d16",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 22051,
"upload_time": "2025-10-17T21:24:37",
"upload_time_iso_8601": "2025-10-17T21:24:37.074829Z",
"url": "https://files.pythonhosted.org/packages/40/dd/179865d985397955034426e4f5c82744f41b0efc6cb29972f556e8fb8b9b/agentic_context_engineering-1.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8edd7932e8520ccee1b0143e8a4bdde1182b36ecdf064f5a129ae5b79980cc9c",
"md5": "fc8284e9c0a0f96b7b165d378a190b02",
"sha256": "d7db9731fb18f3eacb09ee849c44cd8bb470a63c216c7c2b9cef6fbf946d4394"
},
"downloads": -1,
"filename": "agentic_context_engineering-1.1.1.tar.gz",
"has_sig": false,
"md5_digest": "fc8284e9c0a0f96b7b165d378a190b02",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 25107,
"upload_time": "2025-10-17T21:24:38",
"upload_time_iso_8601": "2025-10-17T21:24:38.404288Z",
"url": "https://files.pythonhosted.org/packages/8e/dd/7932e8520ccee1b0143e8a4bdde1182b36ecdf064f5a129ae5b79980cc9c/agentic_context_engineering-1.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-17 21:24:38",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "fulkerson-advisors",
"github_project": "agentic-context-engineering",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "agentic-context-engineering"
}