terradev-cli 5.5.2__tar.gz → 5.5.4__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.5.2 → terradev_cli-5.5.4}/Deployment Package/BNF_GRAMMAR.md +4 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/PKG-INFO +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/pyproject.toml +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/cli.py +163 -11
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/hf_smart_templates.py +37 -22
- terradev_cli-5.5.4/terradev_cli/core/monitoring.py +31 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/mcp/server.py +2 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/kubernetes_enhanced.py +3 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/langgraph_service.py +38 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/optimization/auto_optimizer.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/alibaba_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/aws_provider.py +22 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/azure_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/base_provider.py +19 -129
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/baseten_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/coreweave_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/crusoe_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/digitalocean_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/e2e_networks_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/fluidstack_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/gcp_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/hetzner_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/huggingface_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/hyperstack_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/inferx_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/lambda_labs_provider.py +8 -3
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/oracle_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/ovhcloud_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/runpod_provider.py +146 -82
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/siliconflow_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/tensordock_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/vastai_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/yottalabs_provider.py +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli.egg-info/PKG-INFO +1 -1
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli.egg-info/SOURCES.txt +1 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/.env.example +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/.github/workflows/action.yml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/.github/workflows/ci.yml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/.github/workflows/release.yml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/.github/workflows/static.yml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/.terradev/custom_providers.example.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/Deployment Package/LIFECYCLES.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/Deployment Package/architecture.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/Deployment Package/overview.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/Deployment Package/security.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/Deployment Package/troubleshooting.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/Dockerfile +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/Dockerfile.test +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/LICENSE +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/MANIFEST.in +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/README.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/agentic-template/helm/values-agentic.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/agentic-template/k8s/fleet-manifests.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/README.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/helm/values-glm5.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/k8s/hpa.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/k8s/namespace.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/k8s/pdb.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/k8s/service.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/k8s/sglang-deployment.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/k8s/vllm-deployment.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/task.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/terraform/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/terraform/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/glm-5/terraform/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/llmd-template/README.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/llmd-template/helm/values-llmd.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/llmd-template/k8s/gateway.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/llmd-template/k8s/leaderworkerset.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/llmd-template/k8s/llminferenceservice.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/llmd-template/task.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/helm/Chart.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/helm/templates/_helpers.tpl +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/helm/templates/deployment.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/helm/templates/pvc-adapter.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/helm/templates/pvc-registry.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/helm/templates/service.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/helm/templates/serviceaccount.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/helm/values-lora.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/k8s/adapter-pvc.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/k8s/namespace.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/k8s/registry-pvc.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/k8s/service.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lora-template/k8s/serviceaccount.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lorax-template/helm/Chart.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lorax-template/helm/templates/_helpers.tpl +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lorax-template/helm/templates/deployment.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lorax-template/helm/templates/pvc.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lorax-template/helm/templates/service.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lorax-template/helm/templates/serviceaccount.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/lorax-template/helm/values-lorax.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/README.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/helm/values-moe.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/k8s/hpa.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/k8s/namespace.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/k8s/pdb.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/k8s/service.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/task.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/terraform/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/terraform/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/moe-template/terraform/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/rag-template/README.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/rag-template/helm/values-rag.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/rag-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/clusters/rag-template/terraform/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/demo/RECORDING_GUIDE.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/demo/generate_gif.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/demo/terradev-demo.gif +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/ADVANCED_FINANCIAL_INNOVATIONS.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/API_DOCUMENTATION.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/BingSiteAuth.xml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/FINOPS_ATTRIBUTION_SYSTEM.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/LORA_COMMAND_LIFECYCLE.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/USER_GUIDE.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/VLLM_AUTO_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/VLLM_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/architecture.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/index.html +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/overview.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/robots.txt +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/sitemap.xml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/docs/test_spot_provision.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/aws_ssm_starter.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/config.example.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/demo_k8s_config.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/direct_aws_starter.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/ec2_user_data_starter.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/example-pipeline.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/kubernetes_training_deployment.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/simple_ssm_starter.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/ssh_server_starter.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/examples/start_aws_servers.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/helm/terradev/Chart.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/helm/terradev/templates/_helpers.tpl +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/helm/terradev/templates/deployment.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/helm/terradev/values.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/infrastructure/bucket-policy.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/infrastructure/grafana_training_dashboard.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/infrastructure/kubernetes/microservices.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/infrastructure/terraform/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/infrastructure/terraform/parallelism.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/integrations/cli-tool.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/integrations/cloud-management-widgets.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/integrations/cloud-provider-apis.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/integrations/critical-widgets.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/integrations/devops-cicd-widgets.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/integrations/devops-essential-tools.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/integrations/docker-integration.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/integrations/kubernetes-operator.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/integrations/mlflow-integration.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/marketing/bare-metal-latitude-post.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/modules/datadog/README.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/modules/datadog/dashboard.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/modules/datadog/monitors.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/modules/datadog/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/modules/datadog/provider.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/modules/datadog/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/modules/datadog/versions.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/modules/prometheus_training_config.yml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/PERFORMANCE_OPTIMIZATIONS.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/README.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-artifact-verification/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-artifact-verification/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-artifact-verification/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-artifact-verification/src/verifier.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-authentication/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-authentication/src/encoding.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-authentication/src/hmac.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-authentication/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-authentication/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cache-eviction/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cache-eviction/src/cache.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cache-eviction/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cache-eviction/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-command-executor/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-command-executor/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-config-validator/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-config-validator/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-config-validator/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-config-validator/src/validator.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-connection-pool/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-connection-pool/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-connection-pool/src/pool.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-connection-pool/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cost-calculator/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cost-calculator/src/calculator.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cost-calculator/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cost-calculator/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cost-scaler/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-cost-scaler/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-credential-vault/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-credential-vault/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-credential-vault/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-credential-vault/src/vault.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-dag-executor/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-dag-executor/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-distributed-lock/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-distributed-lock/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-distributed-lock/src/lock.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-distributed-lock/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-egress-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-egress-optimizer/src/graph.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-egress-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-egress-optimizer/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-event-bus/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-event-bus/src/bus.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-event-bus/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-event-bus/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-governance/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-governance/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-gpu-discovery/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-gpu-discovery/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-gpu-topology/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-gpu-topology/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-gpu-topology/src/topology.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-gpu-topology/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-helm-generator/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-helm-generator/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-mcp-codec/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-mcp-codec/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-mcp-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-mcp-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-price-intelligence/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-price-intelligence/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-quota-manager/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-quota-manager/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-quota-manager/src/manager.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-quota-manager/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-resource-pool/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-resource-pool/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-resource-pool/src/pool.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-resource-pool/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-result-compressor/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-result-compressor/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-semantic-router/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-semantic-router/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-snapshot-manager/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-snapshot-manager/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-snapshot-manager/src/snapshot.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-snapshot-manager/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-state-machine/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-state-machine/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-state-machine/src/state.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-state-machine/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-telemetry/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-telemetry/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-telemetry/src/pipeline.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-telemetry/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-tool-registry/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-tool-registry/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-vram-estimator/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-vram-estimator/src/estimator.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-vram-estimator/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-vram-estimator/src/types.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-warm-pool/Cargo.toml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/rust/terradev-warm-pool/src/lib.rs +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/scripts/action.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/scripts/gpu-check.sh +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/setup/Lambda Cloud API spec 1.8.3.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/setup/docker-compose.yml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/setup/nginx.conf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/setup/setup.sh +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/setup.cfg +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/CHANGELOG.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/COMPLETE_COMMAND_REFERENCE.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/COMPLETE_INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/IMPLEMENTATION_SUMMARY.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/MAKING_SPOT_WORK_FOR_STATEFUL_WORKLOADS.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/README.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/SGLANG_COMMAND_GUIDE.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/TERRADEV_STACK_CHART.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/__main__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/cli_hf_spaces.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/cli_karpenter.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/agentic_provisioner.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/agentic_topology.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/async_config.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/auth.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/auto_lineage.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/cache_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/checkpoint_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/command_executor.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/config.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/config_validator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/cost_scaler.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/cost_tracker.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/credential_vault.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/cuda_graph_integrator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/dag_executor.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/data_governance.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/dataset_stager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/deployment_router.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/distributed_lock.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/drift_detector.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/egress_cost_monitor.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/egress_optimizer.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/evaluation_orchestrator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/event_system.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/gitops_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/gpu_discovery.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/gpu_topology.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/helm_generator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/hf_cli_integration.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/hf_spaces.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/inference_router.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/inference_spot_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/job_state_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/kv_cache_checkpoint_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/kv_cache_checkpoint_tests.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/kv_sharing.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/lora_consistency.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/lora_cost_attribution.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/lora_versioning.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/manifest_cache.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/manifest_example.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/mig_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/migration_orchestrator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/mla_vram_estimator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/mla_vram_tests.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/model_orchestrator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/oidc_provider.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/optimization_config.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/parallel_provisioner.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/pd_transport.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/pipeline_schema.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/preflight_validator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/price_discovery.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/price_intelligence.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/public_ip_billing_tracker.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/quick_start.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/quota_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/rate_limiter.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/rust_telemetry.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_router.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/base_signal.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/complexity_signal.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/domain_signal.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/keyword_signal.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/language_signal.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/modality_signal.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/orchestrator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/routing_policy.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/semantic_signals/safety_signal.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/session_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/ssh_key_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/telemetry.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/terradev_engine.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/trace_viewer.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/training_monitor.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/training_orchestrator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/user_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/warm_pool_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/weight_streaming_benchmarks.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/core/weight_streaming_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/cost_optimizer.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/credential_prompt.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/demo.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/entry_point.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/integrations/Terradev LOGO BLACK.png +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/integrations/Terradev LOGO WHITEW.png +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/integrations/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/integrations/databricks_integration.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/integrations/datadog_integration.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/integrations/helicone_integration.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/integrations/prometheus_integration.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/integrations/wandb_integration.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/k8s/terraform_wrapper.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/kubernetes/inferx-cost-optimized.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/kubernetes/inferx-infrastructure.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/kubernetes/inferx-models.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/kubernetes/inferx-platform.yaml +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/kubernetes/inferx_setup.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/mcp/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/agentic_serving.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/drift_retrain_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/dvc_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/guardrails_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/huggingface_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/kserve_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/kubernetes_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/langchain_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/langfuse_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/lmcache_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/lora_registry.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/lorax_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/mlflow_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/model_router.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/ollama_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/peft_import_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/phoenix_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/qdrant_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/ray_enhanced.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/ray_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/sglang_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/vllm_service.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/ml_services/wandb_enhanced.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/optimization/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/optimization/cuco_optimizer.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/LATITUDE_PROVIDER.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/demo_mode.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/gpu_catalog.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/latitude_provider.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/provider_factory.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/provider_profiles.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/real_pricing.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/registry.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/providers/types.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/requirements.txt +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/requirements_minimal.txt +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-aws/bootstrap.sh +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-aws/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-aws/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-aws/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-aws/versions.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-hyperstack/bootstrap.sh +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-hyperstack/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-hyperstack/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-hyperstack/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-hyperstack/versions.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-lambda/bootstrap.sh +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-lambda/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-lambda/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-lambda/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-lambda/versions.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-vastai/bootstrap.sh +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-vastai/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-vastai/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-vastai/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/gpu-node-vastai/versions.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/k8s-control-plane/join-script.tpl +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/k8s-control-plane/kubeconfig.tpl +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/k8s-control-plane/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/k8s-control-plane/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/k8s-control-plane/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/k8s-control-plane/versions.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/networking/main.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/networking/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/networking/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/modules/networking/versions.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/outputs.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/price-optimizer/optimal-allocation.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/providers.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/terraform/variables.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/test_summary.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/utils/__init__.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli/utils/formatters.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli.egg-info/dependency_links.txt +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli.egg-info/entry_points.txt +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli.egg-info/requires.txt +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terradev_cli.egg-info/top_level.txt +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform.tfvars.example +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_optimization/backend.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_optimization/error_handling.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_optimization/parallel_provisioning.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_optimization/storage_choice_matrix.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_optimization/test_error_handler.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_optimization/versions.tf +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/audit_demo/trail_3caed73ad5bf.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/audit_trail.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/audit_trails.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/decision_engine.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/decision_logs.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/operations.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/terraform_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/terraform_plans.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/transparency_demo.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/terraform_transparency/transparency_report.json +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/CREDENTIAL_STRATEGY.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/INTEGRATION_STRATEGY.md +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/Makefile +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/ci_pipeline.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/conftest.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/root_tests/test_cli_ux_battle.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/root_tests/test_cli_ux_battle_fixed.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/root_tests/test_cli_ux_final.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/root_tests/test_final_integration.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/root_tests/test_integrated_optimization.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/root_tests/test_p10_production_failover.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/root_tests/test_sso_phase1.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/root_tests/test_vllm_optimization.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/simple_test.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_ai_integrations.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_checkpoint_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_cli_smoke.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_dag_executor.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_flashoptim.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_integration.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_job_state_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_k8s_regression.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_latitude_provider.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_major_providers.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_mcp_handlers.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_new_providers.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_provider_conformance.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_providers.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_semantic_router.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_sglang_optimization.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_ssh_key_manager.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_training_monitor.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_training_orchestrator.py +0 -0
- {terradev_cli-5.5.2 → terradev_cli-5.5.4}/tests/test_vllm_features.py +0 -0
|
@@ -123,9 +123,12 @@
|
|
|
123
123
|
[--spot-strategy <spot-strategy>]
|
|
124
124
|
[--backend <inference-backend>]
|
|
125
125
|
[--prefer-local]
|
|
126
|
+
[--select <selection>]
|
|
127
|
+
[--auto]
|
|
126
128
|
|
|
127
129
|
<provision-type> ::= inference | training | jupyter | custom
|
|
128
|
-
<spot-strategy> ::= cheapest |
|
|
130
|
+
<spot-strategy> ::= aggressive | cheapest | balanced | conservative | safe
|
|
131
|
+
<selection> ::= <integer> | "cheapest" | "cheapest-spot" | "cheapest-secure"
|
|
129
132
|
|
|
130
133
|
<instance-command> ::= instance
|
|
131
134
|
-i <string>
|
|
@@ -507,6 +507,7 @@ class TerradevAPI:
|
|
|
507
507
|
"availability": "spot" if q.get("spot") else "on-demand",
|
|
508
508
|
"gpu_count": q.get("gpu_count", 1),
|
|
509
509
|
"instance_type": q.get("instance_type", "N/A"),
|
|
510
|
+
"memory_gb": q.get("memory_gb", 0),
|
|
510
511
|
}
|
|
511
512
|
)
|
|
512
513
|
return quotes
|
|
@@ -2338,9 +2339,9 @@ profiles:
|
|
|
2338
2339
|
)
|
|
2339
2340
|
@click.option(
|
|
2340
2341
|
"--spot-strategy",
|
|
2341
|
-
type=click.Choice(["aggressive", "balanced", "conservative"]),
|
|
2342
|
+
type=click.Choice(["aggressive", "cheapest", "balanced", "conservative", "safe"]),
|
|
2342
2343
|
default="balanced",
|
|
2343
|
-
help="Spot instance strategy: aggressive
|
|
2344
|
+
help="Spot instance strategy: aggressive/cheapest, balanced, conservative/safe (most stable)",
|
|
2344
2345
|
)
|
|
2345
2346
|
@click.option(
|
|
2346
2347
|
"--backend",
|
|
@@ -2378,6 +2379,18 @@ profiles:
|
|
|
2378
2379
|
default="fp16",
|
|
2379
2380
|
help="KV cache dtype. fp8 halves KV VRAM requirement.",
|
|
2380
2381
|
)
|
|
2382
|
+
@click.option(
|
|
2383
|
+
"--select",
|
|
2384
|
+
"select_instance",
|
|
2385
|
+
default=None,
|
|
2386
|
+
help="Select instance by number or keyword: 1-N, cheapest, cheapest-spot, cheapest-secure, SXM4-40GB, SXM4-80GB, 80GB PCIe",
|
|
2387
|
+
)
|
|
2388
|
+
@click.option(
|
|
2389
|
+
"--auto",
|
|
2390
|
+
is_flag=True,
|
|
2391
|
+
default=False,
|
|
2392
|
+
help="Auto-select cheapest instance without prompting (CI/CD mode)",
|
|
2393
|
+
)
|
|
2381
2394
|
def provision(
|
|
2382
2395
|
gpu_type,
|
|
2383
2396
|
count,
|
|
@@ -2399,6 +2412,8 @@ def provision(
|
|
|
2399
2412
|
context_k,
|
|
2400
2413
|
sharing_topology,
|
|
2401
2414
|
dtype,
|
|
2415
|
+
select_instance,
|
|
2416
|
+
auto,
|
|
2402
2417
|
):
|
|
2403
2418
|
"""Provision GPU instances across multiple clouds with auto-optimization.
|
|
2404
2419
|
|
|
@@ -2565,6 +2580,9 @@ def provision(
|
|
|
2565
2580
|
|
|
2566
2581
|
# ── Spot vs On-Demand Selection Logic ──
|
|
2567
2582
|
use_spot = None
|
|
2583
|
+
# Normalize spot strategy aliases
|
|
2584
|
+
_strategy_aliases = {"cheapest": "aggressive", "safe": "conservative"}
|
|
2585
|
+
spot_strategy = _strategy_aliases.get(spot_strategy, spot_strategy)
|
|
2568
2586
|
if spot and on_demand:
|
|
2569
2587
|
print("ERROR: Cannot specify both --spot and --on-demand")
|
|
2570
2588
|
return 1
|
|
@@ -2811,6 +2829,107 @@ def provision(
|
|
|
2811
2829
|
f"LOCKED: Only on-demand instances available ({len(on_demand_quotes)} options)"
|
|
2812
2830
|
)
|
|
2813
2831
|
|
|
2832
|
+
# ── Instance Selection Logic ──
|
|
2833
|
+
# Display instance table and handle selection (interactive, --select, --auto)
|
|
2834
|
+
import sys
|
|
2835
|
+
|
|
2836
|
+
def _select_instance(quotes, select_arg, auto_mode):
|
|
2837
|
+
"""Select an instance from quotes based on selection criteria"""
|
|
2838
|
+
if not quotes:
|
|
2839
|
+
return None
|
|
2840
|
+
|
|
2841
|
+
# Display instance table
|
|
2842
|
+
print(f"\nAvailable {gpu_type} Instances:")
|
|
2843
|
+
print(f"{'#':<4} {'Provider':<14} {'Region':<14} {'$/hr':<10} {'VRAM':<8} {'Instance':<20} {'Spot'}")
|
|
2844
|
+
print("-" * 78)
|
|
2845
|
+
for i, q in enumerate(quotes):
|
|
2846
|
+
vram_str = f"{q.get('memory_gb', 0):.0f}GB" if q.get('memory_gb') else "N/A"
|
|
2847
|
+
spot_mark = "✓" if q.get("availability") == "spot" else ""
|
|
2848
|
+
instance_short = q.get("instance_type", "N/A")[:20]
|
|
2849
|
+
print(f"{i+1:<4} {q['provider']:<14} {q['region']:<14} ${q['price']:<9.2f} {vram_str:<8} {instance_short:<20} {spot_mark}")
|
|
2850
|
+
print("-" * 78)
|
|
2851
|
+
|
|
2852
|
+
# Determine selection
|
|
2853
|
+
selected_index = None
|
|
2854
|
+
|
|
2855
|
+
if select_arg:
|
|
2856
|
+
# --select flag specified
|
|
2857
|
+
if select_arg.isdigit():
|
|
2858
|
+
# Numeric selection
|
|
2859
|
+
idx = int(select_arg) - 1
|
|
2860
|
+
if 0 <= idx < len(quotes):
|
|
2861
|
+
selected_index = idx
|
|
2862
|
+
else:
|
|
2863
|
+
print(f"ERROR: Invalid selection {select_arg}. Must be 1-{len(quotes)}")
|
|
2864
|
+
return None
|
|
2865
|
+
elif select_arg == "cheapest":
|
|
2866
|
+
selected_index = 0
|
|
2867
|
+
elif select_arg == "cheapest-spot":
|
|
2868
|
+
spot_quotes = [q for q in quotes if q.get("availability") == "spot"]
|
|
2869
|
+
if spot_quotes:
|
|
2870
|
+
selected_index = quotes.index(spot_quotes[0])
|
|
2871
|
+
else:
|
|
2872
|
+
print("ERROR: No spot instances available")
|
|
2873
|
+
return None
|
|
2874
|
+
elif select_arg == "cheapest-secure":
|
|
2875
|
+
secure_quotes = [q for q in quotes if q.get("availability") != "spot"]
|
|
2876
|
+
if secure_quotes:
|
|
2877
|
+
selected_index = quotes.index(secure_quotes[0])
|
|
2878
|
+
else:
|
|
2879
|
+
print("ERROR: No secure (non-spot) instances available")
|
|
2880
|
+
return None
|
|
2881
|
+
else:
|
|
2882
|
+
# GPU memory variant selection (e.g., SXM4-40GB, 80GB PCIe)
|
|
2883
|
+
select_lower = select_arg.lower()
|
|
2884
|
+
for i, q in enumerate(quotes):
|
|
2885
|
+
instance_type = q.get("instance_type", "").lower()
|
|
2886
|
+
if select_lower in instance_type:
|
|
2887
|
+
selected_index = i
|
|
2888
|
+
break
|
|
2889
|
+
if selected_index is None:
|
|
2890
|
+
print(f"ERROR: No instance matching '{select_arg}' found")
|
|
2891
|
+
return None
|
|
2892
|
+
elif auto_mode or not sys.stdin.isatty():
|
|
2893
|
+
# --auto or non-interactive context: select cheapest
|
|
2894
|
+
selected_index = 0
|
|
2895
|
+
print(f"Auto-selecting cheapest instance (option 1)")
|
|
2896
|
+
else:
|
|
2897
|
+
# Interactive mode: prompt for selection
|
|
2898
|
+
try:
|
|
2899
|
+
user_input = input(f"\nSelect instance [1-{len(quotes)}] (default: 1, Enter to confirm): ").strip()
|
|
2900
|
+
if not user_input:
|
|
2901
|
+
selected_index = 0
|
|
2902
|
+
elif user_input.isdigit():
|
|
2903
|
+
idx = int(user_input) - 1
|
|
2904
|
+
if 0 <= idx < len(quotes):
|
|
2905
|
+
selected_index = idx
|
|
2906
|
+
else:
|
|
2907
|
+
print(f"ERROR: Invalid selection. Must be 1-{len(quotes)}")
|
|
2908
|
+
return None
|
|
2909
|
+
else:
|
|
2910
|
+
print(f"ERROR: Invalid input. Enter a number 1-{len(quotes)}")
|
|
2911
|
+
return None
|
|
2912
|
+
except (EOFError, KeyboardInterrupt):
|
|
2913
|
+
print("\nSelection cancelled")
|
|
2914
|
+
return None
|
|
2915
|
+
|
|
2916
|
+
if selected_index is not None:
|
|
2917
|
+
selected = quotes[selected_index]
|
|
2918
|
+
print(f"\nSelected: {selected['provider']} {selected['region']} ${selected['price']:.2f}/hr {selected.get('instance_type', 'N/A')}")
|
|
2919
|
+
return selected
|
|
2920
|
+
|
|
2921
|
+
return None
|
|
2922
|
+
|
|
2923
|
+
# Apply instance selection
|
|
2924
|
+
selected_instance = _select_instance(all_quotes, select_instance, auto)
|
|
2925
|
+
if selected_instance is None:
|
|
2926
|
+
print("ERROR: No instance selected")
|
|
2927
|
+
return
|
|
2928
|
+
|
|
2929
|
+
# Use only the selected instance for provisioning
|
|
2930
|
+
all_quotes = [selected_instance]
|
|
2931
|
+
count = 1 # Always provision 1 when selecting specific instance
|
|
2932
|
+
|
|
2814
2933
|
# Record to cost DB
|
|
2815
2934
|
try:
|
|
2816
2935
|
from terradev_cli.core.cost_tracker import record_quotes
|
|
@@ -2962,8 +3081,8 @@ def provision(
|
|
|
2962
3081
|
t0 = time.monotonic()
|
|
2963
3082
|
try:
|
|
2964
3083
|
provider = factory.create_provider(pname, creds)
|
|
2965
|
-
|
|
2966
|
-
itype = f"{pname}-{
|
|
3084
|
+
# Use the instance_type from the quote (provider-specific format)
|
|
3085
|
+
itype = q.get("instance_type", f"{pname}-{gpu_type.lower()}")
|
|
2967
3086
|
|
|
2968
3087
|
# Wrap provision with rate limiter
|
|
2969
3088
|
async def _provision_with_rate_limit():
|
|
@@ -2971,6 +3090,7 @@ def provision(
|
|
|
2971
3090
|
itype,
|
|
2972
3091
|
q.get("region", "us-east-1"),
|
|
2973
3092
|
gpu_type,
|
|
3093
|
+
ssh_public_key=_provision_ssh_pubkey,
|
|
2974
3094
|
)
|
|
2975
3095
|
|
|
2976
3096
|
result = await rate_limiter.execute_with_rate_limit(
|
|
@@ -3270,6 +3390,11 @@ def provision(
|
|
|
3270
3390
|
for r in failed:
|
|
3271
3391
|
print(f" {r['provider']}/{r['region']}: {r['error']}")
|
|
3272
3392
|
print(f"Total provision time: {provision_time:.0f}ms")
|
|
3393
|
+
if _provision_ssh_pubkey and succeeded:
|
|
3394
|
+
print(f"\nSSH key (Ed25519, encrypted): ~/.terradev/ssh/{group_id}.key")
|
|
3395
|
+
print("Instance is provisioning — SSH available once status is 'running'.")
|
|
3396
|
+
print("Check status: terradev manage -i <instance-id> -a status")
|
|
3397
|
+
print("Then connect: (SSH command shown automatically with IP)")
|
|
3273
3398
|
if type == "inference":
|
|
3274
3399
|
print(f"Model: {model_name or 'Not specified'}")
|
|
3275
3400
|
print("Type: Inference workload")
|
|
@@ -3413,7 +3538,27 @@ def manage(instance_id, action):
|
|
|
3413
3538
|
print(f"Status: {st}")
|
|
3414
3539
|
|
|
3415
3540
|
if isinstance(result, dict):
|
|
3416
|
-
|
|
3541
|
+
ip = result.get("ip") or result.get("ip_address") or result.get("public_ip")
|
|
3542
|
+
port = result.get("port") or result.get("ssh_port")
|
|
3543
|
+
if ip:
|
|
3544
|
+
ssh_cmd = f"ssh root@{ip}"
|
|
3545
|
+
if port and port != 22:
|
|
3546
|
+
ssh_cmd += f" -p {port}"
|
|
3547
|
+
try:
|
|
3548
|
+
from terradev_cli.core.ssh_key_manager import decrypt_private_key
|
|
3549
|
+
group_id = None
|
|
3550
|
+
for inst in api.usage.get("instances_created", []):
|
|
3551
|
+
if inst.get("id") == instance_id:
|
|
3552
|
+
group_id = inst.get("parallel_group")
|
|
3553
|
+
break
|
|
3554
|
+
if group_id:
|
|
3555
|
+
tmp_key = decrypt_private_key(group_id)
|
|
3556
|
+
if tmp_key:
|
|
3557
|
+
ssh_cmd += f" -i {tmp_key}"
|
|
3558
|
+
except Exception:
|
|
3559
|
+
pass
|
|
3560
|
+
print(f" SSH: {ssh_cmd}")
|
|
3561
|
+
for k in ("gpu_utilization", "uptime"):
|
|
3417
3562
|
if result.get(k):
|
|
3418
3563
|
print(f" {k}: {result[k]}")
|
|
3419
3564
|
|
|
@@ -3846,6 +3991,11 @@ def optimize(instance_id, auto_apply):
|
|
|
3846
3991
|
"""
|
|
3847
3992
|
all_optimizations = []
|
|
3848
3993
|
|
|
3994
|
+
api = TerradevAPI()
|
|
3995
|
+
instances = api.usage.get("instances_created", [])
|
|
3996
|
+
if instance_id:
|
|
3997
|
+
instances = [inst for inst in instances if inst.get("id") == instance_id]
|
|
3998
|
+
|
|
3849
3999
|
try:
|
|
3850
4000
|
# Fetch fresh quotes for cost optimization
|
|
3851
4001
|
gpu_types = list(set(inst.get("gpu_type", "A100") for inst in instances))
|
|
@@ -4282,6 +4432,8 @@ def job(job_file, optimize):
|
|
|
4282
4432
|
|
|
4283
4433
|
# Load job configuration
|
|
4284
4434
|
try:
|
|
4435
|
+
import yaml
|
|
4436
|
+
|
|
4285
4437
|
with open(job_file, "r") as f:
|
|
4286
4438
|
job_config = yaml.safe_load(f)
|
|
4287
4439
|
|
|
@@ -8546,7 +8698,7 @@ def init(
|
|
|
8546
8698
|
@click.option("--namespace", default="gitops-system", help="Namespace for GitOps tools")
|
|
8547
8699
|
def bootstrap(tool, cluster, namespace):
|
|
8548
8700
|
"""Bootstrap GitOps tool on the cluster"""
|
|
8549
|
-
from terradev_cli.core.gitops_manager import GitOpsManager, GitOpsConfig, GitOpsTool
|
|
8701
|
+
from terradev_cli.core.gitops_manager import GitOpsManager, GitOpsConfig, GitOpsTool, GitProvider
|
|
8550
8702
|
|
|
8551
8703
|
# This is a simplified bootstrap - in practice, you'd load config from previous init
|
|
8552
8704
|
config = GitOpsConfig(
|
|
@@ -8584,7 +8736,7 @@ def bootstrap(tool, cluster, namespace):
|
|
|
8584
8736
|
)
|
|
8585
8737
|
def sync(cluster, environment, tool):
|
|
8586
8738
|
"""Sync cluster with Git repository"""
|
|
8587
|
-
from terradev_cli.core.gitops_manager import GitOpsManager, GitOpsConfig, GitOpsTool
|
|
8739
|
+
from terradev_cli.core.gitops_manager import GitOpsManager, GitOpsConfig, GitOpsTool, GitProvider
|
|
8588
8740
|
|
|
8589
8741
|
# This is a simplified sync - in practice, you'd load config from previous init
|
|
8590
8742
|
config = GitOpsConfig(
|
|
@@ -8618,7 +8770,7 @@ def sync(cluster, environment, tool):
|
|
|
8618
8770
|
@click.option("--environment", default="prod", help="Environment to validate")
|
|
8619
8771
|
def validate(dry_run, cluster, environment):
|
|
8620
8772
|
"""Validate GitOps configuration"""
|
|
8621
|
-
from terradev_cli.core.gitops_manager import GitOpsManager, GitOpsConfig, GitOpsTool
|
|
8773
|
+
from terradev_cli.core.gitops_manager import GitOpsManager, GitOpsConfig, GitOpsTool, GitProvider
|
|
8622
8774
|
|
|
8623
8775
|
# This is a simplified validation - in practice, you'd load config from previous init
|
|
8624
8776
|
config = GitOpsConfig(
|
|
@@ -8652,8 +8804,7 @@ def validate(dry_run, cluster, environment):
|
|
|
8652
8804
|
for warning in results["warnings"]:
|
|
8653
8805
|
print(f" Warning: {warning}")
|
|
8654
8806
|
|
|
8655
|
-
|
|
8656
|
-
asyncio.run(gitops_manager.validate_configuration(path))
|
|
8807
|
+
asyncio.run(run_validate())
|
|
8657
8808
|
|
|
8658
8809
|
|
|
8659
8810
|
# InferX Commands
|
|
@@ -14129,7 +14280,7 @@ def disable_trigger(name):
|
|
|
14129
14280
|
def fire_event(event_type, data, source):
|
|
14130
14281
|
"""Manually fire an event for testing"""
|
|
14131
14282
|
try:
|
|
14132
|
-
from terradev_cli.core.event_system import event_bus, EventType
|
|
14283
|
+
from terradev_cli.core.event_system import event_bus, EventType, Event
|
|
14133
14284
|
|
|
14134
14285
|
event_type_enum = EventType(event_type.replace("-", "_").upper())
|
|
14135
14286
|
|
|
@@ -14328,6 +14479,7 @@ def register_artifact(type, name, uri, environment, artifact_hash, size, user, p
|
|
|
14328
14479
|
Environment,
|
|
14329
14480
|
event_bus,
|
|
14330
14481
|
EventType,
|
|
14482
|
+
Event,
|
|
14331
14483
|
)
|
|
14332
14484
|
|
|
14333
14485
|
artifact_type_enum = ArtifactType(type)
|
|
@@ -483,20 +483,24 @@ class SmartTemplateGenerator:
|
|
|
483
483
|
if not model_spec or model_spec.model_type != "llm":
|
|
484
484
|
return "# Error: This model is not suitable for chat applications"
|
|
485
485
|
|
|
486
|
-
|
|
486
|
+
hardware = model_spec.recommended_hardware.upper()
|
|
487
|
+
parameters = str(model_spec.parameters)
|
|
488
|
+
streaming = "✅ Enabled" if model_spec.streaming_capable else "❌ Disabled"
|
|
489
|
+
|
|
490
|
+
template = '''import gradio as gr
|
|
487
491
|
import torch
|
|
488
492
|
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
|
|
489
493
|
import threading
|
|
490
494
|
import time
|
|
491
495
|
|
|
492
496
|
# Model configuration
|
|
493
|
-
MODEL_ID = "
|
|
497
|
+
MODEL_ID = "__MODEL_ID__"
|
|
494
498
|
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
|
|
495
499
|
MAX_LENGTH = 500
|
|
496
500
|
TEMPERATURE = 0.7
|
|
497
501
|
|
|
498
502
|
# Load model and tokenizer
|
|
499
|
-
print(f"Loading model: {
|
|
503
|
+
print(f"Loading model: {MODEL_ID}")
|
|
500
504
|
try:
|
|
501
505
|
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
|
|
502
506
|
if tokenizer.pad_token is None:
|
|
@@ -512,7 +516,7 @@ try:
|
|
|
512
516
|
model.eval()
|
|
513
517
|
print("Model loaded successfully!")
|
|
514
518
|
except Exception as e:
|
|
515
|
-
print(f"Error loading model: {
|
|
519
|
+
print(f"Error loading model: {e}")
|
|
516
520
|
model = None
|
|
517
521
|
tokenizer = None
|
|
518
522
|
|
|
@@ -559,7 +563,7 @@ def generate_response_stream(message, history, temperature=TEMPERATURE, max_leng
|
|
|
559
563
|
yield partial_text
|
|
560
564
|
|
|
561
565
|
except Exception as e:
|
|
562
|
-
yield f"❌ Generation error: {
|
|
566
|
+
yield f"❌ Generation error: {e}"
|
|
563
567
|
|
|
564
568
|
def generate_response_non_stream(message, history, temperature=TEMPERATURE, max_length=MAX_LENGTH):
|
|
565
569
|
"""Generate non-streaming response (fallback)"""
|
|
@@ -570,8 +574,8 @@ def generate_response_non_stream(message, history, temperature=TEMPERATURE, max_
|
|
|
570
574
|
# Simple prompt for non-streaming mode
|
|
571
575
|
prompt = message
|
|
572
576
|
if history:
|
|
573
|
-
context = "\\n".join([f"User: {
|
|
574
|
-
prompt = f"{
|
|
577
|
+
context = "\\n".join([f"User: {h}\\nAssistant: {a}" for h, a in history[-3:]])
|
|
578
|
+
prompt = f"{context}\\nUser: {message}\\nAssistant: "
|
|
575
579
|
|
|
576
580
|
inputs = tokenizer(prompt, return_tensors="pt").to(DEVICE)
|
|
577
581
|
|
|
@@ -589,17 +593,17 @@ def generate_response_non_stream(message, history, temperature=TEMPERATURE, max_
|
|
|
589
593
|
return response
|
|
590
594
|
|
|
591
595
|
except Exception as e:
|
|
592
|
-
return f"❌ Generation error: {
|
|
596
|
+
return f"❌ Generation error: {e}"
|
|
593
597
|
|
|
594
598
|
# Create enhanced chat interface
|
|
595
|
-
with gr.Blocks(title="
|
|
599
|
+
with gr.Blocks(title="__SPACE_NAME__", theme=gr.themes.Soft()) as demo:
|
|
596
600
|
gr.Markdown(f"""
|
|
597
|
-
# 🤖
|
|
601
|
+
# 🤖 __SPACE_NAME__
|
|
598
602
|
|
|
599
603
|
**Model:** `{MODEL_ID}`
|
|
600
|
-
**Hardware:**
|
|
601
|
-
**Parameters:**
|
|
602
|
-
**Streaming:**
|
|
604
|
+
**Hardware:** __HARDWARE__
|
|
605
|
+
**Parameters:** __PARAMETERS__
|
|
606
|
+
**Streaming:** __STREAMING__
|
|
603
607
|
|
|
604
608
|
---
|
|
605
609
|
""")
|
|
@@ -717,10 +721,18 @@ if __name__ == "__main__":
|
|
|
717
721
|
demo.queue()
|
|
718
722
|
demo.launch()
|
|
719
723
|
'''
|
|
724
|
+
return (
|
|
725
|
+
template
|
|
726
|
+
.replace("__MODEL_ID__", model_id)
|
|
727
|
+
.replace("__SPACE_NAME__", space_name)
|
|
728
|
+
.replace("__HARDWARE__", hardware)
|
|
729
|
+
.replace("__PARAMETERS__", parameters)
|
|
730
|
+
.replace("__STREAMING__", streaming)
|
|
731
|
+
)
|
|
720
732
|
|
|
721
733
|
def generate_embedding_template(self, model_id: str, space_name: str) -> str:
|
|
722
734
|
"""Generate optimized embedding template"""
|
|
723
|
-
|
|
735
|
+
template = """import streamlit as st
|
|
724
736
|
import torch
|
|
725
737
|
from transformers import AutoModel, AutoTokenizer
|
|
726
738
|
import numpy as np
|
|
@@ -730,14 +742,14 @@ import plotly.express as px
|
|
|
730
742
|
import plotly.graph_objects as go
|
|
731
743
|
|
|
732
744
|
# Model configuration
|
|
733
|
-
MODEL_ID = "
|
|
745
|
+
MODEL_ID = "__MODEL_ID__"
|
|
734
746
|
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
|
|
735
747
|
BATCH_SIZE = 32
|
|
736
748
|
MAX_SEQ_LENGTH = 512
|
|
737
749
|
|
|
738
|
-
st.set_page_config(page_title="
|
|
750
|
+
st.set_page_config(page_title="__SPACE_NAME__", layout="wide")
|
|
739
751
|
|
|
740
|
-
st.title(f"🔤
|
|
752
|
+
st.title(f"🔤 __SPACE_NAME__")
|
|
741
753
|
st.markdown(f"**Model:** `{MODEL_ID}`")
|
|
742
754
|
st.markdown("**Hardware:** CPU-Optimized for Embeddings")
|
|
743
755
|
|
|
@@ -749,7 +761,7 @@ def load_model():
|
|
|
749
761
|
model = SentenceTransformer(MODEL_ID)
|
|
750
762
|
return model
|
|
751
763
|
except Exception as e:
|
|
752
|
-
st.error(f"Error loading model: {
|
|
764
|
+
st.error(f"Error loading model: {e}")
|
|
753
765
|
return None
|
|
754
766
|
|
|
755
767
|
st.header("Text Embedding Service")
|
|
@@ -801,8 +813,8 @@ if st.button("🚀 Generate Embeddings", type="primary"):
|
|
|
801
813
|
})
|
|
802
814
|
|
|
803
815
|
# Show summary
|
|
804
|
-
st.write(f"✅ Generated embeddings for **{
|
|
805
|
-
st.write(f"📏 Embedding dimensions: **{
|
|
816
|
+
st.write(f"✅ Generated embeddings for **{len(texts)}** texts")
|
|
817
|
+
st.write(f"📏 Embedding dimensions: **{len(embeddings[0])}**")
|
|
806
818
|
|
|
807
819
|
# Similarity matrix
|
|
808
820
|
if len(texts) > 1:
|
|
@@ -816,8 +828,8 @@ if st.button("🚀 Generate Embeddings", type="primary"):
|
|
|
816
828
|
fig = px.imshow(
|
|
817
829
|
similarity_matrix,
|
|
818
830
|
labels=dict(x="Text", y="Text", color="Similarity"),
|
|
819
|
-
x=[f"Text {
|
|
820
|
-
y=[f"Text {
|
|
831
|
+
x=[f"Text {i+1}" for i in range(len(texts))],
|
|
832
|
+
y=[f"Text {i+1}" for i in range(len(texts))],
|
|
821
833
|
color_continuous_scale="viridis"
|
|
822
834
|
)
|
|
823
835
|
fig.update_layout(title="Text Similarity Matrix")
|
|
@@ -921,6 +933,9 @@ with col2:
|
|
|
921
933
|
st.markdown("---")
|
|
922
934
|
st.markdown("🚀 **Powered by Terradev** | Multi-Cloud GPU Arbitrage Platform")
|
|
923
935
|
"""
|
|
936
|
+
return template.replace("__MODEL_ID__", model_id).replace(
|
|
937
|
+
"__SPACE_NAME__", space_name
|
|
938
|
+
)
|
|
924
939
|
|
|
925
940
|
|
|
926
941
|
class HardwareOptimizer:
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Minimal MetricsCollector stub so optimization modules can import without error.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import time
|
|
7
|
+
from typing import Any, Dict, List, Optional
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class MetricsCollector:
|
|
13
|
+
"""Lightweight metrics collector used by the optimization layer."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, config: Optional[Any] = None):
|
|
16
|
+
self.config = config
|
|
17
|
+
self._metrics: List[Dict[str, Any]] = []
|
|
18
|
+
|
|
19
|
+
def record(self, name: str, value: float, tags: Optional[Dict[str, str]] = None) -> None:
|
|
20
|
+
entry = {"name": name, "value": value, "ts": time.time(), "tags": tags or {}}
|
|
21
|
+
self._metrics.append(entry)
|
|
22
|
+
logger.debug("metric %s=%.4f tags=%s", name, value, entry["tags"])
|
|
23
|
+
|
|
24
|
+
def increment(self, name: str, tags: Optional[Dict[str, str]] = None) -> None:
|
|
25
|
+
self.record(name, 1.0, tags)
|
|
26
|
+
|
|
27
|
+
def get_metrics(self) -> List[Dict[str, Any]]:
|
|
28
|
+
return list(self._metrics)
|
|
29
|
+
|
|
30
|
+
def reset(self) -> None:
|
|
31
|
+
self._metrics.clear()
|
|
@@ -18,6 +18,7 @@ import hashlib
|
|
|
18
18
|
import json
|
|
19
19
|
import logging
|
|
20
20
|
import os
|
|
21
|
+
import re
|
|
21
22
|
import secrets
|
|
22
23
|
import subprocess
|
|
23
24
|
import sys
|
|
@@ -33,7 +34,7 @@ try:
|
|
|
33
34
|
import aiohttp
|
|
34
35
|
except ImportError:
|
|
35
36
|
aiohttp = None # type: ignore[assignment]
|
|
36
|
-
from typing import Any, Dict, List
|
|
37
|
+
from typing import Any, Dict, List, Optional
|
|
37
38
|
from urllib.parse import urlencode
|
|
38
39
|
|
|
39
40
|
try:
|
|
@@ -6,12 +6,15 @@ Integrates Karpenter, Prometheus, Grafana, and Terradev monitoring
|
|
|
6
6
|
|
|
7
7
|
import os
|
|
8
8
|
import json
|
|
9
|
+
import logging
|
|
9
10
|
import aiohttp
|
|
10
11
|
import subprocess
|
|
11
12
|
from typing import Dict, List, Any, Optional
|
|
12
13
|
|
|
13
14
|
from .kubernetes_service import KubernetesConfig # single canonical definition
|
|
14
15
|
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
15
18
|
|
|
16
19
|
class EnhancedKubernetesService:
|
|
17
20
|
"""Enhanced Kubernetes service with deep monitoring integration"""
|
|
@@ -9,6 +9,25 @@ from typing import Dict, List, Any, Optional
|
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from datetime import datetime
|
|
11
11
|
|
|
12
|
+
try:
|
|
13
|
+
from langchain_core.messages import SystemMessage, HumanMessage
|
|
14
|
+
from langchain_openai import ChatOpenAI
|
|
15
|
+
|
|
16
|
+
def LLM(llm: str = "openai/gpt-4", temperature: float = 0.7):
|
|
17
|
+
"""Build a chat model from a 'provider/model' identifier."""
|
|
18
|
+
model = llm.split("/", 1)[-1]
|
|
19
|
+
return ChatOpenAI(model=model, temperature=temperature)
|
|
20
|
+
|
|
21
|
+
except ImportError: # pragma: no cover - optional dependency
|
|
22
|
+
SystemMessage = None # type: ignore[assignment]
|
|
23
|
+
HumanMessage = None # type: ignore[assignment]
|
|
24
|
+
|
|
25
|
+
def LLM(llm: str = "openai/gpt-4", temperature: float = 0.7):
|
|
26
|
+
raise RuntimeError(
|
|
27
|
+
"langchain-openai and langchain-core are required for LangGraph LLM nodes. "
|
|
28
|
+
"Install with: pip install langchain-openai langchain-core"
|
|
29
|
+
)
|
|
30
|
+
|
|
12
31
|
|
|
13
32
|
@dataclass
|
|
14
33
|
class LangGraphConfig:
|
|
@@ -55,7 +74,7 @@ class LangGraphService:
|
|
|
55
74
|
|
|
56
75
|
# Test LangSmith connection
|
|
57
76
|
if self.config.langsmith_api_key:
|
|
58
|
-
langsmith_session =
|
|
77
|
+
langsmith_session = self.session
|
|
59
78
|
|
|
60
79
|
url = f"{self.langsmith_api_base}/v1/organizations"
|
|
61
80
|
async with langsmith_session.get(
|
|
@@ -136,6 +155,24 @@ class LangGraphService:
|
|
|
136
155
|
# Define the workflow state
|
|
137
156
|
from langgraph.graph import StateGraph, START, END
|
|
138
157
|
|
|
158
|
+
workflow_id = (
|
|
159
|
+
f"terradev-orchestrator-{datetime.now().strftime('%Y%m%d-%H%M%S')}"
|
|
160
|
+
)
|
|
161
|
+
enhanced_config = {
|
|
162
|
+
**workflow_config,
|
|
163
|
+
"monitoring": {
|
|
164
|
+
"enabled": self.config.dashboard_enabled,
|
|
165
|
+
"tracing": self.config.tracing_enabled,
|
|
166
|
+
"evaluation": self.config.evaluation_enabled,
|
|
167
|
+
"deployment": self.config.deployment_enabled,
|
|
168
|
+
"observability": self.config.observability_enabled,
|
|
169
|
+
},
|
|
170
|
+
"langsmith": {
|
|
171
|
+
"project": self.config.project_name or "terradev",
|
|
172
|
+
"workspace_id": self.config.workspace_id,
|
|
173
|
+
},
|
|
174
|
+
}
|
|
175
|
+
|
|
139
176
|
# Enhanced state with monitoring
|
|
140
177
|
class WorkflowState:
|
|
141
178
|
topic: str
|
|
@@ -473,7 +473,7 @@ class AutoOptimizer:
|
|
|
473
473
|
base_confidence += 0.05
|
|
474
474
|
|
|
475
475
|
# Adjust based on historical performance
|
|
476
|
-
if deployment_id in self.optimization_history:
|
|
476
|
+
if context.deployment_id in self.optimization_history:
|
|
477
477
|
historical_success = self._calculate_historical_success_rate(
|
|
478
478
|
context.deployment_id
|
|
479
479
|
)
|
|
@@ -322,7 +322,7 @@ class AlibabaProvider(BaseProvider):
|
|
|
322
322
|
# ── Provisioning ──────────────────────────────────────────────────
|
|
323
323
|
|
|
324
324
|
async def provision_instance(
|
|
325
|
-
self, instance_type: str, region: str, gpu_type: str
|
|
325
|
+
self, instance_type: str, region: str, gpu_type: str, ssh_public_key: str = ""
|
|
326
326
|
) -> Dict[str, Any]:
|
|
327
327
|
"""Provision Alibaba instance with compliance checks"""
|
|
328
328
|
# CRITICAL: Check compliance before provisioning
|