@talqing/mcp 0.8.1 → 0.9.1

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/README.md CHANGED
@@ -145,7 +145,7 @@ cannot drift from the product:
145
145
  PYTHONPATH=backend python openapi/export.py
146
146
  ```
147
147
 
148
- `tools.json` comes from `backend/api/dataplane/operations.py`, the same registry
148
+ `tools.json` comes from `backend/api/functions.py`, the same registry
149
149
  the CoPilot binds its tools from; `SKILL.md` comes from
150
150
  `backend/services/copilot/skill.md`, the same text the CoPilot is prompted with.
151
151
  Edit those, re-run the export, and both surfaces move together.
package/SKILL.md CHANGED
@@ -200,10 +200,10 @@ An agent is a single object, `config`, plus what you attach to it:
200
200
  - **`handoffs`** — where this agent may pass the conversation next, each
201
201
  `{"name": "Billing", "agent_id": "...", "description": "...", "context":
202
202
  "transcript" | "summary" | "none", "recent_turns": 2, "summary_prompt": "...",
203
- "message": "..."}`. The compiler turns each entry into one tool the model can
204
- call, `handoff_to_<name>`, and the model routes on `description` — so write
205
- that as what belongs there ("invoices, refunds, payment questions"), not as an
206
- instruction.
203
+ "message": "...", "instructions": "..."}`. The compiler turns each entry into
204
+ one tool the model can call, `handoff_to_<name>`, and the model routes on
205
+ `description` — so write that as what belongs there ("invoices, refunds,
206
+ payment questions"), not as an instruction.
207
207
 
208
208
  **This is how you build a multi-agent flow.** Do not create a one-node tool
209
209
  per edge: three agents routing to each other is three agents with `handoffs`
@@ -220,31 +220,34 @@ An agent is a single object, `config`, plus what you attach to it:
220
220
  instructions once a call is connected, so an agent with both that realtime
221
221
  model and a handoff destination is refused on save. Every other model is fine.
222
222
 
223
- **`context` is what the next agent starts from** — the same three words an
224
- agent's own `conversation.context` uses for what a new *call* starts from.
223
+ **`context` is what the next agent inherits from THIS agent's own context** —
224
+ the same three words an agent's own `conversation.context` uses, answering a
225
+ different question (that one is what a new session starts with, and is read
226
+ only from the agent that answers).
225
227
 
226
- - `transcript` (the default) hands over everything said so far. Nothing to
227
- configure, and the target pays for all of it on every turn it then takes.
228
+ - `transcript` (the default) hands over exactly what this agent knows, minus
229
+ its own instructions. Nothing to configure, and the target pays for all of
230
+ it on every turn it then takes.
228
231
  - `summary` asks THIS agent to write the summary itself, as an argument on the
229
232
  `handoff_to_*` tool, in the same turn as the decision to hand over. There is
230
233
  no second LLM call, so a realtime agent can use it too. It costs a pause
231
234
  before the handoff — the agent writes 60–100 tokens before the tool returns
232
235
  — and buys a short, focused context that the source agent chose, instead of
233
236
  forty turns the target has to re-read every turn.
234
- - `none` starts the target with only its own instructions.
237
+ - `none` starts the target with only its own instructions — nothing about the
238
+ conversation, and nothing a later `transcript` edge can recover either.
235
239
 
236
- **`recent_turns`** (1–10) is how many recent turns cross *verbatim* alongside
237
- the summary, so the target knows what is being asked right now. A turn starts
240
+ **`recent_turns`** (1–10, `summary` only) is how many recent turns of THIS
241
+ session cross *verbatim* alongside the summary, so the target knows what is
242
+ being asked right now. A turn starts
238
243
  at a user message and runs until the next one, so a turn that took a tool call
239
244
  and two replies crosses whole. Tool calls themselves never cross — their
240
245
  results are knowledge, and knowledge belongs in the summary.
241
246
 
242
- Leave it out and each policy answers for itself: `summary` carries two turns,
243
- and `none` carries none. Under `summary` the tail can be sized down to one turn
244
- but **not** switched off — a summary with no tail leaves the target knowing the
245
- history and not the question. Under `none` it is opt-in, and `{"context":
246
- "none", "recent_turns": 3}` is a real and useful combination: the last three
247
- turns and nothing else. Past ten turns the honest answer is `transcript`.
247
+ Leave it out and it is two. It can be sized down to one turn but **not**
248
+ switched off — a summary with no tail leaves the target knowing the history
249
+ and not the question. If the summary comes back blank the target gets the tail
250
+ alone. Past ten turns the honest answer is `transcript`.
248
251
 
249
252
  **`summary_prompt`** replaces the platform's default line with your own. It is
250
253
  the *description of the tool argument*, so it is literally what the agent is
@@ -253,9 +256,15 @@ An agent is a single object, `config`, plus what you attach to it:
253
256
  naming three buckets — what the caller wants, what has been done, what is still
254
257
  open — and a longer one buys a longer pause before the handoff.
255
258
 
259
+ **`instructions`** is what the target is told as it opens, passed to its first
260
+ `generate_reply` — e.g. "Don't introduce yourself; answer the caller's last
261
+ question." Used only when the target has no greeting (text targets never have
262
+ one). Leave it out and the target is told nothing: it opens from its own prompt
263
+ and the context it was handed, so put standing behaviour like "never
264
+ re-introduce yourself" in the target's prompt instead.
265
+
256
266
  `recent_turns` and `summary_prompt` are **rejected** where they do not apply,
