janito 2.12.0__tar.gz → 2.15.0__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 (311) hide show
  1. {janito-2.12.0 → janito-2.15.0}/CHANGELOG.md +23 -1
  2. {janito-2.12.0 → janito-2.15.0}/PKG-INFO +1 -1
  3. {janito-2.12.0 → janito-2.15.0}/docs/index.md +1 -0
  4. janito-2.15.0/docs/supported-providers-models.md +95 -0
  5. janito-2.15.0/docs/z-ai-setup.md +83 -0
  6. {janito-2.12.0 → janito-2.15.0}/janito/agent/setup_agent.py +1 -1
  7. janito-2.15.0/janito/cli/cli_commands/list_drivers.py +137 -0
  8. {janito-2.12.0 → janito-2.15.0}/janito/cli/core/getters.py +6 -1
  9. {janito-2.12.0 → janito-2.15.0}/janito/cli/main_cli.py +8 -10
  10. {janito-2.12.0 → janito-2.15.0}/janito/drivers/zai/driver.py +23 -12
  11. {janito-2.12.0 → janito-2.15.0}/janito/providers/zai/model_info.py +5 -22
  12. {janito-2.12.0 → janito-2.15.0}/janito/providers/zai/provider.py +4 -1
  13. {janito-2.12.0 → janito-2.15.0}/janito/providers/zai/schema_generator.py +7 -5
  14. {janito-2.12.0 → janito-2.15.0}/janito.egg-info/PKG-INFO +1 -1
  15. {janito-2.12.0 → janito-2.15.0}/janito.egg-info/SOURCES.txt +2 -1
  16. {janito-2.12.0 → janito-2.15.0}/mkdocs.yml +1 -0
  17. janito-2.12.0/docs/supported-providers-models.md +0 -48
  18. janito-2.12.0/janito/drivers/driver_registry.py +0 -27
  19. {janito-2.12.0 → janito-2.15.0}/.codespellrc +0 -0
  20. {janito-2.12.0 → janito-2.15.0}/.gitattributes +0 -0
  21. {janito-2.12.0 → janito-2.15.0}/.github/workflows/python-app.yml +0 -0
  22. {janito-2.12.0 → janito-2.15.0}/.gitignore +0 -0
  23. {janito-2.12.0 → janito-2.15.0}/.pre-commit-config.yaml +0 -0
  24. {janito-2.12.0 → janito-2.15.0}/.secrets.baseline +0 -0
  25. {janito-2.12.0 → janito-2.15.0}/.vscode/settings.json +0 -0
  26. {janito-2.12.0 → janito-2.15.0}/LICENSE +0 -0
  27. {janito-2.12.0 → janito-2.15.0}/README-dev.md +0 -0
  28. {janito-2.12.0 → janito-2.15.0}/README.md +0 -0
  29. {janito-2.12.0 → janito-2.15.0}/UPDATING_DOCS.md +0 -0
  30. {janito-2.12.0 → janito-2.15.0}/adding_mcp.txt +0 -0
  31. {janito-2.12.0 → janito-2.15.0}/docs/DIV.md +0 -0
  32. {janito-2.12.0 → janito-2.15.0}/docs/Interfaces.txt +0 -0
  33. {janito-2.12.0 → janito-2.15.0}/docs/TOOLBAR-STYLING.md +0 -0
  34. {janito-2.12.0 → janito-2.15.0}/docs/about/costs.md +0 -0
  35. {janito-2.12.0 → janito-2.15.0}/docs/about/vs-webchats.md +0 -0
  36. {janito-2.12.0 → janito-2.15.0}/docs/about/why.md +0 -0
  37. {janito-2.12.0 → janito-2.15.0}/docs/alternatives.md +0 -0
  38. {janito-2.12.0 → janito-2.15.0}/docs/code_intelligence/agentic-frameworks-comparison.md +0 -0
  39. {janito-2.12.0 → janito-2.15.0}/docs/code_intelligence/code-generation-challenges.md +0 -0
  40. {janito-2.12.0 → janito-2.15.0}/docs/code_intelligence/code-generation-observability.md +0 -0
  41. {janito-2.12.0 → janito-2.15.0}/docs/code_intelligence/our-approach.md +0 -0
  42. {janito-2.12.0 → janito-2.15.0}/docs/code_intelligence/why-string-replacement.md +0 -0
  43. {janito-2.12.0 → janito-2.15.0}/docs/concepts/analysis-style.md +0 -0
  44. {janito-2.12.0 → janito-2.15.0}/docs/concepts/human-guided-ai.md +0 -0
  45. {janito-2.12.0 → janito-2.15.0}/docs/concepts/index.md +0 -0
  46. {janito-2.12.0 → janito-2.15.0}/docs/concepts/language-model-clients.md +0 -0
  47. {janito-2.12.0 → janito-2.15.0}/docs/concepts/prompt-design-style.md +0 -0
  48. {janito-2.12.0 → janito-2.15.0}/docs/deepseek-setup.md +0 -0
  49. {janito-2.12.0 → janito-2.15.0}/docs/driver-flow.md +0 -0
  50. {janito-2.12.0 → janito-2.15.0}/docs/driver-request-cancellation.md +0 -0
  51. {janito-2.12.0 → janito-2.15.0}/docs/drivers/events.md +0 -0
  52. {janito-2.12.0 → janito-2.15.0}/docs/drivers.md +0 -0
  53. {janito-2.12.0 → janito-2.15.0}/docs/event-bus.md +0 -0
  54. {janito-2.12.0 → janito-2.15.0}/docs/guides/configuration.md +0 -0
  55. {janito-2.12.0 → janito-2.15.0}/docs/guides/developing.md +0 -0
  56. {janito-2.12.0 → janito-2.15.0}/docs/guides/disabled-tools.md +0 -0
  57. {janito-2.12.0 → janito-2.15.0}/docs/guides/installation.md +0 -0
  58. {janito-2.12.0 → janito-2.15.0}/docs/guides/profiles.md +0 -0
  59. {janito-2.12.0 → janito-2.15.0}/docs/guides/prompting/README.md +0 -0
  60. {janito-2.12.0 → janito-2.15.0}/docs/guides/single-shot-terminal.md +0 -0
  61. {janito-2.12.0 → janito-2.15.0}/docs/guides/terminal-shell.md +0 -0
  62. {janito-2.12.0 → janito-2.15.0}/docs/guides/tools-developer-guide.md +0 -0
  63. {janito-2.12.0 → janito-2.15.0}/docs/guides/using.md +0 -0
  64. {janito-2.12.0 → janito-2.15.0}/docs/guides/using_tools.md +0 -0
  65. {janito-2.12.0 → janito-2.15.0}/docs/imgs/code-generation-observability.png +0 -0
  66. {janito-2.12.0 → janito-2.15.0}/docs/imgs/code_generation_observability.png +0 -0
  67. {janito-2.12.0 → janito-2.15.0}/docs/imgs/happy-programmer.png +0 -0
  68. {janito-2.12.0 → janito-2.15.0}/docs/imgs/happy-programmer.svg +0 -0
  69. {janito-2.12.0 → janito-2.15.0}/docs/imgs/terminal-one-shot.png +0 -0
  70. {janito-2.12.0 → janito-2.15.0}/docs/imgs/terminal-shell.png +0 -0
  71. {janito-2.12.0 → janito-2.15.0}/docs/imgs/terminal_one_shot.png +0 -0
  72. {janito-2.12.0 → janito-2.15.0}/docs/imgs/terminal_shell.png +0 -0
  73. {janito-2.12.0 → janito-2.15.0}/docs/llm-drivers-required-config.md +0 -0
  74. {janito-2.12.0 → janito-2.15.0}/docs/llm-drivers.md +0 -0
  75. {janito-2.12.0 → janito-2.15.0}/docs/meta/developer-toolchain.md +0 -0
  76. {janito-2.12.0 → janito-2.15.0}/docs/meta/quality-checks.txt +0 -0
  77. {janito-2.12.0 → janito-2.15.0}/docs/moonshotai-setup.md +0 -0
  78. {janito-2.12.0 → janito-2.15.0}/docs/reference/api.md +0 -0
  79. {janito-2.12.0 → janito-2.15.0}/docs/reference/azure-openai.md +0 -0
  80. {janito-2.12.0 → janito-2.15.0}/docs/reference/cli-options.md +0 -0
  81. {janito-2.12.0 → janito-2.15.0}/docs/reference/message-handler-model.md +0 -0
  82. {janito-2.12.0 → janito-2.15.0}/docs/reference/rich-message-handler.md +0 -0
  83. {janito-2.12.0 → janito-2.15.0}/docs/security.md +0 -0
  84. {janito-2.12.0 → janito-2.15.0}/docs/tools/search-text.md +0 -0
  85. {janito-2.12.0 → janito-2.15.0}/docs/tools-index.md +0 -0
  86. {janito-2.12.0 → janito-2.15.0}/docs/tools-natural-results.md +0 -0
  87. {janito-2.12.0 → janito-2.15.0}/docs/tools-precision.md +0 -0
  88. {janito-2.12.0 → janito-2.15.0}/git_diff.txt +0 -0
  89. {janito-2.12.0 → janito-2.15.0}/github_diff +0 -0
  90. {janito-2.12.0 → janito-2.15.0}/janito/README.md +0 -0
  91. {janito-2.12.0 → janito-2.15.0}/janito/__init__.py +0 -0
  92. {janito-2.12.0 → janito-2.15.0}/janito/__main__.py +0 -0
  93. {janito-2.12.0 → janito-2.15.0}/janito/_version.py +0 -0
  94. {janito-2.12.0 → janito-2.15.0}/janito/agent/templates/profiles/system_prompt_template_Developer_with_Python_Tools.txt.j2 +0 -0
  95. {janito-2.12.0 → janito-2.15.0}/janito/agent/templates/profiles/system_prompt_template_developer.txt.j2 +0 -0
  96. {janito-2.12.0 → janito-2.15.0}/janito/agent/templates/profiles/system_prompt_template_model_conversation_without_tools_or_context.txt.j2 +0 -0
  97. {janito-2.12.0 → janito-2.15.0}/janito/cli/__init__.py +0 -0
  98. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/bindings.py +0 -0
  99. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/chat_entry.py +0 -0
  100. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/prompt_style.py +0 -0
  101. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/script_runner.py +0 -0
  102. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/session.py +0 -0
  103. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/session_profile_select.py +0 -0
  104. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/autocomplete.py +0 -0
  105. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/__init__.py +0 -0
  106. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/_priv_check.py +0 -0
  107. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/_priv_status.py +0 -0
  108. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/bang.py +0 -0
  109. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/base.py +0 -0
  110. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/clear.py +0 -0
  111. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/conversation_restart.py +0 -0
  112. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/execute.py +0 -0
  113. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/help.py +0 -0
  114. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/history_view.py +0 -0
  115. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/lang.py +0 -0
  116. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/model.py +0 -0
  117. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/multi.py +0 -0
  118. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/privileges.py +0 -0
  119. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/prompt.py +0 -0
  120. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/read.py +0 -0
  121. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/role.py +0 -0
  122. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/session.py +0 -0
  123. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/session_control.py +0 -0
  124. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/tools.py +0 -0
  125. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/utility.py +0 -0
  126. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/verbose.py +0 -0
  127. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands/write.py +0 -0
  128. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/commands.bak.zip +0 -0
  129. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/input_history.py +0 -0
  130. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/session/__init__.py +0 -0
  131. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/session/history.py +0 -0
  132. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/session/manager.py +0 -0
  133. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/shell/session.bak.zip +0 -0
  134. {janito-2.12.0 → janito-2.15.0}/janito/cli/chat_mode/toolbar.py +0 -0
  135. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/list_config.py +0 -0
  136. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/list_models.py +0 -0
  137. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/list_profiles.py +0 -0
  138. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/list_providers.py +0 -0
  139. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/list_tools.py +0 -0
  140. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/model_selection.py +0 -0
  141. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/model_utils.py +0 -0
  142. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/set_api_key.py +0 -0
  143. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/show_config.py +0 -0
  144. {janito-2.12.0 → janito-2.15.0}/janito/cli/cli_commands/show_system_prompt.py +0 -0
  145. {janito-2.12.0 → janito-2.15.0}/janito/cli/config.py +0 -0
  146. {janito-2.12.0 → janito-2.15.0}/janito/cli/console.py +0 -0
  147. {janito-2.12.0 → janito-2.15.0}/janito/cli/core/__init__.py +0 -0
  148. {janito-2.12.0 → janito-2.15.0}/janito/cli/core/event_logger.py +0 -0
  149. {janito-2.12.0 → janito-2.15.0}/janito/cli/core/model_guesser.py +0 -0
  150. {janito-2.12.0 → janito-2.15.0}/janito/cli/core/runner.py +0 -0
  151. {janito-2.12.0 → janito-2.15.0}/janito/cli/core/setters.py +0 -0
  152. {janito-2.12.0 → janito-2.15.0}/janito/cli/core/unsetters.py +0 -0
  153. {janito-2.12.0 → janito-2.15.0}/janito/cli/main.py +0 -0
  154. {janito-2.12.0 → janito-2.15.0}/janito/cli/prompt_core.py +0 -0
  155. {janito-2.12.0 → janito-2.15.0}/janito/cli/prompt_handler.py +0 -0
  156. {janito-2.12.0 → janito-2.15.0}/janito/cli/prompt_setup.py +0 -0
  157. {janito-2.12.0 → janito-2.15.0}/janito/cli/rich_terminal_reporter.py +0 -0
  158. {janito-2.12.0 → janito-2.15.0}/janito/cli/single_shot_mode/__init__.py +0 -0
  159. {janito-2.12.0 → janito-2.15.0}/janito/cli/single_shot_mode/handler.py +0 -0
  160. {janito-2.12.0 → janito-2.15.0}/janito/cli/utils.py +0 -0
  161. {janito-2.12.0 → janito-2.15.0}/janito/cli/verbose_output.py +0 -0
  162. {janito-2.12.0 → janito-2.15.0}/janito/config.py +0 -0
  163. {janito-2.12.0 → janito-2.15.0}/janito/config_manager.py +0 -0
  164. {janito-2.12.0 → janito-2.15.0}/janito/conversation_history.py +0 -0
  165. {janito-2.12.0 → janito-2.15.0}/janito/dir_walk_utils.py +0 -0
  166. {janito-2.12.0 → janito-2.15.0}/janito/docs/GETTING_STARTED.md +0 -0
  167. {janito-2.12.0 → janito-2.15.0}/janito/driver_events.py +0 -0
  168. {janito-2.12.0 → janito-2.15.0}/janito/drivers/azure_openai/driver.py +0 -0
  169. {janito-2.12.0 → janito-2.15.0}/janito/drivers/dashscope.bak.zip +0 -0
  170. {janito-2.12.0 → janito-2.15.0}/janito/drivers/openai/README.md +0 -0
  171. {janito-2.12.0 → janito-2.15.0}/janito/drivers/openai/driver.py +0 -0
  172. {janito-2.12.0 → janito-2.15.0}/janito/drivers/openai_responses.bak.zip +0 -0
  173. {janito-2.12.0 → janito-2.15.0}/janito/drivers/zai/__init__.py +0 -0
  174. {janito-2.12.0 → janito-2.15.0}/janito/event_bus/__init__.py +0 -0
  175. {janito-2.12.0 → janito-2.15.0}/janito/event_bus/bus.py +0 -0
  176. {janito-2.12.0 → janito-2.15.0}/janito/event_bus/event.py +0 -0
  177. {janito-2.12.0 → janito-2.15.0}/janito/event_bus/handler.py +0 -0
  178. {janito-2.12.0 → janito-2.15.0}/janito/event_bus/queue_bus.py +0 -0
  179. {janito-2.12.0 → janito-2.15.0}/janito/exceptions.py +0 -0
  180. {janito-2.12.0 → janito-2.15.0}/janito/formatting.py +0 -0
  181. {janito-2.12.0 → janito-2.15.0}/janito/formatting_token.py +0 -0
  182. {janito-2.12.0 → janito-2.15.0}/janito/gitignore_utils.py +0 -0
  183. {janito-2.12.0 → janito-2.15.0}/janito/i18n/__init__.py +0 -0
  184. {janito-2.12.0 → janito-2.15.0}/janito/i18n/messages.py +0 -0
  185. {janito-2.12.0 → janito-2.15.0}/janito/i18n/pt.py +0 -0
  186. {janito-2.12.0 → janito-2.15.0}/janito/llm/README.md +0 -0
  187. {janito-2.12.0 → janito-2.15.0}/janito/llm/__init__.py +0 -0
  188. {janito-2.12.0 → janito-2.15.0}/janito/llm/agent.py +0 -0
  189. {janito-2.12.0 → janito-2.15.0}/janito/llm/auth.py +0 -0
  190. {janito-2.12.0 → janito-2.15.0}/janito/llm/driver.py +0 -0
  191. {janito-2.12.0 → janito-2.15.0}/janito/llm/driver_config.py +0 -0
  192. {janito-2.12.0 → janito-2.15.0}/janito/llm/driver_config_builder.py +0 -0
  193. {janito-2.12.0 → janito-2.15.0}/janito/llm/driver_input.py +0 -0
  194. {janito-2.12.0 → janito-2.15.0}/janito/llm/message_parts.py +0 -0
  195. {janito-2.12.0 → janito-2.15.0}/janito/llm/model.py +0 -0
  196. {janito-2.12.0 → janito-2.15.0}/janito/llm/provider.py +0 -0
  197. {janito-2.12.0 → janito-2.15.0}/janito/mkdocs.yml +0 -0
  198. {janito-2.12.0 → janito-2.15.0}/janito/perf_singleton.py +0 -0
  199. {janito-2.12.0 → janito-2.15.0}/janito/performance_collector.py +0 -0
  200. {janito-2.12.0 → janito-2.15.0}/janito/platform_discovery.py +0 -0
  201. {janito-2.12.0 → janito-2.15.0}/janito/provider_config.py +0 -0
  202. {janito-2.12.0 → janito-2.15.0}/janito/provider_registry.py +0 -0
  203. {janito-2.12.0 → janito-2.15.0}/janito/providers/__init__.py +0 -0
  204. {janito-2.12.0 → janito-2.15.0}/janito/providers/alibaba/__init__.py +0 -0
  205. {janito-2.12.0 → janito-2.15.0}/janito/providers/alibaba/model_info.py +0 -0
  206. {janito-2.12.0 → janito-2.15.0}/janito/providers/alibaba/provider.py +0 -0
  207. {janito-2.12.0 → janito-2.15.0}/janito/providers/anthropic/model_info.py +0 -0
  208. {janito-2.12.0 → janito-2.15.0}/janito/providers/anthropic/provider.py +0 -0
  209. {janito-2.12.0 → janito-2.15.0}/janito/providers/azure_openai/model_info.py +0 -0
  210. {janito-2.12.0 → janito-2.15.0}/janito/providers/azure_openai/provider.py +0 -0
  211. {janito-2.12.0 → janito-2.15.0}/janito/providers/dashscope.bak.zip +0 -0
  212. {janito-2.12.0 → janito-2.15.0}/janito/providers/deepseek/__init__.py +0 -0
  213. {janito-2.12.0 → janito-2.15.0}/janito/providers/deepseek/model_info.py +0 -0
  214. {janito-2.12.0 → janito-2.15.0}/janito/providers/deepseek/provider.py +0 -0
  215. {janito-2.12.0 → janito-2.15.0}/janito/providers/google/__init__.py +0 -0
  216. {janito-2.12.0 → janito-2.15.0}/janito/providers/google/model_info.py +0 -0
  217. {janito-2.12.0 → janito-2.15.0}/janito/providers/google/provider.py +0 -0
  218. {janito-2.12.0 → janito-2.15.0}/janito/providers/moonshotai/__init__.py +0 -0
  219. {janito-2.12.0 → janito-2.15.0}/janito/providers/moonshotai/model_info.py +0 -0
  220. {janito-2.12.0 → janito-2.15.0}/janito/providers/moonshotai/provider.py +0 -0
  221. {janito-2.12.0 → janito-2.15.0}/janito/providers/openai/__init__.py +0 -0
  222. {janito-2.12.0 → janito-2.15.0}/janito/providers/openai/model_info.py +0 -0
  223. {janito-2.12.0 → janito-2.15.0}/janito/providers/openai/provider.py +0 -0
  224. {janito-2.12.0 → janito-2.15.0}/janito/providers/openai/schema_generator.py +0 -0
  225. {janito-2.12.0 → janito-2.15.0}/janito/providers/registry.py +0 -0
  226. {janito-2.12.0 → janito-2.15.0}/janito/providers/zai/__init__.py +0 -0
  227. {janito-2.12.0 → janito-2.15.0}/janito/report_events.py +0 -0
  228. {janito-2.12.0 → janito-2.15.0}/janito/shell.bak.zip +0 -0
  229. {janito-2.12.0 → janito-2.15.0}/janito/tools/DOCSTRING_STANDARD.txt +0 -0
  230. {janito-2.12.0 → janito-2.15.0}/janito/tools/README.md +0 -0
  231. {janito-2.12.0 → janito-2.15.0}/janito/tools/__init__.py +0 -0
  232. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/__init__.py +0 -0
  233. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/__init__.py +0 -0
  234. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/adapter.py +0 -0
  235. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/ask_user.py +0 -0
  236. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/copy_file.py +0 -0
  237. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/create_directory.py +0 -0
  238. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/create_file.py +0 -0
  239. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/delete_text_in_file.py +0 -0
  240. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/fetch_url.py +0 -0
  241. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/find_files.py +0 -0
  242. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/get_file_outline/__init__.py +0 -0
  243. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/get_file_outline/core.py +0 -0
  244. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/get_file_outline/java_outline.py +0 -0
  245. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/get_file_outline/markdown_outline.py +0 -0
  246. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/get_file_outline/python_outline.py +0 -0
  247. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/get_file_outline/search_outline.py +0 -0
  248. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/move_file.py +0 -0
  249. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/open_html_in_browser.py +0 -0
  250. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/open_url.py +0 -0
  251. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/python_code_run.py +0 -0
  252. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/python_command_run.py +0 -0
  253. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/python_file_run.py +0 -0
  254. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/read_files.py +0 -0
  255. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/remove_directory.py +0 -0
  256. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/remove_file.py +0 -0
  257. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/replace_text_in_file.py +0 -0
  258. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/run_bash_command.py +0 -0
  259. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/run_powershell_command.py +0 -0
  260. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/search_text/__init__.py +0 -0
  261. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/search_text/core.py +0 -0
  262. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/search_text/match_lines.py +0 -0
  263. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/search_text/pattern_utils.py +0 -0
  264. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/search_text/traverse_directory.py +0 -0
  265. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/__init__.py +0 -0
  266. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/core.py +0 -0
  267. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/css_validator.py +0 -0
  268. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/html_validator.py +0 -0
  269. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/js_validator.py +0 -0
  270. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/json_validator.py +0 -0
  271. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/markdown_validator.py +0 -0
  272. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/ps1_validator.py +0 -0
  273. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/python_validator.py +0 -0
  274. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/xml_validator.py +0 -0
  275. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/validate_file_syntax/yaml_validator.py +0 -0
  276. {janito-2.12.0 → janito-2.15.0}/janito/tools/adapters/local/view_file.py +0 -0
  277. {janito-2.12.0 → janito-2.15.0}/janito/tools/disabled_tools.py +0 -0
  278. {janito-2.12.0 → janito-2.15.0}/janito/tools/inspect_registry.py +0 -0
  279. {janito-2.12.0 → janito-2.15.0}/janito/tools/outline_file.bak.zip +0 -0
  280. {janito-2.12.0 → janito-2.15.0}/janito/tools/path_security.py +0 -0
  281. {janito-2.12.0 → janito-2.15.0}/janito/tools/permissions.py +0 -0
  282. {janito-2.12.0 → janito-2.15.0}/janito/tools/permissions_parse.py +0 -0
  283. {janito-2.12.0 → janito-2.15.0}/janito/tools/tool_base.py +0 -0
  284. {janito-2.12.0 → janito-2.15.0}/janito/tools/tool_events.py +0 -0
  285. {janito-2.12.0 → janito-2.15.0}/janito/tools/tool_run_exception.py +0 -0
  286. {janito-2.12.0 → janito-2.15.0}/janito/tools/tool_use_tracker.py +0 -0
  287. {janito-2.12.0 → janito-2.15.0}/janito/tools/tool_utils.py +0 -0
  288. {janito-2.12.0 → janito-2.15.0}/janito/tools/tools_adapter.py +0 -0
  289. {janito-2.12.0 → janito-2.15.0}/janito/tools/tools_schema.py +0 -0
  290. {janito-2.12.0 → janito-2.15.0}/janito/utils.py +0 -0
  291. {janito-2.12.0 → janito-2.15.0}/janito.egg-info/dependency_links.txt +0 -0
  292. {janito-2.12.0 → janito-2.15.0}/janito.egg-info/entry_points.txt +0 -0
  293. {janito-2.12.0 → janito-2.15.0}/janito.egg-info/requires.txt +0 -0
  294. {janito-2.12.0 → janito-2.15.0}/janito.egg-info/top_level.txt +0 -0
  295. {janito-2.12.0 → janito-2.15.0}/pyproject.toml +0 -0
  296. {janito-2.12.0 → janito-2.15.0}/pytest.ini +0 -0
  297. {janito-2.12.0 → janito-2.15.0}/requirements-dev.txt +0 -0
  298. {janito-2.12.0 → janito-2.15.0}/requirements.txt +0 -0
  299. {janito-2.12.0 → janito-2.15.0}/setup.cfg +0 -0
  300. {janito-2.12.0 → janito-2.15.0}/tests/adapters/local/get_file_outline/test_core_outline.py +0 -0
  301. {janito-2.12.0 → janito-2.15.0}/tests/adapters/local/test_read_files.py +0 -0
  302. {janito-2.12.0 → janito-2.15.0}/tests/test_cli_list_models.py +0 -0
  303. {janito-2.12.0 → janito-2.15.0}/tests/test_cli_list_providers.py +0 -0
  304. {janito-2.12.0 → janito-2.15.0}/tests/test_cli_list_providers_alibaba.py +0 -0
  305. {janito-2.12.0 → janito-2.15.0}/tests/test_cli_list_providers_moonshotai.py +0 -0
  306. {janito-2.12.0 → janito-2.15.0}/tests/test_cli_version.py +0 -0
  307. {janito-2.12.0 → janito-2.15.0}/tests/test_disabled_tools.py +0 -0
  308. {janito-2.12.0 → janito-2.15.0}/tests/test_provider_alibaba.py +0 -0
  309. {janito-2.12.0 → janito-2.15.0}/tests/test_provider_moonshotai.py +0 -0
  310. {janito-2.12.0 → janito-2.15.0}/tools/release.py +0 -0
  311. {janito-2.12.0 → janito-2.15.0}/tox.ini +0 -0
