Metadata-Version: 2.4
Name: lexigram-ai
Version: 0.1.1
Summary: AI Layer for Lexigram Framework - Native LLM, Vector, RAG integration
Project-URL: Homepage, https://github.com/lexigram-dev/lexigram-ai
Project-URL: Repository, https://github.com/lexigram-dev/lexigram-ai
Project-URL: Documentation, https://docs.lexigram.dev/ai
Project-URL: Issues, https://github.com/lexigram-dev/lexigram-ai/issues
Project-URL: Changelog, https://github.com/lexigram-dev/lexigram-ai/blob/main/CHANGELOG.md
Author-email: Lexigram Framework Team <team@lexigram.dev>
Maintainer-email: Lexigram Framework Team <team@lexigram.dev>
License: MIT
License-File: LICENSE
Keywords: agents,ai,artificial-intelligence,framework,intelligence,llm,rag,vector
Classifier: Development Status :: 4 - Beta
Classifier: Framework :: AsyncIO
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: lexigram-ai-feedback>=0.1.0
Requires-Dist: lexigram-ai-llm>=0.1.0
Requires-Dist: lexigram-ai-observability>=0.1.0
Requires-Dist: lexigram-ai-rag>=0.1.0
Requires-Dist: lexigram-contracts>=0.1.0
Requires-Dist: lexigram>=0.1.1
Requires-Dist: numpy>=1.25.0
Provides-Extra: ai
Requires-Dist: chromadb>=0.4.0; extra == 'ai'
Requires-Dist: jinja2>=3.1.0; extra == 'ai'
Requires-Dist: pgvector>=0.2.0; extra == 'ai'
Requires-Dist: pypdf>=3.0.0; extra == 'ai'
Requires-Dist: qdrant-client>=1.7.0; extra == 'ai'
Requires-Dist: scikit-learn>=1.3.0; extra == 'ai'
Requires-Dist: tiktoken>=0.5.0; extra == 'ai'
Provides-Extra: all
Requires-Dist: anthropic>=0.20.0; extra == 'all'
Requires-Dist: beautifulsoup4>=4.12.0; extra == 'all'
Requires-Dist: black>=23.0.0; extra == 'all'
Requires-Dist: chromadb>=0.4.0; extra == 'all'
Requires-Dist: jinja2>=3.1.0; extra == 'all'
Requires-Dist: joblib>=1.3.0; extra == 'all'
Requires-Dist: jsonschema>=4.0.0; extra == 'all'
Requires-Dist: lexigram-ai-feedback>=0.1.0; extra == 'all'
Requires-Dist: lexigram-ai-llm>=0.1.0; extra == 'all'
Requires-Dist: lexigram-ai-observability>=0.1.0; extra == 'all'
Requires-Dist: lexigram-ai-rag>=0.1.0; extra == 'all'
Requires-Dist: lexigram-testing>=0.1.1; extra == 'all'
Requires-Dist: lexigram-vector>=0.2.0; extra == 'all'
Requires-Dist: markdown>=3.5.0; extra == 'all'
Requires-Dist: milvus>=2.3.0; extra == 'all'
Requires-Dist: mkdocs-material>=9.0.0; extra == 'all'
Requires-Dist: mkdocs>=1.4.0; extra == 'all'
Requires-Dist: mypy>=1.0.0; extra == 'all'
Requires-Dist: numpy>=1.25.0; extra == 'all'
Requires-Dist: ollama>=0.1.0; extra == 'all'
Requires-Dist: openai>=1.0.0; extra == 'all'
Requires-Dist: pgvector>=0.2.0; extra == 'all'
Requires-Dist: pinecone-client>=2.2.0; extra == 'all'
Requires-Dist: pre-commit>=3.0.0; extra == 'all'
Requires-Dist: psycopg[binary]>=3.1.0; extra == 'all'
Requires-Dist: pypdf>=3.0.0; extra == 'all'
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'all'
Requires-Dist: pytest-cov>=4.0.0; extra == 'all'
Requires-Dist: pytest-mock>=3.10.0; extra == 'all'
Requires-Dist: pytest>=8.0.0; extra == 'all'
Requires-Dist: pyyaml>=6.0; extra == 'all'
Requires-Dist: qdrant-client>=1.7.0; extra == 'all'
Requires-Dist: redis>=5.0.0; extra == 'all'
Requires-Dist: ruff>=0.1.0; extra == 'all'
Requires-Dist: scikit-learn>=1.3.0; extra == 'all'
Requires-Dist: scipy>=1.11.0; extra == 'all'
Requires-Dist: sentence-transformers>=2.2.0; extra == 'all'
Requires-Dist: tiktoken>=0.5.0; extra == 'all'
Requires-Dist: weaviate-client>=3.20.0; extra == 'all'
Requires-Dist: xgboost>=2.0.0; extra == 'all'
Provides-Extra: dev
Requires-Dist: black>=23.0.0; extra == 'dev'
Requires-Dist: mypy>=1.0.0; extra == 'dev'
Requires-Dist: pre-commit>=3.0.0; extra == 'dev'
Requires-Dist: ruff>=0.1.0; extra == 'dev'
Requires-Dist: types-beautifulsoup4>=4.12.0; extra == 'dev'
Requires-Dist: types-pillow>=9.0.0; extra == 'dev'
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
Requires-Dist: types-requests>=2.31.0; extra == 'dev'
Provides-Extra: docs
Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
Requires-Dist: mkdocs>=1.4.0; extra == 'docs'
Provides-Extra: feedback
Requires-Dist: lexigram-ai-feedback>=0.1.0; extra == 'feedback'
Provides-Extra: llm
Requires-Dist: anthropic>=0.20.0; extra == 'llm'
Requires-Dist: lexigram-ai-llm>=0.1.0; extra == 'llm'
Requires-Dist: ollama>=0.1.0; extra == 'llm'
Requires-Dist: openai>=1.0.0; extra == 'llm'
Requires-Dist: openrouter>=0.1.0; extra == 'llm'
Provides-Extra: llm-utils
Requires-Dist: jinja2>=3.1.0; extra == 'llm-utils'
Requires-Dist: redis>=5.0.0; extra == 'llm-utils'
Requires-Dist: tiktoken>=0.5.0; extra == 'llm-utils'
Provides-Extra: observability
Requires-Dist: lexigram-ai-observability>=0.1.0; extra == 'observability'
Provides-Extra: rag
Requires-Dist: beautifulsoup4>=4.12.0; extra == 'rag'
Requires-Dist: lexigram-ai-rag>=0.1.0; extra == 'rag'
Requires-Dist: markdown>=3.5.0; extra == 'rag'
Requires-Dist: opencv-python-headless>=4.8.0; extra == 'rag'
Requires-Dist: pillow>=10.0.0; extra == 'rag'
Requires-Dist: pypdf>=3.0.0; extra == 'rag'
Requires-Dist: sentence-transformers>=2.2.0; extra == 'rag'
Provides-Extra: test
Requires-Dist: jsonschema>=4.0.0; extra == 'test'
Requires-Dist: lexigram-testing>=0.1.1; extra == 'test'
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'test'
Requires-Dist: pytest-cov>=4.0.0; extra == 'test'
Requires-Dist: pytest-mock>=3.10.0; extra == 'test'
Requires-Dist: pytest>=8.0.0; extra == 'test'
Requires-Dist: pyyaml>=6.0; extra == 'test'
Provides-Extra: vector
Requires-Dist: chromadb>=0.4.0; extra == 'vector'
Requires-Dist: lexigram-vector>=0.2.0; extra == 'vector'
Requires-Dist: milvus>=2.3.0; extra == 'vector'
Requires-Dist: pgvector>=0.2.0; extra == 'vector'
Requires-Dist: pinecone-client>=2.2.0; extra == 'vector'
Requires-Dist: psycopg[binary]>=3.1.0; extra == 'vector'
Requires-Dist: qdrant-client>=1.7.0; extra == 'vector'
Requires-Dist: weaviate-client>=3.20.0; extra == 'vector'
Description-Content-Type: text/markdown

