Skip to content

Patient case summary #90

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

marziabil
Copy link

@marziabil marziabil commented Mar 14, 2025

Link to X thread added in the Readme

Summary by CodeRabbit

  • Documentation

    • Added a detailed project overview with setup, installation, and usage instructions.
  • New Features

    • Launched an interactive web application that lets users upload patient data.
    • Enhanced the processing workflow to generate AI-powered case summaries that highlight key patient conditions alongside clinical guideline recommendations.

Copy link

coderabbitai bot commented Mar 14, 2025

Walkthrough

This update introduces three new files to the Patient Case Summary Workflow project. The project documentation is now provided in a README that explains the application’s purpose, technologies, and setup instructions. A new Streamlit-based application (app.py) enables users to upload patient JSON files for asynchronous processing. Additionally, a comprehensive module (patient_case_summary.py) has been added which defines data models, implements functions to parse patient data from a FHIR bundle, creates condition bundles, and integrates clinical guideline matching via asynchronous workflows.

Changes

File(s) Change Summary
patient_case_summary/README.md Added documentation outlining the project purpose, technological stack (Synthea, LlamaIndex, LlamaCloud/VectorStoreIndex, Streamlit), installation and setup instructions, and usage guidance for the case summarization application.
patient_case_summary/app.py Introduced a Streamlit application for processing patient JSON files. Implements asynchronous file handling with a new process_patient function that reads the file, processes patient data, and displays the summary result.
patient_case_summary/patient_case_summary.py Implemented a complete workflow for generating patient case summaries. Added multiple classes and methods for parsing Synthea-generated FHIR Bundles, creating condition bundles, matching clinical guidelines, and generating summaries.

Sequence Diagram(s)

sequenceDiagram
    participant U as User
    participant S as Streamlit UI
    participant P as process_patient
    participant W as Workflow Module
    U->>S: Upload JSON file
    S->>P: Pass file path
    P->>W: Invoke parsing of patient data
    W->>W: Create condition bundles & match guidelines (async)
    W-->>P: Return case summary
    P->>S: Display patient summary
Loading
sequenceDiagram
    participant GRW as GuidelineRecommendationWorkflow
    participant PSP as parse_synthea_patient
    participant CCB as create_condition_bundles
    participant GCS as generate_case_summary
    GRW->>PSP: Extract patient data from FHIR bundle
    GRW->>CCB: Assemble condition bundles (awaited)
    GRW->>GCS: Generate final case summary with guidelines
    GCS-->>GRW: Output structured case summary
Loading

Poem

Oh, I’m a bunny with a coding delight,
Hoping through new files, from morning to night.
A README, an app, and workflows so bright,
Async hops in the code making everything right.
With guidelines and summaries, our logic takes flight,
🐇✨ Hoppy changes in our burrow of light!
Enjoy the spring of code in every byte!

Tip

⚡🧪 Multi-step agentic review comment chat (experimental)
  • We're introducing multi-step agentic chat in review comments. This experimental feature enhances review discussions with the CodeRabbit agentic chat by enabling advanced interactions, including the ability to create pull requests directly from comments.
    - To enable this feature, set early_access to true under in the settings.
✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (3)
patient_case_summary/README.md (1)

30-30: Wrap URL within Markdown syntax.

Markdown lint tool (MD034) flags the bare URL. Consider formatting it as a link for better readability, for example:

