Orkestia
Blog
Chat

Responder configuration reference

Every field of buzz.actor.set-responder, how the hybrid responder hands turns to Staff, how default_inputs pre-fill and narrow reads, and what each refusal code means

buzz.actor.set-responder decides who answers for one attached actor: its Staff configuration, DGI, or both. It is the only setting structured chat needs. Structured chat is part of DGI and is Alpha.

  • Who may call it: an organization admin or owner, signed in as a person. Agents, API keys, the system and end users are refused.
  • Where it is stored: on the space, per attachment. data.buzz.attachment.list returns it as each attachment's responder. Nothing in it is a secret.
  • When it takes effect: on the next message. No buzz.bridge.sync is needed.
  • How to undo it: call it again with responder: "staff". The DGI entry is removed and the actor answers with its Staff configuration.
  • Replacing, not merging: each call stores the whole entry. Send every field you want to keep.

Fields

FieldApplies toValues and defaultWhat it does
space_uuidallRequiredThe chat space
attachment_uuidallRequired. From data.buzz.attachment.listThe attached actor
responderallRequired. staff, dgi or hybridstaff: the actor's Staff configuration (the default, no entry stored). dgi: DGI answers with cards. hybrid: DGI first, Staff for what DGI cannot decide
allowed_workflow_typesdgi, hybridRequired. 1 to 50 names, exact or prefix.*The workflows DGI may start. Intersected with what the message author may run, so it never grants anything. An empty list is refused
system_promptdgi, hybridUp to 8,000 charactersInstructions added to DGI's own: tone, language, what to show, what to avoid
decision_enginedgi, hybridauto (default), jev, llmWho decides each turn. auto: Jev when it is confident, else the LLM. jev: Jev. llm: the LLM only. hybrid refuses llm
jev_thresholddgi, hybrid0.5 to 0.99, default 0.8Jev confidence needed to act without the LLM
jev_connection_uuiddgi, hybridAn active TypeSafe connection of the organizationWhich connection Jev decides with. Without it, DGI uses the organization's own
ai_provider_config_uuiddgi, hybridAn AI provider configuration of the organization. Default: the organization's defaultWhich model answers when the LLM is used. Your organization pays its own tokens
max_reasoning_turnsdgi, hybrid6 to 48, default 12Tool-loop budget per message on the LLM path
renderersdgi, hybridSubset of form, confirm, select, table, actionlist, logs, run, chart, kpi, link, composition, dag, schema, datagrid, query, diff, detail, timeline. Default: allWhich cards the chat may draw. A view whose renderer is left out is posted as text. See the card catalog
default_inputsdgi, hybrid{workflow_type: {field: value}}. See belowValues DGI pre-fills for a workflow
suggestionsdgi, hybrid1 to 8 {label, prompt}Curated quick replies, offered instead of the ones DGI generates
confirm_allowed_end_user_uuidsdgi, hybridUp to 50 end-user uuidsOnly these people may press Confirm, on top of the card's own author check. For example, a founder-only approval
composedgi, hybridBoolean, default falseLets DGI show and edit compositions in chat. Honored only when replies run as an organization member, never in seat mode. Saving still goes through a confirm card
hybrid_handoff_reasonshybrid1 to 20 reason names. Default belowWhich DGI fallback reasons hand the turn to the Staff configuration

Suggestions

suggestions pins an actor's quick replies. Each entry has exactly two keys:

  • label: 1 to 48 characters, plain one-line text, distinct from the others (case-insensitive), not starting with a bullet or wrapped in quotes.
  • prompt: 1 to 200 characters. It tells DGI what the label means.

A quick reply posts its label as the person's message, never its prompt. Pick labels that read well as a message, such as "Blocked tickets".

Seat mode or organization mode

The responder decides what answers. The attachment's reply principal, set with buzz.actor.set-reply-principal, decides as whom DGI runs:

Reply principalDGI runs asCatalog DGI sees
seat (default)The end user who wrote the messageWorkflows marked eligible for end users and compositions your app exposes, intersected with allowed_workflow_types. No compose, save, connection or run-inspection tools
organizationThe author's linked organization account; if there is none, the admin who turned internal mode on (re-checked as admin on every reply)allowed_workflow_types, and nothing beyond it

See Internal support actor for the gates of organization mode.

Hybrid: DGI first, Staff for the rest

With responder: "hybrid", every turn starts as a DGI turn. The turn is handed off to the actor's Staff configuration when DGI drew no card, did not refuse the request, and one of these holds:

  1. DGI stopped at a fallback whose reason is in hybrid_handoff_reasons;
  2. DGI produced no usable text and no card;
  3. the DGI run failed.

