langbot-plugin 0.3.5__tar.gz → 0.3.7__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 (170) hide show
  1. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/PKG-INFO +1 -1
  2. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/pyproject.toml +1 -1
  3. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/command/command.py +4 -2
  4. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/knowledge_engine/engine.py +11 -12
  5. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/manifest.py +25 -5
  6. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/tool/tool.py +3 -1
  7. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/command/context.py +5 -4
  8. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/command/errors.py +2 -2
  9. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/platform/entities.py +0 -1
  10. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/platform/events.py +55 -0
  11. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/platform/message.py +7 -3
  12. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/provider/message.py +9 -5
  13. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/rag/models.py +0 -1
  14. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/events.py +12 -8
  15. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/proxies/langbot_api.py +60 -2
  16. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/commands/{cmd_name}.yaml.example +6 -0
  17. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/event_listener/default.yaml.example +3 -0
  18. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/knowledge_engine/{knowledge_engine_name}.yaml.example +12 -0
  19. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/parser/{parser_name}.yaml.example +6 -0
  20. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/tools/{tool_name}.yaml.example +6 -0
  21. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/manifest.yaml.example +6 -0
  22. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/__init__.py +13 -4
  23. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/commands/initplugin.py +9 -0
  24. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/commands/login.py +3 -3
  25. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/commands/publish.py +1 -1
  26. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/commands/runplugin.py +9 -4
  27. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/gen/renderer.py +39 -1
  28. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/i18n.py +15 -3
  29. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/locales/__init__.py +4 -1
  30. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/locales/en_US.py +0 -1
  31. langbot_plugin-0.3.7/src/langbot_plugin/cli/locales/es_ES.py +76 -0
  32. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/locales/ja_JP.py +0 -1
  33. langbot_plugin-0.3.7/src/langbot_plugin/cli/locales/th_TH.py +76 -0
  34. langbot_plugin-0.3.7/src/langbot_plugin/cli/locales/vi_VN.py +76 -0
  35. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/locales/zh_Hans.py +0 -1
  36. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/locales/zh_Hant.py +0 -1
  37. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/run/controller.py +27 -10
  38. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/run/handler.py +63 -20
  39. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/run/hotreload.py +5 -7
  40. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/entities/io/actions/enums.py +2 -0
  41. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/app.py +0 -1
  42. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/context.py +1 -1
  43. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/helper/marketplace.py +45 -0
  44. langbot_plugin-0.3.7/src/langbot_plugin/runtime/helper/pkgmgr.py +129 -0
  45. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/connections/stdio.py +24 -14
  46. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/connections/ws.py +5 -5
  47. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/handler.py +23 -13
  48. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/handlers/control.py +34 -19
  49. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/handlers/plugin.py +40 -6
  50. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/plugin/container.py +0 -1
  51. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/plugin/mgr.py +208 -68
  52. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/settings.py +1 -3
  53. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/utils/discover/engine.py +4 -2
  54. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/utils/log.py +1 -3
  55. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/utils/platform.py +0 -1
  56. langbot_plugin-0.3.7/src/langbot_plugin/version.py +1 -0
  57. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/tests/api/entities/test_events.py +4 -1
  58. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/tests/test_log.py +4 -1
  59. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/tests/test_message.py +14 -12
  60. langbot_plugin-0.3.5/src/langbot_plugin/runtime/helper/pkgmgr.py +0 -38
  61. langbot_plugin-0.3.5/src/langbot_plugin/version.py +0 -1
  62. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/.github/workflows/publish-pypi.yaml +0 -0
  63. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/.gitignore +0 -0
  64. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/.python-version +0 -0
  65. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/AGENTS.md +0 -0
  66. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/CLAUDE.md +0 -0
  67. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/LICENSE +0 -0
  68. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/README.md +0 -0
  69. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/data/.env.example +0 -0
  70. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/docs/Message.md +0 -0
  71. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/docs/communication/apis/lb2rt.md +0 -0
  72. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/docs/communication/runtime_plugin.md +0 -0
  73. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/docs/dependency-management.md +0 -0
  74. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/docs/langbot-plugin-social.png +0 -0
  75. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/__init__.py +0 -0
  76. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/__init__.py +0 -0
  77. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/__init__.py +0 -0
  78. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/abstract/__init__.py +0 -0
  79. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/abstract/platform/__init__.py +0 -0
  80. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/abstract/platform/adapter.py +0 -0
  81. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/abstract/platform/event_logger.py +0 -0
  82. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/__init__.py +0 -0
  83. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/base.py +0 -0
  84. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/command/__init__.py +0 -0
  85. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/common/__init__.py +0 -0
  86. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/common/event_listener.py +0 -0
  87. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/knowledge_engine/__init__.py +0 -0
  88. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/parser/__init__.py +0 -0
  89. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/parser/parser.py +0 -0
  90. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/components/tool/__init__.py +0 -0
  91. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/definition/plugin.py +0 -0
  92. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/__init__.py +0 -0
  93. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/__init__.py +0 -0
  94. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/command/__init__.py +0 -0
  95. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/pipeline/__init__.py +0 -0
  96. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/pipeline/query.py +0 -0
  97. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/platform/__init__.py +0 -0
  98. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/platform/logger.py +0 -0
  99. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/provider/__init__.py +0 -0
  100. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/provider/prompt.py +0 -0
  101. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/provider/session.py +0 -0
  102. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/rag/__init__.py +0 -0
  103. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/rag/context.py +0 -0
  104. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/rag/enums.py +0 -0
  105. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/rag/errors.py +0 -0
  106. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/resource/__init__.py +0 -0
  107. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/builtin/resource/tool.py +0 -0
  108. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/entities/context.py +0 -0
  109. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/proxies/__init__.py +0 -0
  110. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/proxies/base.py +0 -0
  111. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/proxies/event_context.py +0 -0
  112. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/proxies/execute_context.py +0 -0
  113. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/api/proxies/query_based_api.py +0 -0
  114. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/__init__.py +0 -0
  115. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/.env.example.example +0 -0
  116. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/.gitignore.example +0 -0
  117. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/.vscode/launch.json.example +0 -0
  118. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/README.md.example +0 -0
  119. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/__init__.py +0 -0
  120. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/assets/icon.svg.example +0 -0
  121. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/__init__.py +0 -0
  122. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/commands/__init__.py +0 -0
  123. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/commands/{cmd_name}.py.example +0 -0
  124. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/event_listener/__init__.py +0 -0
  125. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/event_listener/default.py.example +0 -0
  126. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/knowledge_engine/__init__.py +0 -0
  127. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/knowledge_engine/{knowledge_engine_name}.py.example +0 -0
  128. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/parser/__init__.py +0 -0
  129. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/parser/{parser_name}.py.example +0 -0
  130. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/tools/__init__.py +0 -0
  131. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/components/tools/{tool_name}.py.example +0 -0
  132. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/main.py.example +0 -0
  133. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/assets/templates/requirements.txt.example +0 -0
  134. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/__main__.py +0 -0
  135. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/commands/__init__.py +0 -0
  136. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/commands/buildplugin.py +0 -0
  137. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/commands/gencomponent.py +0 -0
  138. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/commands/logout.py +0 -0
  139. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/gen/__init__.py +0 -0
  140. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/run/__init__.py +0 -0
  141. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/utils/__init__.py +0 -0
  142. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/utils/cloudsv.py +0 -0
  143. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/cli/utils/form.py +0 -0
  144. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/entities/__init__.py +0 -0
  145. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/entities/io/__init__.py +0 -0
  146. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/entities/io/actions/__init__.py +0 -0
  147. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/entities/io/errors.py +0 -0
  148. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/entities/io/req.py +0 -0
  149. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/entities/io/resp.py +0 -0
  150. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/entities/marketplace.py +0 -0
  151. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/LICENSE +0 -0
  152. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/README.md +0 -0
  153. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/__init__.py +0 -0
  154. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/helper/__init__.py +0 -0
  155. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/__init__.py +0 -0
  156. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/connection.py +0 -0
  157. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/connections/__init__.py +0 -0
  158. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/controller.py +0 -0
  159. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/controllers/__init__.py +0 -0
  160. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/controllers/stdio/__init__.py +0 -0
  161. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/controllers/stdio/client.py +0 -0
  162. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/controllers/stdio/server.py +0 -0
  163. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/controllers/ws/__init__.py +0 -0
  164. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/controllers/ws/client.py +0 -0
  165. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/controllers/ws/server.py +0 -0
  166. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/io/handlers/__init__.py +0 -0
  167. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/runtime/plugin/__init__.py +0 -0
  168. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/utils/__init__.py +0 -0
  169. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/utils/discover/__init__.py +0 -0
  170. {langbot_plugin-0.3.5 → langbot_plugin-0.3.7}/src/langbot_plugin/utils/importutil.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langbot-plugin
