https://retellai.com/?utm_source=discord&utm_medium=seo logo
does the conversational bot has GHL functions and ...
# ❓・ai-evy-support
g
@AI Evy does the conversational bot has GHL functions and compatibility?
a
Thanks for tagging me @GigoDA. I'll look through relevant sources and get back to you shortly.
​ To learn more, see the sources I considered: [[1] GHL + Make + Retell](https://community.retellai.com/t/ghl-make-retell/806) ​
### Answer GHL (GoHighLevel) integration isn't handled through built-in "functions" inside the conversation flow agent itself — it works by connecting Retell to GHL through Make.com as a middle layer [(1) ]() . A forum example describes a working architecture: GHL sends a webhook to Make, Make pulls calendar availability from GHL, then Make starts the Retell outbound call (via
/v1/calls
) with the availability data injected as variables so the agent can reference it during the conversation . After the call, Retell sends back booking confirmation data to a Make webhook, which then creates the appointment in GHL . One important detail from that source: if GHL triggers the Retell call directly (instead of Make triggering it after fetching availability) , the call starts before the data exists in context, causing the agent to guess dates instead of using real availability . The fix documented is to always have the system that fetches the GHL data (Make) be the one that starts the Retell call, injecting the data as variables at call creation . So compatibility exists, but it's achieved via Make as the integration layer between GHL and Retell, not a native GHL function inside the conversation flow builder .
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy but the regular bot has all native GHL functions?
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer Yes. Once a GoHighLevel sub-account is connected, Retell agents get a set of native GHL tools that appear directly in the agent's function menu — no Make.com middle layer is required for these [(1) ]() [(2) ]() . These tools include: Search Contact, Get Contact, Update Contact, Create Contact, Add Contact Tags, List Contact Opportunities, Get Opportunity, Create Opportunity, Update Opportunity, List Contact Tasks, Create Task, Create Note, List Contact Appointments, Check Availability, Book Appointment, Get Appointment, Reschedule Appointment, and Cancel Appointment [(1) ]() . These tools can run during a conversation or before/after it as pre-call/post-call functions, and no contact sync is required for them to work [(1) ]() [(2) ]() . A few behavior notes: - Chaining tools (e.g., List Contact Appointments → Reschedule Appointment or Cancel Appointment) lets the agent act on a specific appointment by mapping its ID to a dynamic variable [(1) ]() . - Each tool only works if the connected Private Integration token holds the required scope (e.g.,
calendars.readonly
for Check Availability,
calendars/events.write
for Book/Reschedule/Cancel Appointment) . - Availability checks are capped at 31 days per request . So compared to the Make.com-based setup discussed earlier, the native GHL functions are built into the agent directly once the GoHighLevel connection is made [(1) ]() [(2) ]() .
​ To learn more, see the sources I considered: [[1] GoHighLevel agent functions](https://docs.retellai.com/integrations/gohighlevel-functions) [[2] Integrations overview](https://docs.retellai.com/integrations/overview) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy so why cann't i use same functions on conversetional bot?
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer The GHL tools are usable on Conversation Flow agents too — they're not exclusive to prompt-based agents. The GoHighLevel functions documentation itself states that once a sub-account is connected, these tools appear in the agent's function menu and can be added to either type of setup [(1) ]() . In fact, for Conversation Flow specifically, you call these tools from a Function Node, which executes a tool deterministically on entry, or a Subagent Node, where the LLM decides when to invoke a tool based on conversation context [(2) ]() [(1) ]() . So if you're not seeing them available, it's likely a configuration issue (e.g., the sub-account isn't connected yet) rather than a platform limitation — the same native GHL tools (Search Contact, Book Appointment, Reschedule Appointment, etc.) are meant to be added into a Function Node or Subagent Node in your flow, same as they'd be added to a prompt agent's function menu .
​ To learn more, see the sources I considered: [[1] GoHighLevel agent functions](https://docs.retellai.com/integrations/gohighlevel-functions) [[2] Nodes and edges](https://docs.retellai.com/build/conversation-flow/node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
g
@AI Evy We run an inbound voice agent on a conversation flow with the native GoHighLevel integration. We want to use post-call Workflows so that after every call, including hang-ups, Retell searches GoHighLevel for a contact by the caller's number, creates one only if none exists, and adds a tag. Five questions. First, what does a post-call Workflow cost: is it charged per run, per function, or included in the call price? Second, which GoHighLevel actions are available as Workflow functions: search contact, create contact, update contact including custom fields, add tags, create note? Do they reuse the agent's existing GoHighLevel connection? Third, can a function be gated on the result of an earlier function, for example run create only if the search returned no contact? Fourth, are the post-call analysis fields filled in before the post-call functions run, so we can use them to pick tags and write a note? Fifth, is the call recording URL available as a variable in post-call functions?
a
### Answer I don't have pricing details for post-call Workflow functions in the sources — I can't confirm whether it's charged per run, per function, or included in the call price. On which GoHighLevel actions are available: the sources list GoHighLevel integration tools as Search Contact, Get Contact, Update Contact, Create Contact, Add Contact Tags, List Contact Opportunities, Get Opportunity, Create Opportunity, Update Opportunity, List Contact Tasks, Create Task, Create Note, List Contact Appointments, Check Availability, Book Appointment, Get Appointment, Reschedule Appointment, and Cancel Appointment [(1) ]() . So Search Contact, Create Contact, Add Contact Tags, and Create Note are all available; the sources don't specifically break out "Update Contact including custom fields" as a distinct capability beyond the general Update Contact tool. These GHL "Integration tools" are added from the same + menu used for pre-call and post-call functions on the Workflow page, alongside Custom function, Code, and SMS options [(2) ]() . Since they come from a "connected provider," they reuse the workspace's existing connection rather than requiring a separate one — an integration is connected once on the dashboard's Integrations page and "every agent in your workspace can use its tools before, during, and after a conversation" [(1) ]() . On gating: yes. Post-call functions can carry an "only when" gate using a Variables condition that compares a
{{variable}}
against a value with operators including exists or not exists [(2) ]() . Since a function's output can be mapped to a dynamic variable, you could map the search result to a variable and gate the create-contact function on that v
ariable not existing — though I don't see this exact search/create pairing example in the sources, so I can't confirm the specific variable name behavior for a "not found" result from Search Contact. On post-call analysis timing: yes. "Post-call and post-chat functions run after Post Call Extraction," so they can read its results — including
{{call_summary}}
,
{{call_successful}}
,
{{user_sentiment}}
,
{{disconnection_reason}}
,
{{call_status}}
, and one variable per custom Post Call Extraction field [(2) ]() [(3) ]() . The docs state these "are available to post-conversation functions only; nothing earlier can read them, because the analysis hasn't run yet" [(2) ]() . On the recording URL: the sources don't mention a recording URL variable available to post-call functions. I can't confirm this one either. Check out these potentially useful sources: [Agent workflow]() , [Integrations overview]() , [Dynamic variables: personalize Retell agent calls]() Want a general answer based on my broader knowledge for the pricing and recording-URL questions instead?
​ To learn more, see the sources I considered: [[1] Integrations overview](https://docs.retellai.com/integrations/overview) [[2] Agent workflow](https://docs.retellai.com/agent/agent-workflow) [[3] Dynamic variables: personalize Retell agent calls](https://docs.retellai.com/build/dynamic-variables) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 1. The handbook configuration toggles — is the text they add injected into the global prompt, or into each node's prompt? And specifically, does the "Conversational Personality" preset reword sentences that the builder has specified exactly? We have several sentences that must be spoken word for word (a fixed-price disclaimer and a policy line) and we need to know whether that preset will rewrite them.
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer I don't have information about "handbook configuration toggles" or a "Conversational Personality" preset in the available sources. None of the provided documentation discusses these specific features, how they inject text into prompts, or whether they reword exact sentences. What the sources do confirm about prompt structure: the global prompt is used for an agent's overall personality, tone, and universal rules, while conversation flow nodes handle step-by-step logic, questions, and transitions [(1) ]() . Prompt engineering in general shapes tone, behavioral boundaries, and error handling through the instructions given to the model, but the sources don't detail a specific "Conversational Personality" preset or a "handbook configuration" toggle [(2) ]() . For your specific concern about word-for-word disclaimers: the sources don't address whether any preset rewords fixed text. I can't confirm this one way or the other from what's available. Check out these potentially useful sources: [Global Node]() , [Prompt Engineering]() , [Create Conversation Flow]() Want a general answer based on my broader knowledge for how to handle exact-wording requirements instead?
​ To learn more, see the sources I considered: [[1] CONVERSATION FLOW AGENT - GLOBAL PROMPT](https://discord.com/channels/1186424376300679209/1371534043157500025) [[2] Prompt Engineering](https://www.retellai.com/glossary/prompt-engineering) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
g
@AI Evy Then the path tests, in text, no audio. Ask me first with a cost estimate. Mock the booking tool so nothing lands on the real calendar.
a
r prompt describing the caller's identity, goal, and personality - Set success criteria as checkable outcomes (e.g. confirm the booking tool was called with the correct time) - Add a Custom Function Mock for the Book Appointment tool with a canned result - Pick the simulated user's LLM, save, then run it as a batch (even a single case runs as a batch of one) Since I can't confirm cost, do you want a general (non-documented) estimate based on typical LLM message pricing, or should we proceed with the mock setup as-is?
### Answer What you're describing maps to Simulation Testing — a text-based conversation where an AI plays the caller and grades the run against your success criteria, no audio involved [(1) ]() . On mocking the booking tool: Custom Function Mocks intercept a function call during the test and return a set result instead of calling the real function, so it doesn't reach live systems . Mocks are honored for "custom functions, code tools, integration tools, the built-in Cal.com tools, call transfers, and SMS" — so your Book Appointment tool (a Cal.com integration tool [(2) ]() ) qualifies. On the Custom Function Mocks tab, you'd click
+ Add
, pick the function from the dropdown, and enter the mock result it should return [(1) ]() . One caveat from the best practices: "Mock functions that reach production before you run. An unmocked custom function, code tool, calendar tool, or MCP tool calls its real endpoint, so a test can create a real booking or record" — confirming this is exactly why you'd mock it. On cost estimate: I don't have pricing information for simulation test runs in the sources — I can't confirm a per-run or per-message cost estimate. Simulation testing does note that the simulated user's LLM "bills per message," and your agent's own model billing applies separately , but no dollar figures are given. I can't build the actual test case (test cases require a specific tool ID from your Cal.com Book Appointment setup, which I don't have) , but here's the structure once you have your event type ID [(2) ]() : - Name the test case (e.g.
book-appointment-text-only
) [(1) ]() - Write a use
​ To learn more, see the sources I considered: [[1] Automatically test your agent](https://docs.retellai.com/test/llm-simulation-testing) [[2] Cal.com agent functions](https://docs.retellai.com/integrations/cal-com-functions) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy Then the pipeline tests with a preset caller number, so we can see her create a contact for a number she has never seen without using my phone.
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer I don't have information in the sources about testing a pipeline with a "preset caller number" for simulation testing, or about simulating an inbound call from a specific number to trigger Search Contact/Create Contact behavior. The sources describe Simulation Testing as a text-based conversation where an AI plays the caller, with Custom Function Mocks intercepting calls like the booking tool [(1) ]() [(2) ]() [(3) ]() , but they don't mention setting a caller phone number for a simulated test, nor do they specify how Search Contact would be triggered with a chosen number in that context. Since the goal is to see a Create Contact run for a number not already in GoHighLevel, note that Search Contact and Create Contact are separate tools chained together [(1) ]() — you'd need Search Contact to return no match, then Create Contact to run. The docs confirm post-call/pre-call functions can be gated with an "only when" condition using exists/not exists on a
{{variable}}
[(4) ]() , and I described that gating logic earlier. But nothing in the sources addresses assigning a specific test caller number for a simulation run, so I can't confirm whether that's possible or how it would be configured. Check out these potentially useful sources: [Agent workflow]() , [GoHighLevel agent functions]() , [Integration tools in conversation flow]() Want a general answer based on my broader knowledge fo
r how simulation caller numbers might work instead?
​ To learn more, see the sources I considered: [[1] GoHighLevel agent functions](https://docs.retellai.com/integrations/gohighlevel-functions) [[2] Integration tools in conversation flow](https://docs.retellai.com/build/conversation-flow/integration-tools) [[3] Integration tools](https://docs.retellai.com/build/single-multi-prompt/integration-tools) [[4] Agent workflow](https://docs.retellai.com/agent/agent-workflow) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 2. Does "Echo verification" override an explicit instruction in the prompt not to read digits back? We deliberately never read a phone number back digit by digit, and we need to know whether that toggle will force it.
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer Echo Verification is described as: "The agent repeats back names, phone numbers, and other critical details for confirmation. For uncommon names, it spells them out letter by letter." [(1) ]() The sources don't specify how this preset behaves when it conflicts with an explicit custom prompt instruction telling the agent not to read digits back. The FAQ on this preset only states that "handbook presets work alongside your custom prompt" and that if your prompt overlaps with a preset (e.g., you wrote your own guidelines on a similar topic) , "you may want to disable the overlapping preset to avoid inconsistent behavior" — but this doesn't confirm whether the preset would override your instruction, or whether disabling it is strictly required for your instruction to take precedence. Given your requirement to never read phone numbers back digit by digit, the documented guidance points to disabling Echo Verification for your agent, since it's off by default anyway , rather than relying on the custom prompt to suppress a conflicting preset behavior. I can't confirm the underlying precedence logic between presets and custom prompts beyond this general FAQ note. Want a general answer based on my broader knowledge on how prompt vs. preset conflicts typically resolve?
​ To learn more, see the sources I considered: [[1] Agent Handbook](https://docs.retellai.com/build/agent-handbook) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 3. What does "Smart matching" actually do with a proper name? Our caller said "Eyal" and the transcript recorded "L", and the agent used "L" for the whole call and wrote it to the CRM. Would smart matching have helped there, or does it only apply to matching against a known list of expected values?
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer I don't have information about a "Smart matching" feature in the available sources. None of the provided documentation describes a feature by that name, how it handles proper names, or whether it applies only to matching against a known list of expected values. What the sources do cover for your "Eyal" → "L" transcription issue is the Boosted Keywords feature, which is meant to fix cases where specific words or domain-specific terms are missing or mistranscribed by adding custom keywords to enhance the model's vocabulary, supporting up to 100 custom keywords [(1) ]() . Adding "Eyal" as a boosted keyword would be the documented lever for improving recognition of that specific name, though the sources don't confirm this guarantees correct transcription every time . The sources also note that transcription errors can occur when a sentence is cut off, with transcription mode optimized for accuracy as a possible fix, and that denoising mode settings can be adjusted for background noise issues . Neither of these specifically addresses proper-name substitution behavior like "Eyal" becoming "L". I can't confirm whether "Smart matching" exists as a distinct toggle, or how it would interact with your CRM write-back of the mis-transcribed name. Check out these potentially useful sources: [Increase transcription accuracy]() , [Automatic Speech Recognition (ASR) ]() , [CRM data mappings]() Want a general answer based on my broader knowledge on how a "smart matching" style feature might work instead?
​ To learn more, see the sources I considered: [[1] Increase transcription accuracy](https://docs.retellai.com/reliability/wrong-transcript) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 4. Is stt_mode: accurate worth using for capturing first names and street addresses, and roughly how much latency does it add over fast? Ours is on the default fast mode and we are losing names and addresses.
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer The "optimize for accuracy" mode is the documented lever for your case. Retell's transcriber waits longer with more context before finalizing the transcript, which produces more accurate results, but adds roughly 200ms of latency compared to "optimize for speed" [(1) ]() . On whether it's worth it for names and addresses specifically: benchmarking shows the two modes have similar overall Word Error Rate (WER) ; the difference "mainly lies in capturing entities like numbers and dates." The guidance is to use "optimize for accuracy" if your use case "relies heavily on capturing entities like phone numbers, account numbers, or dates correctly," and to use "optimize for speed" for the best latency "in all other cases" . I don't see first names or street addresses explicitly listed among the entity types called out in that benchmarking note (only phone numbers, account numbers, and dates are named) . Since your issue is names and addresses being dropped, the closer documented fix is Boosted Keywords — adding custom keywords (up to 100) to enhance the model's vocabulary for words the model is missing, which is the solution given specifically for "wrong transcript for special words or terms" like names [(2) ]() . I can't confirm from the sources exactly how much added accuracy accuracy mode would give for names/addresses specifically (since that entity benchmarking only names numbers/dates) , so I can't tell you definitively whether the ~200ms tradeoff is "worth it" for your exact case [(1) ]() . Given your requirements, a combination — boosted keywords for the recurring names/street terms plus testing accuracy mode — is what the sources point toward, but the sources don't confirm a combined recommendation
explicitly. Want a general (non-documented) opinion on whether the 200ms tradeoff is worth it for your specific first-name/address use case?
​ To learn more, see the sources I considered: [[1] Balance between transcription accuracy and latency](https://docs.retellai.com/build/transcription-mode) [[2] Increase transcription accuracy](https://docs.retellai.com/reliability/wrong-transcript) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 5. For a caller dialling internationally on a high-latency route, where the agent and the caller repeatedly talk over each other, what do you recommend for interruption_sensitivity, responsiveness, enable_dynamic_responsiveness, and endpointing_ms under a custom STT config? Is there a recommended starting set for high-latency callers?
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer I don't have documentation covering recommended settings for high-latency international calling scenarios. The available sources only show
interruption_sensitivity
,
responsiveness
,
enable_dynamic_responsiveness
, and
custom_stt_config.endpointing_ms
as configurable parameters in API request schemas, without guidance on tuning values for high-latency routes or talk-over issues [(1) ]() [(2) ]() . For example, the parameters appear in request bodies like this:
Copy code
json
"responsiveness": 1,
"interruption_sensitivity": 1,
[(1) ]() , [(2) ]()
Copy code
json
"custom_stt_config": {
  "endpointing_ms": 123
},
"enable_dynamic_responsiveness": true,
[(1) ]() , [(2) ]() These show the fields exist and their expected types, but nothing in the sources discusses a recommended starting configuration for high-latency callers or how to reduce talk-over in that scenario. Check out these potentially useful sources: [Create Batch Call]() , [Create Web Call]() Want a general (non-documented) recommendation based on my broader knowledge for tuning these settings on high-latency international calls instead?
​ To learn more, see the sources I considered: [[1] Create Batch Call](https://docs.retellai.com/api-references/create-batch-call) [[2] Create Web Call](https://docs.retellai.com/api-references/create-web-call) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 6. In a conversation flow node, when none of the labelled edges match and the node has no else edge, what does the engine do? We saw an agent speak the same node's opening sentence three times in one call on a node with labelled edges and no else edge, and we want to confirm whether a node with no matching edge re-runs itself.
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer When no edge condition matches and the node has no else edge, the agent stays in the current node and keeps the conversation going [(1) ]() . This is the last step in the evaluation order: after checking the always edge, equation conditions, prompt conditions, and else edge (if present) , if nothing matched, the agent remains in the current node . This matches the FAQ directly addressing this scenario: "if a global node's condition matches, the agent transitions there. Otherwise, if the node has an else edge, the agent moves through it. If neither, the agent stays in the current node and responds from its instruction" . So for your case — a node with labelled edges but no else edge, where none matched — the engine's documented behavior is to stay on that node and respond again from its instruction, rather than transitioning anywhere. That's consistent with what you observed: the agent re-triggering the same node's opening line multiple times, since each time no edge matched, it stayed and responded again from the same instruction .
​ To learn more, see the sources I considered: [[1] Transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 7. Does a node's else edge always fire after exactly one caller turn? We have nodes whose job needs two turns — ask the room size, then state a price — and what we observed was the node exiting after the first turn without ever doing the second part. Is there a supported way to hold a node until its work is finished, or is splitting it into one node per turn the intended pattern?
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer Conversation nodes support multi-turn dialogue within a single node — the docs state a conversation node "can hold a multi-turn conversation within a single node, so you don't need a new node for every line," with transitions "evaluated after each user response" [(1) ]() . That means the else edge isn't tied to firing after exactly one turn — it fires whenever the evaluation runs and no other condition (always, equation, prompt) matches [(2) ]() . If your node exits after the first turn without asking about price, the edge conditions on that node (or a competing prompt condition) are matching too early, not because the node structurally caps out at one turn. For your case — ask room size, then state a price — the node should be able to hold across both turns as long as no edge's condition evaluates true until the price line has been delivered. Evaluation order is: always edge first, then equation conditions, then prompt conditions together with any global node entry conditions, then the else edge, and only if nothing matches does the agent stay in the node . So check whether a prompt condition is matching on the room-size answer alone (e.g., a condition worded broadly enough to trigger after just that reply) — that would explain an early exit. There's no separate "hold node open for N turns" setting described in the sources; the mechanism is entirely condition-based. If the two-turn logic is hard to get reliable with one node's conditions, the FAQ on breaking down nodes suggests splitting when "the node handles multiple complex logic paths" or "the LLM struggles with consistency (hallucinations or incorrect responses) " — noting "breaking complex nodes into smaller, focused nodes often improves reliability" [(1) ](
tellai.com/build/conversation-flow/node) . So splitting into one node per turn (ask room size → transition → state price) is a documented pattern for exactly this kind of reliability issue, though the sources don't say it's strictly required if you can tighten the conditions on a single node instead.
​ To learn more, see the sources I considered: [[1] Nodes and edges](https://docs.retellai.com/build/conversation-flow/node) [[2] Transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 8. When an extract_dynamic_variables node captures a boolean, is the value stored as the string "true" / "false"? We want to branch on it with an equation edge comparing to true and need to know the exact comparison value.
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer Yes. All extracted values are stored as strings, matching how dynamic variables work everywhere else in Retell — a
Number
is stored as
"42"
and a
Boolean
as
"true"
[(1) ]() . This same conversion is confirmed in the dynamic variables documentation: numbers, booleans, or other data types are not supported directly, so a boolean is stored as
"true"
[(2) ]() . For your equation edge, since equation conditions can only reference dynamic variables and every value is a string [(3) ]() , your comparison needs to check against the string
"true"
, not a native boolean. This matches the exists-style equation pattern documented for conversation flow:
Copy code
- {{name}} exists
For a direct equality check, the same equation syntax style applies to comparing a variable to a literal value, as shown here:
Copy code
- {{user_location}} == "New York"
So your equation would compare
{{your_boolean_variable}}
to the string
"true"
rather than an unquoted boolean literal, consistent with the extract dynamic variables documentation stating "a
Boolean
is stored as `\"true\"`" and that in code contexts you'd need to cast it, e.g.
dv.is_member === "true"
[(2) ]() .
​ To learn more, see the sources I considered: [[1] Extract Dynamic Variables](https://docs.retellai.com/build/single-multi-prompt/extract-dv) [[2] Dynamic variables: personalize Retell agent calls](https://docs.retellai.com/build/dynamic-variables) [[3] Transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 9. Is the Colloquial Model (announced in the 19 June 2026 changelog) still available, and where is it in the current settings? There is no documentation page for it anywhere.
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer I don't have any information in the sources about a "Colloquial Model" or a changelog entry from June 19, 2026. The available sources cover global settings configuration (voice, language, LLM selection, speech settings) [(1) ]() , a blog post on Conversation Flow [(2) ]() , and other unrelated topics [(3) ]() [(4) ]() [(5) ]() , but none mention a model by that name or any such changelog announcement. I can't confirm whether it exists, where it would appear in settings, or its current availability. Check out these potentially useful sources: [Configure global settings]() , [Retell AI's Advanced Conversation Flow]() Want a general answer based on my broader knowledge instead?
​ To learn more, see the sources I considered: [[1] Configure global settings](https://docs.retellai.com/build/conversation-flow/global-setting) [[2] Retell AI’s Advanced Conversation Flow | Retell AI](https://www.retellai.com/blog/unlocking-complex-interactions-with-retell-ais-conversation-flow) [[3] How Much Should You Spend on AI Voice Agents? | Retell AI](https://www.retellai.com/blog/how-much-should-you-spend-on-an-ai-voice-agent) [[4] Discord message from @sanava.ai on 2025-04-16](https://discord.com/channels/1186424376300679209/1186462578310910112/1362157973790523564) [[5] llm_websocket_url update not working](https://discord.com/channels/1186424376300679209/1306674894318076005) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy 10. Your model list now includes gpt-5 through gpt-5.6, three Claude Sonnets and seven Gemini Flash models. Is gpt-4.1 still your recommended default for a conversation-flow receptionist with ten tools, or has that guidance moved?
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer I don't have documentation stating a specific "recommended default" model for a conversation-flow receptionist agent with ten tools. The sources confirm gpt-5.6-terra is the default model if none is set [(1) ]() [(2) ]() , and the available model options include the gpt-4.1 family, gpt-5 family (through gpt-5.6) , Claude Sonnets, and Gemini Flash models . I also don't have any information confirming gpt-4.1 was ever documented as a specifically "recommended" default guidance for receptionist-style or tool-heavy agents — the sources only list it as one of the available model options, not as a recommendation tied to a use case . I can't confirm whether any such recommendation "moved," since I have no record of that guidance existing in the sources to begin with. Check out these potentially useful sources: [Update Retell LLM]() , [Create Retell LLM]() Want a general (non-documented) opinion on model choice for a ten-tool receptionist agent instead?
​ To learn more, see the sources I considered: [[1] Update Retell LLM](https://docs.retellai.com/api-references/update-retell-llm) [[2] Create Retell LLM](https://docs.retellai.com/api-references/create-retell-llm) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
g
@AI Evy Post-call functions are firing all at once instead of waiting for the one they depend on. Agent: agent_bb4670f5669d525276da610e7e (version 1) Call: call_59d0518bd51b6b4f9643c6efc1a My five post-call functions: 1 postcall_search_contact (GHL Search Contact) response_variables: ghl_contact_id = id 2 postcall_create_contact (GHL Create Contact) response_variables: new_contact_id = id 3 postcall_tag_new contact_id = constant {{new_contact_id}} 4 postcall_tag_called contact_id = constant {{ghl_contact_id}} 5 postcall_note_new contact_id = constant {{new_contact_id}} On that call all four were invoked within 12 milliseconds: search 0.014s create 0.019s tag_new 0.022s note_new 0.026s And the results came back: tag_new 0.032s FAILED "Skipped: contact_id is required" note_new 0.032s FAILED "Skipped: contact_id is required" create 0.148s FAILED HTTP 400, duplicate contact search 1.028s SUCCESS, returned the existing contact id So 3 and 5, which consume {{new_contact_id}}, ran a full second before 2, which produces it. Nothing waited for anything. Question: your Retell Workflows announcement says post-call functions are "a dependency graph, not a straight-line script: functions with no dependency on each other start at once, and a function that depends on another waits for that one's output." How is that dependency actually determined? Does putting {{new_contact_id}} inside a constant parameter value register a dependency on the function whose response_variables declares it? If not, how do I declare it explicitly?
a
Thanks for the follow-up, @GigoDA. I'll get back to you soon.
### Answer Dependency in the workflow graph is not inferred from where a
{{variable}}
appears in a value field — it's set explicitly by how you chain the functions on the canvas. The docs describe two distinct actions: "**Add sequential function** makes the new function depend on every function in the row's card, so it starts only once they've all succeeded. That's what lets it use their output," versus "**Add parallel function** starts the new function at the same point as the row you clicked, and anything that was waiting on that row now waits for both." [(1) ]() Referencing
{{new_contact_id}}
inside a constant parameter value does not by itself register a dependency on
postcall_create_contact
. The docs are explicit that "Variables become available as the graph runs, so a function only ever sees output from functions that finished before it. The dashboard enforces the same rule as you type: when you pick a variable, it offers only the outputs of the functions this one waits on, not the ones running beside it or after it." That last clause is the key: if
postcall_tag_new
and
postcall_note_new
were added as independent/parallel functions rather than as sequential children of
postcall_create_contact
, they start immediately with the rest of the no-dependency batch, and any
{{new_contact_id}}
reference in them would simply resolve to nothing (or be skipped) since the value hasn't been produced yet — which matches the "Skipped: contact_id is required" failures you saw. The docs also confirm what happens when a referenced variable has no value yet: "If a
{{variable}}
in an input has no value — the function it came from didn't run, or returned nothing for that field — the input is left out. If that input was required, the function is skipped rather than sent with a gap in it." That's exactly your `tag_new`/`
note_new` failure mode. To fix it, you need to explicitly chain each consumer under its producer using Add sequential function on the producing function's row: -
postcall_search_contact
→ sequential →
postcall_tag_called
(consumes
{{ghl_contact_id}}
) -
postcall_create_contact
→ sequential →
postcall_tag_new
and
postcall_note_new
(both consume
{{new_contact_id}}
) This also matches the worked example in the docs, where
list_tickets
is "added as a sequential function under
find_user
," explicitly depending on it to use its output. Separately, the discord thread on this exact question confirms dynamic variables can be referenced across functions in JSON/constant fields once the dependency exists: "Yes you can use dynamic variables inside the JSON." [(2) ]() But that only addresses whether referencing is supported syntactically — it doesn't say referencing alone creates the dependency; the chaining action is what the primary documentation ties dependency to. [(1) ]()
​ To learn more, see the sources I considered: [[1] Agent workflow](https://docs.retellai.com/agent/agent-workflow) [[2] Response Variables - Part of Future Function Calls in JSON?](https://discord.com/channels/1186424376300679209/1396550506347761686) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.