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.
Files changed (114) hide show
  1. {argus_cloud_optimizer-0.2.0/argus_cloud_optimizer.egg-info → argus_cloud_optimizer-0.4.1}/PKG-INFO +238 -47
  2. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/README.md +233 -44
  3. argus_cloud_optimizer-0.4.1/accounts.yaml.example +58 -0
  4. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/adapter.py +3 -1
  5. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/monitor.py +85 -0
  6. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/resource_graph.py +2 -2
  7. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/retry.py +1 -1
  8. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/adapter.py +6 -3
  9. argus_cloud_optimizer-0.4.1/adapters/gcp/asset_inventory.py +168 -0
  10. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/cloud_logging.py +1 -2
  11. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/cloud_monitoring.py +183 -2
  12. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/anthropic.py +1 -2
  13. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/azure_openai.py +16 -0
  14. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/vertexai.py +6 -3
  15. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1/argus_cloud_optimizer.egg-info}/PKG-INFO +238 -47
  16. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/SOURCES.txt +3 -0
  17. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/requires.txt +4 -1
  18. argus_cloud_optimizer-0.4.1/core/__version__.py +1 -0
  19. argus_cloud_optimizer-0.4.1/core/agent/chat.py +532 -0
  20. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/agent/loop.py +7 -1
  21. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/agent/prompts.py +130 -60
  22. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/config.py +14 -24
  23. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/delivery.py +19 -9
  24. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/export.py +1 -1
  25. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/generator.py +135 -1
  26. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/html.py +31 -1
  27. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/multi_cloud.py +1 -3
  28. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/secrets.py +4 -6
  29. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/token_tracker.py +2 -5
  30. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/validation.py +19 -10
  31. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/aws/multi-account/spoke-role.yaml +1 -0
  32. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/aws/single-account/template.yaml +1 -0
  33. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/gcp/deploy.sh +34 -2
  34. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/ai-providers.md +25 -3
  35. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/contributing/development.md +13 -8
  36. argus_cloud_optimizer-0.4.1/docs/deployment/azure.md +279 -0
  37. argus_cloud_optimizer-0.4.1/docs/deployment/gcp.md +259 -0
  38. argus_cloud_optimizer-0.4.1/docs/deployment/multi-account.md +407 -0
  39. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/getting-started/configuration.md +16 -3
  40. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/getting-started/index.md +4 -3
  41. argus_cloud_optimizer-0.4.1/docs/getting-started/quickstart.md +249 -0
  42. argus_cloud_optimizer-0.4.1/docs/index.md +441 -0
  43. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/env-vars.md +3 -4
  44. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/iam-permissions.md +1 -1
  45. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/index.md +2 -0
  46. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/security.md +1 -1
  47. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/troubleshooting.md +25 -4
  48. argus_cloud_optimizer-0.4.1/docs/roadmap.md +80 -0
  49. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/entrypoints/aws_lambda.py +50 -12
  50. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/entrypoints/azure_function.py +56 -11
  51. argus_cloud_optimizer-0.4.1/entrypoints/cli.py +387 -0
  52. argus_cloud_optimizer-0.4.1/entrypoints/cli_chat.py +344 -0
  53. argus_cloud_optimizer-0.4.1/entrypoints/gcp_cloudrun.py +431 -0
  54. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/pyproject.toml +7 -10
  55. argus_cloud_optimizer-0.2.0/accounts.yaml.example +0 -25
  56. argus_cloud_optimizer-0.2.0/adapters/gcp/asset_inventory.py +0 -116
  57. argus_cloud_optimizer-0.2.0/core/__version__.py +0 -1
  58. argus_cloud_optimizer-0.2.0/docs/deployment/azure.md +0 -114
  59. argus_cloud_optimizer-0.2.0/docs/deployment/gcp.md +0 -77
  60. argus_cloud_optimizer-0.2.0/docs/deployment/multi-account.md +0 -98
  61. argus_cloud_optimizer-0.2.0/docs/getting-started/quickstart.md +0 -138
  62. argus_cloud_optimizer-0.2.0/docs/index.md +0 -210
  63. argus_cloud_optimizer-0.2.0/entrypoints/cli.py +0 -156
  64. argus_cloud_optimizer-0.2.0/entrypoints/gcp_cloudrun.py +0 -209
  65. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/.env.example +0 -0
  66. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/LICENSE +0 -0
  67. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/MANIFEST.in +0 -0
  68. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/__init__.py +0 -0
  69. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/__init__.py +0 -0
  70. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/auth.py +0 -0
  71. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/cloudtrail.py +0 -0
  72. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/cloudwatch.py +0 -0
  73. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/config.py +0 -0
  74. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/cost_explorer.py +0 -0
  75. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/resource_explorer.py +0 -0
  76. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/aws/retry.py +0 -0
  77. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/__init__.py +0 -0
  78. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/activity_log.py +0 -0
  79. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/adapter.py +0 -0
  80. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/azure/cost_management.py +0 -0
  81. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/base.py +0 -0
  82. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/__init__.py +0 -0
  83. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/billing.py +0 -0
  84. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/adapters/gcp/retry.py +0 -0
  85. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/__init__.py +0 -0
  86. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/base.py +0 -0
  87. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/ai/bedrock.py +0 -0
  88. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/dependency_links.txt +0 -0
  89. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/entry_points.txt +0 -0
  90. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/argus_cloud_optimizer.egg-info/top_level.txt +0 -0
  91. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/__init__.py +0 -0
  92. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/agent/__init__.py +0 -0
  93. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/log.py +0 -0
  94. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/models/__init__.py +0 -0
  95. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/models/finding.py +0 -0
  96. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/py.typed +0 -0
  97. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/__init__.py +0 -0
  98. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/core/reports/comparison.py +0 -0
  99. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/aws/multi-account/hub/template.yaml +0 -0
  100. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/deploy/azure/function-app.bicep +0 -0
  101. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/adapters.md +0 -0
  102. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/ai-reasoning.md +0 -0
  103. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/how-it-works.md +0 -0
  104. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/concepts/index.md +0 -0
  105. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/contributing/index.md +0 -0
  106. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/contributing/new-adapter.md +0 -0
  107. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/contributing/new-ai-provider.md +0 -0
  108. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/deployment/aws.md +0 -0
  109. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/deployment/index.md +0 -0
  110. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/getting-started/first-scan.md +0 -0
  111. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/report-schema.md +0 -0
  112. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/docs/reference/resource-types.md +0 -0
  113. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/entrypoints/__init__.py +0 -0
  114. {argus_cloud_optimizer-0.2.0 → argus_cloud_optimizer-0.4.1}/setup.cfg +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: argus-cloud-optimizer