- Link to X thread: https://x.com/marziabil/status/1900598708682846514
+ [Link to X thread](https://x.com/marziabil/status/1900598708682846514)
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

30-30: Bare URL used
null

(MD034, no-bare-urls)

patient_case_summary/patient_case_summary.py (2)

408-412: Remove unused imports and variables.

Imports such as SimpleDirectoryReader, Document, FunctionCallingAgentWorker, ChatMessage, and MessageRole are unused based on the static analysis hints; also clear_output is never used. Removing them improves readability and avoids confusion.

- from llama_index.core import SimpleDirectoryReader
- from llama_index.core.schema import Document
- from llama_index.core.agent import FunctionCallingAgentWorker
- from llama_index.core.llms import ChatMessage, MessageRole
- from IPython.display import clear_output

Also applies to: 764-764

🧰 Tools
🪛 Ruff (0.8.2)

408-408: llama_index.core.SimpleDirectoryReader imported but unused

Remove unused import: llama_index.core.SimpleDirectoryReader

(F401)


409-409: llama_index.core.schema.Document imported but unused

Remove unused import: llama_index.core.schema.Document

(F401)


410-410: llama_index.core.agent.FunctionCallingAgentWorker imported but unused

Remove unused import: llama_index.core.agent.FunctionCallingAgentWorker

(F401)


411-411: Redefinition of unused ChatPromptTemplate from line 236

Remove definition: ChatPromptTemplate

(F811)


412-412: llama_index.core.llms.ChatMessage imported but unused

Remove unused import

(F401)


412-412: llama_index.core.llms.MessageRole imported but unused

Remove unused import

(F401)


574-574: Use context managers to handle file I/O.

Open files with with statements to ensure proper resource management. For example:

- patient_info_dict = json.load(open(str(patient_info_path), "r"))
+ with open(patient_info_path, "r") as f:
+     patient_info_dict = json.load(f)

Also applies to: 604-604

🧰 Tools
🪛 Ruff (0.8.2)

574-574: Use a context manager for opening files

(SIM115)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6140fc3 and 9bb18be.

📒 Files selected for processing (3)
  • patient_case_summary/README.md (1 hunks)
  • patient_case_summary/app.py (1 hunks)
  • patient_case_summary/patient_case_summary.py (1 hunks)
🧰 Additional context used
🪛 markdownlint-cli2 (0.17.2)
patient_case_summary/README.md

30-30: Bare URL used
null

(MD034, no-bare-urls)

🪛 Ruff (0.8.2)
patient_case_summary/patient_case_summary.py

19-19: Undefined name get_ipython

(F821)


156-156: Undefined name datetime

(F821)


156-156: Undefined name datetime

(F821)


260-260: Undefined name ConditionEncounters

(F821)


282-282: await statement outside of a function

(F704)


408-408: llama_index.core.SimpleDirectoryReader imported but unused

Remove unused import: llama_index.core.SimpleDirectoryReader

(F401)


409-409: llama_index.core.schema.Document imported but unused

Remove unused import: llama_index.core.schema.Document

(F401)


410-410: llama_index.core.agent.FunctionCallingAgentWorker imported but unused

Remove unused import: llama_index.core.agent.FunctionCallingAgentWorker

(F401)


411-411: Redefinition of unused ChatPromptTemplate from line 236

Remove definition: ChatPromptTemplate

(F811)


412-412: llama_index.core.llms.ChatMessage imported but unused

Remove unused import

(F401)


412-412: llama_index.core.llms.MessageRole imported but unused

Remove unused import

(F401)


574-574: Use a context manager for opening files

(SIM115)


604-604: Use a context manager for opening files

(SIM115)


736-736: Redefinition of unused OpenAI from line 234

Remove definition: OpenAI

(F811)


764-764: IPython.display.clear_output imported but unused

Remove unused import: IPython.display.clear_output

(F401)


774-774: await statement outside of a function

(F704)

🔇 Additional comments (3)
patient_case_summary/README.md (1)

1-29: README looks clear and thorough.

Your introduction, project overview, and technology stack explanation are concise and helpful to any new developer exploring the project.

patient_case_summary/app.py (1)

27-29: Validate the asyncio usage pattern.

Creating a new event loop and using asyncio.run_coroutine_threadsafe might cause compatibility issues or concurrency pitfalls in certain environments. Verify the approach aligns with Streamlit’s best practices, which generally require a standard synchronous flow or well-integrated async approach within Streamlit's event loop.

patient_case_summary/patient_case_summary.py (1)

282-282: await statements outside an async function.

Using await at the top level can result in syntax errors in standard Python scripts (works only in notebooks/interactive shells). To run this asynchronously in normal Python, wrap calls in an async function and invoke via asyncio.run(...) or a similar approach.

Also applies to: 774-774

🧰 Tools
🪛 Ruff (0.8.2)

282-282: await statement outside of a function

(F704)

from patient_case_summary import parse_synthea_patient, create_condition_bundles, generate_case_summary

# Set up LlamaCloud API key
os.environ["LLAMA_CLOUD_API_KEY"] = "your-llx-api-key"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Avoid hardcoding secrets in the source code.

Storing an API key directly in the code can pose security risks. It's best practice to load secrets from environment variables or a secure vault (e.g., .env file) and avoid committing them to version control.

- os.environ["LLAMA_CLOUD_API_KEY"] = "your-llx-api-key"
+ if "LLAMA_CLOUD_API_KEY" not in os.environ:
+     st.warning("LLAMA_CLOUD_API_KEY is not set. Some features may not work properly.")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
os.environ["LLAMA_CLOUD_API_KEY"] = "your-llx-api-key"
if "LLAMA_CLOUD_API_KEY" not in os.environ:
st.warning("LLAMA_CLOUD_API_KEY is not set. Some features may not work properly.")

# In[ ]:


get_ipython().system('pip install llama-index llama-index-indices-managed-llama-cloud llama-cloud llama-parse')
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Remove or conditionally define Jupyter-specific code.

get_ipython() is a Jupyter utility and may cause errors in non-notebook environments. To keep this file environment-agnostic, consider removing or wrapping this code in a check that ensures it’s running in a Jupyter environment.

🧰 Tools
🪛 Ruff (0.8.2)

19-19: Undefined name get_ipython

(F821)


async def create_condition_bundles(
patient_data: PatientInfo, llm: Optional[LLM] = None
) -> ConditionEncounters:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Undefined return type.

-> ConditionEncounters: is referenced, but there is no ConditionEncounters definition anywhere in the code. Either remove or define this type.

🧰 Tools
🪛 Ruff (0.8.2)

260-260: Undefined name ConditionEncounters

(F821)

from llama_index.core import SimpleDirectoryReader
from llama_index.core.schema import Document
from llama_index.core.agent import FunctionCallingAgentWorker
from llama_index.core.prompts import ChatPromptTemplate
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Redefinition of ChatPromptTemplate/OpenAI.

ChatPromptTemplate and OpenAI were already defined earlier. Consider removing or aliasing the re-import to avoid confusion or collisions.

Also applies to: 736-736

🧰 Tools
🪛 Ruff (0.8.2)

411-411: Redefinition of unused ChatPromptTemplate from line 236

Remove definition: ChatPromptTemplate

(F811)

Comment on lines +85 to +89
def parse_synthea_patient(file_path: str, filter_active: bool = True) -> PatientInfo:
# Load the Synthea-generated FHIR Bundle
with open(file_path, "r") as f:
bundle = json.load(f)

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Import the 'json' module before usage.

json.load(f) is called, but there's no import json. Add the necessary import:

+ import json
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def parse_synthea_patient(file_path: str, filter_active: bool = True) -> PatientInfo:
# Load the Synthea-generated FHIR Bundle
with open(file_path, "r") as f:
bundle = json.load(f)
import json
def parse_synthea_patient(file_path: str, filter_active: bool = True) -> PatientInfo:
# Load the Synthea-generated FHIR Bundle
with open(file_path, "r") as f:
bundle = json.load(f)

def get_encounter_date(enc):
period = enc.get("period", {})
start = period.get("start")
return datetime.fromisoformat(start) if start else datetime.min
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Import datetime before usage.

You are calling datetime.fromisoformat(start) but have not imported the datetime module. Add the missing import statement for datetime:

+ from datetime import datetime
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
return datetime.fromisoformat(start) if start else datetime.min
from datetime import datetime
return datetime.fromisoformat(start) if start else datetime.min
🧰 Tools
🪛 Ruff (0.8.2)

156-156: Undefined name datetime

(F821)


156-156: Undefined name datetime

(F821)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant