The 26b is slow (~30s/call); the chat now shows the answer forming instead of freezing until it's done. The final prose streams over SSE; tool-calling turns stay structured (no partial tokens), so streaming kicks in for the narration.
Core (@commitea/core)
chat-client.complete(messages, tools, onToken?) — with onToken, requests stream: true and parses the OpenAI SSE stream: emits content deltas and assembles streamed tool-call argument fragments into the final CompletionResult.
GiteaHttpResponse exposes the optional body stream (real fetch has it; stubs don't). agent-loop threads onToken to each completion.
App
model:chat forwards each delta to the renderer (event.sender.send); preload exposes model.onToken(cb) → unsubscribe. useChat accumulates the live stream into a growing bubble (with a cursor), replaced by the authoritative final content when the turn resolves. Unconfigured → scripted reply, unchanged.
Verified
118 core tests green (2 streaming: SSE content deltas + tool-call fragment assembly) · desktop typecheck clean · 14 fixture e2e green. Live: a real turn against gemma-4-26b assembles the correct answer via the streaming path (live-reginald green) — the reply renders token-by-token.
Note: streaming doesn't make the model faster; it replaces the ~60s freeze with visible progress.
The 26b is slow (~30s/call); the chat now shows the answer **forming** instead of freezing until it's done. The final prose streams over SSE; tool-calling turns stay structured (no partial tokens), so streaming kicks in for the narration.
## Core (`@commitea/core`)
- **`chat-client.complete(messages, tools, onToken?)`** — with `onToken`, requests `stream: true` and parses the OpenAI SSE stream: emits content deltas and assembles streamed tool-call argument fragments into the final `CompletionResult`.
- `GiteaHttpResponse` exposes the optional `body` stream (real fetch has it; stubs don't). `agent-loop` threads `onToken` to each completion.
## App
- `model:chat` forwards each delta to the renderer (`event.sender.send`); preload exposes `model.onToken(cb)` → unsubscribe. `useChat` accumulates the live stream into a growing bubble (with a cursor), replaced by the authoritative final content when the turn resolves. Unconfigured → scripted reply, unchanged.
## Verified
118 core tests green (2 streaming: SSE content deltas + tool-call fragment assembly) · desktop typecheck clean · 14 fixture e2e green. Live: a real turn against `gemma-4-26b` assembles the correct answer via the streaming path (`live-reginald` green) — the reply renders token-by-token.
Note: streaming doesn't make the model faster; it replaces the ~60s freeze with visible progress.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
christian
added 1 commit 2026-07-09 04:22:39 +00:00
The 26b is slow (~30s/call); the chat now shows the answer forming instead of
freezing until it's done. The final prose streams over SSE; tool-calling turns
stay structured (no partial tokens), so streaming kicks in for the narration.
core (@commitea/core):
- chat-client.complete gains an optional onToken — when set, it requests
stream:true and parses the OpenAI SSE stream, emitting content deltas and
assembling streamed tool-call argument fragments into the final result.
- GiteaHttpResponse exposes the optional `body` stream (real fetch has it; stubs
don't). agent-loop threads onToken to each completion.
app:
- model:chat forwards each delta to the renderer (event.sender.send); preload
exposes model.onToken(cb) → unsubscribe. useChat accumulates the live stream
into a growing bubble (with a cursor), replaced by the authoritative final
content when the turn resolves. Unconfigured → scripted reply, unchanged.
Verified: 118 core tests green (2 streaming: SSE content deltas + tool-call
fragment assembly), desktop typecheck clean, 14 fixture e2e green. Live: a real
turn against gemma-4-26b assembles the correct answer via the streaming path
(live-reginald green) — the reply now renders token-by-token.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
christian
added 1 commit 2026-07-09 04:43:53 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The 26b is slow (~30s/call); the chat now shows the answer forming instead of freezing until it's done. The final prose streams over SSE; tool-calling turns stay structured (no partial tokens), so streaming kicks in for the narration.
Core (
@commitea/core)chat-client.complete(messages, tools, onToken?)— withonToken, requestsstream: trueand parses the OpenAI SSE stream: emits content deltas and assembles streamed tool-call argument fragments into the finalCompletionResult.GiteaHttpResponseexposes the optionalbodystream (real fetch has it; stubs don't).agent-loopthreadsonTokento each completion.App
model:chatforwards each delta to the renderer (event.sender.send); preload exposesmodel.onToken(cb)→ unsubscribe.useChataccumulates the live stream into a growing bubble (with a cursor), replaced by the authoritative final content when the turn resolves. Unconfigured → scripted reply, unchanged.Verified
118 core tests green (2 streaming: SSE content deltas + tool-call fragment assembly) · desktop typecheck clean · 14 fixture e2e green. Live: a real turn against
gemma-4-26bassembles the correct answer via the streaming path (live-reginaldgreen) — the reply renders token-by-token.Note: streaming doesn't make the model faster; it replaces the ~60s freeze with visible progress.
🤖 Generated with Claude Code