code-puppy 0.0.318__tar.gz → 0.0.319__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 (166) hide show
  1. {code_puppy-0.0.318 → code_puppy-0.0.319}/PKG-INFO +1 -1
  2. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/model_settings_menu.py +6 -0
  3. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/model_factory.py +48 -0
  4. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/models.json +1 -1
  5. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/claude_code_oauth/utils.py +1 -0
  6. {code_puppy-0.0.318 → code_puppy-0.0.319}/pyproject.toml +1 -1
  7. {code_puppy-0.0.318 → code_puppy-0.0.319}/.gitignore +0 -0
  8. {code_puppy-0.0.318 → code_puppy-0.0.319}/LICENSE +0 -0
  9. {code_puppy-0.0.318 → code_puppy-0.0.319}/README.md +0 -0
  10. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/__init__.py +0 -0
  11. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/__main__.py +0 -0
  12. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/__init__.py +0 -0
  13. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_c_reviewer.py +0 -0
  14. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_code_puppy.py +0 -0
  15. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_code_reviewer.py +0 -0
  16. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  17. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_creator_agent.py +0 -0
  18. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  19. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  20. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_manager.py +0 -0
  21. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_planning.py +0 -0
  22. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_python_programmer.py +0 -0
  23. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_python_reviewer.py +0 -0
  24. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_qa_expert.py +0 -0
  25. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_qa_kitten.py +0 -0
  26. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_security_auditor.py +0 -0
  27. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  28. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/base_agent.py +0 -0
  29. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/json_agent.py +0 -0
  30. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/agents/prompt_reviewer.py +0 -0
  31. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/callbacks.py +0 -0
  32. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/chatgpt_codex_client.py +0 -0
  33. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/claude_cache_client.py +0 -0
  34. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/cli_runner.py +0 -0
  35. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/__init__.py +0 -0
  36. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/add_model_menu.py +0 -0
  37. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/attachments.py +0 -0
  38. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/autosave_menu.py +0 -0
  39. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/colors_menu.py +0 -0
  40. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/command_handler.py +0 -0
  41. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/command_registry.py +0 -0
  42. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/config_commands.py +0 -0
  43. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/core_commands.py +0 -0
  44. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/diff_menu.py +0 -0
  45. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/file_path_completion.py +0 -0
  46. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/load_context_completion.py +0 -0
  47. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/__init__.py +0 -0
  48. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/add_command.py +0 -0
  49. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/base.py +0 -0
  50. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  51. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  52. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  53. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/edit_command.py +0 -0
  54. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/handler.py +0 -0
  55. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/help_command.py +0 -0
  56. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/install_command.py +0 -0
  57. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/install_menu.py +0 -0
  58. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/list_command.py +0 -0
  59. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/logs_command.py +0 -0
  60. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/remove_command.py +0 -0
  61. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/restart_command.py +0 -0
  62. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/search_command.py +0 -0
  63. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  64. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/start_command.py +0 -0
  65. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/status_command.py +0 -0
  66. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  67. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/stop_command.py +0 -0
  68. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/test_command.py +0 -0
  69. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/utils.py +0 -0
  70. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  71. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/mcp_completion.py +0 -0
  72. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/model_picker_completion.py +0 -0
  73. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/motd.py +0 -0
  74. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/pin_command_completion.py +0 -0
  75. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  76. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/session_commands.py +0 -0
  77. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/command_line/utils.py +0 -0
  78. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/config.py +0 -0
  79. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/error_logging.py +0 -0
  80. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/gemini_code_assist.py +0 -0
  81. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/http_utils.py +0 -0
  82. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/keymap.py +0 -0
  83. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/main.py +0 -0
  84. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/__init__.py +0 -0
  85. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/async_lifecycle.py +0 -0
  86. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/blocking_startup.py +0 -0
  87. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  88. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/circuit_breaker.py +0 -0
  89. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/config_wizard.py +0 -0
  90. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/dashboard.py +0 -0
  91. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/error_isolation.py +0 -0
  92. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/examples/retry_example.py +0 -0
  93. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/health_monitor.py +0 -0
  94. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/managed_server.py +0 -0
  95. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/manager.py +0 -0
  96. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/mcp_logs.py +0 -0
  97. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/registry.py +0 -0
  98. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/retry_manager.py +0 -0
  99. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  100. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/status_tracker.py +0 -0
  101. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/mcp_/system_tools.py +0 -0
  102. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/__init__.py +0 -0
  103. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/bus.py +0 -0
  104. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/commands.py +0 -0
  105. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/markdown_patches.py +0 -0
  106. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/message_queue.py +0 -0
  107. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/messages.py +0 -0
  108. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/queue_console.py +0 -0
  109. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/renderers.py +0 -0
  110. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/rich_renderer.py +0 -0
  111. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/spinner/__init__.py +0 -0
  112. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  113. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  114. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/model_utils.py +0 -0
  115. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/models_dev_api.json +0 -0
  116. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/models_dev_parser.py +0 -0
  117. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/__init__.py +0 -0
  118. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  119. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  120. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  121. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  122. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  123. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  124. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  125. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  126. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  127. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  128. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  129. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  130. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  131. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  132. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/example_custom_command/README.md +0 -0
  133. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  134. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  135. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  136. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  137. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  138. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  139. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  140. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  141. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/prompts/codex_system_prompt.md +0 -0
  142. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/pydantic_patches.py +0 -0
  143. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/reopenable_async_client.py +0 -0
  144. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/round_robin_model.py +0 -0
  145. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/session_storage.py +0 -0
  146. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/status_display.py +0 -0
  147. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/summarization_agent.py +0 -0
  148. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/terminal_utils.py +0 -0
  149. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/__init__.py +0 -0
  150. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/agent_tools.py +0 -0
  151. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/__init__.py +0 -0
  152. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/browser_control.py +0 -0
  153. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/browser_interactions.py +0 -0
  154. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/browser_locators.py +0 -0
  155. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/browser_navigation.py +0 -0
  156. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  157. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/browser_scripts.py +0 -0
  158. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/browser_workflows.py +0 -0
  159. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/camoufox_manager.py +0 -0
  160. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/browser/vqa_agent.py +0 -0
  161. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/command_runner.py +0 -0
  162. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/common.py +0 -0
  163. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/file_modifications.py +0 -0
  164. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/file_operations.py +0 -0
  165. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/tools/tools_content.py +0 -0
  166. {code_puppy-0.0.318 → code_puppy-0.0.319}/code_puppy/version_checker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.318