3
- Version: 0.3.5
3
+ Version: 0.3.7
4
4
  Summary: This package contains the SDK, CLI for building plugins for LangBot, plus the runtime for hosting LangBot plugins
5
5
  Project-URL: Homepage, https://langbot.app
6
6
  Project-URL: Repository, https://github.com/langbot-app/langbot-plugin-sdk
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langbot-plugin"
3
- version = "0.3.5"
3
+ version = "0.3.7"
4
4
  description = "This package contains the SDK, CLI for building plugins for LangBot, plus the runtime for hosting LangBot plugins"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -83,8 +83,10 @@ class Command(BaseComponent):
83
83
  if next_crt_command not in self.registered_subcommands:
84
84
  # find if there is a subcommand with '*' name
85
85
  for subcommand in self.registered_subcommands:
86
- if subcommand == '*':
87
- async for return_value in self.registered_subcommands[subcommand].subcommand(self, context):
86
+ if subcommand == "*":
87
+ async for return_value in self.registered_subcommands[
88
+ subcommand
89
+ ].subcommand(self, context):
88
90
  yield return_value
89
91
  return
90
92
 
@@ -70,7 +70,7 @@ class KnowledgeEngine(BaseComponent):
70
70
 
71
71
  async def on_knowledge_base_create(self, kb_id: str, config: dict) -> None:
