@talqing/mcp 0.3.0 → 0.3.2
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.
- package/SKILL.md +200 -65
- package/package.json +1 -1
- package/tools.json +244 -20
package/SKILL.md
CHANGED
|
@@ -161,6 +161,35 @@ An agent is a single object, `config`, plus what you attach to it:
|
|
|
161
161
|
not this list. As with `tools`, an entry may instead carry `{"mcp": {name,
|
|
162
162
|
url, headers, allowed_tools, tools_namespace}}`, which is created as a
|
|
163
163
|
`custom_mcp` integration and replaced by its id.
|
|
164
|
+
- **`tasks`** — jobs this agent can enter and come back from, each
|
|
165
|
+
`{"name": "collect_shipping_address", "task_id": "...", "description": "...",
|
|
166
|
+
"message": "..."}`. Each becomes one ordinary tool the model can call: the
|
|
167
|
+
task takes over the conversation, speaks with THIS agent's voice and ears,
|
|
168
|
+
and hands its typed `output` back as the tool's result. Use one for a bounded
|
|
169
|
+
job inside a longer call — taking an address, qualifying a lead — and a
|
|
170
|
+
`handoffs` entry when the caller should belong to someone else from then on.
|
|
171
|
+
|
|
172
|
+
`name` is yours, not the task's, so renaming the task never changes the tool
|
|
173
|
+
name a published prompt was written against. The task must be **published**;
|
|
174
|
+
publishing the agent pins the version. An entry may instead carry `{"task":
|
|
175
|
+
{...whole TaskConfig...}}`, which on the agent endpoints is created and
|
|
176
|
+
published as a real task, exactly as an inline tool is.
|
|
177
|
+
|
|
178
|
+
**The task's `vars` are this tool's schema, minus every variable the call can
|
|
179
|
+
answer for itself** — every name the CALLING AGENT declares, plus every name
|
|
180
|
+
the session was started with. Those are filled in automatically and never
|
|
181
|
+
shown to the model, a declared-but-blank one included. So a task declaring
|
|
182
|
+
`customer_id` on an agent declaring `customer_id` shows the model nothing to
|
|
183
|
+
invent. Anything left over becomes a model argument, which is why a task
|
|
184
|
+
should declare only what the caller or the model must supply: a value already
|
|
185
|
+
in `{{userdata.*}}` belongs in the task's prompt, not in its `vars`.
|
|
186
|
+
Publishing warns on the bad shape.
|
|
187
|
+
|
|
188
|
+
A task inherits the call's whole media stack, so one task fits every agent and
|
|
189
|
+
every channel. It cannot contain a `handoff` (publish refuses it), the calling
|
|
190
|
+
agent's own tools are NOT available while it holds the floor, and
|
|
191
|
+
`timeout_seconds` on the task is the only bound on how long it may hold the
|
|
192
|
+
caller.
|
|
164
193
|
- **`handoffs`** — where this agent may pass the conversation next, each
|
|
165
194
|
`{"name": "Billing", "agent_id": "...", "description": "...", "context":
|
|
166
195
|
"transcript" | "summary" | "none", "recent_turns": 2, "summary_prompt": "...",
|
|
@@ -520,8 +549,13 @@ A tool is one capability the agent's LLM can call mid-conversation. It has:
|
|
|
520
549
|
to get it out of the conversation, and a bare `{"type": "string"}` is how a
|
|
521
550
|
tool ends up called with the wrong value. Mark the ones the tool cannot run
|
|
522
551
|
without as `required`, and use an `enum` wherever the set of values is closed.
|
|
523
|
-
- **`long_running_task`** — voice and video agents keep talking while it runs
|
|
524
|
-
|
|
552
|
+
- **`long_running_task`** — voice and video agents keep talking while it runs and
|
|
553
|
+
share the result when it lands; a run finishing within a second answers inline
|
|
554
|
+
instead. Text agents wait either way. There is no fixed line — steer it from
|
|
555
|
+
the description, phrased conditionally ("if it is still running, say you are on
|
|
556
|
+
it; if the result is already there, give it"), because an unconditional "say
|
|
557
|
+
you have started it" makes the agent announce work it has already finished.
|
|
558
|
+
Cannot be `silent`, or contain a `transfer` or `handoff`.
|
|
525
559
|
- **`silent`** — no immediate reply after it runs. You rarely need to set it: a
|
|
526
560
|
tool in which no operation can return a response (see below) is silent
|
|
527
561
|
automatically, and so is any run that reaches `end_call`.
|
|
@@ -550,7 +584,8 @@ LLM — use it for noisy intermediate steps.
|
|
|
550
584
|
|
|
551
585
|
**Silence is derived, not defaulted.** If no operation in the tree can return a
|
|
552
586
|
response, the tool is silent whatever `silent` says — including operations inside
|
|
553
|
-
`if` branches
|
|
587
|
+
`if` branches, and including any `background_execution` one, which has no
|
|
588
|
+
response to hide. So a tool that is just `say "Your appointment is confirmed"` says
|
|
554
589
|
that once, rather than saying it and then improvising a second sentence on top.
|
|
555
590
|
If the agent should add a closing line, add a `generate_reply` operation that
|
|
556
591
|
states what to add; do not try to turn the derived silence off.
|
|
@@ -796,17 +831,23 @@ Each hook points at a **published tool id**, or null.
|
|
|
796
831
|
|
|
797
832
|
## Agent tasks
|
|
798
833
|
|
|
799
|
-
An **agent task**
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
834
|
+
An **agent task** takes named inputs, does some work, and returns a **typed
|
|
835
|
+
structured output**. Same prompt, same model, same tools, same MCP servers, same
|
|
836
|
+
knowledge and same lifecycle hooks as an agent — minus everything that belongs
|
|
837
|
+
to a *session*, because a task never owns one.
|
|
838
|
+
|
|
839
|
+
**It runs two ways, and declares nothing that ties it to either.** On its own —
|
|
840
|
+
`POST /v1/tasks/{task_id}/runs`, or an email batch drafting a row — it is an LLM
|
|
841
|
+
with tools and nobody to talk to. Attached to an agent through
|
|
842
|
+
`AgentConfig.tasks`, it takes over that conversation for as long as the job
|
|
843
|
+
takes, on the call's own voice and ears, and hands its result back as a tool
|
|
844
|
+
result.
|
|
804
845
|
|
|
805
846
|
It is its own noun with its own operations (`list_tasks`, `create_task`,
|
|
806
847
|
`get_task`, `update_task`, `delete_task`, `run_task`, `list_task_runs`) — not a
|
|
807
848
|
fourth agent channel. Use one wherever the work has an input and an answer
|
|
808
849
|
rather than a conversation: research a company from a domain, classify a
|
|
809
|
-
message, draft an opening line,
|
|
850
|
+
message, draft an opening line, take a shipping address mid-call.
|
|
810
851
|
|
|
811
852
|
`config` is:
|
|
812
853
|
|
|
@@ -817,15 +858,22 @@ message, draft an opening line, pull a field out of a document.
|
|
|
817
858
|
**not** read `{{system_vars.human_phone_number}}` / `.agent_phone_number` /
|
|
818
859
|
`.direction` — there is no call.
|
|
819
860
|
- **`llm`** — one model, with the same `fallback`, `reasoning_effort`,
|
|
820
|
-
`priority` and `builtin_tools` an agent's LLM has.
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
861
|
+
`priority` and `builtin_tools` an agent's LLM has. A provider tool runs inside
|
|
862
|
+
a step rather than as one, so it costs no steps and real seconds. It is the
|
|
863
|
+
one media slot a task keeps, because an LLM is stateless per request and
|
|
864
|
+
swapping one in rebuilds nothing.
|
|
865
|
+
- **`kb_ids`**, **`on_enter`**, **`on_exit`**, **`on_user_turn_completed`** —
|
|
866
|
+
exactly an agent's. `on_user_turn_completed` only ever fires when an agent
|
|
867
|
+
entered the task; a standalone run has nobody to take a turn.
|
|
868
|
+
- There is no `stt`, `tts`, `realtime`, `language`, `turn_handling`, `channel`,
|
|
869
|
+
`greeting`, `avatar`, `recording`, `analysis`, `conversation` or `handoffs`.
|
|
870
|
+
A task runs on the media of the session that entered it, or on no media at
|
|
871
|
+
all — which is what lets one task serve a voice agent and an email batch.
|
|
872
|
+
`handoffs` is refused with a reason: a task hands control back to whoever
|
|
873
|
+
entered it, so handing the conversation on would strand that return.
|
|
824
874
|
- **`tools`** / **`mcps`** — exactly an agent's, attached by id or defined
|
|
825
|
-
inline
|
|
826
|
-
|
|
827
|
-
defensible for a bounded job and would not be for a live call, which is why
|
|
828
|
-
agents pin and tasks do not.
|
|
875
|
+
inline, and pinned by publish exactly as an agent's are: republishing a tool
|
|
876
|
+
does not change a published task until that task is published again.
|
|
829
877
|
- **`vars`** — the task's **inputs**, declared exactly as an agent's variables
|
|
830
878
|
are: a `name`, a `description`, an optional `default` and `required`. A run
|
|
831
879
|
supplies values by name; one it omits falls back to the `default`, and a
|
|
@@ -833,35 +881,66 @@ message, draft an opening line, pull a field out of a document.
|
|
|
833
881
|
that failure costs nothing. A value for a name the task does not declare is
|
|
834
882
|
refused too, rather than silently dropped — which is the one difference from an
|
|
835
883
|
agent, whose key space is open.
|
|
884
|
+
|
|
885
|
+
**They are also the schema of the tool an agent enters the task with**, minus
|
|
886
|
+
every name that agent declares and every name the session was started with. So
|
|
887
|
+
declare a variable only for what the caller or the model must supply: anything
|
|
888
|
+
the task can read for itself — `{{userdata.order_id}}`, `{{vars.region}}`,
|
|
889
|
+
`{{system_vars.date}}` — belongs in the prompt. Declare it instead and the
|
|
890
|
+
model is asked to invent it, and it will.
|
|
836
891
|
- **`output`** — a flat list of the fields the model must produce, each with a
|
|
837
892
|
`name`, a `type` (`string`, `boolean`, `integer` or `number`) and a
|
|
838
|
-
`description`. At
|
|
839
|
-
task that wants to return five
|
|
840
|
-
them.
|
|
893
|
+
`description`. At most 25, and at least one **to publish** — a draft may have
|
|
894
|
+
none. No arrays and no nested objects: a task that wants to return five
|
|
895
|
+
talking points returns one string containing them.
|
|
841
896
|
- **`max_steps`** (default 25, max 50) — how many LLM → tools → LLM **rounds**
|
|
842
|
-
|
|
843
|
-
step. This is the runaway-loop guard.
|
|
844
|
-
|
|
897
|
+
a STANDALONE run may take. A round, not a tool call: four tools in one reply
|
|
898
|
+
cost one step. This is the runaway-loop guard. Entered by an agent the task
|
|
899
|
+
runs on the calling session's budget instead — three rounds per reply on
|
|
900
|
+
voice and video, twenty-five on text, refreshed on every user turn.
|
|
901
|
+
- **`timeout_seconds`** (default 300, max 600) — the real time budget, and the
|
|
902
|
+
one setting that applies both ways. Entered by an agent it is the only bound
|
|
903
|
+
on how long the task may hold the caller: keep it short on a voice agent.
|
|
845
904
|
|
|
846
905
|
A name may not appear in both `vars` and `output`: a run's inputs and its output
|
|
847
906
|
are read side by side, so a collision would make one of the two unreachable.
|
|
848
907
|
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
908
|
+
### Draft, publish, versions
|
|
909
|
+
|
|
910
|
+
**A task has the same lifecycle an agent has**, and the same four functions.
|
|
911
|
+
`create_task` and `update_task` write the **draft**, checked only for what a
|
|
912
|
+
half-written task can be judged on — so a task saves before it has a model key,
|
|
913
|
+
a prompt or an output field, and the person can keep building. `publish_task`
|
|
914
|
+
freezes that draft as an immutable version, pins every attached tool to the
|
|
915
|
+
version live at that moment, and makes it what runs. `get_task_version` reads a
|
|
916
|
+
frozen one back and `rollback_task_version` puts one back into production,
|
|
917
|
+
replacing the draft.
|
|
918
|
+
|
|
919
|
+
`validate_task` is the publish-grade check without the publish: a workspace API
|
|
920
|
+
key for the model, at least one `output` field, the attached tools' operation
|
|
921
|
+
trees, and the email batches already drafting with this task. Run it before
|
|
922
|
+
`publish_task` — its `errors` are what a publish would refuse with, and its
|
|
923
|
+
`warnings` (a prompt reading a variable nothing declares, a task with no prompt)
|
|
924
|
+
are worth reporting but never block.
|
|
925
|
+
|
|
926
|
+
**Build order:** create the draft → write the prompt, `vars` and `output` →
|
|
927
|
+
`run_task` with `version: "draft"` to try it → fix → `validate_task` →
|
|
928
|
+
`publish_task` **when the person asks you to**. Publishing is their call, not
|
|
929
|
+
yours: it changes what every run and every live email batch does.
|
|
857
930
|
|
|
858
931
|
### The output tool
|
|
859
932
|
|
|
860
933
|
The model does not "return" the output. At compile time the task gains one
|
|
861
934
|
generated tool, **`submit_result`**, whose arguments are exactly the `output`
|
|
862
|
-
fields
|
|
863
|
-
|
|
864
|
-
|
|
935
|
+
fields. Never declare a tool of that name yourself.
|
|
936
|
+
|
|
937
|
+
**Nothing is appended to a task's prompt.** `submit_result_description` is the
|
|
938
|
+
whole of what the model is told about how a run ends, so it has to say that
|
|
939
|
+
calling the tool IS the ending — a written answer produces nothing — and that a
|
|
940
|
+
value the model could not determine goes in as `null`. It is required and
|
|
941
|
+
non-empty, but a new task only carries the one-line stub
|
|
942
|
+
`"Submit the result and finish."`: **replace it.** A task whose finishing is
|
|
943
|
+
described by that stub is a task relying on the model to guess.
|
|
865
944
|
|
|
866
945
|
Every output field is **required and nullable** in that tool. The model must say
|
|
867
946
|
something about every field, including "I could not find it" — an optional field
|
|
@@ -870,12 +949,26 @@ generated yet" then look identical to whoever reads the row. Say so in each
|
|
|
870
949
|
field's `description`: that description is the only instruction the model gets
|
|
871
950
|
about what belongs there.
|
|
872
951
|
|
|
952
|
+
A task an agent enters also gets **`finish_without_result`**, which abandons the
|
|
953
|
+
job and fails the calling agent's tool call.
|
|
954
|
+
`finish_without_result_description` — required and non-empty too, and starting as
|
|
955
|
+
the stub `"Give up and finish without a result."` — is the only thing saying when
|
|
956
|
+
that is allowed: **a task that gives up on work it should have finished is fixed
|
|
957
|
+
there, not in the prompt.** Narrow it to the caller actually changing their mind;
|
|
958
|
+
"I could not work out a value" is a `null`, not a reason to abandon. Publishing
|
|
959
|
+
refuses either description blank.
|
|
960
|
+
|
|
873
961
|
### Reading a run
|
|
874
962
|
|
|
875
963
|
`run_task` **executes for real**: the tools call the tenant's endpoints with
|
|
876
964
|
their secrets, the MCP servers spend their credits, and the model spends their
|
|
877
965
|
tokens. A task that books, charges or sends will do so.
|
|
878
966
|
|
|
967
|
+
It runs the published version unless `version` says otherwise. Pass
|
|
968
|
+
`version: "draft"` to try the unpublished config — that is the loop you build
|
|
969
|
+
in, and it is refused with the publish errors when the draft does not hold
|
|
970
|
+
together.
|
|
971
|
+
|
|
879
972
|
The response is the whole run — `output`, a `trace` of every tool call and
|
|
880
973
|
everything the model wrote (secrets redacted, long fields truncated and marked),
|
|
881
974
|
`steps_used` against `max_steps`, the tokens each model spent and
|
|
@@ -901,9 +994,16 @@ problem it is:
|
|
|
901
994
|
`no_output` precisely so nobody rewrites a prompt that was never the problem.
|
|
902
995
|
- `timeout` — `timeout_seconds` elapsed.
|
|
903
996
|
- `provider_error` — the model or an MCP server failed. Not yours to fix.
|
|
904
|
-
- `configuration` — yours to tell them: a missing BYOK key, a
|
|
905
|
-
|
|
997
|
+
- `configuration` — yours to tell them: a missing BYOK key, a tool version this
|
|
998
|
+
publish pinned that has since been deleted, an integration whose credential no
|
|
999
|
+
longer resolves.
|
|
906
1000
|
- `platform` — ours.
|
|
1001
|
+
- `canceled` — a deploy or restart stopped the run. A batch row is drafted again
|
|
1002
|
+
automatically; a run started by hand is run again.
|
|
1003
|
+
|
|
1004
|
+
Each run records `task_version` — which published definition ran it, and null
|
|
1005
|
+
for a `version: "draft"` run. That is what makes two runs either side of an edit
|
|
1006
|
+
tell apart.
|
|
907
1007
|
|
|
908
1008
|
Task runs are **not** in the Observability charts, which are built on calls and
|
|
909
1009
|
conversations. `list_task_runs` is where a task's own history lives.
|
|
@@ -1035,9 +1135,11 @@ afterwards will not forgive us:
|
|
|
1035
1135
|
opted in. This runs on *their* Resend account under *their* agreement.
|
|
1036
1136
|
- **Nothing is sent that they have not reviewed and selected.** Creating a batch
|
|
1037
1137
|
only drafts.
|
|
1038
|
-
- **Every row runs the task
|
|
1039
|
-
|
|
1040
|
-
|
|
1138
|
+
- **Every row runs the task's CURRENT PUBLISHED version**, re-read as drafting
|
|
1139
|
+
goes, so publishing mid-batch changes every row drafted after that moment. Which version
|
|
1140
|
+
wrote which rows is on the batch as `drafted_versions`, and
|
|
1141
|
+
`redraft_email_batch_recipients` with `selection: "stale_version"` is how the
|
|
1142
|
+
older ones are rewritten.
|
|
1041
1143
|
- **Talqing reports what it sent, not what landed.** Deliveries, bounces and
|
|
1042
1144
|
spam complaints live in the Resend dashboard, and watching them there is how a
|
|
1043
1145
|
sending domain survives.
|
|
@@ -1067,26 +1169,47 @@ no tokens spent. Flag blank cells in a required column before creating.
|
|
|
1067
1169
|
|
|
1068
1170
|
### Two jobs, and a human between them
|
|
1069
1171
|
|
|
1070
|
-
**Drafting** starts on `start_at` (or immediately),
|
|
1071
|
-
|
|
1072
|
-
the last row lands.
|
|
1073
|
-
`
|
|
1074
|
-
batch means *"the drafts are ready
|
|
1075
|
-
nothing about what has been sent.
|
|
1076
|
-
|
|
1077
|
-
**Sending** is separate
|
|
1078
|
-
`
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1172
|
+
**Drafting** starts on `start_at` (or immediately), runs `draft_concurrency` rows
|
|
1173
|
+
at a time with at least `draft_gap_seconds` between two starts, and stops when
|
|
1174
|
+
the last row lands. It has no business-hours window: nobody receives a draft. Its
|
|
1175
|
+
`status` is about drafting and nothing else — `scheduled`, `drafting`, `paused`,
|
|
1176
|
+
`drafted`, `canceled`, `failed`. A `drafted` batch means *"the drafts are ready
|
|
1177
|
+
to review"*, never "finished": it says nothing about what has been sent.
|
|
1178
|
+
|
|
1179
|
+
**Sending** is separate, only ever happens when a person asks, and is its own
|
|
1180
|
+
row. `create_email_send` takes `recipient_ids` or `selection: "all_drafts"` and
|
|
1181
|
+
returns a **send** you can steer:
|
|
1182
|
+
|
|
1183
|
+
- `start_at` schedules it, `window` (on its own `timezone`) holds it to business
|
|
1184
|
+
hours, `send_gap_seconds` is the minimum wait between two emails (1 second to
|
|
1185
|
+
1 hour) and `send_daily_cap` bounds how many may leave per local day. Anything
|
|
1186
|
+
omitted comes from the batch.
|
|
1187
|
+
- `pause_email_send` stops on the next email; `resume_email_send` carries on.
|
|
1188
|
+
- `cancel_email_send` gives **every unsent row back as a draft**, ready for
|
|
1189
|
+
another send. It is also the ONLY way to change what a scheduled send
|
|
1190
|
+
contains: a send's rows are fixed when it is created, and there is no verb for
|
|
1191
|
+
pulling rows out of one.
|
|
1192
|
+
- `get_email_send` carries `next_send_at` and `next_send_reason` (`start`,
|
|
1193
|
+
`window`, `daily_cap`, `retry`, `gap`), which is how "waiting for Monday" is
|
|
1194
|
+
told apart from "stuck". `patch_email_send` reaches a live send within five
|
|
1195
|
+
minutes, so raising a spent cap or removing a window needs no cancel.
|
|
1196
|
+
|
|
1197
|
+
**The safeguard here is a RATE, not a row count.** `send_daily_cap` (200 by
|
|
1198
|
+
default, per batch, `null` for uncapped) is what stands between a 5 000-row list
|
|
1199
|
+
and a sending domain nobody trusts again. Before creating a send, say how many
|
|
1200
|
+
emails it is and roughly how long it will take at the pace it has — and if the
|
|
1201
|
+
user asks to raise or remove the cap, say what it is for rather than just doing
|
|
1202
|
+
it.
|
|
1203
|
+
|
|
1204
|
+
Each send may override `from_email` / `from_name` / `reply_to` for itself alone;
|
|
1205
|
+
the batch's own default is unchanged. The Resend account itself is not
|
|
1088
1206
|
overridable — a different account is a different batch.
|
|
1089
1207
|
|
|
1208
|
+
Every email carries `List-Unsubscribe: <mailto:…?subject=unsubscribe>`, pointed
|
|
1209
|
+
at the send's `reply_to` or its `from_email`. There is no one-click unsubscribe
|
|
1210
|
+
and no suppression list, so an opt-out arrives as a reply in the tenant's own
|
|
1211
|
+
inbox and honouring it is theirs to do.
|
|
1212
|
+
|
|
1090
1213
|
### Fixing rows
|
|
1091
1214
|
|
|
1092
1215
|
`list_email_batch_recipients` returns each row's `columns` (the merged space),
|
|
@@ -1095,8 +1218,13 @@ null when it can. `patch_email_batch_recipient` edits cells: the edit is stored
|
|
|
1095
1218
|
apart from what the model wrote, merged last, and an empty value clears it. That
|
|
1096
1219
|
is the answer to a row whose task returned `null` for the address — type one in.
|
|
1097
1220
|
|
|
1098
|
-
`
|
|
1099
|
-
|
|
1221
|
+
`redraft_email_batch_recipients` writes rows again from scratch and is the one
|
|
1222
|
+
action that revives a batch that already finished drafting. Its `selection` is
|
|
1223
|
+
`failed` (drafting failed), `stale_version` (an older published version of the
|
|
1224
|
+
task wrote them), `not_sent`, or `all` — which names every row it refuses.
|
|
1225
|
+
**Each redrafted row runs the task again and is billed again**, so say the row
|
|
1226
|
+
count before running `all`. A person's edited cells survive unless
|
|
1227
|
+
`clear_overrides` is set.
|
|
1100
1228
|
|
|
1101
1229
|
**One address is mailed at most once per batch**, enforced when the row is
|
|
1102
1230
|
claimed for sending: the second row settles `skipped` with
|
|
@@ -1105,12 +1233,19 @@ ours — Resend keeps one and auto-suppresses hard bounces and complaints.
|
|
|
1105
1233
|
|
|
1106
1234
|
### Watching it
|
|
1107
1235
|
|
|
1108
|
-
`get_email_batch` carries live counts, `failure_reason`, `
|
|
1109
|
-
|
|
1110
|
-
far.
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1236
|
+
`get_email_batch` carries live counts, `failure_reason`, `sent_today` (against
|
|
1237
|
+
`send_daily_cap`), `drafted_versions`, `stale_redraftable` and the drafting cost
|
|
1238
|
+
so far.
|
|
1239
|
+
|
|
1240
|
+
**Stopping itself comes in two shapes, and they need different advice.** Ten
|
|
1241
|
+
consecutive failures **pause** a batch or a send: everything is where it was and
|
|
1242
|
+
`resume` continues, so say that rather than suggesting the work be rebuilt.
|
|
1243
|
+
`failed` is the deterministic stop — a deleted task, a field map an edit broke, a
|
|
1244
|
+
revoked key, an unverified domain — where trying again cannot help until
|
|
1245
|
+
something outside Talqing changes. A failed SEND returns its untouched rows to
|
|
1246
|
+
the review table as drafts and never takes the batch with it; the drafts are
|
|
1247
|
+
still there. In the other direction, pausing or cancelling the *batch* stops
|
|
1248
|
+
drafting and does not touch a send that is already scheduled or going out.
|
|
1114
1249
|
|
|
1115
1250
|
## Knowledge bases
|
|
1116
1251
|
|
package/package.json
CHANGED
package/tools.json
CHANGED
|
@@ -297,7 +297,7 @@
|
|
|
297
297
|
"role": "write"
|
|
298
298
|
},
|
|
299
299
|
{
|
|
300
|
-
"description": "Fetch one task's config
|
|
300
|
+
"description": "Fetch one task's draft config, published version, history and last run.",
|
|
301
301
|
"method": "GET",
|
|
302
302
|
"name": "get_task",
|
|
303
303
|
"parameters": {
|
|
@@ -311,7 +311,7 @@
|
|
|
311
311
|
"role": "read"
|
|
312
312
|
},
|
|
313
313
|
{
|
|
314
|
-
"description": "Replace
|
|
314
|
+
"description": "Replace the task's draft config with the one supplied.",
|
|
315
315
|
"method": "PATCH",
|
|
316
316
|
"name": "update_task",
|
|
317
317
|
"parameters": {
|
|
@@ -325,7 +325,7 @@
|
|
|
325
325
|
"role": "write"
|
|
326
326
|
},
|
|
327
327
|
{
|
|
328
|
-
"description": "Delete a task. Its
|
|
328
|
+
"description": "Delete a task and its published versions. Its runs survive, still named after it.",
|
|
329
329
|
"method": "DELETE",
|
|
330
330
|
"name": "delete_task",
|
|
331
331
|
"parameters": {
|
|
@@ -338,6 +338,62 @@
|
|
|
338
338
|
"read_only": false,
|
|
339
339
|
"role": "write"
|
|
340
340
|
},
|
|
341
|
+
{
|
|
342
|
+
"description": "Run publish-grade validation on the draft without publishing it.",
|
|
343
|
+
"method": "POST",
|
|
344
|
+
"name": "validate_task",
|
|
345
|
+
"parameters": {
|
|
346
|
+
"additionalProperties": true,
|
|
347
|
+
"description": "Arguments not inlined: call describe_function('validate_task').",
|
|
348
|
+
"properties": {},
|
|
349
|
+
"type": "object"
|
|
350
|
+
},
|
|
351
|
+
"path": "/v1/tasks/{task_id}/validate",
|
|
352
|
+
"read_only": false,
|
|
353
|
+
"role": "write"
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"description": "Freeze the current draft as a new immutable version and make it live.",
|
|
357
|
+
"method": "POST",
|
|
358
|
+
"name": "publish_task",
|
|
359
|
+
"parameters": {
|
|
360
|
+
"additionalProperties": true,
|
|
361
|
+
"description": "Arguments not inlined: call describe_function('publish_task').",
|
|
362
|
+
"properties": {},
|
|
363
|
+
"type": "object"
|
|
364
|
+
},
|
|
365
|
+
"path": "/v1/tasks/{task_id}/publish",
|
|
366
|
+
"read_only": false,
|
|
367
|
+
"role": "write"
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
"description": "Fetch what one published version of a task actually contains.",
|
|
371
|
+
"method": "GET",
|
|
372
|
+
"name": "get_task_version",
|
|
373
|
+
"parameters": {
|
|
374
|
+
"additionalProperties": true,
|
|
375
|
+
"description": "Arguments not inlined: call describe_function('get_task_version').",
|
|
376
|
+
"properties": {},
|
|
377
|
+
"type": "object"
|
|
378
|
+
},
|
|
379
|
+
"path": "/v1/tasks/{task_id}/versions/{version}",
|
|
380
|
+
"read_only": true,
|
|
381
|
+
"role": "read"
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
"description": "Put an earlier published version of a task back into production.",
|
|
385
|
+
"method": "POST",
|
|
386
|
+
"name": "rollback_task_version",
|
|
387
|
+
"parameters": {
|
|
388
|
+
"additionalProperties": true,
|
|
389
|
+
"description": "Arguments not inlined: call describe_function('rollback_task_version').",
|
|
390
|
+
"properties": {},
|
|
391
|
+
"type": "object"
|
|
392
|
+
},
|
|
393
|
+
"path": "/v1/tasks/{task_id}/versions/{version}/rollback",
|
|
394
|
+
"read_only": false,
|
|
395
|
+
"role": "write"
|
|
396
|
+
},
|
|
341
397
|
{
|
|
342
398
|
"description": "Run the task once with the variables you supply, and wait for the result.",
|
|
343
399
|
"method": "POST",
|
|
@@ -898,6 +954,76 @@
|
|
|
898
954
|
"read_only": false,
|
|
899
955
|
"role": "write"
|
|
900
956
|
},
|
|
957
|
+
{
|
|
958
|
+
"description": "List WebSocket media-stream connections a partner can dial.",
|
|
959
|
+
"method": "GET",
|
|
960
|
+
"name": "list_stream_connections",
|
|
961
|
+
"parameters": {
|
|
962
|
+
"additionalProperties": true,
|
|
963
|
+
"description": "Arguments not inlined: call describe_function('list_stream_connections').",
|
|
964
|
+
"properties": {},
|
|
965
|
+
"type": "object"
|
|
966
|
+
},
|
|
967
|
+
"path": "/v1/streams",
|
|
968
|
+
"read_only": true,
|
|
969
|
+
"role": "read"
|
|
970
|
+
},
|
|
971
|
+
{
|
|
972
|
+
"description": "Create a connection a streaming partner can dial.",
|
|
973
|
+
"method": "POST",
|
|
974
|
+
"name": "create_stream_connection",
|
|
975
|
+
"parameters": {
|
|
976
|
+
"additionalProperties": true,
|
|
977
|
+
"description": "Arguments not inlined: call describe_function('create_stream_connection').",
|
|
978
|
+
"properties": {},
|
|
979
|
+
"type": "object"
|
|
980
|
+
},
|
|
981
|
+
"path": "/v1/streams",
|
|
982
|
+
"read_only": false,
|
|
983
|
+
"role": "write"
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
"description": "One stream connection, with the URL to hand the partner.",
|
|
987
|
+
"method": "GET",
|
|
988
|
+
"name": "get_stream_connection",
|
|
989
|
+
"parameters": {
|
|
990
|
+
"additionalProperties": true,
|
|
991
|
+
"description": "Arguments not inlined: call describe_function('get_stream_connection').",
|
|
992
|
+
"properties": {},
|
|
993
|
+
"type": "object"
|
|
994
|
+
},
|
|
995
|
+
"path": "/v1/streams/{connection_id}",
|
|
996
|
+
"read_only": true,
|
|
997
|
+
"role": "read"
|
|
998
|
+
},
|
|
999
|
+
{
|
|
1000
|
+
"description": "Rename a connection, point it at another agent, or disable it.",
|
|
1001
|
+
"method": "PATCH",
|
|
1002
|
+
"name": "patch_stream_connection",
|
|
1003
|
+
"parameters": {
|
|
1004
|
+
"additionalProperties": true,
|
|
1005
|
+
"description": "Arguments not inlined: call describe_function('patch_stream_connection').",
|
|
1006
|
+
"properties": {},
|
|
1007
|
+
"type": "object"
|
|
1008
|
+
},
|
|
1009
|
+
"path": "/v1/streams/{connection_id}",
|
|
1010
|
+
"read_only": false,
|
|
1011
|
+
"role": "write"
|
|
1012
|
+
},
|
|
1013
|
+
{
|
|
1014
|
+
"description": "Delete a stream connection. Calls it already carried are kept.",
|
|
1015
|
+
"method": "DELETE",
|
|
1016
|
+
"name": "delete_stream_connection",
|
|
1017
|
+
"parameters": {
|
|
1018
|
+
"additionalProperties": true,
|
|
1019
|
+
"description": "Arguments not inlined: call describe_function('delete_stream_connection').",
|
|
1020
|
+
"properties": {},
|
|
1021
|
+
"type": "object"
|
|
1022
|
+
},
|
|
1023
|
+
"path": "/v1/streams/{connection_id}",
|
|
1024
|
+
"read_only": false,
|
|
1025
|
+
"role": "write"
|
|
1026
|
+
},
|
|
901
1027
|
{
|
|
902
1028
|
"description": "Dial a real phone number and have a published agent take the call.",
|
|
903
1029
|
"method": "POST",
|
|
@@ -1137,7 +1263,7 @@
|
|
|
1137
1263
|
"role": "write"
|
|
1138
1264
|
},
|
|
1139
1265
|
{
|
|
1140
|
-
"description": "Stop drafting for good.
|
|
1266
|
+
"description": "Stop drafting for good. A batch cannot be deleted, because it is the record of what was sent to whom.",
|
|
1141
1267
|
"method": "POST",
|
|
1142
1268
|
"name": "cancel_email_batch",
|
|
1143
1269
|
"parameters": {
|
|
@@ -1179,58 +1305,142 @@
|
|
|
1179
1305
|
"role": "write"
|
|
1180
1306
|
},
|
|
1181
1307
|
{
|
|
1182
|
-
"description": "
|
|
1308
|
+
"description": "Take rows out of consideration. Reversible with `restore`.",
|
|
1183
1309
|
"method": "POST",
|
|
1184
|
-
"name": "
|
|
1310
|
+
"name": "skip_email_batch_recipients",
|
|
1185
1311
|
"parameters": {
|
|
1186
1312
|
"additionalProperties": true,
|
|
1187
|
-
"description": "Arguments not inlined: call describe_function('
|
|
1313
|
+
"description": "Arguments not inlined: call describe_function('skip_email_batch_recipients').",
|
|
1188
1314
|
"properties": {},
|
|
1189
1315
|
"type": "object"
|
|
1190
1316
|
},
|
|
1191
|
-
"path": "/v1/email/batches/{batch_id}/
|
|
1317
|
+
"path": "/v1/email/batches/{batch_id}/skip",
|
|
1192
1318
|
"read_only": false,
|
|
1193
1319
|
"role": "write"
|
|
1194
1320
|
},
|
|
1195
1321
|
{
|
|
1196
|
-
"description": "
|
|
1322
|
+
"description": "Put skipped rows back. `selection: \"all_eligible\"` means every skipped row.",
|
|
1197
1323
|
"method": "POST",
|
|
1198
|
-
"name": "
|
|
1324
|
+
"name": "restore_email_batch_recipients",
|
|
1199
1325
|
"parameters": {
|
|
1200
1326
|
"additionalProperties": true,
|
|
1201
|
-
"description": "Arguments not inlined: call describe_function('
|
|
1327
|
+
"description": "Arguments not inlined: call describe_function('restore_email_batch_recipients').",
|
|
1202
1328
|
"properties": {},
|
|
1203
1329
|
"type": "object"
|
|
1204
1330
|
},
|
|
1205
|
-
"path": "/v1/email/batches/{batch_id}/
|
|
1331
|
+
"path": "/v1/email/batches/{batch_id}/restore",
|
|
1206
1332
|
"read_only": false,
|
|
1207
1333
|
"role": "write"
|
|
1208
1334
|
},
|
|
1209
1335
|
{
|
|
1210
|
-
"description": "
|
|
1336
|
+
"description": "Draft rows again from scratch. **Each one runs the task and is billed again.**",
|
|
1211
1337
|
"method": "POST",
|
|
1212
|
-
"name": "
|
|
1338
|
+
"name": "redraft_email_batch_recipients",
|
|
1213
1339
|
"parameters": {
|
|
1214
1340
|
"additionalProperties": true,
|
|
1215
|
-
"description": "Arguments not inlined: call describe_function('
|
|
1341
|
+
"description": "Arguments not inlined: call describe_function('redraft_email_batch_recipients').",
|
|
1216
1342
|
"properties": {},
|
|
1217
1343
|
"type": "object"
|
|
1218
1344
|
},
|
|
1219
|
-
"path": "/v1/email/batches/{batch_id}/
|
|
1345
|
+
"path": "/v1/email/batches/{batch_id}/redraft",
|
|
1346
|
+
"read_only": false,
|
|
1347
|
+
"role": "write"
|
|
1348
|
+
},
|
|
1349
|
+
{
|
|
1350
|
+
"description": "Send these rows. **This mails real people and cannot be undone.**",
|
|
1351
|
+
"method": "POST",
|
|
1352
|
+
"name": "create_email_send",
|
|
1353
|
+
"parameters": {
|
|
1354
|
+
"additionalProperties": true,
|
|
1355
|
+
"description": "Arguments not inlined: call describe_function('create_email_send').",
|
|
1356
|
+
"properties": {},
|
|
1357
|
+
"type": "object"
|
|
1358
|
+
},
|
|
1359
|
+
"path": "/v1/email/batches/{batch_id}/sends",
|
|
1360
|
+
"read_only": false,
|
|
1361
|
+
"role": "write"
|
|
1362
|
+
},
|
|
1363
|
+
{
|
|
1364
|
+
"description": "Every send on this batch, newest first, with its counts and its schedule.",
|
|
1365
|
+
"method": "GET",
|
|
1366
|
+
"name": "list_email_sends",
|
|
1367
|
+
"parameters": {
|
|
1368
|
+
"additionalProperties": true,
|
|
1369
|
+
"description": "Arguments not inlined: call describe_function('list_email_sends').",
|
|
1370
|
+
"properties": {},
|
|
1371
|
+
"type": "object"
|
|
1372
|
+
},
|
|
1373
|
+
"path": "/v1/email/batches/{batch_id}/sends",
|
|
1374
|
+
"read_only": true,
|
|
1375
|
+
"role": "read"
|
|
1376
|
+
},
|
|
1377
|
+
{
|
|
1378
|
+
"description": "One send: where its rows are, and when it next does something.",
|
|
1379
|
+
"method": "GET",
|
|
1380
|
+
"name": "get_email_send",
|
|
1381
|
+
"parameters": {
|
|
1382
|
+
"additionalProperties": true,
|
|
1383
|
+
"description": "Arguments not inlined: call describe_function('get_email_send').",
|
|
1384
|
+
"properties": {},
|
|
1385
|
+
"type": "object"
|
|
1386
|
+
},
|
|
1387
|
+
"path": "/v1/email/batches/{batch_id}/sends/{send_id}",
|
|
1388
|
+
"read_only": true,
|
|
1389
|
+
"role": "read"
|
|
1390
|
+
},
|
|
1391
|
+
{
|
|
1392
|
+
"description": "Re-steer one send: its pace, its hours, its daily cap, its start time.",
|
|
1393
|
+
"method": "PATCH",
|
|
1394
|
+
"name": "patch_email_send",
|
|
1395
|
+
"parameters": {
|
|
1396
|
+
"additionalProperties": true,
|
|
1397
|
+
"description": "Arguments not inlined: call describe_function('patch_email_send').",
|
|
1398
|
+
"properties": {},
|
|
1399
|
+
"type": "object"
|
|
1400
|
+
},
|
|
1401
|
+
"path": "/v1/email/batches/{batch_id}/sends/{send_id}",
|
|
1402
|
+
"read_only": false,
|
|
1403
|
+
"role": "write"
|
|
1404
|
+
},
|
|
1405
|
+
{
|
|
1406
|
+
"description": "Stop sending. It takes hold on the next email, and nothing is lost \u2014 the rows stay queued for whenever you resume.",
|
|
1407
|
+
"method": "POST",
|
|
1408
|
+
"name": "pause_email_send",
|
|
1409
|
+
"parameters": {
|
|
1410
|
+
"additionalProperties": true,
|
|
1411
|
+
"description": "Arguments not inlined: call describe_function('pause_email_send').",
|
|
1412
|
+
"properties": {},
|
|
1413
|
+
"type": "object"
|
|
1414
|
+
},
|
|
1415
|
+
"path": "/v1/email/batches/{batch_id}/sends/{send_id}/pause",
|
|
1416
|
+
"read_only": false,
|
|
1417
|
+
"role": "write"
|
|
1418
|
+
},
|
|
1419
|
+
{
|
|
1420
|
+
"description": "Undo a pause and carry on from where it stopped.",
|
|
1421
|
+
"method": "POST",
|
|
1422
|
+
"name": "resume_email_send",
|
|
1423
|
+
"parameters": {
|
|
1424
|
+
"additionalProperties": true,
|
|
1425
|
+
"description": "Arguments not inlined: call describe_function('resume_email_send').",
|
|
1426
|
+
"properties": {},
|
|
1427
|
+
"type": "object"
|
|
1428
|
+
},
|
|
1429
|
+
"path": "/v1/email/batches/{batch_id}/sends/{send_id}/resume",
|
|
1220
1430
|
"read_only": false,
|
|
1221
1431
|
"role": "write"
|
|
1222
1432
|
},
|
|
1223
1433
|
{
|
|
1224
|
-
"description": "
|
|
1434
|
+
"description": "Stop this send, and give every row it has not sent back as a draft.",
|
|
1225
1435
|
"method": "POST",
|
|
1226
|
-
"name": "
|
|
1436
|
+
"name": "cancel_email_send",
|
|
1227
1437
|
"parameters": {
|
|
1228
1438
|
"additionalProperties": true,
|
|
1229
|
-
"description": "Arguments not inlined: call describe_function('
|
|
1439
|
+
"description": "Arguments not inlined: call describe_function('cancel_email_send').",
|
|
1230
1440
|
"properties": {},
|
|
1231
1441
|
"type": "object"
|
|
1232
1442
|
},
|
|
1233
|
-
"path": "/v1/email/batches/{batch_id}/
|
|
1443
|
+
"path": "/v1/email/batches/{batch_id}/sends/{send_id}/cancel",
|
|
1234
1444
|
"read_only": false,
|
|
1235
1445
|
"role": "write"
|
|
1236
1446
|
},
|
|
@@ -1612,6 +1822,20 @@
|
|
|
1612
1822
|
"read_only": true,
|
|
1613
1823
|
"role": "read"
|
|
1614
1824
|
},
|
|
1825
|
+
{
|
|
1826
|
+
"description": "Search the language models a provider offers too many of to list.",
|
|
1827
|
+
"method": "GET",
|
|
1828
|
+
"name": "search_models",
|
|
1829
|
+
"parameters": {
|
|
1830
|
+
"additionalProperties": true,
|
|
1831
|
+
"description": "Arguments not inlined: call describe_function('search_models').",
|
|
1832
|
+
"properties": {},
|
|
1833
|
+
"type": "object"
|
|
1834
|
+
},
|
|
1835
|
+
"path": "/v1/catalog/models",
|
|
1836
|
+
"read_only": true,
|
|
1837
|
+
"role": "read"
|
|
1838
|
+
},
|
|
1615
1839
|
{
|
|
1616
1840
|
"description": "The Anam avatar gallery \u2014 the faces a video agent can wear.",
|
|
1617
1841
|
"method": "GET",
|