Metadata-Version: 2.4
Name: touchdb-ai
Version: 2.0.2
Summary: TouchDB AI - Generate SQL queries and perform data analytics using autonomous agents
Author-email: TouchDB AI Team <contact@touchdb.ai>
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Dist: pydantic>=2.0.0
Requires-Dist: click>=8.0.0
Requires-Dist: pandas
Requires-Dist: httpx>=0.28.0
Requires-Dist: PyYAML
Requires-Dist: plotly
Requires-Dist: tabulate
Requires-Dist: sqlparse
Requires-Dist: sqlalchemy
Requires-Dist: requests
Requires-Dist: anthropic ; extra == "anthropic"
Requires-Dist: google-cloud-bigquery ; extra == "bigquery"
Requires-Dist: clickhouse_connect ; extra == "clickhouse"
Requires-Dist: duckdb ; extra == "duckdb"
Requires-Dist: fastapi>=0.68.0 ; extra == "fastapi"
Requires-Dist: uvicorn>=0.15.0 ; extra == "fastapi"
Requires-Dist: flask>=2.0.0 ; extra == "flask"
Requires-Dist: flask-cors>=4.0.0 ; extra == "flask"
Requires-Dist: google-genai ; extra == "gemini"
Requires-Dist: google-generativeai ; extra == "google"
Requires-Dist: google-cloud-aiplatform ; extra == "google"
Requires-Dist: PyMySQL ; extra == "mysql"
Requires-Dist: ollama ; extra == "ollama"
Requires-Dist: httpx ; extra == "ollama"
Requires-Dist: openai ; extra == "openai"
Requires-Dist: psycopg2-binary ; extra == "postgres"
Requires-Dist: db-dtypes ; extra == "postgres"
Requires-Dist: touchdb-ai[flask, fastapi] ; extra == "servers"
Requires-Dist: snowflake-connector-python ; extra == "snowflake"
Project-URL: Bug Tracker, https://github.com/touchdb-ai/touchdb/issues
Project-URL: Homepage, https://github.com/touchdb-ai/touchdb
Provides-Extra: anthropic
Provides-Extra: bigquery
Provides-Extra: clickhouse
Provides-Extra: duckdb
Provides-Extra: fastapi
Provides-Extra: flask
Provides-Extra: gemini
Provides-Extra: google
Provides-Extra: mysql
Provides-Extra: ollama
Provides-Extra: openai
Provides-Extra: postgres
Provides-Extra: servers
Provides-Extra: snowflake
Provides-Extra: sqlite

# TouchDB AI 🚀

**TouchDB AI** is an open-source, user-aware Agentic framework for autonomous Text-to-SQL generation, data analysis, and conversational database intelligence.

---

## Key Highlights

- **User-Aware Security & Multi-Tenancy**: Granular permissions, request-context user resolution, and role-based tool execution.
- **Pluggable Database Runners**: Native support for SQLite, DuckDB, PostgreSQL, MySQL, Snowflake, BigQuery, ClickHouse, and more.
- **Multi-LLM Support**: Seamless integrations with Google Gemini, OpenAI, Anthropic Claude, Ollama (local models), and custom LLM providers.
- **Adaptive Tool Memory**: Stores successful execution patterns in memory, getting smarter with each interaction.
- **Pre-built Web Server & CLI**: Built-in interactive CLI and FastAPI / Flask server components.

---

## Quick Installation

```bash
pip install -e .
```

Or install with database / LLM extras:
```bash
pip install -e ".[fastapi,openai,gemini]"
```

---

## Quickstart Example

```python
import asyncio
from touchdb import Agent, AgentConfig, ToolRegistry, User
from touchdb.core.user.resolver import UserResolver
from touchdb.core.user.request_context import RequestContext
from touchdb.integrations.local.agent_memory.in_memory import DemoAgentMemory
from touchdb.integrations.sqlite import SqliteRunner
from touchdb.tools import RunSqlTool
from touchdb.integrations.mock import MockLlmService

# 1. Setup Database Runner & Tool
runner = SqliteRunner(database_path="ecommerce.db")
sql_tool = RunSqlTool(sql_runner=runner)

registry = ToolRegistry()
registry.register_local_tool(sql_tool, access_groups=["default"])

# 2. Define User Resolver
class SimpleUserResolver(UserResolver):
    async def resolve_user(self, ctx: RequestContext) -> User:
        return User(id="user_1", username="admin", group_memberships=["default"])

# 3. Create TouchDB Agent
agent = Agent(
    llm_service=MockLlmService(response_content="Querying database..."),
    tool_registry=registry,
    user_resolver=SimpleUserResolver(),
    agent_memory=DemoAgentMemory(),
    config=AgentConfig(stream_responses=False)
)

# 4. Ask questions
async def ask(question: str):
    async for component in agent.send_message(
        request_context=RequestContext(),
        message=question,
        conversation_id="conv_1"
    ):
        if component.rich_component and hasattr(component.rich_component, "content"):
            print(component.rich_component.content)

asyncio.run(ask("Show top 5 sales"))
```

---

## Interactive CLI & Web Server

TouchDB AI includes an interactive CLI and web server:

```bash
# Start TouchDB Server with FastAPI
touchdb --framework fastapi --port 8000 --example mock_custom_tool

# List available examples
touchdb --list-examples
```

---

## License

MIT License.