# lexigram-ai

AI Layer for Lexigram Framework - Native LLM, Vector, RAG integration

---

## Overview

`lexigram-ai` is the **AI orchestration layer** for the Lexigram Framework. It is a thin coordinator package that wires together independent AI sub-packages (`lexigram-ai-llm`, `lexigram-ai-rag`, `lexigram-ai-agents`, etc.) via the framework's DI container and entry-point discovery, and exposes a single `AIModule` entry point for application composition. Zero-config usage starts with sensible defaults.

## Install

```bash
uv add lexigram-ai
# Optional extras
uv add "lexigram-ai[llm,vector,rag,governance,observability]"
```

## Quick Start

```python
from lexigram import Application
from lexigram.di.module import Module, module

from lexigram.ai import AIModule

@module(imports=[AIModule.configure()])
class AppModule(Module):
    pass

app = Application(modules=[AppModule])
if __name__ == "__main__":
    app.run()
```

## Configuration

> **Zero-config usage:** Call `AIModule.configure()` with no arguments to use defaults.

### Option 1 — YAML file

```yaml
# application.yaml
ai:
  llm:
    default_provider: "openai"
    openai:
      api_key: "${OPENAI_API_KEY}"
  rag:
    enabled: true
  governance:
    enabled: true
    monthly_budget: 1000.0
```

