Mike0021 commited on
Commit
fc90384
·
verified ·
1 Parent(s): 36a016c

Publish reviewed HTTP evaluation and final deployment verification

Browse files
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": "f104170c6d090d802c727aaad8dfa811f06d03ed",
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
- "assets/agent.worker-euGpP_Md.js": true,
18
- "assets/index-wZi62oe2.js": true,
19
- "http-help.html": false
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

  • SHA256: 56d33ecd20d44677a644efcf384cfbf479c3d742d571b2d594576579e14eb707
  • Pointer size: 130 Bytes
  • Size of remote file: 77.2 kB

Git LFS Details

  • SHA256: 44b3eb86029244eabd79530048e12f3062baa24587a7b369c2d37dab23dbde22
  • Pointer size: 131 Bytes
  • Size of remote file: 112 kB
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

  • SHA256: 4442082671196175e794f517061cd9f37dd6977f1424a2b58ea2c90516050626
  • Pointer size: 130 Bytes
  • Size of remote file: 63.6 kB

Git LFS Details

  • SHA256: f6bd3b8dc5f2d63d7dc0953205f8b8a85e2e9d19dc6e15cf164dd65170b11cdf
  • Pointer size: 130 Bytes
  • Size of remote file: 87.3 kB
validation/http-shell-live.json CHANGED
@@ -1,11 +1,11 @@
1
  {
2
- "date": "2026-09-16T08:34:50.371Z",
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": 80,
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": 267,
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": 139,
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": 14,
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": 25,
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": 369,
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": 197,
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": 24,
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": 8,
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": 107,
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": 191,
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": 1012,
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": 9,
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": 221,
125
  "stdout": "",
126
  "stderr": "bash: execution aborted\n",
127
  "exitCode": 124,
@@ -135,7 +135,7 @@
135
  "errors": [],
136
  "requests": [
137
  {
138
- "url": "https://cdn-lfs-us-1.hf.co/repos/48/29/4829a3c0b18453b5b13362a29a513b6902552cc52273d2fb4092cb0203b93c28/a766512083268f7d7bb31f37171d6cd05a5af81e38c2612ac41cbb473a2c5f6c",
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://cdn-lfs-us-1.hf.co/repos/48/29/4829a3c0b18453b5b13362a29a513b6902552cc52273d2fb4092cb0203b93c28/a766512083268f7d7bb31f37171d6cd05a5af81e38c2612ac41cbb473a2c5f6c",
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
  ],