The AI setup assistant. A server admin asks a question ("how do drops work?") or for a setup ("notify #live when xqc goes live on Kick, ping @Live"); the answer is text, and for a setup, proposal cards. The assistant NEVER writes anything: the dashboard shows each proposal with the real channel and role pickers pre-filled, and Apply calls the matching existing method (e.g. guildPlatform.createGuildStreamer) - the same route the normal page uses, with the same checks.

Apply maps (area, op) to a fixed method in the dashboard. A proposal carries no method name and no arguments to call, and guildId always comes from the page URL, never from a proposal.

Behind the aiAssistant launch flag, and a top.gg vote on its own voteToUseAssistant flag (Premium Plus skips it). The conversation is held by the SERVER: send conversationId from the previous answer, never past messages. Errors carry a code to localize - see AssistantErrorCode.

Constructors

Methods

  • One assistant turn. Nothing is saved.

    • 400 invalid_body: message must be 1-2000 characters; unknown keys are refused.
    • 403 not_available (flag), not_manager (Manage Server is checked live), or vote_required (isVoteRequired(error) - show a vote button from error.voteUrl).
    • 429 rate_limited with retryAfterSeconds (and a Retry-After header): the daily cap per server (Free 15 / Premium 50 / Premium Plus 150) or per user (100 across all servers) is used up.
    • 503 assistant_paused (today's budget is spent - back tomorrow), assistant_unavailable, or limits_unavailable. Show as "try again later".

    data.notices tells the dashboard what to show besides the reply: unsure (no sourced answer - link data.supportUrl), off_topic, rephrase, more_areas (it handled four features and can continue), cut (more changes than one message takes).

    Parameters

    • __namedParameters: {
          auth: string;
          conversationId?: null | string;
          guildId: string;
          message: string;
      }
      • auth: string
      • OptionalconversationId?: null | string
      • guildId: string
      • message: string

    Returns Promise<WebResponse<AssistantReply>>

  • What the user did with a proposal: applied, edited (with the field keys they changed before applying) or dismissed. Fire-and-forget - never block the UI on it. Accepted once per proposal, only for the user and server it was made for; what was actually saved is read by the server, not taken from this call.

    404 not_found (unknown or expired - proposals live an hour), 409 already_recorded, 429 rate_limited.

    Parameters

    • __namedParameters: {
          auth: string;
          editedKeys?: string[];
          guildId: string;
          proposalId: string;
          result: "applied" | "edited" | "dismissed";
      }
      • auth: string
      • OptionaleditedKeys?: string[]
      • guildId: string
      • proposalId: string
      • result: "applied" | "edited" | "dismissed"

    Returns Promise<WebResponse<{
        recorded: true;
    }>>

  • "Share this chat with Noti": the user CHOSE to send this conversation for review, behind a confirm. Send what the panel showed. Behind the assistantShareChat launch flag. Kept 30 days, staff-only.

    • 400 invalid_body: at most 40 turns, 2000 characters a turn, 32 KB in all, note up to 500.
    • 403 not_available (a flag is off) or not_manager.
    • 404 not_found: the chat expired - a chat can be shared for an hour after its last message.
    • 429 rate_limited: 5 shares a user a day.

    Parameters

    • __namedParameters: {
          auth: string;
          conversationId: string;
          guildId: string;
          note?: string;
          turns: AssistantShareTurn[];
      }
      • auth: string
      • conversationId: string
      • guildId: string
      • Optionalnote?: string
      • turns: AssistantShareTurn[]

    Returns Promise<WebResponse<{
        shareId: string;
    }>>