Metadata-Version: 2.3
Name: radioshaq
Version: 0.1.3.dev202603090052
Summary: RadioShaq: Ham Radio AI Orchestration and Remote SDR Reception System
Project-URL: Homepage, https://github.com/radioshaq/radioshaq
Project-URL: Documentation, https://radioshaq.readthedocs.io
Project-URL: Repository, https://github.com/radioshaq/radioshaq
Project-URL: Issues, https://github.com/radioshaq/radioshaq/issues
Author: RadioShaq Contributors
License: GPL-2.0-only
Keywords: ai-agent,emergency-communications,ham-radio,orchestrator,radio,react-pattern,sdr
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: Intended Audience :: Telecommunications Industry
Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2)
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Communications :: Ham Radio
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.11
Requires-Dist: aiohttp>=3.13
Requires-Dist: aiosqlite>=0.22
Requires-Dist: alembic>=1.18
Requires-Dist: anthropic>=0.84
Requires-Dist: asyncpg>=0.31
Requires-Dist: aws-lambda-powertools>=3.24
Requires-Dist: boto3>=1.42
Requires-Dist: botocore>=1.42
Requires-Dist: croniter>=6
Requires-Dist: fastapi>=0.134
Requires-Dist: geoalchemy2>=0.18
Requires-Dist: httpx>=0.28
Requires-Dist: litellm>=1.81
Requires-Dist: loguru>=0.7
Requires-Dist: mangum>=0.21
Requires-Dist: mistralai>=1.12
Requires-Dist: numpy>=2.4
Requires-Dist: oauth-cli-kit>=0.1
Requires-Dist: openai>=2.24
Requires-Dist: orjson>=3.11
Requires-Dist: passlib[bcrypt]>=1.7
Requires-Dist: psycopg2-binary>=2.9
Requires-Dist: pydantic-settings>=2.13
Requires-Dist: pydantic>=2.12
Requires-Dist: pyjwt>=2.11
Requires-Dist: python-dateutil>=2.9
Requires-Dist: python-dotenv>=1.2
Requires-Dist: python-jose[cryptography]>=3.5
Requires-Dist: python-multipart>=0.0.22
Requires-Dist: python-telegram-bot>=22
Requires-Dist: pytz>=2025.2
Requires-Dist: rich>=14
Requires-Dist: scipy>=1.17
Requires-Dist: sqlalchemy[asyncio]>=2.0.47
Requires-Dist: tenacity>=9.1
Requires-Dist: twilio>=9.10
Requires-Dist: typer>=0.24
Requires-Dist: urllib3<2
Requires-Dist: uvicorn[standard]>=0.41
Requires-Dist: watchdog>=6
Requires-Dist: websockets>=16
Provides-Extra: audio
Requires-Dist: accelerate>=1.0; extra == 'audio'
Requires-Dist: mistral-common[audio]>=1.8.1; extra == 'audio'
Requires-Dist: openai-whisper>=20231117; extra == 'audio'
Requires-Dist: peft>=0.18; extra == 'audio'
Requires-Dist: torch>=2.0; extra == 'audio'
Requires-Dist: transformers>=4.54; extra == 'audio'
Provides-Extra: dev
Requires-Dist: ipdb>=0.13; extra == 'dev'
Requires-Dist: ipython>=9; extra == 'dev'
Requires-Dist: mypy>=1.19; extra == 'dev'
Requires-Dist: pre-commit>=4.5; extra == 'dev'
Requires-Dist: pytest-asyncio>=1.3; extra == 'dev'
Requires-Dist: pytest-cov>=7; extra == 'dev'
Requires-Dist: pytest-mock>=3.15; extra == 'dev'
Requires-Dist: pytest>=9; extra == 'dev'
Requires-Dist: ruff>=0.15; extra == 'dev'
Provides-Extra: hackrf
Requires-Dist: python-hackrf>=1.5; (sys_platform != 'win32') and extra == 'hackrf'
Provides-Extra: metrics
Requires-Dist: prometheus-client>=0.21; extra == 'metrics'
Provides-Extra: radio
Provides-Extra: sdr
Requires-Dist: pyrtlsdr>=0.4; extra == 'sdr'
Provides-Extra: test
Requires-Dist: factory-boy>=3.3; extra == 'test'
Requires-Dist: faker>=40; extra == 'test'
Requires-Dist: freezegun>=1.5; extra == 'test'
Requires-Dist: pytest-asyncio>=1.3; extra == 'test'
Requires-Dist: pytest-cov>=7; extra == 'test'
Requires-Dist: pytest-mock>=3.15; extra == 'test'
Requires-Dist: pytest>=9; extra == 'test'
Requires-Dist: responses>=0.26; extra == 'test'
Requires-Dist: respx>=0.22; extra == 'test'
Provides-Extra: tts-kokoro
Requires-Dist: kokoro>=0.9.4; extra == 'tts-kokoro'
Requires-Dist: soundfile>=0.12.1; extra == 'tts-kokoro'
Provides-Extra: voice-rx
Requires-Dist: noisereduce>=3.0; extra == 'voice-rx'
Requires-Dist: numpy>=2.4; extra == 'voice-rx'
Requires-Dist: sounddevice>=0.4.6; extra == 'voice-rx'
Requires-Dist: soundfile>=0.12.1; extra == 'voice-rx'
Requires-Dist: webrtcvad-wheels>=2.0.11; extra == 'voice-rx'
Provides-Extra: voice-tx
Requires-Dist: pydub>=0.25.1; extra == 'voice-tx'
Requires-Dist: sounddevice>=0.4.6; extra == 'voice-tx'
Requires-Dist: soundfile>=0.12.1; extra == 'voice-tx'
Description-Content-Type: text/markdown

