Compare commits

...
1 Commits
Author SHA1 Message Date
claudeandClaude Opus 4.8 b31121d90c fix(scrape): make vision OCR a per-bundle allowlist, not a corpus sweep
The first vision pass OCR'd every large image and, because the "transcribe
the table" prompt makes qwen render ANY image as a markdown table, it turned
60 product UI screenshots into junk "tables" in the corpus. In practice the
only image-only DATA in this corpus is the release-schedule matrix — the
upgrade-compatibility matrices etc. are already native HTML tables, no OCR
needed.

- Add BundleSpec.ocr (default False); the runner passes the OCR-enabling
  session only for bundles that opt in. Set ocr=True only on
  morpheus_release_schedule.
- Purge the 60 screenshot cache entries (keep the release-schedule one). The
  next --force refresh regenerates every other page's .md WITHOUT the bogus
  "## Image transcriptions" section, cleaning the deployed corpus + index.
- Update vision.py / refresh.yml docs to the allowlist model.

Also add scripts/vision_report.py — a self-contained HTML report pairing each
OCR'd source image with its transcription (uncertain-first) for accuracy
inspection. Regenerate anytime from corpus/.vision-cache/.

Verified: release schedule still transcribes (cache hit); cache is back to 1
entry; other bundles now pass no session so their images are left alone.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_01LFowQzJu7k97QLCRDSAeh1
2026-07-23 13:31:09 -04:00
66 changed files with 221 additions and 446 deletions
+7 -7
View File
@@ -37,13 +37,13 @@ env:
OLLAMA_URLS: http://192.168.0.2:11435,http://192.168.0.2:11436,http://192.168.0.125:11434,http://192.168.0.126:11434
EMBED_MODEL: nomic-embed-text
# Vision OCR of image-only pages (support/lifecycle matrices etc. — see
# scrape/vision.py). Uses the host's primary Ollama on :11434, the only one
# with a vision model; the embed pool above is nomic-only. qwen2.5vl:7b
# scored best on the release-schedule matrix (55-56/56, ~18s, GPU-resident,
# prompt-robust). Content-hash cached in corpus/.vision-cache/; VISION_MAX_NEW
# bounds NEW OCRs per run so the cache fills incrementally instead of a
# multi-hour first pass. Any failure degrades to the pre-vision behavior.
# Vision OCR of image-only data pages (the release-schedule matrix — see
# scrape/vision.py). OCR is a per-bundle opt-in (BundleSpec.ocr), so this
# only runs on allowlisted docs, NOT every screenshot in the corpus. Uses
# the host's primary Ollama on :11434, the only one with a vision model
# (the embed pool above is nomic-only). qwen2.5vl:7b scored best on the
# matrix (55-56/56, ~18s, GPU-resident). Any failure degrades to the
# pre-vision behavior.
VISION_OCR: "1"
VISION_URL: http://192.168.0.2:11434
VISION_MODEL: qwen2.5vl:7b
+20 -10
View File
@@ -14,7 +14,8 @@
"Published": "February 2026"
},
"landing_page": "GUID-709AAADB-A9C1-40B6-AD22-958EE7E6F312",
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007510en_us"
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007510en_us",
"ocr": false
},
{
"slug": "morpheus_user_manual_8_1_1",
@@ -31,7 +32,8 @@
"Published": "March 2026"
},
"landing_page": "GUID-709AAADB-A9C1-40B6-AD22-958EE7E6F312",
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007621en_us"
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007621en_us",
"ocr": false
},
{
"slug": "morpheus_user_manual_8_1_2",
@@ -48,7 +50,8 @@
"Published": "April 2026"
},
"landing_page": "GUID-709AAADB-A9C1-40B6-AD22-958EE7E6F312",
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007732en_us"
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007732en_us",
"ocr": false
},
{
"slug": "morpheus_release_notes_8_1_0",
@@ -65,7 +68,8 @@
"Published": "February 2026"
},
"landing_page": "sd00007496en_us",
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007496en_us"
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007496en_us",
"ocr": false
},
{
"slug": "morpheus_release_notes_8_1_1",
@@ -82,7 +86,8 @@
"Published": "March 2026"
},
"landing_page": "sd00007610en_us",
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007610en_us"
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007610en_us",
"ocr": false
},
{
"slug": "morpheus_release_notes_8_1_2",
@@ -99,7 +104,8 @@
"Published": "April 2026"
},
"landing_page": "sd00007733en_us",
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007733en_us"
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00007733en_us",
"ocr": false
},
{
"slug": "morpheus_user_manual_9_0_0",
@@ -116,7 +122,8 @@
"Published": "May 2026"
},
"landing_page": "GUID-709AAADB-A9C1-40B6-AD22-958EE7E6F312",
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00008014en_us"
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00008014en_us",
"ocr": false
},
{
"slug": "morpheus_release_notes_9_0_0",
@@ -133,7 +140,8 @@
"Published": "May 2026"
},
"landing_page": "sd00008017en_us",
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00008017en_us"
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sd00008017en_us",
"ocr": false
},
{
"slug": "morpheus_quickspecs",
@@ -148,7 +156,8 @@
"abstract": "",
"dates": {},
"landing_page": "a50009231enw",
"source_url": "https://www.hpe.com/psnow/doc/a50009231enw"
"source_url": "https://www.hpe.com/psnow/doc/a50009231enw",
"ocr": false
},
{
"slug": "morpheus_release_schedule",
@@ -165,6 +174,7 @@
"Published": ""
},
"landing_page": "sf000111242en_us",
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sf000111242en_us"
"source_url": "https://support.hpe.com/hpesc/public/docDisplay?docId=sf000111242en_us",
"ocr": true
}
]
@@ -1,7 +0,0 @@
{
"sha": "004727d68243b46f1c9da3b721ff2fd5c25c8522ddd32779ce764a89eb6d14a3",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-37BE6AA0-10E5-4D0D-BCC1-0834A578B1EC-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Appliance Node | Description |\n|-----------------|-------------|\n| NGINX | Web server and reverse proxy |\n| MySQL | Relational database management system |\n| RabbitMQ | Message broker for distributed computing systems |\n| Elastic | Search engine and analytics platform |\n\nSingle Node Configuration:"
}
@@ -1,7 +0,0 @@
{
"sha": "0819a450fc742f430aa7772e4ca095e0a756c6f626caaa6fdef38ddfe20c8bdd",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-444E2530-12E2-439A-A1C7-EED4D7F91D38-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| STATUS | RESOURCE | INFO | START DATE | DURATION |\n|--------|----------|------|------------------|----------|\n| | VMware | shredder.jabalabs.cloud | vSphere Distributed Switch VLAN trunked status | 01/07/2026 07:16 AM | 5d 2h |\n| | VMware | shredder.jabalabs.cloud | vSphere Distributed Switch MTU supported status | 01/07/2026 07:16 AM | 5d 2h |"
}
@@ -1,7 +0,0 @@
{
"sha": "0b78951e1901048d014602a73c1768104b66b34258c44386129da68ce5a4346b",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-9916D4B0-7144-4088-98AC-2B2F2E780378-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| CLOUD | COUNT | MEMORY | STORAGE | CPU | PRICE |\n|-------|-------|--------|---------|-----|-------|\n| VMware | 2 | 5.9GiB | 22.0GiB | 1 | $0.07 |"
}
@@ -1,7 +0,0 @@
{
"sha": "0c265d6963baa34d0ea65afe5ffcd143192c92fc3764d355f479511ea8ea9b3c",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-D08A61BD-C24A-4D73-82C0-45BAEBC26DCB-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| NAME | DESCRIPTION | MONTH TO DATE | PROJECTED TOTAL |\n|------------|--------------------------------------------------|-----------------|------------------|\n| morpheus | | $2,388.69 | $4,227.03 |\n| | | | |\n| | | | |\n| | | | |\n| | | | |"
}
@@ -1,7 +0,0 @@
{
"sha": "0d7e95ff875283137ebbdf9dcb476e083050c8cfe8caa48f32e17e24ebfdab59",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-BF328552-F0CB-4A16-89DE-DD5E534DDA21-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Report Type | Description |\n|-------------|-------------|\n| Tenant Inventory Summary | View an inventory of VMs and containers by tenant. |\n| Cloud Usage | View a cloud's usage of storage, memory, and compute resources. |\n| Cloud Usage App Summary | View a cloud's usage of storage, memory, and compute resources by app. |\n| Cloud Usage Instance Type Summary | View a cloud's usage of storage, memory, and compute resources by instance type. |\n| Tenant Usage | View a cloud's usage of storage, memory, and compute resources by tenant. |\n| Amazon Reservation Coverage | View how Amazon EC2 instance types are covered by Reserved Instances. |"
}
@@ -1,7 +0,0 @@
{
"sha": "108db8dfcfb10934fe7ddde7d91ed6f484ebf9fdf9fe86a72e99a17801f087fd",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-3B425176-5841-4C03-B67D-F6B86603E1CD-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| TAG | WORKLOADS | MEMORY | STORAGE | CPU | PRICE | VALUES |\n|--------------------|-----------|------------|------------|-------|--------|--------|\n| Morpheus Server Id | 37 | 4.6TiB | 73.8TiB | 1 | $299.32| |\n| Morpheus Id | 21 | 2.4TiB | 25.4TiB | 1 | $172.56| |"
}
@@ -1,7 +0,0 @@
{
"sha": "10bf0d71532812d10314a37a13ab69ad4fdb49490e08156a6a2f993672c3f295",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-4029426C-1AA2-4873-AE1C-CB4677EFB0F7-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Name | Title | Category |\n|------|-------|----------|\n| | | |"
}
@@ -1,7 +0,0 @@
{
"sha": "1210d0aee2152b2863303cbc02e5dc82474f4ae783733100719cae9a1a3e9748",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-66262EA5-76D1-41C6-AE62-C1CF505E9976-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| INVOICE ID | PERIOD | COMPUTE | STORAGE | NETWORK | EXTRA | MTD | TOTAL |\n|------------|--------------|----------|-----------|------------|-----------|------------|------------|\n| 1326425 | September 2020 | $0 | $0 | $0 | $0 | $43.84 | $1,944.02 (Projected) |\n| 1309811 | August 2020 | $1,309.98 | $1,227.51 | $9.56 | $0 | $2,783.84 | $2,783.84 |\n| 1300026 | July 2020 | $1,524.81 | $4,361.13 | $9.64 | $0 | $6,044.27 | $6,044.27 |\n| 1279589 | June 2020 | $4,448.53 | $61.58 | $8.24 | $0 | $4,518.35 | $4,700.00 |\n| 404134 | May 2020 | $0 | $0 | $0 | $0 | $105.37 | $105.37 |\n| 394365 | April 2020 | $0 | $0 | $0 | $0 | $66.99 | $66.99 |\n| 401131 | March 2020 | $0 | $0 | $0 | $0 | $31.58 | $31.58 |\n| 387577 | February 2020 | $0 | $0 | $0 | $0 | $40.62 | $40.62 |\n| 382300 | January 2020 | $0 | $0 | $0 | $0 | $22.31 | $22.31 |"
}
@@ -1,7 +0,0 @@
{
"sha": "1609a0928a70f0173675bc070f5ec5a975aa7b73c5e5c906e30edfec6e2ffc16",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-6493DA77-2790-4079-9636-57D2B389DBCD-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Discovery Info | Z-VRA-10.30.21.61 |\n|----------------|--------------------|\n| Resize Resource | VMware Demo Cluster |\n| Date | 12/14/2018 11:05 AM |\n| Cloud | VMware Demo Cluster |\n| Savings | $50.00/month |\n\n| Icon | Label | Value |\n|------|---------|----------|\n| \ud83d\udd04 | Power | |\n| \u2705 | Status | |\n| \ud83d\udd0d | Type | |\n|\ud83d\udc27 | OS | |\n| VMware| Cloud | |\n\n| Usage Plan | Custom VMware |\n|------------|----------------|\n\n| Icon | Label | Value |\n|------|-----------|-------------|\n| \ud83d\udd04 | Compute | 1% of 100% |\n| \u2705 | Memory | 30.0MB of 3.0GB |\n\n| After Resize | Memory: 1.5GiB |\n|--------------|----------------|\n| Icon | Label | Value |\n| \ud83d\udd04 | Compute | 1% of 100% |\n| \u2705 | Memory | 30.0MB of 1.5GB |\n\n| Buttons | Close | Ignore | Execute |"
}
@@ -1,7 +0,0 @@
{
"sha": "1b3ef9f9775e56c224ec7226797d34581b7c7ea8f76d5412c39e38a0427dac4a",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-F0EDC63A-480C-4013-AC6D-A1C51BA13CC7-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| CONFIGURATION OPTIONS | VALUE |\n|-----------------------|-------|\n| NAME | ${userInitials}-demo-${cloudCode}-${type}-${sequence} |\n| DESCRIPTION | Sample Spud Marketing App |\n| CLOUD | Labs UCS |\n| VERSION | Tomcat 7 jdk 7 |\n| INSTANCE CONFIGURATION| Docker Tomcat |\n| PLAN | 1GB Memory, 10GB Storage |\n| VOLUMES | 10 GB |\n| HOST | Select Server |"
}
@@ -1,7 +0,0 @@
{
"sha": "1c33e5f4d6f7ee6ac8843fe2ef3d9b5dc61ad2a3bb36ce369414ccbb2c8155e0",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-1DE90FFC-D78A-4AEC-B168-D1AF1DF3E611-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Purchase a License |\n|---------------------|\n| You must apply a license before using Morpheus.<br>If you would like to purchase a license or get a free trial please contact us at <a href=\"mailto:[email protected]\">[email protected]</a>,<br>or call 800-946-9180. |\n| **UPGRADE** |\n\n| Upgrade License Key |\n|---------------------|\n| If you have a new license key, enter it below.<br>If you need a new license key or would like to upgrade, please contact us at <a href=\"mailto:[email protected]\">[email protected]</a>,<br>or call 800-946-9180. |\n| **UPDATE** |"
}
@@ -1,7 +0,0 @@
{
"sha": "1e1ffb9b2f2d9f3380da47af0df1fa81a23eaa844376dc60624d7acd8ee57797",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-3AE2F03E-DBC7-4FC1-BED0-DB5F6B096D9F-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Group | Environment | Cloud | Resource Pool | Plan | Network | Security Group | Name |\n|-------|-------------|-------|----------------|------|----------|-----------------|------|\n| All Clouds | Dev | QA Amazon | labs | T2 Micro - 1 Core, 1GB Memory | 172.31.0.0/20 (subnet-22ba157b) | default | My Workload |"
}
@@ -1,7 +0,0 @@
{
"sha": "207e759fbbc5b40a0134c1937aa1c98d94b416773bd2c9558fe55fe7ac30f701",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-433AD4AB-C735-49B2-913B-302BF3209248-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Task Name | Start Date | Duration |\n|-----------|------------|----------|\n| Retry Test - Write Pre-Provision Templates | 03/07/2023 03:30 PM | 0s |\n| Retry Test - Write Provision Templates | 03/07/2023 03:30 PM | 0s |\n| Retry Test - Run Task: *Retry Test 1 in *Retry Test Provisioning - Provision | 03/07/2023 03:30 PM | 1s |\n| Retry Test - Run Task: *Retry Test 2 in *Retry Test Provisioning - Provision | 03/07/2023 03:30 PM | 1s |\n| Retry Test - Run Task: *Retry Test 3 in *Retry Test Provisioning - Provision | | |\n| Retry Test - Complete Provisioning | | |"
}
@@ -1,7 +0,0 @@
{
"sha": "2703f9599273300532c6f5822e484a45c16e41d97d7ee194a4abe566ad03d987",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-D954DA2F-C2AD-4BD7-B7C3-02CE5AEF0719-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| ORDER PLACED | ITEMS ORDERED | ORDER STATUS |\n|--------------|---------------|--------------|\n| 09/22/2020 | 1 | Complete |"
}
@@ -1,7 +0,0 @@
{
"sha": "2a7cadedede3d9802e8b87c3bc55cc40a0f248e46504a464fad1391558dc0828",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-EED20D75-2987-4570-A0F2-5AD920F49D1D-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Instance | Type | Address |\n|----------|------------|--------------------|\n| | | |"
}
@@ -1,7 +0,0 @@
{
"sha": "35fb2d3c6bf82a8ca417866184a1c93c40c0551c9f582ccbb8e8cf54dccbb9e1",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-C731E3A8-F507-477B-93AB-71BC98DA37A0-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| INSTANCE TYPE | ON DEMAND HOURS | RESERVED HOURS | TOTAL HOURS | COVERAGE |\n|-------------------------|------------------|-----------------|-------------|----------|\n| DV2/DSV2 SERIES | 384.15 | 0.0 | 384.15 | 0.0% |\n| A SERIES WINDOWS | 1,366.82 | 0.0 | 1,366.82 | 0.0% |\n| A SERIES BASIC | 1,556.2 | 0.0 | 1,556.2 | 0.0% |\n| AV2 SERIES | 178.33 | 0.0 | 178.33 | 0.0% |\n| BS SERIES | 1,534.95 | 0.0 | 1,534.95 | 0.0% |\n| AV2 SERIES WINDOWS | 3.07 | 0.0 | 3.07 | 0.0% |\n| BS SERIES WINDOWS | 381.92 | 0.0 | 381.92 | 0.0% |\n| A SERIES | 383.35 | 0.0 | 383.35 | 0.0% |\n| DV2/DSV2 SERIES WINDOWS | 2.47 | 0.0 | 2.47 | 0.0% |"
}
@@ -1,7 +0,0 @@
{
"sha": "3e5c1feb5480ae7eb79b7c1b263f5e32ff360c14725cc8b966a93f60368fb119",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-EF84CC50-D2E4-4906-9051-655D7B15CE65-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| TYPE | NAME | TECHNOLOGY | LABELS |\n|------------|----------------|-------------|----------------|\n| Resource | *test | Amazon | aws |\n| Resource | Custom Amazon CentOS | | centos |\n| Resource | Custom App | | app, aws, vmware |\n| Resource | Custom VMware Ubuntu | | ubuntu, vmware |"
}
@@ -1,7 +0,0 @@
{
"sha": "42588cd48ecf67c8688139c09bbb9676714c4512587e6e98f943abc6ca6e64e0",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-54937FF3-952A-40DE-8C06-8E193416776A-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Date | Memory Usage (GB) |\n|------------|--------------------|\n| Apr-21 | 0 |\n| Apr-24 | 8500 |\n| Apr-27 | 9000 |\n| Apr-30 | 9500 |\n| May-03 | 90000 |\n| May-06 | 95000 |\n| May-09 | 100000 |\n| May-12 | 95000 |\n| May-15 | 100000 |\n| May-18 | 105000 |\n| May-21 | 85000 |\n| May-24 | 90000 |\n| May-27 | 95000 |\n| Jun-02 | 90000 |\n| Jun-05 | 85000 |\n| Jun-08 | 80000 |\n| Jun-11 | 85000 |\n| Jun-14 | 80000 |\n| Jun-17 | 85000 |\n| Jun-20 | 90000 |"
}
@@ -1,7 +0,0 @@
{
"sha": "44cacfa1e7cf2dc66d8c5311b72b3c686ec565d947f3b1d26ad502770b92f094",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-77399E18-27B9-465D-885C-F34C86B2EA19-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Job Configuration | Value |\n|-------------------|-------|\n| SECURITY PACKAGE | scap security bundle 0.1.51 |\n| SCAN CHECKLIST | /scap-security-guide-0.1.51/ssg-ubuntu1804-ds.xml |\n| SECURITY PROFILE | xccdf_org.ssgproject.content_profile_cis |\n\n| Execution Config | Value |\n|--------------------|-------|\n| SCHEDULE | Daily |\n| RUN NOW | (unchecked) |\n| CONTEXT TYPE | Server |\n| CONTEXT SERVER | de-ubuntu-1 |"
}
@@ -1,7 +0,0 @@
{
"sha": "4af3aed5fcf9f5c13c9786cf0687bd2410e8248df9589e41ed443a75b1a1792e",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-BA459071-AEAD-4E96-8DB9-FD67DDE9ABC5-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Field | Description |\n|--------------|-----------------------------------------------------------------------------|\n| NAME | My Task |\n| CODE | (empty) |\n| LABELS | A comma-separated list of labels that can be used to group/organize items. |\n| TYPE | Python Script |\n| RESULT_TYPE | None |\n| SOURCE | Local |\n| CONTENT | morpheus['cypher']['read']('') |"
}
@@ -1,7 +0,0 @@
{
"sha": "4f648ba912d17e2d114818c97455de805b580e24c5dde16c76e1606b0ea5dc8d",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-01557155-5F51-4E18-9423-80740E675D88-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Name: | morpheus-export |\n| --- | --- |\n| Type: | GitHub |\n| Default Branch: | main |\n| Owner: | aharker |\n| Code Language: | |\n\n| Organization: | ahark86 |\n| Location: | https://github.com/ahark86/morpheus-export |"
}
@@ -1,7 +0,0 @@
{
"sha": "51edc81040509f7e2b617b7d544ab7219f73dcf0e91a87b09adfc9db624f9e89",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-BC2102C2-6D1A-4EC2-8F51-173EAE0CE091-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Groups | NAME | LOCATION | DATACENTER | MONTH TO DATE | PROJECTED TOTAL |\n|--------|------|----------|------------|---------------|-----------------|\n| | | | | | |\n| | | | | $24,865.05 | $24,865.05 |\n| | | | | $61.86 | $104.31 |\n| | | | | $30.49 | $30.49 |\n| | | | | $26.04 | $43.21 |\n| | | Denver | | $11.72 | $11.72 |"
}
@@ -1,7 +0,0 @@
{
"sha": "548669a3aed4ff4080040ca19e2c2f4dce295144ff3532e60318c6d7926ad9e8",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-4A12A8C3-AB86-4D4A-AF4E-432D5D9515BA-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Month | Budget | Actual |\n|-------|---------|--------|\n| January | $83 | $115 |\n| February | $0 | $0 |\n| March | $0 | $0 |\n| April | $0 | $0 |\n| May | $0 | $0 |\n| June | $0 | $0 |\n| July | $0 | $0 |\n| August | $0 | $0 |\n| September | $0 | $0 |\n| October | $0 | $0 |\n| November| $0 | $0 |\n| December| $83 | $0 |"
}
@@ -1,7 +0,0 @@
{
"sha": "567805a79678184197d713468483ccaa269343479d937c1454e3aadf32538d50",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-DE8D2A86-CAB3-4D94-9D4C-83C5FA49585A-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Start Date | Duration | User |\n|------------|----------|--------|\n| 01/12/2026 05:30 AM | 1m 59s | ttran |\n| 01/12/2026 05:30 AM | 2m 47s | ttran |\n| 01/12/2026 05:30 AM | 2m 42s | ttran |\n| 01/12/2026 05:30 AM | 28m 10s | ttran |\n| 01/12/2026 05:30 AM | 2m 40s | waked |"
}
@@ -1,7 +0,0 @@
{
"sha": "5a948621965266305852338ac7e8184288d21d148f3ea937d35e93973bc980b1",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-2D5FF1AC-0C5C-4977-BFC3-19FBA953BC8F-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Appliance Settings | Description |\n|--------------------|-------------|\n| Appliance URL | https://appliance.url.com |\n| Internal Appliance URL (PXE) | | For PXE-Boot your appliance needs to be routable directly with minimal NAT masquerading. This allows one to override the default appliance url endpoint for use by the PXE Server. If this is unset, the default appliance url will be used instead. |"
}
@@ -1,7 +0,0 @@
{
"sha": "5ec4381c5918e8f5c2e313a88fe4a12bca553cf7e019d798e3cc2f9d909de3fd",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-627980F3-725B-4765-8CF0-89FD087667C8-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Component | Description |\n|----------|-------------|\n| Load Balancer | Manages traffic between clients and servers |\n| Morpheus Nodes | Nodes that run the Morpheus application |\n| RabbitMQ | Message broker for communication between nodes |\n| Elastic | Search engine and analytics platform |\n| App Node 1, App Node 2, App Node 3 | Application nodes running applications |\n| DB Node 1, DB Node 2, DB Node 3 | Database nodes storing data |\n| Database Cluster | A cluster of database nodes for redundancy and scalability |\n| Shared Storage | Central storage shared by all components |"
}
@@ -1,7 +0,0 @@
{
"sha": "604e1c401bf8686eec90e60523bded08256a7e1f21701df0448a7f07f642d1e0",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-BF0ECE3F-331E-4BDF-9CF3-8DA3BAF19EFA-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Field | Description |\n|--------------|-----------------------------------------------------------------------------|\n| NAME | Text field for entering a name |\n| START | Date and time picker for selecting start date |\n| END | Date and time picker for selecting end date |\n| GROUP | Dropdown menu to select a group |\n| CLOUD | Dropdown menu to select a cloud |\n| TAGS | Text field for entering tags |\n| EXCLUDE_TAGS | Text field for excluding tags |\n| TENANT | Dropdown menu with options: All |\n| SCHEDULE | Dropdown menu with options: Select, Date And Time, Daily, Daily At Midnight, Hourly, Weekly On Sunday At Midnight |"
}
@@ -1,7 +0,0 @@
{
"sha": "6ae068ce8fefe79d0f4c1888e5e0833609dcd8497008d9189becf2522d5c7266",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-2EECD2F1-36D5-4E56-B12D-99872F54B075-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Instance Name | SSH: IP Address | Version | Status | Containers |\n|---------------|-----------------|---------|--------|------------|\n| MORPHEUS-HA-AP1 | 10.30.20.181:22, 10.30.20.62:22 | 7.3 | Running | 2 |\n| JW-CENTOS-AHV | 10.30.20.165:22, 10.30.20.91:22, 10.30.20.149:22 | 7.3 | Running | 3 |\n| JW-CENTOS-AHV-1 | 10.30.20.135:22, 10.30.20.37:22, 10.30.20.52:22 | 7.3 | Running | 3 |\n| JW-CENTOS-AHV-2 | 10.30.20.104:22 | 7.3 | Running | 1 |\n| MORPHEUS-HA-DB | 10.30.20.153:22, 10.30.20.139:22, 10.30.20.196:22 | 7.3 | Running | 3 |\n| MORPHEUS-HA-MQ | 10.30.20.129:22, 10.30.20.58:22 | 7.3 | Running | 2 |\n| MORPHEUS-HA-MQ-LB-1 | 10.30.20.53:22 | 7.3 | Running | 1 |"
}
@@ -1,7 +0,0 @@
{
"sha": "6bbeb863375cfc066ec66e5346cc9c13089ddb39bf4a55ede66c261b88c3488e",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-98D09465-88F7-420B-AEF8-80393CC3A8B7-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| POWER | OS | NAME | TYPE | CLOUD | PRICE | CPU UTILIZATION |\n|-------|----|------|------|-------|-------|------------------|\n| ? | ? | aa-sb-morpheus-centos-4110 | Managed VM | VMware vCenter | $51.66 | 3, 6, 25 |\n| | | labs_west-chef-web-01a | Discovered | AWS MorpheusDemo | $51.80 | |"
}
@@ -1,7 +0,0 @@
{
"sha": "715e2960eaca4afcc6d554ae8e1921b263b5cb2f2be0f73c312b04105c90b502",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-ED6FCF79-BB81-4C2B-B4A6-4DCB7357CFB5-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| ORDER PLACED | ITEMS ORDERED | ORDER STATUS |\n|--------------|---------------|--------------|\n| 09/22/2020 | 1 | Complete |"
}
@@ -1,7 +0,0 @@
{
"sha": "71bf4d3e41d1940bc52fdebcf1fe0fc184602a27e59ab03ff346024982fe6e4c",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-C67DA833-C730-4887-9672-7E63FABC0841-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| TYPE | NAME | INSTANCES | GROUPS | CLOUDS | COUNT |\n|------------|----------------|-----------|--------|--------|-------|\n| MISSING LOGO | [Name redacted] | 1 | 1 | 1 | 1 |\n| MISSING LOGO | [Name redacted] | 1 | 1 | 1 | 1 |"
}
@@ -1,7 +0,0 @@
{
"sha": "8745139b63ba1f68e0e50274b92c3777e0b66d6189f64f40209d921d450e2e47",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-D2F4F5EE-5377-4E4A-A6E8-DAD6ED4FBD80-high.gif",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| LUSH | +N | +E |\n|------|----|----|"
}
@@ -1,7 +0,0 @@
{
"sha": "9179cf63689fcca101bf6ef9a26ab5aeaa027cc3c07721776e6cc0e33f02f846",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-1897DAD3-23E6-4D44-8331-93C40D4FD9FA-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| NAME | DESCRIPTION |\n| --- | --- |\n| ahark86/morpheus-export | |\n| IMPORT/EXPORT | Manual export |\n| PATH | prod |\n| EXPORT LABEL FILTER | prod |"
}
@@ -1,7 +0,0 @@
{
"sha": "93c24b083648b0058e838dd0f7c069b7afde7c67173ea2e4ecd5aa2c11487c7e",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-102FBE32-895E-4617-80D4-AA313E7BB572-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Workload Type | Cost |\n|---------------|------|\n| CentOS | $238.60 |\n| Nutanix | $39.17 |\n| Ubuntu | $33.58 |\n| Other | $13.10 |\n| Another | $3.18 |\n| Yet Another | $2.44 |\n\n| Workload Type | Cost |\n|---------------|------|\n| 2 vCPU, 8GB Memory | $51.55 |\n| 2 CPU, 16GB Memory | $51.52 |\n| 2 CPU, 8GB Memory | $26.15 |\n| m1.large | $14.65 |\n| 1 CPU, 4GB Memory | $13.10 |\n| 1 vCPU, 4GB Memory | $13.06 |"
}
@@ -1,7 +0,0 @@
{
"sha": "94142b2fc15a4a671483c963665c0ae25b172c6458e6924d32f1ef5bfe8e4dfa",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-47300BA8-9B05-428D-835A-1975B04DE84E-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Task Name | Start Date | Duration | User |\n|-----------|------------------|------------|--------------|\n| Local - Run Workflow: Workflow kill test | 03/14/2023 01:54 PM | 3m 41s | Tenant Harker |\n| Local - Run Task: Task kill test in Workflow kill test - Operation | 03/14/2023 01:57 PM | 44s | |\n| Local - Run Task: Task kill test in Workflow kill test - Operation | 03/14/2023 01:57 PM | 40s | |"
}
@@ -1,7 +0,0 @@
{
"sha": "973245eaefc41aa7a9b96511fedb11e09f47e2105935309777c8eb6eae22f19a",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-035126CA-FDE7-492E-842A-094558CB1655-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| ID | START DATE | END DATE | USAGE TYPE | USAGE | RATE | UNIT | COST | ITEM NAME |\n|----------|----------------------|----------------------|-------------------------------------------------|----------------|----------|---------|--------|-----------|\n| 1612407 | 8/1/20 12:00 AM | 8/30/20 1:00 PM | USW1-CW:Requests | 1.0078647E7 | 1.0E-5 | Requests | $100.79| QA Amazon |\n| 1614136 | 8/1/20 6:00 PM | 8/1/20 7:00 PM | USW1-DataTransfer-Out-Bytes | 9.4892E-6 | 0.0897631338| GB | $0.00 | QA Amazon |\n| 1614137 | 8/1/20 6:00 PM | 8/1/20 7:00 PM | USW1-DataTransfer-Out-Bytes | 7.7188E-6 | 0.0897631338| GB | $0.00 | QA Amazon |\n| 1614138 | 8/1/20 6:00 PM | 8/1/20 7:00 PM | USW1-LCUUsage | 1.833333E-4 | 0.007999995| LCU-Hrs | $0.00 | QA Amazon |\n| 1614139 | 8/1/20 6:00 PM | 8/1/20 7:00 PM | USW1-LoadBalancerUsage | 1.0 | 0.0252 | Hrs | $0.03 | QA Amazon |\n| 1614140 | 8/1/20 6:00 PM | 8/1/20 7:00 PM | USW1-LoadBalancerUsage | 1.0 | 0.0252 | Hrs | $0.03 | QA Amazon |\n| 1619670 | 8/1/20 7:00 PM | 8/24/20 10:00 PM | us-west-1-KMS-Requests | 39.0 | 3.0E-6 | Requests| $0.00 | QA Amazon |\n| 1617343 | 8/3/20 3:00 PM | 8/30/20 1:00 PM | USW1-LoadBalancerUsage | 646.0 | 0.0252 | Hrs | $16.28 | QA Amazon |\n| 1620003 | 8/5/20 4:00 PM | 8/5/20 5:00 PM | USW1-DataProcessing-Bytes | 6.1E-7 | 0.008 | GB | $0.00 | QA Amazon |\n| 1620006 | 8/5/20 4:00 PM | 8/5/20 5:00 PM | USW1-LCUUsage | 2.055556E-4 | 0.007999995| LCU-Hrs | $0.00 | QA Amazon |\n| 1620008 | 8/5/20 4:00 PM | 8/5/20 5:00 PM | USW1-LoadBalancerUsage | 1.0 | 0.0252 | Hrs | $0.03 | QA Amazon |\n| 1620005 | 8/5/20 4:00 PM | 8/5/20 6:00 PM | USW1-DataTransfer-Out-Bytes | 6.9551E-6 | 0.0897631338| GB | $0.00 | QA Amazon |\n| 1620004 | 8/5/20 4:00 PM | 8/6/20 7:00 AM | USW1-DataTransfer-Out-Bytes | 3.46508E-5 | 0.0897631338| GB | $0.00 | QA Amazon |\n| 1620007 | 8/5/20 4:00 PM | 8/6/20 7:00 AM | USW1-LoadBalancerUsage | 2.0 | 0.028 | Hrs | $0.06 | QA Amazon |\n| 1620726 | 8/6/20 6:00 AM | 8/6/20 7:00 AM | USW1-DataTransfer-Out-Bytes | 7.5875E-6 | 0.0897631338| GB | $0.00 | QA Amazon |\n| 1620727 | 8/6/20 6:00 AM | 8/6/20 7:00 AM | USW1-LCUUsage | 2.055556E-4 | 0.007999995| LCU-Hrs | $0.00 | QA Amazon |\n| 1620728 | 8/6/20 6:00 AM | 8/6/20 7:00 AM | USW1-LoadBalancerUsage | 1.0 | 0.0252 | Hrs | $0.03 | QA Amazon |\n| 1621067 | 8/6/20 3:00 PM | 8/6/20 4:00 PM | USW1-DataTransfer-Out-Bytes | 2.282E-7 | 0.0897631338| GB | $0.00 | QA Amazon |\n| 1623759 | 8/11/20 8:00 AM | 8/11/20 9:00 AM | USW1-DataTransfer-Out-Bytes | 1.08387E-5 | 0.0897631338| GB | $0.00 | QA Amazon |\n| 1623762 | 8/11/20 8:00 AM | 8/11/20 9:00 AM | USW1-LoadBalancerUsage | 1.0 | 0.028 | Hrs | $0.03 | QA Amazon |"
}
@@ -1,7 +0,0 @@
{
"sha": "abb0491f82bcc5cfe483f5e38061f48818d04d2f562c27e53164d8e0b2e6e56b",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-24D6CCD6-E864-4CA6-8D91-5EFDFB50CB33-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| TYPE | NAME | DETAILS | ACTIVE |\n|------|------|---------|--------|"
}
@@ -1,7 +0,0 @@
{
"sha": "af03ebcfe831b7c296a01811b694e6b057cf7a512bd8f606a71fc284b2115664",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-D7C44885-681F-4B92-8D83-E5EB52F25660-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Month | Budget | Actual |\n|-------|---------|--------|\n| January | $0 | $45 |\n| February| $0 | $42 |\n| March | $0 | $42 |\n| April | $0 | $45 |\n| May | $0 | $45 |\n| June | $0 | $53 |"
}
@@ -1,7 +0,0 @@
{
"sha": "af9cf8855a81bb32c66391bdc66ae73451cc81ee29bfc65c529dc45b4500d5c0",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-39F2C925-F3CB-4E65-B5A6-B5B515D2A1F6-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Field | Value |\n|-------------|----------------------|\n| START | 08/21/2020 |\n| END | 08/24/2020 |\n| GROUP | Select |\n| CLOUD | Select |\n| TAGS | |\n| EXCLUDE TAGS| |\n| TENANT | All |"
}
@@ -1,7 +0,0 @@
{
"sha": "b41f37d37b3db8c897136ad7a178f6890f06ace7eb582bbf90575e81f1f1ed08",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-18A42C5E-8C61-4ADA-AF78-23E743A230ED-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Field | Value |\n|--------------|----------------------|\n| NAME | |\n| DESCRIPTION | |\n| ENABLED | \u2714 |\n| SCOPE | Account |\n| PERIOD | Year |\n| YEAR | Custom |\n| START DATE | 01/2021 |\n| END DATE | 12/2021 |\n| INTERVAL | Month |\n| JANUARY | 0.0 |"
}
@@ -1,7 +0,0 @@
{
"sha": "b61946d04e7a92314a9285e9ecfd58a4cce6722cf0b5c751f1e6ad563d3c7a23",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-E8A3A8C8-27F1-48F1-8B98-2AF3AAE6E121-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Job Summary | |\n| --- | --- |\n| NAME | Scan Job |\n| JOB TYPE | Security Scan Job |"
}
@@ -1,7 +0,0 @@
{
"sha": "b778bd19773b2cc4a96b7f15d11ab327060674c9198d3c6aee437f004f20f72a",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-19673F2B-9D42-4067-BC83-078B0046D28B-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| USERNAME | MONTH TO DATE | PROJECTED TOTAL |\n|----------|---------------|-----------------|\n| discovered | $673 | $1,092 |"
}
@@ -1,7 +0,0 @@
{
"sha": "bfc8e63b481b571301d69af6c7102aaf86c00550e999768e5bcb7d12c44451f7",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-F0F0DA3A-4058-45D6-AECA-8A5BEF62FDBA-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Getting Started With The Wiki |\n| --- |\n| Welcome to the Wiki! This service ties into assets throughout the environment. Create pages for instances, hosts, groups, clouds, and even clusters directly on their detail pages. Or, just create general notes pages here in the centralized Wiki section in Markdown format. |\n| Creating your first page is as simple as clicking the **Create Page** button. Write down some content, give the page a title, and click the save button. The wiki will also keep track of who last edited a page and when. The beauty of this wiki is its clean and easy to write down notes related to various parts of your application deployment or infrastructure without going to an external tool. |\n| **Create A Homepage** |\n| The wiki provides an easy way to replace this page with a new default page. Simply create a page with the title **Home**. When that page is created, it will become the new default page for the Wiki and visible by all the users that have access to this section. |\n| **Secure** |\n| All wiki pages are encrypted using AES-256 bit encryption. Though we don't advise storing passwords in a wiki document (there's services like Cypher for that). Role-based access control also can properly restrict access to content related to instances or hosts the user may not have access to. |\n\n| Pages |\n| --- |\n| Search | Page Index |"
}
@@ -1,7 +0,0 @@
{
"sha": "c044d63eeace101d9f0a0bf4ac948d9b764660d4d08db49876e99ab49ed7d76b",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-7D08D7CC-C9FD-4013-9B64-78A4F9C8B639-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| INVOICE ID | TYPE | REFERENCE | CLOUD | PERIOD | START DATE | END DATE | MTD PRICE | TOTAL PRICE |\n|------------|------------|-----------|------------|----------------|----------------------------|----------------------------|-------------|-------------|\n| 282029 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM | $0.12 | $0.15 |\n| 292790 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM | $0.00 | $0.00 |\n| 292809 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM | $0.00 | $0.00 |\n| 282143 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM | $0.26 | $0.32 |\n| 287435 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM | $0.00 | $0.00 |\n| 292704 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM | $0.12 | $0.48 |\n| 282114 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM | $0.24 | $0.29 |\n| 292239 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM | $0.00 | $0.00 |\n| 285619 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM | $0.00 | $0.00 |"
}
@@ -1,7 +0,0 @@
{
"sha": "c4910edb2db46d2d544dab398aac9e8266d757db51c92c22ea2333b6d5d5daad",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-E081EF68-3B0E-4A5A-8CFE-8E8B47D87BAD-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| INVOICE ID | TYPE | REFERENCE | CLOUD | PERIOD | START DATE | END DATE |\n|------------|------------|-----------|------------|---------------|----------------|----------------|\n| 282029 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM |\n| 292790 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM |\n| 292809 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM |\n| 282143 | Resource | | Azure US | February 2022 | 2/1/22, 12:00 AM | 2/28/22, 11:59 PM |"
}
@@ -1,7 +0,0 @@
{
"sha": "c53e999ad6b6f8b6fd75afb9404cd098e4c96fe91a5d13fec626220c22994194",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-01147D13-F369-4441-B97D-9354DA79DF93-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Type | User | Date Range |\n|---------------------|----------------|------------------|\n| All Types | Users | All Dates |\n\n### RECENT ACTIVITY REPORT\n\n- **Admin - kulkarni** \n - User created with roles 'System Admin'. \n - Date: 01/19/2026 08:27 PM \n - Author: alex \n\n- **Backup - ThuanTestRHEL01-migrated** \n - New backup has successfully been created for 'Jabalabs'. \n - Date: 12/19/2025 01:40 AM \n - Author: ttran \n\n- **Provisioning - Jabro-Test-01** \n - New instance has successfully been created by Jabalabs. \n - Date: 12/18/2025 05:19 AM \n - Author: sean"
}
@@ -1,7 +0,0 @@
{
"sha": "c8d0b1672ec076a1f5d5886a9622c098b94d6ac64eb130f3ca10f1cdfac37a4e",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-ECB853BF-5ACC-4D03-BCC3-AF5A1D2706A3-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| LAST RESULT | TYPE | NAME | DETAILS | LAST RUN | NEXT RUN |\n|-------------|----------------|-----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|-------------------------|\n| \u2705 | Workflow Job | | | 11/14/2019 02:42 PM | |\n| \u2705 | Security Scan Job | Centos 8 SCAP Scan Job | | 01/23/2022 12:43 PM | |\n| \u274c | Security Scan Job | | | 04/22/2021 09:15 AM | |"
}
@@ -1,7 +0,0 @@
{
"sha": "d229d8077de5254220a83ba7fe7fbba24a6d50d3e5e6c0eba0eb707bd1264f86",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-1E7A4007-3C1F-4E44-A046-41A0C62111AA-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| STATUS | NAME | ADDRESS(ES) |\n|--------|------|-------------|\n| Running | qa-hosts-kube-1 | 10.x.x.x |\n| Running | qa-hosts-kube-2 | 10.x.x.x |\n| Running | qa-hosts-kube-3 | 10.x.x.x |\n| Running | qa-hosts-kube-4 | 10.x.x.x |"
}
@@ -1,7 +0,0 @@
{
"sha": "d5277987d200c169f9297345c3971cd27ed731fe97f8b4f9d9667c86c3553610",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-5E19B144-131B-4F0D-892B-9D10DB431658-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| YEAR | 2020 | 2021 | 2022 |\n|------|------|------|------|\n| YEAR | 10000.0 | 15000.0 | 8000.0 |"
}
@@ -1,7 +0,0 @@
{
"sha": "d5a971d5baea55392f51f6f77fd9c81208c6b92157fd5e483a3db302b03f9dbd",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-36CA0790-41CA-421C-9971-50062F8B82F4-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Category | Price | Cost |\n|----------------|----------|--------|\n| COMPUTE | $102 | $102.30|\n| MEMORY | $0 | $0 |\n| STORAGE | $12 | $12.42 |\n| NETWORK | $0.01 | $0.01 |\n| EXTRA | $0 | $0 |\n| MTD PRICE | $115 | $114.73|\n| TOTAL (PROJECTED) | $115 | $114.73|"
}
@@ -1,7 +0,0 @@
{
"sha": "d9e0bfda4cf3d77ebf33a8c86b0be7672f90d9c5a471074c2f22fa74b39ac988",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-E455650E-5DD7-40E6-BF40-5449281F27C2-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| CLOUD | TYPE | NAME | PLAN | START DATE | END DATE | USAGE STATUS | USAGE PRICE |\n|-------|------------|-------------|---------------------------------------------------------------------|----------------------|--------------------|---------------|--------------|\n| AWS-US-EAST-2 | Discovered | bastion | T2 Medium - 2 Core, 4GB Memory | 11/10/2022 09:07 AM | Stopped | $1.4006 |\n| | | | | | | | |\n| | Price Type | Quantity | | | | | |\n| | Storage | gp2 | 35 GB | | | | |\n| AWS-US-EAST-2 | Discovered | bastion | T2 Medium - 2 Core, 4GB Memory | 11/10/2022 08:29 AM | Running | $0.0324 |\n| | | | | | | | |\n| | Price Type | Quantity | | | | | |\n| | Compute | N/A | | | | | |\n| | Storage | gp2 | 35 GB | | | $0.0293 | |\n| | | | | | | | |\n| AWS-US-EAST-2 | Discovered | bastion | T2 Medium - 2 Core, 4GB Memory | 08/27/2022 07:36 PM | Stopped | $8.5582 |\n| | | | | | | | |\n| | Price Type | Quantity | | | | | |\n| | Storage | gp2 | 35 GB | | | $8.5582 | |"
}
@@ -1,7 +0,0 @@
{
"sha": "dc38b36144b0c1b3a79b915c1a19ba327b4a4b582fc7f1e96be238dfafe9a08d",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-CDD94D4F-361B-4237-B8FD-B88CCFCB6118-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Filters | Date Run | Report Type | Created By | Status |\n|---------|---------------------|----------------------|--------------|--------|\n| Automation Analytics Feb 22, 2022 21:29:37 | 02/22/2022 02:29 PM | Automation Analytics | | Ready |\n| Automation Analytics Feb 22, 2022 21:17:59 | 02/22/2022 02:17 PM | Automation Analytics | | Ready |\n| Automation Analytics Feb 22, 2022 19:41:56 | 02/22/2022 12:41 PM | Automation Analytics | | Ready |\n| Automation Analytics Feb 22, 2022 19:28:00 | 02/22/2022 12:28 PM | Automation Analytics | | Ready |\n| Automation Analytics Feb 22, 2022 19:20:08 | 02/22/2022 12:20 PM | Automation Analytics | | Ready |\n| Automation Analytics Feb 22, 2022 17:49:16 | 02/22/2022 10:49 AM | Automation Analytics | | Ready |\n| Automation Overview Feb 21, 2022 22:07:43 | 02/21/2022 03:07 PM | Automation Overview | | Ready |\n| Automation Overview Feb 21, 2022 21:35:16 | 02/21/2022 02:35 PM | Automation Overview | | Ready |\n| Automation Overview Feb 21, 2022 21:31:53 | 02/21/2022 02:31 PM | Automation Overview | | Ready |"
}
@@ -1,7 +0,0 @@
{
"sha": "e3ae83786639dd50cce28dffaf6ab86d1998bacaf1e06039eda1592a9b3bcb1b",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-88431DCD-48BE-4414-BC59-89F31565FE07-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| NAME | REGION | TERM | CURRENT COST | QUANTITY | PROPOSED COST | SAVINGS |\n|------------|---------|---------|--------------|----------|---------------|-------------|\n| Standard_D2 | westus | P1Y | $109.63 | 1 | $75.23 | $34.40 |"
}
@@ -1,7 +0,0 @@
{
"sha": "e63485cb67e53e7abed466429e684178cb1963a618bce5c0411158a398b5807c",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-EA3645F4-5E49-4CFC-90CF-4A04880BF602-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Month | Budget | Actual |\n|-------|---------|--------|\n| January | $25,000 | $17,634 |\n| February | $25,000 | $25,149 |\n| March | $25,000 | $27,313 |\n| April | $25,000 | $30,827 |\n| May | $25,000 | $34,149 |\n| June | $25,000 | $33,066 |\n| July | $25,000 | $19,850 |\n| August | $25,000 | $19,509 |\n| September | $25,000 | $34,380 |\n| October | $25,000 | $30,328 |\n| November | $25,000 | $20,517 |\n| December | $25,000 | $17,226 |"
}
@@ -1,7 +0,0 @@
{
"sha": "ef8ff91132425a90d6d32ce373fcd30daff9d6ffc979e37edd4937978945e83a",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-70A9C315-58C0-4BF7-94E0-3F370A17D1E4-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| CLOUD | COUNT | MEMORY | STORAGE | CPU | PRICE |\n|-------|-------|--------|---------|-----|-------|\n| VMware Demo Cluster | 19 | 72.4GiB | 842.0GiB | 12 | $143.94 |\n| Nutanix Labs 2 | 7 | 52.5GiB | 720.0GiB | 8 | $91.82 |\n| AWS MorpheusDemo | 5 | 7.0GiB | 60.0GiB | 1 | $17.41 |\n| Other Instance 1 | 1 | 7.5GiB | 90.0GiB | 4 | $15.08 |\n| Other Instance 2 | 1 | 2.0GiB | 30.0GiB | 1 | $0.00 |\n| Other Instance 3 | 1 | 2.0GiB | 10.0GiB | 1 | $0.00 |\n| Other Instance 4 | 1 | 8.0GiB | 120.0GiB | 1 | $26.23 |\n| Other Instance 5 | 1 | 16.0GiB | 160.0GiB | 1 | $51.78 |"
}
@@ -1,7 +0,0 @@
{
"sha": "f2dfebdda3640d24c45ccb19f3826bc33b86165da977a9d031143b8f2bde7fa2",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-A7B59327-4830-4BD7-9653-DBC1F89E3304-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| NAME | CODE |\n| --- | --- |\n| Cloud Resources | cr |"
}
@@ -1,7 +0,0 @@
{
"sha": "f4c3c36ba08c51a68c2a73ec1a74884db0e83d367b9e8a5e01206c7700343fe8",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-CE0F030E-A45D-4412-92D9-38608B669FC9-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Configuration | Group: All Clouds | Environment: Dev |\n|---------------|--------------------|-------------------|\n| Cloud: QA Amazon | Resource Pool: labs | Network: 172.31.0.0/20 (subnet-22ba157b) |\n| Plan: T2 Micro - 1 Core, 1GB Memory | Name: My Workload | Price: $11.3016 / Month |"
}
@@ -1,7 +0,0 @@
{
"sha": "f8f32e823a7f473c35a643a5163d09e1eaa0dcdd24cba6b84766c14e09d470c2",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-429BA931-09F3-4CC2-AC8E-45B3D0167664-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| TYPE | NAME | LOCATION | REGION | MONTH TO DATE | PROJECTED TOTAL |\n|------|------|----------|--------|---------------|-----------------|\n| AWS | AWS MorpheusDemo | US West (N. Cali) | ec2.us-west-1.amazonaws.com | $2,732.60 | $4,345.97 |\n| Azure | Morpheus Azure | West US | westus | $1,030.92 | $1,742.40 |\n| Nutanix Labs 2 | Nutanix Labs 2 | - | - | $511.96 | $859.41 |"
}
@@ -1,7 +0,0 @@
{
"sha": "fe0c6ab239aba9109ba605bf3930353881b4a6ca629e4567c4e068f5f3289234",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-B0C645F7-A738-4975-9AA9-9F5E0C581874-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| Field | Value |\n|-------------|------------------------------------------------------------------------|\n| NAME | Custom App |\n| CODE | app |\n| DESCRIPTION | (empty) |\n| CATEGORY | Web |\n| LABELS | app,aws,vmware |"
}
@@ -1,7 +0,0 @@
{
"sha": "fff05f56cefda6ddcc9d70456f9e7d360e6b440132b2b4c1511a56c79680c31f",
"src": "https://support.hpe.com/hpesc/public/api/document/sd00007510en_us/GUID-1B7CFE86-1657-4EF7-B515-E3D104CDB5D2-high.png",
"model": "qwen2.5vl:7b",
"certain": true,
"markdown": "| GROUP WORKLOADS | CLOUD WORKLOADS | CLUSTER WORKLOADS |\n|-----------------|------------------|--------------------|\n| All Clouds | QA VMware | QA Docker Cluster |\n| Permanent | QA Docker | None |\n| QA Docker | QA Nutanix Prism | QA Kubernetes Cluster |\n| QA Kubernetes | QA Amazon | |\n| group-42574 | QA Kubernetes | |\n| group-42578 | dg vmware | |\n\n| LOG HISTORY | LOG TRENDS |\n|-------------|------------|\n| ALERT sendmsg logger failed No such file or directory errno | pam_unix sudo session session opened for user root uid by uid |\n| pam_unix sudo session session closed for user root | dd-vmw-ubuntu-1 CRON pam_unix cron session closed for user root |\n| dd-vmw-ubuntu-1 CRON pam_unix cron session opened for user root by uid |\n\n| JOB EXECUTIONS | BACKUPS | TASK EXECUTIONS |\n|----------------|---------|------------------|\n| Successful: 15 | Successful: 1 | Successful: 15 |\n| Failed: 1 | Failed: 0 | Failed: 1 |\n\n| ACTIVITY |\n|----------|\n| au-dkr-blueprint-1 - apache | New backup has successfully been created for 'Morpheus QA' |\n| au-dkr-blueprint-1 - nginx | New backup has successfully been created for 'Morpheus QA' |\n| abdelkrim | Instance has successfully been deleted by 'Morpheus QA'. |\n| abdelkrim | Server has successfully been deleted by 'Morpheus QA'. |\n| au-dkr-blueprint-1 | App has successfully been created. |"
}
+8 -1
View File
@@ -62,6 +62,11 @@ class BundleSpec:
platform: str | None = None
language: str = "en-US"
source_url: str | None = None # overrides the default support.hpe.com URL
# Vision-OCR this bundle's images? Default False. Image-only data lives in
# only a handful of docs (the release-schedule matrix); every other image
# in the corpus is a product UI screenshot that OCR would just add noise
# for. So OCR is an explicit per-bundle opt-in, not a corpus-wide sweep.
ocr: bool = False
# Pinned baseline bundles. docIds confirmed by probing the portal for
@@ -101,7 +106,7 @@ BUNDLES: list[BundleSpec] = [
# the matrix text comes from the VISION_OCR pass (see scrape/vision.py).
# version=None — it spans all major streams, not one release.
BundleSpec("morpheus_release_schedule", "sf000111242en_us", "HPE Morpheus Software Release Schedule",
None, "Release Schedule", "single"),
None, "Release Schedule", "single", ocr=True),
]
@@ -180,6 +185,7 @@ def discover_bundle(s: requests.Session, spec: BundleSpec) -> dict[str, Any]:
"dates": {},
"landing_page": spec.doc_id,
"source_url": spec.source_url or f"https://www.hpe.com/psnow/doc/{spec.doc_id}",
"ocr": spec.ocr,
}
abstract_html = _get(s, f"{API}/{spec.doc_id}", expect_json=False)
@@ -211,6 +217,7 @@ def discover_bundle(s: requests.Session, spec: BundleSpec) -> dict[str, Any]:
"dates": {"Published": meta.get("published", "")},
"landing_page": landing,
"source_url": spec.source_url or DOC_URL.format(doc_id=spec.doc_id),
"ocr": spec.ocr,
}
+5 -2
View File
@@ -212,7 +212,10 @@ def scrape_toc_bundle(s: requests.Session, bundle: dict, force: bool, concurrenc
page_html = fetch_toc_page(s, doc_id, entry.page_id)
if not page_html:
return False
body_md = html_to_md(page_html, s)
# Only pass the session (which enables image OCR) for bundles that
# opt in — image-only data lives in a few docs; the rest are UI
# screenshots that OCR would just turn into noise.
body_md = html_to_md(page_html, s if bundle.get("ocr") else None)
sidecar = {
"bundle_id": slug,
"page_id": entry.page_id,
@@ -243,7 +246,7 @@ def scrape_single_bundle(s: requests.Session, bundle: dict, force: bool) -> int:
if not html:
print(f" ! {slug}: empty body", file=sys.stderr)
return 0
body_md = html_to_md(html, s)
body_md = html_to_md(html, s if bundle.get("ocr") else None)
sidecar = {
"bundle_id": slug,
"page_id": doc_id,
+10 -6
View File
@@ -27,13 +27,17 @@ Reliability (the whole point of this module):
table wrong does so identically every run — so every transcription also
ships with a "verify against the source image" caveat.
Cost control (a full --force re-scrape re-touches every page weekly):
Scope: OCR is a per-bundle opt-in (BundleSpec.ocr in scrape/bundles.py), NOT
a corpus-wide sweep. Image-only data is rare — only the release-schedule
matrix in this corpus; every other image is a product UI screenshot that OCR
would just turn into a noise "table". So only allowlisted bundles reach this
module; the runner passes no session for the rest.
Cost control (secondary, now that scope is an allowlist):
- Content-hash cache in corpus/.vision-cache/ — each unique image is
OCR'd once, ever, and the result is committed so CI reuses it. The same
diagram shared across version bundles collapses to one OCR.
- VISION_MAX_NEW bounds NEW OCRs per run so the first run can't balloon
into hours; the cache fills incrementally over subsequent refreshes.
Deferred images are logged (never silently dropped).
OCR'd once, ever, and the result is committed so CI reuses it.
- VISION_MAX_NEW still bounds NEW OCRs per run as a safety net; with the
allowlist it rarely binds. Deferred images are logged, never dropped.
Every failure path degrades to None — a down endpoint, a timeout, a decode
error — so the scrape never blocks on vision. Defaults target the git.jpaul.io
+171
View File
@@ -0,0 +1,171 @@
"""Build a human-inspectable report of every vision-OCR'd image.
Reads corpus/.vision-cache/*.json (written by scrape/vision.py) and emits a
self-contained HTML page that puts each SOURCE IMAGE next to its OCR
transcription, so a human can eyeball accuracy. Uncertain transcriptions
(the two OCR samples disagreed) sort to the top. Images are downscaled and
inlined as data URIs so the page is fully self-contained (no external
requests) and the original full-res image is one click away.
Usage:
python -m scripts.vision_report # -> vision_report.html
python -m scripts.vision_report --out /tmp/r.html
python -m scripts.vision_report --no-embed # link images, don't inline (tiny file)
"""
from __future__ import annotations
import argparse
import base64
import glob
import html
import io
import json
import re
import sys
from pathlib import Path
import requests
ROOT = Path(__file__).resolve().parent.parent
CACHE_DIR = ROOT / "corpus" / ".vision-cache"
CORPUS = ROOT / "corpus"
UA = "morpheus-docs-mcp/0.1 (+https://git.jpaul.io/justin/morpheus-docs)"
MAX_W = 1100 # downscale width for the inlined preview
def _basename(url: str) -> str:
return re.sub(r"\?.*$", "", url.rsplit("/", 1)[-1])
def _pages_for(basename: str) -> list[str]:
"""Which corpus pages reference this image (by filename), as bundle/page."""
hits: list[str] = []
for md in CORPUS.glob("*/*.md"):
try:
if basename in md.read_text():
hits.append(f"{md.parent.name}/{md.stem}")
except Exception:
continue
return sorted(hits)
def _thumb(url: str, embed: bool) -> str | None:
if not embed:
return None
try:
data = requests.get(url, headers={"User-Agent": UA}, timeout=60).content
from PIL import Image
im = Image.open(io.BytesIO(data))
if im.mode not in ("RGB", "L"):
im = im.convert("RGB")
if im.width > MAX_W:
im = im.resize((MAX_W, round(im.height * MAX_W / im.width)), Image.LANCZOS)
buf = io.BytesIO()
im.save(buf, format="JPEG", quality=82)
return "data:image/jpeg;base64," + base64.b64encode(buf.getvalue()).decode()
except Exception as e:
print(f" ! thumb failed for {url[:70]}: {e}", file=sys.stderr)
return None
def _md_table_to_html(md: str) -> str:
"""Render a markdown table as an HTML table; fall back to <pre> otherwise."""
rows = [ln for ln in md.splitlines() if ln.strip().startswith("|")]
if len(rows) < 2:
return f"<pre>{html.escape(md)}</pre>"
def cells(line: str) -> list[str]:
return [c.strip() for c in line.strip().strip("|").split("|")]
head = cells(rows[0])
body = [cells(r) for r in rows[2:]] # rows[1] is the |---| separator
out = ["<table><thead><tr>"] + [f"<th>{html.escape(c)}</th>" for c in head] + ["</tr></thead><tbody>"]
for r in body:
out.append("<tr>" + "".join(f"<td>{html.escape(c)}</td>" for c in r) + "</tr>")
out.append("</tbody></table>")
return "".join(out)
def build(embed: bool) -> str:
entries = []
for f in sorted(glob.glob(str(CACHE_DIR / "*.json"))):
try:
entries.append(json.load(open(f)))
except Exception:
continue
withmd = [e for e in entries if e.get("markdown")]
# uncertain first, then by source URL for stable ordering
withmd.sort(key=lambda e: (bool(e.get("certain")), e.get("src", "")))
n_uncertain = sum(1 for e in withmd if not e.get("certain"))
cards = []
for i, e in enumerate(withmd, 1):
src = e.get("src", "")
bn = _basename(src)
pages = _pages_for(bn)
thumb = _thumb(src, embed)
badge = ("<span class='ok'>certain</span>" if e.get("certain")
else "<span class='warn'>UNCERTAIN — samples disagreed</span>")
img_html = (f"<img src='{thumb}' alt='source image'>" if thumb
else f"<div class='noimg'>[not inlined — open original]</div>")
pages_html = " ".join(f"<code>{html.escape(p)}</code>" for p in pages) or "<em>(none found)</em>"
cards.append(f"""
<section class='card'>
<div class='meta'>
<span class='num'>#{i}</span> {badge}
<span class='model'>{html.escape(e.get('model',''))}</span>
<div class='pages'>pages: {pages_html}</div>
<a class='orig' href='{html.escape(src)}' target='_blank' rel='noopener'>open original image ↗</a>
</div>
<div class='pair'>
<div class='src'>{img_html}</div>
<div class='ocr'>{_md_table_to_html(e.get('markdown',''))}</div>
</div>
</section>""")
style = """
:root{color-scheme:light dark}
body{font:14px/1.5 system-ui,sans-serif;margin:0;padding:24px;max-width:1400px;margin:auto}
h1{font-size:20px} .summary{color:#666;margin-bottom:20px}
.card{border:1px solid #8883;border-radius:10px;padding:16px;margin:0 0 20px}
.meta{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:12px;font-size:13px}
.num{font-weight:700}
.ok{background:#1a7f37;color:#fff;padding:1px 8px;border-radius:10px;font-size:12px}
.warn{background:#b34700;color:#fff;padding:1px 8px;border-radius:10px;font-size:12px}
.model{color:#888;font-family:monospace}
.pages{flex-basis:100%;color:#777} .pages code{font-size:12px}
.orig{margin-left:auto}
.pair{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}
@media(max-width:900px){.pair{grid-template-columns:1fr}}
.src img{max-width:100%;border:1px solid #8884;border-radius:6px}
.noimg{color:#999;padding:40px;text-align:center;border:1px dashed #8884;border-radius:6px}
table{border-collapse:collapse;font-size:12px;width:100%}
th,td{border:1px solid #8884;padding:3px 7px;text-align:left}
th{background:#8881}
pre{white-space:pre-wrap;font-size:12px;background:#8881;padding:10px;border-radius:6px}
"""
return f"""<!doctype html><html><head><meta charset='utf-8'>
<meta name='viewport' content='width=device-width,initial-scale=1'>
<title>Vision OCR inspection report</title><style>{style}</style></head><body>
<h1>Vision OCR inspection report</h1>
<div class='summary'>{len(withmd)} transcribed image(s) — {n_uncertain} uncertain, {len(withmd)-n_uncertain} certain.
Each source image (downscaled preview; click “open original” for full-res) is shown next to its OCR transcription.
Uncertain items are listed first.</div>
{''.join(cards)}
</body></html>"""
def main() -> int:
p = argparse.ArgumentParser(description="Build the vision-OCR inspection report.")
p.add_argument("--out", default=str(ROOT / "vision_report.html"))
p.add_argument("--no-embed", action="store_true", help="link images instead of inlining them")
args = p.parse_args()
if not CACHE_DIR.exists():
print(f"no cache dir at {CACHE_DIR} — run the scraper with VISION_OCR=1 first", file=sys.stderr)
return 1
html_doc = build(embed=not args.no_embed)
Path(args.out).write_text(html_doc)
print(f"wrote {args.out}", file=sys.stderr)
return 0
if __name__ == "__main__":
sys.exit(main())