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,9 @@
|
|
|
1
|
+
# Copyright (c) Gateway. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Semantic attributes for GatewayDK tracing.
|
|
4
|
+
|
|
5
|
+
DEPRECATED: This module re-exports all constants from semconv.py for backward
|
|
6
|
+
compatibility. New code should import directly from gatewaysdk.tracing.semconv.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .semconv import * # noqa: F401, F403
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Copyright (c) Gateway. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Unified tracing context for GatewayDK.
|
|
4
|
+
|
|
5
|
+
This module provides context variables and context managers for ALL tracing
|
|
6
|
+
metadata: call_type, tags, environment. The TracingContextSpanProcessor
|
|
7
|
+
reads from these and injects into spans.
|
|
8
|
+
|
|
9
|
+
Run/rollout context (run_id, session_id) is read directly from the run module.
|
|
10
|
+
|
|
11
|
+
Usage::
|
|
12
|
+
|
|
13
|
+
import gatewaysdk.tracing as tracing
|
|
14
|
+
|
|
15
|
+
# Context manager for ad-hoc tagging
|
|
16
|
+
with tracing.tracing_context(call_type="agent-call", tags=["gepa", "train"]):
|
|
17
|
+
response = client.chat.completions.create(...) # Tagged automatically
|
|
18
|
+
|
|
19
|
+
# Decorator for consistent function tagging
|
|
20
|
+
@tracing.call_type_decorator("judge-call")
|
|
21
|
+
def my_judge_function():
|
|
22
|
+
response = client.chat.completions.create(...) # Tagged as judge-call
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import asyncio
|
|
28
|
+
from contextlib import contextmanager
|
|
29
|
+
from contextvars import ContextVar
|
|
30
|
+
from functools import wraps
|
|
31
|
+
from typing import Iterator, Any, Callable, Generator, List, Optional, TypeVar
|
|
32
|
+
|
|
33
|
+
# Type variable for decorators
|
|
34
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
|
35
|
+
|
|
36
|
+
# =============================================================================
|
|
37
|
+
# Context Variables for Tracing Metadata
|
|
38
|
+
# =============================================================================
|
|
39
|
+
|
|
40
|
+
_call_type_context: ContextVar[Optional[str]] = ContextVar("gateway_call_type", default=None)
|
|
41
|
+
_tags_context: ContextVar[Optional[List[str]]] = ContextVar("gateway_tags", default=None)
|
|
42
|
+
_environment_context: ContextVar[Optional[str]] = ContextVar("gateway_environment", default=None)
|
|
43
|
+
# Proxy-specific session context. Used by RolloutAttemptMiddleware in llm_proxy
|
|
44
|
+
# to set the session_id for proxy spans (where there's no Run/Rollout object).
|
|
45
|
+
_proxy_session_context: ContextVar[Optional[str]] = ContextVar("gateway_proxy_session", default=None)
|
|
46
|
+
# Context Hub items (prompts/agents/skills/memory) used in this execution
|
|
47
|
+
# context. Stored as an immutable tuple of dicts with keys: kind,
|
|
48
|
+
# repo_handle, commit_hash, label. Appended automatically by
|
|
49
|
+
# GatewayContext.pull(); injected into every span by
|
|
50
|
+
# TracingContextSpanProcessor so traces/sessions link to the content
|
|
51
|
+
# they used.
|
|
52
|
+
_context_items_context: ContextVar[Optional[tuple]] = ContextVar(
|
|
53
|
+
"gateway_context_items", default=None
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# =============================================================================
|
|
58
|
+
# Getters
|
|
59
|
+
# =============================================================================
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_current_call_type() -> Optional[str]:
|
|
63
|
+
"""Get the current LLM call type (e.g., 'agent-call', 'judge-call').
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
The current call type string, or None if not set.
|
|
67
|
+
"""
|
|
68
|
+
return _call_type_context.get()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def get_current_tags() -> Optional[List[str]]:
|
|
72
|
+
"""Get the current tracing tags.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
The current list of tags, or None if not set.
|
|
76
|
+
"""
|
|
77
|
+
return _tags_context.get()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def get_current_environment() -> Optional[str]:
|
|
81
|
+
"""Get the current tracing environment.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
The current environment string, or None if not set.
|
|
85
|
+
"""
|
|
86
|
+
return _environment_context.get()
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def get_current_context_items() -> tuple:
|
|
90
|
+
"""Get the Context Hub items recorded in this execution context.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Tuple of dicts with keys: kind, repo_handle, commit_hash, label.
|
|
94
|
+
"""
|
|
95
|
+
return _context_items_context.get() or ()
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def record_context_item(
|
|
99
|
+
kind: str,
|
|
100
|
+
repo_handle: Optional[str],
|
|
101
|
+
commit_hash: Optional[str] = None,
|
|
102
|
+
label: Optional[str] = None,
|
|
103
|
+
) -> None:
|
|
104
|
+
"""Record that a Context Hub item is being used.
|
|
105
|
+
|
|
106
|
+
Called automatically by ``GatewayContext.pull()`` so that all spans
|
|
107
|
+
created afterwards carry ``gateway.context.*`` attributes linking the
|
|
108
|
+
trace (and its session) to the prompt/agent/skill/memory content used.
|
|
109
|
+
Deduplicates on (kind, repo_handle, commit_hash).
|
|
110
|
+
"""
|
|
111
|
+
if not kind or not repo_handle:
|
|
112
|
+
return
|
|
113
|
+
item = {
|
|
114
|
+
"kind": str(kind),
|
|
115
|
+
"repo_handle": str(repo_handle),
|
|
116
|
+
"commit_hash": str(commit_hash) if commit_hash else None,
|
|
117
|
+
"label": str(label) if label else None,
|
|
118
|
+
}
|
|
119
|
+
existing = _context_items_context.get() or ()
|
|
120
|
+
for candidate in existing:
|
|
121
|
+
if (
|
|
122
|
+
candidate.get("kind") == item["kind"]
|
|
123
|
+
and candidate.get("repo_handle") == item["repo_handle"]
|
|
124
|
+
and candidate.get("commit_hash") == item["commit_hash"]
|
|
125
|
+
):
|
|
126
|
+
return
|
|
127
|
+
_context_items_context.set(existing + (item,))
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def get_proxy_session_id() -> Optional[str]:
|
|
131
|
+
"""Get the proxy-specific session ID.
|
|
132
|
+
|
|
133
|
+
This is set by RolloutAttemptMiddleware in the LLM proxy when there's
|
|
134
|
+
no Run/Rollout object in scope. Falls back to None, in which case
|
|
135
|
+
TracingContextSpanProcessor won't set session_id on proxy spans.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
The proxy session ID string (typically the rollout_id), or None.
|
|
139
|
+
"""
|
|
140
|
+
return _proxy_session_context.get()
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
# =============================================================================
|
|
144
|
+
# Context Managers
|
|
145
|
+
# =============================================================================
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
@contextmanager
|
|
149
|
+
def tracing_context(
|
|
150
|
+
*,
|
|
151
|
+
call_type: Optional[str] = None,
|
|
152
|
+
tags: Optional[List[str]] = None,
|
|
153
|
+
environment: Optional[str] = None,
|
|
154
|
+
session_id: Optional[str] = None,
|
|
155
|
+
) -> Generator[None, None, None]:
|
|
156
|
+
"""Set tracing context for the duration of the block.
|
|
157
|
+
|
|
158
|
+
All spans created within this block will be tagged with the provided
|
|
159
|
+
metadata via the TracingContextSpanProcessor.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
call_type: LLM call type (e.g., "agent-call", "judge-call", "reflection-call")
|
|
163
|
+
tags: List of tags for the traces
|
|
164
|
+
environment: Environment name (e.g., "gatewaysdk-gepa")
|
|
165
|
+
session_id: Session ID for proxy spans (set by RolloutAttemptMiddleware)
|
|
166
|
+
|
|
167
|
+
Example::
|
|
168
|
+
|
|
169
|
+
with tracing_context(call_type="agent-call", tags=["gepa", "train"]):
|
|
170
|
+
response = client.chat.completions.create(...) # Tagged automatically
|
|
171
|
+
"""
|
|
172
|
+
tokens: List[tuple[str, Any]] = []
|
|
173
|
+
|
|
174
|
+
if call_type is not None:
|
|
175
|
+
tokens.append(("call_type", _call_type_context.set(call_type)))
|
|
176
|
+
if tags is not None:
|
|
177
|
+
tokens.append(("tags", _tags_context.set(tags)))
|
|
178
|
+
if environment is not None:
|
|
179
|
+
tokens.append(("environment", _environment_context.set(environment)))
|
|
180
|
+
if session_id is not None:
|
|
181
|
+
tokens.append(("session_id", _proxy_session_context.set(session_id)))
|
|
182
|
+
|
|
183
|
+
try:
|
|
184
|
+
yield
|
|
185
|
+
finally:
|
|
186
|
+
for name, token in tokens:
|
|
187
|
+
if name == "call_type":
|
|
188
|
+
_call_type_context.reset(token)
|
|
189
|
+
elif name == "tags":
|
|
190
|
+
_tags_context.reset(token)
|
|
191
|
+
elif name == "environment":
|
|
192
|
+
_environment_context.reset(token)
|
|
193
|
+
elif name == "session_id":
|
|
194
|
+
_proxy_session_context.reset(token)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@contextmanager
|
|
198
|
+
def session(session_id: str) -> Iterator[None]:
|
|
199
|
+
"""Group every trace recorded inside this block under one session id.
|
|
200
|
+
|
|
201
|
+
THE way to record a named session — e.g. a session you intend to
|
|
202
|
+
replay later with gatewaysdk.replay, or a logical conversation spanning
|
|
203
|
+
several traces:
|
|
204
|
+
|
|
205
|
+
import gatewaysdk.tracing as tracing
|
|
206
|
+
|
|
207
|
+
with tracing.session("checkout-regression-001"):
|
|
208
|
+
with tracing.trace("turn-1", input=prompt):
|
|
209
|
+
... # every span in here carries the session id
|
|
210
|
+
|
|
211
|
+
Works process-wide via context propagation, so auto-instrumented LLM
|
|
212
|
+
calls and tool spans inside the block are grouped too. Nesting: the
|
|
213
|
+
innermost session wins.
|
|
214
|
+
"""
|
|
215
|
+
with tracing_context(session_id=session_id):
|
|
216
|
+
yield
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
# =============================================================================
|
|
220
|
+
# Decorators
|
|
221
|
+
# =============================================================================
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def call_type_decorator(call_type: str) -> Callable[[F], F]:
|
|
225
|
+
"""Factory to create call-type tagging decorators.
|
|
226
|
+
|
|
227
|
+
Creates a decorator that sets the call_type context for the duration
|
|
228
|
+
of the decorated function. All spans created within the function
|
|
229
|
+
will have the `gateway.call_type` attribute set.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
call_type: The call type to set (e.g., "agent-call", "judge-call")
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
A decorator that wraps functions with tracing context.
|
|
236
|
+
|
|
237
|
+
Example::
|
|
238
|
+
|
|
239
|
+
# Create reusable decorators
|
|
240
|
+
agent = call_type_decorator("agent-call")
|
|
241
|
+
judge = call_type_decorator("judge-call")
|
|
242
|
+
|
|
243
|
+
@agent
|
|
244
|
+
def my_agent_function():
|
|
245
|
+
# LLM calls here are tagged as "agent-call"
|
|
246
|
+
response = client.chat.completions.create(...)
|
|
247
|
+
|
|
248
|
+
@judge
|
|
249
|
+
def my_judge_function():
|
|
250
|
+
# LLM calls here are tagged as "judge-call"
|
|
251
|
+
response = client.chat.completions.create(...)
|
|
252
|
+
"""
|
|
253
|
+
|
|
254
|
+
def decorator(fn: F) -> F:
|
|
255
|
+
if asyncio.iscoroutinefunction(fn):
|
|
256
|
+
|
|
257
|
+
@wraps(fn)
|
|
258
|
+
async def async_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
259
|
+
with tracing_context(call_type=call_type):
|
|
260
|
+
return await fn(*args, **kwargs)
|
|
261
|
+
|
|
262
|
+
return async_wrapper # type: ignore[return-value]
|
|
263
|
+
else:
|
|
264
|
+
|
|
265
|
+
@wraps(fn)
|
|
266
|
+
def sync_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
267
|
+
with tracing_context(call_type=call_type):
|
|
268
|
+
return fn(*args, **kwargs)
|
|
269
|
+
|
|
270
|
+
return sync_wrapper # type: ignore[return-value]
|
|
271
|
+
|
|
272
|
+
return decorator
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Copyright (c) Gateway. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Gateway OTLP exporter for GatewayDK tracing.
|
|
4
|
+
|
|
5
|
+
This module provides an OTLP/HTTP exporter configured for Gateway,
|
|
6
|
+
with support for environment variable auto-detection and Basic Auth headers.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import base64
|
|
12
|
+
import logging
|
|
13
|
+
import os
|
|
14
|
+
import time
|
|
15
|
+
from typing import Optional
|
|
16
|
+
|
|
17
|
+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
|
|
18
|
+
from opentelemetry.sdk.trace.export import SpanExportResult
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
# Environment variable names (GATEWAY_* prefix)
|
|
23
|
+
ENV_GATEWAY_HOST = "GATEWAY_HOST"
|
|
24
|
+
ENV_GATEWAY_PUBLIC_KEY = "GATEWAY_PUBLIC_KEY"
|
|
25
|
+
ENV_GATEWAY_SECRET_KEY = "GATEWAY_SECRET_KEY"
|
|
26
|
+
ENV_GATEWAY_OTLP_ENDPOINT = "GATEWAY_OTLP_ENDPOINT"
|
|
27
|
+
|
|
28
|
+
# Default OTLP endpoint path
|
|
29
|
+
DEFAULT_OTLP_PATH = "/api/public/otel/v1/traces"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class GatewayOTLPExporter(OTLPSpanExporter):
|
|
33
|
+
"""OTLP exporter configured for Gateway.
|
|
34
|
+
|
|
35
|
+
This exporter automatically handles Basic Auth header construction
|
|
36
|
+
from public/secret key pairs.
|
|
37
|
+
|
|
38
|
+
Example::
|
|
39
|
+
|
|
40
|
+
from gatewaysdk.tracing_claude.exporters import GatewayOTLPExporter
|
|
41
|
+
|
|
42
|
+
exporter = GatewayOTLPExporter(
|
|
43
|
+
host="https://app.gateway.dev",
|
|
44
|
+
public_key="pk-lf-...",
|
|
45
|
+
secret_key="sk-lf-...",
|
|
46
|
+
)
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
host: str,
|
|
52
|
+
public_key: str,
|
|
53
|
+
secret_key: str,
|
|
54
|
+
*,
|
|
55
|
+
endpoint: Optional[str] = None,
|
|
56
|
+
**kwargs,
|
|
57
|
+
):
|
|
58
|
+
"""Initialize the Gateway OTLP exporter.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
host: The Gateway server URL (e.g., "https://app.gateway.dev").
|
|
62
|
+
public_key: The public key for authentication (pk-lf-...).
|
|
63
|
+
secret_key: The secret key for authentication (sk-lf-...).
|
|
64
|
+
endpoint: Optional full OTLP endpoint URL. If not provided,
|
|
65
|
+
derived from host + DEFAULT_OTLP_PATH.
|
|
66
|
+
**kwargs: Additional arguments passed to OTLPSpanExporter.
|
|
67
|
+
"""
|
|
68
|
+
# Derive endpoint from host if not explicitly provided
|
|
69
|
+
if endpoint is None:
|
|
70
|
+
# Remove trailing slash if present
|
|
71
|
+
host = host.rstrip("/")
|
|
72
|
+
endpoint = f"{host}{DEFAULT_OTLP_PATH}"
|
|
73
|
+
|
|
74
|
+
# Construct Basic Auth header
|
|
75
|
+
credentials = f"{public_key}:{secret_key}"
|
|
76
|
+
encoded = base64.b64encode(credentials.encode("utf-8")).decode("utf-8")
|
|
77
|
+
auth_header = f"Basic {encoded}"
|
|
78
|
+
|
|
79
|
+
# Merge auth header with any user-provided headers
|
|
80
|
+
headers = kwargs.pop("headers", {}) or {}
|
|
81
|
+
headers["Authorization"] = auth_header
|
|
82
|
+
|
|
83
|
+
super().__init__(endpoint=endpoint, headers=headers, **kwargs)
|
|
84
|
+
|
|
85
|
+
self._gateway_host = host
|
|
86
|
+
self._gateway_public_key = public_key
|
|
87
|
+
# Don't store secret key in instance for security
|
|
88
|
+
|
|
89
|
+
logger.debug(
|
|
90
|
+
"GatewayOTLPExporter initialized: endpoint=%s, public_key=%s",
|
|
91
|
+
endpoint,
|
|
92
|
+
public_key[:20] + "..." if len(public_key) > 20 else public_key,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
def export(self, spans):
|
|
96
|
+
count = len(spans) if spans else 0
|
|
97
|
+
t0 = time.monotonic()
|
|
98
|
+
try:
|
|
99
|
+
result = super().export(spans)
|
|
100
|
+
except Exception as exc:
|
|
101
|
+
elapsed_ms = (time.monotonic() - t0) * 1000
|
|
102
|
+
logger.warning("Export: %d span(s) -> FAILED (%s, %.0fms) %s", count, self._gateway_host, elapsed_ms, exc)
|
|
103
|
+
return SpanExportResult.FAILURE
|
|
104
|
+
elapsed_ms = (time.monotonic() - t0) * 1000
|
|
105
|
+
if result == SpanExportResult.SUCCESS:
|
|
106
|
+
logger.info("Export: %d span(s) -> SUCCESS (%s, %.0fms)", count, self._gateway_host, elapsed_ms)
|
|
107
|
+
self._record_exported(count)
|
|
108
|
+
else:
|
|
109
|
+
logger.warning("Export: %d span(s) -> FAILED (%s, %.0fms)", count, self._gateway_host, elapsed_ms)
|
|
110
|
+
return result
|
|
111
|
+
|
|
112
|
+
def _record_exported(self, count: int) -> None:
|
|
113
|
+
"""Notify the init module about successful exports for the shutdown summary."""
|
|
114
|
+
try:
|
|
115
|
+
from gatewaysdk.tracing.init import _record_exported
|
|
116
|
+
|
|
117
|
+
_record_exported(count)
|
|
118
|
+
except ImportError:
|
|
119
|
+
pass
|
|
120
|
+
|
|
121
|
+
def __repr__(self) -> str:
|
|
122
|
+
return (
|
|
123
|
+
f"GatewayOTLPExporter(" f"host={self._gateway_host!r}, " f"public_key={self._gateway_public_key[:10]}...)"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def gateway(
|
|
128
|
+
*,
|
|
129
|
+
host: Optional[str] = None,
|
|
130
|
+
public_key: Optional[str] = None,
|
|
131
|
+
secret_key: Optional[str] = None,
|
|
132
|
+
endpoint: Optional[str] = None,
|
|
133
|
+
**kwargs,
|
|
134
|
+
) -> GatewayOTLPExporter:
|
|
135
|
+
"""Factory function to create an Gateway OTLP exporter.
|
|
136
|
+
|
|
137
|
+
This function supports both explicit configuration and environment variable
|
|
138
|
+
auto-detection. If any required parameter is not provided, it will be read
|
|
139
|
+
from the corresponding environment variable.
|
|
140
|
+
|
|
141
|
+
Environment variables:
|
|
142
|
+
- GATEWAY_HOST: The Gateway server URL
|
|
143
|
+
- GATEWAY_PUBLIC_KEY: The public key for authentication
|
|
144
|
+
- GATEWAY_SECRET_KEY: The secret key for authentication
|
|
145
|
+
- GATEWAY_OTLP_ENDPOINT: Optional override for the OTLP endpoint
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
host: The Gateway server URL. Falls back to GATEWAY_HOST env var.
|
|
149
|
+
public_key: The public key. Falls back to GATEWAY_PUBLIC_KEY env var.
|
|
150
|
+
secret_key: The secret key. Falls back to GATEWAY_SECRET_KEY env var.
|
|
151
|
+
endpoint: Optional full OTLP endpoint URL. Falls back to GATEWAY_OTLP_ENDPOINT.
|
|
152
|
+
**kwargs: Additional arguments passed to GatewayOTLPExporter.
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Configured GatewayOTLPExporter instance.
|
|
156
|
+
|
|
157
|
+
Raises:
|
|
158
|
+
ValueError: If required credentials are not provided and not found in env vars.
|
|
159
|
+
|
|
160
|
+
Example::
|
|
161
|
+
|
|
162
|
+
import gatewaysdk.tracing_claude as tracing
|
|
163
|
+
|
|
164
|
+
# Using environment variables
|
|
165
|
+
tracing.init(exporters=[tracing.gateway_exporter()])
|
|
166
|
+
|
|
167
|
+
# Explicit configuration
|
|
168
|
+
tracing.init(exporters=[
|
|
169
|
+
tracing.gateway_exporter(
|
|
170
|
+
host="https://app.gateway.dev",
|
|
171
|
+
public_key="pk-lf-...",
|
|
172
|
+
secret_key="sk-lf-...",
|
|
173
|
+
)
|
|
174
|
+
])
|
|
175
|
+
"""
|
|
176
|
+
# Read from env vars if not provided
|
|
177
|
+
host = host or os.environ.get(ENV_GATEWAY_HOST)
|
|
178
|
+
public_key = public_key or os.environ.get(ENV_GATEWAY_PUBLIC_KEY)
|
|
179
|
+
secret_key = secret_key or os.environ.get(ENV_GATEWAY_SECRET_KEY)
|
|
180
|
+
endpoint = endpoint or os.environ.get(ENV_GATEWAY_OTLP_ENDPOINT)
|
|
181
|
+
|
|
182
|
+
# Validate required parameters
|
|
183
|
+
missing = []
|
|
184
|
+
if not host:
|
|
185
|
+
missing.append(f"{ENV_GATEWAY_HOST} (or host parameter)")
|
|
186
|
+
if not public_key:
|
|
187
|
+
missing.append(f"{ENV_GATEWAY_PUBLIC_KEY} (or public_key parameter)")
|
|
188
|
+
if not secret_key:
|
|
189
|
+
missing.append(f"{ENV_GATEWAY_SECRET_KEY} (or secret_key parameter)")
|
|
190
|
+
|
|
191
|
+
if missing:
|
|
192
|
+
raise ValueError(
|
|
193
|
+
f"Missing required Gateway configuration: {', '.join(missing)}. "
|
|
194
|
+
"Provide these values via function arguments or environment variables."
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
return GatewayOTLPExporter(
|
|
198
|
+
host=host,
|
|
199
|
+
public_key=public_key,
|
|
200
|
+
secret_key=secret_key,
|
|
201
|
+
endpoint=endpoint,
|
|
202
|
+
**kwargs,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def detect_gateway_config() -> tuple[Optional[str], Optional[str], Optional[str], Optional[str]]:
|
|
207
|
+
"""Detect Gateway configuration from environment variables.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
Tuple of (host, public_key, secret_key, endpoint) where any value may be None
|
|
211
|
+
if the corresponding environment variable is not set.
|
|
212
|
+
"""
|
|
213
|
+
return (
|
|
214
|
+
os.environ.get(ENV_GATEWAY_HOST),
|
|
215
|
+
os.environ.get(ENV_GATEWAY_PUBLIC_KEY),
|
|
216
|
+
os.environ.get(ENV_GATEWAY_SECRET_KEY),
|
|
217
|
+
os.environ.get(ENV_GATEWAY_OTLP_ENDPOINT),
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def is_gateway_configured() -> bool:
|
|
222
|
+
"""Check if Gateway is configured via environment variables.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
True if all required environment variables are set.
|
|
226
|
+
"""
|
|
227
|
+
host, public_key, secret_key, _ = detect_gateway_config()
|
|
228
|
+
return all([host, public_key, secret_key])
|