257
- rather than ignored: no `recent_turns` under `transcript`, which already
258
- carries every turn, and no `summary_prompt` outside `summary`.
267
+ rather than ignored: neither outside `summary`.
259
268
 
260
269
  **`summary` is not a privacy boundary, and must not be described as one.** It
261
270
  narrows what the target model is shown; it guarantees nothing. The tail always
@@ -437,13 +446,13 @@ without you doing anything. Rules worth knowing before you hit them:
437
446
  English does not come back transliterated, it comes back with words missing, and
438
447
  the agent never learns it misheard.
439
448
  - **Auto does not mean "detects" everywhere.** A model with a `default_language`
440
- runs on that code when the agent is on Auto, and the ones spelled `unknown`,
449
+ runs on that code when the agent is on Auto, and the ones spelled
441
450
  `multi` or `auto` are the providers' own words for detection. The rest are
442
451
  real languages, and English is what a model that cannot detect falls back to:
443
452
  `deepgram/nova-3` and both xAI speech-to-text models transcribe as English on
444
453
  Auto and will mistranscribe a caller who speaks anything else. For an agent
445
454
  taking non-English calls on Auto, pick `deepgram/nova-3-general` (`multi`),
446
- `deepgram/flux-general-multi`, `sarvam/saaras:v4` (`unknown`), ElevenLabs
455
+ `deepgram/flux-general-multi`, `sarvam/saaras:v4` (`auto`), ElevenLabs
447
456
  Scribe or OpenAI — all of which detect for real.
448
457
  - Models that publish no languages (OpenAI TTS is multilingual, Deepgram encodes
449
458
  the language in the voice) simply ignore the setting.
@@ -715,6 +724,10 @@ instead.
715
724
  - **`say`** — spoken verbatim.
716
725
  - **`generate_reply`** — the LLM writes the reply.
717
726
  - **`add_message`** — adds a system message without triggering a reply.
727
+ `scope: "conversation"` (default) keeps it for the rest of the conversation;
728
+ `scope: "turn"` gives it to the model for this one reply only — allowed only
729
+ in the `on_user_turn_completed` hook, and the right choice there for per-turn
730
+ lookups, which would otherwise pile up a message every turn.
718
731
  - **`end_call`** — put a `say` immediately before it if there should be a
719
732
  goodbye, and word that goodbye as what actually happens: the call ends here.
720
733
  Never say "let me transfer you", "please hold" or "someone will call you
@@ -738,8 +751,9 @@ instead.
738
751
  under any other context is an error.
739
752
 
740
753
  `recent_turns` works exactly as it does on `handoffs[]`: the tail that
741
- crosses verbatim, defaulting to two turns under `summary` and to none under
742
- `none`, and rejected under `transcript`.
754
+ crosses verbatim beside the summary, defaulting to two, and rejected under any
755
+ other context. `instructions` is the same as on
756
+ `handoffs[]`, and is a template.
743
757
 
744
758
  Reach for this operation only when the decision is the TREE's — after an
745
759
  `http` lookup, inside an `if`. When the model should decide which desk the
@@ -1106,8 +1120,8 @@ channel through *triggers*, not MCP attachment. A trigger binds an inbound event
1106
1120
  to a published text agent and decides what happens with the reply.
1107
1121
 
1108
1122
  A Twilio WhatsApp number also takes calls: a `whatsapp.call.inbound` trigger puts a
1109
- published **voice** agent on it, which must use `conversation.context: "transcript"` —
1110
- the call joins the chat's thread. It cannot transfer to a phone number.
1123
+ published **voice** agent on it. The call always joins the chat's thread, whatever
1124
+ the agent's `conversation.context` says. It cannot transfer to a phone number.
1111
1125
 
1112
1126
  `integration_catalog` is the authoritative list of providers and, in
1113
1127
  `setup_fields`, exactly what each one needs — read it instead of guessing.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talqing/mcp",
3
- "version": "0.8.1",
3
+ "version": "0.9.1",
4
4
  "description": "MCP server for building Talqing AI voice, video and text agents from Claude Code, Codex, or any MCP client.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://talqing.com",
package/tools.json CHANGED
@@ -1584,6 +1584,20 @@
1584
1584
  "read_only": false,
1585
1585
  "role": "write"
1586
1586
  },
1587
+ {
1588
+ "description": "Mint a token for a new web call that continues one that ended.",
1589
+ "method": "POST",
1590
+ "name": "resume_call",
1591
+ "parameters": {
1592
+ "additionalProperties": true,
1593
+ "description": "Arguments not inlined: call describe_function('resume_call').",
1594
+ "properties": {},
1595
+ "type": "object"
1596
+ },
1597
+ "path": "/v1/calls/{session_id}/resume",
1598
+ "read_only": false,
1599
+ "role": "write"
1600
+ },
1587
1601
  {
1588
1602
  "description": "Start a chat with a text agent. Send it messages with `create_chat_message`.",
1589
1603
  "method": "POST",