scenario_config.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """
  2. 情景对话模式:场景与话题常量及首句模板
  3. 参考:项目文档/情景对话模式设计与改造方案.md
  4. """
  5. from typing import Dict, List, Tuple
  6. # 场景键
  7. SCENE_DEFAULT = "default"
  8. SCENE_WINDOW = "window" # Lumi在窗前看风景
  9. SCENE_READING = "reading" # Lumi在桌前看书
  10. SCENE_EATING = "eating" # Lumi在桌前吃饭
  11. # 场景权重(用于加权随机):default 70%, 三个特殊各 10%
  12. SCENE_WEIGHTS: List[Tuple[str, int]] = [
  13. (SCENE_DEFAULT, 70),
  14. (SCENE_WINDOW, 10),
  15. (SCENE_READING, 10),
  16. (SCENE_EATING, 10),
  17. ]
  18. # 每个特殊场景下的 3 个话题 key
  19. SCENARIO_TOPICS: Dict[str, List[str]] = {
  20. SCENE_WINDOW: ["weather", "season", "travel"],
  21. SCENE_READING: ["reading", "hobbies", "relaxation"],
  22. SCENE_EATING: ["favourite_food", "hometown_food", "daily_meal"],
  23. }
  24. # 话题展示名 (labelEn | labelZh),用于 greeting_context.topics
  25. TOPIC_LABELS: Dict[str, Dict[str, str]] = {
  26. "weather": {"labelEn": "Weather", "labelZh": "天气"},
  27. "season": {"labelEn": "Season", "labelZh": "季节"},
  28. "travel": {"labelEn": "Travel", "labelZh": "旅行"},
  29. "reading": {"labelEn": "Reading", "labelZh": "阅读"},
  30. "hobbies": {"labelEn": "Hobbies", "labelZh": "爱好"},
  31. "relaxation": {"labelEn": "Relaxation", "labelZh": "放松"},
  32. "favourite_food": {"labelEn": "Favourite food", "labelZh": "喜欢的食物"},
  33. "hometown_food": {"labelEn": "Hometown food", "labelZh": "家乡的食物"},
  34. "daily_meal": {"labelEn": "Daily meal", "labelZh": "日常饮食"},
  35. }
  36. # 首句模板:{name} 替换为用户名
  37. SPECIAL_TOPIC_FIRST_LINES: Dict[str, str] = {
  38. "weather": "Hi, {name}! The sky is so clear today. How is the weather at your place?",
  39. "season": "Hi {name}! The leaves are changing colour. It's fall. What is your favorite season?",
  40. "travel": "Hi, {name}! I want to go somewhere far away. Where do you want to travel?",
  41. "reading": "Hi, {name}! I am reading. This story is crazy! What book are you reading lately?",
  42. "hobbies": "Hi, {name}! I am reading. I love it! What do you do in your free time?",
  43. "relaxation": "Hi, {name}! I am reading. It is the only way to relax my brain. What is your way to escape?",
  44. "favourite_food": "Hi, {name}! I am having snacks. It's so delicious. What is your favorite food?",
  45. "hometown_food": "Hi, {name}! I am having snacks. It's so delicious. What is your hometown's best dish?",
  46. "daily_meal": "Hi, {name}! I am having snacks. It's so delicious. What you ate today?",
  47. }
  48. def get_special_first_line(topic_key: str, user_name: str) -> str:
  49. """获取特殊场景某话题的首句(已替换用户名)。"""
  50. user_name = (user_name or "").strip() or "Neo"
  51. template = SPECIAL_TOPIC_FIRST_LINES.get(topic_key)
  52. if not template:
  53. return f"Hi, {user_name}! How are you today?"
  54. return template.format(name=user_name)
  55. def build_topics_payload(available_topic_keys: List[str]) -> List[Dict[str, str]]:
  56. """构建 greeting_context.topics 数组:[{ key, labelEn, labelZh }]。"""
  57. return [
  58. {"key": k, **TOPIC_LABELS.get(k, {"labelEn": k, "labelZh": k})}
  59. for k in available_topic_keys
  60. ]