@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 +1 -1
- package/SKILL.md +39 -25
- package/package.json +1 -1
- package/tools.json +14 -0
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/
|
|
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
|
|
204
|
-
call, `handoff_to_<name>`, and the model routes on
|
|
205
|
-
that as what belongs there ("invoices, refunds,
|
|
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
|
|
224
|
-
agent's own `conversation.context` uses
|
|
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
|
|
227
|
-
configure, and the target pays for all of
|
|
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
|
|
237
|
-
the summary, so the target knows what is
|
|
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
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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:
|
|
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
|
|
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` (`
|
|
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
|
|
742
|
-
`
|
|
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
|
|
1110
|
-
the
|
|
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
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",
|