72
72
  """Called when a knowledge base using this engine is created.
73
-
73
+
74
74
  Args:
75
75
  kb_id: The knowledge base identifier.
76
76
  config: Creation settings provided by the user.
@@ -79,7 +79,7 @@ class KnowledgeEngine(BaseComponent):
79
79
 
80
80
  async def on_knowledge_base_delete(self, kb_id: str) -> None:
81
81
  """Called when a knowledge base using this engine is deleted.
82
-
82
+
83
83
  Args:
84
84
  kb_id: The knowledge base identifier.
85
85
  """
@@ -90,16 +90,16 @@ class KnowledgeEngine(BaseComponent):
90
90
  @abc.abstractmethod
91
91
  async def ingest(self, context: IngestionContext) -> IngestionResult:
92
92
  """Ingest a document into the knowledge base.
93
-
93
+
94
94
  This method should:
95
95
  1. Read the file using `await self.plugin.get_knowledge_file_stream(context.file_object.storage_path)`
96
96
  2. Parse and chunk the content
97
97
  3. Embed using `await self.plugin.invoke_embedding(embedding_model_uuid, [chunk.text for chunk in chunks])`
98
98
  4. Store using `await self.plugin.vector_upsert(collection_id=context.get_collection_id(), ...)`
99
-
99
+
100
100
  Args:
101
101
  context: Ingestion context containing file info and settings.
102
-
102
+
103
103
  Returns:
104
104
  Ingestion result with status and metadata.
105
105
  """
@@ -108,13 +108,13 @@ class KnowledgeEngine(BaseComponent):
108
108
  @abc.abstractmethod
109
109
  async def delete_document(self, kb_id: str, document_id: str) -> bool:
110
110
  """Delete a document and its associated data from the knowledge base.
111
-
111
+
112
112
  Use `await self.plugin.vector_delete(...)` to clean up vectors.
113
-
113
+
114
114
  Args:
115
115
  kb_id: Knowledge base identifier.
116
116
  document_id: Document identifier to delete.
117
-
117
+
118
118
  Returns:
119
119
  True if deletion was successful.
120
120
  """
@@ -123,17 +123,16 @@ class KnowledgeEngine(BaseComponent):
123
123
  @abc.abstractmethod
124
124
  async def retrieve(self, context: RetrievalContext) -> RetrievalResponse:
125
125
  """Retrieve relevant content from the knowledge base.
126
-
126
+
127
127
  This method should:
128
128
  1. Embed query using `await self.plugin.invoke_embedding(embedding_model_uuid, [query])`
129
129
  2. Search using `await self.plugin.vector_search(kb_id, ...)`
130
130
  3. Return structured response
131
-
131
+
132
132
  Args:
133
133
  context: Retrieval context with query and settings.
134
-
134
+
135
135
  Returns:
136
136
  Structured retrieval response.