@@ -2,7 +2,29 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## [Unreleased]
5
+ ## [2.12.0] - 2025-08-05
6
+
7
+ ### Added
8
+ - **Enhanced Provider Documentation**: Updated supported-providers-models.md with comprehensive provider information including drivers and dependencies
9
+ - **Improved Driver Listing**: Enhanced list_drivers command with better dependency detection and duplicate removal
10
+ - **Z.AI Provider**: Added ZAIModelDriver with OpenAI SDK compatibility for Z.AI API
11
+ - **Google Gemini Provider**: Added support for Gemini Pro and Gemini 1.5 Pro models via OpenAI-compatible API
12
+ - **DeepSeek Provider**: Added support for deepseek-chat and deepseek-coder models via OpenAI-compatible API
13
+ - **Alibaba Provider**: Added support for qwen-turbo, qwen-plus, qwen-max, and qwen3-coder-plus models via OpenAI-compatible API
14
+ - **MoonshotAI Provider**: Enhanced with additional models and OpenAI-compatible API support
15
+ - **Azure OpenAI Provider**: Added support for GPT-4o and GPT-4o-mini models
16
+
17
+ ### Changed
18
+ - **CLI Core**: Updated getter functions to exit after execution for better CLI behavior
19
+ - **Driver Architecture**: Enhanced ZAI driver to use OpenAI SDK instead of Z.AI SDK for better compatibility
20
+ - **Dependency Management**: Improved dependency detection in list_drivers command with duplicate removal
21
+ - **Provider Registry**: Enhanced provider information display with driver names and dependency status
22
+ - **Model Support**: Updated all providers to use OpenAI-compatible API where applicable, expanding model availability
23
+
24
+ ### Fixed
25
+ - **Driver Configuration**: Fixed AttributeError in ZAI provider by initializing _driver_config properly
26
+ - **Import Handling**: Added proper import error handling for optional dependencies in ZAI driver
27
+ - **CLI Integration**: Fixed list_drivers integration into main CLI flow
6
28
 
