Modular Agent Infrastructure Collection, a python framework for managing and sharing DSPy agents
Project description
Modaic 🐙
Modular Agent Infrastructure Collection, a Python framework for maintaining DSPy applications.
Overview
Modaic provides a comprehensive toolkit for creating intelligent DSPY pipelines that can work with diverse data sources including tables, documents, and databases. Built on top of DSPy, it offers a way to share and manage DSPY pipelines with integrated vector, SQL, and graph database support.
Key Features
- Hub Support: Load and share precompiled DSPY programs from Modaic Hub
- Context Management: Structured handling of molecular and atomic context types
- Database Integration: Support for Vector (Milvus, Pinecone, Qdrant), SQL (SQLite, MySQL, PostgreSQL), and Graph (Memgraph, Neo4j)
- Program Framework: Precompiled and auto-loading DSPY programs
- Table Processing: Advanced Excel/CSV processing with SQL querying capabilities
Installation
Using uv (recommended)
uv add modaic
Optional (for hub operations):
export MODAIC_TOKEN="<your-token>"
Using pip
Please note that you will not be able to push DSPY programs to the Modaic Hub with pip.
pip install modaic
Quick Start
Creating a Simple Program
from modaic import PrecompiledProgram, PrecompiledConfig
class WeatherConfig(PrecompiledConfig):
weather: str = "sunny"
class WeatherProgram(PrecompiledProgram):
config: WeatherConfig
def __init__(self, config: WeatherConfig, **kwargs):
super().__init__(config, **kwargs)
def forward(self, query: str) -> str:
return f"The weather in {query} is {self.config.weather}."
weather_program = WeatherProgram(WeatherConfig())
print(weather_program(query="Tokyo"))
Save and load locally:
weather_program.save_precompiled("./my-weather")
from modaic import AutoProgram, AutoConfig
cfg = AutoConfig.from_precompiled("./my-weather", local=True)
loaded = AutoProgram.from_precompiled("./my-weather", local=True)
print(loaded(query="Kyoto"))
Working with Tables
from pathlib import Path
from modaic.context import Table, TableFile
import pandas as pd
# Load from Excel/CSV
excel = TableFile.from_file(
file_ref="employees.xlsx",
file=Path("employees.xlsx"),
file_type="xlsx",
)
csv = TableFile.from_file(
file_ref="data.csv",
file=Path("data.csv"),
file_type="csv",
)
# Create from DataFrame
df = pd.DataFrame({"col1": [1, 2, 3], "col2": [4, 5, 6]})
table = Table(df=df, name="my_table")
# Query with SQL (refer to in-memory table as `this`)
result = table.query("SELECT * FROM this WHERE col1 > 1")
# Convert to markdown
markdown = table.markdown()
Database Integration
SQL Database
from modaic.databases import SQLDatabase, SQLiteBackend
# Configure and connect
backend = SQLiteBackend(db_path="my_database.db")
db = SQLDatabase(backend)
# Add table
db.add_table(table)
# Query
rows = db.fetchall("SELECT * FROM my_table")
Vector Database
Graph Database
from modaic.context import Context, Relation
from modaic.databases import GraphDatabase, MemgraphConfig, Neo4jConfig
# Configure backend (choose one)
mg = GraphDatabase(MemgraphConfig())
# or
neo = GraphDatabase(Neo4jConfig())
# Define nodes
class Person(Context):
name: str
age: int
class KNOWS(Relation):
since: int
alice = Person(name="Alice", age=30)
bob = Person(name="Bob", age=28)
# Save nodes
alice.save(mg)
bob.save(mg)
# Create relationship (Alice)-[KNOWS]->(Bob)
rel = (alice >> KNOWS(since=2020) >> bob)
rel.save(mg)
# Query
rows = mg.execute_and_fetch("MATCH (a:Person)-[r:KNOWS]->(b:Person) RETURN a, r, b LIMIT 5")
from modaic import Embedder
from modaic.context import Text
from modaic.databases import VectorDatabase, MilvusBackend
# Setup embedder and backend
embedder = Embedder("openai/text-embedding-3-small")
backend = MilvusBackend.from_local("vector.db") # milvus lite
# Initialize database
vdb = VectorDatabase(backend=backend, embedder=embedder, payload_class=Text)
# Create collection and add records
vdb.create_collection("my_collection", payload_class=Text)
vdb.add_records("my_collection", [Text(text="hello world"), Text(text="modaic makes sharing DSPY programs easy")])
# Search
results = vdb.search("my_collection", query="hello", k=3)
top_hit_text = results[0][0].context.text
Architecture
Program Types
- PrecompiledProgram: Statically defined programs with explicit configuration
- AutoProgram: Dynamically loaded programs from Modaic Hub or local repositories
Database Support
| Database Type | Providers | Use Case |
|---|---|---|
| Vector | Milvus | Semantic search, RAG |
| SQL | SQLite, MySQL, PostgreSQL | Structured queries, table storage |
Examples
TableRAG Example
The TableRAG example demonstrates a complete RAG pipeline for table-based question answering:
from modaic import PrecompiledConfig, PrecompiledProgram
from modaic.context import Table
from modaic.databases import VectorDatabase, SQLDatabase
from modaic.types import Indexer
class TableRAGConfig(PrecompiledConfig):
k_recall: int = 50
k_rerank: int = 5
class TableRAGProgram(PrecompiledProgram):
config: TableRAGConfig # ! Important: config must be annotated with the config class
def __init__(self, config: TableRAGConfig, indexer: Indexer, **kwargs):
super().__init__(config, **kwargs)
self.indexer = indexer
# Initialize DSPy modules for reasoning
def forward(self, user_query: str) -> str:
# Retrieve relevant tables
# Generate SQL queries
# Combine results and provide answer
pass
Support
For issues and questions:
- GitHub Issues:
https://github.com/modaic-ai/modaic/issues - Docs:
https://docs.modaic.dev
Project details
Release history Release notifications | RSS feed
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 modaic-0.7.2.tar.gz.
File metadata
- Download URL: modaic-0.7.2.tar.gz
- Upload date:
- Size: 73.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
717b5206514d58367553699910a21563b21bd653c04729be950cc729a0bd4397
|
|
| MD5 |
00f5ce0dd764a3bc27f0976c4fa7f8e2
|
|
| BLAKE2b-256 |
1dbadeee8c477fecf972c817fbdfad90cf80256d3eaceefe02a4ab66442337b3
|
File details
Details for the file modaic-0.7.2-py3-none-any.whl.
File metadata
- Download URL: modaic-0.7.2-py3-none-any.whl
- Upload date:
- Size: 76.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fcdfb388417e01380cb3814efc7fbcc7c5473646a10b210cb0e3b4b6595fe40d
|
|
| MD5 |
511856d73dcf3dc0921aaa6e534a938d
|
|
| BLAKE2b-256 |
c639dd14098236dd88c532e7c7bc513af4e632eb9e19f711618ecce670f95223
|