137
137
  """
138
138
  pass
139
-
@@ -8,26 +8,46 @@ import sys
8
8
 
9
9
 
10
10
  class I18nString(pydantic.BaseModel):
11
- """国际化字符串"""
11
+ """Internationalized string"""
12
12
 
13
13
  en_US: str
14
- """英文"""
14
+ """English"""
15
15
 
16
16
  zh_Hans: typing.Optional[str] = None
17
- """中文"""
17
+ """Simplified Chinese"""
18
+
19
+ zh_Hant: typing.Optional[str] = None
20
+ """Traditional Chinese"""
18
21
 
19
22
  ja_JP: typing.Optional[str] = None
20
- """日文"""
23
+ """Japanese"""
24
+
25
+ th_TH: typing.Optional[str] = None
26
+ """Thai"""
27
+
28
+ vi_VN: typing.Optional[str] = None
29
+ """Vietnamese"""
30
+
31
+ es_ES: typing.Optional[str] = None
32
+ """Spanish"""
21
33
 
22
34
  def to_dict(self) -> dict:
23
- """转换为字典"""
35
+ """Convert to dictionary"""
24
36
  dic = {}
25
37
  if self.en_US is not None:
26
38
  dic["en_US"] = self.en_US
27
39
  if self.zh_Hans is not None:
28
40
  dic["zh_Hans"] = self.zh_Hans
41
+ if self.zh_Hant is not None:
42
+ dic["zh_Hant"] = self.zh_Hant
29
43
  if self.ja_JP is not None:
30
44
  dic["ja_JP"] = self.ja_JP
45
+ if self.th_TH is not None:
46
+ dic["th_TH"] = self.th_TH
47
+ if self.vi_VN is not None:
48
+ dic["vi_VN"] = self.vi_VN
49
+ if self.es_ES is not None:
50
+ dic["es_ES"] = self.es_ES
31
51
  return dic
32
52
 
33
53
 
@@ -13,6 +13,8 @@ class Tool(BaseComponent):
13
13
  __kind__ = "Tool"
14
14
 
15
15
  @abc.abstractmethod
16
- async def call(self, params: dict[str, Any], session: provider_session.Session, query_id: int) -> str:
16
+ async def call(
17
+ self, params: dict[str, Any], session: provider_session.Session, query_id: int
18
+ ) -> str:
17
19
  """Call the tool."""
18
20
  pass
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from typing import Any, Optional
4
- import typing
5
4
 
6
5
  import pydantic
7
6
 
@@ -39,14 +38,16 @@ class CommandReturn(pydantic.BaseModel):
39
38
  """
40
39
 
41
40
  @classmethod
42
- @pydantic.field_validator('error', mode='before')
43
- def _validate_error(cls, v: Optional[errors.CommandError]) -> Optional[errors.CommandError]:
41
+ @pydantic.field_validator("error", mode="before")
42
+ def _validate_error(
43
+ cls, v: Optional[errors.CommandError]
44
+ ) -> Optional[errors.CommandError]:
44
45
  if v is not None:
45
46
  return errors.CommandError(message=v.message)
46
47
  return v
47
48
 
48
49
  @classmethod
49
- @pydantic.field_serializer('error')
50
+ @pydantic.field_serializer("error")
50
51
  def _serialize_error(cls, v: Optional[errors.CommandError]) -> Optional[str]:
51
52
  if v is not None:
52
53
  return v.message
@@ -1,11 +1,11 @@
1
1
  import pydantic
2
2
 
3
- class CommandError(pydantic.BaseModel):
4
3
 
4
+ class CommandError(pydantic.BaseModel):
5
5
  message: str
6
6
 
7
7
  def __init__(self, message: str):
8
-
8
+
9
9
  super().__init__(message=message)
10
10
 
11
11
  def __str__(self):
@@ -1,5 +1,4 @@
1
1
  import abc
2
- from datetime import datetime
3
2
  from enum import Enum
4
3
  import typing
5
4
 
@@ -126,3 +126,58 @@ class GroupMessage(MessageEvent):
126
126
  "message_chain": self.message_chain.model_dump(),
127
127
  "time": self.time,
128
128
  }
