sokrates / README.md
guidoputignano's picture
Update README.md
7f5b199 verified
|
Raw
History Blame Contribute Delete
6.22 kB
---
title: Sokrates
colorFrom: blue
colorTo: indigo
sdk: gradio
sdk_version: 4.44.0
python_version: "3.11"
app_file: app.py
pinned: false
license: mit
short_description: AI-assisted clinical intake assistant
---
# Sokrates
🔗 **Social Media Post + Video:** https://x.com/guidoputignano/status/2065494688501506353
AI-assisted **clinical intake** for a medical visit. Sokrates listens to a
doctor–patient conversation, transcribes it, automatically fills in a structured
clinical intake form, and suggests the questions the doctor still needs to ask.
Two sources of suggested questions:
1. **Gaps** — mandatory form fields that are still empty (deterministic engine).
2. **Clinical follow-ups** — coherent next questions generated by the LLM.
> **Sokrates does not make diagnoses.** It prepares and structures data collection.
## Architecture
```
audio -> ASR (+ optional diarization) -> orchestration loop ->
[structured extraction + gap engine + question generation] -> three-panel UI
```
- **UI**: Gradio Blocks, three columns — live transcript, the intake form filling
in (green = filled, grey = missing), and a suggested-questions panel.
- **ASR**: `faster-whisper` (large-v3), `language="en"`. Uploaded audio file
(priority) and live microphone. Optional diarization via `pyannote` behind a flag.
- **LLM**: any OpenAI-compatible endpoint (e.g. a vLLM server on Modal running
**Qwen3-14B**, ≤ 32B params). Configured purely through environment variables.
- **Schema**: oncology intake form as a Pydantic model (`sokrates/schema.py`).
## How to use
1. Provide a transcript one of three ways:
- **Sample dialogue** — pick one and click *Load sample* (no audio needed).
- **Upload / record a file** — click *Transcribe audio* to run ASR.
- **Live microphone** — switch to the *Live microphone* tab and speak;
Sokrates transcribes and updates the form automatically on pauses.
2. Click **Analyze transcript → update** (for the upload/sample paths).
3. Watch the **clinical form** fill in (green = filled, grey = optional missing,
red-tinted = mandatory still missing) and the **suggested questions** appear
(missing mandatory fields first, then coherent follow-ups). *Reset* clears the
session.
## Modules
| File | Role |
| --------------------------- | ----------------------------------------------------------- |
| `sokrates/schema.py` | Oncology intake form (Pydantic) + field metadata + merge. |
| `sokrates/asr.py` | faster-whisper transcription (file + live mic), diarization.|
| `sokrates/llm.py` | OpenAI-compatible client: extraction + question generation. |
| `sokrates/gaps.py` | Deterministic gap engine (no LLM). |
| `sokrates/orchestrator.py` | The loop: extract → gaps → questions. |
| `app.py` | Gradio three-panel UI. |
## Local run
```bash
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python app.py
```
Open the local URL Gradio prints (default http://127.0.0.1:7860).
## Configuration (environment variables)
No credentials live in the code. The LLM client is configured at runtime:
| Variable | Purpose | Example |
| ------------------- | ----------------------------------------------- | ---------------------------------------- |
| `MODEL_BASE_URL` | OpenAI-compatible base URL | `https://your-modal-app.modal.run/v1` |
| `MODEL_API_KEY` | API key / token for the endpoint | `sk-...` (or any token your server wants)|
| `MODEL_NAME` | Model identifier served by the endpoint | `Qwen/Qwen3-14B` |
| `ENABLE_DIARIZATION`| `1` to enable pyannote diarization (optional) | `0` |
| `WHISPER_MODEL` | faster-whisper model size | `large-v3` |
| `HF_TOKEN` | Hugging Face token (only if using pyannote) | `hf_...` |
| `SOKRATES_GUIDED_JSON` | `1` to use vLLM `guided_json` instead of `response_format` | `0` |
| `SOKRATES_NO_THINK` | `1` to disable Qwen3 thinking (faster, terser) | `0` |
| `MODEL_TEMPERATURE` | sampling temperature (extraction uses `0.0`) | `0.0` |
### Pointing at a Modal vLLM endpoint
This repo ships a ready-to-deploy Modal script (`modal_vllm.py`) that serves
**Qwen3-14B** as an OpenAI-compatible vLLM endpoint.
```bash
# 1. One-time setup
pip install modal
modal token new
# Choose the API key the endpoint will require (reuse it as MODEL_API_KEY):
modal secret create sokrates-llm MODEL_API_KEY=sk-sokrates-demo-123
# 2. Deploy (prints a https://...-serve.modal.run URL)
modal deploy modal_vllm.py
# 3. Point the app at it (note the trailing /v1)
export MODEL_BASE_URL="https://<your-workspace>--sokrates-qwen3-14b-serve.modal.run/v1"
export MODEL_API_KEY="sk-sokrates-demo-123" # must match the secret
export MODEL_NAME="Qwen/Qwen3-14B"
export SOKRATES_GUIDED_JSON=1 # vLLM enforces the JSON schema
python app.py
```
Smoke-test the endpoint before launching the app:
```bash
curl $MODEL_BASE_URL/models -H "Authorization: Bearer $MODEL_API_KEY"
```
No code changes are required to switch endpoints — only these variables.
## Deploy to a Hugging Face Space
1. Create a new **Gradio** Space.
2. Push this repo to the Space (or connect the GitHub repo).
3. In **Settings → Variables and secrets**, add `MODEL_BASE_URL`, `MODEL_API_KEY`,
`MODEL_NAME` (and `HF_TOKEN` if using diarization) as **secrets**.
4. The Space runs `app.py` automatically.
## Sample dialogues
Synthetic, English-only doctor–patient conversations live in `data/`:
- `data/sample_dialogue_1.txt` — lung mass intake.
- `data/sample_dialogue_2.txt` — breast lump intake.
No real patient data is used anywhere in this project.