### Option 2 — Profiles + Environment Variables *(recommended)*

```bash
export LEX_PROFILE=production
# Environment variables for each field
```

### Option 3 — Python

```python
from lexigram.ai.config import AIConfig
from lexigram.ai import AIModule

config = AIConfig(...)
AIModule.configure(config)
```

### Config reference

| Field | Default | Env var | Description |
|-------|---------|---------|-------------|
| `enabled` | `True` | `LEX_AI__ENABLED` | Global AI feature toggle |
| `llm` | `None` | `LEX_AI_LLM__*` | LLM provider config |
| `vector` | `None` | `LEX_AI__VECTOR__*` | Vector store config |
| `rag` | `None` | `LEX_AI__RAG__*` | RAG pipeline config |
| `governance` | default | `LEX_AI__GOVERNANCE__*` | Policy enforcement config |
| `observability` | default | `LEX_AI__OBSERVABILITY__*` | Tracing and metrics config |
| `subsystems` | `{}` | — | Config for third-party entry-point subsystems |

## Module Factory Methods

| Method | Description |
|--------|-------------|
| `AIModule.configure(config)` | Configure with explicit config |
| `AIModule.stub()` | Minimal config for testing |

## Key Features

- **AI orchestration**: Thin coordinator wiring all AI sub-packages via DI
- **Entry-point discovery**: Discovers sub-packages via `lexigram.ai.subsystems` entry points
- **Multi-provider support**: Integrates LLM, RAG, agents, memory, governance, and observability
- **Production security**: Validates API keys in production environments

## Testing

```python
async with Application.boot(modules=[AIModule.stub()]) as app:
    # your test code
    ...
```

## Key Source Files

| File | What it contains |
|------|-----------------|
| `src/lexigram/ai/__init__.py` | Lazy-loaded public API: `AIModule`, `AIProvider`, `AIConfig` |
| `src/lexigram/ai/module.py` | `AIModule.configure()` and `AIModule.stub()` |
| `src/lexigram/ai/config.py` | `AIConfig` and `get_subsystem_config()` |
| `src/lexigram/ai/di/provider.py` | `AIProvider` — registers and boots sub-providers |
| `src/lexigram/ai/exceptions.py` | `AIError` base exception |
