Metadata-Version: 2.4
Name: pychartai
Version: 0.5.0
Summary: AI-powered data analysis and chart generation with 20 chart types, 3 backends, 8 LLM providers, conversation memory, auto-EDA profiling, chart themes, and RestrictedSandbox. Works standalone.
Author-email: Cem Akpolat <cem.akpolat@eficode.com>
License: MIT
Project-URL: Repository, https://github.com/cemakpolat/pychartai
Project-URL: Homepage, https://github.com/cemakpolat/pychartai
Project-URL: Bug Tracker, https://github.com/cemakpolat/pychartai/issues
Project-URL: Changelog, https://github.com/cemakpolat/pychartai/blob/main/CHANGELOG.md
Keywords: pandas,llm,charts,visualization,ai,data-analysis,seaborn,plotly,matplotlib,ollama,openai,skills,schema,pipeline,sandbox
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Scientific/Engineering :: Visualization
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pandas>=2.0.0
Requires-Dist: numpy>=1.24.0
Requires-Dist: requests>=2.31.0
Requires-Dist: python-dotenv>=1.0.0
Requires-Dist: matplotlib>=3.7.0
Requires-Dist: seaborn>=0.12.0
Requires-Dist: scipy>=1.10.0
Requires-Dist: RestrictedPython<9,>=7.0
Requires-Dist: litellm<2,>=1.35.0
Requires-Dist: tenacity>=8.0.0
Provides-Extra: viz-plotly
Requires-Dist: plotly>=5.0.0; extra == "viz-plotly"
Requires-Dist: kaleido>=0.2.1; extra == "viz-plotly"
Provides-Extra: db-postgres
Requires-Dist: psycopg2-binary>=2.9.0; extra == "db-postgres"
Requires-Dist: sqlalchemy>=2.0.0; extra == "db-postgres"
Provides-Extra: db-mysql
Requires-Dist: pymysql>=1.1.0; extra == "db-mysql"
Requires-Dist: sqlalchemy>=2.0.0; extra == "db-mysql"
Provides-Extra: db-snowflake
Requires-Dist: snowflake-sqlalchemy>=1.5.0; extra == "db-snowflake"
Provides-Extra: db-bigquery
Requires-Dist: google-cloud-bigquery>=3.0.0; extra == "db-bigquery"
Requires-Dist: sqlalchemy-bigquery>=1.6.0; extra == "db-bigquery"
Provides-Extra: db-redshift
Requires-Dist: redshift-connector>=2.0.0; extra == "db-redshift"
Requires-Dist: sqlalchemy>=2.0.0; extra == "db-redshift"
Provides-Extra: db-all
Requires-Dist: psycopg2-binary>=2.9.0; extra == "db-all"
Requires-Dist: pymysql>=1.1.0; extra == "db-all"
Requires-Dist: snowflake-sqlalchemy>=1.5.0; extra == "db-all"
Requires-Dist: google-cloud-bigquery>=3.0.0; extra == "db-all"
Requires-Dist: sqlalchemy-bigquery>=1.6.0; extra == "db-all"
Requires-Dist: redshift-connector>=2.0.0; extra == "db-all"
Requires-Dist: sqlalchemy>=2.0.0; extra == "db-all"
Provides-Extra: cloud-s3
Requires-Dist: boto3>=1.26.0; extra == "cloud-s3"
Provides-Extra: cloud-gcs
Requires-Dist: google-cloud-storage>=2.10.0; extra == "cloud-gcs"
Provides-Extra: cloud-azure
Requires-Dist: azure-storage-blob>=12.14.0; extra == "cloud-azure"
Provides-Extra: cloud-gsheets
Requires-Dist: google-api-python-client>=2.80.0; extra == "cloud-gsheets"
Requires-Dist: google-auth>=2.16.0; extra == "cloud-gsheets"
Provides-Extra: cloud-all
Requires-Dist: boto3>=1.26.0; extra == "cloud-all"
Requires-Dist: google-cloud-storage>=2.10.0; extra == "cloud-all"
Requires-Dist: azure-storage-blob>=12.14.0; extra == "cloud-all"
Requires-Dist: google-api-python-client>=2.80.0; extra == "cloud-all"
Requires-Dist: google-auth>=2.16.0; extra == "cloud-all"
Provides-Extra: api
Requires-Dist: fastapi>=0.100.0; extra == "api"
Requires-Dist: uvicorn[standard]>=0.20.0; extra == "api"
Requires-Dist: python-multipart>=0.0.6; extra == "api"
Provides-Extra: mcp
Requires-Dist: mcp>=1.0.0; extra == "mcp"
Provides-Extra: dev
Requires-Dist: pytest>=7.4.3; extra == "dev"
Requires-Dist: mcp>=1.0.0; extra == "dev"
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
Requires-Dist: openpyxl>=3.1.0; extra == "dev"
Requires-Dist: pyarrow>=14.0.0; extra == "dev"
Requires-Dist: plotly>=5.0.0; extra == "dev"
Requires-Dist: kaleido>=0.2.1; extra == "dev"
Provides-Extra: docs
Requires-Dist: mkdocs>=1.5.0; extra == "docs"
Requires-Dist: mkdocs-material>=9.0.0; extra == "docs"
Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "docs"
Dynamic: license-file

