kolega-code 0.8.4__tar.gz → 0.9.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 (402) hide show
  1. {kolega_code-0.8.4 → kolega_code-0.9.0}/.env.example +1 -0
  2. {kolega_code-0.8.4 → kolega_code-0.9.0}/CHANGELOG.md +10 -0
  3. {kolega_code-0.8.4 → kolega_code-0.9.0}/PKG-INFO +1 -1
  4. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/configuration/environment-variables.md +7 -0
  5. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/configuration/providers-and-models.mdx +12 -0
  6. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/__init__.py +1 -1
  7. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/__init__.py +1 -1
  8. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/app.py +20 -3
  9. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/config.py +2 -0
  10. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/messages.py +6 -0
  11. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/provider_registry.py +33 -0
  12. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/agent_runtime.py +0 -3
  13. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/status_dashboard.py +7 -2
  14. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/config.py +3 -0
  15. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/client.py +2 -0
  16. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/exceptions.py +1 -0
  17. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/models.py +7 -4
  18. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/providers/openai.py +3 -1
  19. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/specs.py +321 -0
  20. {kolega_code-0.8.4 → kolega_code-0.9.0}/pyproject.toml +1 -1
  21. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_live_providers.py +69 -0
  22. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_openai_message_conversion.py +92 -0
  23. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_provider_usage_mapping.py +9 -0
  24. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_bootstrap_settings.py +26 -6
  25. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_cli_config.py +34 -0
  26. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_settings.py +19 -0
  27. {kolega_code-0.8.4 → kolega_code-0.9.0}/uv.lock +2 -2
  28. {kolega_code-0.8.4 → kolega_code-0.9.0}/.githooks/pre-commit +0 -0
  29. {kolega_code-0.8.4 → kolega_code-0.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  30. {kolega_code-0.8.4 → kolega_code-0.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  31. {kolega_code-0.8.4 → kolega_code-0.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  32. {kolega_code-0.8.4 → kolega_code-0.9.0}/.github/workflows/ci.yml +0 -0
  33. {kolega_code-0.8.4 → kolega_code-0.9.0}/.github/workflows/docs.yml +0 -0
  34. {kolega_code-0.8.4 → kolega_code-0.9.0}/.github/workflows/release.yml +0 -0
  35. {kolega_code-0.8.4 → kolega_code-0.9.0}/.gitignore +0 -0
  36. {kolega_code-0.8.4 → kolega_code-0.9.0}/.pre-commit-config.yaml +0 -0
  37. {kolega_code-0.8.4 → kolega_code-0.9.0}/CONTRIBUTING.md +0 -0
  38. {kolega_code-0.8.4 → kolega_code-0.9.0}/LICENSE +0 -0
  39. {kolega_code-0.8.4 → kolega_code-0.9.0}/README.md +0 -0
  40. {kolega_code-0.8.4 → kolega_code-0.9.0}/RELEASING.md +0 -0
  41. {kolega_code-0.8.4 → kolega_code-0.9.0}/SECURITY.md +0 -0
  42. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/.gitignore +0 -0
  43. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/README.md +0 -0
  44. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/astro.config.mjs +0 -0
  45. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/package-lock.json +0 -0
  46. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/package.json +0 -0
  47. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/public/favicon.svg +0 -0
  48. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/assets/coverage.svg +0 -0
  49. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/assets/demo.gif +0 -0
  50. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/assets/kolega-dark.svg +0 -0
  51. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/assets/kolega-light.svg +0 -0
  52. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/cli/ask.md +0 -0
  53. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/cli/doctor.md +0 -0
  54. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/cli/overview.md +0 -0
  55. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/cli/sessions.md +0 -0
  56. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/concepts/agents.md +0 -0
  57. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/concepts/how-it-works.md +0 -0
  58. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/concepts/tools.md +0 -0
  59. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/configuration/settings-and-api-keys.mdx +0 -0
  60. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/configuration/sign-in-with-chatgpt.mdx +0 -0
  61. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/getting-started/installation.mdx +0 -0
  62. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/getting-started/quick-start.mdx +0 -0
  63. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/gigacode.mdx +0 -0
  64. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/hooks.md +0 -0
  65. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/index.mdx +0 -0
  66. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/skills.mdx +0 -0
  67. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/tui/composer.md +0 -0
  68. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/tui/interface.md +0 -0
  69. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/tui/modes.md +0 -0
  70. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/tui/sessions-and-resume.md +0 -0
  71. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content/docs/tui/slash-commands.md +0 -0
  72. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/content.config.ts +0 -0
  73. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/src/styles/brand.css +0 -0
  74. {kolega_code-0.8.4 → kolega_code-0.9.0}/docs/tsconfig.json +0 -0
  75. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/baseagent.py +0 -0
  76. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/browseragent.py +0 -0
  77. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/coder.py +0 -0
  78. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/common.py +0 -0
  79. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/compression.py +0 -0
  80. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/context.py +0 -0
  81. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/conversation.py +0 -0
  82. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/errors.py +0 -0
  83. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/generalagent.py +0 -0
  84. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/investigationagent.py +0 -0
  85. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  86. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/orchestration/budget.py +0 -0
  87. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/orchestration/errors.py +0 -0
  88. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/orchestration/executor.py +0 -0
  89. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/orchestration/guide.py +0 -0
  90. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/orchestration/journal.py +0 -0
  91. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  92. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/orchestration/types.py +0 -0
  93. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/planningagent.py +0 -0
  94. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_provider.py +0 -0
  95. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  96. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  97. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  98. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  99. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +0 -0
  100. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  101. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  102. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  103. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  104. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  105. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  106. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  107. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  108. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  109. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  110. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  111. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  112. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  113. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  114. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  115. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  116. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  117. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/prompts.py +0 -0
  118. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  119. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  120. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  121. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  122. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/create_file_tool.py +0 -0
  123. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  124. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/glob_tool.py +0 -0
  125. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/list_directory_tool.py +0 -0
  126. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  127. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  128. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  129. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/replace_entire_file_tool.py +0 -0
  130. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/replace_lines_tool.py +0 -0
  131. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_and_replace_tool.py +0 -0
  132. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  133. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  134. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  135. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  136. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  137. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  138. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  139. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  140. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/search_codebase_tool.py +0 -0
  141. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  142. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  143. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/think_hard_tool.py +0 -0
  144. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  145. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  146. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  147. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/tools.py +0 -0
  148. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/agent/utils/commands.py +0 -0
  149. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/auth/__init__.py +0 -0
  150. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/auth/_jwt.py +0 -0
  151. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  152. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/auth/constants.py +0 -0
  153. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/auth/tokens.py +0 -0
  154. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/__init__.py +0 -0
  155. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/clipboard_image.py +0 -0
  156. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/connection.py +0 -0
  157. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/file_index.py +0 -0
  158. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/main.py +0 -0
  159. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/mentions.py +0 -0
  160. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/session_store.py +0 -0
  161. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/settings.py +0 -0
  162. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/skills.py +0 -0
  163. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/slash_commands.py +0 -0
  164. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/theme.py +0 -0
  165. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/__init__.py +0 -0
  166. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/command_handlers.py +0 -0
  167. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/constants.py +0 -0
  168. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  169. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/settings_panel.py +0 -0
  170. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/state.py +0 -0
  171. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/styles.tcss +0 -0
  172. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  173. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/transcript.py +0 -0
  174. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/tui/widgets.py +0 -0
  175. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/cli/updater.py +0 -0
  176. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/events.py +0 -0
  177. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/hooks/__init__.py +0 -0
  178. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/hooks/backends.py +0 -0
  179. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/hooks/config.py +0 -0
  180. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/hooks/dispatcher.py +0 -0
  181. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/hooks/events.py +0 -0
  182. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/hooks/matcher.py +0 -0
  183. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/hooks/outcome.py +0 -0
  184. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/instrumented_client.py +0 -0
  185. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/providers/__init__.py +0 -0
  186. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/providers/anthropic.py +0 -0
  187. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/providers/base.py +0 -0
  188. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  189. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/providers/google.py +0 -0
  190. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/providers/models.py +0 -0
  191. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  192. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/providers/responses_common.py +0 -0
  193. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/ratelimit.py +0 -0
  194. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  195. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/local_state.py +0 -0
  196. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/models/__init__.py +0 -0
  197. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  198. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/permissions.py +0 -0
  199. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/runtime.py +0 -0
  200. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/README.md +0 -0
  201. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/__init__.py +0 -0
  202. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  203. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/base.py +0 -0
  204. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/browser.py +0 -0
  205. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/event_loop.py +0 -0
  206. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/filesystem.py +0 -0
  207. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/local.py +0 -0
  208. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/serializer.py +0 -0
  209. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/terminal.py +0 -0
  210. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/sandbox/utils.py +0 -0
  211. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/services/base.py +0 -0
  212. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/services/browser.py +0 -0
  213. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/services/file_system.py +0 -0
  214. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/services/html.py +0 -0
  215. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/services/terminal.py +0 -0
  216. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/services/terminal_buffer.py +0 -0
  217. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/tools/__init__.py +0 -0
  218. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/tools/core.py +0 -0
  219. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/tools/definitions.py +0 -0
  220. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/tools/registry.py +0 -0
  221. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/utils/__init__.py +0 -0
  222. {kolega_code-0.8.4 → kolega_code-0.9.0}/kolega_code/utils/images.py +0 -0
  223. {kolega_code-0.8.4 → kolega_code-0.9.0}/run_tests.sh +0 -0
  224. {kolega_code-0.8.4 → kolega_code-0.9.0}/scripts/check-dev-hooks.sh +0 -0
  225. {kolega_code-0.8.4 → kolega_code-0.9.0}/scripts/install-kolega-code.sh +0 -0
  226. {kolega_code-0.8.4 → kolega_code-0.9.0}/scripts/setup-dev.sh +0 -0
  227. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/__init__.py +0 -0
  228. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/__init__.py +0 -0
  229. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/compaction_helpers.py +0 -0
  230. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/conftest.py +0 -0
  231. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/__init__.py +0 -0
  232. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/_token_counting_utils.py +0 -0
  233. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_anthropic_token_counting.py +0 -0
  234. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_billing_openai_cache.py +0 -0
  235. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_chatgpt_live.py +0 -0
  236. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_chatgpt_oauth_auth_config.py +0 -0
  237. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_chatgpt_oauth_conversion.py +0 -0
  238. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_chatgpt_oauth_provider.py +0 -0
  239. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_chatgpt_oauth_provider_generate.py +0 -0
  240. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_chatgpt_oauth_streaming.py +0 -0
  241. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_client.py +0 -0
  242. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_client_live.py +0 -0
  243. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_client_runtime.py +0 -0
  244. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_dashscope_mapping.py +0 -0
  245. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_error_boundary.py +0 -0
  246. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_exceptions.py +0 -0
  247. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_google_thought_signature.py +0 -0
  248. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_google_tool_signature_live.py +0 -0
  249. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_instrumented_client.py +0 -0
  250. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_instrumented_client_integration.py +0 -0
  251. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_instrumented_client_stream.py +0 -0
  252. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_langfuse_normalization.py +0 -0
  253. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_message_conversion.py +0 -0
  254. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_model_specs.py +0 -0
  255. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_openai_cached_tokens.py +0 -0
  256. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_openai_cached_tokens_stream.py +0 -0
  257. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_openai_responses_provider.py +0 -0
  258. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_openai_token_counting.py +0 -0
  259. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_supports_vision.py +0 -0
  260. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_thinking_effort.py +0 -0
  261. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/llm/test_tool_execution_ids.py +0 -0
  262. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/orchestration/__init__.py +0 -0
  263. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/orchestration/test_orchestration.py +0 -0
  264. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/__init__.py +0 -0
  265. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_browser.py +0 -0
  266. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_browser_console_logs.py +0 -0
  267. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_browser_content.py +0 -0
  268. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_browser_integration.py +0 -0
  269. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_browser_parity.py +0 -0
  270. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_file_system.py +0 -0
  271. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_file_system_integration.py +0 -0
  272. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_file_system_path.py +0 -0
  273. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_local_file_system.py +0 -0
  274. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_sandbox_terminal_input.py +0 -0
  275. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_terminal.py +0 -0
  276. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_terminal_buffer.py +0 -0
  277. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/services/test_terminal_state_serializer.py +0 -0
  278. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_agent_tools_inventory.py +0 -0
  279. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent.py +0 -0
  280. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_anthropic_history_validation.py +0 -0
  281. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_compaction.py +0 -0
  282. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_effective_history.py +0 -0
  283. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_history_serialization.py +0 -0
  284. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_prompt_context.py +0 -0
  285. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_role_overrides.py +0 -0
  286. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_runtime.py +0 -0
  287. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_tool_call_repair.py +0 -0
  288. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_tool_call_repair_integration.py +0 -0
  289. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_base_agent_tool_execution.py +0 -0
  290. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_coder_attachments.py +0 -0
  291. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_coder_prompt_extensions.py +0 -0
  292. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_commands.py +0 -0
  293. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_compaction_integration.py +0 -0
  294. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_compaction_persistence.py +0 -0
  295. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_compaction_subagent.py +0 -0
  296. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_compaction_tui_events.py +0 -0
  297. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_compress_command.py +0 -0
  298. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_compression.py +0 -0
  299. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_conversation_compaction.py +0 -0
  300. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_duplicate_tool_results.py +0 -0
  301. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_empty_message_handling.py +0 -0
  302. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_event_emitter.py +0 -0
  303. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_general_agent.py +0 -0
  304. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_gigacode_gating.py +0 -0
  305. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_history_adapter_thinking.py +0 -0
  306. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_history_image_blocks.py +0 -0
  307. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_hooks_integration.py +0 -0
  308. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_html.py +0 -0
  309. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_image_compat.py +0 -0
  310. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_parallel_tool_calls.py +0 -0
  311. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_permissions.py +0 -0
  312. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_planning_agent.py +0 -0
  313. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_prompt_provider.py +0 -0
  314. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_prompts.py +0 -0
  315. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_read_image_tool.py +0 -0
  316. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_tool_collection_builtin_dispatch.py +0 -0
  317. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_tool_collection_config.py +0 -0
  318. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_tool_collection_extensions.py +0 -0
  319. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_tool_collection_initialization.py +0 -0
  320. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_tool_collection_memory.py +0 -0
  321. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_tool_registry.py +0 -0
  322. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/test_tools.py +0 -0
  323. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/__init__.py +0 -0
  324. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_agent_tool.py +0 -0
  325. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_base_tool.py +0 -0
  326. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_browser_tool.py +0 -0
  327. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_build_tool.py +0 -0
  328. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_create_file_tool.py +0 -0
  329. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_edit_preview.py +0 -0
  330. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_glob_tool.py +0 -0
  331. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_glob_tool_sandbox_parity.py +0 -0
  332. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_list_directory_tool.py +0 -0
  333. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_read_file_tool.py +0 -0
  334. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_replace_entire_file_tool.py +0 -0
  335. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_replace_lines_tool.py +0 -0
  336. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_search_and_replace_tool.py +0 -0
  337. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_search_codebase_tool.py +0 -0
  338. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_terminal_tool.py +0 -0
  339. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_think_hard_integration.py +0 -0
  340. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_think_hard_streaming.py +0 -0
  341. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_think_hard_streaming_content.py +0 -0
  342. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_think_hard_streaming_errors.py +0 -0
  343. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_think_hard_streaming_updates.py +0 -0
  344. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_web_fetch_tool.py +0 -0
  345. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_web_search_tool.py +0 -0
  346. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/agent/tool_backend/test_workflow_tool.py +0 -0
  347. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/auth/__init__.py +0 -0
  348. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/auth/test_chatgpt_oauth.py +0 -0
  349. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/auth/test_tokens.py +0 -0
  350. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/__init__.py +0 -0
  351. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/_app_test_utils.py +0 -0
  352. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app.py +0 -0
  353. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_agent_wiring.py +0 -0
  354. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_compaction_restore.py +0 -0
  355. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_composer_commands.py +0 -0
  356. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_composer_input.py +0 -0
  357. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_conversation_rendering.py +0 -0
  358. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_focus_behavior.py +0 -0
  359. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_image_vision_warning.py +0 -0
  360. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_mention_dropdown.py +0 -0
  361. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_misc_commands.py +0 -0
  362. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_model_effort_commands.py +0 -0
  363. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_model_switch_vision.py +0 -0
  364. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_modes_planning.py +0 -0
  365. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_navigation_commands.py +0 -0
  366. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_permission_prompts.py +0 -0
  367. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_persistence_history.py +0 -0
  368. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_plan_lifecycle.py +0 -0
  369. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_planning_questions.py +0 -0
  370. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_planning_restore.py +0 -0
  371. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_rendering_entries.py +0 -0
  372. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_rendering_errors.py +0 -0
  373. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_rendering_scroll.py +0 -0
  374. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_rendering_selection.py +0 -0
  375. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_rendering_status.py +0 -0
  376. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_rendering_streaming.py +0 -0
  377. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_rendering_terminal_logs.py +0 -0
  378. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_rendering_tools.py +0 -0
  379. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_skill_commands.py +0 -0
  380. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_slash_dropdown.py +0 -0
  381. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_status_modes.py +0 -0
  382. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_app_sub_agents_workflows.py +0 -0
  383. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_clipboard_image.py +0 -0
  384. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_connection.py +0 -0
  385. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_file_index.py +0 -0
  386. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_main.py +0 -0
  387. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_mentions.py +0 -0
  388. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_provider_registry.py +0 -0
  389. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_session_store.py +0 -0
  390. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_skills.py +0 -0
  391. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_slash_commands.py +0 -0
  392. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_themes.py +0 -0
  393. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_tui_stylesheet.py +0 -0
  394. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/cli/test_updater.py +0 -0
  395. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/conftest.py +0 -0
  396. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/hooks/__init__.py +0 -0
  397. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/hooks/test_hooks.py +0 -0
  398. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/tools/__init__.py +0 -0
  399. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/tools/test_definitions.py +0 -0
  400. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/utils/__init__.py +0 -0
  401. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/utils/test_images.py +0 -0
  402. {kolega_code-0.8.4 → kolega_code-0.9.0}/tests/utils/test_images_ascii.py +0 -0
@@ -12,6 +12,7 @@ MOONSHOT_API_KEY=
12
12
  DEEPSEEK_API_KEY=
13
13
  ZAI_API_KEY=
14
14
  KIMI_CODING_API_KEY=
15
+ OLLAMA_API_KEY=
15
16
 
16
17
  KOLEGA_CODE_THINKING_EFFORT=
17
18
 
@@ -6,6 +6,16 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.9.0 - 2026-06-24
10
+
11
+ ### Added
12
+
13
+ - Added Ollama Cloud as a supported provider, including its model catalog and reasoning-field capture.
14
+
15
+ ### Fixed
16
+
17
+ - Clarified the disconnected state shown on first run when no provider is configured.
18
+
9
19
  ## 0.8.4 - 2026-06-24
10
20
 
11
21
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.8.4
3
+ Version: 0.9.0
4
4
  Summary: Local-first AI coding agent for the terminal
5
5
  Project-URL: Homepage, https://kolega-ai.github.io/kolega-code/
6
6
  Project-URL: Documentation, https://kolega-ai.github.io/kolega-code/
@@ -46,12 +46,14 @@ provider or model.
46
46
  | `DEEPSEEK_API_KEY` | DeepSeek |
47
47
  | `ZAI_API_KEY` | Z.AI (GLM Coding Plan) |
48
48
  | `KIMI_CODING_API_KEY` | Kimi Coding Plan |
49
+ | `OLLAMA_API_KEY` | Ollama Cloud |
49
50
 
50
51
  The local `llama` provider needs no key. The `zai` key authenticates against Z.AI's
51
52
  Anthropic-compatible endpoint (it is the key Z.AI also documents as `ANTHROPIC_AUTH_TOKEN`).
52
53
  The `kimi_coding` key authenticates against the Kimi Coding Plan's separate
53
54
  Anthropic-compatible endpoint (`https://api.kimi.com/coding/`), which is distinct from the
54
55
  standard Moonshot API used by the `moonshot` provider.
56
+ The `OLLAMA_API_KEY` key authenticates against Ollama Cloud's direct API (`https://ollama.com/v1` for OpenAI-compatible requests).
55
57
 
56
58
  ## Model selection
57
59
 
@@ -120,6 +122,7 @@ MOONSHOT_API_KEY=
120
122
  DEEPSEEK_API_KEY=
121
123
  FIREWORKS_API_KEY=
122
124
  ANTHROPIC_API_KEY=
125
+ OLLAMA_API_KEY=
123
126
 
124
127
  # Optional: choose models per role
125
128
  KOLEGA_CODE_PROVIDER=moonshot
@@ -130,6 +133,10 @@ KOLEGA_CODE_THINKING_EFFORT=auto
130
133
  # KOLEGA_CODE_PROVIDER=fireworks
131
134
  # KOLEGA_CODE_MODEL=accounts/fireworks/models/glm-5p2
132
135
 
136
+ # Ollama Cloud example:
137
+ # KOLEGA_CODE_PROVIDER=ollama_cloud
138
+ # KOLEGA_CODE_MODEL=glm-5.2
139
+
133
140
  # Optional: web search
134
141
  KOLEGA_CODE_WEB_SEARCH_BACKEND=duckduckgo
135
142
 
@@ -27,6 +27,7 @@ The agent runtime recognizes these providers:
27
27
  | DeepSeek | `deepseek` | `DEEPSEEK_API_KEY` |
28
28
  | Z.AI (GLM Coding Plan) | `zai` | `ZAI_API_KEY` |
29
29
  | Kimi Coding Plan | `kimi_coding` | `KIMI_CODING_API_KEY` |
30
+ | Ollama Cloud | `ollama_cloud` | `OLLAMA_API_KEY` |
30
31
  | Llama (local) | `llama` | _none — local model_ |
31
32
 
32
33
  <Aside type="tip">
@@ -45,6 +46,15 @@ with thinking effort `auto` (enabled) requests route to **K2.7 Code**, and with
45
46
  (disabled) they route to **K2.6**. Set `KIMI_CODING_API_KEY` to your Kimi Coding Plan key.
46
47
  </Aside>
47
48
 
49
+ <Aside type="tip">
50
+ **Ollama Cloud.** The `ollama_cloud` provider uses Ollama Cloud's direct
51
+ OpenAI-compatible API at `https://ollama.com/v1` with `OLLAMA_API_KEY`. Kolega
52
+ Code uses the direct API model IDs returned by Ollama, such as **`glm-5.2`** and
53
+ **`gpt-oss:120b`**, rather than local Ollama aliases such as `:cloud` or
54
+ `-cloud`. Ollama may deprecate or retire older cloud models, so the supported
55
+ model catalog should be refreshed periodically from Ollama's model library/API.
56
+ </Aside>
57
+
48
58
  <Aside type="tip">
49
59
  **Fireworks.ai.** The `fireworks` provider targets Fireworks' OpenAI-compatible
50
60
  serverless endpoint (`https://api.fireworks.ai/inference/v1`) with `FIREWORKS_API_KEY`.
@@ -164,6 +174,8 @@ models in the TUI.
164
174
  | Z.AI `glm-5.2` | `high`, `max` | `max` |
165
175
  | Z.AI `glm-5.1` | `auto`, `none` | `auto` |
166
176
  | Fireworks serverless reasoning models | `none`, `low`, `medium`, `high`, `max` | `medium` |
177
+ | Ollama Cloud thinking models | `none`, `low`, `medium`, `high`, `max` | `medium` |
178
+ | Ollama Cloud `gpt-oss:*` | `low`, `medium`, `high` | `medium` |
167
179
  | Google `gemini-2.5-pro` | `auto`, `low`, `medium`, `high` | `medium` |
168
180
  | OpenAI reasoning models | `low`, `medium`, `high` | `medium` |
169
181
 
@@ -151,4 +151,4 @@ __all__ = [
151
151
  "parse_git_status_output",
152
152
  ]
153
153
 
154
- __version__ = "0.8.4"
154
+ __version__ = "0.9.0"
@@ -44,4 +44,4 @@ __all__ = [
44
44
  "ToolExtension",
45
45
  ]
46
46
 
47
- __version__ = "0.8.4"
47
+ __version__ = "0.9.0"
@@ -714,6 +714,9 @@ class KolegaCodeApp(
714
714
  if not stripped_text or self.agent is None:
715
715
  if stripped_text:
716
716
  self._set_settings_status(messages.SETTINGS_REQUIRED, tone="warning")
717
+ if self.config is None:
718
+ self._set_composer_status(messages.DISCONNECTED_COMPOSER_PLACEHOLDER)
719
+ self._show_composer_hint(messages.DISCONNECTED_ACTIVITY, tone="warning")
717
720
  return
718
721
  # Build attachments first (without clearing pending) so the vision gate
719
722
  # can block before we consume the composer text and pending images.
@@ -1340,6 +1343,10 @@ class KolegaCodeApp(
1340
1343
  def _set_chat_enabled(self, enabled: bool) -> None:
1341
1344
  composer = self.query_one("#composer", tui_widgets.ChatComposer)
1342
1345
  composer.disabled = not enabled or self._plan_decision_active or self._pending_approval is not None
1346
+ if self.config is None and self.agent is None:
1347
+ composer.placeholder = messages.DISCONNECTED_COMPOSER_PLACEHOLDER
1348
+ elif enabled and composer.placeholder == messages.DISCONNECTED_COMPOSER_PLACEHOLDER:
1349
+ composer.placeholder = messages.COMPOSER_PLACEHOLDER
1343
1350
 
1344
1351
  def _set_composer_status(self, status: str) -> None:
1345
1352
  self.query_one("#composer", tui_widgets.ChatComposer).placeholder = status
@@ -1460,10 +1467,19 @@ class KolegaCodeApp(
1460
1467
  if model
1461
1468
  else "not checked until a model is configured"
1462
1469
  )
1463
- return "\n".join(
1470
+ startup_lines = [*tui_constants.STARTUP_WORDMARK, ""]
1471
+ if self.config is None:
1472
+ startup_lines.extend(
1473
+ [
1474
+ messages.DISCONNECTED_HEADLINE,
1475
+ "",
1476
+ messages.DISCONNECTED_STARTUP_GUIDANCE,
1477
+ messages.DISCONNECTED_SIDEBAR_GUIDANCE,
1478
+ "",
1479
+ ]
1480
+ )
1481
+ startup_lines.extend(
1464
1482
  [
1465
- *tui_constants.STARTUP_WORDMARK,
1466
- "",
1467
1483
  f"Project: {self.project_path}",
1468
1484
  f"Session: {session_id}",
1469
1485
  f"Mode: {self.mode}",
@@ -1477,6 +1493,7 @@ class KolegaCodeApp(
1477
1493
  f"Ctrl+C stop turn {theme.g(Glyph.BULLET_SEP)} Cmd+C copy selection {theme.g(Glyph.BULLET_SEP)} / commands",
1478
1494
  ]
1479
1495
  )
1496
+ return "\n".join(startup_lines)
1480
1497
 
1481
1498
  def _startup_model(self) -> tuple[str, str]:
1482
1499
  if self.config is not None:
@@ -49,6 +49,7 @@ API_KEY_ENV = {
49
49
  ModelProvider.DEEPSEEK: "DEEPSEEK_API_KEY",
50
50
  ModelProvider.ZAI: "ZAI_API_KEY",
51
51
  ModelProvider.KIMI_CODING: "KIMI_CODING_API_KEY",
52
+ ModelProvider.OLLAMA_CLOUD: "OLLAMA_API_KEY",
52
53
  }
53
54
 
54
55
  DEFAULT_WEB_SEARCH_BACKEND = "duckduckgo"
@@ -399,6 +400,7 @@ def build_agent_config(
399
400
  deepseek_api_key=_api_key_for_provider(ModelProvider.DEEPSEEK, loaded_env, settings),
400
401
  zai_api_key=_api_key_for_provider(ModelProvider.ZAI, loaded_env, settings),
401
402
  kimi_coding_api_key=_api_key_for_provider(ModelProvider.KIMI_CODING, loaded_env, settings),
403
+ ollama_cloud_api_key=_api_key_for_provider(ModelProvider.OLLAMA_CLOUD, loaded_env, settings),
402
404
  environment=overrides.environment or loaded_env.get("KOLEGA_CODE_ENVIRONMENT", "development"),
403
405
  long_context_config=_model_config(long_provider, long_model, thinking_effort=active_thinking_effort),
404
406
  fast_config=_model_config(fast_provider, fast_model),
@@ -9,6 +9,7 @@ from __future__ import annotations
9
9
 
10
10
  # Composer placeholders and modal prompts
11
11
  COMPOSER_PLACEHOLDER = "Ask Kolega Code..."
12
+ DISCONNECTED_COMPOSER_PLACEHOLDER = "Connect a model in Settings before chatting."
12
13
  PLAN_READY_PLACEHOLDER = "Plan ready. Choose Implement plan or Discuss further."
13
14
  QUESTION_PLACEHOLDER = "Choose an option below or type a custom answer..."
14
15
  APPROVAL_PLACEHOLDER = "Choose whether to allow this action..."
@@ -18,6 +19,11 @@ THEME_PLACEHOLDER = "Choose a theme below or type a theme name..."
18
19
 
19
20
  # Durable transcript messages
20
21
  THREAD_RESET_MESSAGE = "Thread reset. Previous messages were cleared."
22
+ DISCONNECTED_HEADLINE = "Not connected."
23
+ DISCONNECTED_STARTUP_GUIDANCE = "Choose a provider and add an API key or sign in from the Settings tab before chatting."
24
+ DISCONNECTED_SIDEBAR_GUIDANCE = "Press Ctrl+O to open the sidebar, then select Settings."
25
+ DISCONNECTED_ACTIVITY = "Open Settings and connect a provider to start chatting."
26
+ DISCONNECTED_MODEL = "not connected"
21
27
  TASK_LIST_EMPTY_MESSAGE = "No task list has been set."
22
28
  PLAN_EMPTY_MESSAGE = "No plan captured yet."
23
29
 
@@ -34,6 +34,7 @@ PROVIDER_LABELS: dict[ModelProvider, str] = {
34
34
  ModelProvider.FIREWORKS: "Fireworks",
35
35
  ModelProvider.TOGETHER: "Together AI",
36
36
  ModelProvider.DASHSCOPE: "DashScope / Qwen",
37
+ ModelProvider.OLLAMA_CLOUD: "Ollama Cloud",
37
38
  }
38
39
 
39
40
  # Friendly display names for models. Anything not listed falls back to its raw
@@ -84,6 +85,35 @@ MODEL_LABELS: dict[str, str] = {
84
85
  # DashScope / Qwen
85
86
  "qwen3-coder-plus": "Qwen3 Coder Plus",
86
87
  "qwen3-coder-flash": "Qwen3 Coder Flash",
88
+ # Ollama Cloud
89
+ "deepseek-v3.1:671b": "DeepSeek V3.1 671B",
90
+ "deepseek-v3.2": "DeepSeek V3.2",
91
+ "devstral-2:123b": "Devstral 2 123B",
92
+ "devstral-small-2:24b": "Devstral Small 2 24B",
93
+ "gemini-3-flash-preview": "Gemini 3 Flash Preview",
94
+ "gemma3:4b": "Gemma 3 4B",
95
+ "gemma3:12b": "Gemma 3 12B",
96
+ "gemma3:27b": "Gemma 3 27B",
97
+ "gemma4:31b": "Gemma 4 31B",
98
+ "glm-4.7": "GLM-4.7",
99
+ "glm-5": "GLM-5",
100
+ "gpt-oss:20b": "GPT-OSS 20B",
101
+ "gpt-oss:120b": "GPT-OSS 120B",
102
+ "kimi-k2.5": "Kimi K2.5",
103
+ "minimax-m2.1": "MiniMax M2.1",
104
+ "minimax-m2.5": "MiniMax M2.5",
105
+ "minimax-m2.7": "MiniMax M2.7",
106
+ "minimax-m3": "MiniMax M3",
107
+ "ministral-3:3b": "Ministral 3 3B",
108
+ "ministral-3:8b": "Ministral 3 8B",
109
+ "ministral-3:14b": "Ministral 3 14B",
110
+ "mistral-large-3:675b": "Mistral Large 3 675B",
111
+ "nemotron-3-nano:30b": "Nemotron 3 Nano 30B",
112
+ "nemotron-3-super": "Nemotron 3 Super",
113
+ "nemotron-3-ultra": "Nemotron 3 Ultra",
114
+ "qwen3-coder-next": "Qwen3 Coder Next",
115
+ "qwen3-coder:480b": "Qwen3 Coder 480B",
116
+ "qwen3.5:397b": "Qwen3.5 397B",
87
117
  }
88
118
 
89
119
  # Per-provider default model used when only a provider is selected. Covers the
@@ -101,6 +131,7 @@ PROVIDER_DEFAULT_MODEL: dict[ModelProvider, str] = {
101
131
  ModelProvider.FIREWORKS: "accounts/fireworks/models/glm-5p2",
102
132
  ModelProvider.TOGETHER: "moonshotai/Kimi-K2.7-Code",
103
133
  ModelProvider.DASHSCOPE: "qwen3-coder-plus",
134
+ ModelProvider.OLLAMA_CLOUD: "gpt-oss:20b",
104
135
  }
105
136
 
106
137
  UI_DEFAULT_PROVIDER = ModelProvider.MOONSHOT.value
@@ -130,6 +161,8 @@ def _api_key_env(provider: ModelProvider) -> str:
130
161
  """
131
162
  if provider == ModelProvider.OPENAI_CHATGPT:
132
163
  return ""
164
+ if provider == ModelProvider.OLLAMA_CLOUD:
165
+ return "OLLAMA_API_KEY"
133
166
  return f"{provider.value.upper()}_API_KEY"
134
167
 
135
168
 
@@ -4,8 +4,6 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
 
7
- from textual.widgets import TabbedContent
8
-
9
7
  from kolega_code.agent import AgentConfig, AgentEvent, CoderAgent, PlanningAgent, PromptExtension, ToolExtension
10
8
  from kolega_code.agent.prompt_provider import AgentMode
11
9
  from kolega_code.hooks import HookDispatcher, HookEvent, load_hook_config, project_hooks_present
@@ -198,7 +196,6 @@ class AgentRuntimeMixin:
198
196
  self._refresh_status_dashboard()
199
197
  self._set_settings_status(messages.SETTINGS_INCOMPLETE.format(error=exc), tone="error")
200
198
  self._ensure_startup_entry()
201
- self.query_one("#events", TabbedContent).active = "settings_pane"
202
199
  return
203
200
 
204
201
  self.config = config
@@ -38,7 +38,12 @@ class StatusDashboardMixin:
38
38
 
39
39
  def _format_status_dashboard(self) -> str:
40
40
  state = self._status_state
41
- provider_model = f"{state.provider}/{state.model}" if state.model else state.provider
41
+ disconnected = self.config is None
42
+ provider_model = (
43
+ messages.DISCONNECTED_MODEL
44
+ if disconnected
45
+ else (f"{state.provider}/{state.model}" if state.model else state.provider)
46
+ )
42
47
  effort = state.thinking_effort or "not supported"
43
48
  mode = state.mode.title()
44
49
  permission_mode = state.permission_mode.title()
@@ -83,7 +88,7 @@ class StatusDashboardMixin:
83
88
  f"{label('Context')}\n"
84
89
  f"{context_lines}\n\n"
85
90
  f"{label('Activity')}\n"
86
- f"{escape(state.activity)}"
91
+ f"{escape(messages.DISCONNECTED_ACTIVITY if disconnected else state.activity)}"
87
92
  )
88
93
 
89
94
  def _context_bar(self, usage_percentage: float) -> str:
@@ -23,6 +23,7 @@ class ModelProvider(str, Enum):
23
23
  DEEPSEEK = "deepseek"
24
24
  ZAI = "zai"
25
25
  KIMI_CODING = "kimi_coding"
26
+ OLLAMA_CLOUD = "ollama_cloud"
26
27
 
27
28
 
28
29
  class AgentRole(str, Enum):
@@ -131,6 +132,7 @@ class AgentConfig(BaseModel):
131
132
  deepseek_api_key: Optional[str] = Field(default=None, description="API key for DeepSeek")
132
133
  zai_api_key: Optional[str] = Field(default=None, description="API key for Z.AI (GLM Coding Plan)")
133
134
  kimi_coding_api_key: Optional[str] = Field(default=None, description="API key for Kimi Coding Plan")
135
+ ollama_cloud_api_key: Optional[str] = Field(default=None, description="API key for Ollama Cloud")
134
136
 
135
137
  # ChatGPT-subscription OAuth credentials (used instead of an api key for the
136
138
  # OPENAI_CHATGPT provider). The live, refreshing token manager is attached
@@ -221,6 +223,7 @@ class AgentConfig(BaseModel):
221
223
  ModelProvider.DEEPSEEK: self.deepseek_api_key,
222
224
  ModelProvider.ZAI: self.zai_api_key,
223
225
  ModelProvider.KIMI_CODING: self.kimi_coding_api_key,
226
+ ModelProvider.OLLAMA_CLOUD: self.ollama_cloud_api_key,
224
227
  ModelProvider.LLAMA: None, # Local model, no API key needed
225
228
  }
226
229
  return api_key_map[provider]
@@ -135,6 +135,7 @@ class LLMClient:
135
135
  "deepseek": AnthropicProvider,
136
136
  "zai": AnthropicProvider,
137
137
  "kimi_coding": AnthropicProvider,
138
+ "ollama_cloud": OpenAIProvider,
138
139
  }
139
140
 
140
141
  base_urls: Dict[str, str] = {
@@ -150,6 +151,7 @@ class LLMClient:
150
151
  "deepseek": "https://api.deepseek.com/anthropic",
151
152
  "zai": "https://api.z.ai/api/anthropic",
152
153
  "kimi_coding": "https://api.kimi.com/coding",
154
+ "ollama_cloud": "https://ollama.com/v1",
153
155
  }
154
156
 
155
157
  provider_class = providers.get(provider.lower())
@@ -141,6 +141,7 @@ def _provider_display_name(provider: str | None) -> str:
141
141
  ModelProvider.MOONSHOT.value: "Moonshot",
142
142
  ModelProvider.DEEPSEEK.value: "DeepSeek",
143
143
  ModelProvider.LLAMA.value: "Llama",
144
+ ModelProvider.OLLAMA_CLOUD.value: "Ollama Cloud",
144
145
  }
145
146
  if not provider:
146
147
  return "The selected provider"
@@ -934,8 +934,10 @@ class MessageChunk:
934
934
  delta = chunk.choices[0].delta
935
935
 
936
936
  # Fireworks and other OpenAI-compatible reasoning models stream their
937
- # reasoning separately from answer text.
938
- reasoning_content = getattr(delta, "reasoning_content", None)
937
+ # reasoning separately from answer text. Ollama Cloud uses the
938
+ # OpenAI-compatible non-standard "reasoning" field instead of
939
+ # "reasoning_content".
940
+ reasoning_content = getattr(delta, "reasoning_content", None) or getattr(delta, "reasoning", None)
939
941
  if reasoning_content:
940
942
  return cls(type="thinking", thinking=reasoning_content)
941
943
 
@@ -1142,8 +1144,9 @@ class Message:
1142
1144
  tool_use_blocks = []
1143
1145
 
1144
1146
  # OpenAI-compatible reasoning models (including Fireworks via Chat
1145
- # Completions) may return reasoning separately from answer text.
1146
- reasoning_content = getattr(message, "reasoning_content", None)
1147
+ # Completions) may return reasoning separately from answer text. Ollama
1148
+ # Cloud uses the OpenAI-compatible non-standard "reasoning" field.
1149
+ reasoning_content = getattr(message, "reasoning_content", None) or getattr(message, "reasoning", None)
1147
1150
  if reasoning_content:
1148
1151
  content_blocks.append(ThinkingBlock(thinking=reasoning_content))
1149
1152
 
@@ -56,7 +56,9 @@ class OpenAIStreamWrapper:
56
56
  if content:
57
57
  self.final_content += content
58
58
 
59
- reasoning_content = getattr(delta, "reasoning_content", None) or ""
59
+ reasoning_content = (
60
+ getattr(delta, "reasoning_content", None) or getattr(delta, "reasoning", None) or ""
61
+ )
60
62
  if reasoning_content:
61
63
  self.final_reasoning_content += reasoning_content
62
64