eveevent 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/apps/web/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/apps/web/.next/standalone/apps/web/.next/app-build-manifest.json +115 -115
  3. package/apps/web/.next/standalone/apps/web/.next/app-path-routes-manifest.json +36 -36
  4. package/apps/web/.next/standalone/apps/web/.next/build-manifest.json +2 -2
  5. package/apps/web/.next/standalone/apps/web/.next/required-server-files.json +1 -1
  6. package/apps/web/.next/standalone/apps/web/.next/routes-manifest.json +1 -1
  7. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/cron/route_client-reference-manifest.js +1 -1
  9. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/proxy/route_client-reference-manifest.js +1 -1
  10. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/route_client-reference-manifest.js +1 -1
  11. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/serve/[...path]/route_client-reference-manifest.js +1 -1
  12. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/store/route_client-reference-manifest.js +1 -1
  13. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/webhooks/[...path]/route_client-reference-manifest.js +1 -1
  14. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route_client-reference-manifest.js +1 -1
  15. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route.js +1 -1
  16. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
  17. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/runs/route_client-reference-manifest.js +1 -1
  18. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route.js +1 -1
  19. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route_client-reference-manifest.js +1 -1
  20. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route_client-reference-manifest.js +1 -1
  21. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route_client-reference-manifest.js +1 -1
  22. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route_client-reference-manifest.js +1 -1
  23. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route_client-reference-manifest.js +1 -1
  24. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route_client-reference-manifest.js +1 -1
  25. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route_client-reference-manifest.js +1 -1
  26. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js +1 -1
  27. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route_client-reference-manifest.js +1 -1
  28. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/channels/route_client-reference-manifest.js +1 -1
  29. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/route_client-reference-manifest.js +1 -1
  30. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/stream/route_client-reference-manifest.js +1 -1
  31. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/[id]/route_client-reference-manifest.js +1 -1
  32. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/route_client-reference-manifest.js +1 -1
  33. package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route_client-reference-manifest.js +1 -1
  34. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route_client-reference-manifest.js +1 -1
  35. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route_client-reference-manifest.js +1 -1
  36. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route_client-reference-manifest.js +1 -1
  37. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  38. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  39. package/apps/web/.next/standalone/apps/web/.next/server/app/api/terminal/port/route_client-reference-manifest.js +1 -1
  40. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route_client-reference-manifest.js +1 -1
  41. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route_client-reference-manifest.js +1 -1
  42. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route.js +1 -1
  43. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route_client-reference-manifest.js +1 -1
  44. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route_client-reference-manifest.js +1 -1
  45. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route_client-reference-manifest.js +1 -1
  46. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route_client-reference-manifest.js +1 -1
  47. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route_client-reference-manifest.js +1 -1
  48. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route_client-reference-manifest.js +1 -1
  49. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route_client-reference-manifest.js +1 -1
  50. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route_client-reference-manifest.js +1 -1
  51. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route.js +1 -1
  52. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route_client-reference-manifest.js +1 -1
  53. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/execute/route_client-reference-manifest.js +1 -1
  54. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route_client-reference-manifest.js +1 -1
  55. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route.js +1 -1
  56. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route_client-reference-manifest.js +1 -1
  57. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route_client-reference-manifest.js +1 -1
  58. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route_client-reference-manifest.js +1 -1
  59. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route_client-reference-manifest.js +1 -1
  60. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route_client-reference-manifest.js +1 -1
  61. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route_client-reference-manifest.js +1 -1
  62. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route_client-reference-manifest.js +1 -1
  63. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route_client-reference-manifest.js +1 -1
  64. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route.js +1 -1
  65. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route_client-reference-manifest.js +1 -1
  66. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route_client-reference-manifest.js +1 -1
  67. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route_client-reference-manifest.js +1 -1
  68. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route_client-reference-manifest.js +1 -1
  69. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route_client-reference-manifest.js +1 -1
  70. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route_client-reference-manifest.js +1 -1
  71. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route_client-reference-manifest.js +1 -1
  72. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route_client-reference-manifest.js +1 -1
  73. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route_client-reference-manifest.js +1 -1
  74. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route_client-reference-manifest.js +1 -1
  75. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route_client-reference-manifest.js +1 -1
  76. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route.js +1 -1
  77. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route_client-reference-manifest.js +1 -1
  78. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route_client-reference-manifest.js +1 -1
  79. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route_client-reference-manifest.js +1 -1
  80. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route.js +1 -1
  81. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route_client-reference-manifest.js +1 -1
  82. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route_client-reference-manifest.js +1 -1
  83. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route_client-reference-manifest.js +1 -1
  84. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route.js +1 -1
  85. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route_client-reference-manifest.js +1 -1
  86. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route_client-reference-manifest.js +1 -1
  87. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route_client-reference-manifest.js +1 -1
  88. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route_client-reference-manifest.js +1 -1
  89. package/apps/web/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  90. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
  91. package/apps/web/.next/standalone/apps/web/.next/server/app-paths-manifest.json +36 -36
  92. package/apps/web/.next/standalone/apps/web/.next/server/chunks/1857.js +1 -1
  93. package/apps/web/.next/standalone/apps/web/.next/server/functions-config-manifest.json +26 -26
  94. package/apps/web/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  95. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/{layout-68f7838ef97aca89.js → layout-09184a257f8137be.js} +1 -1
  96. package/apps/web/.next/standalone/apps/web/server.js +1 -1
  97. package/apps/web/.next/standalone/package.json +1 -1
  98. package/apps/web/.next/static/chunks/app/{layout-68f7838ef97aca89.js → layout-09184a257f8137be.js} +1 -1
  99. package/dist/entry.js +1 -1
  100. package/dist/{program-B2AhYMgY.js → program-B6IKmbHj.js} +10 -4
  101. package/dist/{run-main-CCyJJYQw.js → run-main-C2VnFUoc.js} +1 -1
  102. package/extensions/posthog-analytics/lib/build-env.js +1 -1
  103. package/package.json +1 -1
  104. package/skills/agent-mail/SKILL.md +88 -9
  105. package/skills/event-orchestration/SKILL.md +2 -2
  106. package/skills/retell-ai/SKILL.md +60 -10
  107. package/skills/retell-ai/templates/venue-booking.json +180 -0
  108. package/skills/retell-ai/templates/venue-discovery.json +201 -0
  109. /package/apps/web/.next/standalone/apps/web/.next/static/{y-ILJJ9XRxtt3WPFeIKB_ → _04kxiwtT97RJ85XJIFWM}/_buildManifest.js +0 -0
  110. /package/apps/web/.next/standalone/apps/web/.next/static/{y-ILJJ9XRxtt3WPFeIKB_ → _04kxiwtT97RJ85XJIFWM}/_ssgManifest.js +0 -0
  111. /package/apps/web/.next/static/{y-ILJJ9XRxtt3WPFeIKB_ → _04kxiwtT97RJ85XJIFWM}/_buildManifest.js +0 -0
  112. /package/apps/web/.next/static/{y-ILJJ9XRxtt3WPFeIKB_ → _04kxiwtT97RJ85XJIFWM}/_ssgManifest.js +0 -0
