فهرست منبع

Merge pull request #317 from pamdla/feature/MindEchoAgent

[毕业设计] MindEchoAgent - 情绪驱动的音乐推荐智能体
jjyaoao 4 ماه پیش
والد
کامیت
dccb5de66b

+ 33 - 0
Co-creation-projects/pamdla-MindEchoAgent/Dockerfile

@@ -0,0 +1,33 @@
+FROM python:3.12-slim
+LABEL maintainer="https://github.com/pamdla"
+LABEL team="victor@agent①②③⑦"
+LABEL project="MindEchoAgent"
+LABEL git.repo="https://github.com/pamdla/MindEchoAgent"
+
+ENV TZ=Asia/Shanghai \
+    DEBIAN_FRONTEND=noninteractive \
+    PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple/ \
+    PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn
+
+WORKDIR /app
+
+COPY requirements.txt .
+
+RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main" > /etc/apt/sources.list && \
+    echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main" >> /etc/apt/sources.list && \
+    echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main" >> /etc/apt/sources.list
+
+RUN apt update \
+    && apt install -y --no-install-recommends \
+    && apt install -y git wget make gcc g++ \
+    && apt install -y nodejs npm \
+    && apt autoremove -y \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
+RUN npm config set registry https://registry.npmmirror.com
+
+# RUN python -m spacy download zh_core_web_sm \
+#     python -m spacy download en_core_web_sm
+
+RUN pip3 install --no-cache-dir -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cpu

+ 164 - 0
Co-creation-projects/pamdla-MindEchoAgent/README.md

