{"id":26531709,"url":"https://github.com/agrathwohl/assistive-llm","last_synced_at":"2026-05-18T19:32:16.794Z","repository":{"id":281978452,"uuid":"947079244","full_name":"agrathwohl/assistive-llm","owner":"agrathwohl","description":"An assistive service for LLM streaming, delivering RTP payloads of streaming LLM text comparible with most modern TTY and RTT devices.","archived":false,"fork":false,"pushed_at":"2025-03-12T15:11:16.000Z","size":442,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-21T18:36:48.587Z","etag":null,"topics":["accessibility","assistive","deaf","hard-of-hearing","llm","t140"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/agrathwohl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-12T05:50:46.000Z","updated_at":"2025-03-13T17:45:17.000Z","dependencies_parsed_at":"2025-03-12T06:38:20.625Z","dependency_job_id":"3ef54d7c-cabd-4f21-bb00-cf1c3fc117b0","html_url":"https://github.com/agrathwohl/assistive-llm","commit_stats":null,"previous_names":["agrathwohl/assistive-llm"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/agrathwohl/assistive-llm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agrathwohl%2Fassistive-llm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agrathwohl%2Fassistive-llm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agrathwohl%2Fassistive-llm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agrathwohl%2Fassistive-llm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/agrathwohl","download_url":"https://codeload.github.com/agrathwohl/assistive-llm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agrathwohl%2Fassistive-llm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274506697,"owners_count":25298551,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-10T02:00:12.551Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","assistive","deaf","hard-of-hearing","llm","t140"],"created_at":"2025-03-21T18:29:50.738Z","updated_at":"2026-05-18T19:32:16.787Z","avatar_url":"https://github.com/agrathwohl.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Assistive LLM\n\nA comprehensive assistive device interface for LLM streaming using the T.140 real-time text protocol. This application helps users with disabilities, particularly those who are deaf or hard-of-hearing, by providing real-time text communication from large language models (LLMs) to their assistive devices.\n\n## Features\n\n### Core Features\n- **Multiple Transport Protocols**: WebSocket, RTP, SRTP, Unix sockets (STREAM and SEQPACKET)\n- **LLM Provider Support**: OpenAI GPT models and Anthropic Claude models\n- **Advanced T.140 Features**:\n  - Forward Error Correction (FEC)\n  - Redundancy (RED) for reliability\n  - Configurable character rate limiting\n  - Backspace processing\n- **Device Management**: Easy-to-use web interface for managing assistive devices\n- **Conversation History**: Persistent conversation tracking and management\n- **Real-time Streaming**: Native t140llm integration for optimal performance\n- **Security**: SRTP support for encrypted communications\n\n### Supported Device Types\n- Hearing devices (for deaf or hard-of-hearing users)\n- Visual devices (for blind or low vision users)\n- Mobility devices (for users with mobility impairments)\n- Cognitive devices (for users with cognitive disabilities)\n- Multi-purpose devices\n\n## Screenshots\n\n### Device Management Interface\n![Device Management](assets/devices-1.png)\n*Manage all your assistive devices, view connection status, and control device connections from a single interface.*\n\n### LLM Chat Interface\n![LLM Chat Interface](assets/llm-chat-1.png)\n*Send prompts to one or multiple devices simultaneously, with real-time streaming from OpenAI or Anthropic LLMs.*\n\n### System Settings\n![Settings](assets/settings-1.png)\n*Configure API keys, default providers, and global system settings.*\n\n## Table of Contents\n\n- [Quick Start](#quick-start)\n- [Prerequisites](#prerequisites)\n- [Installation](#installation)\n- [Configuration](#configuration)\n- [User Guides](#user-guides)\n  - [First-Time Setup](#first-time-setup)\n  - [Adding Your First Device](#adding-your-first-device)\n  - [Streaming LLM Responses](#streaming-llm-responses)\n  - [Managing Conversations](#managing-conversations)\n  - [Advanced Features](#advanced-features)\n- [API Documentation](#api-documentation)\n- [Troubleshooting](#troubleshooting)\n- [Cloud Deployment](#cloud-deployment)\n- [Contributing](#contributing)\n\n## Quick Start\n\nGet up and running in 5 minutes:\n\n```bash\n# 1. Clone and install\ngit clone https://github.com/agrathwohl/assistive-llm.git\ncd assistive-llm\nnpm install\n\n# 2. Configure (add your API keys)\ncp .env.example .env\nnano .env  # Add your ANTHROPIC_API_KEY or OPENAI_API_KEY\n\n# 3. Build and run\nnpm run build\nnpm start\n\n# 4. Open browser\nopen http://localhost:3000\n```\n\n## Prerequisites\n\n- [Node.js](https://nodejs.org/) \u003e= 10.18.1\n- [npm](https://www.npmjs.com/) \u003e= 6.13.4\n- OpenAI and/or Anthropic API keys (at least one is required)\n- An assistive device that supports T.140 protocol (for testing)\n\n## Installation\n\n### Standard Installation\n\n1. **Clone the repository:**\n\n```bash\ngit clone https://github.com/agrathwohl/assistive-llm.git\ncd assistive-llm\n```\n\n2. **Install dependencies:**\n\n```bash\nnpm install\n```\n\n3. **Create environment file:**\n\n```bash\ncp .env.example .env\n```\n\n4. **Edit `.env` and add your API keys:**\n\n```env\n# Required: At least one LLM provider API key\nANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx\n# OR\nOPENAI_API_KEY=sk-xxxxxxxxxxxxx\n```\n\n5. **Build the application:**\n\n```bash\nnpm run build\n```\n\n6. **Start the server:**\n\n```bash\nnpm start\n```\n\nThe server will be available at `http://localhost:3000`.\n\n### Development Installation\n\nFor development with auto-reload:\n\n```bash\nnpm run dev\n```\n\n## Configuration\n\n### Environment Variables\n\nCreate a `.env` file with the following variables:\n\n```env\n# Server Configuration\nPORT=3000                    # Server port (default: 3000)\nHOST=localhost               # Server host (default: localhost)\n\n# LLM Provider Configuration\nDEFAULT_LLM_PROVIDER=anthropic              # Default provider: 'openai' or 'anthropic'\nANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx     # Your Anthropic API key\nANTHROPIC_MODEL=claude-3-5-sonnet-20241022 # Claude model to use\nOPENAI_API_KEY=sk-xxxxxxxxxxxxx            # Your OpenAI API key\nOPENAI_MODEL=gpt-4                         # GPT model to use\n\n# Logging Configuration\nLOG_LEVEL=info               # Logging level: debug, info, warn, error\nLOG_FILE=assistive-llm.log   # Log file path\n\n# Storage Configuration\nDB_PATH=./data               # Data directory for device configs and conversations\n```\n\n### Getting API Keys\n\n#### Anthropic Claude\n1. Visit [Anthropic Console](https://console.anthropic.com/)\n2. Sign up or log in\n3. Navigate to API Keys\n4. Create a new key\n5. Copy and add to `.env` as `ANTHROPIC_API_KEY`\n\n#### OpenAI\n1. Visit [OpenAI Platform](https://platform.openai.com/)\n2. Sign up or log in\n3. Go to API Keys section\n4. Create new secret key\n5. Copy and add to `.env` as `OPENAI_API_KEY`\n\n---\n\n## User Guides\n\n### First-Time Setup\n\n#### Step 1: Access the Admin Interface\n\nAfter starting the server, open your web browser and navigate to:\n\n```\nhttp://localhost:3000\n```\n\nYou'll see the admin interface with three main sections:\n- **Devices**: Manage assistive devices\n- **LLM Chat**: Stream responses to devices\n- **Settings**: Configure system settings\n\n#### Step 2: Verify LLM Provider Status\n\n1. Click on the **LLM Chat** tab\n2. Check that at least one provider shows as available\n3. If no providers are available, verify your API keys in `.env`\n\n#### Step 3: Test the System\n\nBefore connecting real devices, you can test the API endpoints:\n\n```bash\n# Check available providers\ncurl http://localhost:3000/api/llm/providers\n\n# Should return:\n# [\n#   {\"provider\":\"openai\",\"available\":true,\"model\":\"gpt-4\"},\n#   {\"provider\":\"anthropic\",\"available\":true,\"model\":\"claude-3-5-sonnet-20241022\"}\n# ]\n```\n\n---\n\n### Adding Your First Device\n\n#### Via Web Interface\n\n1. **Navigate to Devices Page**\n   - Click on \"Devices\" in the navigation menu\n   - Click the \"Add Device\" button (blue button, top right)\n\n2. **Fill in Basic Information**\n   ```\n   Device Name: My Test Device\n   Device Type: Hearing Device (or appropriate type)\n   IP Address: 192.168.1.100 (your device's IP)\n   Port: 5004 (your device's T.140 port)\n   Protocol: RTP (or websocket/srtp depending on device)\n   ```\n\n3. **Configure Advanced Settings** (Optional)\n   - **Character Rate Limit**: 30 characters/second (default)\n     - Lower for slower devices\n     - Higher for capable devices (max 100)\n\n   - **Process Backspaces**: Checked (recommended)\n     - Processes backspace characters in stream\n     - Uncheck for raw output\n\n   - **Enable FEC**: Unchecked (default)\n     - Check for unreliable networks\n     - Adds forward error correction\n\n   - **Enable RED**: Unchecked (default)\n     - Check for lossy connections\n     - Sends redundant data (1-3 generations)\n\n4. **Save Device**\n   - Click \"Save Device\"\n   - Device appears in \"Registered Devices\" list\n\n#### Protocol Selection Guide\n\n**WebSocket** - Best for:\n- Modern web-based assistive devices\n- Devices behind NAT/firewalls\n- Testing and development\n- Browser-based clients\n\n**RTP** - Best for:\n- Traditional T.140 devices\n- Low-latency requirements\n- Direct device connections\n- VoIP-integrated systems\n\n**SRTP** - Best for:\n- Secure communications required\n- Medical/healthcare applications\n- Privacy-sensitive scenarios\n- Encrypted channels needed\n\n**Unix Sockets** - Best for:\n- Local device communication\n- Inter-process communication\n- Development and testing\n- High-performance local apps\n\n---\n\n### Connecting to a Device\n\n#### Manual Connection\n\n1. **From Devices Page:**\n   - Find your device in \"Registered Devices\"\n   - Click the \"Connect\" button\n   - Status changes to \"Connecting...\" then \"Online\"\n\n2. **Verify Connection:**\n   - Device appears in \"Active Connections\" section\n   - Status badge shows green \"Online\"\n   - Connection timestamp displayed\n\n3. **Troubleshooting Connection Issues:**\n\n   **Device stays in \"Connecting\" status:**\n   - Verify device is powered on and reachable\n   - Check IP address and port are correct\n   - Ensure no firewall blocking connection\n   - Test network connectivity: `ping \u003cdevice-ip\u003e`\n\n   **Connection shows \"Error\" status:**\n   - Check device logs for errors\n   - Verify protocol matches device expectations\n   - For SRTP: Verify keys/passphrase\n   - For Unix sockets: Verify socket path exists\n\n#### Programmatic Connection (API)\n\n```bash\n# Connect to device via API\ncurl -X POST http://localhost:3000/api/devices/{device-id}/connect \\\n  -H \"Content-Type: application/json\"\n\n# Response:\n# {\n#   \"message\": \"Connected to device successfully\",\n#   \"connection\": { ... }\n# }\n```\n\n---\n\n### Streaming LLM Responses\n\n#### Basic Streaming (Web Interface)\n\n1. **Navigate to LLM Chat Page**\n   - Click \"LLM Chat\" in navigation\n\n2. **Select Target Devices**\n   - Click in \"Select Devices\" dropdown\n   - Choose one or more connected devices\n   - Only online devices are selectable\n\n3. **Choose LLM Provider**\n   - Select \"OpenAI\" or \"Anthropic\" from dropdown\n   - Ensure provider shows as available\n\n4. **Enter Your Prompt**\n   ```\n   Example prompts:\n   - \"Explain quantum computing in simple terms\"\n   - \"What are the symptoms of the flu?\"\n   - \"Tell me a short story about a robot\"\n   ```\n\n5. **Send to Devices**\n   - Click \"Send to Devices\"\n   - Watch status display for streaming info\n   - Response streams in real-time to selected devices\n\n#### Streaming Features\n\n**Real-time Display**: Text appears character-by-character on assistive device as LLM generates it.\n\n**Multi-device Broadcasting**: Send same response to multiple devices simultaneously.\n\n**Conversation Context**: System maintains conversation history for context-aware responses.\n\n#### Advanced Streaming (API)\n\n**Stream to Single Device:**\n```bash\ncurl -X POST http://localhost:3000/api/llm/stream/{device-id} \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"What is the weather forecast?\",\n    \"provider\": \"anthropic\"\n  }'\n\n# Response includes conversationId for follow-ups:\n# {\n#   \"message\": \"Started streaming...\",\n#   \"conversationId\": \"abc-123\",\n#   \"messageId\": \"msg-456\",\n#   \"provider\": \"anthropic\"\n# }\n```\n\n**Stream to Multiple Devices:**\n```bash\ncurl -X POST http://localhost:3000/api/llm/stream-multiple \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"deviceIds\": [\"device-1\", \"device-2\"],\n    \"prompt\": \"Tell me about accessibility technology\",\n    \"provider\": \"openai\"\n  }'\n```\n\n**Continue Conversation:**\n```bash\ncurl -X POST http://localhost:3000/api/llm/stream/{device-id} \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Tell me more about that\",\n    \"provider\": \"anthropic\",\n    \"conversationId\": \"abc-123\"\n  }'\n```\n\n---\n\n### Managing Conversations\n\n#### Viewing Conversation History\n\n**Via API:**\n```bash\n# Get specific conversation\ncurl http://localhost:3000/api/llm/conversations/{conversation-id}\n\n# Get device's recent conversations\ncurl http://localhost:3000/api/llm/devices/{device-id}/conversations?limit=10\n```\n\n**Response Format:**\n```json\n{\n  \"conversationId\": \"abc-123\",\n  \"messages\": [\n    {\n      \"id\": \"msg-1\",\n      \"role\": \"user\",\n      \"content\": \"What is quantum computing?\",\n      \"timestamp\": \"2025-01-04T12:00:00Z\",\n      \"provider\": \"anthropic\",\n      \"model\": \"claude-3-5-sonnet-20241022\"\n    },\n    {\n      \"id\": \"msg-2\",\n      \"role\": \"assistant\",\n      \"content\": \"Quantum computing is...\",\n      \"timestamp\": \"2025-01-04T12:00:05Z\"\n    }\n  ]\n}\n```\n\n#### Clearing Conversations\n\n```bash\n# Clear specific conversation\ncurl -X DELETE http://localhost:3000/api/llm/conversations/{conversation-id}\n```\n\n**Use Cases:**\n- Privacy: Clear sensitive conversations\n- Testing: Reset conversation state\n- Maintenance: Clean up old data\n\n---\n\n### Advanced Features\n\n#### Forward Error Correction (FEC)\n\n**When to Enable:**\n- Unreliable network connections\n- High packet loss environments\n- Long-distance connections\n- Critical communications\n\n**How to Enable:**\n1. Edit device settings\n2. Check \"Enable FEC\"\n3. Save device\n4. Reconnect to device\n\n**Technical Details:**\n- Adds parity data to T.140 stream\n- Recovers from packet loss\n- Slight latency increase\n- Recommended for \u003c5% packet loss\n\n#### Redundancy (RED)\n\n**When to Enable:**\n- Very lossy networks (\u003e5% loss)\n- Mission-critical applications\n- Emergency communications\n- Unreliable connections\n\n**Configuration:**\n1. Edit device settings\n2. Check \"Enable RED\"\n3. Choose generations (1-3)\n4. Save and reconnect\n\n**Generation Guide:**\n- **1 generation**: Mild packet loss (5-10%)\n- **2 generations**: Moderate loss (10-20%)\n- **3 generations**: High loss (\u003e20%)\n\n**Trade-offs:**\n- Higher redundancy = more bandwidth\n- Increased reliability\n- Higher latency\n\n#### SRTP Encryption\n\n**Setup Method 1: Passphrase (Simple)**\n1. Select \"SRTP\" protocol\n2. Device settings: Enter passphrase\n3. Keys generated automatically\n4. Save device\n\n**Setup Method 2: Manual Keys (Advanced)**\n1. Generate keys:\n   ```bash\n   # Using OpenSSL\n   openssl rand -base64 30  # Master key\n   openssl rand -base64 14  # Salt\n   ```\n2. Add to device settings:\n   - SRTP Key: (base64 master key)\n   - SRTP Salt: (base64 salt)\n3. Save device\n\n**Security Notes:**\n- Use SRTP for sensitive data\n- Keys stored locally only\n- Change keys periodically\n- Use strong passphrases\n\n#### Character Rate Limiting\n\n**Optimization Guide:**\n\n| Device Type | Recommended Rate | Notes |\n|-------------|------------------|-------|\n| Standard TTY | 30 cps | Default, works well |\n| Fast display | 50-60 cps | Modern devices |\n| Slow display | 15-20 cps | Older devices |\n| Braille | 10-15 cps | Reading speed |\n| Testing | 100 cps | Development only |\n\n**Tuning Process:**\n1. Start with 30 cps\n2. Test with device\n3. Adjust based on:\n   - Display refresh rate\n   - User comfort\n   - Network capacity\n4. Save optimal setting\n\n---\n\n## API Documentation\n\n### Complete API Reference\n\n#### Device Management Endpoints\n\n**Get All Devices**\n```http\nGET /api/devices\n```\nReturns array of all registered devices.\n\n**Get Specific Device**\n```http\nGET /api/devices/:id\n```\n\n**Create Device**\n```http\nPOST /api/devices\nContent-Type: application/json\n\n{\n  \"name\": \"My Device\",\n  \"type\": \"hearing\",\n  \"ipAddress\": \"192.168.1.100\",\n  \"port\": 5004,\n  \"protocol\": \"rtp\",\n  \"settings\": {\n    \"characterRateLimit\": 30,\n    \"backspaceProcessing\": true,\n    \"enableFEC\": false,\n    \"enableRED\": false\n  }\n}\n```\n\n**Update Device**\n```http\nPUT /api/devices/:id\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Name\",\n  \"settings\": { ... }\n}\n```\n\n**Delete Device**\n```http\nDELETE /api/devices/:id\n```\n\n**Connect to Device**\n```http\nPOST /api/devices/:id/connect\n```\n\n**Disconnect from Device**\n```http\nPOST /api/devices/:id/disconnect\n```\n\n**Get Active Connections**\n```http\nGET /api/devices/connections/active\n```\n\n#### LLM Streaming Endpoints\n\n**Get Available Providers**\n```http\nGET /api/llm/providers\n\nResponse:\n[\n  {\n    \"provider\": \"openai\",\n    \"available\": true,\n    \"model\": \"gpt-4\"\n  },\n  {\n    \"provider\": \"anthropic\",\n    \"available\": true,\n    \"model\": \"claude-3-5-sonnet-20241022\"\n  }\n]\n```\n\n**Stream to Single Device**\n```http\nPOST /api/llm/stream/:deviceId\nContent-Type: application/json\n\n{\n  \"prompt\": \"Your question here\",\n  \"provider\": \"anthropic\",\n  \"conversationId\": \"optional-conversation-id\"\n}\n\nResponse:\n{\n  \"message\": \"Started streaming LLM response to device\",\n  \"provider\": \"anthropic\",\n  \"conversationId\": \"abc-123\",\n  \"messageId\": \"msg-456\"\n}\n```\n\n**Stream to Multiple Devices**\n```http\nPOST /api/llm/stream-multiple\nContent-Type: application/json\n\n{\n  \"deviceIds\": [\"device-1\", \"device-2\"],\n  \"prompt\": \"Your question here\",\n  \"provider\": \"openai\"\n}\n```\n\n**Get Conversation History**\n```http\nGET /api/llm/conversations/:conversationId\n```\n\n**Get Device Conversations**\n```http\nGET /api/llm/devices/:deviceId/conversations?limit=10\n```\n\n**Clear Conversation**\n```http\nDELETE /api/llm/conversations/:conversationId\n```\n\n### Error Responses\n\nAll endpoints return standard error format:\n\n```json\n{\n  \"error\": \"Description of error\",\n  \"details\": \"Additional information (optional)\"\n}\n```\n\nCommon HTTP status codes:\n- `200`: Success\n- `400`: Bad request (validation error)\n- `404`: Resource not found\n- `500`: Server error\n\n---\n\n## Troubleshooting\n\n### Common Issues and Solutions\n\n#### \"At least one LLM provider API key must be configured\"\n\n**Cause:** No valid API keys in `.env` file\n\n**Solution:**\n1. Check `.env` file exists\n2. Verify API key format is correct\n3. Ensure no extra spaces or quotes\n4. Restart server after changing `.env`\n\n```bash\n# Correct format:\nANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx\n\n# Incorrect (no quotes needed):\nANTHROPIC_API_KEY=\"sk-ant-xxxxxxxxxxxxx\"\n```\n\n#### Device Connection Fails\n\n**WebSocket Connection Issues:**\n```bash\n# Test WebSocket connectivity\nwscat -c ws://device-ip:port\n\n# If fails, check:\n# 1. Device is powered on\n# 2. Network is reachable\n# 3. Firewall allows WebSocket connections\n```\n\n**RTP Connection Issues:**\n```bash\n# Test UDP connectivity\nnc -u device-ip port\n\n# Check:\n# 1. Device listens on UDP port\n# 2. No firewall blocking UDP\n# 3. IP address is correct\n```\n\n**SRTP Connection Issues:**\n- Verify passphrase is correct\n- Check key/salt are valid base64\n- Ensure device supports SRTP\n- Try RTP first to isolate encryption issues\n\n#### Streaming Doesn't Work\n\n**Check 1: Device Connected**\n```bash\ncurl http://localhost:3000/api/devices/connections/active\n# Device should appear in list\n```\n\n**Check 2: Provider Available**\n```bash\ncurl http://localhost:3000/api/llm/providers\n# Provider 'available' should be true\n```\n\n**Check 3: API Key Valid**\n- Test key directly with provider\n- Check for expired keys\n- Verify billing/credits available\n\n**Check 4: Server Logs**\n```bash\ntail -f assistive-llm.log\n# Look for error messages during streaming\n```\n\n#### Build Fails\n\n**Issue:** TypeScript compilation errors\n\n**Solution:**\n```bash\n# Clean and reinstall\nrm -rf node_modules dist\nnpm install\nnpm run build\n```\n\n**Issue:** Missing dependencies\n\n**Solution:**\n```bash\nnpm install --save t140llm\nnpm install\n```\n\n#### Performance Issues\n\n**Slow streaming:**\n1. Check network latency to device\n2. Reduce character rate limit\n3. Disable FEC/RED if not needed\n4. Check server CPU/memory usage\n\n**High latency:**\n1. Test network: `ping device-ip`\n2. Check LLM provider status\n3. Reduce redundancy generations\n4. Use faster LLM model\n\n### Getting Help\n\n**Log Files:**\n```bash\n# View recent logs\ntail -f assistive-llm.log\n\n# Search for errors\ngrep ERROR assistive-llm.log\n```\n\n**Debug Mode:**\n```env\n# In .env file\nLOG_LEVEL=debug\n```\n\n**Community Support:**\n- GitHub Issues: Report bugs and request features\n- Documentation: Check docs for detailed guides\n- t140llm Library: Check [t140llm documentation](https://github.com/agrathwohl/t140llm)\n\n---\n\n## Cloud Deployment\n\nSee [CLOUD_DEPLOYMENT.md](./CLOUD_DEPLOYMENT.md) for detailed instructions on deploying to cloud providers including:\n- Vercel\n- Cloudflare Workers\n- AWS\n- Google Cloud Platform\n- Azure\n\n---\n\n## Development\n\n### Project Structure\n\n```\nassistive-llm/\n├── src/\n│   ├── config/              # Configuration management\n│   │   └── config.ts        # App configuration\n│   ├── controllers/         # API controllers\n│   │   ├── device.controller.ts\n│   │   └── llm.controller.ts\n│   ├── interfaces/          # TypeScript interfaces\n│   │   ├── device.interface.ts\n│   │   └── api.interface.ts\n│   ├── middleware/          # Express middleware\n│   │   └── error.middleware.ts\n│   ├── public/              # Static web files\n│   │   ├── css/            # Stylesheets\n│   │   ├── js/             # Client JavaScript\n│   │   └── index.html      # Admin interface\n│   ├── routes/              # API routes\n│   │   ├── device.routes.ts\n│   │   ├── llm.routes.ts\n│   │   └── index.ts\n│   ├── services/            # Business logic\n│   │   ├── device.service.ts\n│   │   ├── llm.service.ts\n│   │   └── conversation.service.ts\n│   └── utils/               # Utility functions\n│       └── logger.ts\n├── dist/                    # Compiled JavaScript (generated)\n├── data/                    # Data storage (generated)\n│   ├── devices.json\n│   └── conversations.json\n├── assets/                  # Documentation assets\n├── .env.example             # Example environment file\n├── package.json\n├── tsconfig.json\n└── README.md\n```\n\n### Running Tests\n\n```bash\nnpm test\n```\n\n### Development Mode\n\n```bash\nnpm run dev\n```\n\nChanges trigger automatic rebuild and restart.\n\n### Building\n\n```bash\nnpm run build\n```\n\nCompiles TypeScript to JavaScript in `dist/` directory.\n\n---\n\n## Contributing\n\nContributions are welcome! Please follow these guidelines:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes\n4. Add tests if applicable\n5. Commit your changes (`git commit -m 'Add amazing feature'`)\n6. Push to the branch (`git push origin feature/amazing-feature`)\n7. Open a Pull Request\n\n### Development Guidelines\n\n- Follow existing code style\n- Add TypeScript types for new code\n- Update documentation for new features\n- Write clear commit messages\n- Test thoroughly before submitting PR\n\n---\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details\n\n---\n\n## Acknowledgments\n\n- Built with [t140llm](https://github.com/agrathwohl/t140llm) by agrathwohl\n- Supports OpenAI and Anthropic LLM providers\n- Designed for accessibility and real-time communication\n- Implements ITU-T T.140 real-time text protocol\n\n---\n\n## Support\n\nFor issues, questions, or suggestions:\n- **GitHub Issues**: [Report bugs or request features](https://github.com/agrathwohl/assistive-llm/issues)\n- **Documentation**: Check this README and linked docs\n- **t140llm Library**: [t140llm documentation](https://github.com/agrathwohl/t140llm)\n\n---\n\n## Changelog\n\n### Version 1.0.0 (Current)\n- Initial release with comprehensive t140llm integration\n- Support for WebSocket, RTP, SRTP, and Unix socket transports\n- OpenAI and Anthropic provider support\n- Conversation history and management\n- Advanced T.140 features (FEC, RED, redundancy)\n- Web-based admin interface\n- Device management and connection handling\n- RESTful API with comprehensive endpoints\n- Real-time streaming with character rate limiting\n- Secure SRTP communications\n- Comprehensive documentation and user guides\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagrathwohl%2Fassistive-llm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fagrathwohl%2Fassistive-llm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagrathwohl%2Fassistive-llm/lists"}