# RadioShaq

**S**trategic **H**am **R**adio **A**utonomous **Q**uery and **K**ontrol System

An AI-powered orchestrator for ham radio operations, emergency communications, and field-to-HQ coordination. One install gives you the API, web UI, and optional remote SDR receiver.

---

## Install

```bash
pip install radioshaq
```

**Optional (for SDR hardware):** `pip install radioshaq[sdr]` (RTL-SDR) or `radioshaq[hackrf]` (HackRF).

**Requirements:** Python 3.11+

**License notice:** RadioShaq is distributed under GPL-2.0-only. Official CLI and web UI require explicit license acceptance before normal use.

---

## Easiest way to get started: interactive setup

From a project directory (or the repo root), run:

```bash
radioshaq setup
```

This walks you through:

- **Mode** — field, hq, or receiver
- **Database** — use Docker Postgres or an existing URL
- **Secrets** — JWT secret, LLM API key (optional)
- **Config** — writes `.env` and `config.yaml`, can start Docker and run migrations

**Minimal prompts:** `radioshaq setup --quick` (mode + “use Docker?” then defaults).

**Non-interactive (CI/scripts):** `radioshaq setup --no-input --mode field` (optionally `--db-url postgresql://...`).

**Reconfigure:** `radioshaq setup --reconfigure` to update existing config without starting over.

---

## Run the API and web UI

```bash
radioshaq run-api
```

- **API docs:** http://localhost:8000/docs  
- **Web UI:** http://localhost:8000/  
- **Health:** http://localhost:8000/health  

Default host: `0.0.0.0`, port: `8000`. Override with `--host` and `--port`.

---

## Get a token (auth)

Most API calls need a Bearer JWT:

```bash
radioshaq token --subject op1 --role field --station-id STATION-01
```

Then set `RADIOSHAQ_TOKEN` to the printed value, or pass it in requests. Roles: `field`, `hq`, `receiver`.

**Check API from the CLI:**

```bash
radioshaq health
radioshaq health --ready
```

---

## CLI at a glance

| Command | What it does |
|--------|------------------|
| **setup** | |
| `radioshaq setup` | Interactive setup: .env, config.yaml, optional Docker and migrations |
| `radioshaq setup --quick` | Minimal prompts (mode, use Docker?), then defaults |
| `radioshaq setup --no-input --mode field` | Non-interactive for CI; optional `--db-url`, `--config-dir` |
| `radioshaq setup --reconfigure` | Update existing config (merge sections) |
| **Server & auth** | |
| `radioshaq run-api` | Start FastAPI server (and web UI at /). Options: `--host`, `--port`, `--reload` |
| `radioshaq run-receiver` | Start remote SDR receiver (port 8765). Set `JWT_SECRET`, `STATION_ID`, `HQ_URL` |
| `radioshaq token` | Get JWT. Options: `--subject`, `--role`, `--station-id`, `--base-url` |
| `radioshaq health` | Liveness check; `radioshaq health --ready` for readiness |
| **Callsigns** (require `RADIOSHAQ_TOKEN`) | |
| `radioshaq callsigns list` | List registered callsigns |
| `radioshaq callsigns add <callsign>` | Register a callsign |
| `radioshaq callsigns remove <callsign>` | Remove from whitelist |
| `radioshaq callsigns register-from-audio <file>` | Register from audio (ASR) |
| **Messages** | |
| `radioshaq message process <text>` | Send message through REACT orchestrator |
| `radioshaq message inject <text>` | Inject into RX path (demo). Options: `--band`, `--mode`, `--source-callsign` |
| `radioshaq message whitelist-request <text>` | Whitelist request (orchestrator + optional TTS) |
| `radioshaq message relay <msg> --source-band X --target-band Y` | Relay message between bands |
| **Transcripts** | |
| `radioshaq transcripts list` | List transcripts. Options: `--callsign`, `--band`, `--since`, `--limit` |
| `radioshaq transcripts get <id>` | Get one transcript |
| `radioshaq transcripts play <id>` | Play transcript as TTS over radio |
| **Radio** | |
| `radioshaq radio bands` | List bands |
| `radioshaq radio send-tts <message>` | Send TTS over radio. Options: `--frequency-hz`, `--mode` |

Use `radioshaq --help` and `radioshaq <command> --help` for options. API base URL: `RADIOSHAQ_API` (default `http://localhost:8000`).

---

## Remote receiver (SDR listen-only)

For a listen-only station (e.g. Raspberry Pi + RTL-SDR) that streams to HQ:

```bash
pip install radioshaq[sdr]   # or radioshaq[hackrf] for HackRF
export JWT_SECRET=your-secret
export STATION_ID=RECEIVER-01
export HQ_URL=http://your-hq:8000
radioshaq run-receiver
```

HQ accepts uploads at `POST /receiver/upload` (Bearer JWT). Default receiver port: `8765` (`--port` to change).

---

## After install (no interactive setup)

If you prefer to configure by hand:

1. **Database:** Set `DATABASE_URL` or `POSTGRES_*` (and run migrations with your Alembic config).
2. **Config:** Copy `config.example.yaml` to `config.yaml` and set `mode`, `database`, `auth`, etc. See [Configuration](https://radioshaq.readthedocs.io/configuration/).
3. **Start:** `radioshaq run-api`.

---

## Documentation

- [Quick Start](https://radioshaq.readthedocs.io/quick-start/)
- [Configuration](https://radioshaq.readthedocs.io/configuration/)
- [API Reference](https://radioshaq.readthedocs.io/api-reference/)
- [Radio / hardware](https://radioshaq.readthedocs.io/radio-usage/)

---

## License

GPL-2.0-only