3
+ Version: 0.0.319
4
4
  Summary: Code generation agent
5
5
  Project-URL: repository, https://github.com/mpfaffenberger/code_puppy
6
6
  Project-URL: HomePage, https://github.com/mpfaffenberger/code_puppy
@@ -84,6 +84,12 @@ SETTING_DEFINITIONS: Dict[str, Dict] = {
84
84
  "default": 10000,
85
85
  "format": "{:.0f}",
86
86
  },
87
+ "interleaved_thinking": {
88
+ "name": "Interleaved Thinking",
89
+ "description": "Enable thinking between tool calls (Claude 4 only: Opus 4.5, Opus 4.1, Opus 4, Sonnet 4). Adds beta header. WARNING: On Vertex/Bedrock, this FAILS for non-Claude 4 models!",
90
+ "type": "boolean",
91
+ "default": False,
92
+ },
87
93
  }
88
94
 
89
95
 
@@ -319,9 +319,21 @@ class ModelFactory:
319
319
  http2=http2_enabled,
320
320
  )
321
321
 
322
+ # Check if interleaved thinking is enabled for this model
323
+ # Only applies to Claude 4 models (Opus 4.5, Opus 4.1, Opus 4, Sonnet 4)
324
+ from code_puppy.config import get_effective_model_settings
325
+
326
+ effective_settings = get_effective_model_settings(model_name)
327
+ interleaved_thinking = effective_settings.get("interleaved_thinking", False)
328
+
329
+ default_headers = {}
330
+ if interleaved_thinking:
331
+ default_headers["anthropic-beta"] = "interleaved-thinking-2025-05-14"
332
+
322
333
  anthropic_client = AsyncAnthropic(
323
334
  api_key=api_key,
324
335
  http_client=client,
336
+ default_headers=default_headers if default_headers else None,
325
337
  )
