pediatric-ai-scribe-v3/docs/ai-providers.md
Daniel 33b47d4cb1 Add developer guide, expand admin model management docs
- New docs/developer-guide.md: full walkthrough of frontend SPA architecture,
  backend middleware stack, database layer, AI integration, settings system,
  how to add features/routes/tables, key design decisions, file references
- Expand ai-providers.md: detailed admin model management (add custom models
  with ID/name/cost/category, discover from provider, enable/disable, set default)
- Update README docs index
2026-04-04 23:02:02 +02:00

139 lines
6.4 KiB
Markdown

# AI Providers
This document covers the AI provider system, model management, prompt configuration, and usage logging for the Pediatric AI Scribe application.
---
## Provider Selection
The active AI provider is determined in one of two ways:
1. **Explicit**: Set the `AI_PROVIDER` environment variable to one of the supported provider names.
2. **Auto-detect**: If `AI_PROVIDER` is not set, the system checks for provider-specific credentials in the environment and selects the first match using this priority order:
`bedrock` > `azure` > `vertex` > `litellm` > `openrouter`
All providers expose a unified `callAI()` interface defined in `src/utils/ai.js`. Calling code does not need to know which backend is active.
---
## Provider Details
### 1. AWS Bedrock (HIPAA-eligible with BAA)
- **SDK**: `@aws-sdk/client-bedrock-runtime`
- Uses **inference profiles** for newer models, enabling cross-region routing.
- **Available model families**: vendor model (Anthropic), Amazon Nova, Llama (Meta), Mistral, DeepSeek, Cohere.
- **Default temperature**: 0.3
### 2. Azure OpenAI (HIPAA-eligible with BAA)
- **SDK**: OpenAI SDK configured to point at an Azure endpoint.
- Requires a **deployment name** that maps to the desired model.
- **Available model families**: GPT-4o family, GPT-4.1 family.
### 3. Google Vertex AI (HIPAA-eligible with BAA)
- **SDK**: `@google-cloud/vertexai`
- In addition to text generation, Vertex AI handles:
- **Speech-to-Text (STT)**: via Gemini inline audio capabilities.
- **Text-to-Speech (TTS)**: via Vertex AI TTS endpoint.
- **Available model families**: Gemini 2.5/2.0, vendor model on Vertex (Anthropic models hosted on Google Cloud), Llama.
### 4. LiteLLM Proxy (self-hosted)
- **SDK**: OpenAI SDK pointed at the `LITELLM_API_BASE` URL.
- Acts as a proxy that routes requests to any backend configured within LiteLLM.
- **Model discovery**: queries `/v1/models` on the LiteLLM instance to populate the available model list.
- Also supports **TTS and STT** passthrough.
- Model names are used **as-configured in LiteLLM** -- the application does not auto-prefix or transform them.
### 5. OpenRouter (NOT HIPAA-compliant)
- **SDK**: OpenAI SDK pointed at `https://openrouter.ai`.
- **Cost discovery**: queries the OpenRouter API to retrieve per-model pricing.
- Offers the **cheapest option** and the **widest model selection** across many providers.
- Not suitable for environments that require HIPAA compliance.
---
## Model Management
### Model Definitions
Models are defined in `src/utils/models.js` and organized into four categories:
| Category | Description |
|-----------|------------------------------------------------|
| `free` | No-cost models (typically smaller or rate-limited) |
| `fast` | Low-latency models optimized for speed |
| `smart` | Balanced models with strong reasoning ability |
| `premium` | Top-tier models with the highest capability |
### Admin Controls
Administrators manage models from **Admin Panel > Models**:
- **Enable/Disable** -- toggle visibility of any model for users (`PUT /api/admin/config/models/toggle`). Disabled models are stored in the `models.disabled` setting as a JSON array of model IDs.
- **Set Default** -- choose which model is pre-selected for new users (`PUT /api/admin/config/models/default`). Stored in `models.default` setting.
- **Add Custom Models** -- manually add any model not in the built-in list (`POST /api/admin/config/models/custom`). Each custom model has:
- `id` -- the model identifier as the provider expects it (e.g., `openai-gpt-4.1-mini` for LiteLLM, `anthropic.agent-config-3-haiku` for Bedrock)
- `name` -- display name shown to users
- `cost` -- cost string shown in the UI (e.g., `~$0.002`, `FREE`)
- `category` -- one of `free`, `fast`, `smart`, `premium` (determines grouping in dropdown)
- **Delete Custom Models** -- remove a manually added model (`DELETE /api/admin/config/models/custom/:modelId`)
- **Clear All** -- remove all custom models and reset the disabled list (`POST /api/admin/config/models/clear`)
Custom models are stored in the `models.custom` setting as a JSON array in the `app_settings` table.
### Model Discovery
The **Discover** button (`GET /api/admin/config/models/discover`) queries the active provider's API:
- **LiteLLM**: calls `/v1/models` on the LiteLLM proxy
- **OpenRouter**: calls `https://openrouter.ai/api/v1/models` (includes pricing data)
- **Bedrock**: uses `ListFoundationModelsCommand`
Discovered models can be added individually via `POST /api/admin/config/models/add-discovered`, which merges them into the custom models list.
For **LiteLLM** specifically, since models are manually configured in the LiteLLM proxy, the model IDs returned by discovery are the exact names to use -- no provider prefix is added.
### Frontend Display
The model selector dropdown (present on every tab) groups models by category:
- Free -- no-cost models
- Fast & Cheap -- low-latency, low-cost
- Smart -- balanced capability
- Premium -- highest quality
Each model shows its display name and cost string. The dropdown is populated from `GET /api/models` which merges built-in models, custom models, and respects the enabled/disabled list.
---
## AI Prompts
### Storage and Override
- All default prompts are defined in `src/utils/prompts.js`.
- Prompts can be **overridden via the database** using the `app_settings` table with keys following the pattern `prompt.{name}`.
- Administrators can view and edit all prompts directly from the Admin Panel.
### Physician Memories
When a physician saves corrections or preferences (referred to as "memories"), these are injected into the prompt as **low-priority style hints**. This allows the AI to adapt its output to the physician's preferred documentation style without overriding the core clinical prompt.
---
## Logging
Every AI call is recorded in the `api_log` database table with the following fields:
| Field | Description |
|------------|-----------------------------------------------------|
| `model` | The model identifier used for the request |
| `tokens` | Input and output token counts |
| `cost` | Estimated cost of the call |
| `duration` | Wall-clock time for the request in milliseconds |
Cost estimates are calculated from **hardcoded per-model rates** defined in the codebase. For OpenRouter, rates may also be fetched from the OpenRouter pricing API.