Metadata-Version: 2.4
Name: nexus-enterprise-agent
Version: 0.2.2
Summary: Enterprise-ready, SaaS-native Python multi-agent framework
Project-URL: Homepage, https://github.com/gowrav-vishwakarma/nexus-enterprise-agent
Project-URL: Repository, https://github.com/gowrav-vishwakarma/nexus-enterprise-agent
Project-URL: Documentation, https://github.com/gowrav-vishwakarma/nexus-enterprise-agent/tree/main/docs
Author: Nexus Team
License: MIT
Keywords: agents,llm,multi-agent,orchestration,saas
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
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: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Requires-Dist: anyio>=4.0
Requires-Dist: httpx>=0.27
Requires-Dist: jinja2>=3.1
Requires-Dist: pydantic-settings>=2.0
Requires-Dist: pydantic>=2.0
Requires-Dist: pyyaml>=6.0
Requires-Dist: tenacity>=8.0
Requires-Dist: tiktoken>=0.7
Provides-Extra: all
Requires-Dist: aiosqlite>=0.20; extra == 'all'
Requires-Dist: alembic>=1.13; extra == 'all'
Requires-Dist: anthropic>=0.28; extra == 'all'
Requires-Dist: asyncpg>=0.29; extra == 'all'
Requires-Dist: fastapi>=0.111; extra == 'all'
Requires-Dist: filelock>=3.13; extra == 'all'
Requires-Dist: google-genai>=1.0; extra == 'all'
Requires-Dist: groq>=0.9; extra == 'all'
Requires-Dist: grpcio-tools>=1.60; extra == 'all'
Requires-Dist: grpcio>=1.60; extra == 'all'
Requires-Dist: httpx>=0.27; extra == 'all'
Requires-Dist: litellm>=1.40; extra == 'all'
Requires-Dist: numpy>=1.26; extra == 'all'
Requires-Dist: ollama>=0.2; extra == 'all'
Requires-Dist: openai>=1.30; extra == 'all'
Requires-Dist: opentelemetry-api>=1.24; extra == 'all'
Requires-Dist: opentelemetry-exporter-otlp>=1.24; extra == 'all'
Requires-Dist: opentelemetry-sdk>=1.24; extra == 'all'
Requires-Dist: protobuf>=5.26; extra == 'all'
Requires-Dist: python-dotenv>=1.0; extra == 'all'
Requires-Dist: python-multipart>=0.0.9; extra == 'all'
Requires-Dist: sphn>=0.1.4; extra == 'all'
Requires-Dist: sse-starlette>=2.1; extra == 'all'
Requires-Dist: uvicorn[standard]>=0.30; extra == 'all'
Requires-Dist: websockets>=12; extra == 'all'
Provides-Extra: anthropic
Requires-Dist: anthropic>=0.28; extra == 'anthropic'
Provides-Extra: dev
Requires-Dist: aiosqlite>=0.20; extra == 'dev'
Requires-Dist: asyncpg>=0.29; extra == 'dev'
Requires-Dist: coverage>=7.0; extra == 'dev'
Requires-Dist: faker>=25.0; extra == 'dev'
Requires-Dist: filelock>=3.13; extra == 'dev'
Requires-Dist: hiredis>=3.0; extra == 'dev'
Requires-Dist: mypy>=1.10; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest-mock>=3.14; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: redis>=5.0; extra == 'dev'
Requires-Dist: respx>=0.21; extra == 'dev'
Requires-Dist: ruff>=0.4; extra == 'dev'
Provides-Extra: fastapi
Requires-Dist: fastapi>=0.111; extra == 'fastapi'
Requires-Dist: python-dotenv>=1.0; extra == 'fastapi'
Requires-Dist: python-multipart>=0.0.9; extra == 'fastapi'
Requires-Dist: sse-starlette>=2.1; extra == 'fastapi'
Requires-Dist: uvicorn[standard]>=0.30; extra == 'fastapi'
Requires-Dist: websockets>=12; extra == 'fastapi'
Provides-Extra: file
Requires-Dist: filelock>=3.13; extra == 'file'
Provides-Extra: gemini
Requires-Dist: google-genai>=1.0; extra == 'gemini'
Provides-Extra: groq
Requires-Dist: groq>=0.9; extra == 'groq'
Provides-Extra: grpc
Requires-Dist: grpcio-tools>=1.60; extra == 'grpc'
Requires-Dist: grpcio>=1.60; extra == 'grpc'
Requires-Dist: numpy>=1.26; extra == 'grpc'
Requires-Dist: protobuf>=5.26; extra == 'grpc'
Provides-Extra: litellm
Requires-Dist: litellm>=1.40; extra == 'litellm'
Provides-Extra: moshi
Requires-Dist: numpy>=1.26; extra == 'moshi'
Requires-Dist: sphn>=0.1.4; extra == 'moshi'
Requires-Dist: websockets>=12; extra == 'moshi'
Provides-Extra: ollama
Requires-Dist: ollama>=0.2; extra == 'ollama'
Provides-Extra: openai
Requires-Dist: openai>=1.30; extra == 'openai'
Provides-Extra: otel
Requires-Dist: opentelemetry-api>=1.24; extra == 'otel'
Requires-Dist: opentelemetry-exporter-otlp>=1.24; extra == 'otel'
Requires-Dist: opentelemetry-sdk>=1.24; extra == 'otel'
Provides-Extra: postgres
Requires-Dist: alembic>=1.13; extra == 'postgres'
Requires-Dist: asyncpg>=0.29; extra == 'postgres'
Provides-Extra: realtime
Requires-Dist: httpx>=0.27; extra == 'realtime'
Requires-Dist: websockets>=12; extra == 'realtime'
Provides-Extra: redis
Requires-Dist: hiredis; extra == 'redis'
Requires-Dist: redis>=5.0; extra == 'redis'
Provides-Extra: server
Requires-Dist: faster-whisper>=1.0; extra == 'server'
Requires-Dist: grpcio-tools>=1.60; extra == 'server'
Requires-Dist: grpcio>=1.60; extra == 'server'
Requires-Dist: numpy>=1.26; extra == 'server'
Requires-Dist: onnxruntime>=1.17; extra == 'server'
Requires-Dist: protobuf>=5.26; extra == 'server'
Requires-Dist: torch>=2.0; extra == 'server'
Requires-Dist: torchaudio>=2.0; extra == 'server'
Requires-Dist: transformers>=4.46; extra == 'server'
Provides-Extra: sqlite
Requires-Dist: aiosqlite>=0.20; extra == 'sqlite'
Requires-Dist: filelock>=3.13; extra == 'sqlite'
Provides-Extra: test
Requires-Dist: aiosqlite>=0.20; extra == 'test'
Requires-Dist: alembic>=1.13; extra == 'test'
Requires-Dist: anthropic>=0.28; extra == 'test'
Requires-Dist: asyncpg>=0.29; extra == 'test'
Requires-Dist: coverage>=7.0; extra == 'test'
Requires-Dist: faker>=25.0; extra == 'test'
Requires-Dist: fastapi>=0.111; extra == 'test'
Requires-Dist: filelock>=3.13; extra == 'test'
Requires-Dist: grpcio-tools>=1.60; extra == 'test'
Requires-Dist: grpcio>=1.60; extra == 'test'
Requires-Dist: hiredis; extra == 'test'
Requires-Dist: hiredis>=3.0; extra == 'test'
Requires-Dist: litellm>=1.40; extra == 'test'
Requires-Dist: mypy>=1.10; extra == 'test'
Requires-Dist: numpy>=1.26; extra == 'test'
Requires-Dist: openai>=1.30; extra == 'test'
Requires-Dist: protobuf>=5.26; extra == 'test'
Requires-Dist: pytest-asyncio>=0.23; extra == 'test'
Requires-Dist: pytest-mock>=3.14; extra == 'test'
Requires-Dist: pytest>=8.0; extra == 'test'
Requires-Dist: python-dotenv>=1.0; extra == 'test'
Requires-Dist: python-multipart>=0.0.9; extra == 'test'
Requires-Dist: redis>=5.0; extra == 'test'
Requires-Dist: respx>=0.21; extra == 'test'
Requires-Dist: ruff>=0.4; extra == 'test'
Requires-Dist: sse-starlette>=2.1; extra == 'test'
Requires-Dist: uvicorn[standard]>=0.30; extra == 'test'
Requires-Dist: websockets>=12; extra == 'test'
Description-Content-Type: text/markdown