@@ -0,0 +1,164 @@
+# MindEchoAgent · 心境回响
+
+🧠🎵 MindEchoAgent - 情绪驱动的音乐推荐智能体,用AI感知心情,用音乐温暖心灵。
+> 目前它是一个基于 hello-agents 框架构建的情绪音乐推荐智能体。
+
+## ✨ 特点
+- 🎧 情绪驱动,而非标签驱动:基于深度情绪识别而非简单标签匹配
+- 🧠 Agent + Tool 架构:基于Hello-Agents框架,模块化设计,易于扩展
+- 🧪 完全模拟,稳定可控:可内置高质量模拟数据,无需API密钥即可体验全部功能
+- 🎛 Gradio 快速演示:开箱即用的Web界面,支持实时交互演示
+- 🔄 记忆系统(待完善):具备短期心境记忆,可记录和分析情绪变化模式
+- 📱 多端适配(待扩展):Web界面适配移动端,后续支持智能家居设备
+
+## 🔧 技术栈
+- 核心框架: hello-agents >= 0.2.7
+- Web界面: gradio >= 4.0
+- 语言环境: Python 3.10+
+- 数据处理: json, datetime, typing
+- 环境管理: python-dotenv
+
+## 启动方式
+```bash
+# 1. 克隆项目
+git clone https://github.com/pamdla/MindEchoAgent.git
+cd MindEchoAgent
+
+# 2. 安装依赖
+pip install -r requirements.txt
+
+# 3. 启动应用
+python main.py
+```
+
+## 📁 项目结构
+
+```
+MindEchoAgent/
+├── main.py                      # Gradio主界面
+├── requirements.txt             # 依赖列表
+├── README.md                    # 项目说明
+├── .env.example                 # 环境变量示例
+├── assets/                      # 静态资源
+│   ├── architecture.png         # 架构图
+│   └── demo-screenshot.png      # 演示截图
+├── src/                         # 源代码
+│   ├── __init__.py
+│   ├── agents/                  # 智能体模块
+│   │   ├── __init__.py
+│   │   ├── sleep_agent.py       # 子智能体
+│   │   └── mind_echo_agent.py   # 主智能体
+│   ├── tools/                   # 工具模块
+│       ├── __init__.py
+│       ├── dialogue_state_tool.py # 对话状态工具
+│       ├── mood_music_tool.py   # 音乐推荐工具
+│       ├── text_comfort_tool.py # 文字安慰工具
+│       └── mood_summary_tool.py # 心情总结工具
+│   └── utils                    # 其它工具
+│       ├── loader.py            # 工具加载
+│       └── state.py             # 状态定义
+└── data/                        # 数据目录
+    └── mood_history.json        # 心情历史记录
+```
+
+
+## ⭐ 核心功能
+
+1. 情绪识别与响应
+
+- 对话状态识别: 初始状态、情绪识别、情感支持、音乐推荐、情绪反思、问题升级6种状态
+- 多维情绪检测:识别开心、悲伤、放松、专注、压力、兴奋等6种核心情绪
+- 上下文感知:结合场景(工作、运动、学习、睡前等)提供精准推荐
+- 自然语言交互:理解口语化表达,如"今天好累"、"心情美美的"
+
+2. 智能音乐推荐(待完善)
+
+- 个性化播放列表:根据心情和场景生成定制化音乐推荐
+- 模拟数据引擎:可内置偏好的曲目,覆盖多种风格和场景
+- 播放时长计算:智能计算播放列表总时长,优化聆听体验
+
+3. 情感支持系统
+
+- 双模式安慰引擎:预设回复 + LLM生成,确保稳定性和创造性
+- 共情表达:温暖、支持的语气,搭配适当的emoji表情
+- 实用建议:提供具体、可操作的情绪调节建议
+
+4. 心境记忆分析
+
+- 历史记录:自动记录每次交互的心情状态
+- 模式识别:分析情绪变化趋势和时间分布
+- 个性化洞察:提供基于历史数据的个性化建议
+
+## 🏠 Web界面操作
+
+启动应用后,
+
+- 在浏览器打开 http://localhost:7860
+- 输入心情描述,如:"今天工作压力好大,想听放松的音乐"
+- 查看智能响应,包含:
+> 情绪识别结果
+> 个性化音乐推荐
+> 情感支持文字
+> 心情分析报告
+
+
+## 🚀 后续优化计划
+
+1. 功能扩展【近期(~1个月)】
+
+```js
+- 记忆系统(记录和分析情绪变化)
+- 音乐预览片段(30秒试听功能)
+- 增加音乐文件(不同类型1\~2首歌曲)
+```
+
+2. 用户体验优化【中期(~2个月)】
+
+```js
+# 计划新增功能
+- 对话历史管理(支持多轮对话上下文)
+- 情感强度调节滑块(用户可调整推荐强度)
+- 个性化偏好设置(音乐风格、语言偏好)
+- 多端适配(支持家居设备,音箱、灯光、窗帘等)
+```
+
+## 🎬 演示效果
+### 界面截图、演示录屏
+
+- [B站链接-演示录屏](https://www.bilibili.com/video/BV1FmFpzSELf)
+
+## 🌐 智能家居扩展
+
+### 小米音箱集成方案
+
+阶段1:基础对接
+
+```js
+# 技术栈:Python + MiService + WebSocket
+# 1. 创建小米音箱技能
+- 注册小米开发者账号
+- 创建智能家居技能
+- 配置语音交互模型
+
+# 2. 实现语音接口
+- 语音转文本(ASR)
+- 文本转语音(TTS)
+- 指令解析与响应
+
+# 3. 设备控制集成
+- 播放控制(播放、暂停、切歌)
+- 音量调节
+- 播放列表管理
+```
+
+
+## 🙏 致谢
+
+感谢以下项目和社区的支持:
+
+- [Datawhale - 开源学习社区](https://github.com/datawhalechina)
+- [Datawhale - Hello-Agents课程](https://github.com/datawhalechina/hello-agents)
+- [Hello-Agents - 智能体框架](https://github.com/jjyaoao/HelloAgents)
+- [Gradio - 机器学习Web演示框架](https://www.gradio.app/)
+
+所有贡献者和用户

+ 41 - 0
Co-creation-projects/pamdla-MindEchoAgent/docker-compose.yaml

@@ -0,0 +1,41 @@
+services:
+  mindechoagent:
+    tty: true
+    build:
+      context: .
+      dockerfile: Dockerfile
+    image: mindechoagent
+    container_name: mindechoagent
+    hostname: mindechoagent
+    restart: unless-stopped
+    volumes:
+      - $PWD:/app
+
+  qdrant:
+    image: qdrant/qdrant
+    container_name: qdrant
+    hostname: qdrant
+    ports:
+      - 6333:6333
+    volumes:
+      - ./qdrant/data:/qdrant/storage
+    environment:
+      - QDRANT__TELEMETRY_DISABLED=true
+    restart: unless-stopped
+
+  neosrv:
+    image: neo4j:2025.11.2-community
+    container_name: neosrv
+    hostname: neosrv
+    ports:
+      - 7474:7474
+      - 7687:7687
+    volumes:
+      - ./neo4j/data:/data
+      - ./neo4j/logs:/logs
+      - ./neo4j/import:/import
+    environment:
+      NEO4J_AUTH: neo4j/password  # 最好在.env设置
+      NEO4J_PLUGINS: '["apoc"]'   # 可选插件
+    restart: unless-stopped
+

+ 6 - 0
Co-creation-projects/pamdla-MindEchoAgent/main.ipynb

@@ -0,0 +1,6 @@
+# main.ipynb
+from agents.mind_echo_agent import create_mind_echo_agent
+
+agent = create_mind_echo_agent()
+
+agent.run("我最近有点低落,想安静一下")

+ 222 - 0
Co-creation-projects/pamdla-MindEchoAgent/main.py

@@ -0,0 +1,222 @@
+# main.py
+
+import threading
+import time
+import gradio as gr
+import json
+from src.agents.sleep_agent import sleep_agent
+from src.agents.mind_echo_agent import create_mind_echo_agent
+
+# 启动 SleepAgent A2A 服务(后台线程)
+threading.Thread(target=lambda: sleep_agent.run(port=6000), daemon=True).start()
+time.sleep(1)
+
+mind_agent = create_mind_echo_agent()
+
+def extract_music_info(response_text):
+    """从智能体响应中提取音乐信息"""
+    try:
+        # 尝试查找JSON格式的音乐数据
+        start_idx = response_text.find('{')
+        end_idx = response_text.rfind('}') + 1
+
+        if start_idx != -1 and end_idx > start_idx:
+            json_str = response_text[start_idx:end_idx]
+            data = json.loads(json_str)
+
+            if "tracks" in data and data["tracks"]:
+                # 提取第一首歌曲信息
+                first_track = data["tracks"][0]
+                return {
+                    "title": first_track.get("title", "未知歌曲"),
+                    "artist": first_track.get("artist", "未知艺术家"),
+                    "playlist_count": data.get("total_tracks", 0),
+                    "mood": data.get("mood", ""),
+                    "full_data": data
+                }
+    except:
+        pass
+
+    # 如果没有找到音乐数据,返回默认信息
+    return {
+        "title": "放松音乐推荐",
+        "artist": "MindEchoAI",
+        "playlist_count": 3,
+        "mood": "放松"
+    }
+
+def chat(user_input: str):
+    """处理用户输入并返回响应"""
+    response = mind_agent.run(user_input)
+    music_info = extract_music_info(response)
+
+    # 返回响应文本和音乐信息
+    return response, music_info
+
+def update_music_player(music_info):
+    """更新音乐播放器显示"""
+    if not music_info:
+        return gr.update(visible=False), gr.update(visible=False)
+
+    # 构建播放器显示文本
+    player_text = f"""
+    🎵 **正在播放:{music_info['title']}**
+    👤 艺术家:{music_info['artist']}
+    💫 心情:{music_info['mood']}
+    📊 播放列表:{music_info['playlist_count']} 首歌曲
+
+    *注:此为模拟播放器,实际音乐服务需后续集成*
+    """
+
+    return gr.update(value=player_text, visible=True), gr.update(visible=True)
+
+with gr.Blocks(
+    title="MindEchoAgent · 心境回响",
+    theme=gr.themes.Soft(),
+    css="""
+    .music-player {
+        border: 1px solid #e0e0e0;
+        border-radius: 12px;
+        padding: 16px;
+        margin-top: 20px;
+        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+        color: white;
+        box-shadow: 0 4px 12px rgba(0,0,0,0.1);
+    }
+    .music-player h3 {
+        margin-top: 0;
+        color: white;
+        border-bottom: 1px solid rgba(255,255,255,0.2);
+        padding-bottom: 8px;
+    }
+    .player-controls {
+        display: flex;
+        justify-content: center;
+        gap: 12px;
+        margin-top: 12px;
+    }
+    .player-controls button {
+        background: rgba(255,255,255,0.2);
+        border: none;
+        border-radius: 50%;
+        width: 44px;
+        height: 44px;
+        cursor: pointer;
+        color: white;
+        font-size: 18px;
+        transition: all 0.3s ease;
+    }
+    .player-controls button:hover {
+        background: rgba(255,255,255,0.3);
+        transform: scale(1.05);
+    }
+    """
+) as demo:
+
+    # 标题区
+    gr.Markdown("""
+    # 🧠🎵 MindEchoAgent · 心境回响
+    ### 情绪陪伴 + 音乐推荐 + 必要时升级睡眠专家
+    """)
+
+    with gr.Row():
+        with gr.Column(scale=2):
+            # 输入区
+            with gr.Group():
+                gr.Markdown("### 💭 分享你的心境")
+                inp = gr.Textbox(
+                    label="",
+                    placeholder="例如:我最近晚上睡不着,很焦虑... 或者 需要一些放松的音乐",
+                    lines=3,
+                    container=False
+                )
+
+            # 发送按钮
+            btn = gr.Button("✨ 发送", variant="primary", size="lg")
+
+            # 响应输出区
+            with gr.Group():
+                gr.Markdown("### 🤖 AI 回响")
+                out = gr.Textbox(
+                    label="",
+                    lines=8,
+                    interactive=False,
+                    container=False,
+                    show_copy_button=True
+                )
+
+        with gr.Column(scale=1):
+            # 音乐播放器面板
+            gr.Markdown("### 🎧 音乐推荐")
+
+            # 音乐播放器
+            music_player = gr.HTML(
+                value="<div style='text-align: center; padding: 20px; color: #666;'>等待推荐音乐...</div>",
+                visible=False,
+                elem_classes="music-player"
+            )
+
+            # 播放器控制按钮(隐藏,通过JavaScript控制)
+            player_controls = gr.HTML("""
+            <div class="player-controls" style="display: none;">
+                <button onclick="playerControl('prev')">⏮️</button>
+                <button onclick="playerControl('play')">▶️</button>
+                <button onclick="playerControl('pause')">⏸️</button>
+                <button onclick="playerControl('next')">⏭️</button>
+                <button onclick="playerControl('volume_up')">🔊</button>
+                <button onclick="playerControl('volume_down')">🔉</button>
+            </div>
+            """, visible=False)
+
+    # 交互逻辑
+    btn.click(
+        fn=chat,
+        inputs=inp,
+        outputs=[out, music_player]
+    ).then(
+        fn=update_music_player,
+        inputs=music_player,
+        outputs=[music_player, player_controls]
+    )
+
+    # JavaScript控制函数
+    demo.load(
+        fn=None,
+        inputs=None,
+        outputs=None,
+    )
+
+    # 示例输入
+    gr.Examples(
+        examples=[
+            ["今天工作压力好大,想听点放松的音乐"],
+            ["心情特别开心,想要有活力的歌"],
+            ["晚上睡不着,有点焦虑"],
+            ["需要专注工作的背景音乐"],
+            ["运动时想听兴奋的音乐"]
+        ],
+        inputs=inp,
+        outputs=[out, music_player],
+        fn=chat,
+        cache_examples=True,
+        label="💡 快速示例"
+    )
+
+    # 页脚
+    gr.Markdown("---")
+    gr.Markdown(
+        """
+        <div style="text-align: center; color: #888; font-size: 0.9em;">
+        🎵 用AI感知情绪,用音乐温暖心灵 · MindEchoAgent v1.0<br>
+        ⚠️ 音乐播放为模拟演示,实际播放功能需后续集成
+        </div>
+        """
+    )
+
+if __name__ == "__main__":
+    demo.queue().launch(
+        server_name="0.0.0.0",
+        server_port=7860,
+        share=False,
+        show_error=True
+    )

+ 8 - 0
Co-creation-projects/pamdla-MindEchoAgent/requirements.txt

@@ -0,0 +1,8 @@
+hello-agents[all]>=0.2.7
+qdrant-client~=1.15.1
+
+gradio
+python-dotenv
+loguru
+openai
+flask

+ 46 - 0
Co-creation-projects/pamdla-MindEchoAgent/src/agents/mind_echo_agent.py

@@ -0,0 +1,46 @@
+# src/agents/mind_echo_agent.py
+
+from hello_agents import SimpleAgent, HelloAgentsLLM, ToolRegistry
+from hello_agents.tools import MemoryTool, A2ATool
+from src.tools.dialogue_state_tool import DialogueStateTool
+from src.tools.mood_music_tool import MoodMusicTool
+from src.tools.text_comfort_tool import TextComfortTool
+from src.tools.mood_summary_tool import MoodSummaryTool
+from src.utils.state import DialogueState
+
+def create_mind_echo_agent(user_id: str = "user001"):
+    llm = HelloAgentsLLM()
+
+    system_prompt = """
+你是 MindEchoAgent(心境回响),负责情绪陪伴与音乐推荐。
+你需要:
+1)识别用户心境,每次对话先判断状态(MOOD/COMFORT/MUSIC/ESCALATE)
+2)状态决定调用哪个工具,比如提供安抚/音乐推荐
+3)若用户出现“持续焦虑、睡不着、失眠”等关键词或状态为 ESCALATE,必须升级到 SleepAgent(A2A)
+"""
+
+    agent = SimpleAgent(
+        name="MindEchoAgent",
+        llm=llm,
+        system_prompt=system_prompt
+    )
+
+    registry = ToolRegistry()
+    registry.register_tool(MemoryTool(user_id=user_id))
+    registry.register_tool(DialogueStateTool())
+    registry.register_tool(TextComfortTool())
+    registry.register_tool(MoodMusicTool())
+    registry.register_tool(MoodSummaryTool())
+
+    # A2A 工具:指向 SleepAgent 服务
+    sleep_tool = A2ATool(
+        agent_url="http://localhost:6000",  # SleepAgent 默认端口
+        name="sleep_agent",
+        description="睡眠专家,处理失眠/焦虑等问题"
+    )
+    registry.register_tool(sleep_tool)
+
+    agent.tool_registry = registry
+    agent.current_state = DialogueState.INIT.value
+
+    return agent

+ 20 - 0
Co-creation-projects/pamdla-MindEchoAgent/src/agents/sleep_agent.py

@@ -0,0 +1,20 @@
+# src/agents/sleep_agent.py
+
+from hello_agents.protocols import A2AServer
+
+# A2A 服务端:睡眠专家
+sleep_agent = A2AServer(
+    name="sleep_agent",
+    description="睡眠专家,提供助眠建议与睡眠策略"
+)
+
+@sleep_agent.skill("answer")
+def answer_sleep_question(text: str) -> str:
+    # MVP:直接返回固定策略(可扩展)
+    return (
+        "睡眠建议:\n"
+        "1. 关闭电子设备,做 5 分钟深呼吸\n"
+        "2. 选择一首轻柔音乐,音量调低\n"
+        "3. 若持续焦虑,建议记录当下思绪并写下 3 件感恩的事\n"
+        "\n(如需要更个性化建议,可继续描述你的睡眠情况)"
+    )

+ 33 - 0
Co-creation-projects/pamdla-MindEchoAgent/src/tools/dialogue_state_tool.py

@@ -0,0 +1,33 @@
+# src/tools/dialogue_state_tool.py
+
+from hello_agents.tools import Tool as BaseTool
+from src.utils.state import DialogueState
+
+class DialogueStateTool(BaseTool):
+    def __init__(self):
+        super().__init__(
+            name="dialogue_state_tool",
+            description="判断当前对话应处于哪个阶段"
+        )
+        self.name = "dialogue_state_tool"
+        self.description = "判断当前对话应处于哪个阶段"
+
+    def get_parameters(self):
+        return {
+            "type": "object",
+            "properties": {
+                "query": {"type": "string", "description": "用户输入"},
+                "current_state": {"type": "string", "description": "当前状态"}
+            },
+            "required": ["query"]
+        }
+
+    def run(self, query: str, current_state: str = "") -> str:
+        # 初级版本--MVP规则:关键字触发
+        if "睡不着" in query or "失眠" in query or "焦虑" in query:
+            return DialogueState.ESCALATE.value
+        if "听" in query or "音乐" in query:
+            return DialogueState.MUSIC.value
+        if "难受" in query or "不开心" in query:
+            return DialogueState.COMFORT.value
+        return DialogueState.MOOD.value

+ 48 - 0
Co-creation-projects/pamdla-MindEchoAgent/src/tools/mood_music_tool.py

@@ -0,0 +1,48 @@
+# src/tools/mood_music_tool.py
+
+from hello_agents.tools import Tool as BaseTool
+from src.utils.loader import load_mood_music_map
+
+class MoodMusicTool(BaseTool):
+    """
+    情绪 -> 音乐推荐工具(完全模拟)
+    """
+
+    def __init__(self):
+        super().__init__(
+            name="mood_music_tool",
+            description = "根据用户描述的心境,返回对应的音乐推荐列表"
+        )
+        self.name = "mood_music_tool"
+        self.description = "根据用户描述的心境,返回对应的音乐推荐列表"
+        self.mood_map = load_mood_music_map()
+
+    def get_parameters(self):
+        return {
+            "type": "object",
+            "properties": {
+                "query": {"type": "string", "description": "用户输入"}
+            },
+            "required": ["query"]
+        }
+
+    def run(self, query: str) -> str:
+        """
+        query: 用户输入的心境描述
+        """
+        # 极简规则匹配(稳)
+        for mood, songs in self.mood_map.items():
+            if mood in query:
+                return self._format_result(mood, songs)
+
+        # fallback
+        return self._format_result(
+            "未识别",
+            ["Tycho - Awake", "Ólafur Arnalds - Near Light"]
+        )
+
+    def _format_result(self, mood, songs):
+        result = f"🎧 当前识别的心境:{mood}\n\n推荐音乐:\n"
+        for i, song in enumerate(songs, 1):
+            result += f"{i}. {song}\n"
+        return result

+ 31 - 0
Co-creation-projects/pamdla-MindEchoAgent/src/tools/mood_summary_tool.py

@@ -0,0 +1,31 @@
+# src/tools/mood_summary_tool.py
+
+from hello_agents.tools import Tool as BaseTool
+
+class MoodSummaryTool(BaseTool):
+    def __init__(self):
+        super().__init__(
+            name="mood_summary_tool",
+            description="生成长期记忆的心境总结模板(LLM生成最终内容)"
+        )
+        self.name = "mood_summary_tool"
+        self.description = "生成长期记忆的心境总结模板(LLM生成最终内容)"
+
+    def get_parameters(self):
+        return {
+            "type": "object",
+            "properties": {
+                "query": {"type": "string", "description": "用户输入"}
+            },
+            "required": ["query"]
+        }
+
+    def run(self, query: str) -> str:
+        return (
+            "请根据以下内容生成一个简短的心境总结(用于长期记忆):\n"
+            f"用户输入:{query}\n"
+            "需要包含:\n"
+            "1. 当前心境(1-2句)\n"
+            "2. 触发因素(如果有)\n"
+            "3. 可能的长期偏好(音乐/情绪)\n"
+        )

+ 31 - 0
Co-creation-projects/pamdla-MindEchoAgent/src/tools/text_comfort_tool.py

@@ -0,0 +1,31 @@
+# src/tools/text_comfort_tool.py
+
+from hello_agents.tools import Tool as BaseTool
+
+class TextComfortTool(BaseTool):
+
+    def __init__(self):
+        super().__init__(
+            name="text_comfort_tool",
+            description="提供安抚要点,LLM 负责生成自然语言"
+        )
+        self.name = "text_comfort_tool"
+        self.description = "提供安抚要点,LLM 负责生成自然语言"
+
+    def get_parameters(self):
+        return {
+            "type": "object",
+            "properties": {
+                "query": {"type": "string", "description": "用户输入"}
+            },
+            "required": ["query"]
+        }
+
+    def run(self, query: str) -> str:
+        return (
+            "安抚要点:\n"
+            "1. 共情:承认情绪存在\n"
+            "2. 允许停顿:不用强迫自己立刻变好\n"
+            "3. 小动作:深呼吸、短暂休息、听轻音乐\n"
+            "4. 若持续困扰,建议升级到 SleepAgent"
+        )

+ 9 - 0
Co-creation-projects/pamdla-MindEchoAgent/src/utils/loader.py

@@ -0,0 +1,9 @@
+# src/utils/loader.py
+
+import json
+from pathlib import Path
+
+def load_mood_music_map():
+    data_path = Path(__file__).parent.parent.parent / "data" / "mood_music_map.json"
+    with open(data_path, "r", encoding="utf-8") as f:
+        return json.load(f)

+ 20 - 0
Co-creation-projects/pamdla-MindEchoAgent/src/utils/state.py

@@ -0,0 +1,20 @@
+# src/utils/state.py
+
+from enum import Enum
+
+class DialogueState(str, Enum):
+    INIT = "init"
+    MOOD = "mood"
+    COMFORT = "comfort"
+    MUSIC = "music"
+    REFLECT = "reflect"
+    ESCALATE = "escalate"
+
+
+class MoodState(str, Enum):
+    HAPPY = "happy"
+    SAD = "sad"
+    RELAXED = "relaxed"
+    FOCUSED = "focused"
+    STRESSED = "stressed"
+    EXCITED = "excited"