ErisPulse 2.4.5.dev3__tar.gz → 2.4.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/.gitignore +7 -0
  2. erispulse-2.4.6/PKG-INFO +564 -0
  3. erispulse-2.4.6/README.md +492 -0
  4. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/pyproject.toml +12 -2
  5. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/base.py +9 -9
  6. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/cli.py +61 -54
  7. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/cli.pyi +2 -0
  8. erispulse-2.4.6/src/ErisPulse/CLI/commands/create.py +710 -0
  9. erispulse-2.4.6/src/ErisPulse/CLI/commands/create.pyi +44 -0
  10. erispulse-2.4.6/src/ErisPulse/CLI/commands/init.py +378 -0
  11. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/init.pyi +7 -33
  12. erispulse-2.4.6/src/ErisPulse/CLI/commands/install.py +302 -0
  13. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/install.pyi +2 -2
  14. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/list.py +54 -60
  15. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/list.pyi +0 -13
  16. erispulse-2.4.6/src/ErisPulse/CLI/commands/list_remote.py +84 -0
  17. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/list_remote.pyi +2 -7
  18. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/run.py +75 -37
  19. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/run.pyi +3 -0
  20. erispulse-2.4.6/src/ErisPulse/CLI/commands/self_update.py +219 -0
  21. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/self_update.pyi +6 -15
  22. erispulse-2.4.6/src/ErisPulse/CLI/commands/uninstall.py +84 -0
  23. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/uninstall.pyi +2 -4
  24. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/upgrade.py +8 -20
  25. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/console.py +25 -23
  26. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/registry.py +17 -17
  27. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/utils/__init__.py +3 -1
  28. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/utils/__init__.pyi +1 -0
  29. erispulse-2.4.6/src/ErisPulse/CLI/utils/display.py +207 -0
  30. erispulse-2.4.6/src/ErisPulse/CLI/utils/display.pyi +45 -0
  31. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/utils/package_manager.py +257 -127
  32. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/utils/package_manager.pyi +6 -1
  33. erispulse-2.4.6/src/ErisPulse/Core/Bases/__init__.py +44 -0
  34. erispulse-2.4.6/src/ErisPulse/Core/Bases/__init__.pyi +19 -0
  35. erispulse-2.4.6/src/ErisPulse/Core/Bases/adapter.py +960 -0
  36. erispulse-2.4.6/src/ErisPulse/Core/Bases/adapter.pyi +490 -0
  37. erispulse-2.4.6/src/ErisPulse/Core/Bases/client.py +331 -0
  38. erispulse-2.4.6/src/ErisPulse/Core/Bases/client.pyi +272 -0
  39. erispulse-2.4.6/src/ErisPulse/Core/Bases/errors.py +130 -0
  40. erispulse-2.4.6/src/ErisPulse/Core/Bases/errors.pyi +118 -0
  41. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Bases/module.py +3 -2
  42. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Bases/module.pyi +1 -0
  43. erispulse-2.4.6/src/ErisPulse/Core/Bases/router.py +629 -0
  44. erispulse-2.4.6/src/ErisPulse/Core/Bases/router.pyi +432 -0
  45. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Bases/storage.py +13 -12
  46. erispulse-2.4.6/src/ErisPulse/Core/Bases/websocket.py +265 -0
  47. erispulse-2.4.6/src/ErisPulse/Core/Bases/websocket.pyi +194 -0
  48. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/__init__.py +4 -6
  49. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/base.py +84 -12
  50. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/base.pyi +6 -2
  51. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/command.py +124 -20
  52. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/command.pyi +2 -0
  53. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/message.py +4 -3
  54. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/message.pyi +1 -0
  55. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/meta.py +7 -6
  56. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/meta.pyi +1 -0
  57. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/notice.py +12 -5
  58. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/notice.pyi +1 -0
  59. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/request.py +6 -4
  60. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/request.pyi +3 -1
  61. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/wrapper.py +185 -82
  62. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/wrapper.pyi +59 -0
  63. erispulse-2.4.6/src/ErisPulse/Core/__init__.py +86 -0
  64. erispulse-2.4.6/src/ErisPulse/Core/__init__.pyi +26 -0
  65. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/adapter.py +287 -44
  66. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/adapter.pyi +43 -0
  67. erispulse-2.4.6/src/ErisPulse/Core/client.py +785 -0
  68. erispulse-2.4.6/src/ErisPulse/Core/client.pyi +378 -0
  69. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/config.py +48 -295
  70. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/config.pyi +3 -79
  71. erispulse-2.4.6/src/ErisPulse/Core/constants.py +524 -0
  72. erispulse-2.4.6/src/ErisPulse/Core/constants.pyi +18 -0
  73. erispulse-2.4.6/src/ErisPulse/Core/lifecycle.py +382 -0
  74. erispulse-2.4.6/src/ErisPulse/Core/lifecycle.pyi +227 -0
  75. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/logger.py +57 -37
  76. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/logger.pyi +8 -6
  77. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/module.py +138 -52
  78. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/module.pyi +4 -0
  79. erispulse-2.4.6/src/ErisPulse/Core/router.py +2496 -0
  80. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/router.pyi +166 -3
  81. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/storage.py +130 -4
  82. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/storage.pyi +4 -0
  83. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/__init__.py +2 -3
  84. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/__init__.pyi +1 -1
  85. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/__main__.py +5 -2
  86. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/adapter.py +23 -26
  87. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/bases/__init__.py +1 -3
  88. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/bases/finder.py +10 -2
  89. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/module.py +23 -26
  90. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/adapter.py +34 -3
  91. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/bases/__init__.py +1 -3
  92. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/module.py +162 -16
  93. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/module.pyi +1 -0
  94. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/strategy.py +1 -1
  95. erispulse-2.4.6/src/ErisPulse/runtime/__init__.py +64 -0
  96. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/runtime/__init__.pyi +1 -0
  97. erispulse-2.4.6/src/ErisPulse/runtime/config_schema.py +320 -0
  98. erispulse-2.4.6/src/ErisPulse/runtime/config_schema.pyi +128 -0
  99. erispulse-2.4.6/src/ErisPulse/runtime/context.py +51 -0
  100. erispulse-2.4.6/src/ErisPulse/runtime/context.pyi +37 -0
  101. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/runtime/exceptions.py +35 -22
  102. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/runtime/frame_config.py +80 -62
  103. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/runtime/frame_config.pyi +1 -0
  104. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/sdk.py +478 -330
  105. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/sdk.pyi +45 -48
  106. erispulse-2.4.6/src/ErisPulse/web_status/4xx.png +0 -0
  107. erispulse-2.4.6/src/ErisPulse/web_status/5xx.png +0 -0
  108. erispulse-2.4.6/src/ErisPulse/web_status/__init__.py +17 -0
  109. erispulse-2.4.6/src/ErisPulse/web_status/__init__.pyi +21 -0
  110. erispulse-2.4.6/src/ErisPulse/web_status/unknow.png +0 -0
  111. erispulse-2.4.5.dev3/PKG-INFO +0 -356
  112. erispulse-2.4.5.dev3/README.md +0 -284
  113. erispulse-2.4.5.dev3/src/ErisPulse/CLI/commands/init.py +0 -493
  114. erispulse-2.4.5.dev3/src/ErisPulse/CLI/commands/install.py +0 -405
  115. erispulse-2.4.5.dev3/src/ErisPulse/CLI/commands/list_remote.py +0 -101
  116. erispulse-2.4.5.dev3/src/ErisPulse/CLI/commands/self_update.py +0 -227
  117. erispulse-2.4.5.dev3/src/ErisPulse/CLI/commands/uninstall.py +0 -120
  118. erispulse-2.4.5.dev3/src/ErisPulse/Core/Bases/__init__.py +0 -17
  119. erispulse-2.4.5.dev3/src/ErisPulse/Core/Bases/__init__.pyi +0 -15
  120. erispulse-2.4.5.dev3/src/ErisPulse/Core/Bases/adapter.py +0 -396
  121. erispulse-2.4.5.dev3/src/ErisPulse/Core/Bases/adapter.pyi +0 -182
  122. erispulse-2.4.5.dev3/src/ErisPulse/Core/__init__.py +0 -58
  123. erispulse-2.4.5.dev3/src/ErisPulse/Core/__init__.pyi +0 -23
  124. erispulse-2.4.5.dev3/src/ErisPulse/Core/lifecycle.py +0 -212
  125. erispulse-2.4.5.dev3/src/ErisPulse/Core/lifecycle.pyi +0 -99
  126. erispulse-2.4.5.dev3/src/ErisPulse/Core/metrics.py +0 -489
  127. erispulse-2.4.5.dev3/src/ErisPulse/Core/metrics.pyi +0 -302
  128. erispulse-2.4.5.dev3/src/ErisPulse/Core/router.py +0 -1234
  129. erispulse-2.4.5.dev3/src/ErisPulse/runtime/__init__.py +0 -47
  130. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/LICENSE +0 -0
  131. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/__init__.py +0 -0
  132. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/__init__.pyi +0 -0
  133. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/base.pyi +0 -0
  134. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/__init__.py +0 -0
  135. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
  136. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/commands/upgrade.pyi +0 -0
  137. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/console.pyi +0 -0
  138. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/CLI/registry.pyi +0 -0
  139. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Bases/manager.py +0 -0
  140. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Bases/manager.pyi +0 -0
  141. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Bases/storage.pyi +0 -0
  142. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/__init__.pyi +0 -0
  143. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/message_builder.py +0 -0
  144. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/message_builder.pyi +0 -0
  145. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/session_type.py +0 -0
  146. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/Core/Event/session_type.pyi +0 -0
  147. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/__main__.pyi +0 -0
  148. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/__init__.py +0 -0
  149. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/__init__.pyi +0 -0
  150. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/adapter.pyi +0 -0
  151. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
  152. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/bases/finder.pyi +0 -0
  153. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/finders/module.pyi +0 -0
  154. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/__init__.py +0 -0
  155. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/__init__.pyi +0 -0
  156. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/adapter.pyi +0 -0
  157. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
  158. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/bases/loader.py +0 -0
  159. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
  160. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/loaders/strategy.pyi +0 -0
  161. {erispulse-2.4.5.dev3 → erispulse-2.4.6}/src/ErisPulse/runtime/exceptions.pyi +0 -0
