v0.8.47: emcn cleanup, search improvements - #8001
Conversation
waleedlatif1
commented
Sep 19, 2026
- fix(a11y): name icon-only buttons across product UI (fix(a11y): name icon-only buttons across product UI #7975)
- refactor(emcn): share filled stop icon across chat controls (refactor(emcn): share filled stop icon across chat controls #7977)
- fix(connectors): save service account changes with source settings (fix(connectors): save service account changes with source settings #7978)
- refactor(ui): remove styles already supplied by EMCN controls (refactor(ui): remove styles already supplied by EMCN controls #7979)
- fix(traces): make trace backfills bounded and resumable (fix(traces): make trace backfills bounded and resumable #7974)
- fix(settings): stabilize group search and modal dropdowns (fix(settings): stabilize group search and modal dropdowns #7980)
- fix(connectors): explain disabled settings with tooltips (fix(connectors): explain disabled settings with tooltips #7981)
- refactor(ui): centralize bulk-action buttons in EMCN (refactor(ui): centralize bulk-action buttons in EMCN #7982)
- refactor(emcn): centralize composer action button appearance (refactor(ui): centralize circular composer action buttons in EMCN #7983)
- refactor(emcn): centralize document file-type icons (refactor(ui): centralize document file-type icons in EMCN #7984)
- feat(access-requests): remove rollout flag and move feature into ee (feat(access-requests): remove rollout flag and move feature into ee #7986)
- feat(mcp): Sim MCP server for the full Sim API (feat(mcp): Sim MCP server for the full Sim API #7985)
- refactor(emcn): centralize product icon-button padding (refactor(ui): centralize product icon-button padding in EMCN #7987)
- feat(workflows): add model fallbacks to Agent, Evaluator, and Router (feat(workflows): add model fallbacks to Agent, Evaluator, and Router #7972)
- improvement(knowledge): cache admitted usage checks on the search path (improvement(knowledge): cache admitted usage checks on the search path #7989)
- fix(knowledge): preserve live document jobs during recovery (fix(knowledge): preserve live document jobs during recovery #7994)
- fix(knowledge): preserve live document processing during recovery (fix(knowledge): preserve live document processing during recovery #7993)
- fix(file-search): avoid foreground GIN cleanup stalls (fix(file-search): avoid foreground GIN cleanup stalls #7995)
- improvement(knowledge): rank inside the permitted set for organization search (improvement(knowledge): rank inside the permitted set for organization search #7996)
- feat(library): Best AI Agent Builders with MCP Support (feat(library): Best AI Agent Builders with MCP Support #7999)
* fix(resource): name bulk action buttons for accessibility * fix(a11y): name remaining icon-only product buttons --------- Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
* refactor(emcn): share filled stop icon across chat controls * test(desktop): wait for terminal writes to finish --------- Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
* wip * fix(traces): bound and resume trace backfill workers * fix(traces): use execution pool throughout backfill
* fix(settings): stabilize group search and modal dropdowns * fix(emcn): describe dropdown validation accessibly
* fix(connectors): explain disabled settings with tooltips * fix(settings): preserve accessible disabled-action explanations
* refactor(ui): share resource bulk-action button styles * refactor(emcn): own bulk-action button appearance centrally * test(emcn): consolidate bulk-action button coverage --------- Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
* feat(mcp): Sim MCP server for the full Sim API * fix(mcp): pick the read or write tool from the operation's declared scope; CORS on the MCP host * fix(mcp): match the MCP host by full authority; keep legacy API keys off the OAuth token prefix
Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
…7972) * feat(workflow-types): register the model-fallback-list subblock type Adds the type to the shared SubBlockType union, the block registry test allowlist, the tool-input exclusion set, and the docs generator's semantic type map. * feat(agent): add the fallbackModels subblock and its shared helpers The Agent block gains an ordered list of fallback models as an advanced field. The helpers normalize stored rows into execution candidates, decide which models a row may offer (credentials the block can actually supply), whether a row needs its own env-var key, and how the primary's tuning carries over: graded knobs only when the fallback declares the value, temperature and max output tokens clamped to the fallback's caps. * feat(executor): walk fallback models when the agent's provider request fails One handler invocation tries the primary then each fallback in order, so block retry wraps the whole chain. Falling through is as indiscriminate as retry: only a stop or a non-retryable failure ends it early. Messages are built once; hydration is cached per provider; a fallback that is blacklisted, not permitted, or cannot take the attachments is skipped. The models that failed are recorded on the block log and rendered in the trace as a Fell back from row. * feat(workflows): validate, sanitize, index, and label fallback model rows Copilot and YAML writes are refused when a row names an unknown model, sim-auto, a raw key instead of a {{ENV_VAR}} reference, or a tuning value the model does not declare. Export keeps only reference keys, search never rewrites a row key, and the canvas card summarizes the models. * feat(editor): fallback models list on the Agent block Ordered rows (2nd choice, 3rd choice, ...) directly above Retry on fail. Each row picks a model the block can supply credentials for, an env-var reference for its key when a different provider needs one, and a tuning value only for the knobs the primary's setting cannot fill. * docs(agent): document fallback models and their interplay with retry * fix(agent): harden fallback models after pre-landing review Executor: hydrate the primary before the secret registries settle and fork again, re-forking per fallback provider, so file provenance stays in the result registry; project the fall-through warn against the failed attempt's error registry and reinstate it before a post-skip rethrow; prime a streaming candidate's first chunk when another candidate follows, so a tool-loop startup failure still falls back; never fall back on a deep-research follow-up turn; strip the sim-auto identity preamble from a named fallback's messages; treat a row key still in {{VAR}} form as no key; stop starting candidates after an abort; record failed models on every exit, clearing them when a retry succeeds, and only when the names project safely. Helpers: row tuning applies only while its field is shown; the editor's row transforms are pure functions; changing a row's model to another provider drops the key reference; Bedrock honors NEXT_PUBLIC_BEDROCK_DEFAULT_CREDENTIALS. Editor: legacy Combobox to match the block editor, a row's own model is never disabled in its own picker, move controls only for two or more rows, the shared dashed add-row button, Create Secret wording, non-reference keys never rendered. Trace: one Failed model row per fallback. Export sanitizer uses the strict whole-reference check. * fix(agent): retry the selected model before falling back Retry on fail used to wrap the whole fallback chain, so tries 3 with fallbacks B and C ran A, B, C three times over. A builder who lists fallbacks wants the selected model retried and the fallbacks tried once each after its last try fails, which is also how LiteLLM orders retries and fallbacks and how OpenRouter treats each model in its list. The executor keeps the retry policy. Each try is now told where it sits in it through the node metadata (`BlockNodeMetadata.retry`, with the executor's own `isFinalTry` judgment), and the Agent handler keeps the fallbacks out of the candidate list until the final try. Every earlier try runs the primary alone and lets the failure escape for the policy to replay. Blocks without fallbacks, and blocks with retry off, behave as before; other handlers ignore the field. * fix(agent): address the pre-landing review of retry-then-fallback Review fixes: the executor judges the final try once per iteration; the skip-warn is one helper; the fallback warn names the candidate position rather than reusing `attempt`; the BlockLog.modelFallbacks doc matches the final-try semantics; the viability check resolves a provider once through the new providerRequiresFamilyCredentials; editor handlers read rows via a ref so a keystroke in one row no longer re-renders every row, and tuning options keep their identity across renders. Two consistency fixes from the red-team pass: a sim-auto fallback takes the projected system prompt rather than the raw input, and a row key is honoured at runtime only when the block stored it as a whole {{NAME}} reference, the one form the editor, the validator, and an export agree on. Tests now cover the composed executor-plus-handler sequence (three tries on the selected model, then each fallback once), the node-taking handler signature, a fallback whose provider cannot take the attachments, the per-provider hydration cache, a stop during a skipped candidate, the un-primed stream when no candidate follows, a non-retryable failure on a non-final try, a numeric tuning value, and an unresolved temperature. * fix(agent): close the adversarial review's fallback findings A routed sim-auto primary that fails now shows in the trace as the auto identity rather than the pool model, which is the name applyAutoModelLabel exists to hide. Per-row tuning resolves against the model the builder configured, the one the editor showed the fields for, so a row's value applies under sim-auto whatever pool model was routed. A fallback on another provider no longer receives the primary's Azure, Vertex, or Bedrock fields, which only that family reads. * docs(agent): name the fallback row cap and the empty tuning field * fix(agent): address the first review round on the fallback models PR A candidate stream that closes before its first chunk is a startup failure to fall through from, not an empty answer. The provider-decides tuning entry is stored as absence on the copilot path too, and a row key survives a same-provider model change only when it is a reference. The preview of a fallback list now gates its rows against the previewed version's selected model and settings rather than the live block's, and the preview value is typed instead of cast to any. * docs(agent): say which side of a fallback the catalog may not know The tuning doc read as if an unknown primary's values passed through. They do not: the block never shows a graded knob for a model outside the catalog, so a value stored under one is stale and the row's own field decides. A test now pins that. * feat(workflows): share model fallbacks across LLM blocks --------- Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
#7989) * improvement(knowledge): cache admitted usage checks on the search path * fix(knowledge): keep search-path refusals out of the shared usage gate cache * fix(knowledge): key the usage gate cache by billing period source
* fix(file-search): avoid foreground GIN cleanup stalls * fix(file-search): create chunk GIN index concurrently
…n search (#7996) * improvement(knowledge): rank inside the permitted set for organization search * fix(knowledge): count a caller's reach inside the requested bases
Co-authored-by: Sim Pi Agent <pi@sim.ai>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
|
| } | ||
| } | ||
|
|
||
| recordModelFallbacks(ctx, block, failedModels.slice(0, -1)) |
There was a problem hiding this comment.
When the final configured fallback is skipped before making a request—for example, because its provider is disallowed or needs credentials from another provider family—lastError still belongs to the previously attempted model. However, failedModels.slice(0, -1) always removes that model from the trace. A primary failure followed by an unusable fallback can therefore record no modelFallbacks, hiding a model that was actually attempted and failed. Only remove the last entry when that same model produced the terminal error.