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.
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/.gitignore +1 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/CHANGELOG.md +33 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/PKG-INFO +1 -1
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_constants.py +9 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_env_vars.py +19 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_session_stats.py +58 -28
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/app.py +511 -77
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/config.py +62 -1
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/config_manifest.py +127 -11
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/main.py +5 -3
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/model_config.py +64 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/non_interactive.py +5 -2
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/notifications.py +3 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/remote_client.py +16 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/server.py +37 -4
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/server_manager.py +5 -1
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/sessions.py +16 -5
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/textual_adapter.py +22 -9
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/auth.py +158 -13
- deepagents_code-0.1.20/deepagents_code/widgets/install_confirm.py +248 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/messages.py +76 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/model_selector.py +238 -53
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/thread_selector.py +13 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/update_progress.py +2 -1
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/welcome.py +133 -30
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/pyproject.toml +1 -1
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/scripts/install.sh +21 -15
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_app.py +805 -12
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_auth_widgets.py +273 -5
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_config.py +58 -3
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_config_manifest.py +164 -9
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_install_command.py +169 -19
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_install_confirm.py +80 -1
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_install_script.py +77 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_main.py +9 -4
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_messages.py +137 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_model_config.py +103 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_model_selector.py +481 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_non_interactive.py +49 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_remote_client.py +67 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server.py +211 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server_manager.py +36 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_session_stats.py +43 -7
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sessions.py +91 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_textual_adapter.py +124 -14
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_thread_selector.py +15 -0
- deepagents_code-0.1.20/tests/unit_tests/test_tracing_replicas.py +70 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_welcome.py +170 -12
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/uv.lock +1 -1
- deepagents_code-0.1.18/deepagents_code/widgets/install_confirm.py +0 -120
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/AGENTS.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/COMMANDS.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/DEV.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/Makefile +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/README.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/agent.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/auth_commands.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/config_commands.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/filesystem_empty_result.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/hooks.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_commands.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/mcp_trust.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/_links.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/approval.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/diff.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/history.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/loading.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/message_store.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/status.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/deepagents_code/widgets/update_available.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/images/tui.png +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/README.md +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_auth_commands.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_filesystem_empty_result.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_history.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_launch_init.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_links.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_commands.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_status.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_update_progress.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.18 → deepagents_code-0.1.20}/tests/unit_tests/widgets/__init__.py +0 -0
- {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.
|
|
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
|
-
|
|
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
|
|
68
|
-
per-model key
|
|
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
|
-
|
|
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
|
|
95
|
-
entry = self.per_model.setdefault(
|
|
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.
|
|
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."""
|