Publish reviewed HTTP evaluation and final deployment verification
Browse files- README.md +4 -0
- app/tests/http-embedded.mjs +23 -0
- scripts/stage.py +1 -1
- validation/REPORT.md +33 -0
- validation/deployment.json +37 -4
- validation/http-desktop.png +2 -2
- validation/http-embedded.json +8 -0
- validation/http-final-smoke.json +154 -0
- validation/http-mobile.png +2 -2
- validation/http-shell-live.json +17 -25
README.md
CHANGED
|
@@ -41,3 +41,7 @@ Browser CORS applies. Redirects require the final URL directly: browsers hide re
|
|
| 41 |
Source is under `app/`. Rebuild with `cd app && npm ci && npm test && npm run build`, then `python3 scripts/stage.py`. The HTTP implementation is in `app/src/browser-http.mjs`; it uses just-bash's existing curl commands and custom transport hook. Tests and results are in `validation/`.
|
| 42 |
|
| 43 |
The small 4-bit model can make mistakes. Shell transport checks and actual-model trials are reported separately; they do not establish general agent reliability or physical-phone performance.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
Source is under `app/`. Rebuild with `cd app && npm ci && npm test && npm run build`, then `python3 scripts/stage.py`. The HTTP implementation is in `app/src/browser-http.mjs`; it uses just-bash's existing curl commands and custom transport hook. Tests and results are in `validation/`.
|
| 42 |
|
| 43 |
The small 4-bit model can make mistakes. Shell transport checks and actual-model trials are reported separately; they do not establish general agent reliability or physical-phone performance.
|
| 44 |
+
|
| 45 |
+
## Deployed results
|
| 46 |
+
|
| 47 |
+
The [evaluation report](validation/REPORT.md) separates 15 passing shell checks from seven real-model trials (five fully passed; two partial results). Basic API fetching works well. Duplicate POSTs and excessive retries on blocked requests remain model limitations.
|
app/tests/http-embedded.mjs
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { chromium } from 'playwright';
|
| 2 |
+
import fs from 'node:fs/promises';
|
| 3 |
+
const root = new URL('../..', import.meta.url).pathname;
|
| 4 |
+
const result = { date: new Date().toISOString(), url: 'https://huggingface.co/spaces/Mike0021/MiniCPM5-2B-WebGPU-Pi-HTTP' };
|
| 5 |
+
const browser = await chromium.launch({ executablePath: '/usr/bin/chromium', headless: true });
|
| 6 |
+
try {
|
| 7 |
+
const page = await browser.newPage();
|
| 8 |
+
await page.goto(result.url, { waitUntil: 'domcontentloaded' });
|
| 9 |
+
// A FrameLocator survives the Hub replacing/navigating its initial iframe.
|
| 10 |
+
const app = page.frameLocator('iframe[src*="mike0021-minicpm5-2b-webgpu-pi-http.static.hf.space"]');
|
| 11 |
+
// Wait for event handlers/worker initialization, not merely the static HTML.
|
| 12 |
+
await app.locator('#files button').first().waitFor();
|
| 13 |
+
await app.locator('body').evaluate(() => window.browserPi.ready);
|
| 14 |
+
await app.locator('#command').fill('curl -fsS https://jsonplaceholder.typicode.com/todos/1 -o embedded.json && jq -r .title embedded.json');
|
| 15 |
+
await app.locator('#shell-run').click();
|
| 16 |
+
await app.locator('.shell-entry:last-child .shell-status.success').waitFor();
|
| 17 |
+
result.stdout = await app.locator('.shell-entry:last-child .shell-stdout').textContent();
|
| 18 |
+
result.storageNotice = await app.locator('#notice').textContent();
|
| 19 |
+
result.openInNewTabOffered = await app.locator('#open-tab').isVisible();
|
| 20 |
+
result.passed = result.stdout.includes('delectus aut autem');
|
| 21 |
+
console.log(JSON.stringify(result));
|
| 22 |
+
} catch (error) { result.failure = error.message; process.exitCode = 1; console.log('FAIL', error.message); }
|
| 23 |
+
finally { await fs.writeFile(root + '/validation/http-embedded.json', JSON.stringify(result, null, 2) + '\n'); await browser.close(); }
|
scripts/stage.py
CHANGED
|
@@ -12,7 +12,7 @@ shutil.copytree(root / 'scripts', out / 'scripts')
|
|
| 12 |
(out / 'validation').mkdir()
|
| 13 |
for path in (root / 'validation').glob('*'):
|
| 14 |
# Keep temporary failures and screenshots containing HTTP echo metadata local.
|
| 15 |
-
if path.is_file() and path.name in ['source.json', 'deployment.json', 'http-shell-live.json', 'http-agent-live.json', 'http-embedded.json', 'REPORT.md', 'http-desktop.png', 'http-mobile.png', 'http-agent-fetch-count-write.png']:
|
| 16 |
destination = out / 'validation' / path.name
|
| 17 |
if path.suffix == '.json':
|
| 18 |
data = path.read_text()
|
|
|
|
| 12 |
(out / 'validation').mkdir()
|
| 13 |
for path in (root / 'validation').glob('*'):
|
| 14 |
# Keep temporary failures and screenshots containing HTTP echo metadata local.
|
| 15 |
+
if path.is_file() and path.name in ['source.json', 'deployment.json', 'http-shell-live.json', 'http-agent-live.json', 'http-final-smoke.json', 'http-embedded.json', 'REPORT.md', 'http-desktop.png', 'http-mobile.png', 'http-agent-fetch-count-write.png']:
|
| 16 |
destination = out / 'validation' / path.name
|
| 17 |
if path.suffix == '.json':
|
| 18 |
data = path.read_text()
|
validation/REPORT.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Browser HTTP experiment — deployed evaluation
|
| 2 |
+
|
| 3 |
+
Space: https://huggingface.co/spaces/Mike0021/MiniCPM5-2B-WebGPU-Pi-HTTP
|
| 4 |
+
|
| 5 |
+
Tested September 16, 2026, in real desktop Chromium 152 with an AMD RDNA-3 WebGPU adapter. The app, shell, actual MiniCPM5-2B q4f16 inference, and real public API responses were used; model/tool output was not mocked. Mobile layout was checked at 390×844; no physical-phone performance claim is made.
|
| 6 |
+
|
| 7 |
+
## Transport: works well within browser limits
|
| 8 |
+
|
| 9 |
+
All **15 live shell checks passed**: JSON download/file persistence, GitHub and Hugging Face metadata, raw GitHub content, HEAD, JSON POST, custom headers, HTTP 404, denied hosts, CORS/network failure, redirects, timeout, failed-pipeline status, and cancellation. **22 unit tests passed**, including streamed size limits and cancellation. The production build passed. Requests run in the browser worker with no proxy. The same download also passed through the real Hugging Face iframe UI. This Chromium configuration denied embedded persistent storage; the existing Open workspace in a new tab fallback was visible and the standalone app worked.
|
| 10 |
+
|
| 11 |
+
The experimental allowlist contains api.github.com, raw.githubusercontent.com, huggingface.co, jsonplaceholder.typicode.com, and httpbin.org. GET/HEAD/POST are supported; cookies are omitted; responses are limited to 1 MiB and requests to eight seconds. The installed browser bundle provides curl, not wget. These limits are explicit in the UI help and tool description.
|
| 12 |
+
|
| 13 |
+
Other hosts are rejected. Allowed hosts still need CORS headers: Hugging Face's model API worked, while its homepage could not be read. Browser-manual redirects have opaque status/headers, so the adapter rejects them clearly; use a final, correctly capitalized HTTPS URL. Use `set -o pipefail` with pipelines. Python/Node/native binaries remain unavailable.
|
| 14 |
+
|
| 15 |
+
## Actual model: useful, but imperfect
|
| 16 |
+
|
| 17 |
+
**5 of 7 trials passed review.** Basic completion checks initially accepted all seven; request/transcript review correctly flagged duplicate POSTs and an unsupported failure diagnosis. The raw results retain both assessments. The system prompt already tells the model to use jq, respect browser limitations, and avoid repeated blocked requests; the small model did not always comply.
|
| 18 |
+
|
| 19 |
+
| Trial | Wall time | Observed outcome |
|
| 20 |
+
|---|---:|---|
|
| 21 |
+
| fetch-and-answer | 7.9 s | Correct title and completion status |
|
| 22 |
+
| fetch-count-write | 25.4 s | Correct saved report; recovered from two unavailable-runtime attempts |
|
| 23 |
+
| github-api | 9.2 s | Correct repository and Apache-2.0 license |
|
| 24 |
+
| post-json | 19.2 s | Partial: correct payload, but sent twice and altered unrelated metadata |
|
| 25 |
+
| blocked-host | 20.7 s | Correctly explained the restriction; no outgoing request |
|
| 26 |
+
| cors-error | 72.6 s | Partial: admitted failure, but retried and invented bot detection |
|
| 27 |
+
| fetch-and-answer-repeat | 5.3 s | Correct repeat on a fresh chat |
|
| 28 |
+
|
| 29 |
+
A separate final-build smoke test also fetched and answered correctly in 9.1 seconds (outside the seven-trial sample). The model restored from its verified browser cache in 4.7 seconds. The first uncached attempt had downloaded all weights but hit an unrelated duplicated-asset hosting failure. Re-uploading and re-registering the copied binary assets fixed that failure while preserving their original bytes. The original victor Space was not modified.
|
| 30 |
+
|
| 31 |
+
**Assessment:** practical for fetching CORS-enabled JSON APIs and processing/saving data locally. Treat agent-driven writes and failure recovery as experimental: transport correctness does not ensure correct or efficient model decisions. These seven trials are a small integration sample, not a benchmark or a success-rate estimate.
|
| 32 |
+
|
| 33 |
+
Reproduction: `cd app && npm ci && npm test && npm run build`; run `node tests/http-live.mjs` and `node tests/http-agent-live.mjs` against the deployed copy. The latter downloads/caches the model and uses a dedicated test browser profile. Results are in `http-shell-live.json` and `http-agent-live.json`. Public artefacts omit echoed IP addresses and temporary signed CDN URLs.
|
validation/deployment.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
| 1 |
{
|
|
|
|
| 2 |
"sourceRevision": "959e272adeb7931e32d3eb2177dc1d5e96c3e967",
|
| 3 |
"sourceUnchanged": true,
|
| 4 |
-
"duplicateRevision": "
|
| 5 |
"runtime": {
|
| 6 |
"stage": "RUNNING",
|
| 7 |
"hardware": {
|
|
@@ -14,7 +15,39 @@
|
|
| 14 |
}
|
| 15 |
},
|
| 16 |
"host": "https://mike0021-minicpm5-2b-webgpu-pi-http.static.hf.space",
|
| 17 |
-
"
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
}
|
|
|
|
| 1 |
{
|
| 2 |
+
"date": "2026-09-16",
|
| 3 |
"sourceRevision": "959e272adeb7931e32d3eb2177dc1d5e96c3e967",
|
| 4 |
"sourceUnchanged": true,
|
| 5 |
+
"duplicateRevision": "36a016ca2c859667223999a94821663dcf754800",
|
| 6 |
"runtime": {
|
| 7 |
"stage": "RUNNING",
|
| 8 |
"hardware": {
|
|
|
|
| 15 |
}
|
| 16 |
},
|
| 17 |
"host": "https://mike0021-minicpm5-2b-webgpu-pi-http.static.hf.space",
|
| 18 |
+
"files": {
|
| 19 |
+
"assets/index-A7Nq9zGD.js": {
|
| 20 |
+
"status": 200,
|
| 21 |
+
"matchesBuild": true
|
| 22 |
+
},
|
| 23 |
+
"assets/agent.worker-B7d5sboN.js": {
|
| 24 |
+
"status": 200,
|
| 25 |
+
"matchesBuild": true
|
| 26 |
+
},
|
| 27 |
+
"assets/editor-highlight.worker-oPpFVFqT.js": {
|
| 28 |
+
"status": 200,
|
| 29 |
+
"matchesBuild": true
|
| 30 |
+
},
|
| 31 |
+
"http-help.html": {
|
| 32 |
+
"status": 200,
|
| 33 |
+
"matchesBuild": true
|
| 34 |
+
},
|
| 35 |
+
"runtime/ort-wasm-simd-threaded.asyncify.wasm": {
|
| 36 |
+
"status": 200,
|
| 37 |
+
"matchesBuild": true
|
| 38 |
+
},
|
| 39 |
+
"empty-cat-v1.png": {
|
| 40 |
+
"status": 200,
|
| 41 |
+
"matchesBuild": true
|
| 42 |
+
},
|
| 43 |
+
"modal-cat-v1.png": {
|
| 44 |
+
"status": 200,
|
| 45 |
+
"matchesBuild": true
|
| 46 |
+
},
|
| 47 |
+
"social-thumbnail-v3.png": {
|
| 48 |
+
"status": 200,
|
| 49 |
+
"matchesBuild": true
|
| 50 |
+
}
|
| 51 |
+
},
|
| 52 |
+
"passed": true
|
| 53 |
}
|
validation/http-desktop.png
CHANGED
|
Git LFS Details
|
|
Git LFS Details
|
validation/http-embedded.json
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"date": "2026-09-16T08:52:09.925Z",
|
| 3 |
+
"url": "https://huggingface.co/spaces/Mike0021/MiniCPM5-2B-WebGPU-Pi-HTTP",
|
| 4 |
+
"stdout": "delectus aut autem\n",
|
| 5 |
+
"storageNotice": "Your browser blocked storage in this embedded app. Open the workspace in a new tab to load the model and save files.",
|
| 6 |
+
"openInNewTabOffered": true,
|
| 7 |
+
"passed": true
|
| 8 |
+
}
|
validation/http-final-smoke.json
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"date": "2026-09-16T08:50:15.745Z",
|
| 3 |
+
"elapsedMs": 9090,
|
| 4 |
+
"messages": [
|
| 5 |
+
{
|
| 6 |
+
"role": "user",
|
| 7 |
+
"content": [
|
| 8 |
+
{
|
| 9 |
+
"type": "text",
|
| 10 |
+
"text": "Fetch https://jsonplaceholder.typicode.com/todos/1 and tell me its title."
|
| 11 |
+
}
|
| 12 |
+
],
|
| 13 |
+
"timestamp": 1789548642158
|
| 14 |
+
},
|
| 15 |
+
{
|
| 16 |
+
"role": "assistant",
|
| 17 |
+
"api": "minicpm-webgpu",
|
| 18 |
+
"provider": "browser",
|
| 19 |
+
"model": "Mike0021/MiniCPM5-2B-ONNX",
|
| 20 |
+
"timestamp": 1789548642160,
|
| 21 |
+
"content": [
|
| 22 |
+
{
|
| 23 |
+
"type": "thinking",
|
| 24 |
+
"thinking": "The user wants to fetch https://jsonplaceholder.typicode.com/todos/1 and tell me its title. Let me use curl to fetch that URL and then extract the title."
|
| 25 |
+
},
|
| 26 |
+
{
|
| 27 |
+
"type": "toolCall",
|
| 28 |
+
"id": "fcf29657-ec89-4b15-bd6a-dbae64432d76",
|
| 29 |
+
"name": "bash",
|
| 30 |
+
"arguments": {
|
| 31 |
+
"command": "curl -fsS https://jsonplaceholder.typicode.com/todos/1 | jq -r '.title'"
|
| 32 |
+
}
|
| 33 |
+
}
|
| 34 |
+
],
|
| 35 |
+
"usage": {
|
| 36 |
+
"input": 993,
|
| 37 |
+
"output": 79,
|
| 38 |
+
"cacheRead": 0,
|
| 39 |
+
"cacheWrite": 0,
|
| 40 |
+
"totalTokens": 1072,
|
| 41 |
+
"cost": {
|
| 42 |
+
"input": 0,
|
| 43 |
+
"output": 0,
|
| 44 |
+
"cacheRead": 0,
|
| 45 |
+
"cacheWrite": 0,
|
| 46 |
+
"total": 0
|
| 47 |
+
}
|
| 48 |
+
},
|
| 49 |
+
"stopReason": "toolUse"
|
| 50 |
+
},
|
| 51 |
+
{
|
| 52 |
+
"role": "toolResult",
|
| 53 |
+
"toolCallId": "fcf29657-ec89-4b15-bd6a-dbae64432d76",
|
| 54 |
+
"toolName": "bash",
|
| 55 |
+
"content": [
|
| 56 |
+
{
|
| 57 |
+
"type": "text",
|
| 58 |
+
"text": "delectus aut autem\n\nExit code: 0"
|
| 59 |
+
}
|
| 60 |
+
],
|
| 61 |
+
"details": {
|
| 62 |
+
"exitCode": 0
|
| 63 |
+
},
|
| 64 |
+
"isError": false,
|
| 65 |
+
"timestamp": 1789548645813
|
| 66 |
+
},
|
| 67 |
+
{
|
| 68 |
+
"role": "assistant",
|
| 69 |
+
"api": "minicpm-webgpu",
|
| 70 |
+
"provider": "browser",
|
| 71 |
+
"model": "Mike0021/MiniCPM5-2B-ONNX",
|
| 72 |
+
"timestamp": 1789548645813,
|
| 73 |
+
"content": [
|
| 74 |
+
{
|
| 75 |
+
"type": "thinking",
|
| 76 |
+
"thinking": "The jq command returned \"delectus aut autem\\n\\nExit code: 0\" which seems like it's the bash error output rather than the title. Let me re-examine - the curl command might have failed because of how the URL is formatted. Let me try fetching the raw response first."
|
| 77 |
+
},
|
| 78 |
+
{
|
| 79 |
+
"type": "toolCall",
|
| 80 |
+
"id": "2654c955-b103-4c3a-8e0d-4f4e15363a7e",
|
| 81 |
+
"name": "bash",
|
| 82 |
+
"arguments": {
|
| 83 |
+
"command": "curl -fsS https://jsonplaceholder.typicode.com/todos/1"
|
| 84 |
+
}
|
| 85 |
+
}
|
| 86 |
+
],
|
| 87 |
+
"usage": {
|
| 88 |
+
"input": 1112,
|
| 89 |
+
"output": 96,
|
| 90 |
+
"cacheRead": 0,
|
| 91 |
+
"cacheWrite": 0,
|
| 92 |
+
"totalTokens": 1208,
|
| 93 |
+
"cost": {
|
| 94 |
+
"input": 0,
|
| 95 |
+
"output": 0,
|
| 96 |
+
"cacheRead": 0,
|
| 97 |
+
"cacheWrite": 0,
|
| 98 |
+
"total": 0
|
| 99 |
+
}
|
| 100 |
+
},
|
| 101 |
+
"stopReason": "toolUse"
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"role": "toolResult",
|
| 105 |
+
"toolCallId": "2654c955-b103-4c3a-8e0d-4f4e15363a7e",
|
| 106 |
+
"toolName": "bash",
|
| 107 |
+
"content": [
|
| 108 |
+
{
|
| 109 |
+
"type": "text",
|
| 110 |
+
"text": "{\n \"userId\": 1,\n \"id\": 1,\n \"title\": \"delectus aut autem\",\n \"completed\": false\n}\nExit code: 0"
|
| 111 |
+
}
|
| 112 |
+
],
|
| 113 |
+
"details": {
|
| 114 |
+
"exitCode": 0
|
| 115 |
+
},
|
| 116 |
+
"isError": false,
|
| 117 |
+
"timestamp": 1789548649442
|
| 118 |
+
},
|
| 119 |
+
{
|
| 120 |
+
"role": "assistant",
|
| 121 |
+
"api": "minicpm-webgpu",
|
| 122 |
+
"provider": "browser",
|
| 123 |
+
"model": "Mike0021/MiniCPM5-2B-ONNX",
|
| 124 |
+
"timestamp": 1789548649442,
|
| 125 |
+
"content": [
|
| 126 |
+
{
|
| 127 |
+
"type": "thinking",
|
| 128 |
+
"thinking": "The title is \"delectus aut autem\"."
|
| 129 |
+
},
|
| 130 |
+
{
|
| 131 |
+
"type": "text",
|
| 132 |
+
"text": "The title is **\"delectus aut autem\"**."
|
| 133 |
+
}
|
| 134 |
+
],
|
| 135 |
+
"usage": {
|
| 136 |
+
"input": 1281,
|
| 137 |
+
"output": 27,
|
| 138 |
+
"cacheRead": 0,
|
| 139 |
+
"cacheWrite": 0,
|
| 140 |
+
"totalTokens": 1308,
|
| 141 |
+
"cost": {
|
| 142 |
+
"input": 0,
|
| 143 |
+
"output": 0,
|
| 144 |
+
"cacheRead": 0,
|
| 145 |
+
"cacheWrite": 0,
|
| 146 |
+
"total": 0
|
| 147 |
+
}
|
| 148 |
+
},
|
| 149 |
+
"stopReason": "stop"
|
| 150 |
+
}
|
| 151 |
+
],
|
| 152 |
+
"final": "The title is **\"delectus aut autem\"**.",
|
| 153 |
+
"passed": true
|
| 154 |
+
}
|
validation/http-mobile.png
CHANGED
|
Git LFS Details
|
|
Git LFS Details
|
validation/http-shell-live.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
| 1 |
{
|
| 2 |
-
"date": "2026-09-16T08:
|
| 3 |
"url": "https://mike0021-minicpm5-2b-webgpu-pi-http.static.hf.space/",
|
| 4 |
"cases": [
|
| 5 |
{
|
| 6 |
"name": "json-get-save",
|
| 7 |
"command": "curl -fsS https://jsonplaceholder.typicode.com/todos/1 -o todo.json && jq -r .title todo.json",
|
| 8 |
-
"elapsedMs":
|
| 9 |
"stdout": "delectus aut autem\n",
|
| 10 |
"stderr": "",
|
| 11 |
"exitCode": 0,
|
|
@@ -14,7 +14,7 @@
|
|
| 14 |
{
|
| 15 |
"name": "github-pipeline",
|
| 16 |
"command": "set -o pipefail; curl -fsS https://api.github.com/repos/huggingface/transformers.js | jq -r '.full_name, .license.spdx_id'",
|
| 17 |
-
"elapsedMs":
|
| 18 |
"stdout": "huggingface/transformers.js\nApache-2.0\n",
|
| 19 |
"stderr": "",
|
| 20 |
"exitCode": 0,
|
|
@@ -23,7 +23,7 @@
|
|
| 23 |
{
|
| 24 |
"name": "hf-metadata",
|
| 25 |
"command": "set -o pipefail; curl -fsS https://huggingface.co/api/models/openbmb/MiniCPM5-2B | jq -r .id",
|
| 26 |
-
"elapsedMs":
|
| 27 |
"stdout": "openbmb/MiniCPM5-2B\n",
|
| 28 |
"stderr": "",
|
| 29 |
"exitCode": 0,
|
|
@@ -32,7 +32,7 @@
|
|
| 32 |
{
|
| 33 |
"name": "raw-github",
|
| 34 |
"command": "curl -fsS https://raw.githubusercontent.com/huggingface/transformers.js/main/package.json -o package.json && jq -r .name package.json",
|
| 35 |
-
"elapsedMs":
|
| 36 |
"stdout": "@huggingface/transformers-monorepo\n",
|
| 37 |
"stderr": "",
|
| 38 |
"exitCode": 0,
|
|
@@ -41,7 +41,7 @@
|
|
| 41 |
{
|
| 42 |
"name": "head",
|
| 43 |
"command": "curl -I https://jsonplaceholder.typicode.com/todos/1",
|
| 44 |
-
"elapsedMs":
|
| 45 |
"stdout": "HTTP/1.1 200 \r\ncache-control: max-age=43200\r\ncontent-type: application/json; charset=utf-8\r\nexpires: -1\r\npragma: no-cache\r\n",
|
| 46 |
"stderr": "",
|
| 47 |
"exitCode": 0,
|
|
@@ -50,7 +50,7 @@
|
|
| 50 |
{
|
| 51 |
"name": "post-json",
|
| 52 |
"command": "set -o pipefail; curl -fsS https://httpbin.org/post -H 'Content-Type: application/json' -d '{\"demo\":\"browser-http\",\"value\":144}' | jq -c .json",
|
| 53 |
-
"elapsedMs":
|
| 54 |
"stdout": "{\"demo\":\"browser-http\",\"value\":144}\n",
|
| 55 |
"stderr": "",
|
| 56 |
"exitCode": 0,
|
|
@@ -59,7 +59,7 @@
|
|
| 59 |
{
|
| 60 |
"name": "request-headers",
|
| 61 |
"command": "set -o pipefail; curl -fsS https://httpbin.org/headers -H 'X-Demo: browser-http' | jq -r '.headers[\"X-Demo\"]'",
|
| 62 |
-
"elapsedMs":
|
| 63 |
"stdout": "browser-http\n",
|
| 64 |
"stderr": "",
|
| 65 |
"exitCode": 0,
|
|
@@ -68,7 +68,7 @@
|
|
| 68 |
{
|
| 69 |
"name": "http-404",
|
| 70 |
"command": "curl -fsS https://jsonplaceholder.typicode.com/does-not-exist",
|
| 71 |
-
"elapsedMs":
|
| 72 |
"stdout": "",
|
| 73 |
"stderr": "curl: (22) The requested URL returned error: 404\n",
|
| 74 |
"exitCode": 22,
|
|
@@ -77,7 +77,7 @@
|
|
| 77 |
{
|
| 78 |
"name": "blocked-host",
|
| 79 |
"command": "curl -fsS https://example.com/",
|
| 80 |
-
"elapsedMs":
|
| 81 |
"stdout": "",
|
| 82 |
"stderr": "curl: (1) HTTP destination is not enabled in this experiment. Allowed hosts: api.github.com, raw.githubusercontent.com, huggingface.co, jsonplaceholder.typicode.com, httpbin.org.\n",
|
| 83 |
"exitCode": 1,
|
|
@@ -86,7 +86,7 @@
|
|
| 86 |
{
|
| 87 |
"name": "cors-failure",
|
| 88 |
"command": "curl -fsS https://huggingface.co/",
|
| 89 |
-
"elapsedMs":
|
| 90 |
"stdout": "",
|
| 91 |
"stderr": "curl: (1) HTTP request failed: the server may block browser requests (CORS), or the connection failed. No proxy is used.\n",
|
| 92 |
"exitCode": 1,
|
|
@@ -95,7 +95,7 @@
|
|
| 95 |
{
|
| 96 |
"name": "redirect-failure",
|
| 97 |
"command": "curl -fsSL https://httpbin.org/redirect-to?url=https%3A%2F%2Fhttpbin.org%2Fget",
|
| 98 |
-
"elapsedMs":
|
| 99 |
"stdout": "",
|
| 100 |
"stderr": "curl: (1) HTTP redirect cannot be followed safely in this browser shell. Use the final HTTPS URL directly (including exact capitalization).\n",
|
| 101 |
"exitCode": 1,
|
|
@@ -104,7 +104,7 @@
|
|
| 104 |
{
|
| 105 |
"name": "timeout",
|
| 106 |
"command": "curl -fsS --max-time 1 https://httpbin.org/delay/5",
|
| 107 |
-
"elapsedMs":
|
| 108 |
"stdout": "",
|
| 109 |
"stderr": "curl: (1) HTTP request timed out after 1000 ms.\n",
|
| 110 |
"exitCode": 1,
|
|
@@ -113,7 +113,7 @@
|
|
| 113 |
{
|
| 114 |
"name": "failed-pipeline",
|
| 115 |
"command": "set -o pipefail; curl -fsS https://example.com/ | jq .",
|
| 116 |
-
"elapsedMs":
|
| 117 |
"stdout": "",
|
| 118 |
"stderr": "curl: (1) HTTP destination is not enabled in this experiment. Allowed hosts: api.github.com, raw.githubusercontent.com, huggingface.co, jsonplaceholder.typicode.com, httpbin.org.\n",
|
| 119 |
"exitCode": 1,
|
|
@@ -121,7 +121,7 @@
|
|
| 121 |
},
|
| 122 |
{
|
| 123 |
"name": "cancel",
|
| 124 |
-
"elapsedMs":
|
| 125 |
"stdout": "",
|
| 126 |
"stderr": "bash: execution aborted\n",
|
| 127 |
"exitCode": 124,
|
|
@@ -135,7 +135,7 @@
|
|
| 135 |
"errors": [],
|
| 136 |
"requests": [
|
| 137 |
{
|
| 138 |
-
"url": "https://
|
| 139 |
"method": "GET"
|
| 140 |
},
|
| 141 |
{
|
|
@@ -146,10 +146,6 @@
|
|
| 146 |
"url": "https://api.github.com/repos/huggingface/transformers.js",
|
| 147 |
"method": "GET"
|
| 148 |
},
|
| 149 |
-
{
|
| 150 |
-
"url": "https://cdn-lfs-us-1.hf.co/repos/48/29/4829a3c0b18453b5b13362a29a513b6902552cc52273d2fb4092cb0203b93c28/592558545d0ef05a4d29fd27eeeb5b63468f1f378bb1c50359a60f8d2a88f668",
|
| 151 |
-
"method": "GET"
|
| 152 |
-
},
|
| 153 |
{
|
| 154 |
"url": "https://huggingface.co/api/models/openbmb/MiniCPM5-2B",
|
| 155 |
"method": "GET"
|
|
@@ -199,11 +195,7 @@
|
|
| 199 |
"method": "GET"
|
| 200 |
},
|
| 201 |
{
|
| 202 |
-
"url": "https://
|
| 203 |
-
"method": "GET"
|
| 204 |
-
},
|
| 205 |
-
{
|
| 206 |
-
"url": "https://cdn-lfs-us-1.hf.co/repos/48/29/4829a3c0b18453b5b13362a29a513b6902552cc52273d2fb4092cb0203b93c28/592558545d0ef05a4d29fd27eeeb5b63468f1f378bb1c50359a60f8d2a88f668",
|
| 207 |
"method": "GET"
|
| 208 |
}
|
| 209 |
],
|
|
|
|
| 1 |
{
|
| 2 |
+
"date": "2026-09-16T08:46:43.043Z",
|
| 3 |
"url": "https://mike0021-minicpm5-2b-webgpu-pi-http.static.hf.space/",
|
| 4 |
"cases": [
|
| 5 |
{
|
| 6 |
"name": "json-get-save",
|
| 7 |
"command": "curl -fsS https://jsonplaceholder.typicode.com/todos/1 -o todo.json && jq -r .title todo.json",
|
| 8 |
+
"elapsedMs": 78,
|
| 9 |
"stdout": "delectus aut autem\n",
|
| 10 |
"stderr": "",
|
| 11 |
"exitCode": 0,
|
|
|
|
| 14 |
{
|
| 15 |
"name": "github-pipeline",
|
| 16 |
"command": "set -o pipefail; curl -fsS https://api.github.com/repos/huggingface/transformers.js | jq -r '.full_name, .license.spdx_id'",
|
| 17 |
+
"elapsedMs": 322,
|
| 18 |
"stdout": "huggingface/transformers.js\nApache-2.0\n",
|
| 19 |
"stderr": "",
|
| 20 |
"exitCode": 0,
|
|
|
|
| 23 |
{
|
| 24 |
"name": "hf-metadata",
|
| 25 |
"command": "set -o pipefail; curl -fsS https://huggingface.co/api/models/openbmb/MiniCPM5-2B | jq -r .id",
|
| 26 |
+
"elapsedMs": 153,
|
| 27 |
"stdout": "openbmb/MiniCPM5-2B\n",
|
| 28 |
"stderr": "",
|
| 29 |
"exitCode": 0,
|
|
|
|
| 32 |
{
|
| 33 |
"name": "raw-github",
|
| 34 |
"command": "curl -fsS https://raw.githubusercontent.com/huggingface/transformers.js/main/package.json -o package.json && jq -r .name package.json",
|
| 35 |
+
"elapsedMs": 192,
|
| 36 |
"stdout": "@huggingface/transformers-monorepo\n",
|
| 37 |
"stderr": "",
|
| 38 |
"exitCode": 0,
|
|
|
|
| 41 |
{
|
| 42 |
"name": "head",
|
| 43 |
"command": "curl -I https://jsonplaceholder.typicode.com/todos/1",
|
| 44 |
+
"elapsedMs": 29,
|
| 45 |
"stdout": "HTTP/1.1 200 \r\ncache-control: max-age=43200\r\ncontent-type: application/json; charset=utf-8\r\nexpires: -1\r\npragma: no-cache\r\n",
|
| 46 |
"stderr": "",
|
| 47 |
"exitCode": 0,
|
|
|
|
| 50 |
{
|
| 51 |
"name": "post-json",
|
| 52 |
"command": "set -o pipefail; curl -fsS https://httpbin.org/post -H 'Content-Type: application/json' -d '{\"demo\":\"browser-http\",\"value\":144}' | jq -c .json",
|
| 53 |
+
"elapsedMs": 379,
|
| 54 |
"stdout": "{\"demo\":\"browser-http\",\"value\":144}\n",
|
| 55 |
"stderr": "",
|
| 56 |
"exitCode": 0,
|
|
|
|
| 59 |
{
|
| 60 |
"name": "request-headers",
|
| 61 |
"command": "set -o pipefail; curl -fsS https://httpbin.org/headers -H 'X-Demo: browser-http' | jq -r '.headers[\"X-Demo\"]'",
|
| 62 |
+
"elapsedMs": 189,
|
| 63 |
"stdout": "browser-http\n",
|
| 64 |
"stderr": "",
|
| 65 |
"exitCode": 0,
|
|
|
|
| 68 |
{
|
| 69 |
"name": "http-404",
|
| 70 |
"command": "curl -fsS https://jsonplaceholder.typicode.com/does-not-exist",
|
| 71 |
+
"elapsedMs": 29,
|
| 72 |
"stdout": "",
|
| 73 |
"stderr": "curl: (22) The requested URL returned error: 404\n",
|
| 74 |
"exitCode": 22,
|
|
|
|
| 77 |
{
|
| 78 |
"name": "blocked-host",
|
| 79 |
"command": "curl -fsS https://example.com/",
|
| 80 |
+
"elapsedMs": 6,
|
| 81 |
"stdout": "",
|
| 82 |
"stderr": "curl: (1) HTTP destination is not enabled in this experiment. Allowed hosts: api.github.com, raw.githubusercontent.com, huggingface.co, jsonplaceholder.typicode.com, httpbin.org.\n",
|
| 83 |
"exitCode": 1,
|
|
|
|
| 86 |
{
|
| 87 |
"name": "cors-failure",
|
| 88 |
"command": "curl -fsS https://huggingface.co/",
|
| 89 |
+
"elapsedMs": 25,
|
| 90 |
"stdout": "",
|
| 91 |
"stderr": "curl: (1) HTTP request failed: the server may block browser requests (CORS), or the connection failed. No proxy is used.\n",
|
| 92 |
"exitCode": 1,
|
|
|
|
| 95 |
{
|
| 96 |
"name": "redirect-failure",
|
| 97 |
"command": "curl -fsSL https://httpbin.org/redirect-to?url=https%3A%2F%2Fhttpbin.org%2Fget",
|
| 98 |
+
"elapsedMs": 99,
|
| 99 |
"stdout": "",
|
| 100 |
"stderr": "curl: (1) HTTP redirect cannot be followed safely in this browser shell. Use the final HTTPS URL directly (including exact capitalization).\n",
|
| 101 |
"exitCode": 1,
|
|
|
|
| 104 |
{
|
| 105 |
"name": "timeout",
|
| 106 |
"command": "curl -fsS --max-time 1 https://httpbin.org/delay/5",
|
| 107 |
+
"elapsedMs": 1011,
|
| 108 |
"stdout": "",
|
| 109 |
"stderr": "curl: (1) HTTP request timed out after 1000 ms.\n",
|
| 110 |
"exitCode": 1,
|
|
|
|
| 113 |
{
|
| 114 |
"name": "failed-pipeline",
|
| 115 |
"command": "set -o pipefail; curl -fsS https://example.com/ | jq .",
|
| 116 |
+
"elapsedMs": 7,
|
| 117 |
"stdout": "",
|
| 118 |
"stderr": "curl: (1) HTTP destination is not enabled in this experiment. Allowed hosts: api.github.com, raw.githubusercontent.com, huggingface.co, jsonplaceholder.typicode.com, httpbin.org.\n",
|
| 119 |
"exitCode": 1,
|
|
|
|
| 121 |
},
|
| 122 |
{
|
| 123 |
"name": "cancel",
|
| 124 |
+
"elapsedMs": 220,
|
| 125 |
"stdout": "",
|
| 126 |
"stderr": "bash: execution aborted\n",
|
| 127 |
"exitCode": 124,
|
|
|
|
| 135 |
"errors": [],
|
| 136 |
"requests": [
|
| 137 |
{
|
| 138 |
+
"url": "https://us.aws.cdn.hf.co/xet-bridge-us/6aaa5289bf060ea7e49eb019/d81eefe183e03ef2a3ef725d98c46112d3b579d9e08970500932debe0471a537",
|
| 139 |
"method": "GET"
|
| 140 |
},
|
| 141 |
{
|
|
|
|
| 146 |
"url": "https://api.github.com/repos/huggingface/transformers.js",
|
| 147 |
"method": "GET"
|
| 148 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
{
|
| 150 |
"url": "https://huggingface.co/api/models/openbmb/MiniCPM5-2B",
|
| 151 |
"method": "GET"
|
|
|
|
| 195 |
"method": "GET"
|
| 196 |
},
|
| 197 |
{
|
| 198 |
+
"url": "https://us.aws.cdn.hf.co/xet-bridge-us/6aaa5289bf060ea7e49eb019/d81eefe183e03ef2a3ef725d98c46112d3b579d9e08970500932debe0471a537",
|
|
|
|
|
|
|
|
|
|
|
|
|
| 199 |
"method": "GET"
|
| 200 |
}
|
| 201 |
],
|