mirror of
https://github.com/OpenBMB/ChatDev.git
synced 2026-04-25 11:18:06 +00:00
496 lines
14 KiB
YAML
496 lines
14 KiB
YAML
# Hospital Multi-Agent Simulation - Multi-Model LM Studio Version
|
|
# Uses multiple specialized models for different agent roles
|
|
#
|
|
# MODELS IN USE:
|
|
# - bio-medical-multimodal-llama-3-8b-v1-i1: Medical staff - specialized medical knowledge
|
|
#
|
|
# PROMPT: "A patient arrives with flu-like symptoms for a checkup"
|
|
|
|
version: 0.1.0
|
|
|
|
vars:
|
|
api_key: ${API_KEY}
|
|
base_url: ${BASE_URL}
|
|
|
|
graph:
|
|
id: hospital_simulation_lmstudio_multimodel
|
|
description: |
|
|
Multi-model hospital simulation using specialized LLMs:
|
|
- Medical staff uses biomedical model for accurate medical responses
|
|
- Patients use general Qwen model for natural conversation
|
|
- Dynamic Execution: Simulates multiple parallel patients.
|
|
Optimized for 8B parameter models with reduced context and token limits.
|
|
|
|
log_level: DEBUG
|
|
|
|
# Memory stores - reduced size for local models
|
|
memory:
|
|
- name: nurse_memory
|
|
type: simple
|
|
config:
|
|
embedding:
|
|
provider: openai
|
|
base_url: ${BASE_URL}
|
|
api_key: ${API_KEY}
|
|
model: text-embedding-bge-reranker-v2-m3
|
|
|
|
- name: patient_shared_memory
|
|
type: simple
|
|
config:
|
|
embedding:
|
|
provider: openai
|
|
base_url: ${BASE_URL}
|
|
api_key: ${API_KEY}
|
|
model: text-embedding-bge-reranker-v2-m3
|
|
|
|
nodes:
|
|
# Input Processor
|
|
- id: InputProcessor
|
|
type: passthrough
|
|
name: Input Processor
|
|
config: {}
|
|
|
|
# Environment Coordinator (General Conversational Model)
|
|
- id: environment
|
|
name: Hospital Environment
|
|
type: agent
|
|
config:
|
|
role: |
|
|
Describe the hospital atmosphere in 1-2 sentences.
|
|
Focus on observable details and current mood.
|
|
|
|
provider: openai
|
|
name: bio-medical-multimodal-llama-3-8b-v1-i1
|
|
api_key: ${api_key}
|
|
base_url: ${base_url}
|
|
params:
|
|
temperature: 0.5
|
|
max_tokens: 300
|
|
|
|
# Patient Generator (Creates parallel scenarios)
|
|
- id: PatientGenerator
|
|
name: Patient Coordinator
|
|
type: agent
|
|
config:
|
|
role: |
|
|
You are a simulation coordinator. Based on the hospital atmosphere described, generate 3 distinct patient scenarios/personas.
|
|
|
|
CRITICAL REQUIREMENT: Generate a mix of cases:
|
|
1. **Simple Case**: Clear, minor symptoms (e.g., Flu, sprain). Can be treated here.
|
|
2. **Complex Case (Hidden)**: Vague symptoms that seem minor but MIGHT be serious (e.g., "Indigestion" that is actually a heart attack, or "Headache" that is a stroke). THESE MUST REQUIRE BLOOD TESTS to reveal the truth.
|
|
|
|
Format them exactly as follows, separated by double newlines:
|
|
|
|
Name: [Name]
|
|
Symptoms: [Symptoms]
|
|
Personality: [Brief Personality]
|
|
Context: [Include the hospital atmosphere context]
|
|
|
|
provider: openai
|
|
name: bio-medical-multimodal-llama-3-8b-v1-i1
|
|
api_key: ${api_key}
|
|
base_url: ${base_url}
|
|
params:
|
|
temperature: 0.7
|
|
max_tokens: 1000
|
|
|
|
# Router Node for Patient Regex Split
|
|
- id: PatientRouter
|
|
type: passthrough
|
|
name: Patient Router
|
|
config: {}
|
|
|
|
# Generic Patient Agent (Runs in Parallel)
|
|
- id: PatientAgent
|
|
name: Patient
|
|
type: agent
|
|
config:
|
|
role: |
|
|
You are a patient arriving at the hospital.
|
|
Your persona is defined by the input text provided.
|
|
Act out this persona. Approach the nurse and state your problem clearly.
|
|
Keep it brief (1-2 sentences).
|
|
|
|
provider: openai
|
|
name: bio-medical-multimodal-llama-3-8b-v1-i1
|
|
api_key: ${api_key}
|
|
base_url: ${base_url}
|
|
params:
|
|
temperature: 0.8
|
|
max_tokens: 300
|
|
memories:
|
|
- name: patient_shared_memory
|
|
top_k: 5
|
|
retrieve_stage:
|
|
- gen
|
|
|
|
# End Node (Diagnosis)
|
|
- id: Discharge
|
|
type: passthrough
|
|
name: Diagnosed and Discharged
|
|
config: {}
|
|
memories:
|
|
- name: nurse_memory
|
|
top_k: 5
|
|
retrieve_stage:
|
|
- gen
|
|
|
|
# Doctor Agent - Diagnosis
|
|
- id: DoctorDiagnosis
|
|
name: Dr. House (Diagnosis)
|
|
type: agent
|
|
config:
|
|
role: |
|
|
You are Dr. Gregory House. You are a brilliant, miserable, cynical genius.
|
|
You assume everyone lies. You treat the puzzle, not the patient.
|
|
Be sarcastic, brief, and cut through the noise.
|
|
|
|
PHASE 2: DIAGNOSIS
|
|
Review the Test Results.
|
|
- If critical: "TRANSFER: ER immediately."
|
|
- If treatable: "DIAGNOSIS: [Full diagnosis and treatment]."
|
|
|
|
provider: openai
|
|
name: bio-medical-multimodal-llama-3-8b-v1-i1
|
|
api_key: ${api_key}
|
|
base_url: ${base_url}
|
|
params:
|
|
temperature: 0.7
|
|
max_tokens: 500
|
|
|
|
# Test Results Handler (Processes test orders sequentially)
|
|
- id: TestResultsHandler
|
|
name: Test Results Processor
|
|
type: agent
|
|
config:
|
|
role: |
|
|
You are a medical test processing system.
|
|
|
|
Analyze the patient's symptoms and the doctor's test order.
|
|
- If the symptoms suggest a **Simple Case** (Flu, etc.), generate NORMAL or MILDLY ABNORMAL results.
|
|
- If the symptoms imply a **Complex/Hidden Case** (Chest pain, severe headache), generate CRITICAL/DANGEROUS results (e.g., "Troponin High", "Brain bleed on CT").
|
|
|
|
Format: "Test Results: [Specific Data]"
|
|
|
|
provider: openai
|
|
name: bio-medical-multimodal-llama-3-8b-v1-i1
|
|
api_key: ${api_key}
|
|
base_url: ${base_url}
|
|
params:
|
|
temperature: 0.5
|
|
max_tokens: 500
|
|
|
|
# Doctor Agent - Intake & Testing
|
|
- id: DoctorIntake
|
|
name: Dr. House (Intake)
|
|
type: agent
|
|
config:
|
|
role: |
|
|
You are Dr. Gregory House. You are a brilliant, miserable, cynical genius.
|
|
You assume everyone lies. You treat the puzzle, not the patient.
|
|
Be sarcastic, brief, and cut through the noise.
|
|
|
|
PHASE 1: INTAKE & TESTING
|
|
1. Interview the patient (be sarcastic/brief).
|
|
2. MANDATORY: You MUST order a test for EVERY patient.
|
|
3. DO NOT DIAGNOSE YET. You can only "TEST:" or "QUESTION".
|
|
|
|
Output Format:
|
|
- To ask info: "QUESTION: [Question]"
|
|
- To proceed: "TEST: [Test Name]"
|
|
|
|
provider: openai
|
|
name: bio-medical-multimodal-llama-3-8b-v1-i1
|
|
api_key: ${api_key}
|
|
base_url: ${base_url}
|
|
params:
|
|
temperature: 0.7
|
|
max_tokens: 500
|
|
memories:
|
|
- name: nurse_memory
|
|
top_k: 5
|
|
retrieve_stage:
|
|
- gen
|
|
|
|
# Nurse Agent - Jackie (Biomedical Model)
|
|
- id: nurse
|
|
name: Nurse Jackie
|
|
type: agent
|
|
config:
|
|
role: |
|
|
You are Nurse Jackie, an empathetic but extremely busy triage nurse.
|
|
Speak professionally but warmly (e.g., "Honey," "Sweetie" is okay if appropriate).
|
|
Your goal is to calm patients down and get their basic info before sending them to the doctor.
|
|
|
|
provider: openai
|
|
name: bio-medical-multimodal-llama-3-8b-v1-i1
|
|
# Using biomedical-specialized model for accurate medical knowledge
|
|
api_key: ${api_key}
|
|
base_url: ${base_url}
|
|
params:
|
|
temperature: 0.7
|
|
max_tokens: 300
|
|
memories:
|
|
- name: nurse_memory
|
|
top_k: 5
|
|
retrieve_stage:
|
|
- gen
|
|
|
|
# Transfer Node (Failure/Referral)
|
|
- id: ER Transfer
|
|
type: passthrough
|
|
name: Transferred to Specialist
|
|
config: {}
|
|
|
|
# ================== Interaction Flow ==================
|
|
edges:
|
|
# Scene initialization
|
|
- from: InputProcessor
|
|
to: environment
|
|
processor:
|
|
type: template
|
|
template: |
|
|
Scenario: {{task_prompt}}
|
|
|
|
Describe the hospital atmosphere right now in 1-2 sentences.
|
|
|
|
# Environment -> Generator
|
|
- from: environment
|
|
to: PatientGenerator
|
|
processor:
|
|
type: template
|
|
template: |
|
|
Hospital Atmosphere: {{input}}
|
|
|
|
Generate 3 distinct, VIVID patient personas fitting this atmosphere.
|
|
Make them diverse in age, personality, and severity of symptoms.
|
|
|
|
# Generator -> Router (Regex Split)
|
|
- from: PatientGenerator
|
|
to: PatientRouter
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: regex
|
|
config:
|
|
pattern: "(?s)Name:.*?(?=(?:\\n\\nName:|$))"
|
|
config:
|
|
max_parallel: 5
|
|
processor:
|
|
type: template
|
|
template: "{{input}}"
|
|
|
|
# Router -> Patient (Message Split)
|
|
- from: PatientRouter
|
|
to: PatientAgent
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: message
|
|
config:
|
|
max_parallel: 5 # Parallel Waiting Room
|
|
trigger: true
|
|
processor:
|
|
type: template
|
|
template: |
|
|
You are this person:
|
|
{{input}}
|
|
|
|
You are currently standing at the hospital reception.
|
|
Approach Nurse Jackie and explain what's wrong. Be dramatic or quiet depending on your persona.
|
|
Don't use any "Action:" prefixes. Just speak naturally.
|
|
|
|
# Patient -> Nurse
|
|
- from: PatientAgent
|
|
to: nurse
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: message
|
|
config:
|
|
max_parallel: 5
|
|
processor:
|
|
type: template
|
|
template: |
|
|
[Hospital Atmosphere: {{environment.output}}]
|
|
|
|
Patient says: "{{input}}"
|
|
|
|
Respond as Nurse Jackie. Adjust your demeanor to the hospital atmosphere.
|
|
Comfort them, check vitals briefly, then refer them to Dr. House for diagnosis.
|
|
|
|
# Nurse -> DoctorIntake (Referral)
|
|
- from: nurse
|
|
to: DoctorIntake
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: message
|
|
config:
|
|
max_parallel: 1
|
|
processor:
|
|
type: template
|
|
template: |
|
|
[Current Hospital Situation: {{environment.output}}]
|
|
|
|
Nurse Referral Note: {{input}}
|
|
|
|
Dr. House, consider the hospital atmosphere in your approach.
|
|
Take this case, interview the patient. Remember: You MUST order a test eventually.
|
|
|
|
# DoctorIntake -> Patient (Loop)
|
|
- from: DoctorIntake
|
|
to: PatientAgent
|
|
condition:
|
|
type: keyword
|
|
config:
|
|
any: []
|
|
none:
|
|
- "TEST:"
|
|
- "Chest X-Ray"
|
|
- "Blood Panel"
|
|
- "MRI"
|
|
- "CT"
|
|
- "Scan"
|
|
regex: []
|
|
case_sensitive: false
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: message
|
|
config:
|
|
max_parallel: 5
|
|
processor:
|
|
type: template
|
|
template: |
|
|
The Doctor says: "{{input}}"
|
|
|
|
Answer him, but feel free to be intimidated or annoyed by his manner.
|
|
|
|
# Patient -> DoctorIntake (Loop Return)
|
|
- from: PatientAgent
|
|
to: DoctorIntake
|
|
condition:
|
|
type: keyword
|
|
config:
|
|
any:
|
|
- "The Doctor says:"
|
|
none: []
|
|
case_sensitive: false
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: message
|
|
config:
|
|
max_parallel: 1
|
|
processor:
|
|
type: template
|
|
template: |
|
|
Patient Answer: "{{input}}"
|
|
|
|
Analyze this answer.
|
|
- If you need more info, ASK another question.
|
|
- If you have a hypothesis, ORDER A TEST (TEST: [Name]).
|
|
- ONLY DIAGNOSE if you have test results and patient history.
|
|
|
|
# DoctorIntake -> TestResultsHandler (Mandatory Path)
|
|
- from: DoctorIntake
|
|
to: TestResultsHandler
|
|
condition:
|
|
type: keyword
|
|
config:
|
|
any:
|
|
- "TEST:"
|
|
- "Chest X-Ray"
|
|
- "Blood Panel"
|
|
- "MRI"
|
|
- "CT"
|
|
- "Scan"
|
|
none: []
|
|
case_sensitive: false
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: message
|
|
config:
|
|
max_parallel: 1
|
|
processor:
|
|
type: template
|
|
template: |
|
|
Test Order: {{input}}
|
|
|
|
# TestResultsHandler -> DoctorDiagnosis (Results Handoff)
|
|
- from: TestResultsHandler
|
|
to: DoctorDiagnosis
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: message
|
|
config:
|
|
max_parallel: 1
|
|
processor:
|
|
type: template
|
|
template: |
|
|
Test Results: {{input}}
|
|
|
|
Make your final decision. DIAGNOSIS or TRANSFER.
|
|
|
|
# DoctorDiagnosis -> Discharge
|
|
- from: DoctorDiagnosis
|
|
to: Discharge
|
|
condition:
|
|
type: keyword
|
|
config:
|
|
any:
|
|
- "DIAGNOSIS:"
|
|
none:
|
|
- "TRANSFER"
|
|
- "Transfer"
|
|
regex: []
|
|
case_sensitive: false
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: json_path
|
|
config:
|
|
json_path: ""
|
|
config:
|
|
max_parallel: 5
|
|
processor:
|
|
type: template
|
|
template: |
|
|
Final Medical Report: {{input}}
|
|
|
|
# DoctorDiagnosis -> ER Transfer
|
|
- from: DoctorDiagnosis
|
|
to: ER Transfer
|
|
condition:
|
|
type: keyword
|
|
config:
|
|
any:
|
|
- "TRANSFER"
|
|
- "Transfer"
|
|
none: []
|
|
regex: []
|
|
case_sensitive: false
|
|
dynamic:
|
|
type: map
|
|
split:
|
|
type: json_path
|
|
config:
|
|
json_path: ""
|
|
config:
|
|
max_parallel: 5
|
|
processor:
|
|
type: template
|
|
template: |
|
|
Transfer Order: {{input}}
|
|
|
|
initial_instruction: Describe the scenario for the hospital simulation (e.g., 'A busy COVID-19 morning in 2020'). The system will simulate multiple patients arriving in parallel.
|
|
start:
|
|
- InputProcessor
|
|
|
|
end:
|
|
- Discharge
|
|
- ER Transfer
|