agentify-core 0.3.1__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentify_core-0.3.1 → agentify_core-0.4.0}/MANIFEST.in +3 -1
- agentify_core-0.4.0/PKG-INFO +201 -0
- agentify_core-0.4.0/README.md +122 -0
- agentify_core-0.4.0/README_PYPI.md +147 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/__init__.py +1 -1
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/core/agent.py +144 -500
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/core/callbacks.py +9 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/core/config.py +6 -1
- agentify_core-0.4.0/agentify/core/multimodal.py +73 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/core/runnable.py +1 -1
- agentify_core-0.4.0/agentify/core/sync_bridge.py +141 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/extensions/tools/__init__.py +2 -0
- agentify_core-0.4.0/agentify/extensions/tools/shell_safe.py +114 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/llm/client.py +21 -1
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/memory/__init__.py +3 -0
- agentify_core-0.4.0/agentify/memory/async_service.py +167 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/memory/interfaces.py +54 -1
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/memory/stores/elastic_store.py +1 -33
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/memory/stores/redis_store.py +3 -30
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/memory/stores/sqlite_store.py +2 -35
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/multi_agent/hierarchical.py +27 -16
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/multi_agent/pipeline.py +50 -50
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/multi_agent/team.py +33 -28
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/multi_agent/tool_wrapper.py +151 -49
- agentify_core-0.4.0/agentify_core.egg-info/PKG-INFO +201 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify_core.egg-info/SOURCES.txt +6 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/pyproject.toml +1 -1
- agentify_core-0.4.0/tests/test_async_memory_service.py +109 -0
- agentify_core-0.4.0/tests/test_memory_address.py +89 -0
- agentify_core-0.4.0/tests/test_sync_bridge.py +61 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/tests/test_verify_hooks.py +14 -4
- agentify_core-0.3.1/PKG-INFO +0 -170
- agentify_core-0.3.1/README.md +0 -111
- agentify_core-0.3.1/README_PYPI.md +0 -116
- agentify_core-0.3.1/agentify_core.egg-info/PKG-INFO +0 -170
- agentify_core-0.3.1/tests/test_memory_address.py +0 -26
- {agentify_core-0.3.1 → agentify_core-0.4.0}/LICENSE +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/core/__init__.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/core/tool.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/extensions/__init__.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/extensions/prompts/__init__.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/extensions/prompts/assistant.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/extensions/tools/calculator.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/extensions/tools/filesystem.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/extensions/tools/planning.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/extensions/tools/time.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/extensions/tools/weather.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/llm/__init__.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/mcp/__init__.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/mcp/adapter.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/mcp/client.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/memory/policies.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/memory/service.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/memory/stores/__init__.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/memory/stores/in_memory_store.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/multi_agent/__init__.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/utils/__init__.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify/utils/style.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify_core.egg-info/dependency_links.txt +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify_core.egg-info/requires.txt +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/agentify_core.egg-info/top_level.txt +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/requirements.txt +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/setup.cfg +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/tests/test_filesystem_tools.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/tests/test_mcp.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/tests/test_memory_logging.py +0 -0
- {agentify_core-0.3.1 → agentify_core-0.4.0}/tests/test_planning_tool.py +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
include
|
|
1
|
+
include README_PYPI.md
|
|
2
2
|
include LICENSE
|
|
3
3
|
include requirements.txt
|
|
4
4
|
recursive-include agentify *.py
|
|
@@ -6,3 +6,5 @@ recursive-include agentify/extensions *.py
|
|
|
6
6
|
recursive-exclude * __pycache__
|
|
7
7
|
recursive-exclude * *.py[co]
|
|
8
8
|
recursive-exclude * .DS_Store
|
|
9
|
+
prune services
|
|
10
|
+
prune opencode
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentify-core
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: Framework-agnostic AI agent library for building single and multi-agent systems
|
|
5
|
+
Author: Fabian M
|
|
6
|
+
Author-email: fabianmp_98@hotmail.com
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/fa8i/Agentify
|
|
9
|
+
Project-URL: Repository, https://github.com/fa8i/Agentify
|
|
10
|
+
Project-URL: Bug Tracker, https://github.com/fa8i/Agentify/issues
|
|
11
|
+
Keywords: agentify,agentify-core,agent,multi-agent,ai,llm,openai,framework
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: openai
|
|
26
|
+
Requires-Dist: python-dotenv
|
|
27
|
+
Requires-Dist: Pillow
|
|
28
|
+
Requires-Dist: jsonschema>=4.0.0
|
|
29
|
+
Provides-Extra: redis
|
|
30
|
+
Requires-Dist: redis>=4.0.0; extra == "redis"
|
|
31
|
+
Provides-Extra: elastic
|
|
32
|
+
Requires-Dist: elasticsearch>=8.0.0; extra == "elastic"
|
|
33
|
+
Provides-Extra: tools
|
|
34
|
+
Requires-Dist: requests>=2.25.0; extra == "tools"
|
|
35
|
+
Provides-Extra: mcp
|
|
36
|
+
Requires-Dist: mcp; extra == "mcp"
|
|
37
|
+
Provides-Extra: ui
|
|
38
|
+
Requires-Dist: gradio==5.49.1; extra == "ui"
|
|
39
|
+
Provides-Extra: all
|
|
40
|
+
Requires-Dist: redis>=4.0.0; extra == "all"
|
|
41
|
+
Requires-Dist: elasticsearch>=8.0.0; extra == "all"
|
|
42
|
+
Requires-Dist: requests>=2.25.0; extra == "all"
|
|
43
|
+
Requires-Dist: gradio==5.49.1; extra == "all"
|
|
44
|
+
Requires-Dist: mcp; extra == "all"
|
|
45
|
+
Provides-Extra: dev
|
|
46
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
47
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
48
|
+
Requires-Dist: black>=22.0.0; extra == "dev"
|
|
49
|
+
Requires-Dist: flake8>=5.0.0; extra == "dev"
|
|
50
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
51
|
+
Requires-Dist: twine>=4.0.0; extra == "dev"
|
|
52
|
+
Requires-Dist: build>=0.10.0; extra == "dev"
|
|
53
|
+
Dynamic: license-file
|
|
54
|
+
|
|
55
|
+
# Agentify
|
|
56
|
+
|
|
57
|
+
**Production-ready AI agent library built on the OpenAI SDK**
|
|
58
|
+
|
|
59
|
+
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.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Why Agentify?
|
|
64
|
+
|
|
65
|
+
| Feature | Benefit |
|
|
66
|
+
|---------|---------|
|
|
67
|
+
| **Production-first** | Clear abstractions, explicit config, robust error handling |
|
|
68
|
+
| **Multi-provider** | Switch providers with one line—no agent code changes |
|
|
69
|
+
| **Orchestration primitives** | Uniform `run()`/`arun()` across agents, teams, pipelines, hierarchies |
|
|
70
|
+
| **Async-native** | Non-blocking I/O, parallel tool execution, event-loop friendly |
|
|
71
|
+
| **Pluggable memory** | In-memory, SQLite, Redis, Elasticsearch—same API |
|
|
72
|
+
| **Local LLMs** | Support for LM Studio, Ollama and custom local servers |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Key Features
|
|
77
|
+
|
|
78
|
+
- **Single agents & multi-agent patterns**
|
|
79
|
+
Agents with tools and memory • Supervisor–worker Teams • Sequential Pipelines • Hierarchical delegation • Dynamic routing
|
|
80
|
+
|
|
81
|
+
- **Memory system**
|
|
82
|
+
Pluggable backends with policies (TTL, message limits, pruning) • Memory isolation per conversation • Async-safe operations
|
|
83
|
+
|
|
84
|
+
- **Reasoning models**
|
|
85
|
+
Configurable thinking depth (`reasoning_effort`) • Chain-of-thought storage • Real-time reasoning logs
|
|
86
|
+
|
|
87
|
+
- **Tools**
|
|
88
|
+
`@tool` decorator with automatic JSON Schema • Type-annotated interface • Argument validation
|
|
89
|
+
|
|
90
|
+
- **Async & parallel execution**
|
|
91
|
+
Native `arun()` for async apps • `run()` bridge for sync apps • Parallel tool calls
|
|
92
|
+
|
|
93
|
+
- **Observability**
|
|
94
|
+
Callback hooks for logging, monitoring, debugging
|
|
95
|
+
|
|
96
|
+
- **Multimodal**
|
|
97
|
+
Vision/image support • Streaming responses
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Installation
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
pip install agentify-core
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Optional backends:
|
|
108
|
+
```bash
|
|
109
|
+
pip install agentify-core[redis] # Redis memory store
|
|
110
|
+
pip install agentify-core[elastic] # Elasticsearch store
|
|
111
|
+
pip install agentify-core[all] # All optional dependencies
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Quick Start
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
from agentify import BaseAgent, AgentConfig, MemoryService, MemoryAddress, tool
|
|
120
|
+
from agentify.memory.stores import InMemoryStore
|
|
121
|
+
|
|
122
|
+
@tool
|
|
123
|
+
def get_time() -> dict:
|
|
124
|
+
"""Returns the current time."""
|
|
125
|
+
from datetime import datetime
|
|
126
|
+
return {"time": datetime.now().strftime("%H:%M:%S")}
|
|
127
|
+
|
|
128
|
+
# Setup
|
|
129
|
+
memory = MemoryService(store=InMemoryStore())
|
|
130
|
+
addr = MemoryAddress(conversation_id="session_1")
|
|
131
|
+
|
|
132
|
+
agent = BaseAgent(
|
|
133
|
+
config=AgentConfig(
|
|
134
|
+
name="Assistant",
|
|
135
|
+
system_prompt="You are a helpful assistant.",
|
|
136
|
+
provider="provider",
|
|
137
|
+
model_name="model",
|
|
138
|
+
reasoning_effort="high", # optional param:"low", "medium", "high"
|
|
139
|
+
model_kwargs={"max_completion_tokens": 5000}, # Pass model-specific params
|
|
140
|
+
verbose=True, # Controls logging
|
|
141
|
+
),
|
|
142
|
+
memory=memory,
|
|
143
|
+
memory_address=addr,
|
|
144
|
+
tools=[get_time],
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
response = agent.run("What time is it?")
|
|
148
|
+
print(response)
|
|
149
|
+
|
|
150
|
+
# Async usage is also available:
|
|
151
|
+
# response = await agent.arun("What time is it?")
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Memory Backends
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
from agentify.memory.stores import InMemoryStore
|
|
160
|
+
from agentify.memory.stores.sqlite_store import SQLiteStore
|
|
161
|
+
from agentify.memory.stores.redis_store import RedisStore
|
|
162
|
+
|
|
163
|
+
# In-memory (default, for development)
|
|
164
|
+
store = InMemoryStore()
|
|
165
|
+
|
|
166
|
+
# SQLite (persistent, zero-config)
|
|
167
|
+
store = SQLiteStore(db_path="./agent.db")
|
|
168
|
+
|
|
169
|
+
# Redis (production, distributed)
|
|
170
|
+
store = RedisStore(url="redis://localhost:6379/0")
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Composable Flows
|
|
176
|
+
|
|
177
|
+
All primitives share the same `run()`/`arun()` interface:
|
|
178
|
+
|
|
179
|
+
- **BaseAgent** — Single agent with tools
|
|
180
|
+
- **Team** — Supervisor routes to worker agents
|
|
181
|
+
- **SequentialPipeline** — Output flows step-to-step
|
|
182
|
+
- **HierarchicalTeam** — Tree structures for delegation
|
|
183
|
+
|
|
184
|
+
Nest freely: Teams of Pipelines, Pipelines of Teams, dynamic routing at runtime.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Links
|
|
189
|
+
|
|
190
|
+
- **Documentation & Examples**: [GitHub Repository](https://github.com/fa8i/Agentify)
|
|
191
|
+
- **Issues & PRs**: [Contribute](https://github.com/fa8i/Agentify/issues)
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## License
|
|
196
|
+
|
|
197
|
+
MIT License
|
|
198
|
+
|
|
199
|
+
## Author
|
|
200
|
+
|
|
201
|
+
**Fabian Melchor** — [fabianmp_98@hotmail.com](mailto:fabianmp_98@hotmail.com)
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# Agentify
|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/agentify-core/)
|
|
6
|
+
[](https://pepy.tech/project/agentify-core)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
[](https://pypi.org/project/agentify-core/)
|
|
9
|
+
|
|
10
|
+
<h3>Independent AI Agent Library based on the OpenAI SDK</h3>
|
|
11
|
+
|
|
12
|
+
<p>
|
|
13
|
+
Agentify is a lightweight, clean, and powerful Python library for building AI agents and multi-agent systems.
|
|
14
|
+
It provides simple abstractions for memory, tools, and orchestration without the heavy framework lock-in.
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
[Getting Started](docs/getting_started.md) • [Documentation](docs/api_reference.md) • [Examples](examples/) • [Changelog](CHANGELOG.md)
|
|
18
|
+
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Key Features
|
|
24
|
+
|
|
25
|
+
| Feature | Description |
|
|
26
|
+
| :--- | :--- |
|
|
27
|
+
| **Multi-Agent Orchestration** | Teams, sequential pipelines, hierarchical structures, and dynamic sub-agent spawning. |
|
|
28
|
+
| **Memory Service** | Pluggable backends (In-Memory, SQLite, Redis, Elasticsearch) with configurable TTL, limits and token budgets. |
|
|
29
|
+
| **Tools & MCP** | Easy `@tool` decorator, custom classes, and full **Model Context Protocol (MCP)** integration. |
|
|
30
|
+
| **Local Models** | First-class support for **LM Studio**, **Ollama**, and other local servers via OpenAI-compatible endpoints. |
|
|
31
|
+
| **Async & Parallel** | Dual API: simple `run()` for sync usage and `arun()` for native async execution. |
|
|
32
|
+
| **Observability** | Comprehensive callback system for monitoring, debugging, and tracing agent thoughts. |
|
|
33
|
+
| **Reasoning & Planning** | Configure thinking depth, chain-of-thought storage, and real-time reasoning logs. |
|
|
34
|
+
|
|
35
|
+
## Installation
|
|
36
|
+
|
|
37
|
+
Install the core package:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pip install agentify-core
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
For all optional features (Redis, vector stores, etc.):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pip install agentify-core[all]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Quick Start
|
|
50
|
+
|
|
51
|
+
Here is how to create a simple agent with memory and tools:
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
# Note: Agentify does not auto-load .env. Load it manually if needed.
|
|
55
|
+
# from dotenv import load_dotenv; load_dotenv()
|
|
56
|
+
|
|
57
|
+
from agentify import BaseAgent, AgentConfig, MemoryService, MemoryAddress, tool
|
|
58
|
+
from agentify.memory.stores import InMemoryStore
|
|
59
|
+
|
|
60
|
+
# 1. Define a tool
|
|
61
|
+
@tool
|
|
62
|
+
def get_time() -> dict:
|
|
63
|
+
"""Returns the current local time."""
|
|
64
|
+
from datetime import datetime
|
|
65
|
+
return {"time": datetime.now().strftime("%H:%M:%S")}
|
|
66
|
+
|
|
67
|
+
# 2. Initialize Memory
|
|
68
|
+
memory = MemoryService(store=InMemoryStore())
|
|
69
|
+
addr = MemoryAddress(conversation_id="session_1")
|
|
70
|
+
|
|
71
|
+
# 3. Create the Agent
|
|
72
|
+
agent = BaseAgent(
|
|
73
|
+
config=AgentConfig(
|
|
74
|
+
name="ReasoningAgent",
|
|
75
|
+
system_prompt="You are a helpful assistant.",
|
|
76
|
+
provider="provider",
|
|
77
|
+
model_name="model",
|
|
78
|
+
reasoning_effort="low", # optional param:"low", "medium", "high"
|
|
79
|
+
model_kwargs={"max_completion_tokens": 5000}, # Pass model-specific params
|
|
80
|
+
verbose=True, # Controls logging (True by default)
|
|
81
|
+
),
|
|
82
|
+
memory=memory,
|
|
83
|
+
memory_address=addr,
|
|
84
|
+
tools=[get_time]
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# 4. Run it (sync)
|
|
88
|
+
response = agent.run(user_input="What time is it?")
|
|
89
|
+
print(response)
|
|
90
|
+
|
|
91
|
+
# Async usage is also available:
|
|
92
|
+
# response = await agent.arun(user_input="What time is it?")
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Documentation
|
|
96
|
+
|
|
97
|
+
Detailed guides and API references are available in the `docs/` directory:
|
|
98
|
+
|
|
99
|
+
- **[Getting Started](docs/getting_started.md)**: Installation and first steps.
|
|
100
|
+
- **[Core Concepts](docs/core_concepts.md)**: Deep dive into Agents, Memory, and Tools.
|
|
101
|
+
- **[Multi-Agent Systems](docs/multi_agent.md)**: Building Teams, Pipelines, and Hierarchies.
|
|
102
|
+
- **[Advanced Features](docs/advanced.md)**: Vision, Screening, Hooks, and more.
|
|
103
|
+
|
|
104
|
+
## Examples
|
|
105
|
+
|
|
106
|
+
Explore the `examples/` directory for production-ready implementations:
|
|
107
|
+
|
|
108
|
+
- **[Chatbot](examples/chatbot/)**: A simple conversational agent.
|
|
109
|
+
- **[Multi-Agent Team](examples/multi_agent/team/)**: Agents working together.
|
|
110
|
+
- **[Pipelines](examples/multi_agent/pipeline/)**: Sequential task processing.
|
|
111
|
+
- **[Hierarchies](examples/multi_agent/hierarchical/)**: Complex delegated decision making.
|
|
112
|
+
|
|
113
|
+
## License
|
|
114
|
+
|
|
115
|
+
This project is licensed under the [MIT License](https://opensource.org/licenses/MIT).
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
<div align="center">
|
|
120
|
+
Created by <b>Fabian Melchor</b><br>
|
|
121
|
+
<a href="mailto:fabianmp_98@hotmail.com">fabianmp_98@hotmail.com</a>
|
|
122
|
+
</div>
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Agentify
|
|
2
|
+
|
|
3
|
+
**Production-ready AI agent library built on the OpenAI SDK**
|
|
4
|
+
|
|
5
|
+
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.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why Agentify?
|
|
10
|
+
|
|
11
|
+
| Feature | Benefit |
|
|
12
|
+
|---------|---------|
|
|
13
|
+
| **Production-first** | Clear abstractions, explicit config, robust error handling |
|
|
14
|
+
| **Multi-provider** | Switch providers with one line—no agent code changes |
|
|
15
|
+
| **Orchestration primitives** | Uniform `run()`/`arun()` across agents, teams, pipelines, hierarchies |
|
|
16
|
+
| **Async-native** | Non-blocking I/O, parallel tool execution, event-loop friendly |
|
|
17
|
+
| **Pluggable memory** | In-memory, SQLite, Redis, Elasticsearch—same API |
|
|
18
|
+
| **Local LLMs** | Support for LM Studio, Ollama and custom local servers |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Key Features
|
|
23
|
+
|
|
24
|
+
- **Single agents & multi-agent patterns**
|
|
25
|
+
Agents with tools and memory • Supervisor–worker Teams • Sequential Pipelines • Hierarchical delegation • Dynamic routing
|
|
26
|
+
|
|
27
|
+
- **Memory system**
|
|
28
|
+
Pluggable backends with policies (TTL, message limits, pruning) • Memory isolation per conversation • Async-safe operations
|
|
29
|
+
|
|
30
|
+
- **Reasoning models**
|
|
31
|
+
Configurable thinking depth (`reasoning_effort`) • Chain-of-thought storage • Real-time reasoning logs
|
|
32
|
+
|
|
33
|
+
- **Tools**
|
|
34
|
+
`@tool` decorator with automatic JSON Schema • Type-annotated interface • Argument validation
|
|
35
|
+
|
|
36
|
+
- **Async & parallel execution**
|
|
37
|
+
Native `arun()` for async apps • `run()` bridge for sync apps • Parallel tool calls
|
|
38
|
+
|
|
39
|
+
- **Observability**
|
|
40
|
+
Callback hooks for logging, monitoring, debugging
|
|
41
|
+
|
|
42
|
+
- **Multimodal**
|
|
43
|
+
Vision/image support • Streaming responses
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Installation
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pip install agentify-core
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Optional backends:
|
|
54
|
+
```bash
|
|
55
|
+
pip install agentify-core[redis] # Redis memory store
|
|
56
|
+
pip install agentify-core[elastic] # Elasticsearch store
|
|
57
|
+
pip install agentify-core[all] # All optional dependencies
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Quick Start
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
from agentify import BaseAgent, AgentConfig, MemoryService, MemoryAddress, tool
|
|
66
|
+
from agentify.memory.stores import InMemoryStore
|
|
67
|
+
|
|
68
|
+
@tool
|
|
69
|
+
def get_time() -> dict:
|
|
70
|
+
"""Returns the current time."""
|
|
71
|
+
from datetime import datetime
|
|
72
|
+
return {"time": datetime.now().strftime("%H:%M:%S")}
|
|
73
|
+
|
|
74
|
+
# Setup
|
|
75
|
+
memory = MemoryService(store=InMemoryStore())
|
|
76
|
+
addr = MemoryAddress(conversation_id="session_1")
|
|
77
|
+
|
|
78
|
+
agent = BaseAgent(
|
|
79
|
+
config=AgentConfig(
|
|
80
|
+
name="Assistant",
|
|
81
|
+
system_prompt="You are a helpful assistant.",
|
|
82
|
+
provider="provider",
|
|
83
|
+
model_name="model",
|
|
84
|
+
reasoning_effort="high", # optional param:"low", "medium", "high"
|
|
85
|
+
model_kwargs={"max_completion_tokens": 5000}, # Pass model-specific params
|
|
86
|
+
verbose=True, # Controls logging
|
|
87
|
+
),
|
|
88
|
+
memory=memory,
|
|
89
|
+
memory_address=addr,
|
|
90
|
+
tools=[get_time],
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
response = agent.run("What time is it?")
|
|
94
|
+
print(response)
|
|
95
|
+
|
|
96
|
+
# Async usage is also available:
|
|
97
|
+
# response = await agent.arun("What time is it?")
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Memory Backends
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from agentify.memory.stores import InMemoryStore
|
|
106
|
+
from agentify.memory.stores.sqlite_store import SQLiteStore
|
|
107
|
+
from agentify.memory.stores.redis_store import RedisStore
|
|
108
|
+
|
|
109
|
+
# In-memory (default, for development)
|
|
110
|
+
store = InMemoryStore()
|
|
111
|
+
|
|
112
|
+
# SQLite (persistent, zero-config)
|
|
113
|
+
store = SQLiteStore(db_path="./agent.db")
|
|
114
|
+
|
|
115
|
+
# Redis (production, distributed)
|
|
116
|
+
store = RedisStore(url="redis://localhost:6379/0")
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Composable Flows
|
|
122
|
+
|
|
123
|
+
All primitives share the same `run()`/`arun()` interface:
|
|
124
|
+
|
|
125
|
+
- **BaseAgent** — Single agent with tools
|
|
126
|
+
- **Team** — Supervisor routes to worker agents
|
|
127
|
+
- **SequentialPipeline** — Output flows step-to-step
|
|
128
|
+
- **HierarchicalTeam** — Tree structures for delegation
|
|
129
|
+
|
|
130
|
+
Nest freely: Teams of Pipelines, Pipelines of Teams, dynamic routing at runtime.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Links
|
|
135
|
+
|
|
136
|
+
- **Documentation & Examples**: [GitHub Repository](https://github.com/fa8i/Agentify)
|
|
137
|
+
- **Issues & PRs**: [Contribute](https://github.com/fa8i/Agentify/issues)
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## License
|
|
142
|
+
|
|
143
|
+
MIT License
|
|
144
|
+
|
|
145
|
+
## Author
|
|
146
|
+
|
|
147
|
+
**Fabian Melchor** — [fabianmp_98@hotmail.com](mailto:fabianmp_98@hotmail.com)
|