Metadata-Version: 2.4
Name: agentify-core
Version: 0.6.1
Summary: Framework-agnostic AI agent library for building single and multi-agent systems
Author-email: Fabian M <fabianmp_98@hotmail.com>
License-Expression: MIT
Project-URL: Homepage, https://github.com/fa8i/Agentify
Project-URL: Repository, https://github.com/fa8i/Agentify
Project-URL: Bug Tracker, https://github.com/fa8i/Agentify/issues
Keywords: agentify,agentify-core,agent,multi-agent,ai,llm,openai,framework,mcp
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: openai
Requires-Dist: python-dotenv
Requires-Dist: Pillow
Requires-Dist: jsonschema>=4.0.0
Requires-Dist: mcp
Provides-Extra: codex
Requires-Dist: openai-codex<1.0.0,>=0.1.0b1; extra == "codex"
Provides-Extra: redis
Requires-Dist: redis>=4.0.0; extra == "redis"
Provides-Extra: elastic
Requires-Dist: elasticsearch>=8.0.0; extra == "elastic"
Provides-Extra: tools
Requires-Dist: requests>=2.25.0; extra == "tools"
Provides-Extra: ui
Requires-Dist: gradio==5.49.1; extra == "ui"
Provides-Extra: all
Requires-Dist: redis>=4.0.0; extra == "all"
Requires-Dist: elasticsearch>=8.0.0; extra == "all"
Requires-Dist: requests>=2.25.0; extra == "all"
Requires-Dist: gradio==5.49.1; extra == "all"
Requires-Dist: openai-codex<1.0.0,>=0.1.0b1; extra == "all"
Provides-Extra: dev
Requires-Dist: pytest>=7.0.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
Requires-Dist: black>=22.0.0; extra == "dev"
Requires-Dist: flake8>=5.0.0; extra == "dev"
Requires-Dist: mypy>=1.0.0; extra == "dev"
Requires-Dist: twine>=4.0.0; extra == "dev"
Requires-Dist: build>=0.10.0; extra == "dev"
Dynamic: license-file

# Agentify

**Production-ready AI agent library built on the OpenAI SDK**

Build and orchestrate AI agents—from simple assistants to complex multi-agent systems. Agentify targets the OpenAI-compatible Chat Completions interface, enabling seamless switching between providers (OpenAI, Azure, DeepSeek, Gemini, Anthropic, Llama, **Local LLMs**) without code changes. It also includes experimental native Codex support through ChatGPT OAuth.

---

## Why Agentify?

| Feature | Benefit |
|---------|---------|
| **Production-first** | Clear abstractions, explicit config, robust error handling |
| **Multi-provider** | Switch providers with one line—no agent code changes |
| **Orchestration primitives** | Uniform `run()`/`arun()` across agents, teams, pipelines, hierarchies |
| **Async-native** | Non-blocking I/O, parallel tool execution, event-loop friendly |
| **Pluggable memory** | In-memory, SQLite, Redis, Elasticsearch—same API |
| **Local LLMs** | Support for LM Studio, Ollama and custom local servers |
| **Codex provider** | Native Codex threads with Agentify memory, tools via runtime MCP, image input, structured output and streaming events |

---

## Key Features

- **Single agents & multi-agent patterns**  
  Agents with tools and memory • Supervisor–worker Teams • Sequential Pipelines • Hierarchical delegation • Dynamic routing

- **Memory system**  
  Pluggable backends with policies (TTL, message limits, pruning) • Memory isolation per conversation • Async-safe operations

- **Reasoning models**  
  Configurable thinking depth (`reasoning_effort`) • Chain-of-thought storage • Real-time reasoning logs

- **Tools**  
  `@tool` decorator with automatic JSON Schema • Type-annotated interface • Argument validation

- **Async & parallel execution**  
  Native `arun()` for async apps • `run()` bridge for sync apps • Parallel tool calls

- **Observability**  
  Callback hooks for logging, monitoring, debugging

- **Multimodal**  
  Vision/image support • Streaming responses

---

## Installation

```bash
pip install agentify-core
```

