gatewaysdk 0.3.2__py3-none-any.whl
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.
- gatewaysdk/__init__.py +540 -0
- gatewaysdk/adapter/__init__.py +15 -0
- gatewaysdk/adapter/base.py +94 -0
- gatewaysdk/adapter/messages.py +270 -0
- gatewaysdk/adapter/triplet.py +1026 -0
- gatewaysdk/algorithm/__init__.py +39 -0
- gatewaysdk/algorithm/apo/__init__.py +5 -0
- gatewaysdk/algorithm/apo/apo.py +898 -0
- gatewaysdk/algorithm/apo/prompts/apply_edit_variant01.poml +22 -0
- gatewaysdk/algorithm/apo/prompts/apply_edit_variant02.poml +18 -0
- gatewaysdk/algorithm/apo/prompts/text_gradient_variant01.poml +18 -0
- gatewaysdk/algorithm/apo/prompts/text_gradient_variant02.poml +16 -0
- gatewaysdk/algorithm/apo/prompts/text_gradient_variant03.poml +107 -0
- gatewaysdk/algorithm/base.py +262 -0
- gatewaysdk/algorithm/decorator.py +264 -0
- gatewaysdk/algorithm/evals/__init__.py +7 -0
- gatewaysdk/algorithm/evals/evals.py +217 -0
- gatewaysdk/algorithm/fast.py +250 -0
- gatewaysdk/algorithm/gepa/__init__.py +61 -0
- gatewaysdk/algorithm/gepa/adapter.py +495 -0
- gatewaysdk/algorithm/gepa/gepa.py +570 -0
- gatewaysdk/algorithm/gepa/lib/__init__.py +18 -0
- gatewaysdk/algorithm/gepa/lib/adapters/README.md +12 -0
- gatewaysdk/algorithm/gepa/lib/adapters/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/README.md +341 -0
- gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/__init__.py +1 -0
- gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/anymaths_adapter.py +174 -0
- gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/requirements.txt +1 -0
- gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/README.md +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/default_adapter.py +209 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/README.md +7 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/dspy_adapter.py +307 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/README.md +99 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/dspy_program_proposal_signature.py +137 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/full_program_adapter.py +268 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/GEPA_RAG.md +621 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/__init__.py +56 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/evaluation_metrics.py +226 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/generic_rag_adapter.py +496 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/rag_pipeline.py +238 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_store_interface.py +212 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/__init__.py +2 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/chroma_store.py +196 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/lancedb_store.py +422 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/milvus_store.py +409 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/qdrant_store.py +368 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/weaviate_store.py +418 -0
- gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/README.md +552 -0
- gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/__init__.py +37 -0
- gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_adapter.py +699 -0
- gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_client.py +364 -0
- gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/README.md +9 -0
- gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/terminal_bench_adapter.py +217 -0
- gatewaysdk/algorithm/gepa/lib/api.py +382 -0
- gatewaysdk/algorithm/gepa/lib/core/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/core/adapter.py +180 -0
- gatewaysdk/algorithm/gepa/lib/core/data_loader.py +74 -0
- gatewaysdk/algorithm/gepa/lib/core/engine.py +379 -0
- gatewaysdk/algorithm/gepa/lib/core/result.py +233 -0
- gatewaysdk/algorithm/gepa/lib/core/state.py +636 -0
- gatewaysdk/algorithm/gepa/lib/examples/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/examples/aime.py +24 -0
- gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/eval_default.py +111 -0
- gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/instruction_prompt.txt +9 -0
- gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/optimal_prompt.txt +24 -0
- gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/train_anymaths.py +177 -0
- gatewaysdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/arc_agi.ipynb +25705 -0
- gatewaysdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/example.ipynb +348 -0
- gatewaysdk/algorithm/gepa/lib/examples/mcp_adapter/__init__.py +4 -0
- gatewaysdk/algorithm/gepa/lib/examples/mcp_adapter/mcp_optimization_example.py +456 -0
- gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/RAG_GUIDE.md +613 -0
- gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/__init__.py +9 -0
- gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/rag_optimization.py +820 -0
- gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/requirements-rag.txt +29 -0
- gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/instruction_prompt.txt +16 -0
- gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/terminus.txt +9 -0
- gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/train_terminus.py +161 -0
- gatewaysdk/algorithm/gepa/lib/gepa_utils.py +117 -0
- gatewaysdk/algorithm/gepa/lib/logging/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/logging/experiment_tracker.py +187 -0
- gatewaysdk/algorithm/gepa/lib/logging/logger.py +75 -0
- gatewaysdk/algorithm/gepa/lib/logging/utils.py +103 -0
- gatewaysdk/algorithm/gepa/lib/proposer/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/proposer/base.py +31 -0
- gatewaysdk/algorithm/gepa/lib/proposer/merge.py +357 -0
- gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/base.py +49 -0
- gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/reflective_mutation.py +176 -0
- gatewaysdk/algorithm/gepa/lib/py.typed +0 -0
- gatewaysdk/algorithm/gepa/lib/strategies/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/strategies/batch_sampler.py +77 -0
- gatewaysdk/algorithm/gepa/lib/strategies/candidate_selector.py +50 -0
- gatewaysdk/algorithm/gepa/lib/strategies/component_selector.py +36 -0
- gatewaysdk/algorithm/gepa/lib/strategies/eval_policy.py +64 -0
- gatewaysdk/algorithm/gepa/lib/strategies/instruction_proposal.py +126 -0
- gatewaysdk/algorithm/gepa/lib/utils/__init__.py +10 -0
- gatewaysdk/algorithm/gepa/lib/utils/stop_condition.py +196 -0
- gatewaysdk/algorithm/gepa/tracing.py +105 -0
- gatewaysdk/algorithm/utils.py +177 -0
- gatewaysdk/algorithm/verl/__init__.py +5 -0
- gatewaysdk/algorithm/verl/interface.py +202 -0
- gatewaysdk/automations.py +111 -0
- gatewaysdk/benchmark_hub/README.md +88 -0
- gatewaysdk/benchmark_hub/__init__.py +119 -0
- gatewaysdk/benchmark_hub/_archive.py +189 -0
- gatewaysdk/benchmark_hub/_tar.py +6 -0
- gatewaysdk/benchmark_hub/client.py +992 -0
- gatewaysdk/benchmark_hub/dispatch_shard.py +34 -0
- gatewaysdk/benchmark_hub/eval_config.py +20 -0
- gatewaysdk/benchmark_hub/evals.py +351 -0
- gatewaysdk/benchmark_hub/harbor_adapter.py +673 -0
- gatewaysdk/benchmark_hub/path_utils.py +81 -0
- gatewaysdk/benchmark_hub/save_utils.py +101 -0
- gatewaysdk/benchmark_hub/verifiers_adapter.py +327 -0
- gatewaysdk/benchmark_hub/versioning.py +72 -0
- gatewaysdk/build.py +515 -0
- gatewaysdk/cli/__init__.py +58 -0
- gatewaysdk/cli/agent_runner.py +132 -0
- gatewaysdk/cli/http_client.py +115 -0
- gatewaysdk/cli/platform.py +4086 -0
- gatewaysdk/cli/prometheus.py +115 -0
- gatewaysdk/cli/release_gate.py +215 -0
- gatewaysdk/cli/store.py +131 -0
- gatewaysdk/cli/vllm.py +29 -0
- gatewaysdk/client.py +406 -0
- gatewaysdk/config.py +348 -0
- gatewaysdk/connectors/__init__.py +25 -0
- gatewaysdk/connectors/client.py +203 -0
- gatewaysdk/connectors/skill.py +25 -0
- gatewaysdk/connectors/template.py +106 -0
- gatewaysdk/context.py +606 -0
- gatewaysdk/emitter/__init__.py +43 -0
- gatewaysdk/emitter/annotation.py +370 -0
- gatewaysdk/emitter/exception.py +54 -0
- gatewaysdk/emitter/message.py +61 -0
- gatewaysdk/emitter/object.py +117 -0
- gatewaysdk/emitter/reward.py +320 -0
- gatewaysdk/env_var.py +156 -0
- gatewaysdk/environment/__init__.py +108 -0
- gatewaysdk/environment/_bundle.py +281 -0
- gatewaysdk/environment/_harbor.py +276 -0
- gatewaysdk/environment/_materialize.py +97 -0
- gatewaysdk/environment/_tar.py +33 -0
- gatewaysdk/environment/_world.py +346 -0
- gatewaysdk/environment/core.py +527 -0
- gatewaysdk/environment/errors.py +58 -0
- gatewaysdk/environment/runtime.py +150 -0
- gatewaysdk/environment/schema/__init__.py +35 -0
- gatewaysdk/environment/schema/__main__.py +225 -0
- gatewaysdk/environment/schema/_slack_fidelity.py +116 -0
- gatewaysdk/environment/schema/_slack_scenario.py +183 -0
- gatewaysdk/environment/schema/api.py +1628 -0
- gatewaysdk/environment/schema/batch.py +755 -0
- gatewaysdk/environment/schema/compiler.py +615 -0
- gatewaysdk/environment/schema/conform.py +428 -0
- gatewaysdk/environment/schema/connector.py +777 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/handlers.py +17 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/parity.json +28 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/provenance.json +233 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/scope.toml +112 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/world.json +1380 -0
- gatewaysdk/environment/schema/connectors/base.json +28 -0
- gatewaysdk/environment/schema/connectors/custom/handlers.py +18 -0
- gatewaysdk/environment/schema/connectors/custom/world.json +123 -0
- gatewaysdk/environment/schema/connectors/github/handlers.py +81 -0
- gatewaysdk/environment/schema/connectors/github/parity.json +37 -0
- gatewaysdk/environment/schema/connectors/github/provenance.json +134 -0
- gatewaysdk/environment/schema/connectors/github/scope.toml +158 -0
- gatewaysdk/environment/schema/connectors/github/world.json +5869 -0
- gatewaysdk/environment/schema/connectors/google-calendar/handlers.py +23 -0
- gatewaysdk/environment/schema/connectors/google-calendar/world.json +209 -0
- gatewaysdk/environment/schema/connectors/google-drive/handlers.py +18 -0
- gatewaysdk/environment/schema/connectors/google-drive/world.json +286 -0
- gatewaysdk/environment/schema/connectors/jamf/handlers.py +34 -0
- gatewaysdk/environment/schema/connectors/jamf/parity.json +49 -0
- gatewaysdk/environment/schema/connectors/jamf/provenance.json +181 -0
- gatewaysdk/environment/schema/connectors/jamf/scope.toml +128 -0
- gatewaysdk/environment/schema/connectors/jamf/world.json +2218 -0
- gatewaysdk/environment/schema/connectors/jira/handlers.py +28 -0
- gatewaysdk/environment/schema/connectors/jira/world.json +389 -0
- gatewaysdk/environment/schema/connectors/kandji/handlers.py +38 -0
- gatewaysdk/environment/schema/connectors/kandji/parity.json +29 -0
- gatewaysdk/environment/schema/connectors/kandji/provenance.json +152 -0
- gatewaysdk/environment/schema/connectors/kandji/scope.toml +120 -0
- gatewaysdk/environment/schema/connectors/kandji/world.json +765 -0
- gatewaysdk/environment/schema/connectors/linear/handlers.py +20 -0
- gatewaysdk/environment/schema/connectors/linear/world.json +363 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/fidelity.json +45 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/handlers.py +1 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/provenance.json +851 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/scope.md +231 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/teams-types.json +1710 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/world.json +858 -0
- gatewaysdk/environment/schema/connectors/netsuite/handlers.py +32 -0
- gatewaysdk/environment/schema/connectors/netsuite/parity.json +50 -0
- gatewaysdk/environment/schema/connectors/netsuite/provenance.json +137 -0
- gatewaysdk/environment/schema/connectors/netsuite/scope.toml +78 -0
- gatewaysdk/environment/schema/connectors/netsuite/world.json +16243 -0
- gatewaysdk/environment/schema/connectors/salesforce/handlers.py +806 -0
- gatewaysdk/environment/schema/connectors/salesforce/parity.json +46 -0
- gatewaysdk/environment/schema/connectors/salesforce/provenance.json +143 -0
- gatewaysdk/environment/schema/connectors/salesforce/scope.toml +174 -0
- gatewaysdk/environment/schema/connectors/salesforce/world.json +4695 -0
- gatewaysdk/environment/schema/connectors/slack/MODEL.md +236 -0
- gatewaysdk/environment/schema/connectors/slack/capabilities.json +1039 -0
- gatewaysdk/environment/schema/connectors/slack/handlers.py +762 -0
- gatewaysdk/environment/schema/connectors/slack/parity.json +65 -0
- gatewaysdk/environment/schema/connectors/slack/provenance.json +294 -0
- gatewaysdk/environment/schema/connectors/slack/scope.toml +44 -0
- gatewaysdk/environment/schema/connectors/slack/world.json +4993 -0
- gatewaysdk/environment/schema/connectors/workday/handlers.py +75 -0
- gatewaysdk/environment/schema/connectors/workday/parity.json +36 -0
- gatewaysdk/environment/schema/connectors/workday/provenance.json +179 -0
- gatewaysdk/environment/schema/connectors/workday/scope.toml +180 -0
- gatewaysdk/environment/schema/connectors/workday/world.json +806 -0
- gatewaysdk/environment/schema/data.py +593 -0
- gatewaysdk/environment/schema/extract.py +263 -0
- gatewaysdk/environment/schema/host.py +2437 -0
- gatewaysdk/environment/schema/host_surfaces.py +275 -0
- gatewaysdk/environment/schema/platform.py +1272 -0
- gatewaysdk/environment/schema/scaffold.py +250 -0
- gatewaysdk/environment/schema/skill.py +118 -0
- gatewaysdk/environment/schema/skills/agents/connector-template-author.md +202 -0
- gatewaysdk/environment/schema/skills/connector-schema-authoring/CONNECTORS.md +331 -0
- gatewaysdk/environment/schema/skills/connector-schema-authoring/CONVENTIONS.md +100 -0
- gatewaysdk/environment/schema/skills/connector-schema-authoring/SKILL.md +313 -0
- gatewaysdk/environment/schema/skills/world-data-ingestion/ROWS.md +223 -0
- gatewaysdk/environment/schema/skills/world-data-ingestion/SKILL.md +293 -0
- gatewaysdk/environment/schema/skills/worlds-getting-started/SKILL.md +390 -0
- gatewaysdk/environment/schema/slack.py +757 -0
- gatewaysdk/environment/schema/snapshot.py +479 -0
- gatewaysdk/environment/schema/store.py +904 -0
- gatewaysdk/environment/schema/tasks.py +525 -0
- gatewaysdk/environment/schema/tools_world.py +322 -0
- gatewaysdk/environment/schema/validation.py +577 -0
- gatewaysdk/environment/schema/worker.py +78 -0
- gatewaysdk/environment/schema/workers.py +500 -0
- gatewaysdk/environment/schema/world_tests.py +336 -0
- gatewaysdk/environments/__init__.py +24 -0
- gatewaysdk/environments/client.py +486 -0
- gatewaysdk/environments/types.py +318 -0
- gatewaysdk/execution/__init__.py +15 -0
- gatewaysdk/execution/base.py +64 -0
- gatewaysdk/execution/client_server.py +443 -0
- gatewaysdk/execution/events.py +69 -0
- gatewaysdk/execution/inter_process.py +16 -0
- gatewaysdk/execution/shared_memory.py +282 -0
- gatewaysdk/experiments/__init__.py +90 -0
- gatewaysdk/experiments/assignment.py +177 -0
- gatewaysdk/experiments/client.py +877 -0
- gatewaysdk/experiments/exposure.py +222 -0
- gatewaysdk/experiments/types.py +81 -0
- gatewaysdk/importers/__init__.py +49 -0
- gatewaysdk/importers/_normalize.py +91 -0
- gatewaysdk/importers/builder.py +173 -0
- gatewaysdk/importers/client.py +95 -0
- gatewaysdk/importers/langsmith.py +196 -0
- gatewaysdk/importers/recipes.py +249 -0
- gatewaysdk/instrumentation/__init__.py +300 -0
- gatewaysdk/instrumentation/agentops.py +314 -0
- gatewaysdk/instrumentation/agentops_langchain.py +45 -0
- gatewaysdk/instrumentation/base.py +119 -0
- gatewaysdk/instrumentation/litellm.py +83 -0
- gatewaysdk/instrumentation/registry.py +273 -0
- gatewaysdk/instrumentation/vllm.py +81 -0
- gatewaysdk/instrumentation/weave.py +500 -0
- gatewaysdk/integrations/__init__.py +15 -0
- gatewaysdk/integrations/gateway/__init__.py +11 -0
- gatewaysdk/integrations/gateway/client.py +171 -0
- gatewaysdk/integrations/tool_access.py +549 -0
- gatewaysdk/litagent/__init__.py +11 -0
- gatewaysdk/litagent/decorator.py +536 -0
- gatewaysdk/litagent/litagent.py +252 -0
- gatewaysdk/llm_proxy.py +1742 -0
- gatewaysdk/logging.py +370 -0
- gatewaysdk/memory.py +278 -0
- gatewaysdk/personas.py +186 -0
- gatewaysdk/platform/__init__.py +17 -0
- gatewaysdk/platform/builder.py +221 -0
- gatewaysdk/platform/compatibility.py +67 -0
- gatewaysdk/platform/manifest.py +185 -0
- gatewaysdk/platform/orchestrator.py +901 -0
- gatewaysdk/platform/registry.py +122 -0
- gatewaysdk/platform/worker.py +864 -0
- gatewaysdk/replay/__init__.py +1032 -0
- gatewaysdk/replay/pytest.py +56 -0
- gatewaysdk/reward.py +7 -0
- gatewaysdk/run.py +1781 -0
- gatewaysdk/runner/__init__.py +11 -0
- gatewaysdk/runner/agent.py +878 -0
- gatewaysdk/runner/base.py +182 -0
- gatewaysdk/runner/legacy.py +309 -0
- gatewaysdk/security.py +700 -0
- gatewaysdk/semconv.py +170 -0
- gatewaysdk/server.py +399 -0
- gatewaysdk/sessions.py +282 -0
- gatewaysdk/store/__init__.py +45 -0
- gatewaysdk/store/base.py +908 -0
- gatewaysdk/store/client_server.py +2093 -0
- gatewaysdk/store/collection/__init__.py +30 -0
- gatewaysdk/store/collection/base.py +587 -0
- gatewaysdk/store/collection/memory.py +970 -0
- gatewaysdk/store/collection/mongo.py +1412 -0
- gatewaysdk/store/collection_based.py +1823 -0
- gatewaysdk/store/gateway.py +983 -0
- gatewaysdk/store/gateway_listener.py +465 -0
- gatewaysdk/store/listener.py +58 -0
- gatewaysdk/store/memory.py +396 -0
- gatewaysdk/store/mongo.py +165 -0
- gatewaysdk/store/redis_stream.py +517 -0
- gatewaysdk/store/sqlite.py +3 -0
- gatewaysdk/store/threading.py +370 -0
- gatewaysdk/store/utils.py +142 -0
- gatewaysdk/tracer/__init__.py +14 -0
- gatewaysdk/tracer/base.py +286 -0
- gatewaysdk/tracer/dummy.py +106 -0
- gatewaysdk/tracer/otel.py +559 -0
- gatewaysdk/tracing/__init__.py +110 -0
- gatewaysdk/tracing/api.py +808 -0
- gatewaysdk/tracing/attributes.py +9 -0
- gatewaysdk/tracing/context.py +272 -0
- gatewaysdk/tracing/exporters/__init__.py +10 -0
- gatewaysdk/tracing/exporters/gateway.py +228 -0
- gatewaysdk/tracing/identity.py +288 -0
- gatewaysdk/tracing/init.py +620 -0
- gatewaysdk/tracing/instrumentors/__init__.py +15 -0
- gatewaysdk/tracing/instrumentors/claude_agent_sdk.py +766 -0
- gatewaysdk/tracing/instrumentors/instrumentation_principles.md +294 -0
- gatewaysdk/tracing/instrumentors/registry.py +352 -0
- gatewaysdk/tracing/mapping.py +729 -0
- gatewaysdk/tracing/processors.py +393 -0
- gatewaysdk/tracing/push.py +617 -0
- gatewaysdk/tracing/push_models.py +247 -0
- gatewaysdk/tracing/semconv.py +294 -0
- gatewaysdk/tracing/span_builder.py +356 -0
- gatewaysdk/trainer/__init__.py +6 -0
- gatewaysdk/trainer/init_utils.py +263 -0
- gatewaysdk/trainer/legacy.py +359 -0
- gatewaysdk/trainer/registry.py +12 -0
- gatewaysdk/trainer/trainer.py +638 -0
- gatewaysdk/types/__init__.py +63 -0
- gatewaysdk/types/core.py +556 -0
- gatewaysdk/types/resources.py +204 -0
- gatewaysdk/types/tracer.py +515 -0
- gatewaysdk/types/tracing.py +162 -0
- gatewaysdk/users.py +251 -0
- gatewaysdk/utils/__init__.py +1 -0
- gatewaysdk/utils/id.py +18 -0
- gatewaysdk/utils/metrics.py +1025 -0
- gatewaysdk/utils/otel.py +550 -0
- gatewaysdk/utils/otlp.py +556 -0
- gatewaysdk/utils/redact.py +22 -0
- gatewaysdk/utils/server_launcher.py +1045 -0
- gatewaysdk/utils/system_snapshot.py +90 -0
- gatewaysdk/verl/__init__.py +8 -0
- gatewaysdk/verl/__main__.py +6 -0
- gatewaysdk/verl/async_server.py +46 -0
- gatewaysdk/verl/config.yaml +27 -0
- gatewaysdk/verl/daemon.py +1154 -0
- gatewaysdk/verl/dataset.py +44 -0
- gatewaysdk/verl/entrypoint.py +248 -0
- gatewaysdk/verl/trainer.py +549 -0
- gatewaysdk/world_browser.py +748 -0
- gatewaysdk/world_data.py +453 -0
- gatewaysdk/world_sessions.py +978 -0
- gatewaysdk/world_tasks.py +285 -0
- gatewaysdk/world_tools.py +115 -0
- gatewaysdk/worlds.py +639 -0
- gatewaysdk-0.3.2.dist-info/METADATA +236 -0
- gatewaysdk-0.3.2.dist-info/RECORD +376 -0
- gatewaysdk-0.3.2.dist-info/WHEEL +4 -0
- gatewaysdk-0.3.2.dist-info/entry_points.txt +5 -0
- gatewaysdk-0.3.2.dist-info/licenses/LICENSE +19 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
"""Worlds — deterministic instances of a mock-tools environment's seeded state.
|
|
2
|
+
|
|
3
|
+
A world is one sqlite file, branched (file-copied) from the environment's
|
|
4
|
+
prepared template db, plus the seams that let an agent's tool calls execute
|
|
5
|
+
against it: ``execute``, ``as_registry`` (the exact replay ``ToolStubRegistry``
|
|
6
|
+
mapping contract), ``wrap_tools``, and grading (``verify`` / ``state``).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import shutil
|
|
12
|
+
import sqlite3
|
|
13
|
+
import time
|
|
14
|
+
import uuid
|
|
15
|
+
from contextlib import nullcontext
|
|
16
|
+
from dataclasses import dataclass, field
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Union
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
from ..replay import StubRegistryMapping
|
|
22
|
+
except ImportError:
|
|
23
|
+
# ``replay`` pulls in ``requests`` + the sessions stack. A lean consumer
|
|
24
|
+
# that only needs worlds + verifiers (e.g. the benchmark runner's
|
|
25
|
+
# mock_tools engine, which vendors just this ``environment`` subpackage —
|
|
26
|
+
# no ``replay``) still imports ``World``/``verify``; only ``as_registry``
|
|
27
|
+
# (the replay registry contract) is unavailable there, and it is never
|
|
28
|
+
# called on that path. The full SDK always has ``replay``, so real
|
|
29
|
+
# behaviour is unchanged.
|
|
30
|
+
StubRegistryMapping = dict # type: ignore[assignment,misc]
|
|
31
|
+
from . import runtime
|
|
32
|
+
from .errors import ToolRouteError, VerifierError
|
|
33
|
+
|
|
34
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
35
|
+
from .core import Environment
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class VerifierResult:
|
|
40
|
+
"""One verifier outcome. ``score=None`` stays ``None`` (house rule: null
|
|
41
|
+
scores are their own category, never coerced to 0) and yields
|
|
42
|
+
``passed=None``; otherwise ``passed = score >= 1.0``."""
|
|
43
|
+
|
|
44
|
+
name: str
|
|
45
|
+
passed: Optional[bool]
|
|
46
|
+
score: Optional[float]
|
|
47
|
+
detail: str = ""
|
|
48
|
+
rewards: Dict[str, float] = field(default_factory=dict)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def split_sql_statements(script: str) -> List[str]:
|
|
52
|
+
"""Split a SQL script into complete statements (via
|
|
53
|
+
``sqlite3.complete_statement`` accumulation, so semicolons inside string
|
|
54
|
+
literals don't split)."""
|
|
55
|
+
statements: List[str] = []
|
|
56
|
+
buffer = ""
|
|
57
|
+
for line in script.splitlines(keepends=True):
|
|
58
|
+
buffer += line
|
|
59
|
+
if sqlite3.complete_statement(buffer):
|
|
60
|
+
stripped = buffer.strip()
|
|
61
|
+
if stripped:
|
|
62
|
+
statements.append(stripped)
|
|
63
|
+
buffer = ""
|
|
64
|
+
if buffer.strip():
|
|
65
|
+
statements.append(buffer.strip())
|
|
66
|
+
return statements
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
_NO_INPUT = object()
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _stub_input(tool_input: Any, kwargs: Dict[str, Any]) -> Any:
|
|
73
|
+
"""One rule for callable seams: an explicit positional input (even None)
|
|
74
|
+
is the input; keyword arguments are the input; nothing means omitted."""
|
|
75
|
+
if tool_input is not _NO_INPUT:
|
|
76
|
+
return tool_input
|
|
77
|
+
return kwargs if kwargs else _NO_INPUT
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class WorldRegistry(StubRegistryMapping):
|
|
81
|
+
"""``world.as_registry()`` — the replay registry contract (mapping with
|
|
82
|
+
``__missing__``, ``lookup``, ``call_log``/``called_names``) backed by the
|
|
83
|
+
live env world instead of recordings."""
|
|
84
|
+
|
|
85
|
+
def __init__(self, world: "World") -> None:
|
|
86
|
+
self._world = world
|
|
87
|
+
|
|
88
|
+
def make(name: str) -> Callable[..., Any]:
|
|
89
|
+
def stub(tool_input: Any = _NO_INPUT, **kwargs: Any) -> Any:
|
|
90
|
+
return world._registry_call(name, _stub_input(tool_input, kwargs))
|
|
91
|
+
|
|
92
|
+
stub.__name__ = name if name.isidentifier() else "stub"
|
|
93
|
+
stub.__qualname__ = f"gateway_env.{name}"
|
|
94
|
+
return stub
|
|
95
|
+
|
|
96
|
+
super().__init__(
|
|
97
|
+
{name: make(name) for name in world.env._handlers}, make
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def call_log(self) -> List[Dict[str, Any]]:
|
|
102
|
+
return self._world.call_log
|
|
103
|
+
|
|
104
|
+
def lookup(self, tool_name: str, tool_input: Any = _NO_INPUT) -> Any:
|
|
105
|
+
return self._world._registry_call(tool_name, tool_input)
|
|
106
|
+
|
|
107
|
+
def called_names(self) -> List[str]:
|
|
108
|
+
return [entry["tool"] for entry in self._world.call_log]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class World:
|
|
112
|
+
"""One live, isolated instance of the environment's seeded state."""
|
|
113
|
+
|
|
114
|
+
def __init__(self, env: "Environment", *, world_id: Optional[str] = None, snapshot: Optional[Path] = None) -> None:
|
|
115
|
+
self.env = env
|
|
116
|
+
self.id = world_id or uuid.uuid4().hex[:8]
|
|
117
|
+
self.db_path: Path = env._worlds_dir / f"world-{self.id}.db"
|
|
118
|
+
self.call_log: List[Dict[str, Any]] = []
|
|
119
|
+
from .schema import bundle_mode, check_bundle
|
|
120
|
+
|
|
121
|
+
self.contract = check_bundle(env.bundle_path) if bundle_mode(env.bundle_path) is not None else None
|
|
122
|
+
self.store = None
|
|
123
|
+
shutil.copyfile(snapshot if snapshot is not None else env._template_db, self.db_path)
|
|
124
|
+
try:
|
|
125
|
+
self._conn = self._connect()
|
|
126
|
+
except BaseException:
|
|
127
|
+
self.db_path.unlink(missing_ok=True)
|
|
128
|
+
raise
|
|
129
|
+
|
|
130
|
+
def _connect(self) -> sqlite3.Connection:
|
|
131
|
+
# autocommit + cross-thread: agents call tools from worker threads, and
|
|
132
|
+
# file copies (branch/snapshot/reset) must always see committed state.
|
|
133
|
+
if self.contract is not None:
|
|
134
|
+
from .schema import SQLiteStore
|
|
135
|
+
|
|
136
|
+
self.store = SQLiteStore.open(self.db_path, self.contract)
|
|
137
|
+
return self.store._conn # Trusted host only; handlers receive ReadConnection.
|
|
138
|
+
conn = sqlite3.connect(self.db_path, isolation_level=None, check_same_thread=False)
|
|
139
|
+
conn.row_factory = sqlite3.Row
|
|
140
|
+
return conn
|
|
141
|
+
|
|
142
|
+
# -- execution seams -------------------------------------------------
|
|
143
|
+
|
|
144
|
+
def execute(self, tool_name: str, tool_input: Any = _NO_INPUT) -> Any:
|
|
145
|
+
"""Execute atomically in schema mode, validating both input and output."""
|
|
146
|
+
from .schema.store import ReadConnection
|
|
147
|
+
from .schema.validation import validate
|
|
148
|
+
|
|
149
|
+
handler = self.env._handlers.get(tool_name)
|
|
150
|
+
if handler is None or (self.contract is not None and tool_name not in self.contract.tools):
|
|
151
|
+
raise ToolRouteError(f"tool '{tool_name}' has no declared env handler")
|
|
152
|
+
supplied = ({} if self.contract else None) if tool_input is _NO_INPUT else tool_input
|
|
153
|
+
started = time.perf_counter()
|
|
154
|
+
with self.store.transaction() if self.store is not None else nullcontext():
|
|
155
|
+
if self.contract is not None:
|
|
156
|
+
validate(
|
|
157
|
+
self.contract.tools[tool_name]["input_schema"],
|
|
158
|
+
supplied,
|
|
159
|
+
location=f"world.json#/x-gateway/tools/{tool_name}/input",
|
|
160
|
+
)
|
|
161
|
+
token = runtime._active_connection.set(ReadConnection(self.store) if self.store is not None else self._conn)
|
|
162
|
+
store_token = runtime._active_store.set(self.store)
|
|
163
|
+
try:
|
|
164
|
+
if isinstance(supplied, Mapping):
|
|
165
|
+
result = handler(**supplied)
|
|
166
|
+
elif supplied is None:
|
|
167
|
+
result = handler()
|
|
168
|
+
else:
|
|
169
|
+
result = handler(supplied)
|
|
170
|
+
if self.contract is not None:
|
|
171
|
+
validate(
|
|
172
|
+
self.contract.tools[tool_name]["output_schema"],
|
|
173
|
+
result,
|
|
174
|
+
location=f"world.json#/x-gateway/tools/{tool_name}/output",
|
|
175
|
+
)
|
|
176
|
+
finally:
|
|
177
|
+
runtime._active_connection.reset(token)
|
|
178
|
+
runtime._active_store.reset(store_token)
|
|
179
|
+
duration_ms = (time.perf_counter() - started) * 1000.0
|
|
180
|
+
self.call_log.append({"tool": tool_name, "match": "env", "input": supplied})
|
|
181
|
+
self.env._record_route(tool_name, "env", duration_ms, self.id)
|
|
182
|
+
return result
|
|
183
|
+
|
|
184
|
+
def _registry_call(
|
|
185
|
+
self, tool_name: str, tool_input: Any = _NO_INPUT
|
|
186
|
+
) -> Any:
|
|
187
|
+
if tool_name in self.env._handlers and self.env.resolve_route(tool_name) == "env":
|
|
188
|
+
return self.execute(tool_name, tool_input)
|
|
189
|
+
route = self.env.resolve_route(tool_name)
|
|
190
|
+
logged = None if tool_input is _NO_INPUT else tool_input
|
|
191
|
+
self.call_log.append({"tool": tool_name, "match": "miss", "input": logged})
|
|
192
|
+
if route == "prod":
|
|
193
|
+
raise ToolRouteError(
|
|
194
|
+
f"tool '{tool_name}' routes to prod, but the registry seam has no "
|
|
195
|
+
"live implementation to call — pass the real callable via "
|
|
196
|
+
"world.wrap_tools()/your own registry, or rely on the ambient "
|
|
197
|
+
"define_tool wrapper (with env:), which passes prod-routed calls "
|
|
198
|
+
"through to the original function."
|
|
199
|
+
)
|
|
200
|
+
raise ToolRouteError(
|
|
201
|
+
f"tool '{tool_name}' has no env handler "
|
|
202
|
+
f"(served: {sorted(self.env._handlers)}) and no prod route."
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
def as_registry(self) -> WorldRegistry:
|
|
206
|
+
"""Tool-name → callable mapping, drop-in for agent tool layers —
|
|
207
|
+
identical contract to ``ToolStubRegistry.as_registry()`` in replay."""
|
|
208
|
+
return WorldRegistry(self)
|
|
209
|
+
|
|
210
|
+
def wrap_tools(
|
|
211
|
+
self, tools: Union[Mapping[str, Any], List[Any]]
|
|
212
|
+
) -> Union[Dict[str, Any], List[Any]]:
|
|
213
|
+
"""Substitute env-served callables by name in a list/dict of tools;
|
|
214
|
+
everything not served (or not env-routed) passes through unchanged."""
|
|
215
|
+
|
|
216
|
+
def routed_to_env(name: Optional[str]) -> bool:
|
|
217
|
+
return bool(name) and name in self.env._handlers and self.env.resolve_route(name) == "env"
|
|
218
|
+
|
|
219
|
+
def stub_for(name: str) -> Callable[..., Any]:
|
|
220
|
+
def stub(tool_input: Any = _NO_INPUT, **kwargs: Any) -> Any:
|
|
221
|
+
return self.execute(name, _stub_input(tool_input, kwargs))
|
|
222
|
+
|
|
223
|
+
stub.__name__ = name if name.isidentifier() else "stub"
|
|
224
|
+
return stub
|
|
225
|
+
|
|
226
|
+
if isinstance(tools, Mapping):
|
|
227
|
+
return {
|
|
228
|
+
name: (stub_for(name) if routed_to_env(name) else value)
|
|
229
|
+
for name, value in tools.items()
|
|
230
|
+
}
|
|
231
|
+
wrapped: List[Any] = []
|
|
232
|
+
for item in tools:
|
|
233
|
+
name = getattr(item, "name", None)
|
|
234
|
+
if not isinstance(name, str):
|
|
235
|
+
name = getattr(item, "__name__", None)
|
|
236
|
+
wrapped.append(stub_for(name) if routed_to_env(name) else item)
|
|
237
|
+
return wrapped
|
|
238
|
+
|
|
239
|
+
# -- state lifecycle -------------------------------------------------
|
|
240
|
+
|
|
241
|
+
def reset(self) -> None:
|
|
242
|
+
"""Back to the seed, in place (same world instance)."""
|
|
243
|
+
if self.contract is not None:
|
|
244
|
+
from .schema import check_bundle
|
|
245
|
+
|
|
246
|
+
if check_bundle(self.env.bundle_path).lock != self.contract.lock:
|
|
247
|
+
from .schema import ContractError
|
|
248
|
+
|
|
249
|
+
raise ContractError("state_contract", "Bundle contract changed; create a new world explicitly")
|
|
250
|
+
if self.store is not None:
|
|
251
|
+
self.store.close()
|
|
252
|
+
else:
|
|
253
|
+
self._conn.close()
|
|
254
|
+
shutil.copyfile(self.env._template_db, self.db_path)
|
|
255
|
+
self._conn = self._connect()
|
|
256
|
+
|
|
257
|
+
def restore(self, source: Union[str, Path]) -> None:
|
|
258
|
+
"""Replace this world's state with a file :meth:`snapshot` wrote, in place.
|
|
259
|
+
The file is opened the way a fresh copy of the seed is, so a schema-backed
|
|
260
|
+
world audits it against its contract."""
|
|
261
|
+
if self.store is not None:
|
|
262
|
+
self.store.close()
|
|
263
|
+
else:
|
|
264
|
+
self._conn.close()
|
|
265
|
+
shutil.copyfile(source, self.db_path)
|
|
266
|
+
self._conn = self._connect()
|
|
267
|
+
|
|
268
|
+
def snapshot(self, destination: Union[str, Path]) -> Path:
|
|
269
|
+
"""Pin this world's current state to a file (for debugging fixtures)."""
|
|
270
|
+
if self.store is not None:
|
|
271
|
+
return self.store.snapshot(destination)
|
|
272
|
+
dest = Path(destination)
|
|
273
|
+
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
274
|
+
shutil.copyfile(self.db_path, dest)
|
|
275
|
+
return dest
|
|
276
|
+
|
|
277
|
+
def close(self) -> None:
|
|
278
|
+
try:
|
|
279
|
+
if self.store is not None:
|
|
280
|
+
self.store.close()
|
|
281
|
+
else:
|
|
282
|
+
self._conn.close()
|
|
283
|
+
except sqlite3.Error: # pragma: no cover — close is best-effort
|
|
284
|
+
pass
|
|
285
|
+
|
|
286
|
+
# -- grading ---------------------------------------------------------
|
|
287
|
+
|
|
288
|
+
def state(self, sql: str, *params: Any) -> List[Dict[str, Any]]:
|
|
289
|
+
"""Read-only SQL against the world's db (SELECT/WITH only)."""
|
|
290
|
+
if self.store is not None:
|
|
291
|
+
return [dict(row) for row in self.store.query(sql, params)]
|
|
292
|
+
head = sql.lstrip().split(None, 1)[0].upper() if sql.strip() else ""
|
|
293
|
+
if head not in ("SELECT", "WITH"):
|
|
294
|
+
raise ValueError(
|
|
295
|
+
"world.state() is read-only — only SELECT/WITH queries are "
|
|
296
|
+
"allowed (use tool handlers or verifiers for writes)."
|
|
297
|
+
)
|
|
298
|
+
rows = self._conn.execute(sql, params).fetchall()
|
|
299
|
+
return [dict(row) for row in rows]
|
|
300
|
+
|
|
301
|
+
def verify(self, name: str) -> VerifierResult:
|
|
302
|
+
"""Run ``verifiers/<name>.sql`` against this world.
|
|
303
|
+
|
|
304
|
+
Statements run in order; the score is the first column of the first
|
|
305
|
+
row of the LAST row-returning statement. NULL / no rows → score None
|
|
306
|
+
(passed None) — never coerced to 0.
|
|
307
|
+
"""
|
|
308
|
+
verifier_name = name[:-4] if name.endswith(".sql") else name
|
|
309
|
+
path = self.env.bundle_path / "verifiers" / f"{verifier_name}.sql"
|
|
310
|
+
if not path.is_file():
|
|
311
|
+
available = sorted(p.stem for p in (self.env.bundle_path / "verifiers").glob("*.sql"))
|
|
312
|
+
raise VerifierError(f"unknown verifier '{name}' (available: {available})")
|
|
313
|
+
|
|
314
|
+
script = path.read_text(encoding="utf-8")
|
|
315
|
+
score: Optional[float] = None
|
|
316
|
+
saw_rows = False
|
|
317
|
+
last_sql = ""
|
|
318
|
+
for statement in split_sql_statements(script):
|
|
319
|
+
try:
|
|
320
|
+
if self.store is not None:
|
|
321
|
+
rows = self.store.query(statement, private=True)
|
|
322
|
+
saw_rows = True
|
|
323
|
+
last_sql = statement
|
|
324
|
+
value = rows[0][0] if rows else None
|
|
325
|
+
score = float(value) if value is not None else None
|
|
326
|
+
continue
|
|
327
|
+
cursor = self._conn.execute(statement)
|
|
328
|
+
except sqlite3.Error as error:
|
|
329
|
+
raise VerifierError(
|
|
330
|
+
f"verifier '{verifier_name}' failed: {error}\n SQL: {statement}"
|
|
331
|
+
) from error
|
|
332
|
+
if cursor.description is not None: # row-returning statement
|
|
333
|
+
saw_rows = True
|
|
334
|
+
last_sql = statement
|
|
335
|
+
row = cursor.fetchone()
|
|
336
|
+
value = row[0] if row is not None else None
|
|
337
|
+
score = float(value) if value is not None else None
|
|
338
|
+
|
|
339
|
+
if not saw_rows:
|
|
340
|
+
detail = "no row-returning statement — score is null"
|
|
341
|
+
elif score is None:
|
|
342
|
+
detail = f"null score from: {last_sql}"
|
|
343
|
+
else:
|
|
344
|
+
detail = f"score {score} from: {last_sql}"
|
|
345
|
+
passed = None if score is None else score >= 1.0
|
|
346
|
+
return VerifierResult(name=verifier_name, passed=passed, score=score, detail=detail)
|