3 Commits
Author SHA1 Message Date
53fab69f4f feat: add a decision model for skills, tools, and teams (#2098)
* feat: add a decision model for skills, tools, and teams

Let a small model shortlist what the chat model sees, including a local Laya install, and show the result on the turn.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: stop Laya through the POSIX-safe kill helper

Windows mypy does not see os.killpg, so process-group shutdown goes through the shared helper.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: compare the Laya install command without a POSIX path

Windows quotes the interpreter, so the displayed command is checked against the same argv list.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: show Laya readiness and wait for local decisions

Pin the local-CPU timeout fix and distinguish a ready Laya service from the service currently enabled for decisions.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat: save each decision service and pick the default on the card

Clicking a card selects the default. Endpoint and key stay in the drawer
so Jev, Laya, and custom can be kept at once.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-16 16:42:26 +08:00
HUANG Chengandjubaoliang bd73bb60aa fix(plugins): offload oversized octop_ui payloads to ToolMessage.artifact (#1032) (#1116)
Plugin tools returning large octop_ui payloads (e.g. a bangumi season
with 1200+ episodes, ~228KB JSON) blew up the LLM context because the
same tool-result string served both the model and the UI.

Add OctopUiOffloadMiddleware at the innermost agent middleware layer:
when a ToolMessage content is a >=4000-char string carrying a non-empty
octop_ui renderer and data (and no file:// media refs), the payload is
moved in-place to ToolMessage.artifact and the model-visible content is
replaced by a compact result that keeps title/summary. Tool id,
tool_call_id, name and status are preserved.

Frontend restores rendering from artifact: ToolCallData.artifact,
closeToolCall extraction, history replay path, and resolvePluginUiData
prefers explicit data over data_ref. serialize.py surfaces artifact on
tool_result blocks; history recorder backfills artifact as fallback.

Spec: docs/octop-ui-payload-offload.md

Co-authored-by: jubaoliang <jubaoliang@gmail.com>
2026-09-25 23:06:19 +08:00
jubaoliang 748d998cf2 first commit 2026-07-09 14:32:36 +00:00