deepagents-code 0.1.18__tar.gz → 0.1.20__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 (286) hide show
  1. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/.gitignore +1 -0
  2. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/CHANGELOG.md +33 -0
  3. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/PKG-INFO +1 -1
  4. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_constants.py +9 -0
  5. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_env_vars.py +19 -0
  6. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_session_stats.py +58 -28
  7. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_version.py +1 -1
  8. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/app.py +511 -77
  9. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/config.py +62 -1
  10. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/config_manifest.py +127 -11
  11. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/main.py +5 -3
  12. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/model_config.py +64 -0
  13. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/non_interactive.py +5 -2
  14. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/notifications.py +3 -0
  15. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/remote_client.py +16 -0
  16. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/server.py +37 -4
  17. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/server_manager.py +5 -1
  18. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/sessions.py +16 -5
  19. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/textual_adapter.py +22 -9
  20. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/auth.py +158 -13
  21. deepagents_code-0.1.20/deepagents_code/widgets/install_confirm.py +248 -0
  22. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/messages.py +76 -0
  23. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/model_selector.py +238 -53
  24. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/thread_selector.py +13 -0
  25. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/update_progress.py +2 -1
  26. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/welcome.py +133 -30
  27. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/pyproject.toml +1 -1
  28. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/scripts/install.sh +21 -15
  29. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_app.py +805 -12
  30. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_auth_widgets.py +273 -5
  31. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_config.py +58 -3
  32. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_config_manifest.py +164 -9
  33. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_install_command.py +169 -19
  34. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_install_confirm.py +80 -1
  35. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_install_script.py +77 -0
  36. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_main.py +9 -4
  37. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_messages.py +137 -0
  38. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_model_config.py +103 -0
  39. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_model_selector.py +481 -0
  40. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_non_interactive.py +49 -0
  41. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_remote_client.py +67 -0
  42. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server.py +211 -0
  43. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server_manager.py +36 -0
  44. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_session_stats.py +43 -7
  45. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sessions.py +91 -0
  46. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_textual_adapter.py +124 -14
  47. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_thread_selector.py +15 -0
  48. deepagents_code-0.1.20/tests/unit_tests/test_tracing_replicas.py +70 -0
  49. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_welcome.py +170 -12
  50. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/uv.lock +1 -1
  51. deepagents_code-0.1.18/deepagents_code/widgets/install_confirm.py +0 -120
  52. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/AGENTS.md +0 -0
  53. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/COMMANDS.md +0 -0
  54. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/DEV.md +0 -0
  55. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/Makefile +0 -0
  56. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/README.md +0 -0
  57. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/THREAT_MODEL.md +0 -0
  58. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/__init__.py +0 -0
  59. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/__main__.py +0 -0
  60. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_ask_user_types.py +0 -0
  61. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_cli_context.py +0 -0
  62. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_debug.py +0 -0
  63. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_git.py +0 -0
  64. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_server_config.py +0 -0
  65. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_startup_error.py +0 -0
  66. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_testing_models.py +0 -0
  67. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_textual_patches.py +0 -0
  68. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/agent.py +0 -0
  69. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/app.tcss +0 -0
  70. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/ask_user.py +0 -0
  71. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/auth_commands.py +0 -0
  72. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/auth_display.py +0 -0
  73. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/auth_store.py +0 -0
  74. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/__init__.py +0 -0
  75. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  76. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  77. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  78. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  79. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/clipboard.py +0 -0
  80. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/command_registry.py +0 -0
  81. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/config_commands.py +0 -0
  82. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/configurable_model.py +0 -0
  83. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/default_agent_prompt.md +0 -0
  84. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/editor.py +0 -0
  85. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/event_bus.py +0 -0
  86. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/extras_info.py +0 -0
  87. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/file_ops.py +0 -0
  88. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/filesystem_empty_result.py +0 -0
  89. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/formatting.py +0 -0
  90. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/hooks.py +0 -0
  91. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/input.py +0 -0
  92. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/__init__.py +0 -0
  93. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/openai_codex.py +0 -0
  94. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/sandbox_config.py +0 -0
  95. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/sandbox_factory.py +0 -0
  96. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/sandbox_provider.py +0 -0
  97. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/sandbox_registry.py +0 -0
  98. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/iterm_cursor_guide.py +0 -0
  99. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/local_context.py +0 -0
  100. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/managed_tools.py +0 -0
  101. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_auth.py +0 -0
  102. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_commands.py +0 -0
  103. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_disabled.py +0 -0
  104. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_login_service.py +0 -0
  105. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_oauth_ui.py +0 -0
  106. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/__init__.py +0 -0
  107. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/_registry.py +0 -0
  108. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/base.py +0 -0
  109. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/github.py +0 -0
  110. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/slack.py +0 -0
  111. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_tools.py +0 -0
  112. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_trust.py +0 -0
  113. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/media_utils.py +0 -0
  114. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/memory_guard.py +0 -0
  115. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/offload.py +0 -0
  116. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/onboarding.py +0 -0
  117. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/output.py +0 -0
  118. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/project_utils.py +0 -0
  119. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/py.typed +0 -0
  120. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/resume_state.py +0 -0
  121. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/server_graph.py +0 -0
  122. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/skills/__init__.py +0 -0
  123. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/skills/commands.py +0 -0
  124. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/skills/invocation.py +0 -0
  125. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/skills/load.py +0 -0
  126. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/state_migration.py +0 -0
  127. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/subagents.py +0 -0
  128. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/system_prompt.md +0 -0
  129. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/terminal_capabilities.py +0 -0
  130. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/terminal_escape.py +0 -0
  131. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/theme.py +0 -0
  132. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/tool_display.py +0 -0
  133. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/tools.py +0 -0
  134. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/ui.py +0 -0
  135. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/unicode_security.py +0 -0
  136. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/update_check.py +0 -0
  137. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/__init__.py +0 -0
  138. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/_links.py +0 -0
  139. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/agent_selector.py +0 -0
  140. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/approval.py +0 -0
  141. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/ask_user.py +0 -0
  142. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/autocomplete.py +0 -0
  143. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/chat_input.py +0 -0
  144. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/codex_auth.py +0 -0
  145. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/cwd_switch.py +0 -0
  146. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/diff.py +0 -0
  147. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/history.py +0 -0
  148. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/launch_init.py +0 -0
  149. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/loading.py +0 -0
  150. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/mcp_login.py +0 -0
  151. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/mcp_reconnect.py +0 -0
  152. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/mcp_viewer.py +0 -0
  153. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/message_store.py +0 -0
  154. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/notification_center.py +0 -0
  155. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/notification_detail.py +0 -0
  156. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/notification_settings.py +0 -0
  157. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/restart_prompt.py +0 -0
  158. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/status.py +0 -0
  159. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/theme_selector.py +0 -0
  160. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/tool_renderers.py +0 -0
  161. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/tool_widgets.py +0 -0
  162. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/update_available.py +0 -0
  163. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/arxiv-search/SKILL.md +0 -0
  164. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  165. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/langgraph-docs/SKILL.md +0 -0
  166. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/skill-creator/SKILL.md +0 -0
  167. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  168. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  169. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/web-research/SKILL.md +0 -0
  170. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/images/tui.png +0 -0
  171. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/scripts/check_imports.py +0 -0
  172. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/scripts/debug_server.sh +0 -0
  173. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/scripts/generate_commands_catalog.py +0 -0
  174. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/README.md +0 -0
  175. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/__init__.py +0 -0
  176. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/benchmarks/__init__.py +0 -0
  177. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  178. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  179. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/conftest.py +0 -0
  180. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/test_acp_mode.py +0 -0
  181. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/test_compact_resume.py +0 -0
  182. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/test_sandbox_factory.py +0 -0
  183. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/test_sandbox_operations.py +0 -0
  184. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/__init__.py +0 -0
  185. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/conftest.py +0 -0
  186. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/skills/__init__.py +0 -0
  187. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/skills/test_commands.py +0 -0
  188. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/skills/test_load.py +0 -0
  189. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/skills/test_skills_json.py +0 -0
  190. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_agent.py +0 -0
  191. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_agent_friendly.py +0 -0
  192. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_agent_selector.py +0 -0
  193. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_approval.py +0 -0
  194. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_args.py +0 -0
  195. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_ask_user.py +0 -0
  196. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  197. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_auth_commands.py +0 -0
  198. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_auth_display.py +0 -0
  199. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_auth_store.py +0 -0
  200. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_autocomplete.py +0 -0
  201. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_charset.py +0 -0
  202. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_chat_input.py +0 -0
  203. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_clipboard.py +0 -0
  204. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_command_registry.py +0 -0
  205. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_compact_tool.py +0 -0
  206. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_configurable_model.py +0 -0
  207. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_cursor_blink.py +0 -0
  208. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_cwd_switch.py +0 -0
  209. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_debug.py +0 -0
  210. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_editor.py +0 -0
  211. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_end_to_end.py +0 -0
  212. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_env_vars.py +0 -0
  213. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_event_bus.py +0 -0
  214. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_exception_handling.py +0 -0
  215. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_extras_info.py +0 -0
  216. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_file_ops.py +0 -0
  217. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_filesystem_empty_result.py +0 -0
  218. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_formatting.py +0 -0
  219. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_git.py +0 -0
  220. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_history.py +0 -0
  221. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_hooks.py +0 -0
  222. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_imports.py +0 -0
  223. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_input_parsing.py +0 -0
  224. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  225. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_launch_init.py +0 -0
  226. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_links.py +0 -0
  227. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_loading.py +0 -0
  228. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_local_context.py +0 -0
  229. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_main_acp_mode.py +0 -0
  230. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_main_args.py +0 -0
  231. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_managed_tools.py +0 -0
  232. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_auth.py +0 -0
  233. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_commands.py +0 -0
  234. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_disabled.py +0 -0
  235. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_login_modal.py +0 -0
  236. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_login_service.py +0 -0
  237. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  238. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_reconnect.py +0 -0
  239. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_tools.py +0 -0
  240. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_trust.py +0 -0
  241. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_viewer.py +0 -0
  242. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_media_utils.py +0 -0
  243. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_memory_guard.py +0 -0
  244. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_message_store.py +0 -0
  245. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_model_switch.py +0 -0
  246. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_notification_center.py +0 -0
  247. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_notification_detail.py +0 -0
  248. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_notifications.py +0 -0
  249. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_offload.py +0 -0
  250. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  251. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_onboarding.py +0 -0
  252. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  253. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_output.py +0 -0
  254. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_reload.py +0 -0
  255. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_restart_prompt.py +0 -0
  256. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_resume_state.py +0 -0
  257. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sandbox_config.py +0 -0
  258. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sandbox_factory.py +0 -0
  259. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sandbox_provider.py +0 -0
  260. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sandbox_registry.py +0 -0
  261. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server_config.py +0 -0
  262. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server_graph.py +0 -0
  263. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server_helpers.py +0 -0
  264. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_shell_allow_list.py +0 -0
  265. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_skill_invocation.py +0 -0
  266. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  267. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_state_migration.py +0 -0
  268. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_status.py +0 -0
  269. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_subagents.py +0 -0
  270. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  271. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_terminal_escape.py +0 -0
  272. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  273. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_textual_patches.py +0 -0
  274. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_theme.py +0 -0
  275. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_tool_display.py +0 -0
  276. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_ui.py +0 -0
  277. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_unicode_security.py +0 -0
  278. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_update_available.py +0 -0
  279. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_update_check.py +0 -0
  280. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_update_progress.py +0 -0
  281. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_version.py +0 -0
  282. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/tools/__init__.py +0 -0
  283. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/tools/test_current_thread.py +0 -0
  284. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  285. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/widgets/__init__.py +0 -0
  286. {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/widgets/test_diff.py +0 -0
@@ -100,6 +100,7 @@ ipython_config.py
100
100
  # This is especially recommended for binary packages to ensure reproducibility, and is more
101
101
  # commonly ignored for libraries.
102
102
  #uv.lock
103
+ .local_deps/
103
104
 
104
105
  # poetry
105
106
  # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
@@ -2,6 +2,39 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.20](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.19...deepagents-code==0.1.20) (2026-06-17)
6
+
7
+ ### Features
8
+
9
+ * Manage Tavily web-search API key in `/auth` ([#4062](https://github.com/langchain-ai/deepagents/issues/4062)) ([90cc099](https://github.com/langchain-ai/deepagents/commit/90cc099b0998a9aa55df01e3bc12ad1597c65365))
10
+ * Surface uninstalled known providers in `/auth` menu ([#4059](https://github.com/langchain-ai/deepagents/issues/4059)) ([73db271](https://github.com/langchain-ai/deepagents/commit/73db2719bce5ad3c933ffee643df4a62cfd60e17))
11
+ * Show provider in usage stats table ([#4049](https://github.com/langchain-ai/deepagents/issues/4049)) ([309b054](https://github.com/langchain-ai/deepagents/commit/309b054fdd040adb5086408a3bcb2550ba73439e))
12
+ * Quiet install script's full dependency list ([#4058](https://github.com/langchain-ai/deepagents/issues/4058)) ([de2c9fd](https://github.com/langchain-ai/deepagents/commit/de2c9fd8c7437fdcdfe738599f83808c5423c55c))
13
+
14
+ ### Bug Fixes
15
+
16
+ * Read `LANGSMITH_PROJECT` for `tracing.langsmith_project` + show default ([#4054](https://github.com/langchain-ai/deepagents/issues/4054)) ([fec1551](https://github.com/langchain-ai/deepagents/commit/fec1551e901a4fe88bd74ee4833a91ef93b1e93f))
17
+ * Surface recommended models missing from installed provider profiles ([#4057](https://github.com/langchain-ai/deepagents/issues/4057)) ([56e0d31](https://github.com/langchain-ai/deepagents/commit/56e0d31b6c507d5a1e95c3f2058a8d3b9488a4db))
18
+ * Clarify post-update restart semantics ([#4046](https://github.com/langchain-ai/deepagents/issues/4046)) ([6318b81](https://github.com/langchain-ai/deepagents/commit/6318b817399f7dd2f2e6dc07987dca46f1da9886))
19
+ * Hide `[SYSTEM]` interrupt notices from `/threads` prompt ([#3988](https://github.com/langchain-ai/deepagents/issues/3988)) ([68fa0cb](https://github.com/langchain-ai/deepagents/commit/68fa0cb4d48ff3f3e552bbf16f8316433c7b6f34))
20
+ * Keep install-required `/model` rows dimmed after navigation ([#4048](https://github.com/langchain-ai/deepagents/issues/4048)) ([c499634](https://github.com/langchain-ai/deepagents/commit/c499634c530dcab9b18e3126b4573ff0d36c3efa))
21
+ * Rescaffold server workspace on `/restart` when config is missing ([#4050](https://github.com/langchain-ai/deepagents/issues/4050)) ([de51b0e](https://github.com/langchain-ai/deepagents/commit/de51b0e082293f5f795d96d3bf717c82efb9337e))
22
+ * Remove transient `Restarting server...` message after restart ([#4047](https://github.com/langchain-ai/deepagents/issues/4047)) ([87cc504](https://github.com/langchain-ai/deepagents/commit/87cc50428bc96ef11dfb11cee4020bff322a7216))
23
+ * Suppress model-switch defer toast on bare reconnect ([#4060](https://github.com/langchain-ai/deepagents/issues/4060)) ([60b1052](https://github.com/langchain-ai/deepagents/commit/60b10520d24c87b9c8c9d85b94cffae9e3c67c43))
24
+
25
+ ## [0.1.19](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.18...deepagents-code==0.1.19) (2026-06-17)
26
+
27
+ ### Features
28
+
29
+ * Add latest frontier models to recommended list ([#4045](https://github.com/langchain-ai/deepagents/issues/4045)) ([1145356](https://github.com/langchain-ai/deepagents/commit/114535637eaee383c64eac5282bc9ac57007c83f))
30
+ * Dual-write agent traces to extra LangSmith projects ([#3998](https://github.com/langchain-ai/deepagents/issues/3998)) ([1b94cf3](https://github.com/langchain-ai/deepagents/commit/1b94cf322949e0cafd6f2bacf343fb0044ec5a8c))
31
+ * Prompt to install provider when selecting an uninstalled model ([#3981](https://github.com/langchain-ai/deepagents/issues/3981)) ([619207c](https://github.com/langchain-ai/deepagents/commit/619207c8d4d4308a9a3ab9d2d039506feeaf8a67))
32
+ * Note minimum OpenAI key permissions in `/auth` ([#4040](https://github.com/langchain-ai/deepagents/issues/4040)) ([14be63d](https://github.com/langchain-ai/deepagents/commit/14be63d476ed8dece75e20fff05016122c258be8))
33
+
34
+ ### Bug Fixes
35
+
36
+ * Exclude prompt prefix from `UserMessage` selection ([#4002](https://github.com/langchain-ai/deepagents/issues/4002)) ([8ee6ba6](https://github.com/langchain-ai/deepagents/commit/8ee6ba6e64895d3d36a5957627221ed7667bc1d4))
37
+
5
38
  ## [0.1.18](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.17...deepagents-code==0.1.18) (2026-06-16)
6
39
 
7
40
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.18
3
+ Version: 0.1.20
4
4
  Summary: Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities.
5
5
  Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -12,3 +12,12 @@ from typing import Final
12
12
 
13
13
  DEFAULT_AGENT_NAME: Final[str] = "agent"
14
14
  """Default agent / assistant identifier when no `-a` flag is given."""
15
+
16
+ SYSTEM_MESSAGE_PREFIX: Final[str] = "[SYSTEM]"
17
+ """Prefix for synthetic human messages (e.g. interrupt cancellation notices).
18
+
19
+ Such messages are written to the `messages` channel for the agent's benefit on
20
+ resume but are not user-authored, so they are filtered out of both the rendered
21
+ transcript and a thread's initial prompt. Shared here so the single producer
22
+ (`textual_adapter`) and its consumers (`app`, `sessions`) agree on one literal.
23
+ """
@@ -122,6 +122,18 @@ KITTY_KEYBOARD = "DEEPAGENTS_CODE_KITTY_KEYBOARD"
122
122
  LANGSMITH_PROJECT = "DEEPAGENTS_CODE_LANGSMITH_PROJECT"
123
123
  """Override LangSmith project name for agent traces."""
124
124
 
125
+ LANGSMITH_REPLICA_PROJECTS = "DEEPAGENTS_CODE_LANGSMITH_REPLICA_PROJECTS"
126
+ """Comma-separated LangSmith project names to *also* write agent traces to.
127
+
128
+ When set (and tracing is active), each agent run is dual-written to the primary
129
+ deepagents-code project *and* one extra project via LangSmith write replicas.
130
+
131
+ Only the first listed project is used: the LangGraph server mirrors a run to a
132
+ single extra project, so any additional entries are dropped (with a warning).
133
+ The value is comma-separated for forward-compatibility, not because multiple
134
+ destinations are written today.
135
+ """
136
+
125
137
  NO_TERMINAL_ESCAPE = "DEEPAGENTS_CODE_NO_TERMINAL_ESCAPE"
126
138
  """Disable all terminal escape/control sequence output when enabled."""
127
139
 
@@ -165,6 +177,13 @@ SHELL_ALLOW_LIST = "DEEPAGENTS_CODE_SHELL_ALLOW_LIST"
165
177
  SHOW_HEADER = "DEEPAGENTS_CODE_SHOW_HEADER"
166
178
  """Show Textual's native header bar at the top of the TUI when enabled."""
167
179
 
180
+ SHOW_LANGSMITH_REPLICA_TRACING = "DEEPAGENTS_CODE_SHOW_LANGSMITH_REPLICA_TRACING"
181
+ """Show LangSmith replica project info in the startup splash when enabled.
182
+
183
+ Defaults to enabled; set to a falsy value (`0`, `false`, `no`, `off`, or empty)
184
+ to hide replica tracing details from the splash while leaving tracing active.
185
+ """
186
+
168
187
  THEME = "DEEPAGENTS_CODE_THEME"
169
188
  """Force the CLI to launch with this theme name when set."""
170
189
 
@@ -17,64 +17,91 @@ SpinnerStatus = Literal["Thinking", "Offloading", "Loading thread"] | None
17
17
 
18
18
  @dataclass
19
19
  class ModelStats:
20
- """Token stats for a single model within a session.
21
-
22
- Attributes:
23
- request_count: Number of LLM API requests made to this model.
24
- input_tokens: Cumulative input tokens sent to this model.
25
- output_tokens: Cumulative output tokens received from this model.
26
- """
20
+ """Token stats for a single model within a session."""
27
21
 
28
22
  request_count: int = 0
23
+ """Number of LLM API requests made to this model."""
24
+
29
25
  input_tokens: int = 0
26
+ """Cumulative input tokens sent to this model."""
27
+
30
28
  output_tokens: int = 0
29
+ """Cumulative output tokens received from this model."""
30
+
31
+ provider: str = ""
32
+ """Provider that served this model (e.g. `openai`), or `""` when unknown."""
33
+
34
+ model_name: str = ""
35
+ """Model name displayed in usage output."""
36
+
37
+
38
+ ModelStatsKey = tuple[str, str]
39
+ """Per-model dict key: the `(provider, model_name)` pair.
40
+
41
+ Pairing the provider with the model name keeps the same model served by
42
+ different providers (e.g. `gpt-5.5` via `openai` vs `azure`) in separate rows
43
+ instead of collapsing them. The key is always built from the same values stored
44
+ on the corresponding `ModelStats`, so key and fields never diverge.
45
+ """
31
46
 
32
47
 
33
48
  @dataclass
34
49
  class SessionStats:
35
- """Stats accumulated over a single agent turn (or full session).
36
-
37
- Attributes:
38
- request_count: Total LLM API requests made (each chunk with
39
- usage_metadata counts as one completed request).
40
- input_tokens: Cumulative input tokens across all LLM requests.
41
- output_tokens: Cumulative output tokens across all LLM requests.
42
- wall_time_seconds: Wall-clock duration from stream start to end.
43
- per_model: Per-model breakdown keyed by model name.
44
- Populated only when `record_request` receives a non-empty
45
- `model_name`. Empty dict means no named-model requests were
46
- recorded; `print_usage_table` omits the model table in that case and
47
- shows only the wall-time line (if applicable).
48
- """
50
+ """Stats accumulated over a single agent turn (or full session)."""
49
51
 
50
52
  request_count: int = 0
53
+ """Total LLM API requests made.
54
+
55
+ Each chunk with `usage_metadata` counts as one completed request.
56
+ """
57
+
51
58
  input_tokens: int = 0
59
+ """Cumulative input tokens across all LLM requests."""
60
+
52
61
  output_tokens: int = 0
62
+ """Cumulative output tokens across all LLM requests."""
63
+
53
64
  wall_time_seconds: float = 0.0
54
- per_model: dict[str, ModelStats] = field(default_factory=dict)
65
+ """Wall-clock duration from stream start to end."""
66
+
67
+ per_model: dict[ModelStatsKey, ModelStats] = field(default_factory=dict)
68
+ """Per-model breakdown keyed by `(provider, model_name)`.
69
+
70
+ Populated only when `record_request` receives a non-empty `model_name`. Empty
71
+ dict means no named-model requests were recorded; `print_usage_table` omits
72
+ the model table in that case and shows only the wall-time line (if applicable).
73
+ """
55
74
 
56
75
  def record_request(
57
76
  self,
58
77
  model_name: str,
59
78
  input_toks: int,
60
79
  output_toks: int,
80
+ provider: str = "",
61
81
  ) -> None:
62
82
  """Accumulate token counts for one completed LLM request.
63
83
 
64
84
  Updates both the session totals and the per-model breakdown.
65
85
 
66
86
  Args:
67
- model_name: The model that served this request (used as the
68
- per-model key). Pass an empty string to skip the per-model
69
- breakdown for this request.
87
+ model_name: The model that served this request. Combined with
88
+ `provider` to form the per-model key. Pass an empty string to
89
+ skip the per-model breakdown for this request.
70
90
  input_toks: Input tokens for this request.
71
91
  output_toks: Output tokens for this request.
92
+ provider: Provider that served the model (e.g. `openai`). Combined
93
+ with `model_name` to form the per-model key, so the same model
94
+ served by different providers is tracked separately.
72
95
  """
73
96
  self.request_count += 1
74
97
  self.input_tokens += input_toks
75
98
  self.output_tokens += output_toks
76
99
  if model_name:
77
- entry = self.per_model.setdefault(model_name, ModelStats())
100
+ key = (provider, model_name)
101
+ entry = self.per_model.setdefault(
102
+ key,
103
+ ModelStats(provider=provider, model_name=model_name),
104
+ )
78
105
  entry.request_count += 1
79
106
  entry.input_tokens += input_toks
80
107
  entry.output_tokens += output_toks
@@ -91,8 +118,11 @@ class SessionStats:
91
118
  self.input_tokens += other.input_tokens
92
119
  self.output_tokens += other.output_tokens
93
120
  self.wall_time_seconds += other.wall_time_seconds
94
- for model, ms in other.per_model.items():
95
- entry = self.per_model.setdefault(model, ModelStats())
121
+ for key, ms in other.per_model.items():
122
+ entry = self.per_model.setdefault(
123
+ key,
124
+ ModelStats(provider=ms.provider, model_name=ms.model_name),
125
+ )
96
126
  entry.request_count += ms.request_count
97
127
  entry.input_tokens += ms.input_tokens
98
128
  entry.output_tokens += ms.output_tokens
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Keep the `x-release-please-version` annotation — release-please uses it to
4
4
  # bump `__version__` in sync with `pyproject.toml` on every release PR.
5
- __version__ = "0.1.18" # x-release-please-version
5
+ __version__ = "0.1.20" # x-release-please-version
6
6
 
7
7
  DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/code"
8
8
  """URL for `deepagents-code` documentation."""