Spaces:
Paused
Paused
Restore to commit fc8d7c6
#3
by bep40 - opened
This view is limited to 50 files because it contains too many changes. See the raw diff here.
- .gitattributes +0 -6
- .gitignore +1 -1
- .rebuild-trigger +0 -1
- CLAUDE.md +1 -1
- Dockerfile +14 -19
- README.md +86 -4
- _appdbg.txt +0 -99
- _applog.txt +0 -1
- _applog2.txt +0 -46
- _applog3.txt +0 -56
- _avatarjs.txt +0 -16
- _avfiles.txt +0 -3
- _avlist.txt +0 -7
- _chk.txt +0 -9
- _chk2.txt +0 -22
- _cleanup.txt +0 -5
- _cre3.txt +0 -2
- _cre4.txt +0 -3
- _create2.txt +0 -2
- _dbg.txt +0 -40
- _del.txt +0 -10
- _diag.txt +0 -9
- _fb.txt +0 -24
- _final_test.txt +0 -5
- _glbchk.txt +0 -5
- _hw.txt +0 -4
- _hw2.txt +0 -4
- _hw3.txt +0 -3
- _idxchk.txt +0 -6
- _logs3.txt +0 -7
- _logs4.txt +0 -40
- _mintest.txt +0 -10
- _recreate.txt +0 -3
- _rtest.txt +0 -6
- _setup.txt +0 -3
- _step2.txt +0 -1
- _sum.txt +0 -11
- _sum2.txt +0 -10
- _test10.txt +0 -10
- _test11.txt +0 -10
- _test12.txt +0 -4
- _test13.txt +0 -10
- _test14.txt +0 -15
- _test3.txt +0 -11
- _test4.txt +0 -9
- _test5.txt +0 -10
- _test6.txt +0 -11
- _test7.txt +0 -11
- _test8.txt +0 -10
- _test9.txt +0 -11
.gitattributes
CHANGED
|
@@ -51,9 +51,3 @@ public/avatars/ready_player_me_1.glb filter=lfs diff=lfs merge=lfs -text
|
|
| 51 |
public/avatars/ready_player_me_2.glb filter=lfs diff=lfs merge=lfs -text
|
| 52 |
public/avatars/vuong.glb filter=lfs diff=lfs merge=lfs -text
|
| 53 |
public/avatars/lisamy.glb filter=lfs diff=lfs merge=lfs -text
|
| 54 |
-
public/avatars/viverse_avatar_model_209370.vrm filter=lfs diff=lfs merge=lfs -text
|
| 55 |
-
public/avatars/scene.glb filter=lfs diff=lfs merge=lfs -text
|
| 56 |
-
public/avatars/scene[[:space:]](1).glb filter=lfs diff=lfs merge=lfs -text
|
| 57 |
-
public/avatars/scene[[:space:]](3).glb filter=lfs diff=lfs merge=lfs -text
|
| 58 |
-
public/avatars/vuong1.glb filter=lfs diff=lfs merge=lfs -text
|
| 59 |
-
public/avatars/lisamy1.glb filter=lfs diff=lfs merge=lfs -text
|
|
|
|
| 51 |
public/avatars/ready_player_me_2.glb filter=lfs diff=lfs merge=lfs -text
|
| 52 |
public/avatars/vuong.glb filter=lfs diff=lfs merge=lfs -text
|
| 53 |
public/avatars/lisamy.glb filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.gitignore
CHANGED
|
@@ -31,4 +31,4 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
|
|
| 31 |
.idea
|
| 32 |
|
| 33 |
# Finder (MacOS) folder config
|
| 34 |
-
.DS_Store
|
|
|
|
| 31 |
.idea
|
| 32 |
|
| 33 |
# Finder (MacOS) folder config
|
| 34 |
+
.DS_Store
|
.rebuild-trigger
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
Trigger rebuild - fix picker + thumbnails
|
|
|
|
|
|
CLAUDE.md
CHANGED
|
@@ -108,4 +108,4 @@ Then, run index.ts
|
|
| 108 |
bun --hot ./index.ts
|
| 109 |
```
|
| 110 |
|
| 111 |
-
For more information, read the Bun API docs in `node_modules/bun-types/docs/**.mdx`.
|
|
|
|
| 108 |
bun --hot ./index.ts
|
| 109 |
```
|
| 110 |
|
| 111 |
+
For more information, read the Bun API docs in `node_modules/bun-types/docs/**.mdx`.
|
Dockerfile
CHANGED
|
@@ -1,32 +1,27 @@
|
|
| 1 |
-
#
|
|
|
|
| 2 |
FROM oven/bun:1-slim
|
| 3 |
|
| 4 |
WORKDIR /app
|
| 5 |
|
| 6 |
-
#
|
| 7 |
-
RUN apt-get update && apt-get install -y python3 python3-pip python3-venv supervisor && rm -rf /var/lib/apt/lists/*
|
| 8 |
-
|
| 9 |
-
# Create virtual environment for Python
|
| 10 |
-
RUN python3 -m venv /app/venv
|
| 11 |
-
|
| 12 |
-
# Copy package files for Bun
|
| 13 |
COPY package.json bun.lock ./
|
|
|
|
| 14 |
RUN bun install --frozen-lockfile --production || (sleep 3 && bun install --frozen-lockfile --production)
|
| 15 |
|
| 16 |
-
# Copy
|
| 17 |
-
COPY requirements.txt ./
|
| 18 |
-
RUN /app/venv/bin/pip install --no-cache-dir -r requirements.txt
|
| 19 |
-
|
| 20 |
-
# Copy application code
|
| 21 |
COPY . .
|
| 22 |
|
| 23 |
-
# Supervisor config
|
| 24 |
-
RUN echo '[supervisord]\nnodaemon=true\n\n[program:sidecar]\ncommand=/app/venv/bin/python upload_service.py\nstdout_logfile=/dev/stdout\nstdout_logfile_maxbytes=0\nstderr_logfile=/dev/stderr\nstderr_logfile_maxbytes=0\nautostart=true\nautorestart=true\n\n[program:bun]\ncommand=bun index.ts\nstdout_logfile=/dev/stdout\nstdout_logfile_maxbytes=0\nstderr_logfile=/dev/stderr\nstderr_logfile_maxbytes=0\nautostart=true\nautorestart=true\n' > /etc/supervisor/conf.d/supervisord.conf
|
| 25 |
-
|
| 26 |
ENV NODE_ENV=production
|
| 27 |
ENV PORT=7860
|
| 28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
-
|
| 31 |
|
| 32 |
-
CMD ["
|
|
|
|
| 1 |
+
# Single container: Bun serves the bundled front-end AND the /api/session
|
| 2 |
+
# proxy. HF Spaces (sdk: docker) routes traffic to app_port, set to 7860.
|
| 3 |
FROM oven/bun:1-slim
|
| 4 |
|
| 5 |
WORKDIR /app
|
| 6 |
|
| 7 |
+
# Copy just the lockfile and package.json first for layer caching
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
COPY package.json bun.lock ./
|
| 9 |
+
# Retry install once if it fails (network flakiness)
|
| 10 |
RUN bun install --frozen-lockfile --production || (sleep 3 && bun install --frozen-lockfile --production)
|
| 11 |
|
| 12 |
+
# Copy the rest of the application
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
COPY . .
|
| 14 |
|
|
|
|
|
|
|
|
|
|
| 15 |
ENV NODE_ENV=production
|
| 16 |
ENV PORT=7860
|
| 17 |
+
# Point at a speech-to-speech backend by setting ONE of these in the Space
|
| 18 |
+
# settings (index.ts prefers LOAD_BALANCER_URL):
|
| 19 |
+
# LOAD_BALANCER_URL a load balancer's base URL (a secret) — talks to the pool directly
|
| 20 |
+
# SESSION_PROXY_URL another deployment's /api to piggyback (e.g. a public demo Space)
|
| 21 |
+
# With neither set, the app runs in direct mode (paste a ws:// URL in Settings).
|
| 22 |
+
|
| 23 |
+
EXPOSE 7860
|
| 24 |
|
| 25 |
+
USER bun
|
| 26 |
|
| 27 |
+
CMD ["bun", "index.ts"]
|
README.md
CHANGED
|
@@ -4,14 +4,96 @@ emoji: 🗣️
|
|
| 4 |
colorFrom: indigo
|
| 5 |
colorTo: purple
|
| 6 |
sdk: docker
|
| 7 |
-
pinned: false
|
| 8 |
app_port: 7860
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
tags:
|
| 10 |
- ml-intern
|
| 11 |
---
|
| 12 |
|
| 13 |
-
# Gemma
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
|
| 15 |
-
|
| 16 |
|
| 17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
colorFrom: indigo
|
| 5 |
colorTo: purple
|
| 6 |
sdk: docker
|
|
|
|
| 7 |
app_port: 7860
|
| 8 |
+
pinned: false
|
| 9 |
+
thumbnail: https://huggingface.co/spaces/victor/gemma-avatar/resolve/main/thumbnail.webp
|
| 10 |
+
short_description: Talk to Gemma 4 face to face, with a 3D lip-synced avatar
|
| 11 |
+
models:
|
| 12 |
+
- google/gemma-4-31B-it
|
| 13 |
+
- nvidia/parakeet-tdt-1.1b
|
| 14 |
+
- Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice
|
| 15 |
tags:
|
| 16 |
- ml-intern
|
| 17 |
---
|
| 18 |
|
| 19 |
+
# Gemma Avatar
|
| 20 |
+
|
| 21 |
+
Realtime voice chat with a 3D talking-head avatar. Same AI stack as the
|
| 22 |
+
[smolagents/hf-realtime-voice](https://huggingface.co/spaces/smolagents/hf-realtime-voice)
|
| 23 |
+
Space ([blog post](https://huggingface.co/blog/cerebras-gemma4-voice-ai)), but the
|
| 24 |
+
orb visualization is replaced by a [TalkingHead](https://github.com/met4citizen/TalkingHead)
|
| 25 |
+
3D avatar with real-time audio-driven lip-sync.
|
| 26 |
+
|
| 27 |
+
## The pipeline
|
| 28 |
+
|
| 29 |
+
```
|
| 30 |
+
you speak → silero-VAD → parakeet-tdt-1.1b (STT) → gemma-4-31B-it on Cerebras → Qwen3-TTS → avatar speaks
|
| 31 |
+
```
|
| 32 |
+
|
| 33 |
+
Transport is the OpenAI Realtime GA protocol over WebSocket against Hugging
|
| 34 |
+
Face's speech-to-speech backend: mic PCM16 @ 16 kHz goes up as
|
| 35 |
+
`input_audio_buffer.append`, TTS PCM16 @ 16 kHz comes back as
|
| 36 |
+
`response.output_audio.delta`, transcripts stream alongside.
|
| 37 |
+
|
| 38 |
+
## How the avatar works
|
| 39 |
+
|
| 40 |
+
- **Rendering / body language** — [TalkingHead](https://github.com/met4citizen/TalkingHead)
|
| 41 |
+
(three.js). Blinking, breathing, idle sway, moods, hand gestures, and emoji
|
| 42 |
+
expressions are its built-in animation system.
|
| 43 |
+
- **Lip-sync** — the backend sends raw PCM only (no word timings, no visemes),
|
| 44 |
+
so the mouth is driven from the audio itself with
|
| 45 |
+
[HeadAudio](https://github.com/met4citizen/HeadAudio): an AudioWorklet that
|
| 46 |
+
classifies MFCC frames into Oculus visemes (~50 ms latency, fully in-browser).
|
| 47 |
+
The s2s playback worklet is routed into TalkingHead's audio graph
|
| 48 |
+
(`audioAnalyzerNode → audioSpeechGainNode → reverb → speakers`) and HeadAudio
|
| 49 |
+
taps the speech gain node.
|
| 50 |
+
- **The model plays the avatar** — three function tools are declared to the
|
| 51 |
+
backend: `set_mood`, `make_hand_gesture`, `make_facial_expression`. Gemma
|
| 52 |
+
calls them mid-conversation (smiles when greeting, shrugs when unsure,
|
| 53 |
+
thumbs-up when agreeing).
|
| 54 |
+
- **Choreography** — client statuses drive presence: the avatar makes eye
|
| 55 |
+
contact when you start talking, gestures with its hands on new utterances,
|
| 56 |
+
and barge-in clears the playback buffer so the mouth settles instantly.
|
| 57 |
+
|
| 58 |
+
## Run it
|
| 59 |
+
|
| 60 |
+
```bash
|
| 61 |
+
bun install
|
| 62 |
+
|
| 63 |
+
# Pick a backend (one of):
|
| 64 |
+
LOAD_BALANCER_URL=https://… bun run dev # a speech-to-speech load balancer
|
| 65 |
+
SESSION_PROXY_URL=https://…/api bun run dev # piggyback another deployment's /api (dev)
|
| 66 |
+
bun run dev # direct mode: paste a ws:// URL in Settings
|
| 67 |
+
```
|
| 68 |
+
|
| 69 |
+
Open http://localhost:3000 and tap **Start talking**.
|
| 70 |
+
|
| 71 |
+
\`?fakemic=1\` starts a session with a silent synthetic mic (useful for testing
|
| 72 |
+
the full loop without a microphone — trigger a reply from the console with
|
| 73 |
+
\`getClient().requestResponse()\`).
|
| 74 |
+
|
| 75 |
+
## Layout
|
| 76 |
+
|
| 77 |
+
```
|
| 78 |
+
index.ts Bun server: HTML import + /api/session proxy + static assets
|
| 79 |
+
index.html App shell (avatar hero, caption, subtitles, settings)
|
| 80 |
+
src/app.js Session wiring, tool executor, UI state
|
| 81 |
+
src/avatar.js AvatarStage: TalkingHead + HeadAudio + choreography
|
| 82 |
+
src/s2s/s2s-ws-client.js Realtime WS client (vendored from the Space; orb removed,
|
| 83 |
+
injectable output node + worklet base URL + shared-ctx close)
|
| 84 |
+
src/s2s/codec.js PCM/base64 + transcript helpers (vendored, unchanged)
|
| 85 |
+
src/vendor/headaudio.min.mjs HeadAudio node class (bundled)
|
| 86 |
+
public/worklets/ mic-capture + audio-playback AudioWorklets (vendored, unchanged)
|
| 87 |
+
public/vendor/ HeadAudio worklet processor + viseme model (runtime-loaded)
|
| 88 |
+
public/avatars/brunette.glb Default avatar (Ready Player Me; CC BY-NC 4.0 — non-commercial)
|
| 89 |
+
```
|
| 90 |
|
| 91 |
+
## Notes
|
| 92 |
|
| 93 |
+
- The avatar GLB must have a Mixamo-compatible rig plus ARKit and Oculus-viseme
|
| 94 |
+
blend shapes. Ready Player Me avatars work with
|
| 95 |
+
\`?morphTargets=ARKit,Oculus%20Visemes\` on the GLB URL.
|
| 96 |
+
- TalkingHead owns the AudioContext; the s2s client is handed \`head.audioCtx\`
|
| 97 |
+
and never closes it.
|
| 98 |
+
- Everything animation-related runs on requestAnimationFrame — a backgrounded
|
| 99 |
+
tab freezes the avatar (audio keeps playing).
|
_appdbg.txt
DELETED
|
@@ -1,99 +0,0 @@
|
|
| 1 |
-
addChatMessage("user", q);
|
| 2 |
-
void maybeSwitchTopic(q);
|
| 3 |
-
if (!sendTextViaSession(q)) setCaption(
|
| 4 |
-
---
|
| 5 |
-
addChatMessage(role, text, newsItem = null) {
|
| 6 |
-
const msg = document.createElement("div");
|
| 7 |
-
msg.cla
|
| 8 |
-
---
|
| 9 |
-
addChatMessage("user", text);
|
| 10 |
-
chatInput.value = "";
|
| 11 |
-
|
| 12 |
-
// New topic? re-filter the news list and r
|
| 13 |
-
---
|
| 14 |
-
addChatMessage("assistant", `✅ Đã đăng bài AI tổng hợp (${selected.length} tin nhắn) lên VNEWS:\n${s
|
| 15 |
-
---
|
| 16 |
-
addChatMessage("assistant", `⚠️ VNEWS: ${data.error || "không đăng được bài"}.`);
|
| 17 |
-
}
|
| 18 |
-
} catch (e
|
| 19 |
-
---
|
| 20 |
-
addChatMessage("assistant", "⚠️ Lỗi khi kết nối VNEWS để đăng bài.");
|
| 21 |
-
}
|
| 22 |
-
rewriteBtn.textContent =
|
| 23 |
-
---
|
| 24 |
-
addChatMessage("assistant", normalized, newsItem);
|
| 25 |
-
}
|
| 26 |
-
});
|
| 27 |
-
|
| 28 |
-
c.addEventListener("response-finis
|
| 29 |
-
---
|
| 30 |
-
=== _attachClientEvents ===
|
| 31 |
-
_attachClientEvents(c) {
|
| 32 |
-
c.addEventListener("status", (e) => {
|
| 33 |
-
onStatus(e.detail.status);
|
| 34 |
-
});
|
| 35 |
-
|
| 36 |
-
c.addEventListener("queue", (e) => {
|
| 37 |
-
const { position } = e.detail;
|
| 38 |
-
setCaption(position > 0 ? `#${position} IN LINE…` : "ALMOST THERE…", "live");
|
| 39 |
-
});
|
| 40 |
-
|
| 41 |
-
c.addEventListener("transcript", (e) => {
|
| 42 |
-
const { role, text } = e.detail;
|
| 43 |
-
if (role === "assistant" && text) {
|
| 44 |
-
const normalized = smartNormalize(text);
|
| 45 |
-
showSubtitles(normalized);
|
| 46 |
-
// Attach the next image of the CURRENT news item (loops through its images).
|
| 47 |
-
const img = nextNewsImage();
|
| 48 |
-
const newsItem = curNews ? { ...curNews, image: img || curNews.image } : null;
|
| 49 |
-
addChatMessage("assistant", normalized, newsItem);
|
| 50 |
-
}
|
| 51 |
-
});
|
| 52 |
-
|
| 53 |
-
c.addEventListener("response-finished", () => {
|
| 54 |
-
autoGreetingSent = true;
|
| 55 |
-
fadeSubtitles();
|
| 56 |
-
if (preFetchedNews.length > 0) {
|
| 57 |
-
showNewsPanel(preFetchedNews.slice(0, NEWS_PAGE_SIZE));
|
| 58 |
-
}
|
| 59 |
-
});
|
| 60 |
-
|
| 61 |
-
c.addEventListener("toolcall", (e) => {
|
| 62 |
-
const { name, arguments: args, callId } = e.detail;
|
| 63 |
-
runTool(name, args, callId);
|
| 64 |
-
});
|
| 65 |
-
|
| 66 |
-
c.addEventListener("server-error", (e) => {
|
| 67 |
-
console.warn("server error:", e.detail.error);
|
| 68 |
-
});
|
| 69 |
-
|
| 70 |
-
c.addEventListener("error", () => {
|
| 71 |
-
void endSession();
|
| 72 |
-
});
|
| 73 |
-
}
|
| 74 |
-
|
| 75 |
-
async function endSession(silent = false) {
|
| 76 |
-
const c = client;
|
| 77 |
-
client = null;
|
| 78 |
-
sessionInProgress = false;
|
| 79 |
-
autoGreetingSent = false;
|
| 80 |
-
|
| 81 |
-
if (c) {
|
| 82 |
-
if (c.options.micStream) {
|
| 83 |
-
for (const track of c.options.micStream?.getTracks() ?? []) {
|
| 84 |
-
track.stop();
|
| 85 |
-
}
|
| 86 |
-
}
|
| 87 |
-
await c.close().catch(() => {});
|
| 88 |
-
}
|
| 89 |
-
|
| 90 |
-
stage.setConversationState("idle");
|
| 91 |
-
subtitles.classList.remove("visible");
|
| 92 |
-
|
| 93 |
-
if (newsPanel) {
|
| 94 |
-
newsPanel.hidden = true;
|
| 95 |
-
}
|
| 96 |
-
|
| 97 |
-
if (!silent) {
|
| 98 |
-
setCaption(CAPTIONS.idle);
|
| 99 |
-
setMainButton("start",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_applog.txt
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
HTTP 404 {"error":"Sorry, we can't find the page you are looking for."}
|
|
|
|
|
|
_applog2.txt
DELETED
|
@@ -1,46 +0,0 @@
|
|
| 1 |
-
app HTTP 404 {"error":"Sorry, we can't find the page you are looking for."}
|
| 2 |
-
=== build (last 2500) ===
|
| 3 |
-
home/user/app","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 4 |
-
|
| 5 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 6 |
-
|
| 7 |
-
data: {"data":"--> RUN apt-get update && apt-get install -y fakeroot && mv /usr/bin/apt-get /usr/bin/.apt-get && echo '#!/usr/bin/env sh\\nfakeroot /usr/bin/.apt-get $@' > /usr/bin/apt-get && chmod +x /usr/bin/apt-get && \trm -rf /var/lib/apt/lists/* && \tuseradd -m -u 1000 user","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 8 |
-
|
| 9 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 10 |
-
|
| 11 |
-
data: {"data":"--> RUN pip freeze > /tmp/freeze.txt","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 12 |
-
|
| 13 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 14 |
-
|
| 15 |
-
data: {"data":"--> COPY --chown=1000:1000 --from=root / /","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 16 |
-
|
| 17 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 18 |
-
|
| 19 |
-
data: {"data":"--> RUN \tapt-get update && \tapt-get install -y curl && \tcurl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \tapt-get install -y nodejs && \trm -rf /var/lib/apt/lists/* && apt-get clean","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 20 |
-
|
| 21 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 22 |
-
|
| 23 |
-
data: {"data":"--> RUN apt-get update && apt-get install -y \tgit \tgit-lfs \tffmpeg \tlibsm6 \tlibxext6 \tcmake \trsync \tlibgl1 \t&& rm -rf /var/lib/apt/lists/* \t&& git lfs install","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 24 |
-
|
| 25 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 26 |
-
|
| 27 |
-
data: {"data":"--> RUN --mount=target=/tmp/requirements.txt,source=requirements.txt pip install --no-cache-dir -r /tmp/requirements.txt \"torch<=2.11.0\" gradio[oauth,mcp]==6.20.0 \"uvicorn>=0.14.0\" \"websockets>=10.4\" spaces==0.51.0","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 28 |
-
|
| 29 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 30 |
-
|
| 31 |
-
data: {"data":"--> COPY --link --chown=1000 ./ /home/user/app","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 32 |
-
|
| 33 |
-
data: {"data":"DONE 0.0s\n","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 34 |
-
|
| 35 |
-
data: {"data":"--> COPY --from=pipfreeze --link --chown=1000 /tmp/freeze.txt /tmp/freeze.txt","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 36 |
-
|
| 37 |
-
data: {"data":"DONE 0.0s\n","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 38 |
-
|
| 39 |
-
data: {"data":"--> Pushing image","timestamp":"2026-07-19T05:26:49.606Z"}
|
| 40 |
-
|
| 41 |
-
data: {"data":"DONE 0.9s\n","timestamp":"2026-07-19T05:26:50.461Z"}
|
| 42 |
-
|
| 43 |
-
data: {"data":"--> Exporting cache","timestamp":"2026-07-19T05:26:50.461Z"}
|
| 44 |
-
|
| 45 |
-
data: {"data":"DONE 0.6s\n","timestamp":"2026-07-19T05:26:50.885Z"}
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_applog3.txt
DELETED
|
@@ -1,56 +0,0 @@
|
|
| 1 |
-
app HTTP 404 {"error":"Sorry, we can't find the page you are looking for."}
|
| 2 |
-
=== build (last 3000) ===
|
| 3 |
-
438Z"}
|
| 4 |
-
|
| 5 |
-
data: {"data":"--> RUN chown -R 1000:1000 /var/","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 6 |
-
|
| 7 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 8 |
-
|
| 9 |
-
data: {"data":"--> RUN apt-get update && apt-get install -y \tgit \tgit-lfs \tffmpeg \tlibsm6 \tlibxext6 \tcmake \trsync \tlibgl1 \t&& rm -rf /var/lib/apt/lists/* \t&& git lfs install","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 10 |
-
|
| 11 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 12 |
-
|
| 13 |
-
data: {"data":"--> RUN \tapt-get update && \tapt-get install -y curl && \tcurl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \tapt-get install -y nodejs && \trm -rf /var/lib/apt/lists/* && apt-get clean","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 14 |
-
|
| 15 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 16 |
-
|
| 17 |
-
data: {"data":"--> RUN pip freeze > /tmp/freeze.txt","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 18 |
-
|
| 19 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 20 |
-
|
| 21 |
-
data: {"data":"--> WORKDIR /home/user/app","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 22 |
-
|
| 23 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 24 |
-
|
| 25 |
-
data: {"data":"--> RUN pip install --no-cache-dir pip -U && pip install --no-cache-dir datasets \"huggingface-hub>=0.30\" \"hf-transfer>=0.1.4\" \"protobuf<4\" \"click<8.1\" torch==2.11.0","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 26 |
-
|
| 27 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 28 |
-
|
| 29 |
-
data: {"data":"--> RUN apt-get update && apt-get install -y fakeroot && mv /usr/bin/apt-get /usr/bin/.apt-get && echo '#!/usr/bin/env sh\\nfakeroot /usr/bin/.apt-get $@' > /usr/bin/apt-get && chmod +x /usr/bin/apt-get && \trm -rf /var/lib/apt/lists/* && \tuseradd -m -u 1000 user","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 30 |
-
|
| 31 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 32 |
-
|
| 33 |
-
data: {"data":"--> COPY --chown=1000:1000 --from=root / /","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 34 |
-
|
| 35 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 36 |
-
|
| 37 |
-
data: {"data":"--> RUN --mount=target=/tmp/requirements.txt,source=requirements.txt pip install --no-cache-dir -r /tmp/requirements.txt \"torch<=2.11.0\" gradio[oauth,mcp]==6.20.0 \"uvicorn>=0.14.0\" \"websockets>=10.4\" spaces==0.51.0","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 38 |
-
|
| 39 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 40 |
-
|
| 41 |
-
data: {"data":"--> COPY --link --chown=1000 ./ /home/user/app","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 42 |
-
|
| 43 |
-
data: {"data":"DONE 0.0s\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 44 |
-
|
| 45 |
-
data: {"data":"--> COPY --from=pipfreeze --link --chown=1000 /tmp/freeze.txt /tmp/freeze.txt","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 46 |
-
|
| 47 |
-
data: {"data":"DONE 0.0s\n","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 48 |
-
|
| 49 |
-
data: {"data":"--> Pushing image","timestamp":"2026-07-19T08:50:16.651Z"}
|
| 50 |
-
|
| 51 |
-
data: {"data":"DONE 0.8s\n","timestamp":"2026-07-19T08:50:17.469Z"}
|
| 52 |
-
|
| 53 |
-
data: {"data":"--> Exporting cache","timestamp":"2026-07-19T08:50:17.469Z"}
|
| 54 |
-
|
| 55 |
-
data: {"data":"DONE 0.6s\n","timestamp":"2026-07-19T08:50:17.948Z"}
|
| 56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_avatarjs.txt
DELETED
|
@@ -1,16 +0,0 @@
|
|
| 1 |
-
LEN 13225
|
| 2 |
-
--- .glb @ 6101 ---
|
| 3 |
-
.head);
|
| 4 |
-
await head.showAvatar(
|
| 5 |
-
{ url: opt.avatarUrl ?? "/avatars/vuong.glb", body: opt.body ?? "F", avatarMood: "neutral" },
|
| 6 |
-
(ev) => {
|
| 7 |
-
if (ev.lengthComputable) {
|
| 8 |
-
const pct = Math.min(100, Math.round((ev.loaded / ev.total) * 100));
|
| 9 |
-
if (t
|
| 10 |
-
--- image @ -1 ---
|
| 11 |
-
--- thumbnail @ -1 ---
|
| 12 |
-
--- img @ -1 ---
|
| 13 |
-
--- avatarName @ -1 ---
|
| 14 |
-
--- avatar.name @ -1 ---
|
| 15 |
-
--- src @ -1 ---
|
| 16 |
-
--- public/avatars @ -1 ---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_avfiles.txt
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
avatar files: ['public/avatars/Ella.glb', 'public/avatars/Lisa.glb', 'public/avatars/avatarsdk.glb', 'public/avatars/avaturn.glb', 'public/avatars/bruce_avaturn.glb', 'public/avatars/brunette-t.glb', 'public/avatars/brunette.glb', 'public/avatars/david.glb', 'public/avatars/fabio_avaturn.glb', 'public/avatars/julia.glb', 'public/avatars/lisamy.glb', 'public/avatars/mpfb.glb', 'public/avatars/ready_player_me_1.glb', 'public/avatars/ready_player_me_2.glb', 'public/avatars/vuong.glb', 'src/avatar.js']
|
| 2 |
-
top dirs: ['public', 'src']
|
| 3 |
-
total: 85
|
|
|
|
|
|
|
|
|
|
|
|
_avlist.txt
DELETED
|
@@ -1,7 +0,0 @@
|
|
| 1 |
-
===== src/app.js (len 59372) =====
|
| 2 |
-
[avatarList @ 8893] = false; let config = { lb: false, allowDirect: true }; let avatarList = []; let sessionInProgress = false; let autoGreetingSent = false; let preFetchedNews = []; let latestNewsUrl = null; let latestNewsSource = null; // ── News box state
|
| 3 |
-
[avatars @ 24432] chAvatarList() { try { const resp = await fetch("/api/avatars"); if (resp.ok) avatarList = (await resp.json()).avatars || []; } catch {} } function populateAvatarSelects(selectedName) { for (const sel of [chatAvatarSelect, se
|
| 4 |
-
[/avatars/ @ 25480] await stage.init({ avatarUrl: settings.avatar ? `/avatars/${settings.avatar}` : undefined, onprogress: (ev) => { if (ev.lengthComputable) { loading.textContent = `Loading avatar ${Math.min(100, Math.round(
|
| 5 |
-
[case " @ 42381] tatus === "closed" ? "" : "live"); switch (status) { case "idle": case "closed": setMainButton("start", "Start talking"); break; case "error": setMainButton("start", "Retry"); break; case "creating
|
| 6 |
-
src/index.html ERR RemoteEntryNotFoundError('404 Client Error. (Request ID: Root=1-6a5cad35-4660b29256e6cd0345252f48;ce084157-0252-44b9-b0f
|
| 7 |
-
===== index.html (len 6890) =====
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_chk.txt
DELETED
|
@@ -1,9 +0,0 @@
|
|
| 1 |
-
len 22595
|
| 2 |
-
has gemma-2-2b-it: False
|
| 3 |
-
has SUMMARY_ENDPOINT: False
|
| 4 |
-
has router.huggingface: True
|
| 5 |
-
has Step 1: True
|
| 6 |
-
MODEL line: const MODEL = Bun.env.SUMMARY_MODEL || "Qwen/Qwen2.5-7B-Instruct";
|
| 7 |
-
let out = "";
|
| 8 |
-
try {
|
| 9 |
-
c
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_chk2.txt
DELETED
|
@@ -1,22 +0,0 @@
|
|
| 1 |
-
stage: RUNNING
|
| 2 |
-
error: None
|
| 3 |
-
hw: {"current": "zero-a10g", "requested": "zero-a10g"}
|
| 4 |
-
/ HTTP 404 <!DOCTYPE html>
|
| 5 |
-
<html class="">
|
| 6 |
-
<head>
|
| 7 |
-
<meta charset="utf-8"/>
|
| 8 |
-
<meta
|
| 9 |
-
name="viewport"
|
| 10 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 11 |
-
/>
|
| 12 |
-
<meta
|
| 13 |
-
|
| 14 |
-
/api/summarize HTTP 404 <!DOCTYPE html>
|
| 15 |
-
<html class="">
|
| 16 |
-
<head>
|
| 17 |
-
<meta charset="utf-8"/>
|
| 18 |
-
<meta
|
| 19 |
-
name="viewport"
|
| 20 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 21 |
-
/>
|
| 22 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_cleanup.txt
DELETED
|
@@ -1,5 +0,0 @@
|
|
| 1 |
-
re-uploaded index.ts
|
| 2 |
-
deleted summarizer
|
| 3 |
-
deleted sumtest
|
| 4 |
-
del sumtest2: RepositoryNotFoundError('404 Client Error. (Request ID: Root=1-6a5ca389-4db6171f
|
| 5 |
-
del summarizer-api: RepositoryNotFoundError('404 Client Error. (Request ID: Root=1-6a5ca389-1b46a122
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_cre3.txt
DELETED
|
@@ -1,2 +0,0 @@
|
|
| 1 |
-
deleted summarizer gradio
|
| 2 |
-
create HTTP 400 {"error":"✖ ZeroGPU Spaces only work with Gradio SDK\n → at sdk"}
|
|
|
|
|
|
|
|
|
_cre4.txt
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
deleted
|
| 2 |
-
create: 200 {"url":"https://huggingface.co/spaces/bep40/summarizer","name":"bep40/summarizer","id":"6a5c6ba08216657ad2cb7ca3"}
|
| 3 |
-
hw now: {"current": null, "requested": "zero-a10g"}
|
|
|
|
|
|
|
|
|
|
|
|
_create2.txt
DELETED
|
@@ -1,2 +0,0 @@
|
|
| 1 |
-
deleted summarizer
|
| 2 |
-
create: 200 {"url":"https://huggingface.co/spaces/bep40/summarizer","name":"bep40/summarizer","id":"6a5c2a7627b2c876f2456a9e"}
|
|
|
|
|
|
|
|
|
_dbg.txt
DELETED
|
@@ -1,40 +0,0 @@
|
|
| 1 |
-
=== startWithSelection tail ===
|
| 2 |
-
2009: async function startWithSelection() {
|
| 3 |
-
2010: hidePicker();
|
| 4 |
-
2011: setCaption("WAKING HER UP…");
|
| 5 |
-
2012: setMainButton("busy", "Loading…");
|
| 6 |
-
2013: loading.classList.remove("done");
|
| 7 |
-
2014: loading.classList.add("active");
|
| 8 |
-
2015: loading.textContent = "Loading avatar...";
|
| 9 |
-
2016: const newsPromise = (settings.avatar === "vuong.glb" || !settings.avatar) ? getHotNews().catch(() => []) : Promise.resolve([]);
|
| 10 |
-
2017: let ok = false;
|
| 11 |
-
2018: try {
|
| 12 |
-
2019: const initPromise = stage.init({
|
| 13 |
-
2020: avatarUrl: settings.avatar ? `/avatars/${settings.avatar}` : undefined,
|
| 14 |
-
2021: onprogress: (ev) => {
|
| 15 |
-
2022: if (ev.lengthComputable) {
|
| 16 |
-
2023: loading.textContent = `Loading avatar ${Math.min(100, Math.round((ev.loaded / ev.total) * 100))}%`;
|
| 17 |
-
2024: }
|
| 18 |
-
2025: }
|
| 19 |
-
2026: });
|
| 20 |
-
2027: const timeout = new Promise((_, rej) => setTimeout(() => rej(new Error("init timeout")), 25000));
|
| 21 |
-
2028: await Promise.race([initPromise, timeout]);
|
| 22 |
-
2029: stage.resume(); // start render loop so the avatar is actually visible (not a single black frame)
|
| 23 |
-
2030: ok = true;
|
| 24 |
-
2031: } catch (err) {
|
| 25 |
-
2032: console.error("[startWithSelection] init failed/timeout:", err);
|
| 26 |
-
2033: } finally {
|
| 27 |
-
2034: try { preFetchedNews = await newsPromise; } catch { preFetchedNews = []; }
|
| 28 |
-
2035: newsSeq = preFetchedNews.slice();
|
| 29 |
-
2036: newsSeqIdx = -1;
|
| 30 |
-
2037: newsTopicQuery = "";
|
| 31 |
-
2038: loading.classList.remove("active");
|
| 32 |
-
2039: if (ok) setCaption(CAPTIONS.idle);
|
| 33 |
-
2040: else setCaption("AVATAR KHÔNG HIỂN THỊ — THỬ CHỌN AVATAR KHÁC", "error");
|
| 34 |
-
2041: setMainButton("start", "Start talking");
|
| 35 |
-
2042: }
|
| 36 |
-
2043: }
|
| 37 |
-
2044: const pickerStartBtn = document.getElementById("picker-start");
|
| 38 |
-
2045: if (pickerStartBtn) pickerStartBtn.addEventListener("click", () => void startWithSelection());
|
| 39 |
-
=== index.html topic-tags line ===
|
| 40 |
-
H50: <div id="topic-tags" class="topic-tags" hidden></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_del.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
delete HTTP 404 <!DOCTYPE html>
|
| 2 |
-
<html lang="en">
|
| 3 |
-
<head>
|
| 4 |
-
<meta charset="utf-8">
|
| 5 |
-
<title>Error</title>
|
| 6 |
-
</head>
|
| 7 |
-
<body>
|
| 8 |
-
<pre>Cannot DELETE /api/repos/bep40/summarizer</pre>
|
| 9 |
-
</body>
|
| 10 |
-
</html>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_diag.txt
DELETED
|
@@ -1,9 +0,0 @@
|
|
| 1 |
-
=== /api/summarize ===
|
| 2 |
-
fallback: True
|
| 3 |
-
title: Người dùng: Gemma 3 ra mắt hôm nay hỗ trợ 140 ngôn ngữ và chạy tốt trên điện tho
|
| 4 |
-
body: • Người dùng: Gemma 3 ra mắt hôm nay hỗ trợ 140 ngôn ngữ và chạy tốt trên điện thoại.
|
| 5 |
-
Avatar: Đúng, nó có các bản từ 1B đến 27B, rất nhẹ.
|
| 6 |
-
|
| 7 |
-
=== VNEWS /api/publish ===
|
| 8 |
-
/api/publish -> HTTP 400 {"error":"Thieu noi dung bai viet"}
|
| 9 |
-
/api/wall -> OK: {"post": {"id": "1784377022902", "title": "t", "text": "x", "source": "user", "video": null, "img": "https://vnexpress.net/image1.jpg", "images": [], "created": 1784377022, "created_str": "12:17 18/07/2026"}, "ok": true}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_fb.txt
DELETED
|
@@ -1,24 +0,0 @@
|
|
| 1 |
-
t = out.slice(mm.index + mm[0].length).trim(); }
|
| 2 |
-
if (!title) title = bodyText.slice(0, 80);
|
| 3 |
-
return Response.json({ title, body: bodyText || out });
|
| 4 |
-
}
|
| 5 |
-
// ── No-model fallback: light paraphrase (NEVER verbatim copy) ──
|
| 6 |
-
// Re-flow the chat lines into a short prose summary with a title,
|
| 7 |
-
// instead of echoing the raw transcript.
|
| 8 |
-
const lines = cleanText.split(/\n+/).map((s) => s.trim()).filter(Boolean);
|
| 9 |
-
const titleFb = lines[0] ? (lines[0].length > 80 ? lines[0].slice(0, 77) + "..." : lines[0]) : "Tóm tắt cuộc trò chuyện";
|
| 10 |
-
const bodyFb = lines
|
| 11 |
-
.map((l) => l.charAt(0).toUpperCase() + l.slice(1))
|
| 12 |
-
.join(" ")
|
| 13 |
-
.replace(/\s+/g, " ")
|
| 14 |
-
.trim();
|
| 15 |
-
return Response.json({ title: titleFb, body: bodyFb || cleanText, fallback: true });
|
| 16 |
-
} catch (e) {
|
| 17 |
-
console.warn(`[summarize] ${e}`);
|
| 18 |
-
return Response.json({ error: "summarize failed" }, { status: 502 });
|
| 19 |
-
}
|
| 20 |
-
},
|
| 21 |
-
},
|
| 22 |
-
"/api/avatars": {
|
| 23 |
-
GET: async () => {
|
| 24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_final_test.txt
DELETED
|
@@ -1,5 +0,0 @@
|
|
| 1 |
-
OK in 0.1s
|
| 2 |
-
fallback: True
|
| 3 |
-
title: Người dùng: Gemma 3 ra mắt hôm nay hỗ trợ 140 ngôn ngữ và chạy tốt trên điện tho
|
| 4 |
-
body: • Người dùng: Gemma 3 ra mắt hôm nay hỗ trợ 140 ngôn ngữ và chạy tốt trên điện thoại.
|
| 5 |
-
Avatar: Đúng, nó có các bản từ 1B đến 27B, rất nhẹ.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_glbchk.txt
DELETED
|
@@ -1,5 +0,0 @@
|
|
| 1 |
-
Ella.glb downloaded: /root/.cache/huggingface/hub/spaces--bep40--gemma-multi-avatar/snapshots/93b62270a930420118377bd4fde3537c7016cdb5/public/avatars/Ella.glb size=2857KB
|
| 2 |
-
trimesh loaded. geometry count: 9
|
| 3 |
-
has SKIN: True
|
| 4 |
-
has anim: True
|
| 5 |
-
hasImages/texture: True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_hw.txt
DELETED
|
@@ -1,4 +0,0 @@
|
|
| 1 |
-
settings {'hardware': 'zero-a10g', 'zero_gpu': True}: 200 {}
|
| 2 |
-
settings {'hardware': 'zero-a10g'}: 200 {}
|
| 3 |
-
runtime: {"current": null, "requested": "cpu-basic"}
|
| 4 |
-
stage: RUNTIME_ERROR
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_hw2.txt
DELETED
|
@@ -1,4 +0,0 @@
|
|
| 1 |
-
/api/spaces/bep40/summarizer/hardware HTTP 401 {"error":"Invalid username or password."}
|
| 2 |
-
/api/spaces/bep40/summarizer/settings PUT: 200 {}
|
| 3 |
-
runtime hw: {"current": null, "requested": "cpu-basic"}
|
| 4 |
-
stage: RUNTIME_ERROR
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_hw3.txt
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
hw: 200 {}
|
| 2 |
-
create-hw HTTP 409 {"error":"You already created this space repo: bep40/summarizer","url":"https://huggingface.co/spaces/bep40/summarizer"}
|
| 3 |
-
hw now: {"current": null, "requested": "cpu-basic"}
|
|
|
|
|
|
|
|
|
|
|
|
_idxchk.txt
DELETED
|
@@ -1,6 +0,0 @@
|
|
| 1 |
-
len 23470
|
| 2 |
-
has 'fallback: true': True
|
| 3 |
-
has 'No-model fallback': True
|
| 4 |
-
has 're-flow': False
|
| 5 |
-
has SUMMARY_ENDPOINT: True
|
| 6 |
-
has 'bullet': True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_logs3.txt
DELETED
|
@@ -1,7 +0,0 @@
|
|
| 1 |
-
=== build ===
|
| 2 |
-
data: {"data":"===== Build Queued at 2026-07-18 15:51:06 / Commit SHA: e1a9445 =====\n","timestamp":"2026-07-18T15:51:06Z"}
|
| 3 |
-
|
| 4 |
-
data: {"data":"\n--> ERROR: docker.io/huggingface/zero-gpu:latest: not found\n","timestamp":"2026-07-18T15:51:10.975Z"}
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
app HTTP 404 {"error":"Sorry, we can't find the page you are looking for."}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_logs4.txt
DELETED
|
@@ -1,40 +0,0 @@
|
|
| 1 |
-
state ERR NameError("name 'json' is not defined")
|
| 2 |
-
app HTTP 404 {"error":"Sorry, we can't find the page you are looking for."}
|
| 3 |
-
=== build ===
|
| 4 |
-
data: {"data":"===== Build Queued at 2026-07-19 01:41:01 / Commit SHA: cb0f05e =====\n","timestamp":"2026-07-19T01:41:01Z"}
|
| 5 |
-
|
| 6 |
-
data: {"data":"--> FROM docker.io/library/python:3.12.12@sha256:cb770de9f47e77715f13434d96f7ebaae7ad3a1f4fd9c8b338549bf99c9980ab","timestamp":"2026-07-19T01:41:06.284Z"}
|
| 7 |
-
|
| 8 |
-
data: {"data":"DONE 0.0s\n","timestamp":"2026-07-19T01:41:06.284Z"}
|
| 9 |
-
|
| 10 |
-
data: {"data":"--> WORKDIR /home/user/app","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 11 |
-
|
| 12 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 13 |
-
|
| 14 |
-
data: {"data":"--> RUN apt-get update && apt-get install -y \tgit \tgit-lfs \tffmpeg \tlibsm6 \tlibxext6 \tcmake \trsync \tlibgl1 \t&& rm -rf /var/lib/apt/lists/* \t&& git lfs install","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 15 |
-
|
| 16 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 17 |
-
|
| 18 |
-
data: {"data":"--> RUN pip install --no-cache-dir pip -U && pip install --no-cache-dir datasets \"huggingface-hub>=0.30\" \"hf-transfer>=0.1.4\" \"protobuf<4\" \"click<8.1\" torch==2.11.0","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 19 |
-
|
| 20 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 21 |
-
|
| 22 |
-
data: {"data":"--> RUN apt-get update && apt-get install -y fakeroot && mv /usr/bin/apt-get /usr/bin/.apt-get && echo '#!/usr/bin/env sh\\nfakeroot /usr/bin/.apt-get $@' > /usr/bin/apt-get && chmod +x /usr/bin/apt-get && \trm -rf /var/lib/apt/lists/* && \tuseradd -m -u 1000 user","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 23 |
-
|
| 24 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 25 |
-
|
| 26 |
-
data: {"data":"--> RUN \tapt-get update && \tapt-get install -y curl && \tcurl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \tapt-get install -y nodejs && \trm -rf /var/lib/apt/lists/* && apt-get clean","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 27 |
-
|
| 28 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 29 |
-
|
| 30 |
-
data: {"data":"--> COPY --chown=1000:1000 --from=root / /","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 31 |
-
|
| 32 |
-
data: {"data":"CACHED\n","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 33 |
-
|
| 34 |
-
data: {"data":"--> RUN chown -R 1000:1000 /var/","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 35 |
-
|
| 36 |
-
data: {"data":"CACHED\n\n--> Restoring cache","timestamp":"2026-07-19T01:41:06.386Z"}
|
| 37 |
-
|
| 38 |
-
data: {"data":"DONE 24.0s\n\n--> RUN --mount=target=/tmp/requirements.txt,source=requirements.txt pip install --no-cache-dir -r /tmp/requirements.txt \"torch<=2.11.0\" gradio[oauth,mcp]==6.20.0 \"uvicorn>=0.14.0\" \"websockets>=10.4\" spaces==0.51.0","timestamp":"2026-07-19T01:41:30.478Z"}
|
| 39 |
-
|
| 40 |
-
d
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_mintest.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
stage: RUNTIME_ERROR
|
| 2 |
-
HTTP 404 <!DOCTYPE html>
|
| 3 |
-
<html class="">
|
| 4 |
-
<head>
|
| 5 |
-
<meta charset="utf-8"/>
|
| 6 |
-
<meta
|
| 7 |
-
name="viewport"
|
| 8 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 9 |
-
/>
|
| 10 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_recreate.txt
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
deleted summarizer
|
| 2 |
-
deleted summarizer-api
|
| 3 |
-
create ERR TypeError("HfApi.create_repo() got an unexpected keyword argument 'hardware'")
|
|
|
|
|
|
|
|
|
|
|
|
_rtest.txt
DELETED
|
@@ -1,6 +0,0 @@
|
|
| 1 |
-
== featherless-ai ==
|
| 2 |
-
-> HTTP 403 <!doctype html> <!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en-US"> <![endif]--> <!--[if IE 7]> <html class="no-js ie7 oldie" lang="en-US"> <![endif]--> <!--[if IE 8]> <html class="no-
|
| 3 |
-
== legacy Qwen2.5-7B ==
|
| 4 |
-
-> ERR URLError(gaierror(-5, 'No address associated with hostname'))
|
| 5 |
-
== legacy Qwen2.5-3B ==
|
| 6 |
-
-> ERR URLError(gaierror(-5, 'No address associated with hostname'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_setup.txt
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
hw settings: 200 {}
|
| 2 |
-
runtime hw: {"current": null, "requested": "cpu-basic"}
|
| 3 |
-
env var: 200 {"SUMMARY_ENDPOINT":{"value":"https://bep40-summarizer-api.hf.space/api/summarize","updatedAt":"2026-07-18T15:51:58.954Z"}}
|
|
|
|
|
|
|
|
|
|
|
|
_step2.txt
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
NOT FOUND
|
|
|
|
|
|
_sum.txt
DELETED
|
@@ -1,11 +0,0 @@
|
|
| 1 |
-
HTTP 404 <!DOCTYPE html>
|
| 2 |
-
<html class="">
|
| 3 |
-
<head>
|
| 4 |
-
<meta charset="utf-8"/>
|
| 5 |
-
<meta
|
| 6 |
-
name="viewport"
|
| 7 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 8 |
-
/>
|
| 9 |
-
<meta
|
| 10 |
-
name="description"
|
| 11 |
-
content="We’re on a journey to advance and democratize ar
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_sum2.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
state: None runtime: {'stage': 'RUNTIME_ERROR', 'hardware': {'current': None, 'requested': 'cpu-basic'}, 'gcTimeout': 172800, 'errorMessage': 'Exit code: 0. Reason: ', 'replicas': {'requested': 1}, 'devMode': False, 'domains': [{'domain': 'bep40-summarizer.hf.space', 'stage': 'READY'}]}
|
| 2 |
-
API HTTP 404 <!DOCTYPE html>
|
| 3 |
-
<html class="">
|
| 4 |
-
<head>
|
| 5 |
-
<meta charset="utf-8"/>
|
| 6 |
-
<meta
|
| 7 |
-
name="viewport"
|
| 8 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 9 |
-
/>
|
| 10 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test10.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
stage: RUNTIME_ERROR
|
| 2 |
-
API HTTP 404 <!DOCTYPE html>
|
| 3 |
-
<html class="">
|
| 4 |
-
<head>
|
| 5 |
-
<meta charset="utf-8"/>
|
| 6 |
-
<meta
|
| 7 |
-
name="viewport"
|
| 8 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 9 |
-
/>
|
| 10 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test11.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
stage: RUNNING
|
| 2 |
-
API HTTP 404 <!DOCTYPE html>
|
| 3 |
-
<html class="">
|
| 4 |
-
<head>
|
| 5 |
-
<meta charset="utf-8"/>
|
| 6 |
-
<meta
|
| 7 |
-
name="viewport"
|
| 8 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 9 |
-
/>
|
| 10 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test12.txt
DELETED
|
@@ -1,4 +0,0 @@
|
|
| 1 |
-
stage: RUNNING
|
| 2 |
-
/api/summarize HTTP 404
|
| 3 |
-
/api/summarize/ HTTP 404
|
| 4 |
-
/api/predict HTTP 404
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test13.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
stage: RUNTIME_ERROR
|
| 2 |
-
API HTTP 404 <!DOCTYPE html>
|
| 3 |
-
<html class="">
|
| 4 |
-
<head>
|
| 5 |
-
<meta charset="utf-8"/>
|
| 6 |
-
<meta
|
| 7 |
-
name="viewport"
|
| 8 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 9 |
-
/>
|
| 10 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test14.txt
DELETED
|
@@ -1,15 +0,0 @@
|
|
| 1 |
-
stage: RUNTIME_ERROR
|
| 2 |
-
/api/summarize HTTP 404 <!DOCTYPE html>
|
| 3 |
-
<html class="">
|
| 4 |
-
<head>
|
| 5 |
-
<meta charset="utf-8"/>
|
| 6 |
-
<meta
|
| 7 |
-
name="viewport"
|
| 8 |
-
content="width=device-width, init
|
| 9 |
-
/api/predict HTTP 404 <!DOCTYPE html>
|
| 10 |
-
<html class="">
|
| 11 |
-
<head>
|
| 12 |
-
<meta charset="utf-8"/>
|
| 13 |
-
<meta
|
| 14 |
-
name="viewport"
|
| 15 |
-
content="width=device-width, init
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test3.txt
DELETED
|
@@ -1,11 +0,0 @@
|
|
| 1 |
-
stage: RUNNING
|
| 2 |
-
hw: {"current": "zero-a10g", "requested": "zero-a10g"}
|
| 3 |
-
API HTTP 404 <!DOCTYPE html>
|
| 4 |
-
<html class="">
|
| 5 |
-
<head>
|
| 6 |
-
<meta charset="utf-8"/>
|
| 7 |
-
<meta
|
| 8 |
-
name="viewport"
|
| 9 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 10 |
-
/>
|
| 11 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test4.txt
DELETED
|
@@ -1,9 +0,0 @@
|
|
| 1 |
-
API HTTP 404 <!DOCTYPE html>
|
| 2 |
-
<html class="">
|
| 3 |
-
<head>
|
| 4 |
-
<meta charset="utf-8"/>
|
| 5 |
-
<meta
|
| 6 |
-
name="viewport"
|
| 7 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 8 |
-
/>
|
| 9 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test5.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
stage: RUNNING
|
| 2 |
-
API HTTP 404 <!DOCTYPE html>
|
| 3 |
-
<html class="">
|
| 4 |
-
<head>
|
| 5 |
-
<meta charset="utf-8"/>
|
| 6 |
-
<meta
|
| 7 |
-
name="viewport"
|
| 8 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 9 |
-
/>
|
| 10 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test6.txt
DELETED
|
@@ -1,11 +0,0 @@
|
|
| 1 |
-
stage: RUNNING
|
| 2 |
-
err: None
|
| 3 |
-
API HTTP 404 <!DOCTYPE html>
|
| 4 |
-
<html class="">
|
| 5 |
-
<head>
|
| 6 |
-
<meta charset="utf-8"/>
|
| 7 |
-
<meta
|
| 8 |
-
name="viewport"
|
| 9 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 10 |
-
/>
|
| 11 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test7.txt
DELETED
|
@@ -1,11 +0,0 @@
|
|
| 1 |
-
stage: RUNNING
|
| 2 |
-
err: None
|
| 3 |
-
API HTTP 404 <!DOCTYPE html>
|
| 4 |
-
<html class="">
|
| 5 |
-
<head>
|
| 6 |
-
<meta charset="utf-8"/>
|
| 7 |
-
<meta
|
| 8 |
-
name="viewport"
|
| 9 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 10 |
-
/>
|
| 11 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test8.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
stage: RUNNING
|
| 2 |
-
API HTTP 404 <!DOCTYPE html>
|
| 3 |
-
<html class="">
|
| 4 |
-
<head>
|
| 5 |
-
<meta charset="utf-8"/>
|
| 6 |
-
<meta
|
| 7 |
-
name="viewport"
|
| 8 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 9 |
-
/>
|
| 10 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_test9.txt
DELETED
|
@@ -1,11 +0,0 @@
|
|
| 1 |
-
stage: RUNNING
|
| 2 |
-
hw: {"current": "zero-a10g", "requested": "zero-a10g"}
|
| 3 |
-
API HTTP 404 <!DOCTYPE html>
|
| 4 |
-
<html class="">
|
| 5 |
-
<head>
|
| 6 |
-
<meta charset="utf-8"/>
|
| 7 |
-
<meta
|
| 8 |
-
name="viewport"
|
| 9 |
-
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
| 10 |
-
/>
|
| 11 |
-
<meta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|