Default hybrid_handoff_reasons:

ReasonDGI found
workflow_noneNo allowed workflow fits the message
intent_unsupportedAn intent it does not handle structurally
needs_value_extractionValues it would have to pull out of free text
low_confidenceJev was not confident enough
no_candidatesNo candidate workflows to choose from

Reasons match by family. A listed name also covers every reason that starts with it: jev covers jev_timeout, and chitchat covers chitchat_needs_tools. A fallback reason that is not listed is answered by DGI's own LLM, so views that only the LLM path draws still reach a hybrid actor.

On a hand-off nothing of DGI's is posted: the Staff configuration answers the same message exactly as responder: "staff" would, as the actor's seat (so a hybrid actor in seat mode must declare that it acts as the app). An answer to a card always stays with DGI.

Default inputs

default_inputs pre-fills workflow inputs. For example, a support actor that should see only support tickets in active states:

{
  "ticket.search": {
    "labels": ["support"],
    "status": ["open", "triaged", "in_progress", "blocked"]
  }
}
  • Limits. Every type must be allowed by allowed_workflow_types (exactly, or under a prefix.*; a pattern itself is refused). Up to 20 types, 30 fields per type, field names like [A-Za-z_][A-Za-z0-9_]* up to 64 characters, values JSON scalars (strings up to 1,000 characters, numbers, booleans, null) or lists of up to 50 of them, and 8,192 bytes in total. Anything else is default_inputs_invalid.
  • The person's own values win. A default fills a field only when the message and the form leave it empty.
  • Naming a value narrows the default. When a message names a value of a defaulted filter, DGI uses that value instead of the whole default list: "show me the blocked tickets" searches status: [blocked], not the four defaults. The card's title says which filter it used.
  • They grant nothing. Defaults cannot widen the scope, skip the confirm, or reach another person's data.
  • Superseded entry points. When an app entry point is republished under a new version, the defaults for the old type follow it, as allowed_workflow_types do.

Troubleshooting

You seeWhyFix
buzz_admin_role_required, buzz_admin_requires_humanThe caller is not an admin or owner, or is not a personAn organization admin or owner starts the call, signed in as themselves
dgi_responder_unavailableThe platform cannot store responder state for this space yetContact Orkestia support
decision_engine_invalidhybrid with decision_engine: "llm"Use auto or jev for hybrid
jev_connection_not_found, jev_connection_invalid, jev_connection_inactiveThe connection is not an active TypeSafe connection of this organizationPick one from connection.query filtered to typesafe, or leave the field out
default_inputs_invalid, suggestions_invalidA value breaks the limits aboveFix the entry the message names
actor_act_as_not_declaredA hybrid actor in seat mode whose Staff definition does not act as the appDeclare act-as on the actor, or use dgi
The actor answers "I can't do that for you in this conversation"DGI refused: the workflow is outside the scope or the person may not run itAdd the type to allowed_workflow_types, and in seat mode expose it to end users
A configuration message ending in dgi_scope_required, author_not_linked or internal_principal_not_adminThe attachment has no scope, or organization mode cannot find who to run asSet allowed_workflow_types; in organization mode, make sure the enabling admin is still an admin
Cards arrive as plain textThe renderer is not in renderers, the theme flag structured_ui is off, or the client is older than the cardCheck the responder entry, the theme, and republish the chat page
"This form is no longer active"The card was replaced by a newer one, or it is answered from another channelAsk again, and answer where the card was posted
"This card expired"Forms and confirms expire after 30 minutesAsk again
No / paletteThe space predates the commands entry point, or the hosted page is oldRe-run buzz.space.enable, then buzz.space.publish-chat
A typed "yes" did nothingProse never confirmsPress Confirm on the card

Ask your AI assistant

prompts
Read the responder of every actor in my chat space with data.buzz.attachment.list and explain each setting in plain words.

Draft a hybrid responder for my actor "<actor name>" that hands free-text questions to its Staff configuration but keeps low-confidence reads on DGI. Show me the hybrid_handoff_reasons you chose and why.

Add default_inputs to my support actor so ticket searches default to open support tickets, keeping every other responder field unchanged. Show me the full call first.

For AI agents

RuleDetail
Read before writedata.buzz.attachment.list shows the current entry. set-responder replaces the whole entry, so carry every field forward
ScopeNever propose an empty allowed_workflow_types. Verify each type with get_workflow_schema; in seat mode check end_user_eligible or that it is an exposed composition
Human callersPrepare the call; an admin or owner starts it
Handoff reasonsMatch by family prefix. Do not list llm_fallback itself as a reason
Defaultsdefault_inputs keys must be allowed types, not patterns