terradev-cli 5.2.0__tar.gz → 5.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {terradev_cli-5.2.0/terradev_cli.egg-info → terradev_cli-5.2.1}/PKG-INFO +13 -4
- {terradev_cli-5.2.0/terradev_cli → terradev_cli-5.2.1}/README.md +12 -3
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/pyproject.toml +1 -1
- {terradev_cli-5.2.0 → terradev_cli-5.2.1/terradev_cli}/README.md +12 -3
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/__init__.py +4 -0
- terradev_cli-5.2.1/terradev_cli/providers/e2e_networks_provider.py +370 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/provider_factory.py +2 -0
- terradev_cli-5.2.1/terradev_cli/providers/yottalabs_provider.py +378 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1/terradev_cli.egg-info}/PKG-INFO +13 -4
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli.egg-info/SOURCES.txt +2 -20
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_provider_conformance.py +6 -2
- terradev_cli-5.2.0/.ebextensions/python.config +0 -6
- terradev_cli-5.2.0/activations/973dfe463ec85785f5f95af5ba3906eedb2d931c24e69824a89ea65dba4e813b.json +0 -1
- terradev_cli-5.2.0/analysis/api-differences-comparison.tf +0 -311
- terradev_cli-5.2.0/analysis/cost-structure-differences.tf +0 -198
- terradev_cli-5.2.0/analysis/inference-arbitrage-pivot.tf +0 -322
- terradev_cli-5.2.0/scripts/check_logs_fix.py +0 -91
- terradev_cli-5.2.0/scripts/debug_comparison.py +0 -16
- terradev_cli-5.2.0/scripts/debug_mla.py +0 -15
- terradev_cli-5.2.0/scripts/debug_streaming.py +0 -41
- terradev_cli-5.2.0/scripts/deployment/deploy_correct_pricing.py +0 -91
- terradev_cli-5.2.0/scripts/deployment/deploy_enhanced_server.py +0 -660
- terradev_cli-5.2.0/scripts/deployment/deploy_exact_servers.py +0 -70
- terradev_cli-5.2.0/scripts/deployment/deploy_simple_enhanced.py +0 -81
- terradev_cli-5.2.0/scripts/deployment/deploy_telemetry_aws.py +0 -465
- terradev_cli-5.2.0/scripts/deployment/deploy_to_aws.py +0 -239
- terradev_cli-5.2.0/scripts/figure_calculation_breakdown.py +0 -265
- terradev_cli-5.2.0/scripts/fix_server_ports.py +0 -140
- terradev_cli-5.2.0/scripts/server_manager.py +0 -287
- terradev_cli-5.2.0/setup/account-setup-guide.tf +0 -393
- terradev_cli-5.2.0/setup/render.yaml +0 -18
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/.env.example +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/.github/workflows/action.yml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/.github/workflows/ci.yml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/.github/workflows/release.yml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/.github/workflows/static.yml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/Deployment Package/BNF_GRAMMAR.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/Deployment Package/LIFECYCLES.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/Deployment Package/architecture.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/Deployment Package/overview.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/Deployment Package/security.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/Deployment Package/troubleshooting.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/Dockerfile +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/Dockerfile.test +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/LICENSE +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/MANIFEST.in +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/README.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/helm/values-glm5.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/k8s/hpa.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/k8s/namespace.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/k8s/pdb.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/k8s/service.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/k8s/sglang-deployment.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/k8s/vllm-deployment.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/task.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/terraform/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/terraform/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/glm-5/terraform/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/llmd-template/README.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/llmd-template/helm/values-llmd.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/llmd-template/k8s/gateway.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/llmd-template/k8s/leaderworkerset.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/llmd-template/k8s/llminferenceservice.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/llmd-template/task.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/README.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/helm/values-moe.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/k8s/hpa.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/k8s/namespace.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/k8s/pdb.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/k8s/service.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/task.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/terraform/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/terraform/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/moe-template/terraform/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/rag-template/README.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/rag-template/helm/values-rag.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/rag-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/clusters/rag-template/terraform/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/demo/RECORDING_GUIDE.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/demo/generate_gif.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/demo/terradev-demo.gif +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/ADVANCED_FINANCIAL_INNOVATIONS.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/API_DOCUMENTATION.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/BingSiteAuth.xml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/FINOPS_ATTRIBUTION_SYSTEM.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/USER_GUIDE.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/VLLM_AUTO_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/VLLM_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/architecture.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/index.html +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/overview.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/robots.txt +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/sitemap.xml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/docs/test_spot_provision.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/aws_ssm_starter.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/config.example.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/demo_k8s_config.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/direct_aws_starter.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/ec2_user_data_starter.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/example-pipeline.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/kubernetes_training_deployment.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/simple_ssm_starter.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/ssh_server_starter.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/examples/start_aws_servers.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/helm/terradev/Chart.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/helm/terradev/templates/_helpers.tpl +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/helm/terradev/templates/deployment.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/helm/terradev/values.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/infrastructure/bucket-policy.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/infrastructure/grafana_training_dashboard.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/infrastructure/kubernetes/microservices.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/infrastructure/terraform/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/infrastructure/terraform/parallelism.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/integrations/cli-tool.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/integrations/cloud-management-widgets.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/integrations/cloud-provider-apis.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/integrations/critical-widgets.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/integrations/devops-cicd-widgets.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/integrations/devops-essential-tools.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/integrations/docker-integration.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/integrations/kubernetes-operator.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/integrations/mlflow-integration.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/modules/datadog/README.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/modules/datadog/dashboard.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/modules/datadog/monitors.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/modules/datadog/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/modules/datadog/provider.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/modules/datadog/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/modules/datadog/versions.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/modules/prometheus_training_config.yml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/requirements.txt +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/PERFORMANCE_OPTIMIZATIONS.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/README.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-artifact-verification/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-artifact-verification/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-artifact-verification/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-artifact-verification/src/verifier.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-authentication/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-authentication/src/encoding.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-authentication/src/hmac.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-authentication/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-authentication/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cache-eviction/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cache-eviction/src/cache.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cache-eviction/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cache-eviction/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-command-executor/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-command-executor/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-config-validator/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-config-validator/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-config-validator/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-config-validator/src/validator.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-connection-pool/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-connection-pool/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-connection-pool/src/pool.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-connection-pool/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cost-calculator/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cost-calculator/src/calculator.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cost-calculator/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cost-calculator/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cost-scaler/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-cost-scaler/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-credential-vault/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-credential-vault/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-credential-vault/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-credential-vault/src/vault.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-dag-executor/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-dag-executor/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-distributed-lock/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-distributed-lock/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-distributed-lock/src/lock.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-distributed-lock/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-egress-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-egress-optimizer/src/graph.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-egress-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-egress-optimizer/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-event-bus/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-event-bus/src/bus.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-event-bus/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-event-bus/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-governance/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-governance/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-gpu-discovery/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-gpu-discovery/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-gpu-topology/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-gpu-topology/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-gpu-topology/src/topology.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-gpu-topology/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-helm-generator/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-helm-generator/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-mcp-codec/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-mcp-codec/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-mcp-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-mcp-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-price-intelligence/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-price-intelligence/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-quota-manager/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-quota-manager/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-quota-manager/src/manager.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-quota-manager/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-resource-pool/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-resource-pool/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-resource-pool/src/pool.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-resource-pool/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-result-compressor/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-result-compressor/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-semantic-router/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-semantic-router/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-snapshot-manager/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-snapshot-manager/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-snapshot-manager/src/snapshot.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-snapshot-manager/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-state-machine/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-state-machine/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-state-machine/src/state.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-state-machine/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-telemetry/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-telemetry/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-telemetry/src/pipeline.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-telemetry/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-tool-registry/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-tool-registry/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-vram-estimator/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-vram-estimator/src/estimator.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-vram-estimator/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-vram-estimator/src/types.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-warm-pool/Cargo.toml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/rust/terradev-warm-pool/src/lib.rs +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/scripts/action.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/scripts/gpu-check.sh +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/setup/Lambda Cloud API spec 1.8.3.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/setup/docker-compose.yml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/setup/nginx.conf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/setup/setup.sh +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/setup.cfg +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/CHANGELOG.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/COMPLETE_COMMAND_REFERENCE.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/COMPLETE_INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/IMPLEMENTATION_SUMMARY.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/MAKING_SPOT_WORK_FOR_STATEFUL_WORKLOADS.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/SGLANG_COMMAND_GUIDE.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/TERRADEV_STACK_CHART.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/__init__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/__main__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/cli.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/cli_hf_spaces.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/cli_karpenter.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/__init__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/async_config.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/auth.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/auto_lineage.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/cache_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/checkpoint_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/command_executor.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/config.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/config_validator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/cost_scaler.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/cost_tracker.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/credential_vault.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/cuda_graph_integrator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/dag_executor.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/data_governance.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/dataset_stager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/deployment_router.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/distributed_lock.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/drift_detector.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/egress_cost_monitor.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/egress_optimizer.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/evaluation_orchestrator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/event_system.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/gitops_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/gpu_discovery.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/gpu_topology.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/helm_generator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/hf_cli_integration.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/hf_smart_templates.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/hf_spaces.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/inference_router.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/inference_spot_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/job_state_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/kv_cache_checkpoint_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/kv_cache_checkpoint_tests.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/manifest_cache.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/manifest_example.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/mig_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/migration_orchestrator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/mla_vram_estimator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/mla_vram_tests.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/model_orchestrator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/oidc_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/optimization_config.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/parallel_provisioner.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/pipeline_schema.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/preflight_validator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/price_discovery.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/price_intelligence.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/public_ip_billing_tracker.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/quick_start.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/quota_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/rate_limiter.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/rust_telemetry.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_router.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/__init__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/base_signal.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/complexity_signal.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/domain_signal.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/keyword_signal.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/language_signal.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/modality_signal.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/orchestrator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/routing_policy.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/semantic_signals/safety_signal.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/session_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/ssh_key_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/telemetry.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/terradev_engine.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/trace_viewer.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/training_monitor.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/training_orchestrator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/user_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/warm_pool_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/weight_streaming_benchmarks.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/core/weight_streaming_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/cost_optimizer.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/credential_prompt.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/demo.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/entry_point.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/integrations/Terradev LOGO BLACK.png +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/integrations/Terradev LOGO WHITEW.png +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/integrations/__init__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/integrations/databricks_integration.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/integrations/datadog_integration.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/integrations/helicone_integration.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/integrations/prometheus_integration.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/integrations/wandb_integration.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/k8s/terraform_wrapper.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/kubernetes/inferx-cost-optimized.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/kubernetes/inferx-infrastructure.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/kubernetes/inferx-models.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/kubernetes/inferx-platform.yaml +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/kubernetes/inferx_setup.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/mcp/__init__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/mcp/server.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/__init__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/agentic_serving.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/drift_retrain_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/dvc_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/guardrails_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/huggingface_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/kserve_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/kubernetes_enhanced.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/kubernetes_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/langchain_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/langfuse_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/langgraph_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/lmcache_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/mlflow_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/model_router.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/ollama_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/phoenix_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/qdrant_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/ray_enhanced.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/ray_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/sglang_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/vllm_service.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/ml_services/wandb_enhanced.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/optimization/__init__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/optimization/auto_optimizer.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/optimization/cuco_optimizer.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/LATITUDE_PROVIDER.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/alibaba_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/aws_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/azure_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/base_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/baseten_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/coreweave_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/crusoe_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/demo_mode.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/digitalocean_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/fluidstack_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/gcp_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/hetzner_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/huggingface_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/hyperstack_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/inferx_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/lambda_labs_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/latitude_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/oracle_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/ovhcloud_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/real_pricing.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/runpod_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/siliconflow_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/tensordock_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/providers/vastai_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/requirements.txt +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/requirements_minimal.txt +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/__init__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-aws/bootstrap.sh +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-aws/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-aws/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-aws/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-aws/versions.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-hyperstack/bootstrap.sh +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-hyperstack/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-hyperstack/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-hyperstack/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-hyperstack/versions.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-lambda/bootstrap.sh +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-lambda/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-lambda/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-lambda/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-lambda/versions.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-vastai/bootstrap.sh +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-vastai/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-vastai/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-vastai/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/gpu-node-vastai/versions.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/k8s-control-plane/join-script.tpl +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/k8s-control-plane/kubeconfig.tpl +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/k8s-control-plane/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/k8s-control-plane/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/k8s-control-plane/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/k8s-control-plane/versions.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/networking/main.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/networking/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/networking/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/modules/networking/versions.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/outputs.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/price-optimizer/optimal-allocation.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/providers.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/terraform/variables.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/test_summary.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/utils/__init__.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli/utils/formatters.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli.egg-info/dependency_links.txt +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli.egg-info/entry_points.txt +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli.egg-info/requires.txt +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terradev_cli.egg-info/top_level.txt +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform.tfvars.example +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_optimization/backend.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_optimization/error_handling.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_optimization/parallel_provisioning.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_optimization/storage_choice_matrix.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_optimization/test_error_handler.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_optimization/versions.tf +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/audit_demo/trail_3caed73ad5bf.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/audit_trail.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/audit_trails.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/decision_engine.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/decision_logs.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/operations.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/terraform_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/terraform_plans.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/transparency_demo.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/terraform_transparency/transparency_report.json +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/CREDENTIAL_STRATEGY.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/INTEGRATION_STRATEGY.md +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/Makefile +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/ci_pipeline.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/conftest.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/root_tests/test_cli_ux_battle.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/root_tests/test_cli_ux_battle_fixed.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/root_tests/test_cli_ux_final.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/root_tests/test_final_integration.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/root_tests/test_integrated_optimization.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/root_tests/test_p10_production_failover.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/root_tests/test_sso_phase1.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/root_tests/test_vllm_optimization.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/simple_test.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_ai_integrations.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_checkpoint_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_cli_smoke.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_dag_executor.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_flashoptim.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_integration.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_job_state_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_k8s_regression.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_latitude_provider.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_major_providers.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_mcp_handlers.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_new_providers.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_providers.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_semantic_router.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_sglang_optimization.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_ssh_key_manager.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_training_monitor.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_training_orchestrator.py +0 -0
- {terradev_cli-5.2.0 → terradev_cli-5.2.1}/tests/test_vllm_features.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: terradev-cli
|
|
3
|
-
Version: 5.2.
|
|
3
|
+
Version: 5.2.1
|
|
4
4
|
Summary: An imperative command-line-interface for AI workload orchestration.
|
|
5
5
|
Author-email: Terradev Team <team@terradev.com>
|
|
6
6
|
Maintainer-email: Terradev Team <team@terradev.com>
|
|
@@ -93,7 +93,7 @@ Requires-Dist: redis>=5.0.0; extra == "enterprise"
|
|
|
93
93
|
Requires-Dist: PyJWT>=2.8.0; extra == "enterprise"
|
|
94
94
|
Dynamic: license-file
|
|
95
95
|
|
|
96
|
-
# Terradev CLI v5.1
|
|
96
|
+
# Terradev CLI v5.2.1
|
|
97
97
|
|
|
98
98
|
**An imperative command-line-interface for AI workload orchestration.**
|
|
99
99
|
|
|
@@ -105,13 +105,22 @@ pypi.org/project/terradev-cli/
|
|
|
105
105
|
|
|
106
106
|
Terradev is a cross-cloud compute-provisioning CLI that compresses + stages datasets, provisions optimal instances + nodes, and deploys **3-5x faster** than sequential provisioning.
|
|
107
107
|
|
|
108
|
+
**NOTES ON 5.2.1**
|
|
109
|
+
|
|
110
|
+
Added two new BYOAPI providers: **Yotta Labs (Shakti Cloud)** and **E2E Networks** — India's leading GPU clouds. Yotta Labs uses a pod-based compute model (similar to RunPod), and E2E Networks is a traditional VM-style hyperscaler that is NSE-listed and MeitY empanelled. Both are BYOAPI: your key, stored locally, never touches a Terradev server.
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
terradev configure --provider yottalabs
|
|
114
|
+
terradev configure --provider e2enetworks
|
|
115
|
+
```
|
|
116
|
+
|
|
108
117
|
**NOTES ON 5.0.0**
|
|
109
118
|
|
|
110
119
|
We removed the paywall, open-sourced Terradev, and added Rust accelerators for safe and snappy delivery...
|
|
111
120
|
|
|
112
121
|
With the Rust DAG orchestrator, the execution graph enforces correct sequencing and idempotency at the runtime level. You or the agent can issue commands freely... the orchestrator ensures they're safe to execute.
|
|
113
122
|
|
|
114
|
-
218 tools not including subcommand/flags require heavy context. The Rust MCP orchestrator processes tool calls with minimal overhead: deserializing, routing, executing, and responding faster than pure-Python-based MCP servers by an order of magnitude. For an agent running a complex provisioning workflow across
|
|
123
|
+
218 tools not including subcommand/flags require heavy context. The Rust MCP orchestrator processes tool calls with minimal overhead: deserializing, routing, executing, and responding faster than pure-Python-based MCP servers by an order of magnitude. For an agent running a complex provisioning workflow across 23 cloud providers, that compounds across every tool call in the chain.
|
|
115
124
|
|
|
116
125
|
## BYOAPI Configuration
|
|
117
126
|
|
|
@@ -153,7 +162,7 @@ terradev --help
|
|
|
153
162
|
```
|
|
154
163
|
|
|
155
164
|
### Step 2: Configure Your First Cloud Provider
|
|
156
|
-
Terradev supports
|
|
165
|
+
Terradev supports 23 GPU cloud providers. Start with one, RunPod is the fastest to set up:
|
|
157
166
|
|
|
158
167
|
```bash
|
|
159
168
|
terradev setup runpod --quick
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Terradev CLI v5.1
|
|
1
|
+
# Terradev CLI v5.2.1
|
|
2
2
|
|
|
3
3
|
**An imperative command-line-interface for AI workload orchestration.**
|
|
4
4
|
|
|
@@ -10,13 +10,22 @@ pypi.org/project/terradev-cli/
|
|
|
10
10
|
|
|
11
11
|
Terradev is a cross-cloud compute-provisioning CLI that compresses + stages datasets, provisions optimal instances + nodes, and deploys **3-5x faster** than sequential provisioning.
|
|
12
12
|
|
|
13
|
+
**NOTES ON 5.2.1**
|
|
14
|
+
|
|
15
|
+
Added two new BYOAPI providers: **Yotta Labs (Shakti Cloud)** and **E2E Networks** — India's leading GPU clouds. Yotta Labs uses a pod-based compute model (similar to RunPod), and E2E Networks is a traditional VM-style hyperscaler that is NSE-listed and MeitY empanelled. Both are BYOAPI: your key, stored locally, never touches a Terradev server.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
terradev configure --provider yottalabs
|
|
19
|
+
terradev configure --provider e2enetworks
|
|
20
|
+
```
|
|
21
|
+
|
|
13
22
|
**NOTES ON 5.0.0**
|
|
14
23
|
|
|
15
24
|
We removed the paywall, open-sourced Terradev, and added Rust accelerators for safe and snappy delivery...
|
|
16
25
|
|
|
17
26
|
With the Rust DAG orchestrator, the execution graph enforces correct sequencing and idempotency at the runtime level. You or the agent can issue commands freely... the orchestrator ensures they're safe to execute.
|
|
18
27
|
|
|
19
|
-
218 tools not including subcommand/flags require heavy context. The Rust MCP orchestrator processes tool calls with minimal overhead: deserializing, routing, executing, and responding faster than pure-Python-based MCP servers by an order of magnitude. For an agent running a complex provisioning workflow across
|
|
28
|
+
218 tools not including subcommand/flags require heavy context. The Rust MCP orchestrator processes tool calls with minimal overhead: deserializing, routing, executing, and responding faster than pure-Python-based MCP servers by an order of magnitude. For an agent running a complex provisioning workflow across 23 cloud providers, that compounds across every tool call in the chain.
|
|
20
29
|
|
|
21
30
|
## BYOAPI Configuration
|
|
22
31
|
|
|
@@ -58,7 +67,7 @@ terradev --help
|
|
|
58
67
|
```
|
|
59
68
|
|
|
60
69
|
### Step 2: Configure Your First Cloud Provider
|
|
61
|
-
Terradev supports
|
|
70
|
+
Terradev supports 23 GPU cloud providers. Start with one, RunPod is the fastest to set up:
|
|
62
71
|
|
|
63
72
|
```bash
|
|
64
73
|
terradev setup runpod --quick
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Terradev CLI v5.1
|
|
1
|
+
# Terradev CLI v5.2.1
|
|
2
2
|
|
|
3
3
|
**An imperative command-line-interface for AI workload orchestration.**
|
|
4
4
|
|
|
@@ -10,13 +10,22 @@ pypi.org/project/terradev-cli/
|
|
|
10
10
|
|
|
11
11
|
Terradev is a cross-cloud compute-provisioning CLI that compresses + stages datasets, provisions optimal instances + nodes, and deploys **3-5x faster** than sequential provisioning.
|
|
12
12
|
|
|
13
|
+
**NOTES ON 5.2.1**
|
|
14
|
+
|
|
15
|
+
Added two new BYOAPI providers: **Yotta Labs (Shakti Cloud)** and **E2E Networks** — India's leading GPU clouds. Yotta Labs uses a pod-based compute model (similar to RunPod), and E2E Networks is a traditional VM-style hyperscaler that is NSE-listed and MeitY empanelled. Both are BYOAPI: your key, stored locally, never touches a Terradev server.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
terradev configure --provider yottalabs
|
|
19
|
+
terradev configure --provider e2enetworks
|
|
20
|
+
```
|
|
21
|
+
|
|
13
22
|
**NOTES ON 5.0.0**
|
|
14
23
|
|
|
15
24
|
We removed the paywall, open-sourced Terradev, and added Rust accelerators for safe and snappy delivery...
|
|
16
25
|
|
|
17
26
|
With the Rust DAG orchestrator, the execution graph enforces correct sequencing and idempotency at the runtime level. You or the agent can issue commands freely... the orchestrator ensures they're safe to execute.
|
|
18
27
|
|
|
19
|
-
218 tools not including subcommand/flags require heavy context. The Rust MCP orchestrator processes tool calls with minimal overhead: deserializing, routing, executing, and responding faster than pure-Python-based MCP servers by an order of magnitude. For an agent running a complex provisioning workflow across
|
|
28
|
+
218 tools not including subcommand/flags require heavy context. The Rust MCP orchestrator processes tool calls with minimal overhead: deserializing, routing, executing, and responding faster than pure-Python-based MCP servers by an order of magnitude. For an agent running a complex provisioning workflow across 23 cloud providers, that compounds across every tool call in the chain.
|
|
20
29
|
|
|
21
30
|
## BYOAPI Configuration
|
|
22
31
|
|
|
@@ -58,7 +67,7 @@ terradev --help
|
|
|
58
67
|
```
|
|
59
68
|
|
|
60
69
|
### Step 2: Configure Your First Cloud Provider
|
|
61
|
-
Terradev supports
|
|
70
|
+
Terradev supports 23 GPU cloud providers. Start with one, RunPod is the fastest to set up:
|
|
62
71
|
|
|
63
72
|
```bash
|
|
64
73
|
terradev setup runpod --quick
|
|
@@ -21,6 +21,8 @@ from .runpod_provider import RunPodProvider
|
|
|
21
21
|
from .siliconflow_provider import SiliconFlowProvider
|
|
22
22
|
from .tensordock_provider import TensorDockProvider
|
|
23
23
|
from .vastai_provider import VastAIProvider
|
|
24
|
+
from .yottalabs_provider import YottaLabsProvider
|
|
25
|
+
from .e2e_networks_provider import E2ENetworksProvider
|
|
24
26
|
|
|
25
27
|
__all__ = [
|
|
26
28
|
"AlibabaProvider",
|
|
@@ -44,4 +46,6 @@ __all__ = [
|
|
|
44
46
|
"SiliconFlowProvider",
|
|
45
47
|
"TensorDockProvider",
|
|
46
48
|
"VastAIProvider",
|
|
49
|
+
"YottaLabsProvider",
|
|
50
|
+
"E2ENetworksProvider",
|
|
47
51
|
]
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
E2E Networks Provider - E2E Networks GPU cloud integration (India)
|
|
4
|
+
BYOAPI: Uses the end-client's E2E Networks Bearer token
|
|
5
|
+
API: https://api.e2enetworks.com/myaccount/api/v1
|
|
6
|
+
|
|
7
|
+
Auth: Authorization: Bearer {token}
|
|
8
|
+
Compute model: Traditional VM-style GPU nodes
|
|
9
|
+
Strengths: NSE-listed India hyperscaler, H200/H100/A100/B200, MeitY empanelled
|
|
10
|
+
Docs: https://docs.e2enetworks.com/api/myaccount/
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
import os
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from typing import Any, Dict, List, Optional
|
|
17
|
+
|
|
18
|
+
from .base_provider import BaseProvider
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class E2ENetworksProvider(BaseProvider):
|
|
24
|
+
"""E2E Networks provider — VM-based GPU nodes, India-first hyperscaler"""
|
|
25
|
+
|
|
26
|
+
API_BASE = "https://api.e2enetworks.com/myaccount/api/v1"
|
|
27
|
+
|
|
28
|
+
# Map Terradev canonical GPU names → E2E Networks node plan prefixes
|
|
29
|
+
GPU_PLAN_MAP = {
|
|
30
|
+
"B200": "b200",
|
|
31
|
+
"H200": "h200",
|
|
32
|
+
"H100": "h100",
|
|
33
|
+
"H100-SXM": "h100-sxm",
|
|
34
|
+
"A100": "a100-80gb",
|
|
35
|
+
"A100-80GB": "a100-80gb",
|
|
36
|
+
"A100-40GB": "a100-40gb",
|
|
37
|
+
"L40S": "l40s",
|
|
38
|
+
"L4": "l4",
|
|
39
|
+
"T4": "t4",
|
|
40
|
+
"V100": "v100",
|
|
41
|
+
"RTX3090": "rtx3090",
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# Reference pricing (USD/hr per GPU) — live API takes precedence
|
|
45
|
+
# Pricing sourced from e2enetworks.com/pricing (USD region)
|
|
46
|
+
GPU_PRICING = {
|
|
47
|
+
"B200": {"price": 6.50, "mem_gb": 192, "vcpus": 32, "ram_gb": 256, "gpu_count": 1},
|
|
48
|
+
"H200": {"price": 4.50, "mem_gb": 141, "vcpus": 24, "ram_gb": 192, "gpu_count": 1},
|
|
49
|
+
"H100": {"price": 3.20, "mem_gb": 80, "vcpus": 16, "ram_gb": 128, "gpu_count": 1},
|
|
50
|
+
"H100-SXM": {"price": 3.50, "mem_gb": 80, "vcpus": 16, "ram_gb": 128, "gpu_count": 1},
|
|
51
|
+
"A100": {"price": 1.80, "mem_gb": 80, "vcpus": 16, "ram_gb": 128, "gpu_count": 1},
|
|
52
|
+
"A100-80GB": {"price": 1.80, "mem_gb": 80, "vcpus": 16, "ram_gb": 128, "gpu_count": 1},
|
|
53
|
+
"A100-40GB": {"price": 1.20, "mem_gb": 40, "vcpus": 12, "ram_gb": 96, "gpu_count": 1},
|
|
54
|
+
"L40S": {"price": 1.10, "mem_gb": 48, "vcpus": 16, "ram_gb": 128, "gpu_count": 1},
|
|
55
|
+
"L4": {"price": 0.55, "mem_gb": 24, "vcpus": 8, "ram_gb": 64, "gpu_count": 1},
|
|
56
|
+
"T4": {"price": 0.40, "mem_gb": 16, "vcpus": 8, "ram_gb": 32, "gpu_count": 1},
|
|
57
|
+
"V100": {"price": 0.90, "mem_gb": 32, "vcpus": 12, "ram_gb": 96, "gpu_count": 1},
|
|
58
|
+
"RTX3090": {"price": 0.35, "mem_gb": 24, "vcpus": 8, "ram_gb": 32, "gpu_count": 1},
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
def __init__(self, credentials: Dict[str, str]):
|
|
62
|
+
super().__init__(credentials)
|
|
63
|
+
self.name = "e2enetworks"
|
|
64
|
+
self.api_key = credentials.get("api_key", "")
|
|
65
|
+
# E2E Networks may require a project ID for multi-project accounts
|
|
66
|
+
self.project_id = credentials.get("project_id", "")
|
|
67
|
+
|
|
68
|
+
# ── Authentication ────────────────────────────────────────────────
|
|
69
|
+
|
|
70
|
+
def _get_auth_headers(self) -> Dict[str, str]:
|
|
71
|
+
headers: Dict[str, str] = {"Content-Type": "application/json"}
|
|
72
|
+
if self.api_key:
|
|
73
|
+
headers["Authorization"] = f"Bearer {self.api_key}"
|
|
74
|
+
return headers
|
|
75
|
+
|
|
76
|
+
# ── URL helpers ───────────────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
def _nodes_url(self, path: str = "") -> str:
|
|
79
|
+
"""Build a nodes endpoint URL, optionally scoped to project."""
|
|
80
|
+
if self.project_id:
|
|
81
|
+
return f"{self.API_BASE}/projects/{self.project_id}/nodes{path}"
|
|
82
|
+
return f"{self.API_BASE}/nodes{path}"
|
|
83
|
+
|
|
84
|
+
# ── Capacity / Quotes ─────────────────────────────────────────────
|
|
85
|
+
|
|
86
|
+
async def get_instance_quotes(
|
|
87
|
+
self, gpu_type: str, region: Optional[str] = None
|
|
88
|
+
) -> List[Dict[str, Any]]:
|
|
89
|
+
if not self.api_key:
|
|
90
|
+
return []
|
|
91
|
+
|
|
92
|
+
try:
|
|
93
|
+
live = await self._get_live_plans(gpu_type, region)
|
|
94
|
+
if live:
|
|
95
|
+
return live
|
|
96
|
+
except Exception as e:
|
|
97
|
+
logger.debug(f"E2E Networks API error: {e}")
|
|
98
|
+
|
|
99
|
+
# Static fallback
|
|
100
|
+
info = self.GPU_PRICING.get(gpu_type)
|
|
101
|
+
if not info:
|
|
102
|
+
# Try case-insensitive partial match
|
|
103
|
+
upper = gpu_type.upper()
|
|
104
|
+
for key, val in self.GPU_PRICING.items():
|
|
105
|
+
if upper in key.upper() or key.upper() in upper:
|
|
106
|
+
info = val
|
|
107
|
+
break
|
|
108
|
+
if not info:
|
|
109
|
+
return []
|
|
110
|
+
|
|
111
|
+
return [
|
|
112
|
+
{
|
|
113
|
+
"instance_type": self.GPU_PLAN_MAP.get(gpu_type, gpu_type.lower()),
|
|
114
|
+
"gpu_type": gpu_type,
|
|
115
|
+
"price_per_hour": info["price"],
|
|
116
|
+
"region": region or "in-delhi-1",
|
|
117
|
+
"available": True,
|
|
118
|
+
"provider": "e2enetworks",
|
|
119
|
+
"vcpus": info["vcpus"],
|
|
120
|
+
"memory_gb": info["ram_gb"],
|
|
121
|
+
"gpu_memory_gb": info["mem_gb"],
|
|
122
|
+
"gpu_count": info["gpu_count"],
|
|
123
|
+
"spot": False,
|
|
124
|
+
"india_based": True,
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
async def _get_live_plans(
|
|
129
|
+
self, gpu_type: str, region: Optional[str]
|
|
130
|
+
) -> List[Dict[str, Any]]:
|
|
131
|
+
"""Query node plans/types from the API."""
|
|
132
|
+
try:
|
|
133
|
+
data = await self._make_request("GET", f"{self.API_BASE}/plans/")
|
|
134
|
+
except Exception:
|
|
135
|
+
# Fall back to node-types endpoint
|
|
136
|
+
data = await self._make_request("GET", f"{self.API_BASE}/node-types/")
|
|
137
|
+
|
|
138
|
+
plans = data if isinstance(data, list) else data.get("data", data.get("results", []))
|
|
139
|
+
gpu_upper = gpu_type.upper()
|
|
140
|
+
quotes = []
|
|
141
|
+
|
|
142
|
+
for plan in plans:
|
|
143
|
+
plan_name = plan.get("name", plan.get("plan_name", "")).upper()
|
|
144
|
+
plan_gpu = plan.get("gpu_type", plan.get("gpu", "")).upper()
|
|
145
|
+
|
|
146
|
+
if (
|
|
147
|
+
gpu_upper not in plan_name
|
|
148
|
+
and gpu_upper not in plan_gpu
|
|
149
|
+
and not any(part in plan_name for part in gpu_upper.split("-") if len(part) > 2)
|
|
150
|
+
):
|
|
151
|
+
continue
|
|
152
|
+
|
|
153
|
+
price_inr = float(plan.get("price_per_hour", plan.get("price", 0)) or 0)
|
|
154
|
+
# Convert INR to USD if price looks like INR (>10 per hour for GPU)
|
|
155
|
+
price_usd = price_inr / 83.5 if price_inr > 10 else price_inr
|
|
156
|
+
|
|
157
|
+
plan_region = plan.get("region", region or "in-delhi-1")
|
|
158
|
+
if region and plan_region != region:
|
|
159
|
+
continue
|
|
160
|
+
|
|
161
|
+
quotes.append(
|
|
162
|
+
{
|
|
163
|
+
"instance_type": plan.get("name", plan.get("plan_name", gpu_type)),
|
|
164
|
+
"gpu_type": gpu_type,
|
|
165
|
+
"price_per_hour": round(price_usd, 4),
|
|
166
|
+
"price_inr_per_hour": price_inr,
|
|
167
|
+
"region": plan_region,
|
|
168
|
+
"available": plan.get("available", True),
|
|
169
|
+
"provider": "e2enetworks",
|
|
170
|
+
"vcpus": plan.get("vcpus", plan.get("cpu", 16)),
|
|
171
|
+
"memory_gb": plan.get("ram_gb", plan.get("ram", 128)),
|
|
172
|
+
"gpu_memory_gb": plan.get("gpu_memory_gb", 0),
|
|
173
|
+
"gpu_count": plan.get("gpu_count", plan.get("gpu_num", 1)),
|
|
174
|
+
"spot": False,
|
|
175
|
+
"india_based": True,
|
|
176
|
+
}
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
return sorted(quotes, key=lambda q: q["price_per_hour"])
|
|
180
|
+
|
|
181
|
+
# ── Provisioning ──────────────────────────────────────────────────
|
|
182
|
+
|
|
183
|
+
async def provision_instance(
|
|
184
|
+
self, instance_type: str, region: str, gpu_type: str
|
|
185
|
+
) -> Dict[str, Any]:
|
|
186
|
+
if not self.api_key:
|
|
187
|
+
raise Exception("E2E Networks API key not configured")
|
|
188
|
+
|
|
189
|
+
ssh_key = self.credentials.get("ssh_key_name", "")
|
|
190
|
+
image = self.credentials.get("image", "ubuntu-22.04-x64")
|
|
191
|
+
gpu_count = int(self.credentials.get("gpu_count", 1))
|
|
192
|
+
|
|
193
|
+
body: Dict[str, Any] = {
|
|
194
|
+
"name": f"terradev-{gpu_type.lower().replace('_', '-')}-{datetime.now().strftime('%H%M%S')}",
|
|
195
|
+
"plan": instance_type,
|
|
196
|
+
"location": region or "in-delhi-1",
|
|
197
|
+
"image": image,
|
|
198
|
+
"gpu_count": gpu_count,
|
|
199
|
+
}
|
|
200
|
+
if ssh_key:
|
|
201
|
+
body["ssh_keys"] = [ssh_key]
|
|
202
|
+
|
|
203
|
+
data = await self._make_request("POST", self._nodes_url("/"), json=body)
|
|
204
|
+
node = data if isinstance(data, dict) else data.get("data", {})
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
"instance_id": str(node.get("id", f"e2e-{datetime.now().strftime('%Y%m%d%H%M%S')}")),
|
|
208
|
+
"instance_type": instance_type,
|
|
209
|
+
"region": region or "in-delhi-1",
|
|
210
|
+
"gpu_type": gpu_type,
|
|
211
|
+
"status": node.get("status", "provisioning"),
|
|
212
|
+
"provider": "e2enetworks",
|
|
213
|
+
"metadata": {
|
|
214
|
+
"name": node.get("name", body["name"]),
|
|
215
|
+
"image": image,
|
|
216
|
+
"gpu_count": gpu_count,
|
|
217
|
+
"ssh_key": ssh_key,
|
|
218
|
+
"india_based": True,
|
|
219
|
+
},
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
# ── Instance management ───────────────────────────────────────────
|
|
223
|
+
|
|
224
|
+
async def get_instance_status(self, instance_id: str) -> Dict[str, Any]:
|
|
225
|
+
if not self.api_key:
|
|
226
|
+
raise Exception("E2E Networks API key not configured")
|
|
227
|
+
|
|
228
|
+
data = await self._make_request("GET", self._nodes_url(f"/{instance_id}/"))
|
|
229
|
+
node = data if isinstance(data, dict) else data.get("data", {})
|
|
230
|
+
|
|
231
|
+
return {
|
|
232
|
+
"instance_id": instance_id,
|
|
233
|
+
"status": node.get("status", "unknown"),
|
|
234
|
+
"instance_type": node.get("plan", node.get("node_type", "unknown")),
|
|
235
|
+
"region": node.get("location", node.get("region", "unknown")),
|
|
236
|
+
"provider": "e2enetworks",
|
|
237
|
+
"public_ip": node.get("ip", node.get("public_ip")),
|
|
238
|
+
"private_ip": node.get("private_ip"),
|
|
239
|
+
"gpu_count": node.get("gpu_count", 1),
|
|
240
|
+
"india_based": True,
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async def _node_action(self, instance_id: str, action: str) -> Dict[str, Any]:
|
|
244
|
+
"""Send a lifecycle action to a node (start/stop/reboot)."""
|
|
245
|
+
body = {"action": action}
|
|
246
|
+
data = await self._make_request(
|
|
247
|
+
"POST", self._nodes_url(f"/{instance_id}/action/"), json=body
|
|
248
|
+
)
|
|
249
|
+
return data if isinstance(data, dict) else {}
|
|
250
|
+
|
|
251
|
+
async def stop_instance(self, instance_id: str) -> Dict[str, Any]:
|
|
252
|
+
if not self.api_key:
|
|
253
|
+
raise Exception("E2E Networks API key not configured")
|
|
254
|
+
await self._node_action(instance_id, "stop")
|
|
255
|
+
return {"instance_id": instance_id, "action": "stop", "status": "stopping"}
|
|
256
|
+
|
|
257
|
+
async def start_instance(self, instance_id: str) -> Dict[str, Any]:
|
|
258
|
+
if not self.api_key:
|
|
259
|
+
raise Exception("E2E Networks API key not configured")
|
|
260
|
+
await self._node_action(instance_id, "start")
|
|
261
|
+
return {"instance_id": instance_id, "action": "start", "status": "starting"}
|
|
262
|
+
|
|
263
|
+
async def terminate_instance(self, instance_id: str) -> Dict[str, Any]:
|
|
264
|
+
if not self.api_key:
|
|
265
|
+
raise Exception("E2E Networks API key not configured")
|
|
266
|
+
await self._make_request("DELETE", self._nodes_url(f"/{instance_id}/"))
|
|
267
|
+
return {"instance_id": instance_id, "action": "terminate", "status": "terminating"}
|
|
268
|
+
|
|
269
|
+
async def list_instances(self) -> List[Dict[str, Any]]:
|
|
270
|
+
if not self.api_key:
|
|
271
|
+
return []
|
|
272
|
+
try:
|
|
273
|
+
data = await self._make_request("GET", self._nodes_url("/"))
|
|
274
|
+
nodes = data if isinstance(data, list) else data.get("data", data.get("results", []))
|
|
275
|
+
return [
|
|
276
|
+
{
|
|
277
|
+
"instance_id": str(node.get("id", "unknown")),
|
|
278
|
+
"status": node.get("status", "unknown"),
|
|
279
|
+
"instance_type": node.get("plan", node.get("node_type", "unknown")),
|
|
280
|
+
"region": node.get("location", node.get("region", "unknown")),
|
|
281
|
+
"provider": "e2enetworks",
|
|
282
|
+
"public_ip": node.get("ip", node.get("public_ip")),
|
|
283
|
+
"gpu_count": node.get("gpu_count", 1),
|
|
284
|
+
"india_based": True,
|
|
285
|
+
}
|
|
286
|
+
for node in (nodes if isinstance(nodes, list) else [])
|
|
287
|
+
]
|
|
288
|
+
except Exception:
|
|
289
|
+
return []
|
|
290
|
+
|
|
291
|
+
async def execute_command(
|
|
292
|
+
self, instance_id: str, command: str, async_exec: bool
|
|
293
|
+
) -> Dict[str, Any]:
|
|
294
|
+
"""Execute command via SSH on the node's public IP."""
|
|
295
|
+
if not self.api_key:
|
|
296
|
+
raise Exception("E2E Networks API key not configured")
|
|
297
|
+
|
|
298
|
+
try:
|
|
299
|
+
status = await self.get_instance_status(instance_id)
|
|
300
|
+
public_ip = status.get("public_ip")
|
|
301
|
+
if not public_ip:
|
|
302
|
+
return {
|
|
303
|
+
"instance_id": instance_id,
|
|
304
|
+
"command": command,
|
|
305
|
+
"exit_code": 1,
|
|
306
|
+
"output": "No public IP — node may still be provisioning",
|
|
307
|
+
"async": async_exec,
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
import subprocess
|
|
311
|
+
|
|
312
|
+
ssh_cmd = [
|
|
313
|
+
"ssh",
|
|
314
|
+
"-o", "StrictHostKeyChecking=accept-new",
|
|
315
|
+
"-o", f"UserKnownHostsFile={os.path.expanduser('~/.terradev/known_hosts')}",
|
|
316
|
+
"-o", "ConnectTimeout=10",
|
|
317
|
+
f"root@{public_ip}",
|
|
318
|
+
command,
|
|
319
|
+
]
|
|
320
|
+
|
|
321
|
+
if async_exec:
|
|
322
|
+
proc = subprocess.Popen(ssh_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
323
|
+
return {
|
|
324
|
+
"instance_id": instance_id,
|
|
325
|
+
"command": command,
|
|
326
|
+
"exit_code": 0,
|
|
327
|
+
"job_id": str(proc.pid),
|
|
328
|
+
"output": f"Async SSH started (PID: {proc.pid})",
|
|
329
|
+
"async": True,
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
result = subprocess.run(ssh_cmd, capture_output=True, text=True, timeout=300)
|
|
333
|
+
return {
|
|
334
|
+
"instance_id": instance_id,
|
|
335
|
+
"command": command,
|
|
336
|
+
"exit_code": result.returncode,
|
|
337
|
+
"stdout": result.stdout,
|
|
338
|
+
"stderr": result.stderr,
|
|
339
|
+
"async": False,
|
|
340
|
+
}
|
|
341
|
+
except Exception as e:
|
|
342
|
+
return {
|
|
343
|
+
"instance_id": instance_id,
|
|
344
|
+
"command": command,
|
|
345
|
+
"exit_code": 1,
|
|
346
|
+
"output": f"E2E Networks exec error: {e}",
|
|
347
|
+
"async": async_exec,
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
# ── E2E Networks-specific helpers ─────────────────────────────────
|
|
351
|
+
|
|
352
|
+
async def get_plans(self) -> List[Dict[str, Any]]:
|
|
353
|
+
"""List all available node plans/configurations."""
|
|
354
|
+
try:
|
|
355
|
+
data = await self._make_request("GET", f"{self.API_BASE}/plans/")
|
|
356
|
+
except Exception:
|
|
357
|
+
data = await self._make_request("GET", f"{self.API_BASE}/node-types/")
|
|
358
|
+
return data if isinstance(data, list) else data.get("data", data.get("results", []))
|
|
359
|
+
|
|
360
|
+
async def get_images(self) -> List[Dict[str, Any]]:
|
|
361
|
+
"""List available OS images for node provisioning."""
|
|
362
|
+
data = await self._make_request("GET", f"{self.API_BASE}/images/")
|
|
363
|
+
return data if isinstance(data, list) else data.get("data", data.get("results", []))
|
|
364
|
+
|
|
365
|
+
async def reboot_instance(self, instance_id: str) -> Dict[str, Any]:
|
|
366
|
+
"""Reboot a running node."""
|
|
367
|
+
if not self.api_key:
|
|
368
|
+
raise Exception("E2E Networks API key not configured")
|
|
369
|
+
await self._node_action(instance_id, "reboot")
|
|
370
|
+
return {"instance_id": instance_id, "action": "reboot", "status": "rebooting"}
|
|
@@ -52,6 +52,8 @@ _PROVIDER_LOADERS = {
|
|
|
52
52
|
"inferx": _lazy_import(".inferx_provider.InferXProvider"),
|
|
53
53
|
"latitude": _lazy_import(".latitude_provider.LatitudeProvider"),
|
|
54
54
|
"demo": _lazy_import(".demo_mode.DemoModeProvider"),
|
|
55
|
+
"yottalabs": _lazy_import(".yottalabs_provider.YottaLabsProvider"),
|
|
56
|
+
"e2enetworks": _lazy_import(".e2e_networks_provider.E2ENetworksProvider"),
|
|
55
57
|
}
|
|
56
58
|
|
|
57
59
|
|