@@ -2665,12 +2665,18 @@ async function bootstrapCommand(opts, runtime = defaultRuntime) {
2665
2665
  initialValue: readExisting("RETELL_API_KEY") ?? ""
2666
2666
  });
2667
2667
  if (!isCancel(retellKey) && typeof retellKey === "string" && retellKey.trim()) setEnv("RETELL_API_KEY", retellKey.trim());
2668
- const retellAgent = await text({
2669
- message: stylePromptMessage("Retell Agent ID (create agent in dashboard first)"),
2668
+ const retellDiscovery = await text({
2669
+ message: stylePromptMessage("Retell Discovery Agent ID (Eve - Venue Discovery)"),
2670
2670
  placeholder: "skip",
2671
- initialValue: readExisting("RETELL_AGENT_ID") ?? ""
2671
+ initialValue: readExisting("RETELL_DISCOVERY_AGENT_ID") ?? ""
2672
2672
  });
2673
- if (!isCancel(retellAgent) && typeof retellAgent === "string" && retellAgent.trim()) setEnv("RETELL_AGENT_ID", retellAgent.trim());
2673
+ if (!isCancel(retellDiscovery) && typeof retellDiscovery === "string" && retellDiscovery.trim()) setEnv("RETELL_DISCOVERY_AGENT_ID", retellDiscovery.trim());
2674
+ const retellBooking = await text({
2675
+ message: stylePromptMessage("Retell Booking Agent ID (Eve - Venue Booking)"),
2676
+ placeholder: "skip",
2677
+ initialValue: readExisting("RETELL_BOOKING_AGENT_ID") ?? ""
2678
+ });
2679
+ if (!isCancel(retellBooking) && typeof retellBooking === "string" && retellBooking.trim()) setEnv("RETELL_BOOKING_AGENT_ID", retellBooking.trim());
2674
2680
  const retellNumber = await text({
2675
2681
  message: stylePromptMessage("Retell Phone Number (e.g. +14157774444)"),
2676
2682
  placeholder: "skip",
@@ -220,7 +220,7 @@ async function runCli(argv = process$1.argv) {
220
220
  process$1.exitCode = await delegateToGlobalOpenClaw(parseArgv);
221
221
  return;
222
222
  }
223
- const { buildProgram } = await import("./program-B2AhYMgY.js");
223
+ const { buildProgram } = await import("./program-B6IKmbHj.js");
224
224
  await buildProgram().parseAsync(parseArgv);
225
225
  }
226
226
 
@@ -1,3 +1,3 @@
1
1
  export const POSTHOG_KEY = "";
2
- export const DENCHCLAW_VERSION = "0.1.2";
2
+ export const DENCHCLAW_VERSION = "0.1.3";
3
3
  export const OPENCLAW_VERSION = "";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eveevent",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Eve — AI community event agent for DOAC. Venue sourcing, booking, and event management powered by Retell AI, Eventbrite, and AgentMail.",
5
5
  "keywords": ["ai", "events", "community", "agent", "openclaw"],
6
6
  "homepage": "https://github.com/boemare/DenchClaw#readme",
@@ -98,15 +98,94 @@ Returns all messages in the thread. Each message has:
98
98
  - `timestamp` — when sent/received
99
99
  - `attachments` — list of attachment objects
100
100
 
101
- ## Workflow for Venue Emails
102
-
103
- 1. **Send initial email**: Use `messages/send` with venue contact email, subject, and body
104
- 2. **Track thread**: Save the `thread_id` returned
105
- 3. **Check for replies**: Periodically `GET /threads` or use webhooks
106
- 4. **Read reply**: `GET /threads/{thread_id}` — use `extracted_text` for just the new reply
107
- 5. **Reply back**: `POST /messages/{message_id}/reply` to continue the conversation
108
- 6. **Save to workspace**: Store the thread as a JSONL chat session (see event-orchestration skill)
109
- 7. **Log to DuckDB**: Create/update entry in `communications` object
101
+ ## Email Flow 1: Venue Discovery
102
+
103
+ Send this when first reaching out to a venue to check availability and pricing.
104
+
105
+ **Subject:** `Event inquiry {{organization}} {{event_type}}, {{event_date}}`
106
+
107
+ **Body template:**
108
+ ```
109
+ Hi,
110
+
111
+ My name is Eve and I'm reaching out on behalf of {{organization}}. We're planning a {{event_type}} for approximately {{headcount}} guests and are looking at venues in your area.
112
+
113
+ We'd love to know:
114
+ - Are you available on {{event_date}}?
115
+ - What is the pricing for a group of {{headcount}}? (room hire, minimum spend, etc.)
116
+ - Do you offer in-house catering, or can we arrange outside catering?
117
+ - What's included in the hire? (tables, chairs, AV, staff)
118
+ - What deposit is required to secure the booking?
119
+
120
+ If {{event_date}} doesn't work, we're flexible on nearby dates.
121
+
122
+ Would love to hear from you. Happy to jump on a quick call if that's easier.
123
+
124
+ Best,
125
+ Eve
126
+ {{organization}}
127
+ ```
128
+
129
+ ## Email Flow 2: Venue Booking Confirmation
130
+
131
+ Send this after the team approves a venue and you want to lock the reservation.
132
+
133
+ **Subject:** `Booking confirmation — {{organization}} {{event_type}}, {{event_date}}`
134
+
135
+ **Body template:**
136
+ ```
137
+ Hi {{contact_name}},
138
+
139
+ Thank you for the information from our earlier conversation. We'd like to go ahead and confirm the booking.
140
+
141
+ Here are the details:
142
+ - Date: {{event_date}}
143
+ - Guests: {{headcount}}
144
+ - Setup time: {{setup_time}}
145
+ - Event: {{event_start}} — {{event_end}}
146
+ - Agreed price: {{agreed_price}}
147
+
148
+ Could you please:
149
+ 1. Send a deposit invoice to this email address
150
+ 2. Confirm the booking reference / confirmation number
151
+ 3. Share any forms or paperwork we need to complete before the event
152
+ 4. Let us know the cancellation policy and day-of contact person
153
+
154
+ If anything needs a signature, please send it over and we'll return it promptly.
155
+
156
+ Looking forward to the event!
157
+
158
+ Best,
159
+ Eve
160
+ {{organization}}
161
+ ```
162
+
163
+ ## Email Flow 3: Follow-up
164
+
165
+ Send if a venue hasn't replied within 48 hours of discovery or booking email.
166
+
167
+ **Subject:** `Re: [original subject]` (use reply endpoint to keep thread)
168
+
169
+ **Body template:**
170
+ ```
171
+ Hi,
172
+
173
+ Just following up on my earlier email about the {{event_type}} on {{event_date}} for {{headcount}} guests. Would love to hear if your venue might be a good fit.
174
+
175
+ Happy to jump on a quick call if that's easier — just let me know a good time.
176
+
177
+ Best,
178
+ Eve
179
+ ```
180
+
181
+ ## General Workflow
182
+
183
+ 1. **Discovery**: Send discovery email with venue contact. Save `thread_id`.
184
+ 2. **Wait for reply**: Check threads periodically or via heartbeat.
185
+ 3. **Read reply**: Use `extracted_text` to get just the new content.
186
+ 4. **Booking**: Once team approves, reply in the same thread with booking confirmation email.
187
+ 5. **Follow-up**: If no reply in 48h, send follow-up in the same thread.
188
+ 6. **Log everything**: Save thread as JSONL chat session + log to `communications` DuckDB object.
110
189
 
111
190
  ## Gotchas
112
191
 
@@ -88,8 +88,8 @@ Use the following installed skills for each subtask. Always spawn subagents via
88
88
 
89
89
  1. **Parse & Record** — Extract event params, create DuckDB entry, set Status = "Planning"
90
90
  2. **Venue Research** — Spawn browser subagent to find venue options in the target city. Look for capacity, pricing, availability, and reviews.
91
- 3. **Venue Outreach** — Contact top venue candidates via email and/or phone to check availability and get quotes. Present top 3 options to the human with costs and trade-offs. **HUMAN GATE: Wait for venue approval before confirming any booking.**
92
- 4. **Book Venue** — Once approved, confirm the booking via email or phone. Update DuckDB: Venue Status = "Confirmed", Location = confirmed venue.
91
+ 3. **Venue Discovery Calls** — For top venue candidates, use the **Discovery Agent** (`RETELL_DISCOVERY_AGENT_ID`) to call and check availability, pricing, capacity, catering, deposits, and logistics. Pass dynamic variables: `venue_name`, `event_date`, `headcount`, `event_type`, `organization`, `budget`. Also send discovery emails via AgentMail. Present top 3 options to the team with costs and trade-offs.
92
+ 4. **Book Venue** — Once the team approves a venue, use the **Booking Agent** (`RETELL_BOOKING_AGENT_ID`) to call and confirm the reservation. Pass dynamic variables: `venue_name`, `event_date`, `headcount`, `agreed_price`, `setup_time`, `event_start`, `event_end`, `email` (Eve's AgentMail), `cancellation_policy`, `contact_name`. Update DuckDB: Venue Status = "Confirmed", Location = confirmed venue.
93
93
  5. **Create Eventbrite Event** — Spawn eventbrite subagent to create the event page with venue details, date, capacity, and description. Update DuckDB with Eventbrite URL. Eventbrite handles all fan-facing invitations, waitlist, and reminders from here.
94
94
  6. **RSVP Tracking** — Periodically check RSVPs via eventbrite. Update RSVP Count in DuckDB. Report status to team when asked.
95
95
  7. **Day-of Coordination** — Update Status = "Day-of". Confirm final details with venue via email/phone if needed.
@@ -12,17 +12,28 @@ Make AI-powered phone calls with automatic transcription, recording, and analyti
12
12
 
13
13
  Before Eve can make calls, a human must:
14
14
  1. Sign up at https://www.retellai.com and get an API key
15
- 2. Create a **Voice Agent** in the Retell dashboard with a prompt like: "You are Eve, calling on behalf of DOAC to coordinate event venues. Be professional, friendly, and concise."
15
+ 2. Import **two agent templates** from the `skills/retell-ai/templates/` folder:
16
+ - `venue-discovery.json` — "Eve - Venue Discovery" agent for checking availability, pricing, and venue details
17
+ - `venue-booking.json` — "Eve - Venue Booking" agent for confirming and locking reservations
16
18
  3. Buy a **phone number** ($2/month for testing) in the dashboard under Telephony → Phone Numbers
17
- 4. Bind the agent to the number for outbound calls
19
+ 4. Bind both agents to the number for outbound calls
18
20
 
19
- After setup, Eve needs: `RETELL_API_KEY`, `RETELL_AGENT_ID`, `RETELL_FROM_NUMBER`
21
+ After setup, Eve needs: `RETELL_API_KEY`, `RETELL_DISCOVERY_AGENT_ID`, `RETELL_BOOKING_AGENT_ID`, `RETELL_FROM_NUMBER`
22
+
23
+ ## Two Call Flows
24
+
25
+ ### Discovery Call (Agent: Eve - Venue Discovery)
26
+ Used for initial outreach. Gathers: availability, capacity, pricing, what's included, catering options, deposit, setup times, accessibility, parking, cancellation policy. Keeps call under 5 minutes.
27
+
28
+ ### Booking Call (Agent: Eve - Venue Booking)
29
+ Used after team approves a venue. Confirms: date, price, deposit/invoice, timing, booking reference, next steps, day-of contact. Does NOT agree to price changes or date changes without team approval. Keeps call under 4 minutes.
20
30
 
21
31
  ## Environment Variables
22
32
 
23
33
  ```bash
24
34
  export RETELL_API_KEY="your_retell_api_key"
25
- export RETELL_AGENT_ID="agent_abc123"
35
+ export RETELL_DISCOVERY_AGENT_ID="agent_discovery_123"
36
+ export RETELL_BOOKING_AGENT_ID="agent_booking_456"
26
37
  export RETELL_FROM_NUMBER="+14157774444"
27
38
  ```
28
39
 
@@ -32,7 +43,37 @@ Free tier: $10 credits (~60-90 minutes of calls). No monthly commitment.
32
43
 
33
44
  All requests: `https://api.retellai.com/v2` with `Authorization: Bearer $RETELL_API_KEY`
34
45
 
35
- ## Make a Call
46
+ ## Make a Discovery Call
47
+
48
+ Use the discovery agent to check venue availability, pricing, and details.
49
+
50
+ ```bash
51
+ curl -X POST "https://api.retellai.com/v2/create-phone-call" \
52
+ -H "Authorization: Bearer $RETELL_API_KEY" \
53
+ -H "Content-Type: application/json" \
54
+ -d '{
55
+ "from_number": "'$RETELL_FROM_NUMBER'",
56
+ "to_number": "+1VENUE_PHONE_E164",
57
+ "override_agent_id": "'$RETELL_DISCOVERY_AGENT_ID'",
58
+ "retell_llm_dynamic_variables": {
59
+ "venue_name": "The Venue NYC",
60
+ "event_date": "Friday March 28",
61
+ "headcount": "30 people",
62
+ "event_type": "community dinner",
63
+ "organization": "DOAC",
64
+ "budget": "$2,000"
65
+ },
66
+ "metadata": {
67
+ "call_type": "discovery",
68
+ "venue": "The Venue NYC",
69
+ "event": "NYC Dinner"
70
+ }
71
+ }'
72
+ ```
73
+
74
+ ## Make a Booking Call
75
+
76
+ Use the booking agent AFTER team approval to lock the reservation.
36
77
 
37
78
  ```bash
38
79
  curl -X POST "https://api.retellai.com/v2/create-phone-call" \
@@ -41,14 +82,23 @@ curl -X POST "https://api.retellai.com/v2/create-phone-call" \
41
82
  -d '{
42
83
  "from_number": "'$RETELL_FROM_NUMBER'",
43
84
  "to_number": "+1VENUE_PHONE_E164",
44
- "override_agent_id": "'$RETELL_AGENT_ID'",
85
+ "override_agent_id": "'$RETELL_BOOKING_AGENT_ID'",
45
86
  "retell_llm_dynamic_variables": {
46
87
  "venue_name": "The Venue NYC",
47
- "event_name": "DOAC NYC Dinner",
48
- "purpose": "Check availability for Friday March 28, party of 30, budget $2000",
49
- "special_requests": "Private dining room preferred"
88
+ "event_date": "Friday March 28",
89
+ "headcount": "30",
90
+ "event_type": "community dinner",
91
+ "organization": "DOAC",
92
+ "agreed_price": "$1,800",
93
+ "setup_time": "5:00 PM",
94
+ "event_start": "7:00 PM",
95
+ "event_end": "11:00 PM",
96
+ "email": "eve@agentmail.to",
97
+ "cancellation_policy": "Full refund up to 7 days before",
98
+ "contact_name": "Sarah"
50
99
  },
51
100
  "metadata": {
101
+ "call_type": "booking",
52
102
  "venue": "The Venue NYC",
53
103
  "event": "NYC Dinner"
54
104
  }
@@ -59,7 +109,7 @@ curl -X POST "https://api.retellai.com/v2/create-phone-call" \
59
109
 
60
110
  Response includes `call_id` — use to retrieve transcript after the call ends.
61
111
 
62
- The `retell_llm_dynamic_variables` are injected into the agent's prompt so it knows what to say. Use them to pass venue name, event details, and the purpose of the call.
112
+ The `retell_llm_dynamic_variables` are injected into the agent's prompt so it knows the context. Always pass all relevant variables from the event and venue records.
63
113
 
64
114
  ## Get Call (Transcript + Recording + Analysis)
65
115
 
@@ -0,0 +1,180 @@
1
+ {
2
+ "agent_id": "",
3
+ "channel": "voice",
4
+ "last_modification_timestamp": 0,
5
+ "agent_name": "Eve - Venue Booking",
6
+ "response_engine": {
7
+ "type": "conversation-flow",
8
+ "version": 0,
9
+ "conversation_flow_id": ""
10
+ },
11
+ "language": "en-US",
12
+ "data_storage_setting": "everything",
13
+ "version": 0,
14
+ "is_published": false,
15
+ "voice_id": "retell-Cimo",
16
+ "max_call_duration_ms": 300000,
17
+ "interruption_sensitivity": 0.7,
18
+ "user_dtmf_options": {},
19
+ "conversationFlow": {
20
+ "conversation_flow_id": "",
21
+ "version": 0,
22
+ "global_prompt": "## Task Overview ##\n\nYou are Eve, a professional event coordinator calling back to confirm a venue booking. The team has approved this venue and you are ready to proceed. Be confident, decisive, and clear.\n\n## Response Guideline ##\n\nYou are here to BOOK, not to browse. Be decisive. If anything has changed (price, availability), do NOT commit — say you'll check with the team. Never provide payment card details on the phone — always route to email invoice. Keep the call under 4 minutes.",
23
+ "nodes": [
24
+ {
25
+ "instruction": {
26
+ "type": "static_text",
27
+ "text": "Hi, this is Eve calling back about the {{event_type}} on {{event_date}}. Great news — we'd love to go ahead and book with you!"
28
+ },
29
+ "name": "Greeting",
30
+ "edges": [
31
+ {
32
+ "condition": "Venue responds",
33
+ "id": "edge-greeting-1",
34
+ "transition_condition": {
35
+ "type": "prompt",
36
+ "prompt": "Venue responds"
37
+ },
38
+ "destination_node_id": "node-confirm-date"
39
+ }
40
+ ],
41
+ "start_speaker": "agent",
42
+ "id": "start-node-1",
43
+ "type": "conversation",
44
+ "display_position": { "x": 500, "y": 500 }
45
+ },
46
+ {
47
+ "name": "Confirm Date & Price",
48
+ "edges": [
49
+ {
50
+ "condition": "Date and price confirmed as agreed",
51
+ "id": "edge-confirm-1",
52
+ "transition_condition": {
53
+ "type": "prompt",
54
+ "prompt": "Date and price confirmed as agreed"
55
+ },
56
+ "destination_node_id": "node-deposit"
57
+ },
58
+ {
59
+ "condition": "Price or date has changed",
60
+ "id": "edge-confirm-2",
61
+ "transition_condition": {
62
+ "type": "prompt",
63
+ "prompt": "Price or date has changed"
64
+ },
65
+ "destination_node_id": "node-changed"
66
+ }
67
+ ],
68
+ "id": "node-confirm-date",
69
+ "type": "conversation",
70
+ "display_position": { "x": 1000, "y": 500 },
71
+ "instruction": {
72
+ "type": "prompt",
73
+ "text": "Confirm the booking: I'd like to confirm {{event_date}} for {{headcount}} guests. Just to confirm, the total is {{agreed_price}} as we discussed?"
74
+ }
75
+ },
76
+ {
77
+ "name": "Deposit & Payment",
78
+ "edges": [
79
+ {
80
+ "condition": "Deposit and payment info obtained",
81
+ "id": "edge-deposit-1",
82
+ "transition_condition": {
83
+ "type": "prompt",
84
+ "prompt": "Deposit and payment info obtained"
85
+ },
86
+ "destination_node_id": "node-timing"
87
+ }
88
+ ],
89
+ "id": "node-deposit",
90
+ "type": "conversation",
91
+ "display_position": { "x": 1500, "y": 500 },
92
+ "instruction": {
93
+ "type": "prompt",
94
+ "text": "Ask: What do you need to secure the booking? Can you send a deposit invoice to {{email}}? If they ask for card details, say: We prefer to handle payment via invoice — please send it to {{email}} and we'll process it promptly."
95
+ }
96
+ },
97
+ {
98
+ "name": "Confirm Timing",
99
+ "edges": [
100
+ {
101
+ "condition": "Timing confirmed",
102
+ "id": "edge-timing-1",
103
+ "transition_condition": {
104
+ "type": "prompt",
105
+ "prompt": "Timing confirmed"
106
+ },
107
+ "destination_node_id": "node-final"
108
+ }
109
+ ],
110
+ "id": "node-timing",
111
+ "type": "conversation",
112
+ "display_position": { "x": 2000, "y": 500 },
113
+ "instruction": {
114
+ "type": "prompt",
115
+ "text": "Confirm: We'd like to arrive at {{setup_time}} for setup. The event runs {{event_start}} to {{event_end}}. Does that still work? Also ask: Can I get a booking reference or confirmation number? And: Who should we contact on the day if we need anything?"
116
+ }
117
+ },
118
+ {
119
+ "name": "Final Wrap Up",
120
+ "edges": [
121
+ {
122
+ "condition": "Ready to end call",
123
+ "id": "edge-final-1",
124
+ "transition_condition": {
125
+ "type": "prompt",
126
+ "prompt": "Ready to end call"
127
+ },
128
+ "destination_node_id": "node-end"
129
+ }
130
+ ],
131
+ "id": "node-final",
132
+ "type": "conversation",
133
+ "display_position": { "x": 2500, "y": 500 },
134
+ "instruction": {
135
+ "type": "prompt",
136
+ "text": "Ask: What do you need from us before the event? Any forms or paperwork? Please send everything to {{email}}. Confirm: And the cancellation policy is {{cancellation_policy}}, correct? Then end warmly: Thank you so much. We're really looking forward to it. You'll hear from us if we need anything else."
137
+ }
138
+ },
139
+ {
140
+ "name": "Terms Changed",
141
+ "edges": [
142
+ {
143
+ "condition": "Conversation ending",
144
+ "id": "edge-changed-1",
145
+ "transition_condition": {
146
+ "type": "prompt",
147
+ "prompt": "Conversation ending"
148
+ },
149
+ "destination_node_id": "node-end"
150
+ }
151
+ ],
152
+ "id": "node-changed",
153
+ "type": "conversation",
154
+ "display_position": { "x": 1500, "y": 800 },
155
+ "instruction": {
156
+ "type": "prompt",
157
+ "text": "Say: I appreciate you letting me know about the change. Let me check with the team on that and I'll get back to you. What's the best way to reach you — email or phone? Thank them and end the call politely."
158
+ }
159
+ },
160
+ {
161
+ "name": "End Call",
162
+ "id": "node-end",
163
+ "type": "end",
164
+ "display_position": { "x": 3000, "y": 500 },
165
+ "instruction": { "type": "prompt", "text": "" }
166
+ }
167
+ ],
168
+ "start_node_id": "start-node-1",
169
+ "start_speaker": "agent",
170
+ "tools": [],
171
+ "model_choice": {
172
+ "type": "cascading",
173
+ "model": "gpt-4.1"
174
+ },
175
+ "knowledge_base_ids": [],
176
+ "mcps": [],
177
+ "begin_tag_display_position": { "x": 100, "y": 600 },
178
+ "is_published": false
179
+ }
180
+ }
@@ -0,0 +1,201 @@
1
+ {
2
+ "agent_id": "",
3
+ "channel": "voice",
4
+ "last_modification_timestamp": 0,
5
+ "agent_name": "Eve - Venue Discovery",
6
+ "response_engine": {
7
+ "type": "conversation-flow",
8
+ "version": 0,
9
+ "conversation_flow_id": ""
10
+ },
11
+ "language": "en-US",
12
+ "data_storage_setting": "everything",
13
+ "version": 0,
14
+ "is_published": false,
15
+ "voice_id": "retell-Cimo",
16
+ "max_call_duration_ms": 360000,
17
+ "interruption_sensitivity": 0.7,
18
+ "user_dtmf_options": {},
19
+ "conversationFlow": {
20
+ "conversation_flow_id": "",
21
+ "version": 0,
22
+ "global_prompt": "## Task Overview ##\n\nYou are Eve, a professional event coordinator calling on behalf of a community organization. You're reaching out to venues to check availability and gather details for an upcoming event.\n\n## Response Guideline ##\n\nBe warm, professional, and efficient. Ask questions naturally — do NOT read a checklist. Keep the call under 5 minutes.",
23
+ "nodes": [
24
+ {
25
+ "instruction": {
26
+ "type": "static_text",
27
+ "text": "Hi, my name is Eve. I'm calling on behalf of {{organization}}. We're planning a {{event_type}} and I was wondering if I could ask a few quick questions about your venue?"
28
+ },
29
+ "name": "Greeting",
30
+ "edges": [
31
+ {
32
+ "condition": "Venue responds",
33
+ "id": "edge-greeting-1",
34
+ "transition_condition": {
35
+ "type": "prompt",
36
+ "prompt": "Venue responds"
37
+ },
38
+ "destination_node_id": "node-availability"
39
+ }
40
+ ],
41
+ "start_speaker": "agent",
42
+ "id": "start-node-1",
43
+ "type": "conversation",
44
+ "display_position": { "x": 500, "y": 500 }
45
+ },
46
+ {
47
+ "name": "Check Availability",
48
+ "edges": [
49
+ {
50
+ "condition": "Venue confirms availability or suggests alternative dates",
51
+ "id": "edge-avail-1",
52
+ "transition_condition": {
53
+ "type": "prompt",
54
+ "prompt": "Venue confirms availability or suggests alternative dates"
55
+ },
56
+ "destination_node_id": "node-pricing"
57
+ },
58
+ {
59
+ "condition": "Venue is not available and has no alternatives",
60
+ "id": "edge-avail-2",
61
+ "transition_condition": {
62
+ "type": "prompt",
63
+ "prompt": "Venue is not available and has no alternatives"
64
+ },
65
+ "destination_node_id": "node-no-avail"
66
+ }
67
+ ],
68
+ "id": "node-availability",
69
+ "type": "conversation",
70
+ "display_position": { "x": 1000, "y": 500 },
71
+ "instruction": {
72
+ "type": "prompt",
73
+ "text": "Ask if they are available on {{event_date}} for {{headcount}} guests. If not, ask what nearby dates would work."
74
+ }
75
+ },
76
+ {
77
+ "name": "Pricing & Details",
78
+ "edges": [
79
+ {
80
+ "condition": "Got pricing and inclusion details",
81
+ "id": "edge-pricing-1",
82
+ "transition_condition": {
83
+ "type": "prompt",
84
+ "prompt": "Got pricing and inclusion details"
85
+ },
86
+ "destination_node_id": "node-catering"
87
+ }
88
+ ],
89
+ "id": "node-pricing",
90
+ "type": "conversation",
91
+ "display_position": { "x": 1500, "y": 500 },
92
+ "instruction": {
93
+ "type": "prompt",
94
+ "text": "Ask about pricing. What's the total cost or room hire fee? Is there a minimum spend? What's included — tables, chairs, AV equipment, staff? If they ask about our budget, say: We're working with around {{budget}} for the venue."
95
+ }
96
+ },
97
+ {
98
+ "name": "Catering & Deposit",
99
+ "edges": [
100
+ {
101
+ "condition": "Got catering and deposit info",
102
+ "id": "edge-catering-1",
103
+ "transition_condition": {
104
+ "type": "prompt",
105
+ "prompt": "Got catering and deposit info"
106
+ },
107
+ "destination_node_id": "node-logistics"
108
+ }
109
+ ],
110
+ "id": "node-catering",
111
+ "type": "conversation",
112
+ "display_position": { "x": 2000, "y": 500 },
113
+ "instruction": {
114
+ "type": "prompt",
115
+ "text": "Ask about catering — do they provide in-house catering or can we bring outside catering? Is there a catering minimum? Also ask about the deposit — how much is required and when is it due?"
116
+ }
117
+ },
118
+ {
119
+ "name": "Logistics",
120
+ "edges": [
121
+ {
122
+ "condition": "Got logistics info",
123
+ "id": "edge-logistics-1",
124
+ "transition_condition": {
125
+ "type": "prompt",
126
+ "prompt": "Got logistics info"
127
+ },
128
+ "destination_node_id": "node-wrap-up"
129
+ }
130
+ ],
131
+ "id": "node-logistics",
132
+ "type": "conversation",
133
+ "display_position": { "x": 2500, "y": 500 },
134
+ "instruction": {
135
+ "type": "prompt",
136
+ "text": "Naturally ask about a few more details: Is it a private room or shared space? What are the setup and teardown times? Any noise restrictions or curfews? Is the venue wheelchair accessible? Is there parking nearby? What's the cancellation policy? Don't ask all of these — pick 2-3 that flow naturally in conversation."
137
+ }
138
+ },
139
+ {
140
+ "name": "Wrap Up",
141
+ "edges": [
142
+ {
143
+ "condition": "Got contact info and ready to end",
144
+ "id": "edge-wrap-1",
145
+ "transition_condition": {
146
+ "type": "prompt",
147
+ "prompt": "Got contact info and ready to end"
148
+ },
149
+ "destination_node_id": "node-end"
150
+ }
151
+ ],
152
+ "id": "node-wrap-up",
153
+ "type": "conversation",
154
+ "display_position": { "x": 3000, "y": 500 },
155
+ "instruction": {
156
+ "type": "prompt",
157
+ "text": "Say: Great, I'll share this with the team and we'll get back to you. What's the best way to follow up — email or phone? Get their contact name and email address. Then say: Thank you so much for your time. We'll be in touch soon."
158
+ }
159
+ },
160
+ {
161
+ "name": "No Availability",
162
+ "edges": [
163
+ {
164
+ "condition": "Conversation ending",
165
+ "id": "edge-no-avail-1",
166
+ "transition_condition": {
167
+ "type": "prompt",
168
+ "prompt": "Conversation ending"
169
+ },
170
+ "destination_node_id": "node-end"
171
+ }
172
+ ],
173
+ "id": "node-no-avail",
174
+ "type": "conversation",
175
+ "display_position": { "x": 1500, "y": 800 },
176
+ "instruction": {
177
+ "type": "prompt",
178
+ "text": "Politely ask: Do you happen to know any similar venues nearby that might work for a group of {{headcount}}? Thank them for their time regardless."
179
+ }
180
+ },
181
+ {
182
+ "name": "End Call",
183
+ "id": "node-end",
184
+ "type": "end",
185
+ "display_position": { "x": 3500, "y": 500 },
186
+ "instruction": { "type": "prompt", "text": "" }
187
+ }
188
+ ],
189
+ "start_node_id": "start-node-1",
190
+ "start_speaker": "agent",
191
+ "tools": [],
192
+ "model_choice": {
193
+ "type": "cascading",
194
+ "model": "gpt-4.1"
195
+ },
196
+ "knowledge_base_ids": [],
197
+ "mcps": [],
198
+ "begin_tag_display_position": { "x": 100, "y": 600 },
199
+ "is_published": false
200
+ }
201
+ }