129
+
130
+
131
+ ###############################
132
+ # Feedback Event
133
+ class FeedbackEvent(Event):
134
+ """User feedback event (like/dislike).
135
+
136
+ Fired when a user gives feedback (thumbs up / thumbs down) on an AI Bot
137
+ response. Currently only supported by the WeChat Work (WeCom) AI Bot
138
+ adapter, but designed to be platform-agnostic so other adapters can adopt
139
+ it in the future.
140
+
141
+ Args:
142
+ feedback_id: Unique feedback identifier assigned by the platform.
143
+ feedback_type: ``1`` = like (thumbs up), ``2`` = dislike (thumbs down).
144
+ feedback_content: Optional free-form text the user attached.
145
+ inaccurate_reasons: Optional list of predefined "inaccurate" reason
146
+ tags selected by the user (for dislikes).
147
+ user_id: ID of the user who gave feedback.
148
+ session_id: Session / conversation ID (e.g. ``"person_xxx"`` or
149
+ ``"group_xxx"``).
150
+ message_id: ID of the message being rated.
151
+ stream_id: Stream ID (for streaming responses).
152
+ source_platform_object: Raw platform-specific object, kept for
153
+ adapter-level introspection.
154
+ """
155
+
156
+ type: str = "FeedbackEvent"
157
+
158
+ feedback_id: str
159
+ """Unique feedback identifier from the platform."""
160
+
161
+ feedback_type: int
162
+ """1 = like, 2 = dislike."""
163
+
164
+ feedback_content: typing.Optional[str] = None
165
+ """Free-form user feedback text."""
166
+
167
+ inaccurate_reasons: typing.Optional[typing.List[str]] = None
168
+ """Predefined inaccuracy reasons (for dislikes)."""
169
+
170
+ user_id: typing.Optional[str] = None
171
+ """ID of the user who submitted the feedback."""
172
+
173
+ session_id: typing.Optional[str] = None
174
+ """Session / conversation ID."""
175
+
176
+ message_id: typing.Optional[str] = None
177
+ """ID of the original message being rated."""
178
+
179
+ stream_id: typing.Optional[str] = None
180
+ """Stream message ID (for streaming responses)."""
181
+
182
+ source_platform_object: typing.Optional[typing.Any] = None
183
+ """Raw platform event object."""
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import base64
4
4
  import httpx
5
- import logging
6
5
  import typing
7
6
  import aiofiles
8
7
  from datetime import datetime