7
29
  ## [2.11.0] - 2025-08-04
8
30
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 2.12.0
3
+ Version: 2.15.0
4
4
  Summary: A new Python package called janito.
5
5
  Author-email: João Pinto <janito@ikignosis.org>
6
6
  Project-URL: Homepage, https://github.com/ikignosis/janito
@@ -21,5 +21,6 @@ Janito is a lightweight language model client focused on software development ac
21
21
  - [What Is a Language Model Client?](concepts/language-model-clients.md) — Thin vs. Thick Clients explained
22
22
  - [Configuring Janito for DeepSeek](deepseek-setup.md) — How to set up and use DeepSeek models
23
23
  - [Configuring Janito for MoonshotAI](moonshotai-setup.md) — How to set up and use MoonshotAI models
24
+ - [Configuring Janito for Z.ai](z-ai-setup.md) — How to set up and use Z.ai models
24
25
  - **Concepts & Terminology:** See the [concepts](concepts/index.md) section for more foundational explanations.
25
26
 
@@ -0,0 +1,95 @@
1
+ # Supported Providers and Models
2
+
3
+ This page lists the supported providers and their available models.
4
+
5
+ ## OpenAI
6
+
7
+ - **Driver**: OpenAIModelDriver
8
+ - **Dependencies**: ✅ openai
9
+
10
+ **Models:**
11
+
12
+ - GPT-3.5 Turbo
13
+ - GPT-4
14
+ - GPT-4 Turbo
15
+ - GPT-4o
16
+ - GPT-4o-mini
17
+
18
+ ## Azure OpenAI
19
+
20
+ - **Driver**: AzureOpenAIModelDriver
21
+ - **Dependencies**: ✅ openai
22
+
23
+ **Models:**
24
+
25
+ - GPT-4o
26
+ - GPT-4o-mini
27
+ - GPT-4 Turbo
28
+
29
+ ## Anthropic
30
+
31
+ - **Driver**: OpenAIModelDriver (via OpenAI-compatible API)
32
+ - **Dependencies**: ✅ openai
33
+
34
+ **Models:**
35
+
36
+ - Claude 3.7 Sonnet (claude-3-7-sonnet-20250219)
37
+ - Claude 3.5 Sonnet (claude-3-5-sonnet-20241022)
38
+ - Claude 3.5 Haiku (claude-3-5-haiku-20241022)
39
+ - Claude 3 Opus (claude-3-opus-20240229)
40
+ - Claude 3 Haiku (claude-3-haiku-20240307)
41
+
42
+ ## Z.AI
43
+
44
+ - **Driver**: ZAIModelDriver
45
+ - **Dependencies**: ❌ zai (install with `pip install zai`)
46
+
47
+ **Models:**
48
+
49
+ - glm-4.5
50
+ - glm-4.5-air
51
+
52
+ ## MoonshotAI
53
+
54
+ - **Driver**: OpenAIModelDriver (via OpenAI-compatible API)
55
+ - **Dependencies**: ✅ openai
56
+
57
+ **Models:**
58
+
59
+ - kimi-k2-turbo-preview
60
+ - kimi-k1-8k
61
+ - kimi-k1-32k
62
+ - kimi-k1-128k
63
+
64
+ ## Alibaba
65
+
66
+ - **Driver**: OpenAIModelDriver (via OpenAI-compatible API)
67
+ - **Dependencies**: ✅ openai
68
+
69
+ **Models:**
70
+
71
+ - qwen-turbo
72
+ - qwen-plus
73
+ - qwen-max
74
+ - qwen3-coder-plus
75
+ - qwen3-coder-480b-a35b-instruct
76
+
77
+ ## Google Gemini
78
+
79
+ - **Driver**: OpenAIModelDriver (via OpenAI-compatible API)
80
+ - **Dependencies**: ✅ openai
81
+
82
+ **Models:**
83
+
84
+ - Gemini Pro
85
+ - Gemini 1.5 Pro
86
+
87
+ ## DeepSeek
88
+
89
+ - **Driver**: OpenAIModelDriver (via OpenAI-compatible API)
90
+ - **Dependencies**: ✅ openai
91
+
92
+ **Models:**
93
+
94
+ - deepseek-chat
95
+ - deepseek-coder
@@ -0,0 +1,83 @@
1
+ # Z.ai API Setup Guide
2
+
3
+ This guide explains how to set up and use Z.ai's API with your API key.
4
+
5
+ ## Getting Your API Key
6
+
7
+ 1. Visit [Z.ai API Management](https://z.ai/manage-apikey/apikey-list)
8
+ 2. Log in to your Z.ai account
9
+ 3. Navigate to the API Keys section
10
+ 4. Create a new API key if you don't have one yet
11
+
12
+ ## API Key Format
13
+
14
+ Z.ai uses a new key format that includes both a user ID and secret:
15
+ ```
16
+ {id}.{secret}
17
+ ```
18
+
19
+ **Important Security Notes:**
20
+
21
+ - Never share your API keys
22
+ - Do not expose keys in browsers or client-side code
23
+ - Leaked keys may be automatically regenerated for security
24
+ - Store keys securely in environment variables or secure vaults
25
+
26
+ ## Setting Up Your Environment
27
+
28
+ ### Environment Variable (Recommended)
29
+
30
+ Set your API key as an environment variable:
31
+
32
+ **Linux/macOS:**
33
+ ```bash
34
+ export ZAI_API_KEY="your-id.your-secret"
35
+ ```
36
+
37
+ **Windows (Command Prompt):**
38
+ ```cmd
39
+ set ZAI_API_KEY=your-id.your-secret
40
+ ```
41
+
42
+ **Windows (PowerShell):**
43
+ ```powershell
44
+ $env:ZAI_API_KEY="your-id.your-secret"
45
+ ```
46
+
47
+ ### Configuration File
48
+
49
+ You can also store your API key in a configuration file (ensure proper file permissions):
50
+
51
+ ```json
52
+ {
53
+ "zai_api_key": "your-id.your-secret"
54
+ }
55
+ ```
56
+
57
+ ## Rate Limits and Billing
58
+
59
+ - Check your [API Management dashboard](https://z.ai/manage-apikey/apikey-list) for current rate limits
60
+ - Monitor your usage and billing information
61
+ - Contact support for API recharge if needed
62
+
63
+ ## Support
64
+
65
+ For API-related support:
66
+
67
+ - Visit [Z.ai Contact](https://z.ai/contact) for product support
68
+ - Join the [Discord community](https://z.ai/contact) to chat with developers
69
+ - Check the [API documentation](https://z.ai/model-api) for model-specific details
70
+
71
+ ## Available Models
72
+
73
+ Z.ai provides several models including:
74
+
75
+ - **GLM-4.5**: Latest flagship model with reasoning, coding, and agent functionalities
76
+ - **GLM-4.5-Air**: Lightweight flagship model with cost-effectiveness
77
+ - **GLM-4.5-Flash**: Most advanced free model
78
+ - **GLM-4-32B-0414-128K**: General-purpose LLM for business and technical domains
79
+ - **CogVideoX-3**: Text-to-video model for high-fidelity motion
80
+ - **Vidu Q1**: High-fidelity 1080p video generation
81
+ - **Vidu 2**: Fast, low-cost 720p video generation
82
+
83
+ For complete model specifications and capabilities, visit [Z.ai Models](https://z.ai/model-api).
@@ -12,7 +12,7 @@ from queue import Queue
12
12
  from rich import print as rich_print
13
13
  from janito.tools import get_local_tools_adapter
14
14
  from janito.llm.agent import LLMAgent
15
- from janito.drivers.driver_registry import get_driver_class
15
+
16
16
  from janito.platform_discovery import PlatformDiscovery
17
17
  from janito.tools.tool_base import ToolPermissions
18
18
  from janito.tools.permissions import get_global_allowed_permissions
@@ -0,0 +1,137 @@
1
+ """
2
+ CLI Command: List available LLM drivers and their dependencies
3
+ """
4
+
5
+ import importlib
6
+ import sys
7
+ from pathlib import Path
8
+ from rich.console import Console
9
+ from rich.table import Table
10
+ from rich.panel import Panel
11
+ from rich.text import Text
12
+
13
+ console = Console()
14
+
15
+
16
+ def get_driver_info():
17
+ """Get information about all available drivers."""
18
+ drivers = []
19
+
20
+ # Define known driver modules
21
+ driver_modules = [
22
+ ("janito.drivers.openai.driver", "OpenAIModelDriver"),
23
+ ("janito.drivers.azure_openai.driver", "AzureOpenAIModelDriver"),
24
+ ("janito.drivers.zai.driver", "ZAIModelDriver"),
25
+ ]
26
+
27
+ for module_path, class_name in driver_modules:
28
+ try:
29
+ # Import the module
30
+ module = importlib.import_module(module_path)
31
+ driver_class = getattr(module, class_name)
32
+
33
+ # Get availability info
34
+ available = getattr(driver_class, 'available', True)
35
+ unavailable_reason = getattr(driver_class, 'unavailable_reason', None)
36
+
37
+ # Get dependencies from module imports
38
+ dependencies = []
39
+ module_file = Path(module.__file__)
40
+
41
+ # Read module file to detect imports
42
+ with open(module_file, 'r', encoding='utf-8') as f:
43
+ content = f.read()
44
+
45
+ # Simple dependency detection
46
+ if 'import openai' in content or 'from openai' in content:
47
+ dependencies.append('openai')
48
+ if 'import zai' in content or 'from zai' in content:
49
+ dependencies.append('zai')
50
+ if 'import anthropic' in content or 'from anthropic' in content:
51
+ dependencies.append('anthropic')
52
+ if 'import google' in content or 'from google' in content:
53
+ dependencies.append('google-generativeai')
54
+
55
+
56
+
57
+ # Remove duplicates while preserving order
58
+ seen = set()
59
+ dependencies = [dep for dep in dependencies if not (dep in seen or seen.add(dep))]
60
+
61
+ # Check if dependencies are available
62
+ dep_status = []
63
+ for dep in dependencies:
64
+ try:
65
+ importlib.import_module(dep)
66
+ dep_status.append(f"✅ {dep}")
67
+ except ImportError:
68
+ dep_status.append(f"❌ {dep}")
69
+
70
+ if not dependencies:
71
+ dep_status = ["No external dependencies"]
72
+
73
+ drivers.append({
74
+ 'name': class_name,
75
+ 'available': available,
76
+ 'reason': unavailable_reason,
77
+ 'dependencies': dep_status
78
+ })
79
+
80
+ except (ImportError, AttributeError) as e:
81
+ drivers.append({
82
+ 'name': class_name,
83
+ 'module': module_path,
84
+ 'available': False,
85
+ 'reason': str(e),
86
+ 'dependencies': ["❌ Module not found"]
87
+ })
88
+
89
+ return drivers
90
+
91
+
92
+ def handle_list_drivers(args=None):
93
+ """List all available LLM drivers with their status and dependencies."""
94
+ drivers = get_driver_info()
95
+
96
+ if not drivers:
97
+ console.print("[red]No drivers found[/red]")
98
+ return
99
+
100
+ # Create table
101
+ table = Table(title="Available LLM Drivers")
102
+ table.add_column("Driver", style="cyan", no_wrap=True)
103
+ table.add_column("Status", style="bold")
104
+ table.add_column("Dependencies", style="yellow")
105
+
106
+ for driver in drivers:
107
+ name = driver['name']
108
+
109
+ if driver['available']:
110
+ status = "[green]✅ Available[/green]"
111
+ if driver['reason']:
112
+ status = f"[yellow]⚠️ Available ({driver['reason']})[/yellow]"
113
+ else:
114
+ status = f"[red]❌ Unavailable[/red]"
115
+ if driver['reason']:
116
+ status = f"[red]❌ {driver['reason']}[/red]"
117
+
118
+ deps = "\n".join(driver['dependencies'])
119
+
120
+ table.add_row(name, status, deps)
121
+
122
+ console.print(table)
123
+
124
+ # Installation help
125
+ # Get unique missing dependencies
126
+ missing_deps = set()
127
+ for driver in drivers:
128
+ for dep_status in driver['dependencies']:
129
+ if dep_status.startswith('❌'):
130
+ missing_deps.add(dep_status[2:].strip())
131
+
132
+ if missing_deps:
133
+ console.print(f"\n[dim]💡 Install missing deps: pip install {' '.join(sorted(missing_deps))}[/dim]")
134
+
135
+
136
+ if __name__ == "__main__":
137
+ handle_list_drivers()
@@ -7,6 +7,7 @@ from janito.cli.cli_commands.list_models import handle_list_models
7
7
  from janito.cli.cli_commands.list_tools import handle_list_tools
8
8
  from janito.cli.cli_commands.show_config import handle_show_config
9
9
  from janito.cli.cli_commands.list_config import handle_list_config
10
+ from janito.cli.cli_commands.list_drivers import handle_list_drivers
10
11
  from functools import partial
11
12
  from janito.provider_registry import ProviderRegistry
12
13
 
@@ -17,6 +18,7 @@ GETTER_KEYS = [
17
18
  "list_models",
18
19
  "list_tools",
19
20
  "list_config",
21
+ "list_drivers",
20
22
  ]
21
23
 
22
24
 
@@ -42,7 +44,10 @@ def handle_getter(args, config_mgr=None):
42
44
  "list_profiles": partial(handle_list_profiles, args),
43
45
  "show_config": partial(handle_show_config, args),
44
46
  "list_config": partial(handle_list_config, args),
47
+ "list_drivers": partial(handle_list_drivers, args),
45
48
  }
46
49
  for arg in GETTER_KEYS:
47
50
  if getattr(args, arg, False) and arg in GETTER_DISPATCH:
48
- return GETTER_DISPATCH[arg]()
51
+ GETTER_DISPATCH[arg]()
52
+ import sys
53
+ sys.exit(0)
@@ -117,6 +117,10 @@ definition = [
117
117
  ["--list-providers"],
118
118
  {"action": "store_true", "help": "List supported LLM providers"},
119
119
  ),
120
+ (
121
+ ["--list-drivers"],
122
+ {"action": "store_true", "help": "List available LLM drivers and their dependencies"},
123
+ ),
120
124
  (
121
125
  ["-l", "--list-models"],
122
126
  {"action": "store_true", "help": "List all supported models"},
@@ -206,6 +210,7 @@ GETTER_KEYS = [
206
210
  "list_models",
207
211
  "list_tools",
208
212
  "list_config",
213
+ "list_drivers",
209
214
  ]
210
215
 
211
216
 
@@ -321,14 +326,8 @@ class JanitoCLI:
321
326
  if run_mode == RunMode.SET:
322
327
  if self._run_set_mode():
323
328
  return
324
- # Special handling: provider is not required for list_providers, list_tools, show_config
325
- if run_mode == RunMode.GET and (
326
- self.args.list_providers
327
- or self.args.list_tools
328
- or self.args.list_profiles
329
- or self.args.show_config
330
- or self.args.list_config
331
- ):
329
+ # Special handling: provider is not required for list_providers, list_tools, show_config, list_drivers
330
+ if run_mode == RunMode.GET:
332
331
  self._maybe_print_verbose_provider_model()
333
332
  handle_getter(self.args)
334
333
  return
@@ -364,8 +363,7 @@ class JanitoCLI:
364
363
  agent_role,
365
364
  verbose_tools=self.args.verbose_tools,
366
365
  )
367
- elif run_mode == RunMode.GET:
368
- handle_getter(self.args)
366
+
369
367
 
370
368
  def _run_set_mode(self):
371
369
  if handle_api_key_set(self.args):
@@ -12,10 +12,18 @@ from janito.llm.driver_input import DriverInput
12
12
  from janito.driver_events import RequestFinished, RequestStatus, RateLimitRetry
13
13
  from janito.llm.message_parts import TextMessagePart, FunctionCallMessagePart
14
14
 
15
- import openai
15
+ try:
16
+ import openai
17
+ available = True
18
+ unavailable_reason = None
19
+ except ImportError:
20
+ available = False
21
+ unavailable_reason = "openai module not installed"
16
22
 
17
23
 
18
24
  class ZAIModelDriver(LLMDriver):
25
+ available = available
26
+ unavailable_reason = unavailable_reason
19
27
  def _get_message_from_result(self, result):
20
28
  """Extract the message object from the provider result (Z.AI-specific)."""
21
29
  if hasattr(result, "choices") and result.choices:
@@ -52,15 +60,15 @@ class ZAIModelDriver(LLMDriver):
52
60
  # Z.AI-specific parameters
53
61
  if config.model:
54
62
  api_kwargs["model"] = config.model
55
- # Prefer max_completion_tokens if present, else fallback to max_tokens (for backward compatibility)
56
- if (
63
+ # Use max_tokens for Z.ai SDK compatibility
64
+ if hasattr(config, "max_tokens") and config.max_tokens is not None:
65
+ api_kwargs["max_tokens"] = int(config.max_tokens)
66
+ elif (
57
67
  hasattr(config, "max_completion_tokens")
58
68
  and config.max_completion_tokens is not None
59
69
  ):
60
- api_kwargs["max_completion_tokens"] = int(config.max_completion_tokens)
61
- elif hasattr(config, "max_tokens") and config.max_tokens is not None:
62
- # For models that do not support 'max_tokens', map to 'max_completion_tokens'
63
- api_kwargs["max_completion_tokens"] = int(config.max_tokens)
70
+ # Fallback to max_completion_tokens if max_tokens not set
71
+ api_kwargs["max_tokens"] = int(config.max_completion_tokens)
64
72
  for p in (
65
73
  "temperature",
66
74
  "top_p",
@@ -260,10 +268,6 @@ class ZAIModelDriver(LLMDriver):
260
268
  api_key_display = str(config.api_key)
261
269
  if api_key_display and len(api_key_display) > 8:
262
270
  api_key_display = api_key_display[:4] + "..." + api_key_display[-4:]
263
- client_kwargs = {
264
- "api_key": config.api_key,
265
- "base_url": "https://api.z.ai/api/paas/v4",
266
- }
267
271
 
268
272
  # HTTP debug wrapper
269
273
  if os.environ.get("ZAI_DEBUG_HTTP", "0") == "1":
@@ -280,7 +284,14 @@ class ZAIModelDriver(LLMDriver):
280
284
  flush=True,
281
285
  )
282
286
 
283
- client = openai.OpenAI(**client_kwargs)
287
+ # Use OpenAI SDK for Z.AI API compatibility
288
+ try:
289
+ import openai
290
+ except ImportError:
291
+ raise ImportError("openai module is not available. Please install it with: pip install openai")
292
+ client = openai.OpenAI(
293
+ api_key=config.api_key, base_url="https://api.z.ai/api/paas/v4/"
294
+ )
284
295
  return client
285
296
  except Exception as e:
286
297
  print(
@@ -18,15 +18,15 @@ MODEL_SPECS = {
18
18
  "output_cost_per_1k": 0.0015,
19
19
  },
20
20
  ),
21
- "glm-4": LLMModelInfo(
22
- name="glm-4",
21
+ "glm-4.5-air": LLMModelInfo(
22
+ name="glm-4.5-air",
23
23
  context=128000,
24
24
  max_input=128000,
25
- max_cot="N/A",
25
+ max_cot=4096,
26
26
  max_response=4096,
27
- thinking_supported=False,
27
+ thinking_supported=True,
28
28
  other={
29
- "description": "Z.AI's GLM-4 model for general purpose tasks",
29
+ "description": "Z.AI's GLM-4.5-Air model - compact and efficient version",
30
30
  "supports_tools": True,
31
31
  "supports_images": True,
32
32
  "supports_audio": False,
@@ -35,21 +35,4 @@ MODEL_SPECS = {
35
35
  "output_cost_per_1k": 0.0009,
36
36
  },
37
37
  ),
38
- "glm-4v": LLMModelInfo(
39
- name="glm-4v",
40
- context=128000,
41
- max_input=128000,
42
- max_cot="N/A",
43
- max_response=4096,
44
- thinking_supported=False,
45
- other={
46
- "description": "Z.AI's GLM-4V vision model for image understanding",
47
- "supports_tools": True,
48
- "supports_images": True,
49
- "supports_audio": False,
50
- "supports_video": False,
51
- "input_cost_per_1k": 0.0004,
52
- "output_cost_per_1k": 0.0012,
53
- },
54
- ),
55
38
  }
@@ -17,7 +17,7 @@ class ZAIProvider(LLMProvider):
17
17
  NAME = "zai"
18
18
  MAINTAINER = "João Pinto <janito@ikignosis.org>"
19
19
  MODEL_SPECS = MODEL_SPECS
20
- DEFAULT_MODEL = "glm-4.5" # Options: glm-4.5, glm-4, glm-4v
20
+ DEFAULT_MODEL = "glm-4.5" # Options: glm-4.5, glm-4.5-air
21
21
 
22
22
  def __init__(
23
23
  self, auth_manager: LLMAuthManager = None, config: LLMDriverConfig = None
@@ -33,6 +33,8 @@ class ZAIProvider(LLMProvider):
33
33
  # crash with an AttributeError when it tries to access `self._tools_adapter`.
34
34
  self._tools_adapter = get_local_tools_adapter()
35
35
  self._driver = None
36
+ # Initialize _driver_config to avoid AttributeError
37
+ self._driver_config = LLMDriverConfig(model=None)
36
38
 
37
39
  def _setup_available(self, auth_manager, config):
38
40
  self.auth_manager = auth_manager or LLMAuthManager()
@@ -43,6 +45,7 @@ class ZAIProvider(LLMProvider):
43
45
  )
44
46
  print(f" janito --set-api-key YOUR_API_KEY -p {self.name}")
45
47
  print(f"Or set the ZAI_API_KEY environment variable.")
48
+ self._tools_adapter = get_local_tools_adapter()
46
49
  return
47
50
 
48
51
  self._tools_adapter = get_local_tools_adapter()
@@ -4,7 +4,7 @@ Generate OpenAI-compatible tool schemas for Z.AI API.
4
4
 
5
5
  import inspect
6
6
  from typing import get_type_hints, Dict, Any, Optional, List, Union
7
- from janito.tools import Tool
7
+ from janito.tools.tool_base import ToolBase
8
8
 
9
9
 
10
10
  def generate_tool_schemas(tool_classes):
@@ -35,14 +35,16 @@ def generate_tool_schema(tool_class):
35
35
  Returns:
36
36
  OpenAI-compatible tool schema dict
37
37
  """
38
- if not issubclass(tool_class, Tool):
38
+ if not issubclass(tool_class, ToolBase):
39
39
  return None
40
40
 
41
41
  tool_instance = tool_class()
42
42
 
43
- # Get the execute method
43
+ # Get the execute or run method
44
44
  execute_method = getattr(tool_class, "execute", None)
45
- if not execute_method:
45
+ if execute_method is None:
46
+ execute_method = getattr(tool_class, "run", None)
47
+ if execute_method is None:
46
48
  return None
47
49
 
48
50
  # Get method signature and type hints
@@ -78,7 +80,7 @@ def generate_tool_schema(tool_class):
78
80
  schema = {
79
81
  "type": "function",
80
82
  "function": {
81
- "name": tool_class.__name__,
83
+ "name": getattr(tool_instance, "tool_name", tool_class.__name__),
82
84
  "description": getattr(
83
85
  tool_instance, "description", f"Execute {tool_class.__name__}"
84
86
  ),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 2.12.0
3
+ Version: 2.15.0
4
4
  Summary: A new Python package called janito.
5
5
  Author-email: João Pinto <janito@ikignosis.org>
6
6
  Project-URL: Homepage, https://github.com/ikignosis/janito
@@ -37,6 +37,7 @@ docs/supported-providers-models.md
37
37
  docs/tools-index.md
38
38
  docs/tools-natural-results.md
39
39
  docs/tools-precision.md
40
+ docs/z-ai-setup.md
40
41
  docs/about/costs.md
41
42
  docs/about/vs-webchats.md
42
43
  docs/about/why.md
@@ -159,6 +160,7 @@ janito/cli/chat_mode/shell/session/__init__.py
159
160
  janito/cli/chat_mode/shell/session/history.py
160
161
  janito/cli/chat_mode/shell/session/manager.py
161
162
  janito/cli/cli_commands/list_config.py
163
+ janito/cli/cli_commands/list_drivers.py
162
164
  janito/cli/cli_commands/list_models.py
163
165
  janito/cli/cli_commands/list_profiles.py
164
166
  janito/cli/cli_commands/list_providers.py
@@ -179,7 +181,6 @@ janito/cli/single_shot_mode/__init__.py
179
181
  janito/cli/single_shot_mode/handler.py
180
182
  janito/docs/GETTING_STARTED.md
181
183
  janito/drivers/dashscope.bak.zip
182
- janito/drivers/driver_registry.py
183
184
  janito/drivers/openai_responses.bak.zip
184
185
  janito/drivers/azure_openai/driver.py
185
186
  janito/drivers/openai/README.md
@@ -37,6 +37,7 @@ nav:
37
37
  - Overview: supported-providers-models.md
38
38
  - DeepSeek Setup: deepseek-setup.md
39
39
  - MoonshotAI Setup: moonshotai-setup.md
40
+ - Z.ai Setup: z-ai-setup.md
40
41
  - Concepts:
41
42
  - Overview: concepts/index.md
42
43
  - What Is a Language Model Client?: concepts/language-model-clients.md