Optional backends:
```bash
pip install agentify-core[redis]      # Redis memory store
pip install agentify-core[elastic]    # Elasticsearch store
pip install agentify-core[codex]      # Native Codex provider
pip install agentify-core[all]        # All optional dependencies
```

---

## Quick Start

```python
from agentify import BaseAgent, AgentConfig, MemoryService, MemoryAddress, tool
from agentify.memory.stores import InMemoryStore

@tool
def get_time() -> dict:
    """Returns the current time."""
    from datetime import datetime
    return {"time": datetime.now().strftime("%H:%M:%S")}

# Setup
memory = MemoryService(store=InMemoryStore())
addr = MemoryAddress(conversation_id="session_1")

agent = BaseAgent(
    config=AgentConfig(
        name="Assistant",
        system_prompt="You are a helpful assistant.",
        provider="provider",
        model_name="model",
        reasoning_effort="high",  # optional param:"low", "medium", "high"
        model_kwargs={"max_completion_tokens": 5000}, # Pass model-specific params
        verbose=True, # Controls logging
    ),
    memory=memory,
    memory_address=addr,
    tools=[get_time],
)

response = agent.run("What time is it?")
print(response)

# Async usage is also available:
# response = await agent.arun("What time is it?")
```

---

## Native Codex Provider

Codex support is experimental and uses ChatGPT OAuth through the Codex CLI:

```bash
pip install agentify-core[codex]
codex login
codex login status
```

`codex login` opens the Codex CLI authentication flow. Choose ChatGPT login when
you want to use the Codex models available to your ChatGPT account. If the login
is successful, `codex login status` should report that you are logged in. Model
availability and quota depend on your Codex CLI version and ChatGPT account.

Then use the same Agentify API:

```python
agent = BaseAgent(
    config=AgentConfig(
        name="CodexAgent",
        system_prompt="You are a helpful assistant.",
        provider="codex",
        model_name="gpt-5.4",
    ),
    memory=memory,
    memory_address=addr,
    tools=[get_time],
)

response = agent.run("Use the tool and answer concisely.")
```

Agentify keeps memory as the source of truth and sends the current conversation
state to Codex. Normal `tools=[...]` are exposed to Codex through an internal
runtime MCP bridge, so users do not need to manually wrap tools for common use.

Supported Codex features include:

- Agentify-managed memory with SQLite, in-memory, Redis or Elasticsearch stores.
- Native Codex thread memory with `client_config_override={"memory_mode": "codex_thread"}` —
  recommended for interactive multi-turn assistants (~1.5–1.7x faster per turn),
  with optional `thread_map_path` to persist sessions across restarts.
- Runtime MCP tools with logs and persisted tool-call history, isolated per session.
- Typed, actionable errors (OAuth/login missing, CLI not found, model unsupported,
  usage limit) that stop useless retries.
- `stream=True` using Codex turn events.
- `image_path=...` multimodal input when supported by the installed Codex SDK.
- Structured output with `model_kwargs={"output_schema": ...}` or OpenAI-style `response_format`.

For long-running apps, call `agent.close()` or `await agent.aclose()` to release
provider resources.

---

## Memory Backends

```python
from agentify.memory.stores import InMemoryStore
from agentify.memory.stores.sqlite_store import SQLiteStore
from agentify.memory.stores.redis_store import RedisStore

# In-memory (default, for development)
store = InMemoryStore()

# SQLite (persistent, zero-config)
store = SQLiteStore(db_path="./agent.db")

# Redis (production, distributed)
store = RedisStore(url="redis://localhost:6379/0")
```

---

## Composable Flows

All primitives share the same `run()`/`arun()` interface:

- **BaseAgent** — Single agent with tools
- **Team** — Supervisor routes to worker agents
- **SequentialPipeline** — Output flows step-to-step
- **HierarchicalTeam** — Tree structures for delegation

Nest freely: Teams of Pipelines, Pipelines of Teams, dynamic routing at runtime.

---

## Links

- **Documentation & Examples**: [GitHub Repository](https://github.com/fa8i/Agentify)
- **Issues & PRs**: [Contribute](https://github.com/fa8i/Agentify/issues)

---

## License

MIT License

## Author

**Fabian Melchor** — [fabianmp_98@hotmail.com](mailto:fabianmp_98@hotmail.com)
