v0.3.21

visioncortex/vtracerv0.3.21Sep 27, 2026by github-actions[bot]

Upgrading?

AI Summary

A comprehensive update featuring router bug fixes, performance optimizations, Intel GPU enablement, and new evaluation tools.

Key Highlights

  • Fixed router bugs including predict_batch, hooks, and language detection.
  • Performance improvements in BPE merging and cache shortlist embeddings.
  • Intel GPU enablement for laya inferencing.
  • New features: `predict_long`, structured decisions in TypeScript, and an eval harness.
  • Security hardening for remote inference and model verification.

New Features

  • Router bug fixes.
  • Performance optimizations.
  • Intel GPU support.
  • Evaluation harness.
  • Structured decisions in TypeScript.
  • Security hardening.

Full Release Notes

## What's Changed
* fix(serve): return 400 for a deeply nested JSON body by @can-gaa-hou in https://github.com/NandhaKishorM/laya/pull/401
* fix(serve): log the inference failure the client is not allowed to see by @PerryLink in https://github.com/NandhaKishorM/laya/pull/375
* fix(examples): refuse oversized requests in the demo server by @keemsisi in https://github.com/NandhaKishorM/laya/pull/395
* ci: let runs on main finish and time out hung jobs by @maxfield-allison in https://github.com/NandhaKishorM/laya/pull/400
* perf: single-pass script stats; wire test_lang_stats by @emiliano-go in https://github.com/NandhaKishorM/laya/pull/287
* docs: organize the site navigation and check docstrings by @maxfield-allison in https://github.com/NandhaKishorM/laya/pull/391
* docs: note cancellation negation limits in choice answers by @Ha1baraA11 in https://github.com/NandhaKishorM/laya/pull/385
* docs: stop presenting a confidence threshold as permission to act by @PerryLink in https://github.com/NandhaKishorM/laya/pull/378
* docs(langchain): document full-conversation state extraction by @Bruce-Yii in https://github.com/NandhaKishorM/laya/pull/328
* research: server CPU latency for 0.3.20 on a 4-core EPYC by @arunjoyt in https://github.com/NandhaKishorM/laya/pull/393
* fix(router): predict_batch dropped each request lang, so lang_temperatures never applied by @PerryLink in https://github.com/NandhaKishorM/laya/pull/381
* fix(router): process-wide default hooks never reached predict_batch by @PerryLink in https://github.com/NandhaKishorM/laya/pull/379
* fix(router): a lang code that names no language must not pick a checkpoint by @PerryLink in https://github.com/NandhaKishorM/laya/pull/368
* fix(common): a choice label with no description came back as a non-string by @PerryLink in https://github.com/NandhaKishorM/laya/pull/380
* fix(email): `From:` starting a sentence deleted the request by @PerryLink in https://github.com/NandhaKishorM/laya/pull/371
* fix(lang): route a Portuguese ticket with an English log to multilingual by @paulocarinhena in https://github.com/NandhaKishorM/laya/pull/207
* fix(agent): reject a null score level, and say what differs from Jev by @Rish-it in https://github.com/NandhaKishorM/laya/pull/342
* fix(packaging): add the structured extra for the pydantic helpers by @GaotianJin in https://github.com/NandhaKishorM/laya/pull/348
* fix(ts): route plain-ASCII German like Python by @lihongyuan99 in https://github.com/NandhaKishorM/laya/pull/354
* fix(ts): keep sentences that merely mention "confidential" in cleanEmailBody (Python parity) by @lihongyuan99 in https://github.com/NandhaKishorM/laya/pull/353
* feat(laya-ts): report answer_confidence (max(p)) on every answer type by @nanami-0713 in https://github.com/NandhaKishorM/laya/pull/386
* perf+fix(onnx): tune ORT session, tokenize state once, report answer_confidence by @AlKor13 in https://github.com/NandhaKishorM/laya/pull/343
* fix(ts): require safetensors for ONNX export by @idongdongh in https://github.com/NandhaKishorM/laya/pull/358
* laya-ts: per-language temperature overrides (lang_temperatures) + Router lang forwarding by @aashish254 in https://github.com/NandhaKishorM/laya/pull/398
* feat(ts): port structured decisions (decide) to laya-ts by @aashish254 in https://github.com/NandhaKishorM/laya/pull/339
* feat(serve): attach Server-Timing and X-Inference-Time-Ms headers to POST /v1/systemone by @peterfriese in https://github.com/NandhaKishorM/laya/pull/372
* ci: run the pytest suites, which no lane was executing by @PerryLink in https://github.com/NandhaKishorM/laya/pull/376
* fix(lang): identifier stripping is quadratic; 31 s -> 1.8 ms at 50k chars by @keemsisi in https://github.com/NandhaKishorM/laya/pull/383
* docs(benchmarks): guide to results and known limits by @rahul05ranjan in https://github.com/NandhaKishorM/laya/pull/480
* docs: add staged adoption guide by @Bruce-Yii in https://github.com/NandhaKishorM/laya/pull/415
* ci(security): read-only release defaults, pinned action SHAs, gitleaks checksum by @nanami-0713 in https://github.com/NandhaKishorM/laya/pull/413
* feat(bench): freeze the Chinese short-command comparison from #218 by @GaotianJin in https://github.com/NandhaKishorM/laya/pull/364
* feat(evals): labelled evaluation harness, laya-eval CLI, and a CI quality gate by @emiliano-go in https://github.com/NandhaKishorM/laya/pull/382
* feat(examples): redesign the server.py web GUI as a two-pane playground by @luiz-linkezio in https://github.com/NandhaKishorM/laya/pull/417
* fix(serve): a request with no state was answered about the literal text null by @PerryLink in https://github.com/NandhaKishorM/laya/pull/427
* fix(mcp): preserve supported question fields by @dakjdakd in https://github.com/NandhaKishorM/laya/pull/440
* fix(docker): keep torch's native Triton JIT off so a GPU image can infer without a C compiler (#365) by @bhushankinge in https://github.com/NandhaKishorM/laya/pull/436
* fix(security): bound remote inference work by @KunjShah95 in https://github.com/NandhaKishorM/laya/pull/335
* fix(model): harden revision and digest verification by @KunjShah95 in https://github.com/NandhaKishorM/laya/pull/347
* fix(structured): accept pydantic v2 Optional[...] (anyOf nullable) by @AlKor13 in https://github.com/NandhaKishorM/laya/pull/463
* fix(structured): reject unsupported multi-type schema fields by @MadrasLe in https://github.com/NandhaKishorM/laya/pull/448
* fix(structured): reject enum choice label collisions by @dakjdakd in https://github.com/NandhaKishorM/laya/pull/442
* fix(agent): a nested choice label is a named caller error, not a bare TypeError by @PerryLink in https://github.com/NandhaKishorM/laya/pull/425
* fix(agent): scope the per-inference CUDA OOM fallback to the failed request by @Linz1248 in https://github.com/NandhaKishorM/laya/pull/349
* feat(agent): predict_long — scan a state past the context window, aggregate per question by @AlKor13 in https://github.com/NandhaKishorM/laya/pull/363
* fix(hooks): run process-wide default hooks once per Router request by @sbhrwlr in https://github.com/NandhaKishorM/laya/pull/435
* fix(cli): --preset sent the request under a key no question set names by @PerryLink in https://github.com/NandhaKishorM/laya/pull/426
* fix(lang): keep plain English with one accented loanword on the English checkpoint by @Linz1248 in https://github.com/NandhaKishorM/laya/pull/350
* fix(lang): detect language from every string value in a dict state by @sathariels in https://github.com/NandhaKishorM/laya/pull/406
* perf: cache shortlist option embeddings across calls (cached_embed_fn) by @aashish254 in https://github.com/NandhaKishorM/laya/pull/405
* feat(fast): run the TileLang fast path in the agent's autocast dtype (bf16 or fp16) by @cklxx in https://github.com/NandhaKishorM/laya/pull/467
* feat: Intel GPU enablement on laya inferencing by @xiangyang-95 in https://github.com/NandhaKishorM/laya/pull/306
* fix(ts): loop-based tensor plumbing, cure spread overflow by @nnlgsakib in https://github.com/NandhaKishorM/laya/pull/410
* fix(ts): truncateLeft kept the whole state when no room was left (#112 parity) by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/470
* fix(ts): write small numbers the way Python's json.dumps does by @LudwigJMarx in https://github.com/NandhaKishorM/laya/pull/473
* fix(ts): count the Azerbaijani schwa as a non-English letter by @PerryLink in https://github.com/NandhaKishorM/laya/pull/423
* fix(ts): port the From: header rules the Python side already has by @PerryLink in https://github.com/NandhaKishorM/laya/pull/422
* perf(ts): BPE merging is quadratic in word length; 5.5 s -> 3 ms (1722x) at 16k chars by @keemsisi in https://github.com/NandhaKishorM/laya/pull/449
* fix(ts): lang codes that name no language fall through to detection like Python by @thejenilsoni in https://github.com/NandhaKishorM/laya/pull/403
* fix(serve): bound concurrent requests with a non-blocking admission check by @bunnysayzz in https://github.com/NandhaKishorM/laya/pull/431
* feat(hooks): async hooks and per-hook timeout by @emiliano-go in https://github.com/NandhaKishorM/laya/pull/277
* fix: serialise tokenizer encoding and stop load() initialising overwritten weights by @thread3d in https://github.com/NandhaKishorM/laya/pull/462
* mcp: add laya_shortlist tool for many-option choice questions by @aashish254 in https://github.com/NandhaKishorM/laya/pull/404
* feat(agent): LAYA_CUDA_AMP=fp16|bf16 overrides the CUDA autocast dtype (#443) by @bhushankinge in https://github.com/NandhaKishorM/laya/pull/451
* fix(ts): match accented words in latinProfile like Python (WORD_RE was ASCII-only) by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/471
* fix(router): share concurrent TypeScript model loads by @dakjdakd in https://github.com/NandhaKishorM/laya/pull/438
* fix(onnx): thread lang/lang_temperatures so ONNXAgent matches Agent by @AlKor13 in https://github.com/NandhaKishorM/laya/pull/464
* fix(serve): /health reports where inference actually runs, not the requested device by @aashish254 in https://github.com/NandhaKishorM/laya/pull/574
* build(deps): bump github/codeql-action/init from 3.38.2 to 4.38.1 by @dependabot[bot] in https://github.com/NandhaKishorM/laya/pull/578
* build(deps): bump actions/setup-node from 4.4.0 to 7.0.0 by @dependabot[bot] in https://github.com/NandhaKishorM/laya/pull/581
* feat(router): honour a request's token budget in predict_batch by @aashish254 in https://github.com/NandhaKishorM/laya/pull/583
* fix(evals): batch the runner shape evaluate() already documents by @aashish254 in https://github.com/NandhaKishorM/laya/pull/584
* docs(reference): render cached_embed_fn and gate every name in __all__ by @aashish254 in https://github.com/NandhaKishorM/laya/pull/587
* fix(examples): key the cache hook on what the answer depends on by @aashish254 in https://github.com/NandhaKishorM/laya/pull/590
* fix(hooks): cover every decision of a call in the taught hook patterns by @aashish254 in https://github.com/NandhaKishorM/laya/pull/591
* fix(evals): report what a request waited, and name the throughput share by @aashish254 in https://github.com/NandhaKishorM/laya/pull/592
* feat(evals): let laya-evals run ask for the tolerance metric its docs publish by @aashish254 in https://github.com/NandhaKishorM/laya/pull/593
* fix(compose): forward the autocast dtype overrides the runtime reads by @aashish254 in https://github.com/NandhaKishorM/laya/pull/594
* fix(security): audit every declared dependency, not just the core five by @aashish254 in https://github.com/NandhaKishorM/laya/pull/595
* docs(structured): the subset tables now say what the compiler maps by @aashish254 in https://github.com/NandhaKishorM/laya/pull/596
* test(docker)+ci: every secret the container entrypoint loads has to be proven, including over HTTP by @aashish254 in https://github.com/NandhaKishorM/laya/pull/597
* fix(integrations): gate a guardrail score question on its upper-half probability by @gRain-is-grainy in https://github.com/NandhaKishorM/laya/pull/598
* fix(mcp): honour LAYA_AUTO_TASK, the one serve env var that changes routing by @aashish254 in https://github.com/NandhaKishorM/laya/pull/601
* feat(serve): make the resident-checkpoint cap reachable (LAYA_MAX_LOADED) by @aashish254 in https://github.com/NandhaKishorM/laya/pull/603
* fix(examples): the demo's resident-checkpoint cap must follow laya's own by @aashish254 in https://github.com/NandhaKishorM/laya/pull/604
* feat(revisions): let LAYA_REVISION pick the checkpoint commit by @aashish254 in https://github.com/NandhaKishorM/laya/pull/605
* fix(router): predict_batch hook follow-ups to #289 by @hemanthrayuduu in https://github.com/NandhaKishorM/laya/pull/606
* fix(agent): validate questions and reject None state before serialization by @rahul05ranjan in https://github.com/NandhaKishorM/laya/pull/609
* ci: bound remaining workflow jobs by @AliAkbariAlashti in https://github.com/NandhaKishorM/laya/pull/610
* fix(examples): /predict/batch must call Router.predict_batch, not predict per state by @aashish254 in https://github.com/NandhaKishorM/laya/pull/611
* docs(install): document installing with uv by @nefro313 in https://github.com/NandhaKishorM/laya/pull/612
* fix(mcp): the auto-detected device label must know about MPS and XPU by @aashish254 in https://github.com/NandhaKishorM/laya/pull/613
* fix(nix): the module must not refuse names laya accepts, must not copy them, and must reach every knob the server reads by @aashish254 in https://github.com/NandhaKishorM/laya/pull/614
* perf(agent): reuse question tokenization within prediction batches by @RagingSilence in https://github.com/NandhaKishorM/laya/pull/615
* feat(agent): let laya.load reach the compile option Agent already takes by @aashish254 in https://github.com/NandhaKishorM/laya/pull/617
* ci(workflows): run missing test suites in CI and guard against test omission (#399) by @Swatantra-66 in https://github.com/NandhaKishorM/laya/pull/618
* feat(onnx): let ONNXAgent authenticate its Hub download the way Agent does by @aashish254 in https://github.com/NandhaKishorM/laya/pull/619
* fix(serve): set TCP_NODELAY on every accepted connection by @Jayanth-reflex in https://github.com/NandhaKishorM/laya/pull/624
* fix(server): keep exception text out of responses, log it instead by @modusensus in https://github.com/NandhaKishorM/laya/pull/625
* feat(eval): metamorphic label-renaming invariance for choice by @devloper961-maker in https://github.com/NandhaKishorM/laya/pull/517
* fix(ts): keep English with one accented loanword on the English checkpoint (#350 parity) by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/518
* fix(serve): send Retry-After with the 503 admission refusal by @bunnysayzz in https://github.com/NandhaKishorM/laya/pull/521
* feat(mcp): forward the routed language and reuse shortlist embeddings by @Bruce-Yii in https://github.com/NandhaKishorM/laya/pull/523
* fix(ts): fall back to byte tokens for characters the vocab lacks, as Hugging Face does by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/526
* fix(ts): cut added tokens out of the text before tokenizing, as Hugging Face does by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/527
* feat(evals): an act-head diagnostic over labelled reports by @Bruce-Yii in https://github.com/NandhaKishorM/laya/pull/529
* feat(langchain): forward the per-request token budget to every runnable by @aashish254 in https://github.com/NandhaKishorM/laya/pull/530
* perf(lang): skip lines too short to be detected; 17-30% faster on states of many short field by @keemsisi in https://github.com/NandhaKishorM/laya/pull/531
* feat(langchain): forward per-call prediction hooks to every runnable by @aashish254 in https://github.com/NandhaKishorM/laya/pull/532
* feat(integrations): add CrewAI task delegation routing and guardrails by @LEVELING2108 in https://github.com/NandhaKishorM/laya/pull/535
* test(ts): identifier fuzz generator collapses to 540 of 20 000 strings by @keemsisi in https://github.com/NandhaKishorM/laya/pull/537
* test(ci): run the four model-free suites no workflow runs by @dantedeprenda in https://github.com/NandhaKishorM/laya/pull/539
* fix(mcp): the model argument takes core's registry, not a stale copy of it by @aashish254 in https://github.com/NandhaKishorM/laya/pull/544
* ci: pin floating action tags to reviewed commit SHAs (#331) by @viwe-monai in https://github.com/NandhaKishorM/laya/pull/545
* fix(cli): --model resolves core's aliases instead of matching three names exactly by @aashish254 in https://github.com/NandhaKishorM/laya/pull/546
* ci: give each push to main its own concurrency group by @sathariels in https://github.com/NandhaKishorM/laya/pull/548
* fix(ts): reject a nested choice label, as Python does (#425 parity) by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/551
* fix(ts): accept a null or undefined noul `labels` as the defaults, as Python does by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/552
* fix(ts): read noul criteria keys case-insensitively, as Python does by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/553
* fix(ts): await async hooks and route their errors through hooksRaise by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/554
* fix(ts): a score legend echoed the caller's own types, unlike the Python backends by @PerryLink in https://github.com/NandhaKishorM/laya/pull/556
* test(local-e2e): assert the noul label override where the checkpoint can read it by @thread3d in https://github.com/NandhaKishorM/laya/pull/560
* fix(research): let the bench harnesses take their model root from LAYA_MODELS by @thread3d in https://github.com/NandhaKishorM/laya/pull/561
* ci(docs): deploy Pages only from the canonical repository by @thread3d in https://github.com/NandhaKishorM/laya/pull/562
* ci(ts): add automated npm release workflow with provenance (#288) by @Swatantra-66 in https://github.com/NandhaKishorM/laya/pull/563
* fix(mcp): laya_preset answered about a field the state did not have by @aashish254 in https://github.com/NandhaKishorM/laya/pull/564
* fix(mcp): reject a malformed question as a caller error, not a server fault by @Bruce-Yii in https://github.com/NandhaKishorM/laya/pull/565
* fix(serve): forward and validate per-request token budget overrides (… by @Swatantra-66 in https://github.com/NandhaKishorM/laya/pull/566
* feat(mcp): expose task/lang/max_len/head_max_len on the decision tools by @aashish254 in https://github.com/NandhaKishorM/laya/pull/567
* feat(router): reach the Agent options a Router never forwards by @aashish254 in https://github.com/NandhaKishorM/laya/pull/568
* feat(common): report options that collapse into the same token span (#538) by @AlKor13 in https://github.com/NandhaKishorM/laya/pull/569
* fix(examples): mirror laya.serve's option budgets in the demo server by @Bruce-Yii in https://github.com/NandhaKishorM/laya/pull/570
* fix(evals): report the checkpoint that answered, not the payload's family tag by @aashish254 in https://github.com/NandhaKishorM/laya/pull/571
* feat(router): verify each checkpoint with its own SHA-256 map by @aashish254 in https://github.com/NandhaKishorM/laya/pull/572
* test(lang): add Hindi and Marathi routing regression tests by @rsshir60 in https://github.com/NandhaKishorM/laya/pull/573
* docs(env): write down the two LAYA_* names no page carried, and sweep for the rest by @aashish254 in https://github.com/NandhaKishorM/laya/pull/575
* perf(agent): stop compile=True from recompiling on every new request shape (part 1 of #472) by @cklxx in https://github.com/NandhaKishorM/laya/pull/576
* feat(agent): per-call prediction hooks on predict_long, and no window for a skipped answer by @aashish254 in https://github.com/NandhaKishorM/laya/pull/577
* build(deps): bump github/codeql-action/analyze from 3.38.2 to 4.38.1 by @dependabot[bot] in https://github.com/NandhaKishorM/laya/pull/579
* build(deps): bump actions/download-artifact from 4.3.0 to 8.0.1 by @dependabot[bot] in https://github.com/NandhaKishorM/laya/pull/580
* feat(evals): pin the checkpoint commit a run scores, and record it in the report by @aashish254 in https://github.com/NandhaKishorM/laya/pull/588
* fix(email): email_state swallowed max_chars into the model's input by @aashish254 in https://github.com/NandhaKishorM/laya/pull/589
* feat: confidence-based abstention gating on answer_confidence (min_confidence) (#361) by @aashish254 in https://github.com/NandhaKishorM/laya/pull/456
* fix(mcp): run Agent directly for model=auto and report null model by @umran666 in https://github.com/NandhaKishorM/laya/pull/485
* feat(serve): report per-agent CPU fallback counters in /health by @umran666 in https://github.com/NandhaKishorM/laya/pull/487
* feat(onnx): add ONNXAgent.predict_batch, the batch API the torch Agent has (#323) by @aashish254 in https://github.com/NandhaKishorM/laya/pull/489
* fix(ts): accept pydantic v2 Optional[...] (anyOf/oneOf nullable) in structured schemas by @Rajojha-1 in https://github.com/NandhaKishorM/laya/pull/491
* feat(ts): port mixed-segment detection from Python analyse() (#384) by @Swatantra-66 in https://github.com/NandhaKishorM/laya/pull/492
* ci: use per-commit concurrency group for pushes to main (#399) by @Rajojha-1 in https://github.com/NandhaKishorM/laya/pull/493
* feat(onnx): add ONNXAgent.predict_long, the long-document API the torch Agent has by @aashish254 in https://github.com/NandhaKishorM/laya/pull/494
* fix(agent): a choice criteria list that cannot give every option its own answer key by @aashish254 in https://github.com/NandhaKishorM/laya/pull/496
* feat(router): predict_long — route, then scan the whole state in windows by @aashish254 in https://github.com/NandhaKishorM/laya/pull/497
* feat(onnx): opt-in INT8 quantized sidecar in the ONNX export by @aashish254 in https://github.com/NandhaKishorM/laya/pull/498
* fix(ts): stringify score legend values and document serve choice limi… by @Swatantra-66 in https://github.com/NandhaKishorM/laya/pull/499
* test(packaging): don't scan .venv for broken markdown links by @PerryLink in https://github.com/NandhaKishorM/laya/pull/500
* fix(onnx): the over-budget message named the wrong knob by @PerryLink in https://github.com/NandhaKishorM/laya/pull/501
* fix(agent): a short temperature list now fails at load, not at the first decode by @PerryLink in https://github.com/NandhaKishorM/laya/pull/502
* fix(email): the name class excludes lowercase in every script by @PerryLink in https://github.com/NandhaKishorM/laya/pull/503
* fix(packaging): the onnx extra must declare onnxscript by @PerryLink in https://github.com/NandhaKishorM/laya/pull/504
* docs: add the fine-tuning guide (#390) by @PerryLink in https://github.com/NandhaKishorM/laya/pull/505
* feat(evals): score an ONNX export with laya-evals run --onnx by @aashish254 in https://github.com/NandhaKishorM/laya/pull/506
* feat(onnx): port predict_batch sort_by_length to ONNXAgent by @aashish254 in https://github.com/NandhaKishorM/laya/pull/507
* fix(agent): a null `choice` label made the answer undecodable by @PerryLink in https://github.com/NandhaKishorM/laya/pull/508
* feat(router): forward predict_batch sort_by_length to every grouped Agent call by @aashish254 in https://github.com/NandhaKishorM/laya/pull/509
* fix(evals): fail the baseline comparison when a metric is missing by @can-gaa-hou in https://github.com/NandhaKishorM/laya/pull/510
* feat(cli): score a file or stdin of requests in one batch by @aashish254 in https://github.com/NandhaKishorM/laya/pull/511
* feat(mcp): add laya_predict_batch and laya_route_batch tools by @aashish254 in https://github.com/NandhaKishorM/laya/pull/513
* fix(router): run predict hooks when route() or load() fails by @Bruce-Yii in https://github.com/NandhaKishorM/laya/pull/514
* feat(mcp): add laya_decide, the schema-driven decision tool by @aashish254 in https://github.com/NandhaKishorM/laya/pull/516
* fix(ts): run process-wide default hooks once per Router.predict (#435 parity) by @Divit-aggarwal in https://github.com/NandhaKishorM/laya/pull/519
* feat(langchain): answer a batch of inputs on Laya's shared forward passes by @aashish254 in https://github.com/NandhaKishorM/laya/pull/522
* feat(langchain): add LayaDecision, the schema-driven decision node by @aashish254 in https://github.com/NandhaKishorM/laya/pull/524
* ci: pin action SHAs in the evals job and evals.yml by @Bruce-Yii in https://github.com/NandhaKishorM/laya/pull/525
* docs(http-api): add the HTTP API guide (#390) by @aashish254 in https://github.com/NandhaKishorM/laya/pull/490
* fix(router): forward the per-call hooks_timeout through route_batch by @Bruce-Yii in https://github.com/NandhaKishorM/laya/pull/515
* feat(structured): add decide_batch, the throughput form of decide by @aashish254 in https://github.com/NandhaKishorM/laya/pull/520
* feat(integrations): add LlamaIndex query routing and selectors by @LEVELING2108 in https://github.com/NandhaKishorM/laya/pull/533
* feat(cli): answer your own questions, and give them the token budget they need by @aashish254 in https://github.com/NandhaKishorM/laya/pull/542
* ci: let Dependabot update laya-ts's npm dependencies by @somtri in https://github.com/NandhaKishorM/laya/pull/547
* Add zh-CN/zh-TW evaluation: same-methodology rerun, business-scenario eval set, temperature refit by @CodyQin in https://github.com/NandhaKishorM/laya/pull/557
* fix(common): keep the decision head's attention shapes when traced for ONNX by @thread3d in https://github.com/NandhaKishorM/laya/pull/559

## New Contributors
* @Ha1baraA11 made their first contribution in https://github.com/NandhaKishorM/laya/pull/385
* @arunjoyt made their first contribution in https://github.com/NandhaKishorM/laya/pull/393
* @GaotianJin made their first contribution in https://github.com/NandhaKishorM/laya/pull/348
* @lihongyuan99 made their first contribution in https://github.com/NandhaKishorM/laya/pull/354
* @nanami-0713 made their first contribution in https://github.com/NandhaKishorM/laya/pull/386
* @idongdongh made their first contribution in https://github.com/NandhaKishorM/laya/pull/358
* @peterfriese made their first contribution in https://github.com/NandhaKishorM/laya/pull/372
* @rahul05ranjan made their first contribution in https://github.com/NandhaKishorM/laya/pull/480
* @luiz-linkezio made their first contribution in https://github.com/NandhaKishorM/laya/pull/417
* @dakjdakd made their first contribution in https://github.com/NandhaKishorM/laya/pull/440
* @bhushankinge made their first contribution in https://github.com/NandhaKishorM/laya/pull/436
* @MadrasLe made their first contribution in https://github.com/NandhaKishorM/laya/pull/448
* @Linz1248 made their first contribution in https://github.com/NandhaKishorM/laya/pull/349
* @sbhrwlr made their first contribution in https://github.com/NandhaKishorM/laya/pull/435
* @xiangyang-95 made their first contribution in https://github.com/NandhaKishorM/laya/pull/306
* @Divit-aggarwal made their first contribution in https://github.com/NandhaKishorM/laya/pull/470
* @thejenilsoni made their first contribution in https://github.com/NandhaKishorM/laya/pull/403
* @bunnysayzz made their first contribution in https://github.com/NandhaKishorM/laya/pull/431
* @thread3d made their first contribution in https://github.com/NandhaKishorM/laya/pull/462
* @gRain-is-grainy made their first contribution in https://github.com/NandhaKishorM/laya/pull/598
* @nefro313 made their first contribution in https://github.com/NandhaKishorM/laya/pull/612
* @RagingSilence made their first contribution in https://github.com/NandhaKishorM/laya/pull/615
* @Swatantra-66 made their first contribution in https://github.com/NandhaKishorM/laya/pull/618
* @Jayanth-reflex made their first contribution in https://github.com/NandhaKishorM/laya/pull/624
* @modusensus made their first contribution in https://github.com/NandhaKishorM/laya/pull/625
* @dantedeprenda made their first contribution in https://github.com/NandhaKishorM/laya/pull/539
* @viwe-monai made their first contribution in https://github.com/NandhaKishorM/laya/pull/545
* @rsshir60 made their first contribution in https://github.com/NandhaKishorM/laya/pull/573
* @umran666 made their first contribution in https://github.com/NandhaKishorM/laya/pull/485
* @Rajojha-1 made their first contribution in https://github.com/NandhaKishorM/laya/pull/491
* @somtri made their first contribution in https://github.com/NandhaKishorM/laya/pull/547
* @CodyQin made their first contribution in https://github.com/NandhaKishorM/laya/pull/557

**Full Changelog**: https://github.com/NandhaKishorM/laya/compare/v0.3.20...v0.3.21

Related Repositories