File size: 5,434 Bytes
1d4c295
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# integration_example.py
# 这个文件展示如何将你的MsPatient类集成到Streamlit应用中

import streamlit as st
import json
import pandas as pd
from datetime import datetime
import time
from pathlib import Path

# 导入你的AnnaAgent类 - 请根据实际路径调整
try:
    from ms_patient import MsPatient  # 假设你的类在anna_agent.py文件中
    ANNA_AGENT_AVAILABLE = True
except ImportError:
    ANNA_AGENT_AVAILABLE = False
    st.warning("⚠️ 未找到AnnaAgent类,使用模拟模式")

def load_dataset(uploaded_file):
    """
    加载数据集文件
    支持JSON和JSONL格式
    """
    try:
        if uploaded_file.name.endswith('.json'):
            data = json.load(uploaded_file)
        elif uploaded_file.name.endswith('.jsonl'):
            data = []
            for line in uploaded_file:
                data.append(json.loads(line.decode('utf-8')))
        else:
            raise ValueError("不支持的文件格式")
        return data
    except Exception as e:
        st.error(f"数据集加载失败: {str(e)}")
        return None

def validate_patient_data(patient_data):
    """
    验证患者数据格式是否正确
    """
    required_keys = ['id', 'portrait', 'report']
    
    for key in required_keys:
        if key not in patient_data:
            return False, f"缺少必需字段: {key}"
    
    # 验证portrait字段
    portrait_required = ['age', 'gender', 'occupation', 'marital_status']
    for key in portrait_required:
        if key not in patient_data['portrait']:
            return False, f"portrait中缺少字段: {key}"
    
    return True, "数据格式正确"

def initialize_patient_agent(patient_data, language="Chinese"):
    """
    初始化患者智能体
    """
    try:
        if not ANNA_AGENT_AVAILABLE:
            return None, "AnnaAgent类不可用"
        
        # 验证数据格式
        is_valid, message = validate_patient_data(patient_data)
        if not is_valid:
            return None, message
        
        # 初始化智能体
        agent = MsPatient(
            portrait=patient_data["portrait"],
            report=patient_data["report"],
            previous_conversations=patient_data.get("conversation", []),
            language=language
        )
        
        return agent, "初始化成功"
        
    except Exception as e:
        return None, f"初始化失败: {str(e)}"

def simulate_response(user_input, patient_data=None):
    """
    模拟智能体回复(当AnnaAgent不可用时使用)
    """
    responses = [
        f"我理解您提到的'{user_input}'。这确实是一个需要深入探讨的话题。",
        f"谢谢您的耐心。关于您说的'{user_input}',我想分享一下我的感受...",
        f"您的话让我思考了很多。'{user_input}'这个观点很有意思。",
        "我需要一些时间来消化您刚才说的话。这对我来说很重要。",
        "我觉得我们之间的对话很有帮助。您能再详细说说吗?"
    ]
    
    import random
    return random.choice(responses)

def export_chat_history(messages, patient_id):
    """
    导出聊天记录
    """
    chat_history = {
        "patient_id": patient_id,
        "timestamp": datetime.now().isoformat(),
        "session_info": {
            "total_messages": len(messages),
            "counselor_messages": len([m for m in messages if m["role"] == "user"]),
            "patient_responses": len([m for m in messages if m["role"] == "assistant"])
        },
        "messages": messages
    }
    
    return json.dumps(chat_history, ensure_ascii=False, indent=2)

def get_patient_summary(patient_data):
    """
    生成患者信息摘要
    """
    if not patient_data or 'portrait' not in patient_data:
        return "无患者信息"
    
    portrait = patient_data['portrait']
    summary = f"""
    **患者ID**: {patient_data.get('id', 'N/A')}
    **基本信息**: {portrait.get('age', 'N/A')}{portrait.get('gender', 'N/A')}
    **职业**: {portrait.get('occupation', 'N/A')}
    **婚姻状态**: {portrait.get('marital_status', 'N/A')}
    **主要症状**: {portrait.get('symptom', 'N/A')}
    """
    
    if 'report' in patient_data:
        report = patient_data['report']
        summary += f"""
    **主诉**: {report.get('chief_complaint', 'N/A')}
    """
    
    return summary

# 示例配置文件内容
CONFIG_EXAMPLE = {
    "openai": {
        "api_key": "your-api-key-here",
        "base_url": "https://api.openai.com/v1",
        "model_name": "gpt-3.5-turbo"
    },
    "ui_settings": {
        "language": "Chinese",  # or "English"
        "theme": "default",
        "max_messages": 100
    },
    "patient_defaults": {
        "language": "Chinese",
        "enable_memory": True,
        "enable_emotion_modulation": True
    }
}

def save_config(config, path="config.json"):
    """保存配置文件"""
    with open(path, 'w', encoding='utf-8') as f:
        json.dump(config, f, ensure_ascii=False, indent=2)

def load_config(path="config.json"):
    """加载配置文件"""
    try:
        with open(path, 'r', encoding='utf-8') as f:
            return json.load(f)
    except FileNotFoundError:
        return CONFIG_EXAMPLE

# 使用示例:
if __name__ == "__main__":
    print("这是AnnaAgent Streamlit集成的辅助文件")
    print("请运行:streamlit run your_streamlit_app.py")