From feb47b5e799b5e1bbce46cc537be261194beacdc Mon Sep 17 00:00:00 2001 From: Daniel Onyejesi Date: Tue, 24 Mar 2026 19:14:00 -0400 Subject: [PATCH] Re-add vendor model Opus 4.6, update DEVELOPER_GUIDE with logs/Bedrock docs - Re-added Opus 4.6 (JSON sanitizer now handles its output) - Added Logs & Debugging section with docker logs commands and prefixes - Added Bedrock Model Notes (inference profiles, maxTokens, JSON sanitization) - Updated version history through v5.8 - Updated rate limiting docs, build/push process, current image tag --- DEVELOPER_GUIDE.md | 108 ++++++++++++++++++++++++++++---------------- src/utils/models.js | 2 + 2 files changed, 71 insertions(+), 39 deletions(-) diff --git a/DEVELOPER_GUIDE.md b/DEVELOPER_GUIDE.md index 56d7517..9f7d7e9 100644 --- a/DEVELOPER_GUIDE.md +++ b/DEVELOPER_GUIDE.md @@ -49,7 +49,7 @@ Express.js (Node.js) — server.js | |— Helmet (CSP, security headers) |— CORS (restricted to APP_URL in production) - |— express-rate-limit (login: 5/hr, register: 5/hr, general: 100/15min) + |— express-rate-limit (login: 10/15min, register: 5/hr, resend-verify: 3/15min, general: 60/min) |— cookie-parser |— Routes (/src/routes/) | @@ -486,6 +486,14 @@ const result = await callAI( // result = { success: true, content: '...', model: '...', provider: '...', duration: ms } ``` +### Bedrock Model Notes + +**Inference Profiles:** Most newer models (Anthropic vendor model 4.x, Meta Llama 4, DeepSeek R1, Amazon Nova, Writer) require cross-region inference profiles. These use a `us.` prefix on the model ID (e.g. `us.anthropic.agent-config-sonnet-4-6`). Direct model IDs will return "on-demand throughput not supported" errors. + +**Max Output Tokens:** Some models have low output limits (Cohere Command R/R+: 4096, AI21 Jamba: 4096). The `maxOut` field in `models.js` auto-clamps `maxTokens` in `callBedrock()`. + +**JSON Sanitization:** Some models (notably vendor model Sonnet 4.6, Opus 4.6) output literal newline characters inside JSON string values. `learningAI.js` includes a `sanitizeJsonString()` function that escapes these before parsing. + ### Prompt System Prompts are defined in `src/utils/prompts.js`. Admins can override any prompt via the Admin panel (`/admin/config/prompts`). Overrides are stored in `app_settings` table and loaded into memory on startup (with 3s grace period for DB readiness). @@ -551,10 +559,50 @@ In the Learning Hub viewer, content `body` is rendered via `sanitizeHtml()` in ` ### Local Development ```bash cp .env.example .env # Fill in your credentials -docker-compose -f docker-compose.local.yml up -d --build +docker compose -f docker-compose.local.yml build --no-cache +docker compose -f docker-compose.local.yml up -d # App runs at http://localhost:3552 ``` +### Logs & Debugging + +**View container logs (live):** +```bash +docker logs -f pediatric-ai-scribe +``` + +**View last N lines:** +```bash +docker logs --tail 50 pediatric-ai-scribe +``` + +**Filter for specific issues:** +```bash +# AI/Bedrock errors +docker logs pediatric-ai-scribe 2>&1 | grep -i "Bedrock\|LearningAI\|callAI" + +# Auth errors +docker logs pediatric-ai-scribe 2>&1 | grep -i "Auth\|login\|verify" + +# All errors +docker logs pediatric-ai-scribe 2>&1 | grep -i "error\|ERR\|fail" +``` + +**Key log prefixes:** +| Prefix | Source | +|--------|--------| +| `[Bedrock] Model:` | AI response metadata (block types, stop reason) | +| `[LearningAI]` | JSON parse failures with raw output context | +| `[Auth]` | Login, registration, verification events | +| `[TTS]` | Text-to-speech generation | +| `🤖 Provider:` | Startup: which AI provider is active | +| `✅ AWS Bedrock:` | Startup: Bedrock configured successfully | + +**Database logs (PostgreSQL):** +```bash +docker logs pedscribe-db +``` + ### Production (Docker Hub image) ```bash # docker-compose.yml (production) @@ -579,29 +627,23 @@ services: ### Docker Hub Repository: `danielonyejesi/pediatric-ai-scribe-v3` -Tags: -- `latest` — always points to most recent stable release -- `v3.x` — specific version tags (immutable) +Tags use versioned format: `v5.0`, `v5.1`, etc. Production should always pin to a specific tag. ### Git Repository Repository: `ifedan-ed/pediatric-ai-scribe-v3` (private) -Version tags: `v3.1` through `v3.15` as of this writing. - ### Build & Push Process ```bash -# After making changes: -git add -A && git commit -m "Description" -git push origin main && git tag v3.x && git push origin v3.x +# 1. Test locally first +docker compose -f docker-compose.local.yml build --no-cache +docker compose -f docker-compose.local.yml up -d +# Test at http://localhost:3552 -docker build -t danielonyejesi/pediatric-ai-scribe-v3:v3.x \ - -t danielonyejesi/pediatric-ai-scribe-v3:latest . -docker push danielonyejesi/pediatric-ai-scribe-v3:v3.x -docker push danielonyejesi/pediatric-ai-scribe-v3:latest +# 2. When ready, tag and push to Docker Hub +docker tag scribe-pediatric-scribe:latest danielonyejesi/pediatric-ai-scribe-v3:v5.x +docker push danielonyejesi/pediatric-ai-scribe-v3:v5.x -# Rebuild local for testing: -docker-compose -f docker-compose.local.yml down -docker-compose -f docker-compose.local.yml up -d --build +# 3. Update production docker-compose.yml to use new tag ``` --- @@ -618,7 +660,7 @@ docker-compose -f docker-compose.local.yml up -d --build ### Security Hardening Already In Place - Helmet.js with custom CSP (no external script sources) - CORS restricted to `APP_URL` in production -- Rate limiting on login (5/hr), register (5/hr), forgot-password (5/hr), general API (100/15min) +- Rate limiting on login (10/15min), register (5/hr), forgot-password (5/hr), resend-verification (3/15min), general API (60/min) - bcrypt cost 12 for password hashing - JWT with 7-day expiry - SQL injection protection: all queries use parameterized `?` / `$1` placeholders @@ -745,15 +787,19 @@ pool.end(); | v3.11 | AI content generation for Learning Hub (topic/file/Nextcloud, pdf-parse, pptxgenjs) | | v3.10 | Custom 404 page; server returns 404 for unknown paths | | v3.8 | Quill replaced with Tiptap 2 (self-hosted bundle, inline link bar) | +| v5.0 | Resend verification link on login + rate limit (3/15min) | +| v5.1–v5.4 | Bedrock model fixes: inference profiles, region filtering, thinking block handling | +| v5.5 | Comprehensive Bedrock fix: all us. prefix IDs, maxTokens clamping | +| v5.6 | Re-add Qwen3 235B | +| v5.7 | Remove Opus 4.6 (JSON issues) | +| v5.8 | Fix JSON parse: sanitize literal newlines in strings; re-add Opus 4.6 | ## 16. Current Docker Image -**Latest stable:** `danielonyejesi/pediatric-ai-scribe-v3:v3.19` +**Latest stable:** `danielonyejesi/pediatric-ai-scribe-v3:v5.8` ```bash -docker pull danielonyejesi/pediatric-ai-scribe-v3:v3.19 -# or always latest: -docker pull danielonyejesi/pediatric-ai-scribe-v3:latest +docker pull danielonyejesi/pediatric-ai-scribe-v3:v5.8 ``` --- @@ -854,23 +900,7 @@ httpOnly cookies prevent token *copying* but not token *use* — an XSS attacker --- -## 15. Version History (Recent) - -| Tag | Key changes | -|-----|-------------| -| v3.19 | Login flash fixed; presentation quiz option; feed labels corrected | -| v3.18 | pdf-parse v1.1.1; WebDAV selection UX; topic context on upload/WebDAV; inline refine bar; CSP unsafe-inline removed; webdav-path auth fix | -| v3.17 | AI panel CSS cascade bug fixed; quiz card redesign | -| v3.16 | DEVELOPER_GUIDE.md created | -| v3.15 | Auth reverted to localStorage; slide preview padding | -| v3.14 | AI panel context-aware options; delete wording per type | -| v3.13 | Slide preview in-page modal (arrow/swipe/keyboard) | -| v3.12 | Delete inline confirm; lighter login; Presentation type (Marp + PPTX) | -| v3.11 | AI content generation for Learning Hub (topic/file/Nextcloud) | -| v3.10 | Custom 404 page | -| v3.8 | Tiptap 2 (self-hosted, inline link bar, no popup) | - --- -*Last updated: March 2026 — v3.19* +*Last updated: March 2026 — v5.8* *Generated for developer handover.* diff --git a/src/utils/models.js b/src/utils/models.js index 6eaf5e2..7e1c8f3 100644 --- a/src/utils/models.js +++ b/src/utils/models.js @@ -32,6 +32,8 @@ var BEDROCK_MODELS = [ // maxOut = model's max output token limit (omit if >= 8192) // ── Anthropic vendor model (all use inference profiles) ── + { id: 'anthropic/vendor-model-opus-4-6', name: 'vendor model Opus 4.6', cost: '~$0.075', tag: 'BEST', category: 'premium', + bedrockId: 'us.anthropic.agent-config-opus-4-6-v1' }, { id: 'anthropic/vendor-model-opus-4-5', name: 'vendor model Opus 4.5', cost: '~$0.075', tag: 'OPUS', category: 'premium', bedrockId: 'us.anthropic.agent-config-opus-4-5-20251101-v1:0' }, { id: 'anthropic/vendor-model-opus-4-1', name: 'vendor model Opus 4.1', cost: '~$0.075', tag: 'MEDICAL', category: 'premium',