@@ -9,6 +9,13 @@ logs/
9
9
  config.db*
10
10
  .website
11
11
 
12
+ # 敏感配置和数据文件
13
+ config/config.toml
14
+ config/config.db
15
+ config/config.db-journal
16
+ config/config.db-wal
17
+ config/config.db-shm
18
+
12
19
  # Byte-compiled / optimized / DLL files
13
20
  __pycache__/
14
21
  *.py[cod]
@@ -0,0 +1,564 @@
1
+ Metadata-Version: 2.4
2
+ Name: ErisPulse
3
+ Version: 2.4.6
4
+ Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
5
+ Author-email: ErisDev <erisdev@88.com>
6
+ Maintainer-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
7
+ License: MIT License
8
+
9
+ Copyright (c) 2025-2026 ErisPulse
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+ License-File: LICENSE
29
+ Keywords: async,asyncio,bot,bot-framework,chatbot,email,extensible,framework,instant-messaging,kook,matrix,modular,multi-platform,onebot,onebot12,qq,robot,sdk,telegram,yunhu
30
+ Classifier: Development Status :: 4 - Beta
31
+ Classifier: Framework :: AsyncIO
32
+ Classifier: Intended Audience :: Developers
33
+ Classifier: License :: OSI Approved :: MIT License
34
+ Classifier: Operating System :: OS Independent
35
+ Classifier: Programming Language :: Python :: 3
36
+ Classifier: Programming Language :: Python :: 3 :: Only
37
+ Classifier: Programming Language :: Python :: 3.10
38
+ Classifier: Programming Language :: Python :: 3.11
39
+ Classifier: Programming Language :: Python :: 3.12
40
+ Classifier: Programming Language :: Python :: 3.13
41
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
42
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
43
+ Classifier: Typing :: Typed
44
+ Requires-Python: >=3.10
45
+ Requires-Dist: aiohttp>=3.9.0
46
+ Requires-Dist: fastapi>=0.116.1
47
+ Requires-Dist: packaging>=25.0
48
+ Requires-Dist: pip>=23.0
49
+ Requires-Dist: rich>=13.0.0
50
+ Requires-Dist: toml>=0.10.2
51
+ Requires-Dist: uvicorn[standard]>=0.30.0
52
+ Requires-Dist: watchdog>=4.0.0
53
+ Provides-Extra: dev
54
+ Requires-Dist: httpx>=0.24.0; extra == 'dev'
55
+ Requires-Dist: pyclean>=3.6.0; extra == 'dev'
56
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
57
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == 'dev'
58
+ Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
59
+ Requires-Dist: pytest-mock>=3.10.0; extra == 'dev'
60
+ Requires-Dist: pytest-xdist>=3.0.0; extra == 'dev'
61
+ Requires-Dist: pytest>=7.0.0; extra == 'dev'
62
+ Requires-Dist: ruff>=0.1.7; extra == 'dev'
63
+ Provides-Extra: test
64
+ Requires-Dist: httpx>=0.24.0; extra == 'test'
65
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == 'test'
66
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == 'test'
67
+ Requires-Dist: pytest-cov>=4.0.0; extra == 'test'
68
+ Requires-Dist: pytest-mock>=3.10.0; extra == 'test'
69
+ Requires-Dist: pytest-xdist>=3.0.0; extra == 'test'
70
+ Requires-Dist: pytest>=7.0.0; extra == 'test'
71
+ Description-Content-Type: text/markdown
72
+
73
+ <table>
74
+ <tr>
75
+ <td width="35%" valign="middle" align="center">
76
+
77
+ <img src=".github/assets/mascot-hero.png" width="320" alt="ErisPulse" />
78
+
79
+ </td>
80
+ <td valign="middle">
81
+
82
+ [English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
83
+
84
+ # ErisPulse
85
+
86
+ **事件驱动的多平台机器人开发框架**
87
+
88
+ 基于 OneBot12 标准接口,一次编写,多平台部署。灵活的插件系统、热重载支持和完整的开发者工具链,适用于从简单聊天机器人到复杂自动化系统的各种场景。
89
+
90
+ > 支持 Vibe Coding 工作流,让 AI 直接生成可用模块 — [查看](docs/zh-CN/ai-support/README.md)
91
+
92
+ [![PyPI](https://img.shields.io/pypi/v/ErisPulse?style=for-the-badge&logo=pypi&logoColor=white)](https://pypi.org/project/ErisPulse/)
93
+ [![Python](https://img.shields.io/badge/Python-3.10+-FFD43B?style=for-the-badge&logo=python&logoColor=blue)](https://pypi.org/project/ErisPulse/)
94
+ [![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white)](https://hub.docker.com/r/erispulse/erispulse)
95
+ [![License](https://img.shields.io/badge/License-MIT-blue?style=for-the-badge)](https://github.com/ErisPulse/ErisPulse/blob/main/LICENSE)
96
+ [![Stars](https://img.shields.io/github/stars/ErisPulse/ErisPulse?style=for-the-badge&logo=github&color=brightgreen)](https://github.com/ErisPulse/ErisPulse)
97
+ [![Downloads](https://img.shields.io/pepy/dt/ErisPulse?style=for-the-badge&color=blue)](https://pypi.org/project/ErisPulse/)
98
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json&style=for-the-badge)](https://github.com/astral-sh/ruff)
99
+ [![Socket](https://img.shields.io/badge/Socket-Secure-2ea043?style=for-the-badge&logo=socket&logoColor=white)](https://socket.dev/pypi/package/erispulse)
100
+
101
+ [![文档](https://img.shields.io/badge/文档-erisdev.com-FF6B9D?style=for-the-badge&logo=bookstack&logoColor=white)](https://www.erisdev.com)
102
+ [![模块市场](https://img.shields.io/badge/模块市场-erisdev.com-C724B1?style=for-the-badge&logo=webpack&logoColor=white)](https://www.erisdev.com/#market)
103
+ [![讨论](https://img.shields.io/badge/GitHub-Discussions-181717?style=for-the-badge&logo=github)](https://github.com/ErisPulse/ErisPulse/discussions)
104
+
105
+ </td>
106
+ </tr>
107
+ </table>
108
+
109
+ ---
110
+
111
+ <div align="center">
112
+
113
+ ### 核心特性
114
+
115
+ </div>
116
+
117
+ <table>
118
+ <tr>
119
+ <td width="50%" align="center" valign="top">
120
+ <br/>
121
+
122
+ ### ⚡ 事件驱动架构
123
+
124
+ 基于 OneBot12 标准的清晰事件模型,让消息处理逻辑更加直观和高效
125
+
126
+ </td>
127
+ <td width="50%" align="center" valign="top">
128
+ <br/>
129
+
130
+ ### 🌐 跨平台兼容
131
+
132
+ 插件模块编写一次即可在所有平台使用,无需为不同平台重复开发
133
+
134
+ </td>
135
+ </tr>
136
+ <tr>
137
+ <td width="50%" align="center" valign="top">
138
+ <br/>
139
+
140
+ ### 🧩 模块化设计
141
+
142
+ 灵活的插件系统,易于扩展和集成,支持热插拔模块管理
143
+
144
+ </td>
145
+ <td width="50%" align="center" valign="top">
146
+ <br/>
147
+
148
+ ### 🔄 热重载支持
149
+
150
+ 开发时无需重启即可重新加载代码,大幅提升开发迭代效率
151
+
152
+ </td>
153
+ </tr>
154
+ </table>
155
+
156
+ ---
157
+
158
+ ### 快速开始
159
+
160
+ #### 一键安装脚本(推荐)
161
+
162
+ 安装脚本会自动检测您的环境(Docker、Python、uv),引导选择最适合的安装方式,支持多语言(中文/English/日本語/Русский/繁體中文)。
163
+
164
+ Windows (PowerShell):
165
+ ```powershell
166
+ irm https://get.erisdev.com/install.ps1 -OutFile install.ps1; powershell -ExecutionPolicy Bypass -File install.ps1
167
+ ```
168
+
169
+ macOS / Linux:
170
+ ```bash
171
+ curl -fsSL https://get.erisdev.com/install.sh -o install.sh && chmod +x install.sh && ./install.sh
172
+ ```
173
+
174
+ <table>
175
+ <tr>
176
+ <td align="center" width="50%">
177
+
178
+ **Docker 安装演示**
179
+
180
+ <video src="https://github.com/user-attachments/assets/a367a466-4678-46a9-b101-073a86388ede" controls width="100%"></video>
181
+
182
+ </td>
183
+ <td align="center" width="50%">
184
+
185
+ **pip 安装演示**
186
+
187
+ <video src="https://github.com/user-attachments/assets/a2df4009-dba6-411e-b79d-4454a168d063" controls width="100%"></video>
188
+
189
+ </td>
190
+ </tr>
191
+ </table>
192
+
193
+ #### 使用 Docker (推荐)
194
+
195
+ ```bash
196
+ docker pull erispulse/erispulse:latest
197
+ ```
198
+
199
+ <details>
200
+ <summary>Docker Hub不可用?</summary>
201
+
202
+ 如果 Docker Hub 无法访问,可以使用 GitHub Container Registry:
203
+
204
+ ```bash
205
+ docker pull ghcr.io/erispulse/erispulse:latest
206
+ ```
207
+
208
+ 使用 ghcr.io 镜像时,需要修改 `docker-compose.yml` 中的 image:
209
+ ```yaml
210
+ image: ghcr.io/erispulse/erispulse:latest
211
+ ```
212
+
213
+ </details>
214
+
215
+ <details>
216
+ <summary>快速启动</summary>
217
+
218
+ ```bash
219
+ # 下载 docker-compose.yml
220
+ curl -O https://raw.githubusercontent.com/ErisPulse/ErisPulse/main/docker-compose.yml
221
+
222
+ # 设置 Dashboard 登录令牌并启动
223
+ ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d
224
+ ```
225
+
226
+ > 镜像内置 ErisPulse 框架和 Dashboard 管理面板,支持 `linux/amd64` 和 `linux/arm64` 架构。
227
+
228
+ 启动后访问 `http://<host>:<port>/Dashboard`,使用设置的令牌作为密码登录 Dashboard 管理面板。
229
+
230
+ </details>
231
+
232
+ <details>
233
+ <summary>使用预发布版本 (Dev)</summary>
234
+
235
+ 设置 `ERISPULSE_CHANNEL=dev` 即可使用预发布版本:
236
+
237
+ ```bash
238
+ # 方式一:使用环境变量(推荐)
239
+ ERISPULSE_CHANNEL=dev ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d
240
+
241
+ # 方式二:构建 dev 镜像
242
+ ERISPULSE_BUILD_TARGET=dev docker compose up -d --build
243
+ ```
244
+
245
+ 如需启动时自动更新到最新版本(无论 stable 还是 dev),显式设置 `ERISPULSE_UPDATE_ON_START=true`:
246
+
247
+ ```bash
248
+ ERISPULSE_CHANNEL=dev ERISPULSE_UPDATE_ON_START=true docker compose up -d
249
+ ```
250
+
251
+ 也可以拉取预构建的 dev 镜像:
252
+
253
+ ```bash
254
+ docker pull erispulse/erispulse:dev
255
+ ```
256
+
257
+ </details>
258
+
259
+ <details>
260
+ <summary>Docker 环境变量</summary>
261
+
262
+ | 变量 | 默认值 | 说明 |
263
+ |------|--------|------|
264
+ | `ERISPULSE_CHANNEL` | `stable` | 版本通道:`stable`(稳定版)或 `dev`(预发布版) |
265
+ | `ERISPULSE_UPDATE_ON_START` | `false` | 容器启动时是否自动更新到最新版本(需显式启用) |
266
+ | `ERISPULSE_DASHBOARD_TOKEN` | 空 | Dashboard 登录令牌 |
267
+ | `ERISPULSE_PORT` | `8000` | Dashboard 端口映射 |
268
+ | `TZ` | `Asia/Shanghai` | 容器时区 |
269
+
270
+ > 启用 `ERISPULSE_UPDATE_ON_START=true` 可确保即使镜像较旧,容器也能在启动时自动获取最新版本。
271
+
272
+ </details>
273
+
274
+ #### 1Panel 应用商店
275
+
276
+ 通过 [1Panel](https://1panel.cn) 应用商店一键安装 ErisPulse,详见 [ErisPulse-1Panel](https://github.com/ErisPulse/ErisPulse-1Panel)。
277
+
278
+ ```bash
279
+ bash <(curl -sL https://get-1panel.erisdev.com/install.sh)
280
+ ```
281
+
282
+ #### 使用 pip 安装
283
+
284
+ ```bash
285
+ pip install ErisPulse
286
+ ```
287
+
288
+ > 也可以使用上方的一键安装脚本,自动检测环境并引导配置。
289
+
290
+ #### 运行效果
291
+
292
+
293
+ ##### 仪表盘:
294
+
295
+ [![在线演示](https://img.shields.io/badge/在线演示-Dashboard-FF6B9D?style=for-the-badge&logo=github&logoColor=white)](https://dashdemo.erisdev.com/)
296
+
297
+ > 💡 在线体验演示仪表盘:[DashDemo](https://dashdemo.erisdev.com/)
298
+
299
+ <table>
300
+ <tr>
301
+ <td width="50%">
302
+
303
+ <img src=".github/assets/docs/dashboard.png" alt="Dashboard 演示" />
304
+
305
+ </td>
306
+ <td width="50%">
307
+
308
+ <video src="https://github.com/user-attachments/assets/157191c4-9a84-433c-b311-0c57e3a21151" controls width="100%"></video>
309
+
310
+ </td>
311
+ </tr>
312
+ </table>
313
+
314
+
315
+ ##### 同一端代码,多个平台响应:
316
+
317
+ <table>
318
+ <tr>
319
+ <td align="center" width="33%">
320
+
321
+ **Kook**
322
+
323
+ <img src=".github/assets/demo-kook.png" alt="Kook 演示" />
324
+
325
+ </td>
326
+ <td align="center" width="33%">
327
+
328
+ **QQ**
329
+
330
+ <img src=".github/assets/demo-qq.png" alt="QQ 演示" />
331
+
332
+ </td>
333
+ <td align="center" width="33%">
334
+
335
+ **云湖**
336
+
337
+ <img src=".github/assets/demo-yunhu.png" alt="云湖 演示" />
338
+
339
+ </td>
340
+ </tr>
341
+ </table>
342
+
343
+ #### 初始化项目
344
+
345
+ ```bash
346
+ # 交互式初始化
347
+ epsdk init
348
+
349
+ # 快速初始化(指定项目名称)
350
+ epsdk init -q -n my_bot
351
+ ```
352
+
353
+ #### 创建第一个机器人
354
+
355
+ 创建 `main.py` 文件:
356
+
357
+ <table>
358
+ <tr>
359
+ <td width="50%" valign="top">
360
+
361
+ **命令处理器**
362
+
363
+ ```python
364
+ from ErisPulse import sdk
365
+ from ErisPulse.Core.Event import command
366
+
367
+ @command("hello", help="发送问候消息")
368
+ async def hello_handler(event):
369
+ user_name = event.get_user_nickname() or "朋友"
370
+ await event.reply(f"你好,{user_name}!")
371
+
372
+ @command("ping", help="测试机器人是否在线")
373
+ async def ping_handler(event):
374
+ await event.reply("Pong!机器人运行正常。")
375
+
376
+ if __name__ == "__main__":
377
+ import asyncio
378
+ asyncio.run(sdk.run(keep_running=True))
379
+ ```
380
+
381
+ </td>
382
+ <td width="50%" valign="top">
383
+
384
+ **效果说明**
385
+
386
+ 发送 `/hello`
387
+
388
+ 机器人回复:`你好,{用户名}!`
389
+
390
+ ---
391
+
392
+ 发送 `/ping`
393
+
394
+ 机器人回复:`Pong!机器人运行正常。`
395
+
396
+ ---
397
+
398
+ **运行方式**
399
+
400
+ ```bash
401
+ epsdk run main.py
402
+ # 或开发模式
403
+ epsdk run main.py --reload
404
+ ```
405
+
406
+ </td>
407
+ </tr>
408
+ </table>
409
+
410
+ 更多详细说明请参阅:
411
+ - [快速开始指南](docs/zh-CN/quick-start.md)
412
+ - [入门指南](docs/zh-CN/getting-started/)
413
+
414
+ #### 多轮对话示例
415
+
416
+ ErisPulse 内置了强大的多轮对话引擎,轻松实现引导式操作、信息收集等交互场景:
417
+
418
+ ```python
419
+ from ErisPulse.Core.Event import command, request
420
+
421
+ @command("register")
422
+ async def register_handler(event):
423
+ conv = event.conversation(timeout=60)
424
+
425
+ await conv.say("欢迎注册!")
426
+
427
+ # 多步骤收集用户信息,自动验证
428
+ data = await conv.collect([
429
+ {"key": "name", "prompt": "请输入姓名"},
430
+ {"key": "age", "prompt": "请输入年龄",
431
+ "validator": lambda e: e.get_text().strip().isdigit(),
432
+ "retry_prompt": "年龄必须是数字,请重新输入"},
433
+ ])
434
+
435
+ if data and await conv.confirm(f"确认注册?姓名: {data['name']}, 年龄: {data['age']}"):
436
+ # 通过 SendDSL 主动推送通知
437
+ await sdk.adapter.get(event.get_platform()).Send.To(
438
+ "user", event.get_user_id()
439
+ ).Text(f"注册成功!欢迎 {data['name']}")
440
+ # 或 await event.reply("注册成功!")
441
+
442
+ # 自动处理好友请求
443
+ @request.on_friend_request()
444
+ async def handle_friend_request(event):
445
+ user_name = event.get_user_nickname() or event.get_user_id()
446
+
447
+ # 同意请求
448
+ result = await event.approve()
449
+ if result.get("status") == "ok":
450
+ await event.reply(f"已自动通过好友请求,欢迎 {user_name}")
451
+ ```
452
+
453
+ <details>
454
+ <summary>查看更多 Conversation API(分支跳转 / 选择 / 持久化)</summary>
455
+
456
+ ```python
457
+ @command("quiz")
458
+ async def quiz_handler(event):
459
+ conv = event.conversation(timeout=30)
460
+
461
+ # 选项式问答
462
+ answer = await conv.choose("Python 的创造者是谁?", [
463
+ "Guido van Rossum",
464
+ "James Gosling",
465
+ "Dennis Ritchie",
466
+ ])
467
+
468
+ if answer == 0:
469
+ await conv.say("正确!")
470
+ elif answer is None:
471
+ await conv.say("超时了,下次再来吧!")
472
+ else:
473
+ await conv.say("错误了,正确答案是 Guido van Rossum")
474
+
475
+ @command("menu")
476
+ async def menu_handler(event):
477
+ conv = event.conversation(timeout=60)
478
+
479
+ # 分支跳转,构建复杂交互流程
480
+ @conv.branch("main")
481
+ async def main_menu():
482
+ await conv.say("=== 主菜单 ===\n1. 个人信息\n2. 设置\n3. 退出")
483
+ resp = await conv.wait()
484
+ if resp and resp.get_text().strip() == "1":
485
+ await conv.goto("profile")
486
+
487
+ @conv.branch("profile")
488
+ async def profile():
489
+ await conv.say("姓名: Alice\n0. 返回")
490
+ resp = await conv.wait()
491
+ if resp and resp.get_text().strip() == "0":
492
+ await conv.goto("main")
493
+
494
+ await conv.start()
495
+ ```
496
+
497
+ 详见 [Conversation 多轮对话](docs/zh-CN/advanced/conversation.md)
498
+
499
+ </details>
500
+
501
+ ---
502
+
503
+ ### 支持的适配器
504
+
505
+ 欢迎您贡献适配器!
506
+
507
+ | 适配器 | 说明 |
508
+ |--------|------|
509
+ | <img src=".github/assets/adapter_logo/kook.svg" height="20" alt="Kook" /> [Kook](https://github.com/shanfishapp/ErisPulse-KookAdapter) | Kook(开黑啦)即时通讯平台 |
510
+ | <img src=".github/assets/adapter_logo/matrix.svg" height="20" alt="Matrix" /> [Matrix](https://github.com/ErisPulse/ErisPulse-MatrixAdapter) | Matrix 去中心化通讯协议 |
511
+ | <img src=".github/assets/adapter_logo/onebot.png" height="20" alt="OneBot" /> [OneBot11](https://github.com/ErisPulse/ErisPulse-OneBot11Adapter) | OneBot v11 通用机器人协议 |
512
+ | <img src=".github/assets/adapter_logo/onebot.png" height="20" alt="OneBot" /> [OneBot12](https://github.com/ErisPulse/ErisPulse-OneBot12Adapter) | OneBot v12 标准协议 |
513
+ | <img src=".github/assets/adapter_logo/qqbot.svg" height="20" alt="QQ" /> [QQ](https://github.com/ErisPulse/ErisPulse-QQBotAdapter) | QQ 官方机器人平台 |
514
+ | <img src=".github/assets/adapter_logo/sandbox.png" height="20" alt="Sandbox" /> [沙箱](https://github.com/ErisPulse/ErisPulse-SandboxAdapter) | 网页端调试,无需接入真实平台 |
515
+ | <img src=".github/assets/adapter_logo/telegram.svg" height="20" alt="Telegram" /> [Telegram](https://github.com/ErisPulse/ErisPulse-TelegramAdapter) | 全球性即时通讯平台 |
516
+ | <img src=".github/assets/adapter_logo/email.svg" height="20" alt="Email" /> [邮件](https://github.com/ErisPulse/ErisPulse-EmailAdapter) | 邮件协议收发适配器 |
517
+ | <img src=".github/assets/adapter_logo/yunhu.png" height="20" alt="Yunhu" /> [云湖](https://github.com/ErisPulse/ErisPulse-YunhuAdapter) | 企业级即时通讯平台(机器人接入) |
518
+ | [云湖用户](https://github.com/wsu2059q/ErisPulse-YunhuUserAdapter) | 基于云湖用户协议的接入适配器 |
519
+ | [花枫咖啡馆](https://github.com/ErisPulse/ErisPulse-Ideaura/) | Allons! \(・ω・) / |
520
+
521
+ 查看 [适配器详情介绍](docs/zh-CN/platform-guide/README.md)
522
+
523
+ ---
524
+
525
+ ### 应用场景
526
+
527
+ <div align="center">
528
+
529
+ | 多平台机器人 | 聊天助手 | 自动化工具 | 消息转发 |
530
+ |:---:|:---:|:---:|:---:|
531
+ | 在多个平台部署<br>相同功能的机器人 | 接入 AI 聊天模块<br>实现娱乐和交互 | 消息通知、任务管理<br>数据收集 | 跨平台消息<br>同步和转发 |
532
+
533
+ </div>
534
+
535
+ ---
536
+
537
+ ### 贡献指南
538
+
539
+ ErisPulse 项目的健全性还需要您的一份力!我们欢迎各种形式的贡献:
540
+
541
+ 1. **报告问题** — 在 [GitHub Issues](https://github.com/ErisPulse/ErisPulse/issues) 提交 bug 报告
542
+ 2. **功能请求** — 通过 [社区讨论](https://github.com/ErisPulse/ErisPulse/discussions) 提出新想法
543
+ 3. **代码贡献** — 提交 PR 前请阅读 [代码风格](docs/zh-CN/styleguide/) 及 [贡献指南](CONTRIBUTING.md)
544
+ 4. **文档改进** — 帮助完善文档和示例代码
545
+
546
+ [加入社区讨论](https://github.com/ErisPulse/ErisPulse/discussions)
547
+
548
+ ---
549
+
550
+ ## Star History
551
+
552
+ [![Star History Chart](https://api.star-history.com/svg?repos=ErisPulse/ErisPulse&type=Date)](https://star-history.com/#ErisPulse/ErisPulse&Date)
553
+
554
+ ---
555
+
556
+ <div align="center">
557
+
558
+ ### 致谢
559
+
560
+ <img src=".github/assets/thanks.png" width="200" alt="感谢" />
561
+
562
+ 本项目部分代码基于 [sdkFrame](https://github.com/runoneall/sdkFrame) · 核心适配器标准化层基于 [OneBot12 规范](https://12.onebot.dev/) · 感谢所有为开源社区做出贡献的开发者和作者
563
+
564
+ </div>