selectools 0.19.2__tar.gz → 0.20.0__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.19.2/src/selectools.egg-info → selectools-0.20.0}/PKG-INFO +36 -1
- {selectools-0.19.2 → selectools-0.20.0}/README.md +35 -0
- {selectools-0.19.2 → selectools-0.20.0}/pyproject.toml +1 -1
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/__init__.py +1 -1
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/config.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/core.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/analytics.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/audit.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/cache.py +5 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/cancellation.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/compose.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/entity_memory.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/report.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/suite.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/types.py +5 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/base.py +5 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/format.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/length.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/pii.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/pipeline.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/topic.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/toxicity.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/knowledge.py +7 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/knowledge_graph.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/memory.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/observer.py +5 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/checkpoint.py +5 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/graph.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/state.py +6 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/supervisor.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/debate.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/plan_and_execute.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/reflective.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/team_lead.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/pipeline.py +10 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/policy.py +5 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/anthropic_provider.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/fallback.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/gemini_provider.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/ollama_provider.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/openai_provider.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/stubs.py +2 -0
- selectools-0.20.0/src/selectools/serve/__init__.py +24 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/serve/app.py +84 -3
- selectools-0.20.0/src/selectools/serve/builder.py +877 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/serve/cli.py +25 -6
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/sessions.py +5 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/stability.py +24 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/token_estimation.py +5 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/base.py +3 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/decorators.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/registry.py +2 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/trace.py +6 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/types.py +6 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/usage.py +4 -0
- {selectools-0.19.2 → selectools-0.20.0/src/selectools.egg-info}/PKG-INFO +36 -1
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/SOURCES.txt +2 -0
- selectools-0.20.0/tests/test_visual_builder.py +90 -0
- selectools-0.19.2/src/selectools/serve/__init__.py +0 -20
- {selectools-0.19.2 → selectools-0.20.0}/LICENSE +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/setup.cfg +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/_lifecycle.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/_memory_manager.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/_provider_caller.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/_tool_executor.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/config_groups.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/cache_redis.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/cache_semantic.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/checkpoint_postgres.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/coherence.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/anthropic.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/cohere.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/gemini.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/openai.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/provider.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/env.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/__main__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/badge.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/dataset.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/evaluators.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/generator.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/history.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/html.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/junit.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/llm_evaluators.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/pairwise.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/regression.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/serve.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/snapshot.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/templates.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/exceptions.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/knowledge_store_redis.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/knowledge_store_supabase.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/_loop.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/bridge.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/client.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/config.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/multi.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/server.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/models.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/observe/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/observe/trace_store.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/node.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/parser.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/pricing.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/prompt.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/_openai_compat.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/base.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/bm25.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/chunking.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/hybrid.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/loaders.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/reranker.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/chroma.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/memory.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/pinecone.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/sqlite.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/tools.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/vector_store.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/security.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/serve/models.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/serve/playground.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/structured.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/code_reviewer.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/customer_support.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/data_analyst.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/rag_chatbot.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/research_assistant.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/data_tools.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/datetime_tools.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/file_tools.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/memory_tools.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/text_tools.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/web_tools.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/__init__.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/loader.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/dependency_links.txt +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/entry_points.txt +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/requires.txt +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/top_level.txt +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_approval_gate.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_architecture.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_async_observers.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_audit.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_budget.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_bug_hunt_batch1_core.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_bug_hunt_batch1_security.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_bug_hunt_batch1_tools.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_bug_hunt_regression.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_cache.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_cache_redis.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_cancellation.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_coherence.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_concurrency_smoke.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_consolidation_regression.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_conversation_branching.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_entity_memory.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_env.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_advanced.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_e2e.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_final.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_hardening.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_new_evaluators.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_release.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_v017_features.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_v0191.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_features_in_graph.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_guardrails.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_hardening.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge_graph.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge_store_redis.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge_store_supabase.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge_stores.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_mcp.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_memory.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_memory_async.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_memory_boundary.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_memory_integration.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_model_switching.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_multi_agent_edge_cases.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_checkpoint.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_e2e.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_evals.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_graph.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_integration.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_primitives.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_supervisor.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_parser.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_patterns.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_phase1_design_patterns.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_pipeline.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_policy.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_prompt.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_prompt_compression.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_property_based.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_reasoning_strategy.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_routing_mode.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_security.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_semantic_cache.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_sessions.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_sessions_edge_cases.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_sessions_redis.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_simple_observer.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_simulation_evals.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_stability.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_structured.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_structured_config.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_structured_tool_results.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_summarize_on_trim.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_terminal_actions.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_token_estimation.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_tool_caching.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_trace.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_trace_html.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_v016_regression.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/tests/test_v019_features.py +0 -0
- {selectools-0.19.2 → selectools-0.20.0}/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: 0.20.0
|
|
4
4
|
Summary: Production-ready AI agents with tool calling, structured output, execution traces, and RAG. Provider-agnostic (OpenAI, Anthropic, Gemini, Ollama) with fallback chains, batch processing, tool policies, streaming, caching, and cost tracking.
|
|
5
5
|
Author-email: John Nichev <johnnichev@gmail.com>
|
|
6
6
|
Maintainer-email: NichevLabs <support@nichevlabs.com>
|
|
@@ -84,8 +84,43 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
|
|
|
84
84
|
# selectools serve agent.yaml
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
+
## What's New in v0.20
|
|
88
|
+
|
|
89
|
+
### v0.20.0 — Visual Agent Builder
|
|
90
|
+
|
|
91
|
+
The first AI agent framework to ship a visual graph builder in a single `pip install`. No React. No build step. No CDN.
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pip install selectools
|
|
95
|
+
selectools serve --builder
|
|
96
|
+
# → open http://localhost:8000/builder
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
- Drag START, END, and Agent nodes onto the canvas
|
|
100
|
+
- Click ports to connect agents with edges
|
|
101
|
+
- Add condition labels to edges (e.g. `"approved"`) for conditional routing
|
|
102
|
+
- Edit provider, model, and system prompt in the properties panel
|
|
103
|
+
- Generated Python and YAML update live in the code panel
|
|
104
|
+
- Export or copy to clipboard with one click
|
|
105
|
+
|
|
87
106
|
## What's New in v0.19
|
|
88
107
|
|
|
108
|
+
### v0.19.3 — Stability Markers Applied to All Public APIs
|
|
109
|
+
|
|
110
|
+
Every public class and function exported from `selectools` now carries a stability marker:
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
from selectools import Agent, AgentGraph, PlanAndExecuteAgent
|
|
114
|
+
|
|
115
|
+
print(Agent.__stability__) # "stable"
|
|
116
|
+
print(AgentGraph.__stability__) # "beta"
|
|
117
|
+
print(PlanAndExecuteAgent.__stability__) # "beta"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**`@stable`** — 60+ core symbols (Agent, AgentConfig, providers, memory, tools, evals, guardrails, sessions, knowledge, cache, cancellation)
|
|
121
|
+
|
|
122
|
+
**`@beta`** — 30+ newer symbols (AgentGraph, SupervisorAgent, Pipeline, @step, parallel, branch, all four patterns, compose)
|
|
123
|
+
|
|
89
124
|
### v0.19.2 — Enterprise Hardening
|
|
90
125
|
|
|
91
126
|
```python
|
|
@@ -24,8 +24,43 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
|
|
|
24
24
|
# selectools serve agent.yaml
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
## What's New in v0.20
|
|
28
|
+
|
|
29
|
+
### v0.20.0 — Visual Agent Builder
|
|
30
|
+
|
|
31
|
+
The first AI agent framework to ship a visual graph builder in a single `pip install`. No React. No build step. No CDN.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install selectools
|
|
35
|
+
selectools serve --builder
|
|
36
|
+
# → open http://localhost:8000/builder
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- Drag START, END, and Agent nodes onto the canvas
|
|
40
|
+
- Click ports to connect agents with edges
|
|
41
|
+
- Add condition labels to edges (e.g. `"approved"`) for conditional routing
|
|
42
|
+
- Edit provider, model, and system prompt in the properties panel
|
|
43
|
+
- Generated Python and YAML update live in the code panel
|
|
44
|
+
- Export or copy to clipboard with one click
|
|
45
|
+
|
|
27
46
|
## What's New in v0.19
|
|
28
47
|
|
|
48
|
+
### v0.19.3 — Stability Markers Applied to All Public APIs
|
|
49
|
+
|
|
50
|
+
Every public class and function exported from `selectools` now carries a stability marker:
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
from selectools import Agent, AgentGraph, PlanAndExecuteAgent
|
|
54
|
+
|
|
55
|
+
print(Agent.__stability__) # "stable"
|
|
56
|
+
print(AgentGraph.__stability__) # "beta"
|
|
57
|
+
print(PlanAndExecuteAgent.__stability__) # "beta"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**`@stable`** — 60+ core symbols (Agent, AgentConfig, providers, memory, tools, evals, guardrails, sessions, knowledge, cache, cancellation)
|
|
61
|
+
|
|
62
|
+
**`@beta`** — 30+ newer symbols (AgentGraph, SupervisorAgent, Pipeline, @step, parallel, branch, all four patterns, compose)
|
|
63
|
+
|
|
29
64
|
### v0.19.2 — Enterprise Hardening
|
|
30
65
|
|
|
31
66
|
```python
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "selectools"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.20.0"
|
|
8
8
|
description = "Production-ready AI agents with tool calling, structured output, execution traces, and RAG. Provider-agnostic (OpenAI, Anthropic, Gemini, Ollama) with fallback chains, batch processing, tool policies, streaming, caching, and cost tracking."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -7,6 +7,8 @@ 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 stable
|
|
11
|
+
|
|
10
12
|
if TYPE_CHECKING:
|
|
11
13
|
from ..cache import Cache
|
|
12
14
|
from ..cancellation import CancellationToken
|
|
@@ -30,6 +32,7 @@ ConfirmAction = Union[
|
|
|
30
32
|
]
|
|
31
33
|
|
|
32
34
|
|
|
35
|
+
@stable
|
|
33
36
|
@dataclass
|
|
34
37
|
class AgentConfig:
|
|
35
38
|
"""
|
|
@@ -18,6 +18,7 @@ from ..parser import ToolCallParser
|
|
|
18
18
|
from ..prompt import PromptBuilder
|
|
19
19
|
from ..providers.base import Provider, ProviderError
|
|
20
20
|
from ..providers.openai_provider import OpenAIProvider
|
|
21
|
+
from ..stability import stable
|
|
21
22
|
from ..structured import (
|
|
22
23
|
ResponseFormat,
|
|
23
24
|
build_schema_instruction,
|
|
@@ -57,6 +58,7 @@ class _RunContext:
|
|
|
57
58
|
terminal_tool_result: Optional[str] = None
|
|
58
59
|
|
|
59
60
|
|
|
61
|
+
@stable
|
|
60
62
|
class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryManagerMixin):
|
|
61
63
|
"""
|
|
62
64
|
Provider-agnostic AI agent that iteratively calls tools to accomplish tasks.
|
|
@@ -10,6 +10,8 @@ from dataclasses import dataclass, field
|
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from typing import Any, Dict
|
|
12
12
|
|
|
13
|
+
from .stability import stable
|
|
14
|
+
|
|
13
15
|
|
|
14
16
|
@dataclass
|
|
15
17
|
class ToolMetrics:
|
|
@@ -81,6 +83,7 @@ class ToolMetrics:
|
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
|
|
86
|
+
@stable
|
|
84
87
|
class AgentAnalytics:
|
|
85
88
|
"""
|
|
86
89
|
Analytics tracker for agent tool usage.
|
|
@@ -24,10 +24,12 @@ from enum import Enum
|
|
|
24
24
|
from typing import Any, Dict, List, Optional
|
|
25
25
|
|
|
26
26
|
from .observer import AgentObserver
|
|
27
|
+
from .stability import stable
|
|
27
28
|
from .types import AgentResult, Message
|
|
28
29
|
from .usage import UsageStats
|
|
29
30
|
|
|
30
31
|
|
|
32
|
+
@stable
|
|
31
33
|
class PrivacyLevel(str, Enum):
|
|
32
34
|
"""Controls how tool arguments are recorded in audit logs."""
|
|
33
35
|
|
|
@@ -37,6 +39,7 @@ class PrivacyLevel(str, Enum):
|
|
|
37
39
|
NONE = "none"
|
|
38
40
|
|
|
39
41
|
|
|
42
|
+
@stable
|
|
40
43
|
class AuditLogger(AgentObserver):
|
|
41
44
|
"""JSONL audit logger that implements the AgentObserver protocol.
|
|
42
45
|
|
|
@@ -20,12 +20,14 @@ if TYPE_CHECKING:
|
|
|
20
20
|
from .tools.base import Tool
|
|
21
21
|
from .types import Message
|
|
22
22
|
|
|
23
|
+
from .stability import stable
|
|
23
24
|
|
|
24
25
|
# ---------------------------------------------------------------------------
|
|
25
26
|
# CacheStats
|
|
26
27
|
# ---------------------------------------------------------------------------
|
|
27
28
|
|
|
28
29
|
|
|
30
|
+
@stable
|
|
29
31
|
@dataclass
|
|
30
32
|
class CacheStats:
|
|
31
33
|
"""Tracks cache performance metrics."""
|
|
@@ -69,6 +71,7 @@ class _CacheEntry:
|
|
|
69
71
|
# ---------------------------------------------------------------------------
|
|
70
72
|
|
|
71
73
|
|
|
74
|
+
@stable
|
|
72
75
|
@runtime_checkable
|
|
73
76
|
class Cache(Protocol):
|
|
74
77
|
"""
|
|
@@ -109,6 +112,7 @@ class Cache(Protocol):
|
|
|
109
112
|
# ---------------------------------------------------------------------------
|
|
110
113
|
|
|
111
114
|
|
|
115
|
+
@stable
|
|
112
116
|
class InMemoryCache:
|
|
113
117
|
"""
|
|
114
118
|
Thread-safe in-memory LRU cache with per-entry TTL.
|
|
@@ -216,6 +220,7 @@ class InMemoryCache:
|
|
|
216
220
|
# ---------------------------------------------------------------------------
|
|
217
221
|
|
|
218
222
|
|
|
223
|
+
@stable
|
|
219
224
|
class CacheKeyBuilder:
|
|
220
225
|
"""
|
|
221
226
|
Builds deterministic cache keys from LLM request parameters.
|
|
@@ -23,10 +23,12 @@ from __future__ import annotations
|
|
|
23
23
|
|
|
24
24
|
from typing import Any, Callable, List, Optional, Sequence
|
|
25
25
|
|
|
26
|
+
from .stability import beta
|
|
26
27
|
from .tools.base import Tool
|
|
27
28
|
from .tools.decorators import tool as tool_decorator
|
|
28
29
|
|
|
29
30
|
|
|
31
|
+
@beta
|
|
30
32
|
def compose(
|
|
31
33
|
*tools_or_fns: Any,
|
|
32
34
|
name: Optional[str] = None,
|
|
@@ -14,9 +14,11 @@ import time
|
|
|
14
14
|
from dataclasses import dataclass, field
|
|
15
15
|
from typing import Any, Dict, List, Optional
|
|
16
16
|
|
|
17
|
+
from .stability import stable
|
|
17
18
|
from .types import Message, Role
|
|
18
19
|
|
|
19
20
|
|
|
21
|
+
@stable
|
|
20
22
|
@dataclass
|
|
21
23
|
class Entity:
|
|
22
24
|
"""A named entity extracted from conversation.
|
|
@@ -69,6 +71,7 @@ _EXTRACTION_PROMPT = (
|
|
|
69
71
|
)
|
|
70
72
|
|
|
71
73
|
|
|
74
|
+
@stable
|
|
72
75
|
class EntityMemory:
|
|
73
76
|
"""Maintains a registry of entities mentioned in conversation.
|
|
74
77
|
|
|
@@ -9,9 +9,11 @@ from dataclasses import dataclass, field
|
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
from typing import Any, Dict, List, Optional, Union
|
|
11
11
|
|
|
12
|
+
from ..stability import stable
|
|
12
13
|
from .types import CaseResult, CaseVerdict, EvalMetadata
|
|
13
14
|
|
|
14
15
|
|
|
16
|
+
@stable
|
|
15
17
|
@dataclass
|
|
16
18
|
class EvalReport:
|
|
17
19
|
"""Aggregated evaluation results with statistics."""
|
|
@@ -11,11 +11,13 @@ from typing import Any, Callable, Dict, List, Optional
|
|
|
11
11
|
|
|
12
12
|
from .. import __version__
|
|
13
13
|
from ..agent import Agent
|
|
14
|
+
from ..stability import stable
|
|
14
15
|
from .evaluators import DEFAULT_EVALUATORS
|
|
15
16
|
from .report import EvalReport
|
|
16
17
|
from .types import CaseResult, CaseVerdict, EvalFailure, EvalMetadata, TestCase
|
|
17
18
|
|
|
18
19
|
|
|
20
|
+
@stable
|
|
19
21
|
class EvalSuite:
|
|
20
22
|
"""Evaluate an agent against a list of test cases.
|
|
21
23
|
|
|
@@ -6,7 +6,10 @@ from dataclasses import dataclass, field
|
|
|
6
6
|
from enum import Enum
|
|
7
7
|
from typing import Any, Callable, Dict, List, Optional
|
|
8
8
|
|
|
9
|
+
from selectools.stability import stable
|
|
9
10
|
|
|
11
|
+
|
|
12
|
+
@stable
|
|
10
13
|
class CaseVerdict(str, Enum):
|
|
11
14
|
"""Verdict for a single evaluated test case."""
|
|
12
15
|
|
|
@@ -16,6 +19,7 @@ class CaseVerdict(str, Enum):
|
|
|
16
19
|
SKIP = "skip"
|
|
17
20
|
|
|
18
21
|
|
|
22
|
+
@stable
|
|
19
23
|
@dataclass
|
|
20
24
|
class TestCase:
|
|
21
25
|
"""A single test case for agent evaluation.
|
|
@@ -125,6 +129,7 @@ class EvalFailure:
|
|
|
125
129
|
message: str
|
|
126
130
|
|
|
127
131
|
|
|
132
|
+
@stable
|
|
128
133
|
@dataclass
|
|
129
134
|
class CaseResult:
|
|
130
135
|
"""Result of evaluating a single TestCase."""
|
|
@@ -12,7 +12,10 @@ from dataclasses import dataclass
|
|
|
12
12
|
from enum import Enum
|
|
13
13
|
from typing import Optional
|
|
14
14
|
|
|
15
|
+
from selectools.stability import stable
|
|
15
16
|
|
|
17
|
+
|
|
18
|
+
@stable
|
|
16
19
|
class GuardrailAction(str, Enum):
|
|
17
20
|
"""Action to take when a guardrail check fails."""
|
|
18
21
|
|
|
@@ -21,6 +24,7 @@ class GuardrailAction(str, Enum):
|
|
|
21
24
|
WARN = "warn"
|
|
22
25
|
|
|
23
26
|
|
|
27
|
+
@stable
|
|
24
28
|
@dataclass
|
|
25
29
|
class GuardrailResult:
|
|
26
30
|
"""Result of a single guardrail check.
|
|
@@ -40,6 +44,7 @@ class GuardrailResult:
|
|
|
40
44
|
guardrail_name: Optional[str] = None
|
|
41
45
|
|
|
42
46
|
|
|
47
|
+
@stable
|
|
43
48
|
class Guardrail:
|
|
44
49
|
"""Base class for all guardrails.
|
|
45
50
|
|
|
@@ -10,9 +10,12 @@ from __future__ import annotations
|
|
|
10
10
|
import json
|
|
11
11
|
from typing import List, Optional
|
|
12
12
|
|
|
13
|
+
from selectools.stability import stable
|
|
14
|
+
|
|
13
15
|
from .base import Guardrail, GuardrailAction, GuardrailResult
|
|
14
16
|
|
|
15
17
|
|
|
18
|
+
@stable
|
|
16
19
|
class FormatGuardrail(Guardrail):
|
|
17
20
|
"""Validate that content matches expected format constraints.
|
|
18
21
|
|
|
@@ -9,9 +9,12 @@ from __future__ import annotations
|
|
|
9
9
|
import re
|
|
10
10
|
from typing import Optional
|
|
11
11
|
|
|
12
|
+
from selectools.stability import stable
|
|
13
|
+
|
|
12
14
|
from .base import Guardrail, GuardrailAction, GuardrailResult
|
|
13
15
|
|
|
14
16
|
|
|
17
|
+
@stable
|
|
15
18
|
class LengthGuardrail(Guardrail):
|
|
16
19
|
"""Enforce content length constraints.
|
|
17
20
|
|
|
@@ -11,6 +11,8 @@ import re
|
|
|
11
11
|
from dataclasses import dataclass
|
|
12
12
|
from typing import Dict, List, Optional
|
|
13
13
|
|
|
14
|
+
from selectools.stability import stable
|
|
15
|
+
|
|
14
16
|
from .base import Guardrail, GuardrailAction, GuardrailResult
|
|
15
17
|
|
|
16
18
|
_BUILTIN_PATTERNS: Dict[str, re.Pattern[str]] = {
|
|
@@ -34,6 +36,7 @@ class PIIMatch:
|
|
|
34
36
|
end: int
|
|
35
37
|
|
|
36
38
|
|
|
39
|
+
@stable
|
|
37
40
|
class PIIGuardrail(Guardrail):
|
|
38
41
|
"""Detect (and optionally redact) PII in content.
|
|
39
42
|
|
|
@@ -12,11 +12,14 @@ import logging
|
|
|
12
12
|
from dataclasses import dataclass, field
|
|
13
13
|
from typing import List, Optional
|
|
14
14
|
|
|
15
|
+
from selectools.stability import stable
|
|
16
|
+
|
|
15
17
|
from .base import Guardrail, GuardrailAction, GuardrailError, GuardrailResult
|
|
16
18
|
|
|
17
19
|
logger = logging.getLogger("selectools.guardrails")
|
|
18
20
|
|
|
19
21
|
|
|
22
|
+
@stable
|
|
20
23
|
@dataclass
|
|
21
24
|
class GuardrailsPipeline:
|
|
22
25
|
"""Ordered pipeline of input and output guardrails.
|
|
@@ -11,9 +11,12 @@ import re
|
|
|
11
11
|
import unicodedata
|
|
12
12
|
from typing import List, Optional
|
|
13
13
|
|
|
14
|
+
from selectools.stability import stable
|
|
15
|
+
|
|
14
16
|
from .base import Guardrail, GuardrailAction, GuardrailResult
|
|
15
17
|
|
|
16
18
|
|
|
19
|
+
@stable
|
|
17
20
|
class TopicGuardrail(Guardrail):
|
|
18
21
|
"""Reject content that mentions denied topics.
|
|
19
22
|
|
|
@@ -11,6 +11,8 @@ from __future__ import annotations
|
|
|
11
11
|
import re
|
|
12
12
|
from typing import List, Optional, Set
|
|
13
13
|
|
|
14
|
+
from selectools.stability import stable
|
|
15
|
+
|
|
14
16
|
from .base import Guardrail, GuardrailAction, GuardrailResult
|
|
15
17
|
|
|
16
18
|
_DEFAULT_BLOCKLIST: Set[str] = {
|
|
@@ -33,6 +35,7 @@ _DEFAULT_BLOCKLIST: Set[str] = {
|
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
|
|
38
|
+
@stable
|
|
36
39
|
class ToxicityGuardrail(Guardrail):
|
|
37
40
|
"""Block content that exceeds a toxicity threshold.
|
|
38
41
|
|
|
@@ -19,11 +19,14 @@ from dataclasses import dataclass, field
|
|
|
19
19
|
from datetime import datetime, timedelta, timezone
|
|
20
20
|
from typing import Any, Dict, List, Optional, Protocol, runtime_checkable
|
|
21
21
|
|
|
22
|
+
from .stability import stable
|
|
23
|
+
|
|
22
24
|
# ======================================================================
|
|
23
25
|
# KnowledgeEntry — structured entry for the new store-based API
|
|
24
26
|
# ======================================================================
|
|
25
27
|
|
|
26
28
|
|
|
29
|
+
@stable
|
|
27
30
|
@dataclass
|
|
28
31
|
class KnowledgeEntry:
|
|
29
32
|
"""A single piece of knowledge stored by the agent.
|
|
@@ -66,6 +69,7 @@ class KnowledgeEntry:
|
|
|
66
69
|
# ======================================================================
|
|
67
70
|
|
|
68
71
|
|
|
72
|
+
@stable
|
|
69
73
|
@runtime_checkable
|
|
70
74
|
class KnowledgeStore(Protocol):
|
|
71
75
|
"""Protocol for knowledge storage backends.
|
|
@@ -113,6 +117,7 @@ class KnowledgeStore(Protocol):
|
|
|
113
117
|
# ======================================================================
|
|
114
118
|
|
|
115
119
|
|
|
120
|
+
@stable
|
|
116
121
|
class FileKnowledgeStore:
|
|
117
122
|
"""File-based knowledge store (backward-compatible with the original KnowledgeMemory).
|
|
118
123
|
|
|
@@ -279,6 +284,7 @@ class FileKnowledgeStore:
|
|
|
279
284
|
# ======================================================================
|
|
280
285
|
|
|
281
286
|
|
|
287
|
+
@stable
|
|
282
288
|
class SQLiteKnowledgeStore:
|
|
283
289
|
"""SQLite-backed knowledge store for production single-process use.
|
|
284
290
|
|
|
@@ -442,6 +448,7 @@ class SQLiteKnowledgeStore:
|
|
|
442
448
|
# ======================================================================
|
|
443
449
|
|
|
444
450
|
|
|
451
|
+
@stable
|
|
445
452
|
class KnowledgeMemory:
|
|
446
453
|
"""Maintains cross-session knowledge with daily logs and persistent facts.
|
|
447
454
|
|
|
@@ -14,6 +14,7 @@ import time
|
|
|
14
14
|
from dataclasses import dataclass, field
|
|
15
15
|
from typing import Any, Dict, List, Optional, Protocol, runtime_checkable
|
|
16
16
|
|
|
17
|
+
from .stability import stable
|
|
17
18
|
from .types import Message, Role
|
|
18
19
|
|
|
19
20
|
|
|
@@ -301,6 +302,7 @@ _EXTRACTION_PROMPT = (
|
|
|
301
302
|
)
|
|
302
303
|
|
|
303
304
|
|
|
305
|
+
@stable
|
|
304
306
|
class KnowledgeGraphMemory:
|
|
305
307
|
"""Maintains a knowledge graph of relationship triples from conversation.
|
|
306
308
|
|
|
@@ -8,9 +8,11 @@ import copy
|
|
|
8
8
|
from dataclasses import replace
|
|
9
9
|
from typing import Any, Dict, List, Optional
|
|
10
10
|
|
|
11
|
+
from .stability import stable
|
|
11
12
|
from .types import Message, Role
|
|
12
13
|
|
|
13
14
|
|
|
15
|
+
@stable
|
|
14
16
|
class ConversationMemory:
|
|
15
17
|
"""
|
|
16
18
|
Maintains conversation history with configurable limits.
|
|
@@ -35,10 +35,12 @@ import logging
|
|
|
35
35
|
import time
|
|
36
36
|
from typing import Any, Callable, Dict, List, Optional
|
|
37
37
|
|
|
38
|
+
from .stability import beta, stable
|
|
38
39
|
from .types import AgentResult, Message
|
|
39
40
|
from .usage import UsageStats
|
|
40
41
|
|
|
41
42
|
|
|
43
|
+
@stable
|
|
42
44
|
class AgentObserver:
|
|
43
45
|
"""Base class for agent lifecycle observers.
|
|
44
46
|
|
|
@@ -602,6 +604,7 @@ class AgentObserver:
|
|
|
602
604
|
# ======================================================================
|
|
603
605
|
|
|
604
606
|
|
|
607
|
+
@stable
|
|
605
608
|
class LoggingObserver(AgentObserver):
|
|
606
609
|
"""Observer that writes structured JSON events to Python's logging module.
|
|
607
610
|
|
|
@@ -1021,6 +1024,7 @@ class LoggingObserver(AgentObserver):
|
|
|
1021
1024
|
)
|
|
1022
1025
|
|
|
1023
1026
|
|
|
1027
|
+
@stable
|
|
1024
1028
|
class AsyncAgentObserver(AgentObserver):
|
|
1025
1029
|
"""Base class for async agent lifecycle observers.
|
|
1026
1030
|
|
|
@@ -1420,6 +1424,7 @@ class AsyncAgentObserver(AgentObserver):
|
|
|
1420
1424
|
# ======================================================================
|
|
1421
1425
|
|
|
1422
1426
|
|
|
1427
|
+
@beta
|
|
1423
1428
|
class SimpleStepObserver(AgentObserver):
|
|
1424
1429
|
"""Observer that routes all lifecycle events to a single callback.
|
|
1425
1430
|
|
|
@@ -32,6 +32,7 @@ from dataclasses import dataclass
|
|
|
32
32
|
from datetime import datetime, timezone
|
|
33
33
|
from typing import Dict, List, Optional, Protocol, Tuple, runtime_checkable
|
|
34
34
|
|
|
35
|
+
from ..stability import beta
|
|
35
36
|
from .state import GraphState
|
|
36
37
|
|
|
37
38
|
|
|
@@ -56,6 +57,7 @@ class CheckpointMetadata:
|
|
|
56
57
|
created_at: datetime
|
|
57
58
|
|
|
58
59
|
|
|
60
|
+
@beta
|
|
59
61
|
@runtime_checkable
|
|
60
62
|
class CheckpointStore(Protocol):
|
|
61
63
|
"""Protocol for checkpoint backends.
|
|
@@ -117,6 +119,7 @@ def _deserialize_checkpoint(data: Dict) -> Tuple[GraphState, int]:
|
|
|
117
119
|
# ------------------------------------------------------------------
|
|
118
120
|
|
|
119
121
|
|
|
122
|
+
@beta
|
|
120
123
|
class InMemoryCheckpointStore:
|
|
121
124
|
"""Thread-safe in-memory checkpoint store.
|
|
122
125
|
|
|
@@ -172,6 +175,7 @@ class InMemoryCheckpointStore:
|
|
|
172
175
|
# ------------------------------------------------------------------
|
|
173
176
|
|
|
174
177
|
|
|
178
|
+
@beta
|
|
175
179
|
class FileCheckpointStore:
|
|
176
180
|
"""File-based checkpoint store.
|
|
177
181
|
|
|
@@ -290,6 +294,7 @@ CREATE INDEX IF NOT EXISTS idx_checkpoints_graph_id ON checkpoints (graph_id);
|
|
|
290
294
|
"""
|
|
291
295
|
|
|
292
296
|
|
|
297
|
+
@beta
|
|
293
298
|
class SQLiteCheckpointStore:
|
|
294
299
|
"""SQLite-backed checkpoint store with WAL mode for concurrent access.
|
|
295
300
|
|
|
@@ -37,6 +37,7 @@ from typing import (
|
|
|
37
37
|
)
|
|
38
38
|
|
|
39
39
|
from ..exceptions import GraphExecutionError
|
|
40
|
+
from ..stability import beta
|
|
40
41
|
from ..trace import AgentTrace, StepType, TraceStep
|
|
41
42
|
from ..types import AgentResult, Message, Role
|
|
42
43
|
from ..usage import UsageStats
|
|
@@ -164,6 +165,7 @@ def _merge_usage(base: UsageStats, added: Any) -> UsageStats:
|
|
|
164
165
|
)
|
|
165
166
|
|
|
166
167
|
|
|
168
|
+
@beta
|
|
167
169
|
class AgentGraph:
|
|
168
170
|
"""Directed graph of agent nodes with routing, parallelism, and HITL support.
|
|
169
171
|
|
|
@@ -17,10 +17,12 @@ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple
|
|
|
17
17
|
if TYPE_CHECKING:
|
|
18
18
|
from ..types import AgentResult, Message
|
|
19
19
|
|
|
20
|
+
from ..stability import beta
|
|
20
21
|
|
|
21
22
|
STATE_KEY_LAST_OUTPUT: str = "__last_output__"
|
|
22
23
|
|
|
23
24
|
|
|
25
|
+
@beta
|
|
24
26
|
class MergePolicy(str, Enum):
|
|
25
27
|
"""Policy for merging parallel branch states.
|
|
26
28
|
|
|
@@ -34,6 +36,7 @@ class MergePolicy(str, Enum):
|
|
|
34
36
|
APPEND = "append"
|
|
35
37
|
|
|
36
38
|
|
|
39
|
+
@beta
|
|
37
40
|
class ContextMode(str, Enum):
|
|
38
41
|
"""Controls what conversation history is forwarded to a node's agent.
|
|
39
42
|
|
|
@@ -51,6 +54,7 @@ class ContextMode(str, Enum):
|
|
|
51
54
|
CUSTOM = "custom"
|
|
52
55
|
|
|
53
56
|
|
|
57
|
+
@beta
|
|
54
58
|
@dataclass
|
|
55
59
|
class GraphState:
|
|
56
60
|
"""Shared context passed between nodes in an AgentGraph.
|
|
@@ -153,6 +157,7 @@ class GraphState:
|
|
|
153
157
|
return cls(messages=[Message(role=Role.USER, content=prompt)])
|
|
154
158
|
|
|
155
159
|
|
|
160
|
+
@beta
|
|
156
161
|
@dataclass
|
|
157
162
|
class InterruptRequest:
|
|
158
163
|
"""Yielded from generator nodes to pause execution for human input.
|
|
@@ -173,6 +178,7 @@ class InterruptRequest:
|
|
|
173
178
|
interrupt_key: str = ""
|
|
174
179
|
|
|
175
180
|
|
|
181
|
+
@beta
|
|
176
182
|
@dataclass
|
|
177
183
|
class Scatter:
|
|
178
184
|
"""Returned from routing functions to create dynamic parallel branches.
|
|
@@ -45,6 +45,7 @@ if TYPE_CHECKING:
|
|
|
45
45
|
from ..types import AgentResult
|
|
46
46
|
from .checkpoint import CheckpointStore
|
|
47
47
|
|
|
48
|
+
from ..stability import beta
|
|
48
49
|
from ..types import Message, Role
|
|
49
50
|
from ..usage import UsageStats
|
|
50
51
|
from .graph import AgentGraph, ErrorPolicy, GraphResult, _merge_usage
|
|
@@ -168,6 +169,7 @@ def _safe_json_parse(text: str, default: Any = None) -> Any:
|
|
|
168
169
|
return default
|
|
169
170
|
|
|
170
171
|
|
|
172
|
+
@beta
|
|
171
173
|
class SupervisorAgent:
|
|
172
174
|
"""High-level multi-agent coordinator.
|
|
173
175
|
|