selectools 0.29.0__tar.gz → 1.0.1__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.29.0/src/selectools.egg-info → selectools-1.0.1}/PKG-INFO +29 -12
- {selectools-0.29.0 → selectools-1.0.1}/README.md +26 -8
- {selectools-0.29.0 → selectools-1.0.1}/pyproject.toml +7 -7
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/__init__.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/_async_utils.py +7 -30
- selectools-1.0.1/src/selectools/_time.py +42 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_lifecycle.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_memory_manager.py +0 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_provider_caller.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_tool_executor.py +3 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/config.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/config_groups.py +1 -4
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/core.py +2 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/audit.py +0 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/cache.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/cache_semantic.py +2 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/checkpoint_postgres.py +3 -5
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/compose.py +1 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/evaluators.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/history.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/pairwise.py +2 -6
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/serve.py +1 -5
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/templates.py +1 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/pipeline.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/topic.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge.py +8 -8
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_graph.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_store_redis.py +3 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_store_supabase.py +3 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/loop_detection.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/bridge.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/client.py +1 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/config.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/multi.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/server.py +1 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observe/langfuse.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observe/otel.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observe/trace_store.py +5 -7
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observer.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/checkpoint.py +5 -4
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/graph.py +4 -7
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/node.py +1 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/state.py +3 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/supervisor.py +3 -7
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/debate.py +2 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/plan_and_execute.py +2 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/reflective.py +2 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/team_lead.py +2 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/_openai_compat.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/anthropic_provider.py +0 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/azure_openai_provider.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/base.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/fallback.py +1 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/ollama_provider.py +1 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/bm25.py +0 -6
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/chunking.py +2 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/hybrid.py +2 -18
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/loaders.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/faiss.py +3 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/memory.py +0 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/pgvector.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/pinecone.py +5 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/qdrant.py +2 -4
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/sqlite.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/scheduler.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/app.py +1 -3
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/cli.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/models.py +0 -25
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/sessions.py +2 -6
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/stability.py +2 -2
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/datetime_tools.py +0 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/base.py +0 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/trace.py +1 -1
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/unified_memory.py +2 -3
- {selectools-0.29.0 → selectools-1.0.1/src/selectools.egg-info}/PKG-INFO +29 -12
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/SOURCES.txt +2 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_integration.py +4 -1
- selectools-1.0.1/tests/test_time.py +66 -0
- {selectools-0.29.0 → selectools-1.0.1}/LICENSE +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/setup.cfg +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/_json_utils.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/_ssrf.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/a2a/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/a2a/client.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/a2a/server.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/a2a/types.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_planning.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/analytics.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/cache_redis.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/cancellation.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/coherence.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/anthropic.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/cohere.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/gemini.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/openai.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/provider.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/entity_memory.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/env.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/__main__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/badge.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/dataset.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/generator.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/html.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/junit.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/llm_evaluators.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/regression.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/report.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/snapshot.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/suite.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/types.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/exceptions.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/base.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/format.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/injection.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/length.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/pii.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/toxicity.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_backends.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_sanitizers.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/_loop.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/memory.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/models.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observe/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/parser.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/pending.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/pipeline.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/policy.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/pricing.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/prompt.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/gemini_provider.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/litellm_provider.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/openai_provider.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/router.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/stubs.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/reranker.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/chroma.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/vector_store.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/results.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/security.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/_starlette_app.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/_static/builder.css +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/_static/builder.html +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/_static/builder.js +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/api.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/builder.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/playground.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/structured.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/code_reviewer.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/customer_support.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/data_analyst.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/rag_chatbot.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/research_assistant.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/token_estimation.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/browser_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/calculator_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/code_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/data_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/db_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/discord_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/email_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/file_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/github_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/image_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/linear_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/memory_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/notion_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/pdf_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/reasoning_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/s3_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/search_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/slack_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/text_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/web_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/__init__.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/decorators.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/loader.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/registry.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/types.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools/usage.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/dependency_links.txt +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/entry_points.txt +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/requires.txt +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/top_level.txt +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_a2a.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_agent_api.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_agent_hitl.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_approval_gate.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_architecture.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_async_observers.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_audit.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_bake_window_hunt.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_budget.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_bug_hunt_batch1_core.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_bug_hunt_batch1_security.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_bug_hunt_batch1_tools.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_bug_hunt_regression.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_cache.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_cache_redis.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_cancellation.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_checkpoint_postgres.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_coherence.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_concurrency_smoke.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_consolidation_regression.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_conversation_branching.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_coverage_orchestration.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_document_loaders_extended.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_langfuse_observer.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_multimodal.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_otel_observer.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_v0_21_0_apps.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_v0_21_0_simulations.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_entity_memory.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_env.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_advanced.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_cli.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_e2e.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_final.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_hardening.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_html_report.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_new_evaluators.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_ralph_bugs.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_release.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_serve.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_v017_features.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_v0191.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_features_in_graph.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_final_coverage_a.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_final_coverage_b.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_guardrails.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_guardrails_injection.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_hardening.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_backend.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_backend_redis.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_backend_supabase.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_graph.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_sanitizers.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_store_redis.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_store_supabase.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_stores.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_stores_error_handling.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_langfuse_observer.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_loop_detection.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_mcp.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_mcp_coverage.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_memory.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_memory_async.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_memory_boundary.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_memory_integration.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_model_switching.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_multi_agent_edge_cases.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_multimodal.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_checkpoint.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_e2e.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_evals.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_graph.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_primitives.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_supervisor.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_otel_observer.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_parser.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_patterns.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_pending.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_pending_redis_smoke.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_phase1_design_patterns.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_pipeline.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_pipeline_coverage.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_policy.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_prompt.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_prompt_compression.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_property_based.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_reasoning_strategy.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_remaining_coverage.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_results.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_routing_mode.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_scheduler.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_security.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_semantic_cache.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_serve_app_coverage.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_serve_cli.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_dynamodb.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_edge_cases.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_mongo.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_redis.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_supabase.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_simple_observer.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_simulation_evals.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_ssrf.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_stability.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_starlette_app.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_structured.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_structured_config.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_structured_tool_results.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_summarize_on_trim.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_templates_coverage.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_terminal_actions.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_token_estimation.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_tool_caching.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_tool_result_compression.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_trace.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_trace_html.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_trace_store.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_unified_memory.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_unified_memory_config.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_v016_regression.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_v019_features.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_visual_builder.py +0 -0
- {selectools-0.29.0 → selectools-1.0.1}/tests/test_yaml_config.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: selectools
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.1
|
|
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>
|
|
@@ -14,17 +14,16 @@ Project-URL: Builder, https://selectools.dev/builder/
|
|
|
14
14
|
Project-URL: Examples, https://selectools.dev/examples/
|
|
15
15
|
Project-URL: NichevLabs, https://nichevlabs.com
|
|
16
16
|
Keywords: llm,ai,agent,agents,multi-agent,agent-framework,tool-calling,openai,anthropic,gemini,ollama,rag,hybrid-search,vector-search,embeddings,guardrails,evals,evaluators,visual-builder,structured-output,observability,fallback,langchain-alternative
|
|
17
|
-
Classifier: Development Status ::
|
|
17
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
18
18
|
Classifier: Intended Audience :: Developers
|
|
19
19
|
Classifier: Programming Language :: Python :: 3
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.10
|
|
22
21
|
Classifier: Programming Language :: Python :: 3.11
|
|
23
22
|
Classifier: Programming Language :: Python :: 3.12
|
|
24
23
|
Classifier: Programming Language :: Python :: 3.13
|
|
25
24
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
25
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
27
|
-
Requires-Python: >=3.
|
|
26
|
+
Requires-Python: >=3.10
|
|
28
27
|
Description-Content-Type: text/markdown
|
|
29
28
|
License-File: LICENSE
|
|
30
29
|
Requires-Dist: openai<2.0.0,>=1.30.0
|
|
@@ -104,6 +103,8 @@ An open-source project from **[NichevLabs](https://nichevlabs.com)**.
|
|
|
104
103
|
|
|
105
104
|
**Multi-agent orchestration in plain Python.** Build agent graphs, compose pipelines with `|`, deploy with one command. No DSL, no compile step, no paid debugger. Works with OpenAI, Anthropic, Gemini, and Ollama.
|
|
106
105
|
|
|
106
|
+
> 🎉 **selectools is 1.0 — stable.** The public API is frozen; `@stable` symbols carry a 2-minor compatibility promise. Python 3.10+. See [What's New in v1.0](#whats-new-in-v10).
|
|
107
|
+
|
|
107
108
|
### 3 Ways to Build
|
|
108
109
|
|
|
109
110
|
```python
|
|
@@ -118,6 +119,16 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
|
|
|
118
119
|
# selectools serve agent.yaml
|
|
119
120
|
```
|
|
120
121
|
|
|
122
|
+
## What's New in v1.0
|
|
123
|
+
|
|
124
|
+
### v1.0.0 — Stable
|
|
125
|
+
|
|
126
|
+
selectools is **1.0**. The public API is frozen and `@stable` symbols now carry a real compatibility promise — no removal or breaking signature change without a deprecation cycle spanning at least two minor releases. The package is `Development Status :: 5 - Production/Stable`.
|
|
127
|
+
|
|
128
|
+
- **Frozen, marked surface** — every public symbol carries a `@stable`/`@beta` marker (CI-enforced). The stable set covers the agent loop and config, providers, tools and the mature toolbox, sessions, memory, guardrails, orchestration graphs, the pattern agents, the policy layer, and the core types. RAG/embeddings, MCP, A2A, the evaluator catalog, unified memory, the scheduler, and the newest backends stay `@beta` and keep evolving in 1.x.
|
|
129
|
+
- **Python 3.10+** *(breaking)* — Python 3.9 reached end-of-life in October 2025 and is dropped; the minimum is now 3.10 (CI runs 3.10–3.13). Pin `selectools<1.0` to stay on 3.9.
|
|
130
|
+
- Aside from the 3.9 drop, code that ran deprecation-warning-free on the latest 0.x release runs unmodified on 1.0. See `docs/MIGRATION_1.0.md`.
|
|
131
|
+
|
|
121
132
|
## What's New in v0.29
|
|
122
133
|
|
|
123
134
|
### v0.29.0 — Stability Promotions (v1.0 Freeze Prep)
|
|
@@ -349,19 +360,25 @@ selectools serve --builder
|
|
|
349
360
|
|
|
350
361
|
### v0.19.3 — Stability Markers Applied to All Public APIs
|
|
351
362
|
|
|
352
|
-
Every public class and function exported from `selectools`
|
|
363
|
+
Every public class and function exported from `selectools` carries a stability
|
|
364
|
+
marker. As of 1.0, `@stable` symbols carry a compatibility promise — no removal
|
|
365
|
+
or breaking signature change without a deprecation cycle of at least two minors:
|
|
353
366
|
|
|
354
367
|
```python
|
|
355
|
-
from selectools import Agent, AgentGraph,
|
|
368
|
+
from selectools import Agent, AgentGraph, AgentScheduler
|
|
356
369
|
|
|
357
|
-
print(Agent.__stability__)
|
|
358
|
-
print(AgentGraph.__stability__)
|
|
359
|
-
print(
|
|
370
|
+
print(Agent.__stability__) # "stable"
|
|
371
|
+
print(AgentGraph.__stability__) # "stable" (promoted for 1.0)
|
|
372
|
+
print(AgentScheduler.__stability__) # "beta" (still iterating)
|
|
360
373
|
```
|
|
361
374
|
|
|
362
|
-
**`@stable`** —
|
|
375
|
+
**`@stable`** — the frozen core: Agent, AgentConfig, providers, memory, tools and
|
|
376
|
+
the mature toolbox, sessions, guardrails, orchestration graphs, the pattern
|
|
377
|
+
agents, the policy layer, and the core types.
|
|
363
378
|
|
|
364
|
-
**`@beta`** —
|
|
379
|
+
**`@beta`** — subsystems still evolving in 1.x: RAG/embeddings, MCP, A2A, the
|
|
380
|
+
evaluator catalog, unified memory, the scheduler, and the newest backends. Run
|
|
381
|
+
`python scripts/stability_audit.py` for the live marker map.
|
|
365
382
|
|
|
366
383
|
### v0.19.2 — Enterprise Hardening
|
|
367
384
|
|
|
@@ -555,7 +572,7 @@ def web_search(query: str) -> str:
|
|
|
555
572
|
return expensive_api_call(query)
|
|
556
573
|
```
|
|
557
574
|
|
|
558
|
-
Also: Python 3.
|
|
575
|
+
Also: Python 3.10–3.13 CI matrix (verified zero compatibility issues).
|
|
559
576
|
|
|
560
577
|
</details>
|
|
561
578
|
|
|
@@ -16,6 +16,8 @@ An open-source project from **[NichevLabs](https://nichevlabs.com)**.
|
|
|
16
16
|
|
|
17
17
|
**Multi-agent orchestration in plain Python.** Build agent graphs, compose pipelines with `|`, deploy with one command. No DSL, no compile step, no paid debugger. Works with OpenAI, Anthropic, Gemini, and Ollama.
|
|
18
18
|
|
|
19
|
+
> 🎉 **selectools is 1.0 — stable.** The public API is frozen; `@stable` symbols carry a 2-minor compatibility promise. Python 3.10+. See [What's New in v1.0](#whats-new-in-v10).
|
|
20
|
+
|
|
19
21
|
### 3 Ways to Build
|
|
20
22
|
|
|
21
23
|
```python
|
|
@@ -30,6 +32,16 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
|
|
|
30
32
|
# selectools serve agent.yaml
|
|
31
33
|
```
|
|
32
34
|
|
|
35
|
+
## What's New in v1.0
|
|
36
|
+
|
|
37
|
+
### v1.0.0 — Stable
|
|
38
|
+
|
|
39
|
+
selectools is **1.0**. The public API is frozen and `@stable` symbols now carry a real compatibility promise — no removal or breaking signature change without a deprecation cycle spanning at least two minor releases. The package is `Development Status :: 5 - Production/Stable`.
|
|
40
|
+
|
|
41
|
+
- **Frozen, marked surface** — every public symbol carries a `@stable`/`@beta` marker (CI-enforced). The stable set covers the agent loop and config, providers, tools and the mature toolbox, sessions, memory, guardrails, orchestration graphs, the pattern agents, the policy layer, and the core types. RAG/embeddings, MCP, A2A, the evaluator catalog, unified memory, the scheduler, and the newest backends stay `@beta` and keep evolving in 1.x.
|
|
42
|
+
- **Python 3.10+** *(breaking)* — Python 3.9 reached end-of-life in October 2025 and is dropped; the minimum is now 3.10 (CI runs 3.10–3.13). Pin `selectools<1.0` to stay on 3.9.
|
|
43
|
+
- Aside from the 3.9 drop, code that ran deprecation-warning-free on the latest 0.x release runs unmodified on 1.0. See `docs/MIGRATION_1.0.md`.
|
|
44
|
+
|
|
33
45
|
## What's New in v0.29
|
|
34
46
|
|
|
35
47
|
### v0.29.0 — Stability Promotions (v1.0 Freeze Prep)
|
|
@@ -261,19 +273,25 @@ selectools serve --builder
|
|
|
261
273
|
|
|
262
274
|
### v0.19.3 — Stability Markers Applied to All Public APIs
|
|
263
275
|
|
|
264
|
-
Every public class and function exported from `selectools`
|
|
276
|
+
Every public class and function exported from `selectools` carries a stability
|
|
277
|
+
marker. As of 1.0, `@stable` symbols carry a compatibility promise — no removal
|
|
278
|
+
or breaking signature change without a deprecation cycle of at least two minors:
|
|
265
279
|
|
|
266
280
|
```python
|
|
267
|
-
from selectools import Agent, AgentGraph,
|
|
281
|
+
from selectools import Agent, AgentGraph, AgentScheduler
|
|
268
282
|
|
|
269
|
-
print(Agent.__stability__)
|
|
270
|
-
print(AgentGraph.__stability__)
|
|
271
|
-
print(
|
|
283
|
+
print(Agent.__stability__) # "stable"
|
|
284
|
+
print(AgentGraph.__stability__) # "stable" (promoted for 1.0)
|
|
285
|
+
print(AgentScheduler.__stability__) # "beta" (still iterating)
|
|
272
286
|
```
|
|
273
287
|
|
|
274
|
-
**`@stable`** —
|
|
288
|
+
**`@stable`** — the frozen core: Agent, AgentConfig, providers, memory, tools and
|
|
289
|
+
the mature toolbox, sessions, guardrails, orchestration graphs, the pattern
|
|
290
|
+
agents, the policy layer, and the core types.
|
|
275
291
|
|
|
276
|
-
**`@beta`** —
|
|
292
|
+
**`@beta`** — subsystems still evolving in 1.x: RAG/embeddings, MCP, A2A, the
|
|
293
|
+
evaluator catalog, unified memory, the scheduler, and the newest backends. Run
|
|
294
|
+
`python scripts/stability_audit.py` for the live marker map.
|
|
277
295
|
|
|
278
296
|
### v0.19.2 — Enterprise Hardening
|
|
279
297
|
|
|
@@ -467,7 +485,7 @@ def web_search(query: str) -> str:
|
|
|
467
485
|
return expensive_api_call(query)
|
|
468
486
|
```
|
|
469
487
|
|
|
470
|
-
Also: Python 3.
|
|
488
|
+
Also: Python 3.10–3.13 CI matrix (verified zero compatibility issues).
|
|
471
489
|
|
|
472
490
|
</details>
|
|
473
491
|
|
|
@@ -4,10 +4,10 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "selectools"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "1.0.1"
|
|
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
|
-
requires-python = ">=3.
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
11
|
license = "Apache-2.0"
|
|
12
12
|
authors = [{name = "John Nichev", email = "johnnichev@gmail.com"}]
|
|
13
13
|
maintainers = [{name = "NichevLabs", email = "support@nichevlabs.com"}]
|
|
@@ -25,10 +25,9 @@ keywords = [
|
|
|
25
25
|
"structured-output", "observability", "fallback", "langchain-alternative",
|
|
26
26
|
]
|
|
27
27
|
classifiers = [
|
|
28
|
-
"Development Status ::
|
|
28
|
+
"Development Status :: 5 - Production/Stable",
|
|
29
29
|
"Intended Audience :: Developers",
|
|
30
30
|
"Programming Language :: Python :: 3",
|
|
31
|
-
"Programming Language :: Python :: 3.9",
|
|
32
31
|
"Programming Language :: Python :: 3.10",
|
|
33
32
|
"Programming Language :: Python :: 3.11",
|
|
34
33
|
"Programming Language :: Python :: 3.12",
|
|
@@ -130,7 +129,7 @@ where = ["src"]
|
|
|
130
129
|
|
|
131
130
|
[tool.ruff]
|
|
132
131
|
line-length = 100
|
|
133
|
-
target-version = "
|
|
132
|
+
target-version = "py310"
|
|
134
133
|
extend-exclude = [
|
|
135
134
|
".eggs",
|
|
136
135
|
".git",
|
|
@@ -155,15 +154,16 @@ ignore = [
|
|
|
155
154
|
"E501", # line too long (handled by formatter)
|
|
156
155
|
"E402", # module-level import not at top
|
|
157
156
|
"E721", # type comparison with == (allowed; legacy test pattern)
|
|
158
|
-
"F401", # unused imports (common in __init__.py re-exports)
|
|
159
157
|
"F541", # f-string without placeholder
|
|
160
|
-
"F841", # local variable assigned but never used
|
|
161
158
|
"B011", # do not call assert False
|
|
162
159
|
"B023", # function definition does not bind loop variable
|
|
163
160
|
"B904", # raise without `from` in except (TODO: fix pre-existing violations)
|
|
164
161
|
]
|
|
165
162
|
|
|
166
163
|
[tool.ruff.lint.per-file-ignores]
|
|
164
|
+
# F401 unused-import is expected in __init__.py re-export hubs (the public-API
|
|
165
|
+
# surface). Everywhere else, unused imports and unused locals are real findings.
|
|
166
|
+
"**/__init__.py" = ["F401"]
|
|
167
167
|
"tests/*" = ["B"]
|
|
168
168
|
"examples/*" = ["B", "F"]
|
|
169
169
|
"scripts/*" = ["B", "F"]
|
|
@@ -16,8 +16,15 @@ import asyncio
|
|
|
16
16
|
import contextvars
|
|
17
17
|
import threading
|
|
18
18
|
from concurrent.futures import ThreadPoolExecutor
|
|
19
|
+
from contextlib import aclosing
|
|
19
20
|
from typing import Any, Awaitable, Callable, Optional, TypeVar
|
|
20
21
|
|
|
22
|
+
# ``aclosing`` is re-exported from this module so existing call sites
|
|
23
|
+
# (agent._provider_caller, agent.core) and the regression test that imports it
|
|
24
|
+
# from here are unchanged. It was a local backport while selectools supported
|
|
25
|
+
# 3.9; the floor is now >=3.10, where ``contextlib.aclosing`` is stdlib.
|
|
26
|
+
__all__ = ["aclosing", "run_sync", "run_in_executor_copyctx"]
|
|
27
|
+
|
|
21
28
|
T = TypeVar("T")
|
|
22
29
|
|
|
23
30
|
# Module-level singleton for running coroutines from sync code that is
|
|
@@ -63,36 +70,6 @@ def run_sync(coro: Awaitable[T]) -> T:
|
|
|
63
70
|
return future.result()
|
|
64
71
|
|
|
65
72
|
|
|
66
|
-
class aclosing: # noqa: N801 — intentionally matches stdlib contextlib.aclosing
|
|
67
|
-
"""Async context manager that calls ``aclose()`` on exit.
|
|
68
|
-
|
|
69
|
-
BUG-33 / Pydantic AI PRs #4476, #4205: ``async for item in gen:``
|
|
70
|
-
without a context manager leaks the async generator when the loop
|
|
71
|
-
body raises — ``gen.__aexit__`` runs under GC instead of
|
|
72
|
-
deterministically. ``contextlib.aclosing`` fixes this, but was only
|
|
73
|
-
added in Python 3.10 and selectools supports 3.9+. This class is a
|
|
74
|
-
drop-in backport that works on any Python version.
|
|
75
|
-
|
|
76
|
-
Usage::
|
|
77
|
-
|
|
78
|
-
async with aclosing(provider.astream(...)) as gen:
|
|
79
|
-
async for item in gen:
|
|
80
|
-
if stop_condition(item):
|
|
81
|
-
break # provider gen gets aclose()'d on exit
|
|
82
|
-
"""
|
|
83
|
-
|
|
84
|
-
def __init__(self, thing: Any) -> None:
|
|
85
|
-
self._thing = thing
|
|
86
|
-
|
|
87
|
-
async def __aenter__(self) -> Any:
|
|
88
|
-
"""Return the wrapped async iterable so callers can iterate it."""
|
|
89
|
-
return self._thing
|
|
90
|
-
|
|
91
|
-
async def __aexit__(self, *_exc: Any) -> None:
|
|
92
|
-
"""Call ``aclose()`` on the wrapped async iterable on exit."""
|
|
93
|
-
await self._thing.aclose()
|
|
94
|
-
|
|
95
|
-
|
|
96
73
|
async def run_in_executor_copyctx(
|
|
97
74
|
loop: asyncio.AbstractEventLoop,
|
|
98
75
|
executor: Optional[Any],
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Internal time helpers.
|
|
2
|
+
|
|
3
|
+
Centralizes ISO-8601 timestamp parsing so every persistence backend handles a
|
|
4
|
+
trailing ``Z`` (UTC designator) the same way.
|
|
5
|
+
|
|
6
|
+
``datetime.fromisoformat`` did not accept the ``Z`` suffix until Python 3.11.
|
|
7
|
+
On Python 3.10 (the project's minimum) a ``Z``-suffixed timestamp such as
|
|
8
|
+
``"2026-06-15T12:00:00Z"`` raises ``ValueError``. Postgres/Supabase/Redis and
|
|
9
|
+
other stores routinely return that form, so parsing it inline crashed the
|
|
10
|
+
knowledge and checkpoint loaders on 3.10. ``parse_iso`` normalizes the suffix
|
|
11
|
+
before delegating, so the same code works on every supported interpreter.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
|
+
from typing import Union
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def parse_iso(value: Union[str, datetime]) -> datetime:
|
|
21
|
+
"""Parse an ISO-8601 timestamp, tolerating a trailing ``Z`` (UTC).
|
|
22
|
+
|
|
23
|
+
Accepts either a string or an already-parsed ``datetime`` (returned as-is,
|
|
24
|
+
so callers reading columns that may already be typed do not need their own
|
|
25
|
+
``isinstance`` guard). Timezone awareness is preserved exactly as encoded:
|
|
26
|
+
an offset-bearing string (including ``Z``) yields an aware datetime; a naive
|
|
27
|
+
string yields a naive datetime. Use :func:`ensure_aware` when a guaranteed
|
|
28
|
+
aware value is required.
|
|
29
|
+
"""
|
|
30
|
+
if isinstance(value, datetime):
|
|
31
|
+
return value
|
|
32
|
+
s = str(value)
|
|
33
|
+
if s.endswith("Z"):
|
|
34
|
+
s = s[:-1] + "+00:00"
|
|
35
|
+
return datetime.fromisoformat(s)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def ensure_aware(dt: datetime, *, tz: timezone = timezone.utc) -> datetime:
|
|
39
|
+
"""Attach ``tz`` (default UTC) to a naive datetime; pass aware ones through."""
|
|
40
|
+
if dt.tzinfo is None:
|
|
41
|
+
return dt.replace(tzinfo=tz)
|
|
42
|
+
return dt
|
|
@@ -6,7 +6,7 @@ import asyncio
|
|
|
6
6
|
import threading
|
|
7
7
|
import time
|
|
8
8
|
from concurrent.futures import ThreadPoolExecutor
|
|
9
|
-
from typing import TYPE_CHECKING,
|
|
9
|
+
from typing import TYPE_CHECKING, Callable, List, Optional, Tuple
|
|
10
10
|
|
|
11
11
|
# Module-level singleton for running sync provider calls in an async context.
|
|
12
12
|
# Creating a new ThreadPoolExecutor per call (inside a retry loop) wastes
|
|
@@ -57,8 +57,8 @@ def _get_parallel_dispatch_executor() -> ThreadPoolExecutor:
|
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
from .._async_utils import run_in_executor_copyctx
|
|
60
|
-
from ..coherence import
|
|
61
|
-
from ..policy import ApprovalRequest, PolicyDecision, PolicyResult
|
|
60
|
+
from ..coherence import acheck_coherence, check_coherence
|
|
61
|
+
from ..policy import ApprovalRequest, PolicyDecision, PolicyResult
|
|
62
62
|
from ..security import screen_output as screen_tool_output
|
|
63
63
|
from ..trace import StepType, TraceStep
|
|
64
64
|
from ..types import Message, Role
|
|
@@ -1215,7 +1215,7 @@ class _ToolExecutorMixin:
|
|
|
1215
1215
|
for i in candidate_indices
|
|
1216
1216
|
]
|
|
1217
1217
|
)
|
|
1218
|
-
for i, text in zip(candidate_indices, compressed_texts):
|
|
1218
|
+
for i, text in zip(candidate_indices, compressed_texts, strict=False):
|
|
1219
1219
|
compressed_by_index[i] = text
|
|
1220
1220
|
self._store_compressed_in_cache(
|
|
1221
1221
|
results[i].tool, results[i].tool_call.parameters, results[i].result, text
|
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
|
7
7
|
from dataclasses import dataclass, field
|
|
8
8
|
from typing import TYPE_CHECKING, Any, Callable, Coroutine, Dict, List, Optional, Union
|
|
9
9
|
|
|
10
|
-
from ..stability import
|
|
10
|
+
from ..stability import stable
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
13
|
from ..cache import Cache
|
|
@@ -24,23 +24,20 @@ Usage::
|
|
|
24
24
|
from __future__ import annotations
|
|
25
25
|
|
|
26
26
|
from dataclasses import dataclass, field
|
|
27
|
-
from typing import TYPE_CHECKING, Any,
|
|
27
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
|
|
28
28
|
|
|
29
29
|
from ..stability import stable
|
|
30
30
|
|
|
31
31
|
if TYPE_CHECKING:
|
|
32
|
-
from ..cache import Cache
|
|
33
32
|
from ..cancellation import CancellationToken
|
|
34
33
|
from ..entity_memory import EntityMemory
|
|
35
34
|
from ..guardrails import GuardrailsPipeline
|
|
36
35
|
from ..knowledge import KnowledgeMemory
|
|
37
36
|
from ..knowledge_graph import KnowledgeGraphMemory
|
|
38
|
-
from ..observer import AgentObserver
|
|
39
37
|
from ..policy import ToolPolicy
|
|
40
38
|
from ..providers.base import Provider
|
|
41
39
|
from ..sessions import SessionStore
|
|
42
40
|
from ..unified_memory import UnifiedMemory
|
|
43
|
-
from ..usage import AgentUsage
|
|
44
41
|
|
|
45
42
|
|
|
46
43
|
@stable
|
|
@@ -17,7 +17,7 @@ from .._async_utils import aclosing, run_in_executor_copyctx
|
|
|
17
17
|
from ..analytics import AgentAnalytics
|
|
18
18
|
from ..parser import ToolCallParser
|
|
19
19
|
from ..prompt import PromptBuilder
|
|
20
|
-
from ..providers.base import Provider
|
|
20
|
+
from ..providers.base import Provider
|
|
21
21
|
from ..providers.openai_provider import OpenAIProvider
|
|
22
22
|
from ..results import Artifact, _begin_artifact_collection
|
|
23
23
|
from ..stability import beta, deprecated, stable
|
|
@@ -1593,7 +1593,7 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
|
|
|
1593
1593
|
# finally block and releases HTTP connections — instead
|
|
1594
1594
|
# of waiting for GC and emitting `async generator raised
|
|
1595
1595
|
# StopAsyncIteration` warnings.
|
|
1596
|
-
async with aclosing(
|
|
1596
|
+
async with aclosing( # type: ignore[type-var] # astream is an async generator (has aclose) but typed AsyncIterable
|
|
1597
1597
|
self.provider.astream(
|
|
1598
1598
|
model=self._effective_model,
|
|
1599
1599
|
system_prompt=self._system_prompt,
|
|
@@ -287,7 +287,7 @@ class CacheKeyBuilder:
|
|
|
287
287
|
|
|
288
288
|
|
|
289
289
|
# Cache is @runtime_checkable: a ``__stability__`` class attribute would become
|
|
290
|
-
# a structural protocol member on Python 3.
|
|
290
|
+
# a structural protocol member on Python 3.10-3.11 and break ``isinstance()``
|
|
291
291
|
# for implementations that do not define it, so it is registered instead.
|
|
292
292
|
register_stability("Cache", "stable")
|
|
293
293
|
|
|
@@ -12,7 +12,7 @@ from __future__ import annotations
|
|
|
12
12
|
import math
|
|
13
13
|
import threading
|
|
14
14
|
import time
|
|
15
|
-
from dataclasses import dataclass
|
|
15
|
+
from dataclasses import dataclass
|
|
16
16
|
from typing import TYPE_CHECKING, Any, List, Optional, Tuple
|
|
17
17
|
|
|
18
18
|
from .cache import CacheStats
|
|
@@ -210,7 +210,7 @@ class SemanticCache:
|
|
|
210
210
|
|
|
211
211
|
def _cosine_similarity(a: List[float], b: List[float]) -> float:
|
|
212
212
|
"""Compute cosine similarity between two vectors (pure Python, no numpy)."""
|
|
213
|
-
dot = sum(x * y for x, y in zip(a, b))
|
|
213
|
+
dot = sum(x * y for x, y in zip(a, b, strict=False))
|
|
214
214
|
norm_a = math.sqrt(sum(x * x for x in a))
|
|
215
215
|
norm_b = math.sqrt(sum(x * x for x in b))
|
|
216
216
|
if norm_a == 0.0 or norm_b == 0.0:
|
|
@@ -20,9 +20,9 @@ import json
|
|
|
20
20
|
import re
|
|
21
21
|
import threading
|
|
22
22
|
import uuid
|
|
23
|
-
from
|
|
24
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
23
|
+
from typing import List, Tuple
|
|
25
24
|
|
|
25
|
+
from ._time import parse_iso
|
|
26
26
|
from .orchestration.checkpoint import (
|
|
27
27
|
CheckpointMetadata,
|
|
28
28
|
_deserialize_checkpoint,
|
|
@@ -137,9 +137,7 @@ class PostgresCheckpointStore:
|
|
|
137
137
|
step=r[2],
|
|
138
138
|
node_name=r[3],
|
|
139
139
|
interrupted=r[4],
|
|
140
|
-
created_at=(
|
|
141
|
-
r[5] if isinstance(r[5], datetime) else datetime.fromisoformat(str(r[5]))
|
|
142
|
-
),
|
|
140
|
+
created_at=parse_iso(r[5]),
|
|
143
141
|
)
|
|
144
142
|
for r in rows
|
|
145
143
|
]
|
|
@@ -21,11 +21,10 @@ Usage::
|
|
|
21
21
|
|
|
22
22
|
from __future__ import annotations
|
|
23
23
|
|
|
24
|
-
from typing import Any, Callable, List, Optional
|
|
24
|
+
from typing import Any, Callable, List, Optional
|
|
25
25
|
|
|
26
26
|
from .stability import beta
|
|
27
27
|
from .tools.base import Tool
|
|
28
|
-
from .tools.decorators import tool as tool_decorator
|
|
29
28
|
|
|
30
29
|
|
|
31
30
|
@beta
|
|
@@ -1248,6 +1248,6 @@ DEFAULT_EVALUATORS: List[Any] = [
|
|
|
1248
1248
|
|
|
1249
1249
|
|
|
1250
1250
|
# Evaluator is @runtime_checkable: a ``__stability__`` class attribute would become
|
|
1251
|
-
# a structural protocol member on Python 3.
|
|
1251
|
+
# a structural protocol member on Python 3.10-3.11 and break ``isinstance()``
|
|
1252
1252
|
# for implementations that do not define it, so it is registered instead.
|
|
1253
1253
|
register_stability("Evaluator", "beta")
|
|
@@ -2,18 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
import time
|
|
6
|
-
import uuid
|
|
7
5
|
from dataclasses import dataclass, field
|
|
8
6
|
from typing import Any, Dict, List, Optional
|
|
9
7
|
|
|
10
|
-
from .. import __version__
|
|
11
8
|
from ..agent import Agent
|
|
12
9
|
from ..stability import beta
|
|
13
|
-
from .evaluators import DEFAULT_EVALUATORS
|
|
14
10
|
from .report import EvalReport
|
|
15
11
|
from .suite import EvalSuite
|
|
16
|
-
from .types import CaseResult, CaseVerdict,
|
|
12
|
+
from .types import CaseResult, CaseVerdict, TestCase
|
|
17
13
|
|
|
18
14
|
|
|
19
15
|
@beta
|
|
@@ -167,7 +163,7 @@ class PairwiseEval:
|
|
|
167
163
|
report_b = suite_b.run()
|
|
168
164
|
|
|
169
165
|
pairwise_results: List[PairwiseCaseResult] = []
|
|
170
|
-
for cr_a, cr_b in zip(report_a.case_results, report_b.case_results):
|
|
166
|
+
for cr_a, cr_b in zip(report_a.case_results, report_b.case_results, strict=False):
|
|
171
167
|
winner, reason = self._compare_case(cr_a, cr_b)
|
|
172
168
|
pairwise_results.append(
|
|
173
169
|
PairwiseCaseResult(
|
|
@@ -2,16 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
import html
|
|
6
5
|
import json
|
|
7
6
|
import threading
|
|
8
|
-
import time
|
|
9
7
|
from http.server import HTTPServer, SimpleHTTPRequestHandler
|
|
10
|
-
from
|
|
11
|
-
from typing import Any, Callable, Dict, List, Optional
|
|
8
|
+
from typing import Any, Dict
|
|
12
9
|
|
|
13
10
|
from ..stability import beta
|
|
14
|
-
from .types import CaseVerdict
|
|
15
11
|
|
|
16
12
|
|
|
17
13
|
class _DashboardHandler(SimpleHTTPRequestHandler):
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import List, Optional
|
|
6
6
|
|
|
7
7
|
from ..agent import Agent
|
|
8
8
|
from ..stability import beta
|
|
@@ -10,7 +10,6 @@ from .evaluators import (
|
|
|
10
10
|
ContainsEvaluator,
|
|
11
11
|
CustomEvaluator,
|
|
12
12
|
InjectionResistanceEvaluator,
|
|
13
|
-
JsonValidityEvaluator,
|
|
14
13
|
LengthEvaluator,
|
|
15
14
|
PerformanceEvaluator,
|
|
16
15
|
PIILeakEvaluator,
|
|
@@ -49,7 +49,7 @@ class TopicGuardrail(Guardrail):
|
|
|
49
49
|
normalized = re.sub(r"[\u200b\u200c\u200d\ufeff\u00ad]", "", normalized)
|
|
50
50
|
|
|
51
51
|
matched: List[str] = []
|
|
52
|
-
for pattern, topic in zip(self._patterns, self.deny):
|
|
52
|
+
for pattern, topic in zip(self._patterns, self.deny, strict=False):
|
|
53
53
|
if pattern.search(normalized):
|
|
54
54
|
matched.append(topic)
|
|
55
55
|
|