argus-cloud-optimizer 0.2.0__tar.gz → 0.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {argus_cloud_optimizer-0.2.0/argus_cloud_optimizer.egg-info → argus_cloud_optimizer-0.4.1}/PKG-INFO +238 -47
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/README.md +233 -44
- argus_cloud_optimizer-0.4.1/accounts.yaml.example +58 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/adapter.py +3 -1
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/monitor.py +85 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/resource_graph.py +2 -2
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/retry.py +1 -1
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/adapter.py +6 -3
- argus_cloud_optimizer-0.4.1/adapters/gcp/asset_inventory.py +168 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/cloud_logging.py +1 -2
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/cloud_monitoring.py +183 -2
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/anthropic.py +1 -2
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/azure_openai.py +16 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/vertexai.py +6 -3
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1/argus_cloud_optimizer.egg-info}/PKG-INFO +238 -47
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/SOURCES.txt +3 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/requires.txt +4 -1
- argus_cloud_optimizer-0.4.1/core/__version__.py +1 -0
- argus_cloud_optimizer-0.4.1/core/agent/chat.py +532 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/agent/loop.py +7 -1
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/agent/prompts.py +130 -60
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/config.py +14 -24
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/delivery.py +19 -9
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/export.py +1 -1
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/generator.py +135 -1
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/html.py +31 -1
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/multi_cloud.py +1 -3
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/secrets.py +4 -6
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/token_tracker.py +2 -5
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/validation.py +19 -10
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/aws/multi-account/spoke-role.yaml +1 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/aws/single-account/template.yaml +1 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/gcp/deploy.sh +34 -2
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/ai-providers.md +25 -3
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/contributing/development.md +13 -8
- argus_cloud_optimizer-0.4.1/docs/deployment/azure.md +279 -0
- argus_cloud_optimizer-0.4.1/docs/deployment/gcp.md +259 -0
- argus_cloud_optimizer-0.4.1/docs/deployment/multi-account.md +407 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/getting-started/configuration.md +16 -3
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/getting-started/index.md +4 -3
- argus_cloud_optimizer-0.4.1/docs/getting-started/quickstart.md +249 -0
- argus_cloud_optimizer-0.4.1/docs/index.md +441 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/env-vars.md +3 -4
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/iam-permissions.md +1 -1
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/index.md +2 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/security.md +1 -1
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/troubleshooting.md +25 -4
- argus_cloud_optimizer-0.4.1/docs/roadmap.md +80 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/entrypoints/aws_lambda.py +50 -12
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/entrypoints/azure_function.py +56 -11
- argus_cloud_optimizer-0.4.1/entrypoints/cli.py +387 -0
- argus_cloud_optimizer-0.4.1/entrypoints/cli_chat.py +344 -0
- argus_cloud_optimizer-0.4.1/entrypoints/gcp_cloudrun.py +431 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/pyproject.toml +7 -10
- argus_cloud_optimizer-0.2.0/accounts.yaml.example +0 -25
- argus_cloud_optimizer-0.2.0/adapters/gcp/asset_inventory.py +0 -116
- argus_cloud_optimizer-0.2.0/core/__version__.py +0 -1
- argus_cloud_optimizer-0.2.0/docs/deployment/azure.md +0 -114
- argus_cloud_optimizer-0.2.0/docs/deployment/gcp.md +0 -77
- argus_cloud_optimizer-0.2.0/docs/deployment/multi-account.md +0 -98
- argus_cloud_optimizer-0.2.0/docs/getting-started/quickstart.md +0 -138
- argus_cloud_optimizer-0.2.0/docs/index.md +0 -210
- argus_cloud_optimizer-0.2.0/entrypoints/cli.py +0 -156
- argus_cloud_optimizer-0.2.0/entrypoints/gcp_cloudrun.py +0 -209
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/.env.example +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/LICENSE +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/MANIFEST.in +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/auth.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/cloudtrail.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/cloudwatch.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/config.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/cost_explorer.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/resource_explorer.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/retry.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/activity_log.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/adapter.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/cost_management.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/base.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/billing.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/retry.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/base.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/bedrock.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/dependency_links.txt +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/entry_points.txt +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/top_level.txt +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/agent/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/log.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/models/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/models/finding.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/py.typed +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/comparison.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/aws/multi-account/hub/template.yaml +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/azure/function-app.bicep +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/adapters.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/ai-reasoning.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/how-it-works.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/index.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/contributing/index.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/contributing/new-adapter.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/contributing/new-ai-provider.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/deployment/aws.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/deployment/index.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/getting-started/first-scan.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/report-schema.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/resource-types.md +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/entrypoints/__init__.py +0 -0
- {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/setup.cfg +0 -0
{argus_cloud_optimizer-0.2.0/argus_cloud_optimizer.egg-info → argus_cloud_optimizer-0.4.1}/PKG-INFO
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: argus-cloud-optimizer
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: AI
|
|
3
|
+
Version: 0.4.1
|
|
4
|
+
Summary: Argus — AI Cloud Detective for AWS, GCP, and Azure
|
|
5
5
|
Author-email: Vamshi Siddarth Gaddam <vamshisiddarth02@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/vamshisiddarth/argus
|
|
@@ -42,6 +42,8 @@ Requires-Dist: openai>=1.55.0
|
|
|
42
42
|
Provides-Extra: export
|
|
43
43
|
Requires-Dist: weasyprint>=62.0; extra == "export"
|
|
44
44
|
Requires-Dist: python-pptx>=1.0.0; extra == "export"
|
|
45
|
+
Provides-Extra: chat
|
|
46
|
+
Requires-Dist: rich>=13.0.0; extra == "chat"
|
|
45
47
|
Provides-Extra: dev
|
|
46
48
|
Requires-Dist: pytest>=8.3.3; extra == "dev"
|
|
47
49
|
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
@@ -50,7 +52,7 @@ Requires-Dist: pytest-timeout>=2.3.1; extra == "dev"
|
|
|
50
52
|
Requires-Dist: moto[s3,sts]>=5.0.16; extra == "dev"
|
|
51
53
|
Requires-Dist: freezegun>=1.5.1; extra == "dev"
|
|
52
54
|
Requires-Dist: black>=24.10.0; extra == "dev"
|
|
53
|
-
Requires-Dist: ruff
|
|
55
|
+
Requires-Dist: ruff<0.8.0,>=0.7.1; extra == "dev"
|
|
54
56
|
Requires-Dist: mypy>=1.13.0; extra == "dev"
|
|
55
57
|
Requires-Dist: types-PyYAML>=6.0.12; extra == "dev"
|
|
56
58
|
Requires-Dist: types-python-dateutil>=2.9.0; extra == "dev"
|
|
@@ -60,22 +62,55 @@ Requires-Dist: mkdocs-minify-plugin>=0.8.0; extra == "dev"
|
|
|
60
62
|
Dynamic: license-file
|
|
61
63
|
|
|
62
64
|
<p align="center">
|
|
63
|
-
<img src="docs/assets/images/logo
|
|
65
|
+
<img src="docs/assets/images/logo.svg" alt="Argus" height="72">
|
|
64
66
|
</p>
|
|
65
67
|
|
|
66
|
-
<p align="center"><strong>
|
|
68
|
+
<p align="center"><strong>Argus — AI Cloud Detective for AWS, GCP, and Azure.</strong></p>
|
|
67
69
|
|
|
68
|
-
Argus
|
|
70
|
+
Argus is an open-source AI Cloud Detective — it hunts idle and wasted cloud resources across AWS, GCP, and Azure (stopped EC2 instances, unattached EBS volumes, orphaned Elastic IPs, underutilized RDS databases) and delivers a prioritized, AI-reasoned report to Slack every week. No rules. No thresholds. Just reasoning.
|
|
69
71
|
|
|
70
72
|
[](https://github.com/vamshisiddarth/argus/actions/workflows/ci.yml)
|
|
71
|
-
[](https://github.com/vamshisiddarth/argus/actions/workflows/publish.yml)
|
|
72
74
|
[](https://pypi.org/project/argus-cloud-optimizer/)
|
|
75
|
+
[](https://pypi.org/project/argus-cloud-optimizer/)
|
|
76
|
+
[](https://www.python.org/downloads/)
|
|
73
77
|
[](LICENSE)
|
|
74
78
|
[](https://vamshisiddarth.github.io/argus/)
|
|
75
79
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
80
|
+
```text
|
|
81
|
+
Argus — AWS Waste Report (2026-06-24)
|
|
82
|
+
|
|
83
|
+
💸 $1,432.85/month estimated waste
|
|
84
|
+
📊 6 idle resources across 1 account
|
|
85
|
+
|
|
86
|
+
Six resources were identified as idle or over-provisioned. The RDS instance
|
|
87
|
+
accounts for 87% of waste and should be right-sized immediately.
|
|
88
|
+
|
|
89
|
+
─────────────────────────────────────
|
|
90
|
+
Top findings
|
|
91
|
+
🔴 db-analytics-01 · RDS · $1,240.00/mo
|
|
92
|
+
🔴 cache-prod-001 · ElastiCache · $142.00/mo
|
|
93
|
+
🔴 i-0abc123def · EC2 · $28.40/mo
|
|
94
|
+
🟡 nat-0def456 · NAT Gateway · $10.80/mo
|
|
95
|
+
🟡 vol-orphan · EBS · $8.00/mo
|
|
96
|
+
⚪ +1 more finding in the full report
|
|
97
|
+
|
|
98
|
+
[ 📄 Full report (HTML) ] [ vamshisiddarth/argus ]
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 🆕 What's new in v0.4.1
|
|
104
|
+
|
|
105
|
+
> **Biggest release yet.** Argus jumps from scheduled reporter to a conversational FinOps companion.
|
|
106
|
+
|
|
107
|
+
- **Interactive chat mode** — `argus chat` lets you ask natural-language questions about your cloud costs and get intelligent, context-aware answers backed by real metrics and cost data.
|
|
108
|
+
- **True multi-cloud, multi-account** — GCP multi-project and Azure multi-subscription support with unified reporting across all accounts in a single run.
|
|
109
|
+
- **Expanded resource coverage** — 31 GCP resource types (up from 22) and 40 Azure resource types (up from 26), all with curated metric mappings.
|
|
110
|
+
- **Chat UX polish** — live spinner updates per tool call, AI-generated context summaries, turn-safe history trimming, and rich terminal formatting via `pip install argus-cloud-optimizer[chat]`.
|
|
111
|
+
- **Docs overhaul** — new architecture diagram, corrected IAM permissions for all three clouds, and accurate env-var reference.
|
|
112
|
+
|
|
113
|
+
[Full changelog →](CHANGELOG.md)
|
|
79
114
|
|
|
80
115
|
---
|
|
81
116
|
|
|
@@ -88,28 +123,9 @@ Every week (or on demand), Argus:
|
|
|
88
123
|
3. **Reasons** about idleness using Claude (via AWS Bedrock, Anthropic API, or Vertex AI) — no hardcoded thresholds
|
|
89
124
|
4. **Reports** a compact digest (Slack, Microsoft Teams, or generic webhook) with top findings and a link to a full self-contained HTML report
|
|
90
125
|
|
|
91
|
-
Example Slack output:
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
Argus — AWS Waste Report (2026-06-17)
|
|
95
|
-
|
|
96
|
-
💸 $42.65/month estimated waste 📊 4 idle resources across 1 account
|
|
97
|
-
|
|
98
|
-
Two stopped EC2 instances and a forgotten NAT Gateway account for 72% of
|
|
99
|
-
total waste. One EBS volume has had no I/O in over 30 days.
|
|
100
|
-
|
|
101
|
-
Top findings
|
|
102
|
-
🔴 i-0abc123def · EC2 t3.large · $28.40/mo
|
|
103
|
-
🔴 nat-0def456 · NAT Gateway · $10.80/mo
|
|
104
|
-
🟡 vol-orphan · EBS gp3 100GiB · $8.00/mo
|
|
105
|
-
🟢 eipalloc-xyz · Elastic IP · $3.65/mo
|
|
106
|
-
|
|
107
|
-
[ 📄 Full report (HTML) ] [ vamshisiddarth/argus ]
|
|
108
|
-
```
|
|
109
|
-
|
|
110
126
|
The **Full report** button links to a self-contained HTML file (S3 / GCS / Azure Blob) with a filterable/sortable table and expandable AI reasoning per finding. Works offline, no login required.
|
|
111
127
|
|
|
112
|
-
> **See
|
|
128
|
+
> **See realistic examples:** [`sample-report-aws.json`](examples/sample-report-aws.json) · [`sample-report-gcp.json`](examples/sample-report-gcp.json) · [`sample-report-azure.json`](examples/sample-report-azure.json) — 5 findings each with AI-written reasoning, metrics, and cost data.
|
|
113
129
|
|
|
114
130
|
---
|
|
115
131
|
|
|
@@ -164,22 +180,48 @@ docker run --rm \
|
|
|
164
180
|
|
|
165
181
|
```bash
|
|
166
182
|
pip install argus-cloud-optimizer
|
|
183
|
+
argus --version # argus 0.4.1
|
|
184
|
+
argus --help
|
|
167
185
|
```
|
|
168
186
|
|
|
169
|
-
One package — all three clouds included. No extras needed.
|
|
187
|
+
One package — all three clouds included. No extras needed. `--cloud` auto-detects from your environment (GCP_PROJECT_ID / AZURE_SUBSCRIPTION_IDS / AWS credentials), or specify explicitly.
|
|
188
|
+
|
|
189
|
+
> **Verified 2026-06-24:** `pip install argus-cloud-optimizer && argus --version` works on a clean Python 3.11/3.12/3.13 venv with no project files.
|
|
170
190
|
|
|
171
|
-
|
|
191
|
+
**AWS:**
|
|
172
192
|
|
|
173
|
-
|
|
193
|
+
```bash
|
|
194
|
+
export AI_PROVIDER=anthropic
|
|
195
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
196
|
+
export DRY_RUN=true
|
|
197
|
+
argus scan --cloud aws --dry-run
|
|
198
|
+
# or just: argus scan (auto-detects from AWS_PROFILE / AWS_ACCESS_KEY_ID)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
> Enable [Resource Explorer](https://docs.aws.amazon.com/resource-explorer/latest/userguide/) with an **aggregator index** in `us-east-1` (or set `RESOURCE_EXPLORER_REGION`).
|
|
202
|
+
|
|
203
|
+
**GCP:**
|
|
174
204
|
|
|
175
205
|
```bash
|
|
206
|
+
export GCP_PROJECT_ID=my-project-123
|
|
176
207
|
export AI_PROVIDER=anthropic
|
|
177
208
|
export ANTHROPIC_API_KEY=sk-ant-...
|
|
178
|
-
export DRY_RUN=true
|
|
209
|
+
export DRY_RUN=true
|
|
210
|
+
argus scan --cloud gcp --dry-run
|
|
211
|
+
# or just: argus scan (auto-detects from GCP_PROJECT_ID)
|
|
179
212
|
```
|
|
180
213
|
|
|
214
|
+
> Requires BigQuery billing export enabled for cost data.
|
|
215
|
+
|
|
216
|
+
**Azure:**
|
|
217
|
+
|
|
181
218
|
```bash
|
|
182
|
-
|
|
219
|
+
export AZURE_SUBSCRIPTION_IDS=sub-id-1,sub-id-2
|
|
220
|
+
export AI_PROVIDER=anthropic
|
|
221
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
222
|
+
export DRY_RUN=true
|
|
223
|
+
argus scan --cloud azure --dry-run
|
|
224
|
+
# or just: argus scan (auto-detects from AZURE_SUBSCRIPTION_IDS)
|
|
183
225
|
```
|
|
184
226
|
|
|
185
227
|
### Option C — Clone and develop
|
|
@@ -192,18 +234,80 @@ cp .env.example .env # edit with your values
|
|
|
192
234
|
argus --cloud aws --run-now
|
|
193
235
|
```
|
|
194
236
|
|
|
237
|
+
### Interactive Chat Mode
|
|
238
|
+
|
|
239
|
+
Ask questions about your cloud infrastructure in natural language:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
pip install argus-cloud-optimizer[chat] # optional: adds rich formatting
|
|
243
|
+
argus chat --cloud aws --ai-provider anthropic # explicit cloud
|
|
244
|
+
argus chat # auto-detects cloud
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
Argus v0.4.1 — AI Cloud Detective
|
|
249
|
+
Cloud: AWS | Accounts: prod (123456789012) | Budget: $1.00/session
|
|
250
|
+
Tip: end a line with \ to continue on the next line.
|
|
251
|
+
Type your question, or /help for commands.
|
|
252
|
+
|
|
253
|
+
argus> What's costing the most and not doing anything?
|
|
254
|
+
|
|
255
|
+
→ Scanning resources
|
|
256
|
+
→ Fetching cost data
|
|
257
|
+
|
|
258
|
+
Argus: Three idle resources account for $73.30/mo in waste:
|
|
259
|
+
• nat-0abc123 (NAT Gateway, us-east-1) — $32.50/mo — 847 bytes in 90 days, delete it
|
|
260
|
+
• db-prod-replica (RDS, us-west-2) — $28.80/mo — zero connections, read replica with no readers
|
|
261
|
+
• vol-0def456 (EBS, us-east-1) — $12.00/mo — unattached since 2026-03-15
|
|
262
|
+
|
|
263
|
+
[this turn: 2,847 in / 412 out, $0.0147 | session: 2,847 in / 412 out, $0.0147 / $1.00 budget]
|
|
264
|
+
|
|
265
|
+
argus> Is the RDS replica definitely safe to delete?
|
|
266
|
+
|
|
267
|
+
→ Fetching metrics: db-prod-replica
|
|
268
|
+
→ Checking last activity: db-prod-replica
|
|
269
|
+
|
|
270
|
+
Argus: Yes. db-prod-replica is confirmed idle — CPU avg 0.1%, DatabaseConnections avg 0,
|
|
271
|
+
last activity 2026-03-21 (93 days ago). The primary db-prod is fully active; this replica
|
|
272
|
+
has no readers. Safe to snapshot and delete. Saves $28.80/mo.
|
|
273
|
+
|
|
274
|
+
[this turn: 1,923 in / 187 out, $0.0089 | session: 4,770 in / 599 out, $0.0236 / $1.00 budget]
|
|
275
|
+
|
|
276
|
+
argus> What would our total monthly bill look like after cleaning all three up?
|
|
277
|
+
|
|
278
|
+
Argus: Current waste: $73.30/mo across the three resources. Deleting all three saves
|
|
279
|
+
$879.60/year. Your remaining infrastructure cost is unchanged — none of these have
|
|
280
|
+
active dependencies based on metrics and activity logs.
|
|
281
|
+
|
|
282
|
+
[this turn: 1,102 in / 98 out, $0.0047 | session: 5,872 in / 697 out, $0.0283 / $1.00 budget]
|
|
283
|
+
|
|
284
|
+
argus> /summary
|
|
285
|
+
Summarizing conversation...
|
|
286
|
+
Done — earlier turns condensed into context.
|
|
287
|
+
|
|
288
|
+
argus> Remind me which one had the highest monthly cost?
|
|
289
|
+
|
|
290
|
+
Argus: nat-0abc123 (NAT Gateway, us-east-1) at $32.50/mo — negligible traffic over 90 days.
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
Available REPL commands: `/help`, `/scan`, `/cost`, `/clear`, `/summary`, `/quit`
|
|
294
|
+
|
|
195
295
|
### CLI Options
|
|
196
296
|
|
|
197
297
|
```
|
|
198
|
-
argus --cloud aws|gcp|azure
|
|
298
|
+
argus scan [--cloud aws|gcp|azure] [options] # full batch scan
|
|
299
|
+
argus chat [--cloud aws|gcp|azure] [options] # interactive Q&A
|
|
300
|
+
argus --run-now --cloud aws [options] # backward compat
|
|
199
301
|
|
|
302
|
+
--cloud CLOUD Cloud provider (auto-detected from env vars if omitted)
|
|
200
303
|
-V, --version Show version and exit
|
|
201
304
|
--dry-run Print notification payload instead of posting
|
|
202
305
|
--ignore-regions REGIONS Comma-separated regions to skip (e.g. ap-east-1,me-south-1)
|
|
203
306
|
--ai-provider PROVIDER anthropic | bedrock | vertexai | azure_openai (default: anthropic)
|
|
204
|
-
--accounts PATH Path to accounts.yaml for multi-account mode
|
|
307
|
+
--accounts PATH Path to accounts.yaml for multi-account/project/subscription mode
|
|
205
308
|
--max-resources N Maximum resources to analyze per scan (default: 200)
|
|
206
309
|
--lookback-days DAYS Metrics lookback window in days (default: 90, use 14 for faster local dev)
|
|
310
|
+
--llm-budget USD Cost budget per scan/session (default: $2.00 scan, $1.00 chat)
|
|
207
311
|
```
|
|
208
312
|
|
|
209
313
|
---
|
|
@@ -299,9 +403,11 @@ Set `AI_PROVIDER=anthropic|bedrock|vertexai|azure_openai` in `.env` or the deplo
|
|
|
299
403
|
|
|
300
404
|
---
|
|
301
405
|
|
|
302
|
-
## Multi-account setup
|
|
406
|
+
## Multi-account / multi-project setup
|
|
407
|
+
|
|
408
|
+
Create `accounts.yaml` with the key matching your cloud:
|
|
303
409
|
|
|
304
|
-
|
|
410
|
+
**AWS** (hub/spoke with STS AssumeRole):
|
|
305
411
|
|
|
306
412
|
```yaml
|
|
307
413
|
mode: multi
|
|
@@ -315,10 +421,40 @@ accounts:
|
|
|
315
421
|
role_arn: arn:aws:iam::444455556666:role/ArgusSpokeRole
|
|
316
422
|
```
|
|
317
423
|
|
|
424
|
+
**GCP** (one scan per project, ADC handles auth):
|
|
425
|
+
|
|
426
|
+
```yaml
|
|
427
|
+
mode: multi
|
|
428
|
+
|
|
429
|
+
projects:
|
|
430
|
+
- id: my-project-dev
|
|
431
|
+
name: dev
|
|
432
|
+
- id: my-project-prod
|
|
433
|
+
name: production
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
Or set `GCP_PROJECT_IDS=my-project-dev,my-project-prod` instead.
|
|
437
|
+
|
|
438
|
+
**Azure** (cross-subscription via Resource Graph):
|
|
439
|
+
|
|
440
|
+
```yaml
|
|
441
|
+
mode: multi
|
|
442
|
+
|
|
443
|
+
subscriptions:
|
|
444
|
+
- id: "aaaabbbb-cccc-dddd-eeee-ffffffffffff"
|
|
445
|
+
name: dev
|
|
446
|
+
- id: "11112222-3333-4444-5555-666677778888"
|
|
447
|
+
name: production
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
Or set `AZURE_SUBSCRIPTION_IDS=sub-1,sub-2` instead.
|
|
451
|
+
|
|
318
452
|
Then run:
|
|
319
453
|
|
|
320
454
|
```bash
|
|
321
|
-
argus --cloud aws --
|
|
455
|
+
argus scan --cloud aws --accounts accounts.yaml
|
|
456
|
+
argus scan --cloud gcp --accounts accounts.yaml
|
|
457
|
+
argus scan --cloud azure --accounts accounts.yaml
|
|
322
458
|
```
|
|
323
459
|
|
|
324
460
|
---
|
|
@@ -347,13 +483,64 @@ No write permissions are ever requested.
|
|
|
347
483
|
|
|
348
484
|
---
|
|
349
485
|
|
|
486
|
+
## IAM permissions (GCP)
|
|
487
|
+
|
|
488
|
+
Argus needs **read-only** access. The service account (`argus-sa@PROJECT.iam.gserviceaccount.com`) requires:
|
|
489
|
+
|
|
490
|
+
```
|
|
491
|
+
cloudasset.assets.listAssets # list all resources (Asset Inventory API)
|
|
492
|
+
monitoring.timeSeries.list # read CPU / memory / request metrics
|
|
493
|
+
monitoring.metricDescriptors.list # discover available metric types
|
|
494
|
+
logging.logEntries.list # read Cloud Audit Logs for last-activity timestamps
|
|
495
|
+
bigquery.jobs.create # only if BILLING_BQ_TABLE is set
|
|
496
|
+
bigquery.tables.getData # only if BILLING_BQ_TABLE is set
|
|
497
|
+
aiplatform.endpoints.predict # only if AI_PROVIDER=vertexai (default)
|
|
498
|
+
storage.objects.create # only if REPORT_GCS_BUCKET is set
|
|
499
|
+
storage.objects.get # only if REPORT_GCS_BUCKET is set
|
|
500
|
+
iam.serviceAccounts.signBlob # only if REPORT_GCS_BUCKET is set
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
No write permissions are ever requested.
|
|
504
|
+
|
|
505
|
+
The deploy script binds `roles/cloudasset.viewer`, `roles/monitoring.viewer`, and `roles/logging.viewer` automatically. For a tighter permission surface, create a custom role using only the exact permissions above — see [GCP deployment docs](docs/deployment/gcp.md#iam-permissions) for the one-command setup.
|
|
506
|
+
|
|
507
|
+
> **BigQuery note:** without `BILLING_BQ_TABLE`, cost fields show `$0.00` — resource
|
|
508
|
+
> discovery and idleness detection still work via metrics and audit logs.
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## IAM permissions (Azure)
|
|
513
|
+
|
|
514
|
+
Argus needs **read-only** access. The Managed Identity requires:
|
|
515
|
+
|
|
516
|
+
```
|
|
517
|
+
Microsoft.ResourceGraph/resources/action # list all resources (Resource Graph KQL)
|
|
518
|
+
Microsoft.Insights/metrics/read # read CPU / memory / request metrics
|
|
519
|
+
Microsoft.Insights/metricDefinitions/read # discover available metric types
|
|
520
|
+
Microsoft.Insights/eventtypes/management/values/read # Activity Log fallback for last-activity
|
|
521
|
+
Microsoft.CostManagement/query/action # run cost queries
|
|
522
|
+
Microsoft.CostManagement/*/read # read cost data
|
|
523
|
+
Microsoft.OperationalInsights/workspaces/query/read # only if logAnalyticsWorkspaceId is set
|
|
524
|
+
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write # only if reportStorageAccount is set
|
|
525
|
+
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read # only if reportStorageAccount is set
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
No write permissions are ever requested.
|
|
529
|
+
|
|
530
|
+
The built-in `Reader` + `Cost Management Reader` roles cover all required actions per subscription. For a tighter permission surface, create a custom role using only the exact actions above — see [Azure deployment docs](docs/deployment/azure.md#iam-permissions) for the one-command setup.
|
|
531
|
+
|
|
532
|
+
> **Cost Management note:** `Reader` covers `*/read` but cost queries use a `query/action`
|
|
533
|
+
> verb. `Cost Management Reader` must be added separately — without it, cost fields show `$0.00`.
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
350
537
|
## Limitations & known issues
|
|
351
538
|
|
|
352
539
|
Before you invest time deploying Argus, know what it **can't** do yet:
|
|
353
540
|
|
|
354
541
|
| Area | Status | Details |
|
|
355
542
|
|------|--------|---------|
|
|
356
|
-
| **Resource discovery** |
|
|
543
|
+
| **Resource discovery** | All three strong | AWS covers 43 resource types via Resource Explorer. GCP covers 31 asset types via Asset Inventory. Azure discovers all types via Resource Graph with 40 having curated metric mappings. All three fall back to dynamic metric auto-discovery for unmapped types. AWS has the deepest per-type metric coverage; GCP and Azure are catching up. |
|
|
357
544
|
| **Cost accuracy** | Best-effort | AWS Cost Explorer charges $0.01/API call — Argus batches aggressively (max 2 calls/scan). GCP requires BigQuery billing export enabled. Azure cost data depends on subscription-level access. Resource-level cost allocation must be enabled in AWS for per-resource costs; without it, costs show $0.00. |
|
|
358
545
|
| **AI non-determinism** | By design | The AI decides what's idle — different runs may produce slightly different findings or reasoning. Set `AI_TEMPERATURE=0.0` (default) for most consistent results. |
|
|
359
546
|
| **LLM cost** | Configurable | A full scan of ~200 resources costs ~$0.05–$0.50 in LLM API fees depending on provider. Use `--llm-budget` to set a hard cap (default: $2.00/scan). Large estates (1000+ resources) will hit the budget limit — increase it or use `--max-resources`. |
|
|
@@ -362,16 +549,20 @@ Before you invest time deploying Argus, know what it **can't** do yet:
|
|
|
362
549
|
| **Multi-cloud in one scan** | Not yet | Each `argus` invocation scans one cloud. Use the merge report feature (`core/reports/multi_cloud.py`) to combine results after separate runs. |
|
|
363
550
|
| **Notifications** | Slack + Teams + webhook | No email. Slack/Teams delivery requires a webhook URL. |
|
|
364
551
|
|
|
552
|
+
### Multi-cloud maturity
|
|
553
|
+
|
|
554
|
+
AWS has the richest experience — it was developed first, has the most resource types with curated metric mappings, and has a mature multi-account hub/spoke deployment model. GCP and Azure are fully functional but the AWS adapter has been battle-tested more extensively. Cost data depth also varies: AWS Cost Explorer with resource-level allocation is the most reliable, GCP requires BigQuery billing export to be configured, and Azure Cost Management depends on subscription-level access. All three clouds have dynamic metric fallback for unmapped resource types, so even uncurated types get some signal.
|
|
555
|
+
|
|
365
556
|
### Multi-cloud parity
|
|
366
557
|
|
|
367
558
|
| Capability | AWS | GCP | Azure |
|
|
368
559
|
|-----------|-----|-----|-------|
|
|
369
|
-
| Resource discovery | 43 types (Resource Explorer) |
|
|
370
|
-
| Metrics | CloudWatch (43 types + fallback) | Cloud Monitoring (
|
|
560
|
+
| Resource discovery | 43 types (Resource Explorer) | 31 types (Asset Inventory) | All types (Resource Graph) |
|
|
561
|
+
| Metrics | CloudWatch (43 types + fallback) | Cloud Monitoring (31 types + fallback) | Azure Monitor (40 types + fallback) |
|
|
371
562
|
| Cost data | Cost Explorer (batched) | BigQuery billing export | Cost Management API |
|
|
372
563
|
| Last activity | CloudTrail (90-day lookback) | Cloud Audit Logs | Activity Log / Log Analytics |
|
|
373
564
|
| Deployment | Lambda (SAM) | Cloud Run Job | Azure Function (Bicep) |
|
|
374
|
-
| Multi-account | Hub/spoke with STS |
|
|
565
|
+
| Multi-account | Hub/spoke with STS | Multi-project (per-project scan) | Cross-subscription via Resource Graph |
|
|
375
566
|
| Secret management | Secrets Manager | Secret Manager | Key Vault |
|
|
376
567
|
|
|
377
568
|
---
|
|
@@ -379,9 +570,9 @@ Before you invest time deploying Argus, know what it **can't** do yet:
|
|
|
379
570
|
## Running tests
|
|
380
571
|
|
|
381
572
|
```bash
|
|
382
|
-
make test # unit tests only (
|
|
573
|
+
make test # unit tests only (528 tests, no cloud creds needed)
|
|
383
574
|
make test-integration # integration tests (32 tests — adapter contracts, report schema)
|
|
384
|
-
make test-all # everything (
|
|
575
|
+
make test-all # everything (560 tests)
|
|
385
576
|
```
|
|
386
577
|
|
|
387
578
|
Tests use `unittest.mock` throughout — no real AWS/GCP/Azure calls are made.
|
|
@@ -417,7 +608,7 @@ argus/
|
|
|
417
608
|
│ ├── aws/ # CloudFormation templates
|
|
418
609
|
│ ├── gcp/ # Cloud Run + Scheduler deploy script
|
|
419
610
|
│ └── azure/ # Bicep templates
|
|
420
|
-
└── tests/ #
|
|
611
|
+
└── tests/ # 560 tests, all pass offline
|
|
421
612
|
```
|
|
422
613
|
|
|
423
614
|
---
|