Skip to content

[Engine] serve: report timings on /v1/responses - #3291

Closed
pschaub wants to merge 1 commit into
Niko1221:mainfrom
pschaub:serve-responses-timings
Closed

pschaub wants to merge 1 commit into
Niko1221:mainfrom
pschaub:serve-responses-timings

Conversation

@pschaub

@pschaub pschaub commented Oct 19, 2026

Copy link
Copy Markdown
Contributor

Problem and result

/v1/chat/completions returns top-level timings (#107), but /v1/responses (#451) does not, although server.py already computes them for every request. Now the final response.completed / response.incomplete event and the non-streaming reply include the same timings object.

Related discussion

Follow-up to #107 (based on #83) for /v1/responses.

Approach

_with_timings in serve/responses.py copies done["timings"] onto the final event; collect() keeps it on the non-streaming reply. Nothing else changes.

Validation

Passed:

  • python -m unittest discover -s serve -t . -p "test_*.py" on this branch (one commit on main e88ee39), Windows 11, Python 3.12: 882 tests OK, 20 skipped. The same command on main e88ee39 without the change: 881 tests OK, 20 skipped.
  • The new UsageAndStatus.test_responses fails without the change.
  • Live check on main e88ee39 (Windows 11, CUDA): the final event of streamed /v1/responses requests carries timings; without the change it does not.

Failed:
none observed

Not run:

  • Linux and macOS.
  • The non-streaming /v1/responses reply was checked by the unit test only; the live check used streaming.
  • No CUDA, HIP, SYCL or Metal build: the change is Python only.

Limits

response.failed carries no timings.


Created with Claude Opus 5.5. The result was verified by a human (me) in llama-swap: prompt and decode speeds now show for /v1/responses requests.

@pschaub
pschaub force-pushed the serve-responses-timings branch from ce43d3c to bc9c42e Compare October 19, 2026 23:46
Niko1221 pushed a commit that referenced this pull request Oct 27, 2026
The final response.completed / response.incomplete event and a
non-streaming /v1/responses reply now carry the same top-level timings
object that /v1/chat/completions has. The server already put timings in
the done dict; the Responses assembler dropped them.

Tests: UsageAndStatus.test_responses (stream and non-stream).
Unset timings leave the event unchanged; response.failed has none.
Niko1221 added a commit that referenced this pull request Oct 27, 2026
@Niko1221

Copy link
Copy Markdown
Owner

Thank you. Fixed in 0.2.7: Timings on /v1/responses. Your name is on the commit.

Release: https://github.com/Niko1221/Strata/releases/tag/v0.2.7

@Niko1221 Niko1221 closed this Oct 27, 2026
MistVVK added a commit to MistVVK/XeStrata that referenced this pull request Oct 30, 2026
server は done に timings を入れていたが、Responses の組み立てが捨てていた。最後の response.completed /
response.incomplete のイベントと、ストリームでない返事の一番上に、/v1/chat/completions と同じ timings を
付ける。timings が無ければイベントは変わらず、response.failed には付けない。upstream Niko1221#3291。
ruc1j added a commit to ruc1j/XeStrata-890M that referenced this pull request Oct 31, 2026
…の 1)

serve の変更
- 宣言していない名前の tool call を文のまま返すとき、その名前を strata_rejected_tool_calls で答えに添え、/metrics/prometheus で数える(upstream 805ebe1、Niko1221#3796)
- 名前空間つきの tool は namespace=member、namespace_member、member だけの綴りでも受け、`__` を `_` に潰した綴りも宣言した tool として読む(upstream fd8d37e、805ebe17b、Niko1221#3972)
- Chat Completions の tool の結果を、答えた call の順に並べ直す(upstream 11237f8、Niko1221#3395)
- message のない chat の要求は 400 にする(upstream 8a3ca07)
- --host :: で IPv6 で待ち受ける(upstream eba3106、Niko1221#3212)
- /v1/responses の max_output_tokens は 0 と -1 を上限なしとして受け、答えに timings を付ける(upstream 9c2d35d、a0fc88abd、Niko1221#4036、Niko1221#3291)
- response_format の repair_latex_escapes で、LaTeX のエスケープで壊れた JSON を直してから検査する(upstream 2cc6ea1、Niko1221#2893)
- 1 トークンの答えには decode の速さを出さない(upstream 5d5c26d)
- elastic な画像エンコーダーが起動できなければ 503 を返す(upstream 092c7d1、Niko1221#2435)
- lifeline の識別は子プロセスの開始時刻にし、sampler は壊れた source に耐える(upstream b3db5a1、Niko1221#3590、Niko1221#3407)
- web ページ: 答えを追うのは読み手が離れていないあいだだけ(upstream 89a68d8)、広い窓を使い狭い画面に収める(upstream ad1a310、Niko1221#3176)

setup の変更
- cmake と ninja は venv のものを先に取り、CMakeLists.txt が求める 3.24 より古い cmake は使わない(upstream 5bfce4b、Niko1221#3822)
- 別の generator で configure された build フォルダーは作り直す(upstream bf994ca、Niko1221#4038)
- ダウンロードの長さが取れなければ公開されている大きさを使う(upstream a1d2fd7、Niko1221#2287)
- 2 分データが来ないダウンロードは止まっていると言う(upstream ed0c893、Niko1221#3567)
- --rope-scale は有限で 1 以上の値だけ受ける(upstream a332cc9、Niko1221#3393)
- pip の記録はどの OS が書いたかを覚え、別の OS の記録は信じない(upstream fb3bae2、Niko1221#3634)

tools の変更
- gguf_reader.py はヘッダーの読みに上限を置き、壊れた metadata を ValueError にする(upstream 409f246、Niko1221#2288、Niko1221#1919)
- strata_bench.py は amd-smi しかない ROCm 7 以降でも AMD のカードの名前を書く(upstream c471588、Niko1221#3630)
- calibrate.py は計測の途中でエンジンが落ちても、その候補だけを落として続ける(upstream 41188ec、Niko1221#3317)
- chat.py は端末で fenced code block に色を付ける(upstream 3e81173、PR Niko1221#1895)
- 試験: llama.cpp の gguf-py がなければ test_iq_pack は skip、ほか試験の穴 3 つ(upstream 5b14fe2、Niko1221#3236)

fork に合わせて変えたこと: upstream の docs/DETAILS.md の差分は取らず、文書は別に書く。logprobs(upstream 9ea0449)は fork にすでにあり、allowed_token_ids は見送り。Control(strata_control)に依る setup の変更と、fork にない機能(presets の警告、Delete a model、queue timeout の badge)は取らない。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants