prompt-storage-skill.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. #!/usr/bin/env python3
  2. """
  3. 提示词存储技能 - 用于存储和检索用户的提示词
  4. 使用方法:
  5. 1. 存储提示词: /store-prompt 您的提示词内容
  6. 2. 查看所有提示词: /view-prompts
  7. 3. 搜索提示词: /search-prompt 关键词
  8. 4. 删除提示词: /delete-prompt ID
  9. 存储位置: d:/UGit/AIGC-Space/memory/prompts.json
  10. """
  11. import json
  12. import os
  13. import uuid
  14. from datetime import datetime
  15. from pathlib import Path
  16. class PromptStorage:
  17. """提示词存储管理器"""
  18. def __init__(self):
  19. self.memory_dir = Path("d:/UGit/AIGC-Space/memory")
  20. self.prompts_file = self.memory_dir / "prompts.json"
  21. # 确保memory目录存在
  22. self.memory_dir.mkdir(exist_ok=True)
  23. # 初始化或加载提示词文件
  24. self.prompts = self._load_prompts()
  25. def _load_prompts(self):
  26. """加载存储的提示词"""
  27. if self.prompts_file.exists():
  28. try:
  29. with open(self.prompts_file, 'r', encoding='utf-8') as f:
  30. return json.load(f)
  31. except (json.JSONDecodeError, IOError):
  32. return []
  33. return []
  34. def _save_prompts(self):
  35. """保存提示词到文件"""
  36. try:
  37. with open(self.prompts_file, 'w', encoding='utf-8') as f:
  38. json.dump(self.prompts, f, ensure_ascii=False, indent=2)
  39. except IOError as e:
  40. print(f"保存提示词失败: {e}")
  41. def store_prompt(self, content, category="general", tags=None):
  42. """存储提示词"""
  43. if not content.strip():
  44. return False, "提示词内容不能为空"
  45. prompt = {
  46. "id": str(uuid.uuid4()),
  47. "content": content,
  48. "category": category,
  49. "tags": tags or [],
  50. "created_at": datetime.now().isoformat(),
  51. "updated_at": datetime.now().isoformat()
  52. }
  53. self.prompts.append(prompt)
  54. self._save_prompts()
  55. return True, f"提示词已存储,ID: {prompt['id'][:8]}"
  56. def get_all_prompts(self):
  57. """获取所有提示词"""
  58. return self.prompts
  59. def search_prompts(self, keyword):
  60. """搜索提示词"""
  61. keyword = keyword.lower()
  62. results = []
  63. for prompt in self.prompts:
  64. # 在内容中搜索
  65. if keyword in prompt["content"].lower():
  66. results.append(prompt)
  67. # 在标签中搜索
  68. elif any(keyword in tag.lower() for tag in prompt["tags"]):
  69. results.append(prompt)
  70. # 在分类中搜索
  71. elif keyword in prompt["category"].lower():
  72. results.append(prompt)
  73. return results
  74. def get_prompt_by_id(self, prompt_id):
  75. """根据ID获取提示词"""
  76. for prompt in self.prompts:
  77. if prompt["id"].startswith(prompt_id):
  78. return prompt
  79. return None
  80. def delete_prompt(self, prompt_id):
  81. """删除提示词"""
  82. for i, prompt in enumerate(self.prompts):
  83. if prompt["id"].startswith(prompt_id):
  84. del self.prompts[i]
  85. self._save_prompts()
  86. return True, "提示词已删除"
  87. return False, "未找到指定ID的提示词"
  88. def get_categories(self):
  89. """获取所有分类"""
  90. categories = set()
  91. for prompt in self.prompts:
  92. categories.add(prompt["category"])
  93. return sorted(list(categories))
  94. def get_tags(self):
  95. """获取所有标签"""
  96. tags = set()
  97. for prompt in self.prompts:
  98. tags.update(prompt["tags"])
  99. return sorted(list(tags))
  100. def get_stats(self):
  101. """获取统计信息"""
  102. return {
  103. "total": len(self.prompts),
  104. "categories": len(self.get_categories()),
  105. "tags": len(self.get_tags()),
  106. "by_category": self._count_by_category()
  107. }
  108. def _count_by_category(self):
  109. """按分类统计"""
  110. counts = {}
  111. for prompt in self.prompts:
  112. category = prompt["category"]
  113. counts[category] = counts.get(category, 0) + 1
  114. return counts
  115. # 全局实例
  116. prompt_storage = PromptStorage()
  117. def handle_store_prompt(content):
  118. """处理存储提示词请求"""
  119. if not content:
  120. return "请提供要存储的提示词内容"
  121. # 自动分类(简单启发式)
  122. category = "general"
  123. if "代码" in content or "code" in content.lower():
  124. category = "code"
  125. elif "架构" in content or "architecture" in content.lower():
  126. category = "architecture"
  127. elif "设计" in content or "design" in content.lower():
  128. category = "design"
  129. elif "数据库" in content or "database" in content.lower():
  130. category = "database"
  131. elif "前端" in content or "frontend" in content.lower():
  132. category = "frontend"
  133. elif "后端" in content or "backend" in content.lower():
  134. category = "backend"
  135. # 自动提取标签
  136. tags = []
  137. if len(content) > 200:
  138. tags.append("长文本")
  139. if "?" in content:
  140. tags.append("问题")
  141. success, message = prompt_storage.store_prompt(content, category, tags)
  142. return message
  143. def handle_view_prompts(limit=10):
  144. """处理查看提示词请求"""
  145. prompts = prompt_storage.get_all_prompts()
  146. if not prompts:
  147. return "暂无存储的提示词"
  148. # 按创建时间倒序排列
  149. prompts = sorted(prompts, key=lambda x: x["created_at"], reverse=True)
  150. # 限制返回数量
  151. if limit:
  152. prompts = prompts[:int(limit)]
  153. result = []
  154. for prompt in prompts:
  155. result.append(f"""
  156. ID: {prompt['id'][:8]}
  157. 分类: {prompt['category']}
  158. 标签: {', '.join(prompt['tags'])}
  159. 创建时间: {prompt['created_at'][:10]}
  160. 内容: {prompt['content'][:100]}...
  161. """)
  162. return "\n".join(result)
  163. def handle_search_prompts(keyword):
  164. """处理搜索提示词请求"""
  165. if not keyword:
  166. return "请提供搜索关键词"
  167. results = prompt_storage.search_prompts(keyword)
  168. if not results:
  169. return f"未找到包含 '{keyword}' 的提示词"
  170. result = []
  171. for prompt in results:
  172. result.append(f"""
  173. ID: {prompt['id'][:8]}
  174. 分类: {prompt['category']}
  175. 标签: {', '.join(prompt['tags'])}
  176. 创建时间: {prompt['created_at'][:10]}
  177. 内容: {prompt['content'][:200]}
  178. """)
  179. return f"找到 {len(results)} 个结果:\n\n" + "\n".join(result)
  180. def handle_delete_prompt(prompt_id):
  181. """处理删除提示词请求"""
  182. if not prompt_id:
  183. return "请提供要删除的提示词ID"
  184. success, message = prompt_storage.delete_prompt(prompt_id)
  185. return message
  186. def handle_prompt_stats():
  187. """处理获取提示词统计信息"""
  188. stats = prompt_storage.get_stats()
  189. result = f"""
  190. 提示词统计:
  191. 总数量: {stats['total']}
  192. 分类数量: {stats['categories']}
  193. 标签数量: {stats['tags']}
  194. 按分类统计:
  195. """
  196. for category, count in stats['by_category'].items():
  197. result += f" {category}: {count}\n"
  198. return result
  199. # 技能函数
  200. def skill_store_prompt(prompt_content):
  201. """存储提示词"""
  202. return handle_store_prompt(prompt_content)
  203. def skill_view_prompts(limit="10"):
  204. """查看所有提示词"""
  205. return handle_view_prompts(limit)
  206. def skill_search_prompt(keyword):
  207. """搜索提示词"""
  208. return handle_search_prompts(keyword)
  209. def skill_delete_prompt(prompt_id):
  210. """删除提示词"""
  211. return handle_delete_prompt(prompt_id)
  212. def skill_prompt_stats():
  213. """获取提示词统计信息"""
  214. return handle_prompt_stats()
  215. # 导出技能函数供外部使用
  216. __all__ = [
  217. 'skill_store_prompt',
  218. 'skill_view_prompts',
  219. 'skill_search_prompt',
  220. 'skill_delete_prompt',
  221. 'skill_prompt_stats'
  222. ]