add_agent_variable
ChatGPTDeclare a single new variable in the agent's variableConfigs registry. Errors if a variable with the same key already exists — use update_agent_variable to change a config in place. Auto-syncs postSessionVariableKeys: the new key is opted into post-session extraction by default. IMPORTANT: Do not call multiple agent mutation tools in parallel — they perform read-modify-write and will overwrite each other.
add_prompt_module
ChatGPTAdd a single prompt module to the agent. Modules are reusable prompt fragments; enabled ones are appended after the global prompt at inference time. Errors if a module with the same name already exists — use update_prompt_module to change one in place. name is the natural key (unique per agent). PREFER starting from a built-in preset: call list_builtin_prompt_modules (a curated, grouped, per-locale voice catalog) and copy one in — passing the agent's locale — rather than authoring from scratch. KEEP MODULES CONSOLIDATED: one module = one coherent topic. If related rules fit together within roughly 2000 tokens, put them in ONE module instead of scattering them across many tiny ones; extend an existing module (update_prompt_module) before adding a new one. Only split when topics are clearly independent or a module would grow far beyond that size. IMPORTANT: Do not call multiple agent mutation tools in parallel — they perform read-modify-write and will overwrite each other.
bind_integration_account
ChatGPTLet a project use one of its organization's integration accounts. After binding, enable actions with create_tool: type = the action toolType from list_integration_providers (e.g. "hubspot_search_contacts") and metadata = { integrationAccountId: "<accountId>" }. Idempotent.
cancel_qa_run
ChatGPTCancel a running QA run: calls not yet evaluated are dropped (and not charged); calls already being evaluated finish and keep their result. cancelled: false means the run had already finished and nothing changed. Requires the org owner or manager role.
create_edge
ChatGPTAdd a new edge between two nodes. The condition describes when the conversation transitions from source to target node. IMPORTANT: Do not call multiple pathway mutation tools in parallel — they perform read-modify-write and will overwrite each other.
create_knowledge_base
ChatGPTCreate a knowledge base in a project
create_memory
ChatGPTCreate a new memory entry for a project
create_node
ChatGPTAdd a new node to the pathway. IMPORTANT: Do not call multiple pathway mutation tools in parallel — they perform read-modify-write and will overwrite each other. Node schema: { id: string, type: "<nodeType>", position: { x: number, y: number }, data: NodeData } NodeData by type: - start: { type: "start", title: string, prompt: string, tools?: string[], variableKeys?: string[] } - prompt: { type: "prompt", title: string, prompt: string, tools?: string[], isGlobalNode?: boolean, globalNodeReason?: string, variableKeys?: string[] } - goto: { type: "goto", title: string, referenceNodeId: string | null }
create_project
ChatGPTCreate a new project with default agent and pathway
create_qa_profile
ChatGPTCreate a QA profile. Starts from template (default "full"); checks, when given, replaces the template's checks — a check whose id matches a template check starts from it. defaultSampling is merged over the template's (100 calls of the last 7 days across every project, stratified, calls ≥ 15 s). Validated like the console editor. Creating a profile runs nothing and costs nothing. Read get_qa_profile's authoring (any profile works) or list_qa_profiles first. Requires the org owner or manager role.
create_test_case
ChatGPTCreate a new test case for a project. A test case defines a simulated conversation scenario to evaluate agent behaviour.
create_test_suite
ChatGPTCreate a new test suite for a project. A test suite groups related test cases together for batch execution. Optionally connect existing test cases by providing their IDs.
create_tool
ChatGPTCreate a new tool for a project
delete_edge
ChatGPTDelete an edge from the pathway. IMPORTANT: Do not call multiple pathway mutation tools in parallel — they perform read-modify-write and will overwrite each other.
delete_integration_account
ChatGPTDelete an organization integration account and its credential. EVERY project bound to it loses the binding and the integration tools that account backed (check projectCount in list_org_integration_accounts first, and confirm with the user). To stop only one project from using it, use unbind_integration_account instead. Requires the org owner or manager role.
delete_memory
ChatGPTDelete a memory entry
delete_node
ChatGPTDelete a node and its connected edges from the pathway. IMPORTANT: Do not call multiple pathway mutation tools in parallel — they perform read-modify-write and will overwrite each other.
delete_project
ChatGPTDelete a project (owner only)
delete_test_case
ChatGPTDelete a test case from a project. Removes criteria and disconnects from suites.
delete_test_suite
ChatGPTDelete a test suite from a project. This does not delete the test cases themselves.
delete_tool
ChatGPTDelete a tool from a project
end_conversation
ChatGPTEnd an interactive conversation and persist it. Triggers the normal end-of-session pipeline (final variable extraction, post-session webhook, evaluation). Idempotent — ending an already-ended conversation succeeds without re-running the pipeline.
get_agent
ChatGPTGet complete agent data (configuration + pathway) for a project
get_automation
ChatGPTGet one automation rule in full: trigger, scope, conditions and every step exactly as stored. Read this before update_automation — steps and conditions are replaced WHOLE, so an edit starts from this list. Requires the org owner or manager role.
get_automation_run
ChatGPTGet one automation run with every step it recorded: the request each step sent (credentials already redacted), the response, per-step error and duration, plus the run's error, attempt count and timings. Use after list_automation_runs to diagnose a failed or skipped run. Requires the org owner or manager role.
get_builder_playbook
ChatGPTGuidance for building and changing voice agents on this platform, one topic at a time. Call this BEFORE you write or edit prompt content, tool configuration, or a test case — the bodies carry the current house rules, and they are not repeated in your system prompt. Topics: - rule-shape — How to phrase a rule so the agent actually follows it — preconditions over requests, conditions in the main clause, branching on observable fields, and pairing every prohibition with the normal path. - tool-authoring — Writing tool configuration: why parameter descriptions are prompt rather than API docs (never a fallback literal), credentials via secret handles, and empty-value handling. - simulator-and-criteria — Test cases and the simulator: the LIVE-by-default safety trap, writing criteria the judge cannot misread, why a failed criterion does not mean the agent is wrong, and how many runs a conclusion needs. - voice-writing — Voice-first writing rules for any prompt content the agent will speak: turn length, one question per turn, readback of critical values, ASR tolerance, guardrails. - agent-architecture — Structuring an agent: monolithic single node by default, the setup order, prompt-module granularity, and what the agent actually reads at a given turn. Returns the topic body as markdown. Project-independent: no projectId, no side effects.
get_conversation_state
ChatGPTInspect an interactive conversation's current state without advancing it. Returns the current pathway node, extracted variables, whether the agent has ended the conversation, and message/turn counts. Right after end_conversation, post-session variable extraction may still be running detached — re-read a few seconds later if extractedVariables looks incomplete. Only works on sessions opened with start_conversation.
get_highlights
ChatGPTGet the "Highlights" digest material for a project: everything needed to write a periodic performance report over the sessions in a time window. Returns bounded, structured facts — you (the calling agent) write the narrative: - window + checkpoint (store checkpoint.until as the next call's "since") - summary stats and a previous-window comparison (volume / evaluation deltas) - evaluation breakdown, aware of the project's evaluation type (pass_fail / enum / number), plus the project's evaluation config so option semantics are interpretable - top unanswered knowledge-base queries (zero-hit searches — candidates to add to the KB) - transcript excerpts sampled per evaluation outcome (for topic discovery, sentiment analysis kept separate from success, and timing-of-failure analysis) The result's reportGuide field is the agreed report format — follow it when writing the report.
get_outbound_campaign
ChatGPTGet one outbound campaign with how its contacts ended up. Besides the list_outbound_campaigns fields: breakdown.byDispatchStatus (pending/queued/running/completed/failed — the dialer's view), breakdown.byCallStatus (the raw call-log status per contact, e.g. userNoAnswer, invalidNumber, agentHangup; none = never dialed or no call log yet), awaitingRetry (contacts the retry policy will re-dial) with earliestNextAttemptAt, dialingWindow (whether it is inside a window now and when the next one opens, in the campaign timezone), and failureReasons: the non-connected outcomes grouped by their RAW cause, e.g. invalidNumber · sip 403 No International Permission → 37. IMPORTANT: the dashboard shows invalidNumber for many carrier/permission failures (SIP 403 forbidden / no international permission, 404, 484 address incomplete) — read failureReasons for the real cause before telling the user the numbers are bad. Each group carries sampleContactIds to inspect with list_outbound_campaign_contacts.
get_phone_number
ChatGPTGet one phone number with its inbound routing details: the bound project (inboundProjectInfo) and the per-number override config (voice/language/background-audio/thinking-sound override flags, an optional voiceProfile override, and a fallbackPhoneNumber to forward to when no agent answers). Find the phoneNumberId via list_phone_numbers — lookup is by id, so numbers sharing an E.164 across extensions are unambiguous. inboundConfig is null when the number has no overrides (it then fully follows the bound project settings).
get_project
ChatGPTGet project details by ID
get_qa_profile
ChatGPTGet one QA profile in full — every check (id, kind, name, enabled, severity, config), the default sampling and the judge model — plus authoring: what each check kind measures, its config fields with their ranges and defaults, severities, judge tiers, templates and limits. ALWAYS read this before create_qa_profile, upsert_qa_check or update_qa_profile. Requires the org owner or manager role.
get_qa_run
ChatGPTGet one QA run's report: status and progress; meta (time window, projects, sampled vs requested, judge model, credits charged); KPIs (pass rate, p90/max latency, interruption rate, longest dead air after the caller finished speaking — transfers left out — and how many calls had timing data); every check as the report table orders it — failing first by failed calls, then passed, not applicable, undetermined, errored, pending — with fail/decided counts, a display tier for failing checks (occasional ≤10% failed, attention ≤30%, failing above; a critical check one tier up — verdicts are unchanged) and a one-line summary; the 10 slowest replies of the run (call, latency, whether the reply waited on a tool call and which tools, the words); pass/fail per project; agent sentences interrupted 2+ times; silenceByCause (agent-owed silences over the dead-air threshold by cause: stall | lookup | transfer); silenceHistogram (caused silences over that same threshold by length bucket fromMs/toMs and cause — the first bucket starts at the threshold, then 10 s, 20 s, 40 s; shorter gaps are turn-taking and left out); transfers (outcomes connected | failed | abandoned | unknown, wait p50/max; null for runs evaluated before transfer detection); and the settings snapshot (checks, sampling, judge model) the run used, which may differ from the profile today. Rates are fractions 0–1, durations ms. Drill into calls with list_qa_run_calls. Requires the org owner or manager role.
get_session
ChatGPTGet full session detail including all events (messages, decisions, tool calls, etc.). This is the primary tool for debugging agent behaviour — it returns the complete conversation timeline with serialized messages and decision events. The project is inferred from the session itself; no projectId needed.
get_session_recording
ChatGPTGet download URLs for a session's call recording. Returns signed links that expire after expiresInMinutes; fetch them right away and call this tool again for fresh ones. Any of the three may be null: - recording: the merged call audio. When it is a stereo ogg, channels says the caller is on the left and the agent on the right. - userTrack / agentTrack: the caller's and the agent's separate tracks. format is the file extension of each (ogg, mp4, ...). note explains a missing recording (not recorded, still finalizing, or tracks only). The project is inferred from the session itself; no projectId needed.
get_session_stats
ChatGPTGet session statistics for a project (session counts over time). Useful for observability dashboards.
get_test_case
ChatGPTGet a single test case by ID, including its configuration and acceptance criteria.
get_test_results
ChatGPTGet test results for a test suite, including per-test-case and per-criterion outcomes.
get_test_suite
ChatGPTGet a single test suite by ID, including its connected test case IDs.
get_tool
ChatGPTGet a specific tool configuration
insert_chunks
ChatGPTInsert pre-split chunks directly into a knowledge base. Each string becomes one chunk (no further splitting). Chunks are attached to a new dataset and embedded synchronously.
insert_dataset
ChatGPTInsert a dataset into a knowledge base from raw text. The text is split using the KB chunk settings and embedded synchronously (this call returns once embedding completes).
list_automation_runs
ChatGPTList an organization's automation runs, newest first — one run per (rule, session, trigger). Use it to check whether a rule fired and why it failed or skipped; open one with get_automation_run for per-step requests and responses. status: pending | running | succeeded | failed | skipped (a condition did not hold, or the loop guard stopped a rule that kept running for the same person — error says which) | captured (test-runner dry run, nothing sent). Requires the org owner or manager role.
list_automations
ChatGPTList an organization's automations — post-call rules that fire on a session event (trigger), filter with conditions, then run steps (integration actions, http calls, transforms) in lanes. Returns each rule with a step summary, run count (live runs only) and last run. Call list_organizations first for the organizationId; requires the org owner or manager role. Use get_automation for a rule's full conditions and steps.
list_builtin_prompt_modules
ChatGPTList the built-in prompt module catalog — a curated set of common VOICE agent rules (voice output formatting, one-question-per-turn, ASR tolerance, concise responses, no-echo, natural fillers, role lock, timezone/time format, no fabrication, confirming critical details, recording notice, surname decomposition, off-topic reframing, escalation to a human, de-escalation), grouped as fundamental / recommended / optional. Each is a localized template: copy one into an agent with add_prompt_module (its content is a good starting point) and edit as needed. Built-ins are NOT enabled on any agent until added. Consult this BEFORE authoring prompt-module content from scratch, and prefer a matching preset. Pass locale (e.g. "zh-TW") to get each preset's name / description / body in the agent's language; defaults to English. Pass projectId to also get alreadyAdded per preset (whether the agent already has a module with that name) — handy for spotting gaps. To get just the recommended presets the agent is MISSING, use suggest_prompt_modules instead. Returns [{ id, name, description, content, builtin, group, order, defaultEnabled, alreadyAdded? }]. defaultEnabled marks presets the catalog recommends be on (fundamental + recommended groups).
list_chunks
ChatGPTList the chunks of a dataset in a knowledge base
list_datasets
ChatGPTList the datasets in a knowledge base
list_integration_tools
ChatGPTList the INTEGRATION tools of a project — the platform-owned actions the agent can take mid-conversation (endCall, transferCall, chatwoot transfer_to_human). These are separate from list_tools, which covers only the custom tools the project itself created; an integration tool has no id, is addressed by toolName, and is configured with update_integration_tool. Each entry reports the effective description (an override, or the built-in default), whether the agent may call it (enabled), whether its owning integration is switched on at all (integrationEnabled), and any per-tool settings — for transferCall that is the destination allowlist. Read this before touching a tool's description or allowlist, so the edit starts from what is actually configured.
list_knowledge_bases
ChatGPTList the knowledge bases for a project, including each one's searchInstruction — the text the agent's knowledge-search tool is described with at call time (null = built-in default). Edit it with update_knowledge_base.
list_llm_models
ChatGPTList the LLM models an agent can run, grouped into families as the dashboard model picker shows them (speech-to-speech first, then pipeline). Each family has reasoningOptions — one per reasoning level (none / low / medium) with its modelId, all-in voice price per minute and first-token latency. Pass a familyId as update_agent config.llmModel plus config.reasoningEffort to select one. guidance explains how to pick. Pass projectId to also get that agent's current selection.
list_memories
ChatGPTList all memories for a project
list_org_integration_accounts
ChatGPTList the organization's connected integration accounts (HubSpot workspace, Slack workspace, …). An integration step MUST name one of these as integrationAccountId, of the same provider and not revoked. Returns metadata only — credentials are never exposed. If the provider you need has no account, tell the user to connect it in Organization Settings → Integrations; you cannot connect one. Requires the org owner or manager role.
list_organizations
ChatGPTList the organizations the current user belongs to. An organization is the tenant/billing boundary that OWNS projects, and a project can never be moved between organizations. Call this before create_project and pass the chosen organizationId — omitting it creates the project in the entry flagged "isDefault" (usually the user's personal workspace).
list_outbound_campaign_contacts
ChatGPTList a campaign's contacts (its call list) with each one's outcome, one page at a time, newest call first (never-dialed contacts last). Filters: dispatchStatus (dialer status), callStatus (raw call-log status; "none" = no call log), phoneNumber (substring of the contact number; also matches text in the contact's variables) — values within a filter OR, different filters AND. Per row: contactId, phoneNumber, dispatchStatus, dispatchFailedReason (dispatch-level, e.g. post_failed, timeout_recovery), callStatus, callStatusDetail (the RAW dial-failure detail from the call log — code, msg, sip_status_code, sip_status — this is where the true cause of an "invalidNumber" lives, e.g. sip_status_code 403 "No International Permission"), attemptCount, nextAttemptAt (scheduled re-dial), callbackAt (a callback the customer asked for, dialed first when due; null when none is pending), callbackCount (callbacks granted so far, at most 2), sessionId (open with get_session), durationSeconds, evaluation/evaluationReason, startedAt/endedAt, seedVariables (what the list supplied) and extractedVariables (what the call extracted; null when never dialed). Returns total (after filters) and hasMore; page through with page (1-based) and pageSize. The call list is immutable.
list_outbound_campaigns
ChatGPTList outbound (dial-out) campaigns, newest created first. Pass exactly one of projectId (that project's campaigns) or organizationId (every campaign in the org whose project you can read). Campaigns are organization assets: the caller must be the org's owner or manager. Each entry: id, name, status (draft = never dialed; active = dialing within its schedule windows; completed = stopped or finished), stoppedReason (e.g. insufficient_credits — when set the campaign did NOT finish its list), fromNumber (caller ID, E.164), schedule, retryPolicy, and contact counts (totalContacts, dispatchedContacts, completedContacts, connectedContacts = answered). Use get_outbound_campaign for status breakdowns and the real failure reasons.
list_phone_numbers
ChatGPTList the phone numbers owned by an organization. Phone numbers are ORGANIZATION assets (not project assets): use list_organizations to find the organizationId, and the caller must be that organization's owner or manager. Each entry shows the business-facing fields — E.164 number, optional PBX extension (the same representative number may appear once per extension), provider, status, label/displayName, and which project answers inbound calls (inboundProjectId). Use get_phone_number for override settings. Telephony internals (trunks, SIP credentials) are not exposed; adding/removing numbers or changing status is admin-panel-only.
list_project_integration_accounts
ChatGPTList the organization integration accounts bound to a project — the credentials its integration tools (create_tool with an action toolType) can use. Credentials are never returned.
list_projects
ChatGPTList all projects accessible by the current user
list_qa_candidate_calls
ChatGPTList an organization's finished voice calls, newest first — the calls a QA run with sampling.strategy "manual" can pick (pass their sessionId values as sampling.sessionIds to preview_qa_sample / start_qa_run). Each row: sessionId, project, startedAt, durationSeconds, direction (inbound | outbound | null), channel (sip | web-call) and marked (flagged in session history). Chat sessions are never listed. Paged: pass nextCursor back as cursor; null on the last page. Requires the org owner or manager role.
list_qa_profiles
ChatGPTList an organization's QA profiles (品質抽檢 setups). A profile is a list of checks — measured voice checks (latency, interruptions, talk-over, dead air, call length/status, tool failures) and llm_rubric criteria a judge model grades — plus the default sampling a run draws calls with. Each row: enabled check count, project scope, the last run (status, pass rate), the latest completed run's pass rate, runs and calls of the last 30 days, and the most-failed check. Rates are fractions 0–1. Requires the org owner or manager role.
list_qa_run_calls
ChatGPTThe sampled calls of a QA run, newest first: sessionId (open with get_session), project, start time, duration, item status, verdict (pass | fail | na — na = nothing could be decided) and the checks it failed. verdict: "error" lists calls that could not be evaluated or had a check error. checkId keeps only calls that FAILED that check (the report's row click). includeEvidence: true adds every check result with its reason and evidence (turnIndex into the session messages, quoted text, measured valueMs, the cause of a dead-air gap, the transferOutcome of a transfer). Paginated: pass nextCursor back as cursor. Requires the org owner or manager role.
list_qa_runs
ChatGPTList an organization's QA runs, newest first: profile, when it started, the sampled time window, status (running | completed | cancelled | failed), sampled vs requested calls (short: true when fewer matched than requested), pass rate (pass / (pass + fail), fraction 0–1), p90 response latency (ms), interruption rate (fraction) and the credits charged so far. With status, the newest 100 runs are searched. Open one with get_qa_run. Requires the org owner or manager role.
list_secrets
ChatGPTList the secret handles available to this project — the credential store for tools that call an authenticated external API. Secrets belong to the project's ORGANIZATION and are shared by every project in it. ALWAYS call this before create_tool / update_tool whenever the tool needs an API key, bearer token, or any other credential: put the reference {{secrets.HANDLE}} in the metadata (e.g. headers.Authorization = "Bearer {{secrets.CRM_TOKEN}}") instead of a literal value — the reference is expanded in memory at tool execution time, so rotating the credential needs no tool change. NEVER write a literal credential into tool metadata: it would be stored in plaintext. Secret VALUES are write-only and are never returned by any tool — this lists handles only. You CANNOT create, change or delete a secret: if the handle a tool needs is missing, tell the user to add it themselves in Organization Settings → Secrets, then reference it by name.
list_sessions
ChatGPTList session histories for a project with pagination and filters. Returns lightweight summaries (no events). Use get_session for full detail. Filters: - page / pageSize: pagination (default 1 / 20) - startDate / endDate: YYYY-MM-DD format - provider: filter by integration type - search: search by session ID - markedOnly: only marked sessions - hasComments: only sessions with comments
list_test_cases
ChatGPTList all test cases for a project. Returns each test case with its configuration and acceptance criteria.
list_test_suites
ChatGPTList all test suites for a project. Returns each suite with its id, name, timestamps, and the IDs of connected test cases.
list_tool_types
ChatGPTList available tool types that can be created
list_tools
ChatGPTList all tools configured for a project
list_voice_options
ChatGPTList what update_voice_profile can actually be set to: the TTS voice catalog, the thinking sounds available for a voice, the ambient background tracks, the supported language codes and the speed range. Voice and thinking sound are opaque UUIDs, so without this there is no way to write voice.id or backgroundAudio.thinkingSoundIds correctly — call this first whenever the user asks to change the voice. Voices carry suitableLanguages (match it against the profile language) and a billing tier: "premium" voices bill at a higher per-minute rate, so say so before switching a project to one.
preview_automation
ChatGPTDry-run a step list (saved or not) against a REAL past session of the organization and return what each step would send — the rendered url/headers/body or integration input — plus transform outputs and condition verdicts. SENDS NOTHING and reads no credential; integration step outputs are empty in preview, so a later {{ steps.<id>.* }} reading one renders empty. Use it to check templates before create_automation / update_automation. Get a sessionId from list_sessions of one of the org projects. saveErrors lists what create/update would still refuse. Requires the org owner or manager role.
preview_qa_sample
ChatGPTHow many finished calls a run of this profile would match right now, how many it would sample, and the estimated credits for judging them (0 when the profile has no enabled llm_rubric check; null when the judge model cannot be priced). Uses the profile's default sampling, with sampling merged over it field by field for this preview only. short: true means fewer calls match than the sample size — for strategy "manual", that some picked sessionIds are not finished voice calls in scope (start_qa_run would refuse them). Only voice calls are counted. Sends nothing, charges nothing. Call before start_qa_run. Requires the org owner or manager role.
remove_agent_variable
ChatGPTRemove a variable from the agent's variableConfigs registry by key. Cascades so no dead reference is left behind: the key is dropped from postSessionVariableKeys AND from every pathway node's data.variableKeys (a node key with no variableConfigs entry is inert — it is never extracted). The response reports the touched nodes in changedNodeIds. No-op (no error) if the key does not exist. IMPORTANT: Do not call multiple agent mutation tools in parallel — they perform read-modify-write and will overwrite each other.
remove_prompt_module
ChatGPTRemove a prompt module from the agent by name. No-op (no error) if the name does not exist. IMPORTANT: Do not call multiple agent mutation tools in parallel — they perform read-modify-write and will overwrite each other.
remove_qa_check
ChatGPTRemove one check from a QA profile. Refused when it would leave the profile with no enabled check. Past runs keep their snapshot. To keep a check but stop running it, use set_qa_check_enabled instead. Requires the org owner or manager role.
run_test_suite
ChatGPTRun all test cases in a test suite. Returns immediately with RUNNING status. Use get_test_results to check progress.
search_memories
ChatGPTSearch memories by semantic similarity
send_message
ChatGPTSend one user message into an interactive conversation and get the agent's reply. Runs a full agent turn (pathway/decision inference, tool calls, knowledge-base retrieval) and returns the reply together with the agent's internal state so you can assert on more than the reply text: - currentNodeId: where the pathway landed after this turn - extractedVariables: variables the agent has accumulated so far - toolEvents: tool calls the agent made this turn and their results - isEnded: whether the agent closed the conversation Each call is billed as one text request. Conversations are capped at 50 user turns.
set_phone_number_inbound_project
ChatGPTBind a phone number's inbound calls to a project's agent, or unbind with projectId null. This changes LIVE call routing (the LiveKit dispatch rule is updated) — the next inbound call to the number reaches the new project's agent. The target project must belong to the SAME organization as the number. WARNING: any existing inbound override config (voice/language overrides, fallback number) is DELETED on every rebind, because it was authored for the previous project — re-apply overrides with update_phone_number_inbound_config afterwards if needed.
set_qa_check_enabled
ChatGPTTurn one check of a QA profile on or off. A disabled check stays in the profile but is not run; at least one check must stay enabled. Requires the org owner or manager role.
start_conversation
ChatGPTOpen an interactive test conversation with the project's agent. Unlike run_test_suite (batch, simulator-driven), this gives YOU the user seat: open a session here, then drive it turn by turn with send_message and inspect the agent's internal state after every reply. Optionally seed dynamic variables — they are injected into the agent's prompt context exactly like a real integration would (e.g. { "customer_name": "王小明", "vip": true }). Sessions behave like the real API channel: agent tools execute for real, webhooks deliver, and every turn is billed as a normal text request against the project's credits. Finish with end_conversation.
start_qa_run
ChatGPTStart a QA run: sample finished voice calls with the profile's default sampling (sampling overrides it for this run only, merged field by field; strategy "manual" with sessionIds evaluates exactly those calls), snapshot the enabled checks and evaluate every sampled call in the background. SPENDS CREDITS when the profile has an enabled llm_rubric check (the judge's actual token cost per call) — run preview_qa_sample first and confirm the estimate with the user. Refused when the estimate exceeds the org's available credits. When fewer calls match than requested the run samples all of them (short: true, see notes). Follow progress with get_qa_run. Requires the org owner or manager role.
suggest_prompt_modules
ChatGPTSuggest the recommended built-in prompt-module presets this agent is MISSING — a "rules you may have missed" check. Returns the catalog's default-enabled presets (fundamental + recommended voice rules) that the agent does NOT already have, matched by name. Use this when reviewing or building an agent to remind the user of common voice rules they haven't added (e.g. role lock, no fabrication, ASR tolerance). It does NOT change anything; copy any returned preset in with add_prompt_module (passing the agent's locale). Pass the agent's locale so preset names line up with the agent's existing modules. Returns [{ id, name, description, content, builtin, group, order, defaultEnabled }] (empty when the agent already has every recommended preset).
unbind_integration_account
ChatGPTStop a project from using an organization integration account. The integration tools that account backed in this project are DELETED with the binding (they could no longer run). The account itself stays in the organization for other projects. Idempotent.
update_agent
ChatGPTUpdate agent configuration for a project. Partial update — only provided fields are changed. VARIABLES — three separate lifecycle concerns. Declaring a variable does NOT by itself cause extraction: 1. variableConfigs — the master registry. Declares that a variable exists (key, type, description). Other fields / pathway nodes reference variables by key from this registry. 2. postSessionVariableKeys — extracted ONCE at session end. Cheap, ideal for final data capture (webhook payload, analytics, CRM sync). This is the default choice for most data-capture use cases. AUTO-SYNC: when this field is NOT explicitly provided and variableConfigs is updated, newly-added keys are auto-added and removed keys are pruned (keys the user previously unselected stay unselected). Pass an explicit array to override (pass [] to disable post-session extraction entirely). 3. pathway node.data.variableKeys — extracted DURING that node's turn. Cost scales per turn per variable; only use when a value must drive routing or mid-conversation dynamic prompts. Set via update_pathway / update_node, not here. Typical recipe: - Most agents: just set variableConfigs. Auto-sync will enable post-session extraction. - Need mid-conversation behavior from a variable: also add its key to the relevant node's variableKeys. - Do NOT want a declared variable extracted post-session: pass postSessionVariableKeys explicitly, omitting that key. Updatable fields: - name: string — Agent display name - globalPrompt: string | null — System prompt shared across all nodes - executionMode: "smart" | "turbo" | "balance" | null — Execution mode - timezone: string | null — e.g. "Asia/Taipei" - memoryEnabled: boolean — Enable agent memory across sessions - variableConfigs: VariableConfig[] | null — [{ key: string, type: "string"|"number"|"email", description: string }] - postSessionVariableKeys: string[] | null — Auto-synced with variableConfigs unless explicitly provided (see above) - beforeStartConfig: { enabled, mode: "template", toolTemplates? } | null Pre-session initialization. Runs ONCE before the conversation starts to fetch data / prepare context (e.g., look up a customer record by phone number, prefetch knowledge-base chunks). Tool side-effects — variables written, context injected — carry into the session. - "toolTemplates" directly invoke tools with LiquidJS-rendered args, no LLM in the loop. NOT the user-facing greeting / opening message. The agent's first utterance is generated by the start node's prompt during the first inference turn (see update_pathway). For voice agents, a literal multi-language opening line can be pinned via voiceConfig.languageRouter.firstMessage — that field has no MCP tool today; set it via the Pathors UI or REST API. - postSessionWebhook: { url, headers? } | null - postEvaluationConfig: { enabled, prompt, resultType: "pass_fail"|"number"|"enum", enumOptions?, numberConfig? } | null - placeholderMessages: { messages: Record<string, string>, defaultLanguage } | null — i18n loading / connection placeholder strings shown to the user while the session warms up. NOT a greeting.
update_agent_variable
ChatGPTUpdate an existing variable in the agent's variableConfigs registry, by key. Errors if the key does not exist — use add_agent_variable to declare a new one. Pass any subset of { type, description, newKey } to change. RENAME: pass newKey — this is the ONLY safe way to change a key. The rename cascades to every reference: each pathway node's data.variableKeys and postSessionVariableKeys are rewritten old→new (touched nodes come back in changedNodeIds, and a key the user had unselected stays unselected). Errors if newKey is already taken by another variable. Do NOT rename via remove + add: the removal strips the key from the nodes, so the re-added key is referenced by nothing and never extracted mid-conversation. IMPORTANT: Do not call multiple agent mutation tools in parallel — they perform read-modify-write and will overwrite each other.
update_conversation_overview
ChatGPTUpdate the project's conversation settings (the "advanced" conversation overview). Partial PATCH — only the fields you pass are changed. Patchable fields: - allowInterruptions: boolean — let the user interrupt the agent mid-utterance - userTalkOverMode: "low" | "normal" | "high" — sensitivity to user talk-over - agentResponseMode: "cautious" | "normal" | "aggressive" — how eagerly the agent responds ("aggressive" is the fastest tier and turns on preemptive LLM/TTS generation: lower latency, higher token/TTS cost) - asrLowConfidenceEnabled: boolean — speak a fallback line on low-confidence ASR - asrLowConfidenceMessages: string[] — the fallback lines (replaces the whole list) - endCallMessageEnabled: boolean — speak a closing line before hangup - endCallMessage: string — the closing line - autoTerminateEnabled: boolean — auto-end the call once it reaches a maximum duration - autoTerminateTimeout: number — maximum call duration in seconds, wall-clock from the greeting, not reset by speech (clamped to a minimum) IMPORTANT: Do not call multiple agent mutation tools in parallel — they perform read-modify-write and will overwrite each other.
update_edge
ChatGPTUpdate an edge (condition, source, or target). IMPORTANT: Do not call multiple pathway mutation tools in parallel — they perform read-modify-write and will overwrite each other.
update_integration_tool
ChatGPTConfigure ONE integration tool for a project (see list_integration_tools for the names). PATCH semantics: only the fields you pass are changed, and other integration tools are never touched. Use it to retune when the agent should call a tool (description), to take a tool away from the agent (enabled: false), or to restrict where transferCall may send a call (config.allowedDestinations). description is the text the LLM reads when deciding to call the tool — pass null to drop the override and fall back to the built-in default. The change applies to live calls immediately. IMPORTANT: call this sequentially, never several in parallel — it performs a read-modify-write and concurrent calls overwrite each other.
update_knowledge_base
ChatGPTUpdate a knowledge base. PATCH semantics — only the fields you pass are changed. searchInstruction is the one that changes agent behaviour: it REPLACES the description of the built-in knowledge-search tool, so it is how you tell the agent WHEN to search and what this knowledge base actually contains (e.g. "Search this for menu items, prices and opening hours"). A vague default is a common reason an agent never searches. Pass null to clear the override and fall back to the built-in description. Chunking settings (chunkSize / chunkOverlap / embedding model) are fixed at creation and cannot be patched.
update_memory
ChatGPTUpdate an existing memory entry
update_node
ChatGPTUpdate a node in the pathway (partial merge). IMPORTANT: Do not call multiple pathway mutation tools in parallel — they perform read-modify-write and will overwrite each other. Merges updates into the existing node. To update node data fields, pass them inside "data": e.g. { data: { prompt: "new prompt" } }. The node id cannot be changed. The merged result is validated against the node schema.
update_pathway
ChatGPTReplace the entire pathway (nodes + edges). IMPORTANT: Do not call multiple pathway mutation tools in parallel — they perform read-modify-write and will overwrite each other. Node types: "start" | "prompt" | "goto" Each node: { id: string, type: "<nodeType>", position: { x, y }, data: NodeData } - start: { type: "start", title, prompt, tools?: string[], variableKeys?: string[] } - prompt: { type: "prompt", title, prompt, tools?: string[], isGlobalNode?: boolean, globalNodeReason?: string, variableKeys?: string[] } - goto: { type: "goto", title, referenceNodeId: string | null } Each edge: { id: string, source: "<nodeId>", target: "<nodeId>", data: { condition: string } } Rules: Pathway MUST have at least one start node. All fields (title, prompt) are required strings.
update_phone_number
ChatGPTUpdate the display metadata of a phone number: displayName and/or label. Both are purely cosmetic — label is a free-form grouping tag (pass null to clear it), displayName is the human-readable name. Nothing behavioral depends on either. At least one field must be provided; when both are given they are applied as two sequential writes (on error, displayName may already be saved — re-read with get_phone_number). To change which project answers the number use set_phone_number_inbound_project; to change per-number overrides use update_phone_number_inbound_config.
update_phone_number_inbound_config
ChatGPTUpdate a phone number's per-number inbound override config. Partial update — only provided fields change. Override flags control whether the number's own settings win over the bound project's agent settings: overrideVoice (voice), overrideLanguage (language + transcribe mode), overrideBackgroundAudio, overrideThinkingSound. voiceProfile is the number-level voice settings object used when the corresponding override flags are enabled (same shape as an agent voiceProfile). fallbackPhoneNumber is where calls forward when no agent can answer. Note: rebinding the inbound project via set_phone_number_inbound_project deletes this config.
update_project
ChatGPTUpdate project name
update_prompt_module
ChatGPTUpdate an existing prompt module in place, by name. This is the way to edit one module without re-sending the whole list. Errors if the name does not exist — use add_prompt_module to create one. Pass any subset of { description, content, enabled } to change. The name itself cannot be renamed (remove + add to rename). Use enabled:true / enabled:false to toggle a module on or off without touching its content. When restructuring content, PREFER consolidating related rules into this module (one module = one coherent topic, up to roughly 2000 tokens) over splitting them into new small modules. IMPORTANT: Do not call multiple agent mutation tools in parallel — they perform read-modify-write and will overwrite each other.
update_qa_profile
ChatGPTUpdate a QA profile's name, description, default sampling or judge model. PATCH semantics: only the fields you pass change, and defaultSampling is merged field by field (filters too) over the stored one. Checks are edited with upsert_qa_check, remove_qa_check and set_qa_check_enabled. Runs already started keep their own snapshot. Requires the org owner or manager role.
update_test_case
ChatGPTPartially update an existing test case. Only provided fields are updated. When acceptanceCriteria is provided, it replaces all existing criteria entirely.
update_test_suite
ChatGPTUpdate an existing test suite. Only provided fields are updated. When testCaseIds is provided, it replaces the entire set of connected test cases.
update_tool
ChatGPTUpdate a tool configuration
update_voice_profile
ChatGPTUpdate the project's voice profile. Partial / multi-level PATCH — only the fields you pass are changed; everything else is preserved. The four nested objects merge field-by-field, so you can change one nested field without re-sending the rest. Example: { greetingConfig: { message: "Hi!" } } sets only the greeting text and leaves greetingConfig.mode (and all other voice settings) untouched. Patchable fields: - language: string — primary language code, one of list_voice_options.languages (e.g. "en", "zh-TW") - additionalLanguages: string[] — THE multilingual mechanism: extra language codes the agent follows the caller into mid-call (STT-driven), on top of the primary. Replaces the whole list; empty = single-language lock (the agent stays in language). Taiwanese ("nan-TW") is single-language only and must stay empty. Writing this field also retires the agent's deprecated voiceIntelligence.languageDetectionEnabled flag — the explicit list becomes the source of truth (get_agent already returns the resolved effective list for legacy agents, so read-modify-write is safe). - transcribeMode: string — STT mode - keywordList: string[] — ASR keyword boosting (replaces the whole list) - voice: { id?, speed? } — TTS voice (a published id from list_voice_options) / speed within speedRange - backgroundAudio: { ambientEnabled?, ambientName? (one of ambientNames), ambientVolume? (0–1), thinkingSoundEnabled?, thinkingSoundIds?, thinkingSoundWeights? } - greetingConfig: { mode?: "generated_text" | "generated_audio", message?: string | null } — the agent's greeting. message:null → LLM generates it. Supported on every engine, including realtime (S2S) agents. IMPORTANT: Do not call multiple agent mutation tools in parallel — they perform read-modify-write and will overwrite each other.
upsert_qa_check
ChatGPTAdd a check to a QA profile, or replace the check with the same id. Omitted fields keep the existing check's values (same id and kind) or the kind's defaults (new check, or a changed kind); config merges field by field. The whole profile is validated before saving (at most 20 checks, 10 llm_rubric). An enabled llm_rubric check makes every run of the profile cost credits. See get_qa_profile → authoring.checkKinds. Requires the org owner or manager role.