# Nexus

**Enterprise-ready agent framework.** Describe agents in config. Wire who is calling and where data lives at run time. Call `run()`.

No global LLM settings. No shared agent singleton. Built for multi-tenant SaaS apps.

> **Beta — under active development.** See [NEXUS_AGENT_PRD.md](NEXUS_AGENT_PRD.md) for the design spec.

## Why Nexus?

- **SaaS-native** — tenant, user, API keys, and storage passed per request
- **Context-first (RCS)** — compresses old tool results inline; no extra LLM calls
- **Config-driven** — YAML manifests for teams; Python for wiring and tools
- **Provider-agnostic** — bring your own model; pluggable storage
- **Voice** — gRPC media servers + WebSocket browser UI on the same agent core

---

## Install

Published on PyPI as [`nexus-enterprise-agent`](https://pypi.org/project/nexus-enterprise-agent/). Import as `nexus`.

```bash
pip install nexus-enterprise-agent
# or
uv add nexus-enterprise-agent
```

| Extra | Adds |
|-------|------|
| `sqlite`, `postgres`, `redis`, `file` | Storage adapters |
| `openai`, `anthropic`, `gemini`, `litellm`, `groq`, `ollama` | LLM clients |
| `fastapi` | FastAPI + WebSocket helpers |
| `realtime` | Voice transports (`websockets`, `httpx`) |
| `grpc` | gRPC client for media servers |
| `server` | GPU media server engines (torch, transformers) |
| `moshi` | Speech-to-speech client (Moshi/Human-1) |

```bash
pip install "nexus-enterprise-agent[sqlite,litellm,fastapi,realtime,grpc]"
```

**Contributors:**

```bash
git clone https://github.com/gowrav-vishwakarma/nexus-enterprise-agent.git
cd nexus-enterprise-agent
uv sync --extra dev --extra sqlite --extra file
cp .env.example .env   # set your LLM API key
```

---

## Text agents (YAML)

Three files: manifest, prompts module, short runner script.

```bash
uv run python examples/orchestration/run_team.py "Analyze Q4 revenue"
```

- Manifest: [examples/orchestration/research_team.yaml](examples/orchestration/research_team.yaml)
- Prompts: [examples/orchestration/research_team_prompts.py](examples/orchestration/research_team_prompts.py)

**Python API** (same agents, built in code):

```python
from nexus import AgentRunner, RunContext
result = await AgentRunner(config=agent_config, tool_registry=registry, run_context=ctx).run("Hello")
```

Walkthrough: [docs/getting-started.md](docs/getting-started.md) (YAML) · [docs/getting-started-python.md](docs/getting-started-python.md) (Python)

---

## Voice agents (gRPC + Voice Lab)

Cascaded voice: VAD → STT → LLM → TTS over gRPC media servers. Browser connects via WebSocket.

```bash
./scripts/run_voice_lab.sh
```

Opens http://localhost:8787 — allow microphone, click the mic button.

- Manifest: [examples/orchestration/voice_grpc.yaml](examples/orchestration/voice_grpc.yaml)
- Media servers: [examples/servers.yaml](examples/servers.yaml)
- UI: [examples/voice_lab.py](examples/voice_lab.py)

**Python API** (same manifest, custom transport):

```python
from nexus.realtime.runtime import RealtimeRuntime
from nexus.realtime import RealtimeSession
from nexus.realtime.transport.websocket import WebSocketTransport

runtime = RealtimeRuntime.from_manifest(manifest, run_context=ctx)
pipeline = runtime.build_pipeline("voice_grpc")
session = RealtimeSession(pipeline, WebSocketTransport(websocket), session_id=sid)
await session.run_audio()
```

Guide: [docs/guides/voice-lab.md](docs/guides/voice-lab.md) · [docs/guides/model-servers.md](docs/guides/model-servers.md)

---

## Learn more

Full docs: **[docs/index.md](docs/index.md)**

| Topic | Doc |
|-------|-----|
| Architecture | [docs/architecture.md](docs/architecture.md) |
| YAML walkthrough | [docs/getting-started.md](docs/getting-started.md) |
| Python API | [docs/getting-started-python.md](docs/getting-started-python.md) |
| Voice Lab | [docs/guides/voice-lab.md](docs/guides/voice-lab.md) |
| gRPC media servers | [docs/guides/model-servers.md](docs/guides/model-servers.md) |
| Pipelines (text, voice, teams) | [docs/guides/pipelines.md](docs/guides/pipelines.md) |
| Voice / channels reference | [docs/reference/realtime-agents.md](docs/reference/realtime-agents.md) |
| SaaS example | [docs/guides/saas-example.md](docs/guides/saas-example.md) |
| All examples | [docs/examples.md](docs/examples.md) |