326
338
 
327
339
  # Ensure cache_control is injected at the Anthropic SDK layer
@@ -351,10 +363,21 @@ class ModelFactory:
351
363
  http2=http2_enabled,
352
364
  )
353
365
 
366
+ # Check if interleaved thinking is enabled for this model
367
+ from code_puppy.config import get_effective_model_settings
368
+
369
+ effective_settings = get_effective_model_settings(model_name)
370
+ interleaved_thinking = effective_settings.get("interleaved_thinking", False)
371
+
372
+ default_headers = {}
373
+ if interleaved_thinking:
374
+ default_headers["anthropic-beta"] = "interleaved-thinking-2025-05-14"
375
+
354
376
  anthropic_client = AsyncAnthropic(
355
377
  base_url=url,
356
378
  http_client=client,
357
379
  api_key=api_key,
380
+ default_headers=default_headers if default_headers else None,
358
381
  )
359
382
 
360
383
  # Ensure cache_control is injected at the Anthropic SDK layer
@@ -370,6 +393,31 @@ class ModelFactory:
370
393
  )
371
394
  return None
372
395
 
396
+ # Check if interleaved thinking is enabled (defaults to True for OAuth models)
397
+ from code_puppy.config import get_effective_model_settings
398
+
399
+ effective_settings = get_effective_model_settings(model_name)
400
+ interleaved_thinking = effective_settings.get("interleaved_thinking", True)
401
+
402
+ # Handle anthropic-beta header based on interleaved_thinking setting
403
+ if "anthropic-beta" in headers:
404
+ beta_parts = [p.strip() for p in headers["anthropic-beta"].split(",")]
405
+ if interleaved_thinking:
406
+ # Ensure interleaved-thinking is in the header
407
+ if "interleaved-thinking-2025-05-14" not in beta_parts:
408
+ beta_parts.append("interleaved-thinking-2025-05-14")
409
+ else:
410
+ # Remove interleaved-thinking from the header
411
+ beta_parts = [
412
+ p for p in beta_parts if "interleaved-thinking" not in p
413
+ ]
414
+ headers["anthropic-beta"] = ",".join(beta_parts) if beta_parts else None
415
+ if headers.get("anthropic-beta") is None:
416
+ del headers["anthropic-beta"]
417
+ elif interleaved_thinking:
418
+ # No existing beta header, add one for interleaved thinking
419
+ headers["anthropic-beta"] = "interleaved-thinking-2025-05-14"
420
+
373
421
  # Use a dedicated client wrapper that injects cache_control on /v1/messages
374
422
  if verify is None:
375
423
  verify = get_cert_bundle_path()
@@ -81,7 +81,7 @@
81
81
  "type": "anthropic",
82
82
  "name": "claude-opus-4-5",
83
83
  "context_length": 200000,
84
- "supported_settings": ["temperature", "extended_thinking", "budget_tokens"]
84
+ "supported_settings": ["temperature", "extended_thinking", "budget_tokens", "interleaved_thinking"]
85
85
  },
86
86
  "zai-glm-4.6-coding": {
87
87
  "type": "zai_coding",
@@ -368,6 +368,7 @@ def add_models_to_extra_config(models: List[str]) -> bool:
368
368
  "temperature",
369
369
  "extended_thinking",
370
370
  "budget_tokens",
371
+ "interleaved_thinking",
371
372
  ],
372
373
  }
373
374
  added += 1
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.318"
7
+ version = "0.0.319"
8
8
  description = "Code generation agent"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.14"
File without changes
File without changes
File without changes