terradev-cli 5.3.1__tar.gz → 5.3.2__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.3.1 → terradev_cli-5.3.2}/PKG-INFO +2 -2
- {terradev_cli-5.3.1/terradev_cli → terradev_cli-5.3.2}/README.md +1 -1
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/pyproject.toml +1 -1
- {terradev_cli-5.3.1 → terradev_cli-5.3.2/terradev_cli}/README.md +1 -1
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/__init__.py +1 -1
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/inference_router.py +3 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/ollama_service.py +16 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/sglang_service.py +7 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/vllm_service.py +7 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/crusoe_provider.py +70 -15
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/e2e_networks_provider.py +19 -9
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/lambda_labs_provider.py +7 -1
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/oracle_provider.py +7 -5
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/yottalabs_provider.py +35 -17
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli.egg-info/PKG-INFO +2 -2
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/.env.example +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/.github/workflows/action.yml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/.github/workflows/ci.yml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/.github/workflows/release.yml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/.github/workflows/static.yml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/Deployment Package/BNF_GRAMMAR.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/Deployment Package/LIFECYCLES.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/Deployment Package/architecture.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/Deployment Package/overview.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/Deployment Package/security.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/Deployment Package/troubleshooting.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/Dockerfile +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/Dockerfile.test +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/LICENSE +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/MANIFEST.in +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/agentic-template/helm/values-agentic.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/agentic-template/k8s/fleet-manifests.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/README.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/helm/values-glm5.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/k8s/hpa.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/k8s/namespace.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/k8s/pdb.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/k8s/service.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/k8s/sglang-deployment.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/k8s/vllm-deployment.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/task.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/terraform/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/terraform/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/glm-5/terraform/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/llmd-template/README.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/llmd-template/helm/values-llmd.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/gateway.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/leaderworkerset.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/llminferenceservice.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/llmd-template/task.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/README.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/helm/values-moe.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/k8s/hpa.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/k8s/namespace.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/k8s/pdb.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/k8s/service.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/task.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/terraform/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/terraform/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/moe-template/terraform/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/rag-template/README.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/rag-template/helm/values-rag.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/rag-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/rag-template/terraform/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/demo/RECORDING_GUIDE.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/demo/generate_gif.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/demo/terradev-demo.gif +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/ADVANCED_FINANCIAL_INNOVATIONS.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/API_DOCUMENTATION.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/BingSiteAuth.xml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/FINOPS_ATTRIBUTION_SYSTEM.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/USER_GUIDE.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/VLLM_AUTO_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/VLLM_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/architecture.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/index.html +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/overview.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/robots.txt +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/sitemap.xml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/docs/test_spot_provision.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/aws_ssm_starter.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/config.example.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/demo_k8s_config.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/direct_aws_starter.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/ec2_user_data_starter.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/example-pipeline.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/kubernetes_training_deployment.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/simple_ssm_starter.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/ssh_server_starter.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/examples/start_aws_servers.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/helm/terradev/Chart.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/helm/terradev/templates/_helpers.tpl +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/helm/terradev/templates/deployment.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/helm/terradev/values.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/infrastructure/bucket-policy.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/infrastructure/grafana_training_dashboard.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/infrastructure/kubernetes/microservices.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/infrastructure/terraform/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/infrastructure/terraform/parallelism.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/integrations/cli-tool.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/integrations/cloud-management-widgets.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/integrations/cloud-provider-apis.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/integrations/critical-widgets.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/integrations/devops-cicd-widgets.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/integrations/devops-essential-tools.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/integrations/docker-integration.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/integrations/kubernetes-operator.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/integrations/mlflow-integration.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/modules/datadog/README.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/modules/datadog/dashboard.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/modules/datadog/monitors.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/modules/datadog/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/modules/datadog/provider.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/modules/datadog/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/modules/datadog/versions.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/modules/prometheus_training_config.yml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/requirements.txt +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/PERFORMANCE_OPTIMIZATIONS.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/README.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/src/verifier.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-authentication/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-authentication/src/encoding.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-authentication/src/hmac.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-authentication/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-authentication/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/src/cache.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-command-executor/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-command-executor/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-config-validator/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-config-validator/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-config-validator/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-config-validator/src/validator.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-connection-pool/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-connection-pool/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-connection-pool/src/pool.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-connection-pool/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/src/calculator.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cost-scaler/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-cost-scaler/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-credential-vault/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-credential-vault/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-credential-vault/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-credential-vault/src/vault.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-dag-executor/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-dag-executor/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/src/lock.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/src/graph.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-event-bus/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-event-bus/src/bus.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-event-bus/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-event-bus/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-governance/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-governance/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-gpu-discovery/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-gpu-discovery/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/src/topology.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-helm-generator/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-helm-generator/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-mcp-codec/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-mcp-codec/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-mcp-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-mcp-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-price-intelligence/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-price-intelligence/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-quota-manager/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-quota-manager/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-quota-manager/src/manager.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-quota-manager/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-resource-pool/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-resource-pool/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-resource-pool/src/pool.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-resource-pool/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-result-compressor/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-result-compressor/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-semantic-router/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-semantic-router/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/src/snapshot.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-state-machine/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-state-machine/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-state-machine/src/state.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-state-machine/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-telemetry/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-telemetry/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-telemetry/src/pipeline.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-telemetry/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-tool-registry/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-tool-registry/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/src/estimator.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/src/types.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-warm-pool/Cargo.toml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/rust/terradev-warm-pool/src/lib.rs +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/scripts/action.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/scripts/gpu-check.sh +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/setup/Lambda Cloud API spec 1.8.3.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/setup/docker-compose.yml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/setup/nginx.conf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/setup/setup.sh +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/setup.cfg +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/CHANGELOG.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/COMPLETE_COMMAND_REFERENCE.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/COMPLETE_INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/IMPLEMENTATION_SUMMARY.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/MAKING_SPOT_WORK_FOR_STATEFUL_WORKLOADS.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/SGLANG_COMMAND_GUIDE.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/TERRADEV_STACK_CHART.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/__main__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/cli.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/cli_hf_spaces.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/cli_karpenter.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/__init__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/agentic_provisioner.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/agentic_topology.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/async_config.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/auth.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/auto_lineage.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/cache_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/checkpoint_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/command_executor.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/config.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/config_validator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/cost_scaler.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/cost_tracker.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/credential_vault.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/cuda_graph_integrator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/dag_executor.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/data_governance.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/dataset_stager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/deployment_router.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/distributed_lock.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/drift_detector.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/egress_cost_monitor.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/egress_optimizer.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/evaluation_orchestrator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/event_system.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/gitops_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/gpu_discovery.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/gpu_topology.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/helm_generator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/hf_cli_integration.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/hf_smart_templates.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/hf_spaces.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/inference_spot_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/job_state_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/kv_cache_checkpoint_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/kv_cache_checkpoint_tests.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/kv_sharing.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/manifest_cache.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/manifest_example.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/mig_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/migration_orchestrator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/mla_vram_estimator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/mla_vram_tests.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/model_orchestrator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/oidc_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/optimization_config.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/parallel_provisioner.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/pd_transport.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/pipeline_schema.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/preflight_validator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/price_discovery.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/price_intelligence.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/public_ip_billing_tracker.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/quick_start.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/quota_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/rate_limiter.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/rust_telemetry.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_router.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/__init__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/base_signal.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/complexity_signal.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/domain_signal.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/keyword_signal.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/language_signal.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/modality_signal.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/orchestrator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/routing_policy.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/safety_signal.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/session_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/ssh_key_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/telemetry.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/terradev_engine.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/trace_viewer.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/training_monitor.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/training_orchestrator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/user_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/warm_pool_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/weight_streaming_benchmarks.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/core/weight_streaming_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/cost_optimizer.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/credential_prompt.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/demo.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/entry_point.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/integrations/Terradev LOGO BLACK.png +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/integrations/Terradev LOGO WHITEW.png +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/integrations/__init__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/integrations/databricks_integration.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/integrations/datadog_integration.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/integrations/helicone_integration.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/integrations/prometheus_integration.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/integrations/wandb_integration.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/k8s/terraform_wrapper.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-cost-optimized.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-infrastructure.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-models.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-platform.yaml +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx_setup.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/mcp/__init__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/mcp/server.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/__init__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/agentic_serving.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/drift_retrain_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/dvc_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/guardrails_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/huggingface_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/kserve_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/kubernetes_enhanced.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/kubernetes_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/langchain_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/langfuse_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/langgraph_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/lmcache_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/mlflow_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/model_router.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/phoenix_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/qdrant_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/ray_enhanced.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/ray_service.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/ml_services/wandb_enhanced.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/optimization/__init__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/optimization/auto_optimizer.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/optimization/cuco_optimizer.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/LATITUDE_PROVIDER.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/__init__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/alibaba_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/aws_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/azure_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/base_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/baseten_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/coreweave_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/demo_mode.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/digitalocean_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/fluidstack_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/gcp_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/hetzner_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/huggingface_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/hyperstack_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/inferx_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/latitude_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/ovhcloud_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/provider_factory.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/real_pricing.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/runpod_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/siliconflow_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/tensordock_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/providers/vastai_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/requirements.txt +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/requirements_minimal.txt +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/__init__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/bootstrap.sh +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/versions.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/bootstrap.sh +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/versions.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/bootstrap.sh +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/versions.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/bootstrap.sh +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/versions.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/join-script.tpl +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/kubeconfig.tpl +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/versions.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/main.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/versions.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/outputs.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/price-optimizer/optimal-allocation.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/providers.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/terraform/variables.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/test_summary.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/utils/__init__.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli/utils/formatters.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli.egg-info/SOURCES.txt +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli.egg-info/dependency_links.txt +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli.egg-info/entry_points.txt +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli.egg-info/requires.txt +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terradev_cli.egg-info/top_level.txt +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform.tfvars.example +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_optimization/backend.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_optimization/error_handling.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_optimization/parallel_provisioning.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_optimization/storage_choice_matrix.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_optimization/test_error_handler.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_optimization/versions.tf +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/audit_demo/trail_3caed73ad5bf.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/audit_trail.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/audit_trails.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/decision_engine.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/decision_logs.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/operations.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/terraform_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/terraform_plans.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/transparency_demo.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/terraform_transparency/transparency_report.json +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/CREDENTIAL_STRATEGY.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/INTEGRATION_STRATEGY.md +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/Makefile +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/ci_pipeline.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/conftest.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/root_tests/test_cli_ux_battle.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/root_tests/test_cli_ux_battle_fixed.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/root_tests/test_cli_ux_final.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/root_tests/test_final_integration.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/root_tests/test_integrated_optimization.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/root_tests/test_p10_production_failover.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/root_tests/test_sso_phase1.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/root_tests/test_vllm_optimization.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/simple_test.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_ai_integrations.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_checkpoint_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_cli_smoke.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_dag_executor.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_flashoptim.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_integration.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_job_state_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_k8s_regression.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_latitude_provider.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_major_providers.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_mcp_handlers.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_new_providers.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_provider_conformance.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_providers.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_semantic_router.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_sglang_optimization.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_ssh_key_manager.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_training_monitor.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/tests/test_training_orchestrator.py +0 -0
- {terradev_cli-5.3.1 → terradev_cli-5.3.2}/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.3.
|
|
3
|
+
Version: 5.3.2
|
|
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.3.
|
|
96
|
+
# Terradev CLI v5.3.2
|
|
97
97
|
|
|
98
98
|
**An imperative command-line-interface for AI workload orchestration.**
|
|
99
99
|
|
|
@@ -3,6 +3,6 @@ Terradev CLI - Cross-Cloud Compute Optimization Platform
|
|
|
3
3
|
Parallel provisioning and orchestration for optimized compute costs
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
__version__ = "5.
|
|
6
|
+
__version__ = "5.3.2"
|
|
7
7
|
__author__ = "Terradev Team"
|
|
8
8
|
__description__ = "Open Source BYOAPI Multi-Cloud GPU Infrastructure Platform"
|
|
@@ -813,6 +813,9 @@ class InferenceRouter:
|
|
|
813
813
|
) -> Optional[float]:
|
|
814
814
|
"""Measure latency to a target via async ping (ms)"""
|
|
815
815
|
try:
|
|
816
|
+
# R3-B: Defense-in-depth — refuse targets that look like flags.
|
|
817
|
+
if not target or target.startswith("-"):
|
|
818
|
+
return None
|
|
816
819
|
proc = await asyncio.create_subprocess_exec(
|
|
817
820
|
"ping",
|
|
818
821
|
"-c",
|
|
@@ -5,11 +5,24 @@ Local LLM deployment and management
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import json
|
|
8
|
+
import re
|
|
8
9
|
import aiohttp
|
|
9
10
|
import subprocess
|
|
10
11
|
from typing import Dict, List, Any, Optional
|
|
11
12
|
from dataclasses import dataclass
|
|
12
13
|
|
|
14
|
+
# R3-A: Allowlist for model names that get interpolated into shell scripts.
|
|
15
|
+
# Matches HuggingFace IDs ("org/model-name"), Ollama tags ("llama3.2:13b"),
|
|
16
|
+
# and version suffixes. Rejects shell metacharacters and newlines.
|
|
17
|
+
_MODEL_NAME_RE = re.compile(r'^[A-Za-z0-9_.:/\-]{1,256}$')
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _validate_model_name(name: str) -> None:
|
|
21
|
+
if not isinstance(name, str) or not _MODEL_NAME_RE.match(name):
|
|
22
|
+
raise ValueError(
|
|
23
|
+
f"Unsafe model name {name!r}: only [A-Za-z0-9_.:/-] (max 256) allowed."
|
|
24
|
+
)
|
|
25
|
+
|
|
13
26
|
|
|
14
27
|
@dataclass
|
|
15
28
|
class OllamaConfig:
|
|
@@ -130,6 +143,7 @@ ollama --version
|
|
|
130
143
|
) -> Dict[str, Any]:
|
|
131
144
|
"""Pull a model on remote instance"""
|
|
132
145
|
try:
|
|
146
|
+
_validate_model_name(model_name)
|
|
133
147
|
pull_script = f"""
|
|
134
148
|
#!/bin/bash
|
|
135
149
|
# Pull model: {model_name}
|
|
@@ -360,6 +374,7 @@ ollama list | grep {model_name}
|
|
|
360
374
|
) -> Dict[str, Any]:
|
|
361
375
|
"""Delete a model on remote instance"""
|
|
362
376
|
try:
|
|
377
|
+
_validate_model_name(model)
|
|
363
378
|
delete_script = f"""
|
|
364
379
|
#!/bin/bash
|
|
365
380
|
# Delete model: {model}
|
|
@@ -443,6 +458,7 @@ ollama list
|
|
|
443
458
|
ssh_key: Optional[str] = None,
|
|
444
459
|
) -> str:
|
|
445
460
|
"""Generate deployment script for Ollama"""
|
|
461
|
+
_validate_model_name(model)
|
|
446
462
|
script = f"""
|
|
447
463
|
#!/bin/bash
|
|
448
464
|
# Ollama Deployment Script for Terradev
|
|
@@ -988,6 +988,13 @@ python3 -c "import sglang; print('SGLang', sglang.__version__, 'installed')"
|
|
|
988
988
|
) -> Dict[str, Any]:
|
|
989
989
|
"""Start SGLang server on a remote instance via systemd"""
|
|
990
990
|
try:
|
|
991
|
+
# R3-A: Reject model names that could escape the heredoc / inject shell.
|
|
992
|
+
import re as _re
|
|
993
|
+
if not _re.match(r'^[A-Za-z0-9_.:/\-]{1,256}$', self.config.model_name or ""):
|
|
994
|
+
return {
|
|
995
|
+
"status": "failed",
|
|
996
|
+
"error": f"Unsafe model_name {self.config.model_name!r}: only [A-Za-z0-9_.:/-] allowed.",
|
|
997
|
+
}
|
|
991
998
|
server_cmd = [
|
|
992
999
|
"python3",
|
|
993
1000
|
"-m",
|
|
@@ -500,6 +500,13 @@ python3 -c "import vllm; print('vLLM installed successfully')"
|
|
|
500
500
|
) -> Dict[str, Any]:
|
|
501
501
|
"""Start vLLM server on remote instance"""
|
|
502
502
|
try:
|
|
503
|
+
# R3-A: Reject model names that could escape the heredoc / inject shell.
|
|
504
|
+
import re as _re
|
|
505
|
+
if not _re.match(r'^[A-Za-z0-9_.:/\-]{1,256}$', self.config.model_name or ""):
|
|
506
|
+
return {
|
|
507
|
+
"status": "failed",
|
|
508
|
+
"error": f"Unsafe model_name {self.config.model_name!r}: only [A-Za-z0-9_.:/-] allowed.",
|
|
509
|
+
}
|
|
503
510
|
# Build vLLM server command
|
|
504
511
|
server_cmd = [
|
|
505
512
|
"vllm",
|
|
@@ -5,9 +5,15 @@ BYOAPI: Uses the end-client's Crusoe API access key + secret key
|
|
|
5
5
|
API: https://api.crusoecloud.com/v1alpha5
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
import base64
|
|
9
|
+
import hashlib
|
|
10
|
+
import hmac
|
|
8
11
|
import os
|
|
12
|
+
from datetime import datetime, timezone
|
|
9
13
|
from typing import Dict, List, Any, Optional
|
|
10
|
-
from
|
|
14
|
+
from urllib.parse import urlparse
|
|
15
|
+
|
|
16
|
+
import aiohttp
|
|
11
17
|
|
|
12
18
|
from .base_provider import BaseProvider
|
|
13
19
|
|
|
@@ -76,24 +82,73 @@ class CrusoeProvider(BaseProvider):
|
|
|
76
82
|
# ── Authentication ────────────────────────────────────────────────
|
|
77
83
|
|
|
78
84
|
async def _ensure_auth(self):
|
|
79
|
-
"""
|
|
80
|
-
|
|
81
|
-
Crusoe authenticates via an Authorization header built from the
|
|
82
|
-
access key and secret key. The simplest approach is HTTP Basic
|
|
83
|
-
auth (access_key:secret_key) exchanged for a short-lived bearer
|
|
84
|
-
token, but the v1alpha5 API also accepts the key-pair directly
|
|
85
|
-
as a Bearer header in the format ``Bearer <access_key>:<secret_key>``.
|
|
86
|
-
We use the direct header approach to avoid an extra token-exchange
|
|
87
|
-
round-trip.
|
|
88
|
-
"""
|
|
89
|
-
if self.access_key and self.secret_key:
|
|
90
|
-
self._bearer_token = f"{self.access_key}:{self.secret_key}"
|
|
85
|
+
"""No-op: Crusoe uses per-request HMAC-SHA256 signing (see _make_request)."""
|
|
86
|
+
pass
|
|
91
87
|
|
|
92
88
|
def _get_auth_headers(self) -> Dict[str, str]:
|
|
93
|
-
|
|
94
|
-
return {"Authorization": f"Bearer {self.access_key}:{self.secret_key}"}
|
|
89
|
+
# Auth is injected per-request via _make_request override (HMAC-SHA256 signed).
|
|
95
90
|
return {}
|
|
96
91
|
|
|
92
|
+
# ── Per-request HMAC-SHA256 signing ──────────────────────────────
|
|
93
|
+
|
|
94
|
+
async def _make_request(self, method: str, url: str, **kwargs) -> Dict[str, Any]:
|
|
95
|
+
"""Override base _make_request to inject Crusoe HMAC-SHA256 signed headers.
|
|
96
|
+
|
|
97
|
+
Signature scheme (v1.0):
|
|
98
|
+
payload = path + "\n" + canonicalized_query + "\n" + METHOD + "\n" + timestamp + "\n"
|
|
99
|
+
sig = base64url(hex(hmac_sha256(payload, urlsafe_b64decode(secret_key))))
|
|
100
|
+
header = "Bearer 1.0:{access_key_id}:{sig}"
|
|
101
|
+
See: https://docs.crusoecloud.com/reference/api/
|
|
102
|
+
"""
|
|
103
|
+
if not self.session or self.session.closed:
|
|
104
|
+
self.session = aiohttp.ClientSession()
|
|
105
|
+
self._owns_session = True
|
|
106
|
+
|
|
107
|
+
headers = kwargs.pop("headers", {})
|
|
108
|
+
headers.update(self._build_signed_headers(method, url))
|
|
109
|
+
headers.setdefault("Content-Type", "application/json")
|
|
110
|
+
|
|
111
|
+
async with self.session.request(method, url, headers=headers, **kwargs) as response:
|
|
112
|
+
if response.status >= 400:
|
|
113
|
+
error_text = await response.text()
|
|
114
|
+
raise Exception(f"HTTP {response.status}: {error_text}")
|
|
115
|
+
return await response.json()
|
|
116
|
+
|
|
117
|
+
def _build_signed_headers(self, method: str, url: str) -> Dict[str, str]:
|
|
118
|
+
"""Build X-Crusoe-Timestamp and Authorization headers for a single request."""
|
|
119
|
+
if not self.access_key or not self.secret_key:
|
|
120
|
+
return {}
|
|
121
|
+
|
|
122
|
+
parsed = urlparse(url)
|
|
123
|
+
path = parsed.path
|
|
124
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S+00:00")
|
|
125
|
+
|
|
126
|
+
# Canonicalize query params: sort lexicographically, join with &
|
|
127
|
+
if parsed.query:
|
|
128
|
+
pairs = sorted(
|
|
129
|
+
part for part in parsed.query.split("&") if part
|
|
130
|
+
)
|
|
131
|
+
query_str = "&".join(pairs)
|
|
132
|
+
else:
|
|
133
|
+
query_str = ""
|
|
134
|
+
|
|
135
|
+
payload = f"{path}\n{query_str}\n{method.upper()}\n{timestamp}\n"
|
|
136
|
+
|
|
137
|
+
# Decode URL-safe base64 secret key (add padding if needed)
|
|
138
|
+
sk = self.secret_key
|
|
139
|
+
padding = (4 - len(sk) % 4) % 4
|
|
140
|
+
secret_bytes = base64.urlsafe_b64decode(sk + "=" * padding)
|
|
141
|
+
|
|
142
|
+
# HMAC-SHA256 → hex-encode → URL-safe base64 (no padding)
|
|
143
|
+
mac = hmac.new(secret_bytes, payload.encode("utf-8"), hashlib.sha256)
|
|
144
|
+
hex_digest = mac.hexdigest()
|
|
145
|
+
sig_b64 = base64.urlsafe_b64encode(hex_digest.encode("utf-8")).rstrip(b"=").decode()
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
"X-Crusoe-Timestamp": timestamp,
|
|
149
|
+
"Authorization": f"Bearer 1.0:{self.access_key}:{sig_b64}",
|
|
150
|
+
}
|
|
151
|
+
|
|
97
152
|
# ── Capacity / Quotes ─────────────────────────────────────────────
|
|
98
153
|
|
|
99
154
|
async def get_instance_quotes(
|
|
@@ -76,11 +76,13 @@ class E2ENetworksProvider(BaseProvider):
|
|
|
76
76
|
# ── URL helpers ───────────────────────────────────────────────────
|
|
77
77
|
|
|
78
78
|
def _nodes_url(self, path: str = "") -> str:
|
|
79
|
-
"""Build a nodes endpoint URL
|
|
80
|
-
if self.project_id:
|
|
81
|
-
return f"{self.API_BASE}/projects/{self.project_id}/nodes{path}"
|
|
79
|
+
"""Build a nodes endpoint URL. Project scoping is done via ?project_id= query param."""
|
|
82
80
|
return f"{self.API_BASE}/nodes{path}"
|
|
83
81
|
|
|
82
|
+
def _project_params(self) -> Dict[str, str]:
|
|
83
|
+
"""Return project_id as a query-param dict if configured."""
|
|
84
|
+
return {"project_id": self.project_id} if self.project_id else {}
|
|
85
|
+
|
|
84
86
|
# ── Capacity / Quotes ─────────────────────────────────────────────
|
|
85
87
|
|
|
86
88
|
async def get_instance_quotes(
|
|
@@ -240,24 +242,31 @@ class E2ENetworksProvider(BaseProvider):
|
|
|
240
242
|
"india_based": True,
|
|
241
243
|
}
|
|
242
244
|
|
|
243
|
-
async def _node_action(self, instance_id: str,
|
|
244
|
-
"""Send a lifecycle action to a node
|
|
245
|
-
|
|
245
|
+
async def _node_action(self, instance_id: str, action_type: str) -> Dict[str, Any]:
|
|
246
|
+
"""Send a lifecycle action to a node.
|
|
247
|
+
|
|
248
|
+
Endpoint: PUT /api/v1/nodes/{node_id}/actions/
|
|
249
|
+
Body: {"type": <action_type>}
|
|
250
|
+
Supported types: power_off, power_on, reboot, reinstall, rename, ...
|
|
251
|
+
See: https://docs.e2enetworks.com/api/myaccount/compute/nodes/actions/node-action/
|
|
252
|
+
"""
|
|
253
|
+
body = {"type": action_type}
|
|
246
254
|
data = await self._make_request(
|
|
247
|
-
"
|
|
255
|
+
"PUT", self._nodes_url(f"/{instance_id}/actions/"),
|
|
256
|
+
json=body, params=self._project_params()
|
|
248
257
|
)
|
|
249
258
|
return data if isinstance(data, dict) else {}
|
|
250
259
|
|
|
251
260
|
async def stop_instance(self, instance_id: str) -> Dict[str, Any]:
|
|
252
261
|
if not self.api_key:
|
|
253
262
|
raise Exception("E2E Networks API key not configured")
|
|
254
|
-
await self._node_action(instance_id, "
|
|
263
|
+
await self._node_action(instance_id, "power_off")
|
|
255
264
|
return {"instance_id": instance_id, "action": "stop", "status": "stopping"}
|
|
256
265
|
|
|
257
266
|
async def start_instance(self, instance_id: str) -> Dict[str, Any]:
|
|
258
267
|
if not self.api_key:
|
|
259
268
|
raise Exception("E2E Networks API key not configured")
|
|
260
|
-
await self._node_action(instance_id, "
|
|
269
|
+
await self._node_action(instance_id, "power_on")
|
|
261
270
|
return {"instance_id": instance_id, "action": "start", "status": "starting"}
|
|
262
271
|
|
|
263
272
|
async def terminate_instance(self, instance_id: str) -> Dict[str, Any]:
|
|
@@ -368,3 +377,4 @@ class E2ENetworksProvider(BaseProvider):
|
|
|
368
377
|
raise Exception("E2E Networks API key not configured")
|
|
369
378
|
await self._node_action(instance_id, "reboot")
|
|
370
379
|
return {"instance_id": instance_id, "action": "reboot", "status": "rebooting"}
|
|
380
|
+
|
|
@@ -9,6 +9,7 @@ CRITICAL FIXES v4.0.0:
|
|
|
9
9
|
- Container image pinning strategy
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
|
+
import base64
|
|
12
13
|
import os
|
|
13
14
|
from typing import Dict, List, Any, Optional
|
|
14
15
|
from datetime import datetime
|
|
@@ -363,7 +364,12 @@ class LambdaLabsProvider(BaseProvider):
|
|
|
363
364
|
}
|
|
364
365
|
|
|
365
366
|
def _get_auth_headers(self) -> Dict[str, str]:
|
|
366
|
-
|
|
367
|
+
# Lambda Labs uses HTTP Basic auth: api_key as username, empty password
|
|
368
|
+
# Per official docs: curl -u $LAMBDA_API_KEY: https://cloud.lambdalabs.com/api/v1/...
|
|
369
|
+
if self.api_key:
|
|
370
|
+
token = base64.b64encode(f"{self.api_key}:".encode()).decode()
|
|
371
|
+
return {"Authorization": f"Basic {token}"}
|
|
372
|
+
return {}
|
|
367
373
|
|
|
368
374
|
async def _check_capacity_availability(self, instance_type: str) -> Dict[str, Any]:
|
|
369
375
|
"""CRITICAL: Check real-time capacity availability for Lambda instances"""
|
|
@@ -271,9 +271,11 @@ class OracleProvider(BaseProvider):
|
|
|
271
271
|
}
|
|
272
272
|
|
|
273
273
|
def _get_auth_headers(self) -> Dict[str, str]:
|
|
274
|
-
#
|
|
275
|
-
#
|
|
276
|
-
#
|
|
277
|
-
|
|
278
|
-
|
|
274
|
+
# KNOWN LIMITATION: Oracle Cloud Infrastructure requires RSA HTTP request
|
|
275
|
+
# signing (OCI Signature v1), NOT a simple Bearer token. Live API calls
|
|
276
|
+
# (provision, status, stop, terminate) will return HTTP 401 without a
|
|
277
|
+
# proper RSA-signed request. For production use, replace this provider
|
|
278
|
+
# with one that uses oci-python-sdk's oci.auth.signers.Signer.
|
|
279
|
+
# get_instance_quotes() falls back to static pricing, so quoting works.
|
|
280
|
+
# See: https://docs.oracle.com/en-us/iaas/Content/API/Concepts/usingapi.htm
|
|
279
281
|
return {}
|
|
@@ -29,37 +29,55 @@ class YottaLabsProvider(BaseProvider):
|
|
|
29
29
|
DEFAULT_IMAGE = "yottalabsai/pytorch:2.9.0-py3.11-cuda12.8.1-cudnn-devel-ubuntu22.04"
|
|
30
30
|
|
|
31
31
|
# Map Terradev canonical GPU names → Yotta Labs gpuType strings
|
|
32
|
+
# Source: https://docs.yottalabs.ai/api-and-sdk/api-guides (GPU Types Reference)
|
|
32
33
|
GPU_TYPE_MAP = {
|
|
33
|
-
"H100": "
|
|
34
|
-
"H100-80GB": "
|
|
35
|
-
"H100-SXM": "
|
|
34
|
+
"H100": "NVIDIA_H100_80G",
|
|
35
|
+
"H100-80GB": "NVIDIA_H100_80G",
|
|
36
|
+
"H100-SXM": "NVIDIA_H100_80G",
|
|
37
|
+
"H100-PCIe": "NVIDIA_H100_PCIe_80G",
|
|
36
38
|
"H200": "NVIDIA_H200_141G",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"A100
|
|
39
|
+
"B200": "NVIDIA_B200_180G",
|
|
40
|
+
"B300": "NVIDIA_B300_262G",
|
|
41
|
+
"A100": "NVIDIA_A100_80G",
|
|
42
|
+
"A100-80GB": "NVIDIA_A100_80G",
|
|
43
|
+
"A100-PCIe": "NVIDIA_A100_PCIe_80G",
|
|
44
|
+
"A100-40GB": "NVIDIA_A100_PCIe_40G",
|
|
40
45
|
"RTX4090": "NVIDIA_RTX_4090_24G",
|
|
46
|
+
"RTX5090": "NVIDIA_RTX_5090_32G",
|
|
41
47
|
"RTX3090": "NVIDIA_RTX_3090_24G",
|
|
42
|
-
"RTX3080": "NVIDIA_RTX_3080_10G",
|
|
43
48
|
"L40S": "NVIDIA_L40S_48G",
|
|
44
49
|
"L40": "NVIDIA_L40_48G",
|
|
45
50
|
"A6000": "NVIDIA_RTX_A6000_48G",
|
|
51
|
+
"RTX6000Ada": "NVIDIA_RTX_6000_Ada_48G",
|
|
52
|
+
"RTXPro6000": "NVIDIA_RTX_PRO_6000_96G",
|
|
53
|
+
"MI300X": "AMD_MI300X_192G",
|
|
46
54
|
"T4": "NVIDIA_T4_16G",
|
|
47
55
|
"V100": "NVIDIA_V100_16G",
|
|
48
56
|
}
|
|
49
57
|
|
|
50
58
|
# Reference pricing (USD/hr per GPU) — live API takes precedence
|
|
59
|
+
# Keys must exactly match the gpuType strings from GPU_TYPE_MAP / Yotta API reference
|
|
51
60
|
GPU_PRICING = {
|
|
52
|
-
"
|
|
61
|
+
"NVIDIA_H100_80G": {"price": 2.99, "mem_gb": 80, "vcpus": 16, "ram_gb": 64},
|
|
62
|
+
"NVIDIA_H100_PCIe_80G": {"price": 2.49, "mem_gb": 80, "vcpus": 16, "ram_gb": 64},
|
|
53
63
|
"NVIDIA_H200_141G": {"price": 4.49, "mem_gb": 141, "vcpus": 16, "ram_gb": 64},
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
64
|
+
"NVIDIA_B200_180G": {"price": 6.99, "mem_gb": 180, "vcpus": 24, "ram_gb": 128},
|
|
65
|
+
"NVIDIA_B300_262G": {"price": 8.99, "mem_gb": 262, "vcpus": 32, "ram_gb": 192},
|
|
66
|
+
"NVIDIA_A100_80G": {"price": 1.89, "mem_gb": 80, "vcpus": 16, "ram_gb": 64},
|
|
67
|
+
"NVIDIA_A100_PCIe_80G": {"price": 1.79, "mem_gb": 80, "vcpus": 16, "ram_gb": 64},
|
|
68
|
+
"NVIDIA_A100_PCIe_40G": {"price": 1.29, "mem_gb": 40, "vcpus": 12, "ram_gb": 48},
|
|
69
|
+
"NVIDIA_A100_40G": {"price": 1.29, "mem_gb": 40, "vcpus": 12, "ram_gb": 48},
|
|
70
|
+
"NVIDIA_RTX_4090_24G": {"price": 0.69, "mem_gb": 24, "vcpus": 8, "ram_gb": 32},
|
|
71
|
+
"NVIDIA_RTX_5090_32G": {"price": 0.99, "mem_gb": 32, "vcpus": 8, "ram_gb": 32},
|
|
72
|
+
"NVIDIA_RTX_3090_24G": {"price": 0.29, "mem_gb": 24, "vcpus": 8, "ram_gb": 32},
|
|
73
|
+
"NVIDIA_L40S_48G": {"price": 1.19, "mem_gb": 48, "vcpus": 16, "ram_gb": 64},
|
|
74
|
+
"NVIDIA_L40_48G": {"price": 0.99, "mem_gb": 48, "vcpus": 12, "ram_gb": 48},
|
|
75
|
+
"NVIDIA_RTX_A6000_48G": {"price": 0.79, "mem_gb": 48, "vcpus": 12, "ram_gb": 48},
|
|
76
|
+
"NVIDIA_RTX_6000_Ada_48G": {"price": 0.89, "mem_gb": 48, "vcpus": 12, "ram_gb": 48},
|
|
77
|
+
"NVIDIA_RTX_PRO_6000_96G": {"price": 1.49, "mem_gb": 96, "vcpus": 16, "ram_gb": 64},
|
|
78
|
+
"AMD_MI300X_192G": {"price": 3.49, "mem_gb": 192, "vcpus": 24, "ram_gb": 128},
|
|
79
|
+
"NVIDIA_T4_16G": {"price": 0.35, "mem_gb": 16, "vcpus": 4, "ram_gb": 16},
|
|
80
|
+
"NVIDIA_V100_16G": {"price": 0.55, "mem_gb": 16, "vcpus": 8, "ram_gb": 32},
|
|
63
81
|
}
|
|
64
82
|
|
|
65
83
|
def __init__(self, credentials: Dict[str, str]):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: terradev-cli
|
|
3
|
-
Version: 5.3.
|
|
3
|
+
Version: 5.3.2
|
|
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.3.
|
|
96
|
+
# Terradev CLI v5.3.2
|
|
97
97
|
|
|
98
98
|
**An imperative command-line-interface for AI workload orchestration.**
|
|
99
99
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/agentic-template/helm/values-agentic.yaml
RENAMED
|
File without changes
|
{terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/agentic-template/k8s/fleet-manifests.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{terradev_cli-5.3.1 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/llminferenceservice.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|