# pychartai

> Natural-language data analysis and chart generation.
> Use it as a Python library, a CLI, or an MCP server for Claude/Copilot/Cursor.

---

## Quick Start

```bash
pip install pychartai
```

```python
import pychartai as pai

# Set DEEPSEEK_API_KEY in .env, then:
pai.init(provider="deepseek", model="deepseek-chat")

df = pai.read_csv("data.csv")
print(df.chat("What is revenue by region?"))
path = df.chat("Bar chart of revenue by region")  # interactive HTML
print(df.profile().summary)                        # auto-EDA, no LLM
```

## Three Ways to Use It

### 1. MCP Server (for Claude Desktop / Copilot / Cursor)

```bash
make mcp-server
# or: pychartai-mcp
```

Add to `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "pychartai": {
      "command": "python",
      "args": ["-m", "pychartai_mcp.server"],
      "env": {"DEEPSEEK_API_KEY": "sk-..."}
    }
  }
}
```

Then in Claude: *"Load sales.csv and show revenue by region as a chart"*

**Available MCP tools:** `analyze_data`, `create_chart`, `profile_data`

### 2. Python Library

```python
import pychartai as pai

pai.init(provider="deepseek", model="deepseek-chat")

sdf = pai.read_csv("sales.csv")
print(sdf.chat("Top 3 products by revenue?"))
path = sdf.chat("Bar chart of revenue by region")

# Streaming, memory, profiling
for event in sdf.chat_stream("Summarize this"):
    if event.type == "token": print(event.value, end="")
sdf.enable_memory()
sdf.chat("Follow-up question")
```

### 3. CLI

```bash
pychartai data.csv "Revenue by region?"
pychartai data.csv --profile          # auto-EDA, no LLM
pychartai data.csv "Bar chart" --backend plotly
```

## Features

| Category | What you get |
|---|---|
| **Chart backends** | Seaborn (PNG) · Matplotlib (PNG) · Plotly (interactive HTML) |
| **Chart types** | 20: area · bar · box · bubble · count · ecdf · funnel · heatmap · histogram · kde · line · pairplot · pie · regression · scatter · stacked_bar · step · strip · swarm · violin |
| **LLM Providers** | DeepSeek · OpenAI · GitHub · Gemini · Anthropic · Qwen · Ollama |
| **Sandbox** | RestrictedPython (default) · Docker (optional) |
| **Data connectors** | CSV · Excel · JSON · Parquet · PostgreSQL · MySQL · Snowflake · BigQuery · Redshift · S3 · GCS · Azure Blob · Google Sheets |
| **Memory** | Sliding-window conversation memory for follow-up queries |
| **Profiling** | `df.profile()` — stats, missing values, correlations (no LLM) |
| **MCP Server** | Expose data analysis as tools for Claude/Copilot/Cursor |

## Installation

```bash
pip install pychartai

# Optional extras:
pip install pychartai[viz-plotly]   # interactive Plotly charts
pip install pychartai[db-postgres]  # PostgreSQL connector
```

Set your API key in `.env`:

```bash
DEEPSEEK_API_KEY=sk-...
OPENAI_API_KEY=sk-...
```

## Configuration

### models.yml (auto-discovered)

```yaml
default_model: deepseek-v4-flash
models:
  deepseek-v4-flash:
    provider: deepseek
    model: deepseek-chat
    api_key_env: DEEPSEEK_API_KEY
settings:
  chart_backend: plotly
```

```python
pai.init()                              # auto-discover + default_model
pai.init(model="deepseek-v4-flash")     # by name
pai.init(provider="deepseek", model="deepseek-chat")  # inline
```

## Makefile Reference

```
Setup:     make install    make venv    make prepare-data
Offline:   make test       make demo    make gallery
With LLM:  make demo-advanced [PROVIDER=deepseek]
MCP:       make mcp-server
```

---

## License

MIT
