selectools 0.27.1__tar.gz → 0.27.2__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.
- {selectools-0.27.1/src/selectools.egg-info → selectools-0.27.2}/PKG-INFO +5 -1
- {selectools-0.27.1 → selectools-0.27.2}/README.md +4 -0
- {selectools-0.27.1 → selectools-0.27.2}/pyproject.toml +1 -1
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/__init__.py +1 -1
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/config.py +4 -1
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/core.py +28 -13
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/app.py +4 -2
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/types.py +9 -0
- {selectools-0.27.1 → selectools-0.27.2/src/selectools.egg-info}/PKG-INFO +5 -1
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_model_switching.py +46 -0
- {selectools-0.27.1 → selectools-0.27.2}/LICENSE +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/setup.cfg +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/_async_utils.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/_json_utils.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/a2a/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/a2a/client.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/a2a/server.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/a2a/types.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_lifecycle.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_memory_manager.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_planning.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_provider_caller.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_tool_executor.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/config_groups.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/analytics.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/audit.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/cache.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/cache_redis.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/cache_semantic.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/cancellation.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/checkpoint_postgres.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/coherence.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/compose.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/anthropic.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/cohere.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/gemini.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/openai.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/provider.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/entity_memory.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/env.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/__main__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/badge.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/dataset.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/evaluators.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/generator.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/history.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/html.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/junit.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/llm_evaluators.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/pairwise.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/regression.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/report.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/serve.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/snapshot.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/suite.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/templates.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/types.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/exceptions.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/base.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/format.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/injection.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/length.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/pii.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/pipeline.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/topic.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/toxicity.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_backends.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_graph.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_sanitizers.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_store_redis.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_store_supabase.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/loop_detection.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/_loop.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/bridge.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/client.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/config.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/multi.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/server.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/memory.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/models.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observe/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observe/langfuse.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observe/otel.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observe/trace_store.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observer.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/checkpoint.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/graph.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/node.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/state.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/supervisor.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/parser.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/debate.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/plan_and_execute.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/reflective.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/team_lead.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/pending.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/pipeline.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/policy.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/pricing.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/prompt.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/_openai_compat.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/anthropic_provider.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/azure_openai_provider.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/base.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/fallback.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/gemini_provider.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/litellm_provider.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/ollama_provider.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/openai_provider.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/router.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/stubs.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/bm25.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/chunking.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/hybrid.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/loaders.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/reranker.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/chroma.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/faiss.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/memory.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/pgvector.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/pinecone.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/qdrant.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/sqlite.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/vector_store.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/results.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/scheduler.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/security.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/_starlette_app.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/_static/builder.css +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/_static/builder.html +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/_static/builder.js +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/api.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/builder.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/cli.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/models.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/playground.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/sessions.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/stability.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/structured.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/code_reviewer.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/customer_support.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/data_analyst.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/rag_chatbot.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/research_assistant.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/token_estimation.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/browser_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/calculator_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/code_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/data_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/datetime_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/db_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/discord_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/email_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/file_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/github_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/image_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/linear_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/memory_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/notion_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/pdf_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/reasoning_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/s3_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/search_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/slack_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/text_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/web_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/__init__.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/base.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/decorators.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/loader.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/registry.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/trace.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/unified_memory.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools/usage.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/SOURCES.txt +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/dependency_links.txt +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/entry_points.txt +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/requires.txt +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/top_level.txt +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_a2a.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_agent_api.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_agent_hitl.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_approval_gate.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_architecture.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_async_observers.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_audit.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_bake_window_hunt.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_budget.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_bug_hunt_batch1_core.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_bug_hunt_batch1_security.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_bug_hunt_batch1_tools.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_bug_hunt_regression.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_cache.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_cache_redis.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_cancellation.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_checkpoint_postgres.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_coherence.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_concurrency_smoke.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_consolidation_regression.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_conversation_branching.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_coverage_orchestration.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_document_loaders_extended.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_langfuse_observer.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_multimodal.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_otel_observer.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_v0_21_0_apps.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_v0_21_0_simulations.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_entity_memory.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_env.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_advanced.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_cli.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_e2e.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_final.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_hardening.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_html_report.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_new_evaluators.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_ralph_bugs.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_release.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_serve.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_v017_features.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_v0191.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_features_in_graph.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_final_coverage_a.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_final_coverage_b.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_guardrails.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_guardrails_injection.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_hardening.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_backend.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_backend_redis.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_backend_supabase.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_graph.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_sanitizers.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_store_redis.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_store_supabase.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_stores.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_stores_error_handling.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_langfuse_observer.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_loop_detection.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_mcp.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_mcp_coverage.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_memory.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_memory_async.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_memory_boundary.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_memory_integration.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_multi_agent_edge_cases.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_multimodal.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_checkpoint.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_e2e.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_evals.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_graph.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_integration.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_primitives.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_supervisor.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_otel_observer.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_parser.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_patterns.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_pending.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_pending_redis_smoke.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_phase1_design_patterns.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_pipeline.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_pipeline_coverage.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_policy.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_prompt.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_prompt_compression.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_property_based.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_reasoning_strategy.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_remaining_coverage.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_results.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_routing_mode.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_scheduler.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_security.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_semantic_cache.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_serve_app_coverage.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_serve_cli.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_dynamodb.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_edge_cases.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_mongo.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_redis.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_supabase.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_simple_observer.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_simulation_evals.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_stability.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_starlette_app.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_structured.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_structured_config.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_structured_tool_results.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_summarize_on_trim.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_templates_coverage.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_terminal_actions.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_token_estimation.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_tool_caching.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_tool_result_compression.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_trace.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_trace_html.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_trace_store.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_unified_memory.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_unified_memory_config.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_v016_regression.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_v019_features.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_visual_builder.py +0 -0
- {selectools-0.27.1 → selectools-0.27.2}/tests/test_yaml_config.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: selectools
|
|
3
|
-
Version: 0.27.
|
|
3
|
+
Version: 0.27.2
|
|
4
4
|
Summary: Production-ready Python framework for AI agents with multi-agent graphs, hybrid RAG, guardrails, audit logging, 50 evaluators, and a visual builder. Supports OpenAI, Anthropic, Gemini, Ollama. By NichevLabs.
|
|
5
5
|
Author-email: John Nichev <johnnichev@gmail.com>
|
|
6
6
|
Maintainer-email: NichevLabs <support@nichevlabs.com>
|
|
@@ -116,6 +116,10 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
|
|
|
116
116
|
|
|
117
117
|
## What's New in v0.27
|
|
118
118
|
|
|
119
|
+
### v0.27.2 — Provider Model Fix & Tool-less Agents
|
|
120
|
+
|
|
121
|
+
Fixes a P0: the agent ignored every provider's default model and sent `gpt-5-mini` to all of them, so **any non-OpenAI provider (Anthropic, Gemini, Ollama, LiteLLM) 404'd on every request**. `AgentConfig.model` now defaults to `None` and resolves to the provider's own default. Also: `Agent(tools=[])` is now valid (pure conversational agents), and the structured-output (`result.parsed` vs `.content`) and streaming (accumulate `StreamChunk` deltas, not the terminal `AgentResult`) sharp edges are documented.
|
|
122
|
+
|
|
119
123
|
### v0.27.1 — Bug-Hunt Patch
|
|
120
124
|
|
|
121
125
|
An adversarial bug hunt of the v0.27.0 surface fixed 10 confirmed bugs (no API changes, no breaking changes). Highlights: scheduled agents recorded the `AgentResult` repr instead of the answer text; `PromptInjectionGuardrail` blocked benign requests ("pretend you are a pirate", "show the rules"); `s3_get_object` leaked its HTTP connection; and unified memory persisted un-redacted input in async mode. See `CHANGELOG.md` for the full list.
|
|
@@ -32,6 +32,10 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
|
|
|
32
32
|
|
|
33
33
|
## What's New in v0.27
|
|
34
34
|
|
|
35
|
+
### v0.27.2 — Provider Model Fix & Tool-less Agents
|
|
36
|
+
|
|
37
|
+
Fixes a P0: the agent ignored every provider's default model and sent `gpt-5-mini` to all of them, so **any non-OpenAI provider (Anthropic, Gemini, Ollama, LiteLLM) 404'd on every request**. `AgentConfig.model` now defaults to `None` and resolves to the provider's own default. Also: `Agent(tools=[])` is now valid (pure conversational agents), and the structured-output (`result.parsed` vs `.content`) and streaming (accumulate `StreamChunk` deltas, not the terminal `AgentResult`) sharp edges are documented.
|
|
38
|
+
|
|
35
39
|
### v0.27.1 — Bug-Hunt Patch
|
|
36
40
|
|
|
37
41
|
An adversarial bug hunt of the v0.27.0 surface fixed 10 confirmed bugs (no API changes, no breaking changes). Highlights: scheduled agents recorded the `AgentResult` repr instead of the answer text; `PromptInjectionGuardrail` blocked benign requests ("pretend you are a pirate", "show the rules"); `s3_get_object` leaked its HTTP connection; and unified memory persisted un-redacted input in async mode. See `CHANGELOG.md` for the full list.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "selectools"
|
|
7
|
-
version = "0.27.
|
|
7
|
+
version = "0.27.2"
|
|
8
8
|
description = "Production-ready Python framework for AI agents with multi-agent graphs, hybrid RAG, guardrails, audit logging, 50 evaluators, and a visual builder. Supports OpenAI, Anthropic, Gemini, Ollama. By NichevLabs."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -123,7 +123,10 @@ class AgentConfig:
|
|
|
123
123
|
"""
|
|
124
124
|
|
|
125
125
|
name: str = "agent"
|
|
126
|
-
|
|
126
|
+
# None means "use the provider's own default_model". A hardcoded default
|
|
127
|
+
# here would be sent to EVERY provider — e.g. an OpenAI model id reaching
|
|
128
|
+
# the Anthropic API and 404-ing on every call.
|
|
129
|
+
model: Optional[str] = None
|
|
127
130
|
temperature: float = 0.0
|
|
128
131
|
max_tokens: int = 1000
|
|
129
132
|
max_iterations: int = 6
|
|
@@ -160,11 +160,10 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
|
|
|
160
160
|
... memory=ConversationMemory(max_messages=20)
|
|
161
161
|
... )
|
|
162
162
|
"""
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
self.
|
|
167
|
-
self._tools_by_name = {tool.name: tool for tool in tools}
|
|
163
|
+
# An empty tool list is valid: a pure conversational agent (no tools)
|
|
164
|
+
# is a normal use case — the provider is simply called with no tools.
|
|
165
|
+
self.tools = tools or []
|
|
166
|
+
self._tools_by_name = {tool.name: tool for tool in self.tools}
|
|
168
167
|
self.provider = provider or OpenAIProvider()
|
|
169
168
|
strategy = config.reasoning_strategy if config else None
|
|
170
169
|
if prompt_builder:
|
|
@@ -248,10 +247,16 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
|
|
|
248
247
|
def _effective_model(self) -> str:
|
|
249
248
|
"""The model to use for the current iteration.
|
|
250
249
|
|
|
251
|
-
|
|
252
|
-
|
|
250
|
+
Resolution order: a ``model_selector`` override, then an explicit
|
|
251
|
+
``config.model``, then the provider's own ``default_model``. Without the
|
|
252
|
+
provider fallback a non-OpenAI provider would receive the OpenAI default
|
|
253
|
+
and 404. The final ``"gpt-5-mini"`` only applies to providers that expose
|
|
254
|
+
no default (e.g. the LocalProvider stub, which ignores the model).
|
|
253
255
|
"""
|
|
254
|
-
|
|
256
|
+
override = getattr(self, "_current_model", None) or self.config.model
|
|
257
|
+
if override:
|
|
258
|
+
return override
|
|
259
|
+
return getattr(self.provider, "default_model", None) or "gpt-5-mini"
|
|
255
260
|
|
|
256
261
|
def __call__(
|
|
257
262
|
self,
|
|
@@ -316,14 +321,11 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
|
|
|
316
321
|
|
|
317
322
|
Raises:
|
|
318
323
|
KeyError: If no tool with that name exists.
|
|
319
|
-
ValueError: If removing would leave the agent with zero tools.
|
|
320
324
|
"""
|
|
321
325
|
if tool_name not in self._tools_by_name:
|
|
322
326
|
raise KeyError(
|
|
323
327
|
f"Tool '{tool_name}' not found. Available: {', '.join(self._tools_by_name.keys())}"
|
|
324
328
|
)
|
|
325
|
-
if len(self.tools) <= 1:
|
|
326
|
-
raise ValueError("Agent requires at least one tool.")
|
|
327
329
|
|
|
328
330
|
removed = self._tools_by_name.pop(tool_name)
|
|
329
331
|
self.tools = [t for t in self.tools if t.name != tool_name]
|
|
@@ -1391,8 +1393,21 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
|
|
|
1391
1393
|
parent_run_id: Optional run-ID of a parent agent for trace linking.
|
|
1392
1394
|
|
|
1393
1395
|
Yields:
|
|
1394
|
-
StreamChunk:
|
|
1395
|
-
AgentResult:
|
|
1396
|
+
StreamChunk: incremental content deltas (and tool-call chunks).
|
|
1397
|
+
AgentResult: the final, complete result — yielded once at the very
|
|
1398
|
+
end. Its ``.content`` is the WHOLE answer, not a delta.
|
|
1399
|
+
|
|
1400
|
+
Consuming the stream — accumulate the ``StreamChunk`` deltas and treat
|
|
1401
|
+
the terminal ``AgentResult`` separately. Do NOT add the final
|
|
1402
|
+
``AgentResult.content`` to the accumulated deltas, or you will get the
|
|
1403
|
+
answer twice::
|
|
1404
|
+
|
|
1405
|
+
text = ""
|
|
1406
|
+
async for chunk in agent.astream("..."):
|
|
1407
|
+
if isinstance(chunk, StreamChunk):
|
|
1408
|
+
text += chunk.content or "" # deltas only
|
|
1409
|
+
else: # AgentResult (terminal)
|
|
1410
|
+
result = chunk # full answer + metadata
|
|
1396
1411
|
"""
|
|
1397
1412
|
messages = self._normalize_messages(messages)
|
|
1398
1413
|
|
|
@@ -172,7 +172,9 @@ class AgentRouter:
|
|
|
172
172
|
response = HealthResponse(
|
|
173
173
|
status="ok",
|
|
174
174
|
version=__version__,
|
|
175
|
-
model
|
|
175
|
+
# Report the resolved model (config.model may be None = use the
|
|
176
|
+
# provider's default).
|
|
177
|
+
model=self.agent._effective_model,
|
|
176
178
|
provider=getattr(self.agent.provider, "name", "unknown"),
|
|
177
179
|
tools=[t.name for t in self.agent.tools],
|
|
178
180
|
)
|
|
@@ -188,7 +190,7 @@ class AgentRouter:
|
|
|
188
190
|
"""Handle GET /schema."""
|
|
189
191
|
return {
|
|
190
192
|
"tools": [t.schema() for t in self.agent.tools],
|
|
191
|
-
"model": self.agent.
|
|
193
|
+
"model": self.agent._effective_model,
|
|
192
194
|
}
|
|
193
195
|
|
|
194
196
|
|
|
@@ -328,6 +328,15 @@ class AgentResult:
|
|
|
328
328
|
{'query': 'Python'}
|
|
329
329
|
>>> result.iterations
|
|
330
330
|
2
|
|
331
|
+
|
|
332
|
+
Structured output: when ``response_format`` is set, the validated object is
|
|
333
|
+
on ``result.parsed`` — ``result.content`` stays the raw JSON *text*::
|
|
334
|
+
|
|
335
|
+
>>> result = agent.run("Extract: John is 30", response_format=Person)
|
|
336
|
+
>>> result.parsed # the typed object you want
|
|
337
|
+
Person(name='John', age=30)
|
|
338
|
+
>>> result.content # the JSON string, NOT the object
|
|
339
|
+
'{"name": "John", "age": 30}'
|
|
331
340
|
"""
|
|
332
341
|
|
|
333
342
|
message: Message
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: selectools
|
|
3
|
-
Version: 0.27.
|
|
3
|
+
Version: 0.27.2
|
|
4
4
|
Summary: Production-ready Python framework for AI agents with multi-agent graphs, hybrid RAG, guardrails, audit logging, 50 evaluators, and a visual builder. Supports OpenAI, Anthropic, Gemini, Ollama. By NichevLabs.
|
|
5
5
|
Author-email: John Nichev <johnnichev@gmail.com>
|
|
6
6
|
Maintainer-email: NichevLabs <support@nichevlabs.com>
|
|
@@ -116,6 +116,10 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
|
|
|
116
116
|
|
|
117
117
|
## What's New in v0.27
|
|
118
118
|
|
|
119
|
+
### v0.27.2 — Provider Model Fix & Tool-less Agents
|
|
120
|
+
|
|
121
|
+
Fixes a P0: the agent ignored every provider's default model and sent `gpt-5-mini` to all of them, so **any non-OpenAI provider (Anthropic, Gemini, Ollama, LiteLLM) 404'd on every request**. `AgentConfig.model` now defaults to `None` and resolves to the provider's own default. Also: `Agent(tools=[])` is now valid (pure conversational agents), and the structured-output (`result.parsed` vs `.content`) and streaming (accumulate `StreamChunk` deltas, not the terminal `AgentResult`) sharp edges are documented.
|
|
122
|
+
|
|
119
123
|
### v0.27.1 — Bug-Hunt Patch
|
|
120
124
|
|
|
121
125
|
An adversarial bug hunt of the v0.27.0 surface fixed 10 confirmed bugs (no API changes, no breaking changes). Highlights: scheduled agents recorded the `AgentResult` repr instead of the answer text; `PromptInjectionGuardrail` blocked benign requests ("pretend you are a pirate", "show the rules"); `s3_get_object` leaked its HTTP connection; and unified memory persisted un-redacted input in async mode. See `CHANGELOG.md` for the full list.
|
|
@@ -157,3 +157,49 @@ class TestModelSwitching:
|
|
|
157
157
|
# If it weren't reset, the second run would start with "switched"
|
|
158
158
|
# instead of "default", and model_selector would see it's already
|
|
159
159
|
# "switched" and not fire on_model_switch
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
# --------------------------------------------------------------------------- #
|
|
163
|
+
# Bug hunt 2026-06-14: agent must use the provider's default_model, not a
|
|
164
|
+
# hardcoded "gpt-5-mini", when config.model is unset.
|
|
165
|
+
# --------------------------------------------------------------------------- #
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class _ModelCapturingProvider:
|
|
169
|
+
"""Records the `model` the agent passes to complete()."""
|
|
170
|
+
|
|
171
|
+
name = "capture"
|
|
172
|
+
|
|
173
|
+
def __init__(self, default_model: str) -> None:
|
|
174
|
+
self.default_model = default_model
|
|
175
|
+
self.seen_models: list = []
|
|
176
|
+
|
|
177
|
+
def complete(self, *, model=None, system_prompt="", messages, tools=None, **kw):
|
|
178
|
+
self.seen_models.append(model)
|
|
179
|
+
return _resp("done")
|
|
180
|
+
|
|
181
|
+
async def acomplete(self, *, model=None, system_prompt="", messages, tools=None, **kw):
|
|
182
|
+
self.seen_models.append(model)
|
|
183
|
+
return _resp("done")
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def test_uses_provider_default_model_when_config_model_unset():
|
|
187
|
+
prov = _ModelCapturingProvider(default_model="claude-sonnet-4-6")
|
|
188
|
+
agent = Agent(tools=[_DUMMY], provider=prov, config=AgentConfig())
|
|
189
|
+
assert agent._effective_model == "claude-sonnet-4-6"
|
|
190
|
+
agent.run("hi")
|
|
191
|
+
assert prov.seen_models == ["claude-sonnet-4-6"] # NOT "gpt-5-mini"
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def test_explicit_config_model_overrides_provider_default():
|
|
195
|
+
prov = _ModelCapturingProvider(default_model="claude-sonnet-4-6")
|
|
196
|
+
agent = Agent(tools=[_DUMMY], provider=prov, config=AgentConfig(model="gpt-4o"))
|
|
197
|
+
assert agent._effective_model == "gpt-4o"
|
|
198
|
+
agent.run("hi")
|
|
199
|
+
assert prov.seen_models == ["gpt-4o"]
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def test_config_model_defaults_to_none():
|
|
203
|
+
# The default must be None (sentinel for "use the provider default"), not a
|
|
204
|
+
# hardcoded model id that would reach every provider.
|
|
205
|
+
assert AgentConfig().model is None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|