3
- Version: 0.2.0
4
- Summary: AI-powered multi-cloud cost optimization agent
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>=0.7.1; extra == "dev"
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-full.svg" alt="Argus" height="72">
65
+ <img src="docs/assets/images/logo.svg" alt="Argus" height="72">
64
66
  </p>
65
67
 
66
- <p align="center"><strong>AI-powered cloud cost optimization agent for AWS, GCP, and Azure.</strong></p>
68
+ <p align="center"><strong>Argus — AI Cloud Detective for AWS, GCP, and Azure.</strong></p>
67
69
 
68
- Argus finds idle and wasted cloud resources — stopped EC2 instances, unattached EBS volumes, orphaned Elastic IPs, underutilized RDS databases — and delivers a prioritized, AI-reasoned report to Slack every week.
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
  [![CI](https://github.com/vamshisiddarth/argus/actions/workflows/ci.yml/badge.svg)](https://github.com/vamshisiddarth/argus/actions/workflows/ci.yml)
71
- [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
73
+ [![Publish](https://github.com/vamshisiddarth/argus/actions/workflows/publish.yml/badge.svg)](https://github.com/vamshisiddarth/argus/actions/workflows/publish.yml)
72
74
  [![PyPI](https://img.shields.io/pypi/v/argus-cloud-optimizer.svg)](https://pypi.org/project/argus-cloud-optimizer/)
75
+ [![PyPI Downloads](https://img.shields.io/pypi/dm/argus-cloud-optimizer.svg)](https://pypi.org/project/argus-cloud-optimizer/)
76
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
73
77
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
74
78
  [![Docs](https://img.shields.io/badge/docs-vamshisiddarth.github.io%2Fargus-blue)](https://vamshisiddarth.github.io/argus/)
75
79
 
76
- <p align="center">
77
- <img src="docs/assets/images/slack-demo.png" alt="Argus Slack report" width="600">
78
- </p>
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 a realistic example:** [`examples/sample-report-aws.json`](examples/sample-report-aws.json) — 5 findings from a real-looking AWS scan with AI-written reasoning, metrics, and cost data.
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
- > **AWS-specific setup:** 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` to your aggregator region). Without this, Argus cannot discover resources.
191
+ **AWS:**
172
192
 
173
- Set minimum env vars:
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 # remove to post to Slack
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
- argus --cloud aws --run-now --dry-run
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 --run-now [options]
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 (AWS only)
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
- Create `accounts.yaml`:
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 --run-now --accounts accounts.yaml
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** | AWS: strong, GCP/Azure: adequate | AWS covers 43 resource types via Resource Explorer. GCP covers 22 asset types; Azure covers 25 via Resource Graph. Some niche resource types (e.g. AWS Glue, SageMaker endpoints) are not yet mapped. |
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) | 22 types (Asset Inventory) | 25 types (Resource Graph) |
370
- | Metrics | CloudWatch (43 types + fallback) | Cloud Monitoring (15 types + fallback) | Azure Monitor (25 types + fallback) |
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 | Single project only | Cross-subscription via Resource Graph |
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 (431 tests, no cloud creds needed)
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 (463 tests)
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/ # 463 tests, all pass offline
611
+ └── tests/ # 560 tests, all pass offline
421
612
  ```
422
613
 
423
614
  ---