@@ -188,10 +187,15 @@ class MessageChain(pydantic.RootModel[list[pydantic.SerializeAsAny[MessageCompon
188
187
  # message_chain inside each ForwardMessageNode
189
188
  if component_type == "Forward" and "node_list" in item:
190
189
  for node_data in item["node_list"]:
191
- if isinstance(node_data, dict) and "message_chain" in node_data:
190
+ if (
191
+ isinstance(node_data, dict)
192
+ and "message_chain" in node_data
193
+ ):
192
194
  mc = node_data["message_chain"]
193
195
  if isinstance(mc, list):
194
- node_data["message_chain"] = MessageChain.model_validate(mc)
196
+ node_data["message_chain"] = (
197
+ MessageChain.model_validate(mc)
198
+ )
195
199
 
196
200
  # Special processing of the time field of the Source class
197
201
  if component_type == "Source" and "time" in item:
@@ -26,6 +26,7 @@ class ImageURLContentObject(pydantic.BaseModel):
26
26
  def __str__(self):
27
27
  return self.url[:128] + ("..." if len(self.url) > 128 else "")
28
28
 
29
+
29
30
  class ContentElement(pydantic.BaseModel):
30
31
  type: str
31
32
  """Type of the content"""
@@ -48,7 +49,7 @@ class ContentElement(pydantic.BaseModel):
48
49
  elif self.type == "image_url":
49
50
  return f"[Image]({self.image_url})"
50
51
  elif self.type == "image_base64":
51
- return f"[Image](base64)"
52
+ return "[Image](base64)"
52
53
  elif self.type == "file_url":
53
54
  return f"[File]({self.file_url})"
54
55
  elif self.type == "file_base64":
@@ -125,9 +126,11 @@ class Message(pydantic.BaseModel):
125
126
  if ce.type == "text":
126
127
  if ce.text is not None:
127
128
  mc.append(platform_message.Plain(text=ce.text))
128
- elif ce.type == 'file_url':
129
+ elif ce.type == "file_url":
129
130
  if ce.file_url is not None:
130
- mc.append(platform_message.File(url=ce.file_url, name=ce.file_name))
131
+ mc.append(
132
+ platform_message.File(url=ce.file_url, name=ce.file_name)
133
+ )
131
134
  elif ce.type == "image_url":
132
135
  assert ce.image_url is not None
133
136
  if ce.image_url.url.startswith("http"):
@@ -216,7 +219,9 @@ class MessageChunk(pydantic.BaseModel):
216
219
  mc.append(platform_message.Plain(text=ce.text))
217
220
  elif ce.type == "file_url":
218
221
  if ce.file_url is not None:
219
- mc.append(platform_message.File(url=ce.file_url, name=ce.file_name))
222
+ mc.append(
223
+ platform_message.File(url=ce.file_url, name=ce.file_name)
224
+ )
220
225
  elif ce.type == "image_url":
221
226
  if ce.image_url.url.startswith("http"):
222
227
  mc.append(platform_message.Image(url=ce.image_url.url))
@@ -231,7 +236,6 @@ class MessageChunk(pydantic.BaseModel):
231
236
  if ce.image_base64 is not None:
232
237
  mc.append(platform_message.Image(base64=ce.image_base64))
233
238
 
234
-
235
239
  # 找第一个文字组件
236
240
  if prefix_text:
237
241
  for i, c in enumerate(mc):
@@ -151,4 +151,3 @@ class IngestionResult(pydantic.BaseModel):
151
151
 
152
152
  metadata: dict[str, Any] = Field(default_factory=dict)
153
153
  """Additional result metadata."""
154
-
@@ -102,8 +102,8 @@ class GroupMessageReceived(BaseEventModel):
102
102
  class _WithReplyMessageChain(BaseEventModel):
103
103
  """事件模型基类,包含回复消息链对象"""
104
104
 
105
- reply_message_chain: typing.Optional[platform_message.MessageChain] = pydantic.Field(
106
- serialization_alias="reply_message_chain", default=None
105
+ reply_message_chain: typing.Optional[platform_message.MessageChain] = (
106
+ pydantic.Field(serialization_alias="reply_message_chain", default=None)
107
107
  )
108
108
  """回复消息链对象,仅在阻止默认行为时有效"""
109
109
 
@@ -157,9 +157,11 @@ class PersonNormalMessageReceived(_WithReplyMessageChain):
157
157
  def validate_message_event(cls, v):
158
158
  return platform_events.FriendMessage.model_validate(v)
159
159
 
160
- user_message_alter: typing.Optional[typing.Union[provider_message.ContentElement, list[provider_message.ContentElement], str]] = pydantic.Field(
161
- default=None
162
- )
160
+ user_message_alter: typing.Optional[
161
+ typing.Union[
162
+ provider_message.ContentElement, list[provider_message.ContentElement], str
163
+ ]
164
+ ] = pydantic.Field(default=None)
163
165
  """修改后的 LLM 消息对象,可用于改写用户消息"""
164
166
 
165
167
 
@@ -199,9 +201,11 @@ class GroupNormalMessageReceived(_WithReplyMessageChain):
199
201
  def validate_message_event(cls, v):
200
202
  return platform_events.GroupMessage.model_validate(v)
201
203
 
202
- user_message_alter: typing.Optional[typing.Union[provider_message.ContentElement, list[provider_message.ContentElement], str]] = pydantic.Field(
203
- default=None
204
- )
204
+ user_message_alter: typing.Optional[
205
+ typing.Union[
206
+ provider_message.ContentElement, list[provider_message.ContentElement], str
207
+ ]
208
+ ] = pydantic.Field(default=None)
205
209
  """修改后的 LLM 消息对象,可用于改写用户消息"""
206
210
 
207
211
 
@@ -194,14 +194,72 @@ class LangBotAPIProxy:
194
194
  )
195
195
  )["commands"]
196
196
 
197
- async def list_tools(self) -> list[str]:
198
- """List all tools"""
197
+ async def list_tools(self) -> list[dict[str, Any]]:
198
+ """List all available tools.
199
+
200
+ Returns:
201
+ List of tool info dicts, each containing:
202
+ - name: Tool name (plugin_author/plugin_name/tool_name format)
203
+ - label: I18n label dict
204
+ - description: I18n description dict
205
+ - parameters: JSON Schema of tool parameters
206
+ - spec: Full tool spec
207
+ """
199
208
  return (
200
209
  await self.plugin_runtime_handler.call_action(
201
210
  PluginToRuntimeAction.LIST_TOOLS, {}
202
211
  )
203
212
  )["tools"]
204
213
 
214
+ async def get_tool_detail(self, tool_name: str) -> dict[str, Any]:
215
+ """Get detailed information about a specific tool.
216
+
217
+ Args:
218
+ tool_name: The name of the tool to get details for.
219
+
220
+ Returns:
221
+ Tool detail dict containing name, label, description, parameters, spec.
222
+
223
+ Raises:
224
+ Exception: If the tool is not found.
225
+ """
226
+ return (
227
+ await self.plugin_runtime_handler.call_action(
228
+ PluginToRuntimeAction.GET_TOOL_DETAIL, {"tool_name": tool_name}
229
+ )
230
+ )["tool"]
231
+
232
+ async def call_tool(
233
+ self,
234
+ tool_name: str,
235
+ parameters: dict[str, Any],
236
+ session: dict[str, Any],
237
+ query_id: int,
238
+ ) -> dict[str, Any]:
239
+ """Call a specific tool.
240
+
241
+ Args:
242
+ tool_name: The name of the tool to call.
243
+ parameters: The parameters to pass to the tool.
244
+ session: The current session dict.
245
+ query_id: The current query ID.
246
+
247
+ Returns:
248
+ Tool response dict.
249
+ """
250
+ return (
251
+ await self.plugin_runtime_handler.call_action(
252
+ PluginToRuntimeAction.CALL_TOOL,
253
+ {
254
+ "tool_name": tool_name,
255
+ "tool_parameters": parameters,
256
+ "session": session,
257
+ "query_id": query_id,
258
+ },
259
+ timeout=180,
260
+ )
261
+ )["tool_response"]
262
+
205
263
  # ================= RAG Capability APIs =================
206
264
 
207
265
  async def invoke_embedding(
@@ -5,9 +5,15 @@ metadata:
5
5
  label:
6
6
  en_US: {{ cmd_label }}
7
7
  zh_Hans: {{ cmd_label }}
8
+ th_TH: {{ cmd_label }}
9
+ vi_VN: {{ cmd_label }}
10
+ es_ES: {{ cmd_label }}
8
11
  description:
9
12
  en_US: '{{ cmd_description }}'
10
13
  zh_Hans: '{{ cmd_description }}'
14
+ th_TH: '{{ cmd_description }}'
15
+ vi_VN: '{{ cmd_description }}'
16
+ es_ES: '{{ cmd_description }}'
11
17
  spec:
12
18
  execution:
13
19
  python:
@@ -5,6 +5,9 @@ metadata:
5
5
  label:
6
6
  en_US: DefaultEventListener
7
7
  zh_Hans: DefaultEventListener
8
+ th_TH: DefaultEventListener
9
+ vi_VN: DefaultEventListener
10
+ es_ES: DefaultEventListener
8
11
  spec:
9
12
  execution:
10
13
  python:
@@ -5,15 +5,24 @@ metadata:
5
5
  label:
6
6
  en_US: {{ knowledge_engine_label }}
7
7
  zh_Hans: {{ knowledge_engine_label }}
8
+ th_TH: {{ knowledge_engine_label }}
9
+ vi_VN: {{ knowledge_engine_label }}
10
+ es_ES: {{ knowledge_engine_label }}
8
11
  description:
9
12
  en_US: '{{ knowledge_engine_description }}'
10
13
  zh_Hans: '{{ knowledge_engine_description }}'
14
+ th_TH: '{{ knowledge_engine_description }}'
15
+ vi_VN: '{{ knowledge_engine_description }}'
16
+ es_ES: '{{ knowledge_engine_description }}'
11
17
  spec:
12
18
  creation_schema:
13
19
  - name: chunk_size
14
20
  label:
15
21
  en_US: Chunk Size
16
22
  zh_Hans: 分块大小
23
+ th_TH: ขนาดชิ้นส่วน
24
+ vi_VN: Kích thước khối
25
+ es_ES: Tamaño de fragmento
17
26
  type: integer
18
27
  required: false
19
28
  default: 500
@@ -22,6 +31,9 @@ spec:
22
31
  label:
23
32
  en_US: Score Threshold
24
33
  zh_Hans: 分数阈值
34
+ th_TH: เกณฑ์คะแนน
35
+ vi_VN: Ngưỡng điểm
36
+ es_ES: Umbral de puntuación
25
37
  type: float
26
38
  required: false
27
39
  default: 0.5
@@ -5,9 +5,15 @@ metadata:
5
5
  label:
6
6
  en_US: {{ parser_label }}
7
7
  zh_Hans: {{ parser_label }}
8
+ th_TH: {{ parser_label }}
9
+ vi_VN: {{ parser_label }}
10
+ es_ES: {{ parser_label }}
8
11
  description:
9
12
  en_US: '{{ parser_description }}'
10
13
  zh_Hans: '{{ parser_description }}'
14
+ th_TH: '{{ parser_description }}'
15
+ vi_VN: '{{ parser_description }}'
16
+ es_ES: '{{ parser_description }}'
11
17
  spec:
12
18
  supported_mime_types:
13
19
  - application/pdf
@@ -5,9 +5,15 @@ metadata:
5
5
  label:
6
6
  en_US: {{ tool_label }}
7
7
  zh_Hans: {{ tool_label }}
8
+ th_TH: {{ tool_label }}
9
+ vi_VN: {{ tool_label }}
10
+ es_ES: {{ tool_label }}
8
11
  description:
9
12
  en_US: '{{ tool_description }}'
10
13
  zh_Hans: '{{ tool_description }}'
14
+ th_TH: '{{ tool_description }}'
15
+ vi_VN: '{{ tool_description }}'
16
+ es_ES: '{{ tool_description }}'
11
17
  spec:
12
18
  parameters: {}
13
19
  llm_prompt: '{{ tool_description }}'
@@ -8,9 +8,15 @@ metadata:
8
8
  description:
9
9
  en_US: '{{ plugin_description }}'
10
10
  zh_Hans: '{{ plugin_description }}'
11
+ th_TH: '{{ plugin_description }}'
12
+ vi_VN: '{{ plugin_description }}'
13
+ es_ES: '{{ plugin_description }}'
11
14
  label:
12
15
  en_US: {{ plugin_label }}
13
16
  zh_Hans: {{ plugin_label }}
17
+ th_TH: {{ plugin_label }}
18
+ vi_VN: {{ plugin_label }}
19
+ es_ES: {{ plugin_label }}
14
20
  icon: assets/icon.svg # replace in assets/icon.svg
15
21
  spec:
16
22
  config: []
@@ -60,15 +60,22 @@ def main():
60
60
  "-s", "--stdio", action="store_true", help="Use stdio for control connection"
61
61
  )
62
62
  run_parser.add_argument(
63
- "--prod", action="store_true", help="Mark this process as production plugin process, only used on Windows"
63
+ "--prod",
64
+ action="store_true",
65
+ help="Mark this process as production plugin process, only used on Windows",
64
66
  )
65
67
  run_parser.add_argument(
66
- "--plugin-debug-key", type=str, help="Debug key for plugin authentication", default=""
68
+ "--plugin-debug-key",
69
+ type=str,
70
+ help="Debug key for plugin authentication",
71
+ default="",
67
72
  )
68
73
 
69
74
  # login command
70
75
  login_parser = subparsers.add_parser("login", help="Login to LangBot account")
71
- login_parser.add_argument("--token", "-t", help="Login with a personal access token", default=None)
76
+ login_parser.add_argument(
77
+ "--token", "-t", help="Login with a personal access token", default=None
78
+ )
72
79
 
73
80
  # logout command
74
81
  logout_parser = subparsers.add_parser("logout", help="Logout from LangBot account")
@@ -108,7 +115,9 @@ def main():
108
115
  "--debug-only", action="store_true", help="Only run the debug server"
109
116
  )
110
117
  rt_parser.add_argument(
111
- "--skip-deps-check", action="store_true", help="Skip checking and installing dependencies for all installed plugins"
118
+ "--skip-deps-check",
119
+ action="store_true",
120
+ help="Skip checking and installing dependencies for all installed plugins",
112
121
  )
113
122
 
114
123
  args = parser.parse_args()
@@ -71,6 +71,9 @@ form_fields = [
71
71
  "label": {
72
72
  "en_US": "Plugin author",
73
73
  "zh_Hans": "插件作者",
74
+ "th_TH": "ผู้พัฒนาปลั๊กอิน",
75
+ "vi_VN": "Tác giả plugin",
76
+ "es_ES": "Autor del plugin",
74
77
  },
75
78
  "required": True,
76
79
  "format": {
@@ -78,6 +81,9 @@ form_fields = [
78
81
  "error": {
79
82
  "en_US": "Invalid plugin author, please use a valid name, which only contains letters, numbers, underscores and hyphens.",
80
83
  "zh_Hans": "无效的插件作者,请使用一个有效的名称,只能包含字母、数字、下划线和连字符。",
84
+ "th_TH": "ชื่อผู้พัฒนาปลั๊กอินไม่ถูกต้อง กรุณาใช้ชื่อที่ถูกต้อง ซึ่งประกอบด้วยตัวอักษร ตัวเลข ขีดล่าง และขีดกลางเท่านั้น",
85
+ "vi_VN": "Tên tác giả plugin không hợp lệ, vui lòng sử dụng tên hợp lệ, chỉ chứa chữ cái, số, dấu gạch dưới và dấu gạch ngang.",
86
+ "es_ES": "Autor del plugin no válido, por favor use un nombre válido que solo contenga letras, números, guiones bajos y guiones.",
81
87
  },
82
88
  },
83
89
  },
@@ -86,6 +92,9 @@ form_fields = [
86
92
  "label": {
87
93
  "en_US": "Plugin description",
88
94
  "zh_Hans": "插件描述",
95
+ "th_TH": "คำอธิบายปลั๊กอิน",
96
+ "vi_VN": "Mô tả plugin",
97
+ "es_ES": "Descripción del plugin",
89
98
  },
90
99
  "required": True,
91
100
  },