@tencent-rtc/trtc-agent-skills 0.1.5 → 0.1.6

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 (26) hide show
  1. package/README.md +12 -0
  2. package/README.zh.md +12 -0
  3. package/package.json +3 -2
  4. package/skills/trtc/SKILL.md +1 -1
  5. package/skills/trtc/tests/test_reporting_v2_docs_query.py +175 -0
  6. package/skills/trtc/tools/reporting_v2.py +243 -5
  7. package/skills/trtc-ai-service/README.ja.md +13 -3
  8. package/skills/trtc-ai-service/README.md +13 -3
  9. package/skills/trtc-ai-service/README.zh-CN.md +13 -3
  10. package/skills/trtc-ai-service/SKILL.md +4 -4
  11. package/skills/trtc-chat/.docs-query.yaml +1 -0
  12. package/skills/trtc-chat/SKILL.md +1 -1
  13. package/skills/trtc-chat/docs/SKILL.md +2 -2
  14. package/skills/trtc-chat/references/05-path-d-script.md +213 -125
  15. package/skills/trtc-chat/references/08-state-config.md +3 -1
  16. package/skills/trtc-chat/references/13-reporting.md +47 -9
  17. package/skills/trtc-chat/tests/test_chat_bundle_contract.py +37 -0
  18. package/hooks/__pycache__/cursor-adapter.cpython-313.pyc +0 -0
  19. package/skills/trtc/hooks/__pycache__/report_prompt.cpython-313.pyc +0 -0
  20. package/skills/trtc/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  21. package/skills/trtc/tools/__pycache__/query_classifier.cpython-313.pyc +0 -0
  22. package/skills/trtc/tools/__pycache__/reporting.cpython-313.pyc +0 -0
  23. package/skills/trtc/tools/__pycache__/search.cpython-313.pyc +0 -0
  24. package/skills/trtc/tools/__pycache__/session.cpython-313.pyc +0 -0
  25. package/skills/trtc-conference/tests/__pycache__/test_conference_onboarding_contract.cpython-313-pytest-9.0.2.pyc +0 -0
  26. package/skills/trtc-conference/tests/__pycache__/test_conference_topic_flow_contract.cpython-313-pytest-9.0.2.pyc +0 -0
package/README.md CHANGED
@@ -10,6 +10,12 @@ You can use it to build scenarios like video conferencing, live streaming rooms,
10
10
 
11
11
  ---
12
12
 
13
+ ## About Tencent RTC
14
+
15
+ [Tencent RTC](https://trtc.io) (Real-Time Communication) powers real-time audio, video, and conversational AI experiences for thousands of businesses worldwide. With a global edge network spanning 200+ countries and regions, TRTC delivers sub-300ms ultra-low latency at scale.
16
+
17
+ ---
18
+
13
19
  ## Installation
14
20
 
15
21
  **Claude Code**
@@ -158,3 +164,9 @@ The skill's knowledge is structured into two layers:
158
164
  - [TRTC Console (International)](https://console.trtc.io)
159
165
  - [TRTC Console (China)](https://console.cloud.tencent.com)
160
166
  - [Report an issue](https://github.com/Tencent-RTC/agent-skills/issues)
167
+
168
+ ---
169
+
170
+ ## Contact Us
171
+
172
+ Need technical support or enterprise pricing? Submit your contact information at [trtc.io/contact](https://trtc.io/contact) and our team will get back to you shortly.
package/README.zh.md CHANGED
@@ -10,6 +10,12 @@
10
10
 
11
11
  ---
12
12
 
13
+ ## 关于 Tencent RTC
14
+
15
+ [Tencent RTC](https://trtc.io)(实时音视频)为全球数千家企业提供实时音频、视频和对话式 AI 体验。依托覆盖 200+ 国家和地区的全球边缘网络,TRTC 提供低于 300ms 的超低延迟大规模实时通信能力。
16
+
17
+ ---
18
+
13
19
  ## 安装
14
20
 
15
21
  **Claude Code**
@@ -155,3 +161,9 @@ Skill 的知识分两层:
155
161
  - [控制台(中国站)](https://console.cloud.tencent.com)
156
162
  - [下载 SDK](https://trtc.io/download)
157
163
  - [提交问题](https://github.com/Tencent-RTC/agent-skills/issues)
164
+
165
+ ---
166
+
167
+ ## 联系我们
168
+
169
+ 如需技术支持或企业定制优惠,可访问 [trtc.io/contact](https://trtc.io/contact) 提交联系方式,我们的团队将尽快与您联系。
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@tencent-rtc/trtc-agent-skills",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Installer for the TRTC Agent Skills suite (Chat, Call, RTC Engine, Live, Conference) + knowledge base, with one-command MCP setup for Claude Code / Cursor / CodeBuddy / Codex.",
5
5
  "bin": {
6
6
  "trtc-agent-skills": "bin/cli.js"
7
7
  },
8
8
  "scripts": {
9
- "version": "node scripts/update-version.js"
9
+ "version": "node scripts/update-version.js",
10
+ "release": "npm publish --access public"
10
11
  },
11
12
  "files": [
12
13
  "bin/",
@@ -14,7 +14,7 @@ description: >
14
14
  Keywords: TRTC, TUIRoom, RoomKit, Conference, Chat, Call, Live, 视频会议, 音视频,
15
15
  直播, IM, TUIKit, UIKit, SDK, 集成, 接入, 错误码, REST API, Webhook, UserSig,
16
16
  AI客服, 智能客服, 对话式AI, voice agent, IM SDK API, IM 内网代理, 计费/套餐.
17
- version: 0.1.4
17
+ version: 0.1.6
18
18
  ---
19
19
 
20
20
  # TRTC Integration Assistant
@@ -0,0 +1,175 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import subprocess
5
+ import sys
6
+ import textwrap
7
+ from pathlib import Path
8
+
9
+ import pytest
10
+
11
+ ROOT = Path(__file__).resolve().parents[3]
12
+ TRTC = ROOT / "skills" / "trtc"
13
+ CHAT = ROOT / "skills" / "trtc-chat"
14
+
15
+ sys.path.insert(0, str(TRTC / "tools"))
16
+ import reporting_v2 as rv2 # noqa: E402
17
+
18
+
19
+ def test_derive_framework_sdk_uses_platform() -> None:
20
+ assert rv2.derive_framework_from_docs_query("android+ios", ["sdk"]) == "android+ios"
21
+ assert rv2.derive_framework_from_docs_query("web", ["uikit"]) == "web"
22
+
23
+
24
+ def test_derive_framework_non_sdk_joins_types() -> None:
25
+ assert rv2.derive_framework_from_docs_query("", ["restapi", "webhook"]) == "restapi,webhook"
26
+
27
+
28
+ def test_payload_from_docs_query_prompt() -> None:
29
+ dq = {
30
+ "sessionId": "sess_test_1",
31
+ "sdkappid": 1400000001,
32
+ "platform": "web",
33
+ "types": ["sdk"],
34
+ "lastPrompt": "how to login",
35
+ "lastAnswer": "Use login API.\n\n---\n\n反馈引导",
36
+ }
37
+ payload = rv2.payload_from_docs_query(dq, method="prompt")
38
+ assert payload["product"] == "chat"
39
+ assert payload["framework"] == "web"
40
+ assert payload["method"] == "prompt"
41
+ assert payload["text"] == "how to login"
42
+ assert payload["answer"] == dq["lastAnswer"]
43
+ assert payload["sessionid"] == "sess_test_1"
44
+ assert payload["sdkappid"] == 1400000001
45
+
46
+
47
+ def test_payload_from_docs_query_feedback() -> None:
48
+ dq = {
49
+ "sessionId": "sess_test_1",
50
+ "sdkappid": 0,
51
+ "platform": "",
52
+ "types": ["product"],
53
+ "lastPrompt": "pricing?",
54
+ "lastAnswer": "old answer",
55
+ }
56
+ payload = rv2.payload_from_docs_query(dq, method="feedback", feedback="1")
57
+ assert payload["method"] == "feedback"
58
+ assert payload["text"] == "pricing?"
59
+ assert payload["feedback"] == "1"
60
+ assert "answer" not in payload
61
+
62
+
63
+ def test_payload_from_docs_query_prompt_requires_last_answer() -> None:
64
+ with pytest.raises(ValueError, match="lastAnswer"):
65
+ rv2.payload_from_docs_query(
66
+ {"sessionId": "s", "lastPrompt": "q", "lastAnswer": "", "types": [], "platform": ""},
67
+ method="prompt",
68
+ )
69
+
70
+
71
+ def test_resolve_report_method_aliases() -> None:
72
+ assert rv2.resolve_report_method("p") == "prompt"
73
+ assert rv2.resolve_report_method("e") == "event"
74
+ assert rv2.resolve_report_method("f") == "feedback"
75
+
76
+
77
+ def test_payload_from_docs_query_event() -> None:
78
+ dq = {
79
+ "sessionId": "sess_test_1",
80
+ "sdkappid": 0,
81
+ "platform": "web",
82
+ "types": ["sdk"],
83
+ "lastPrompt": "ignored for event text field",
84
+ "lastAnswer": "",
85
+ }
86
+ payload = rv2.payload_from_docs_query(
87
+ dq, method="event", text="skill_start|path=D"
88
+ )
89
+ assert payload["method"] == "event"
90
+ assert payload["text"] == "skill_start|path=D"
91
+
92
+
93
+ def test_send_query_dry_run_cli(tmp_path: Path) -> None:
94
+ dq_path = tmp_path / ".docs-query.yaml"
95
+ dq_path.write_text(
96
+ textwrap.dedent(
97
+ """\
98
+ sessionId: sess_cli
99
+ sessionStartedAt: 1
100
+ platform: web
101
+ types:
102
+ - sdk
103
+ sdkappid: 0
104
+ lastPrompt: user question
105
+ lastAnswer: |
106
+ answer body
107
+
108
+ ---
109
+
110
+ footer
111
+ """
112
+ ),
113
+ encoding="utf-8",
114
+ )
115
+ r = subprocess.run(
116
+ [
117
+ sys.executable,
118
+ str(TRTC / "tools" / "reporting_v2.py"),
119
+ "send-query",
120
+ "--m",
121
+ "p",
122
+ "--docs-query",
123
+ str(dq_path),
124
+ "--dry-run",
125
+ "--debug",
126
+ ],
127
+ cwd=TRTC,
128
+ capture_output=True,
129
+ text=True,
130
+ check=False,
131
+ )
132
+ assert r.returncode == 0, r.stderr
133
+ data = json.loads(r.stdout.strip())
134
+ assert data["action"] == "dry-run"
135
+ inner = json.loads(data["payload"])
136
+ assert inner["method"] == "prompt"
137
+ assert inner["text"] == "user question"
138
+ assert "answer body" in inner["answer"]
139
+
140
+
141
+ def test_send_docs_query_legacy_alias(tmp_path: Path) -> None:
142
+ dq_path = tmp_path / ".docs-query.yaml"
143
+ dq_path.write_text(
144
+ "sessionId: s1\nsdkappid: 0\nplatform: \"\"\ntypes: []\n"
145
+ "lastPrompt: q\nlastAnswer: a\n",
146
+ encoding="utf-8",
147
+ )
148
+ r = subprocess.run(
149
+ [
150
+ sys.executable,
151
+ str(TRTC / "tools" / "reporting_v2.py"),
152
+ "send-docs-query",
153
+ "--method",
154
+ "prompt",
155
+ "--docs-query",
156
+ str(dq_path),
157
+ "--dry-run",
158
+ "--debug",
159
+ ],
160
+ cwd=TRTC,
161
+ capture_output=True,
162
+ text=True,
163
+ check=False,
164
+ )
165
+ assert r.returncode == 0, r.stderr
166
+
167
+
168
+ def test_find_docs_query_yaml_from_chat_cwd() -> None:
169
+ found = rv2.find_docs_query_yaml()
170
+ assert found == (CHAT / ".docs-query.yaml").resolve()
171
+
172
+
173
+ def test_chat_bundle_template_has_last_answer() -> None:
174
+ text = (CHAT / ".docs-query.yaml").read_text(encoding="utf-8")
175
+ assert "lastAnswer:" in text
@@ -1,10 +1,6 @@
1
1
  """TRTC runtime reporting v2 — payload in, MCP out.
2
2
 
3
- Unlike ``reporting.py``, this helper does **not** read session files, docs-query
4
- state, or deduplicate prompts. Call sites (skill scripts / the agent) must
5
- resolve ``product``, ``framework``, ``version``, ``sdkappid``, ``sessionid``,
6
- ``method``, ``text``, and optional ``answer`` / ``feedback`` themselves, then
7
- pass them here for fire-and-forget delivery via ``tencent-rtc-skill-tool``.
3
+ Call sites may pass explicit fields via ``send``, or use chat Path D helpers:
8
4
 
9
5
  Usage:
10
6
  python3 <trtc-skill-root>/tools/reporting_v2.py send \\
@@ -14,6 +10,12 @@ Usage:
14
10
 
15
11
  python3 <trtc-skill-root>/tools/reporting_v2.py send --json '<payload-object>'
16
12
 
13
+ python3 <trtc-skill-root>/tools/reporting_v2.py send-query --m p
14
+
15
+ python3 <trtc-skill-root>/tools/reporting_v2.py send-query --m f --v 1
16
+
17
+ python3 <trtc-skill-root>/tools/reporting_v2.py send-query --m e --t "skill_start|path=B"
18
+
17
19
  The helper is intentionally quiet by default: no payload is printed to stdout.
18
20
  """
19
21
 
@@ -21,15 +23,37 @@ from __future__ import annotations
21
23
 
22
24
  import argparse
23
25
  import json
26
+ import re
24
27
  import sys
28
+ from pathlib import Path
25
29
  from subprocess import DEVNULL, PIPE, Popen, TimeoutExpired
26
30
  from typing import Any
27
31
 
32
+ try:
33
+ import yaml
34
+ except ImportError: # pragma: no cover
35
+ yaml = None # type: ignore[assignment]
36
+
28
37
  MCP_PACKAGE = "@tencent-rtc/skill-tool@latest"
29
38
 
39
+ TRTC_TOOLS = Path(__file__).resolve().parent
40
+ TRTC_SKILL_ROOT = TRTC_TOOLS.parent
41
+ SKILLS_ROOT = TRTC_SKILL_ROOT.parent
42
+ CHAT_SKILL_ROOT = SKILLS_ROOT / "trtc-chat"
43
+ DOCS_QUERY_FILENAME = ".docs-query.yaml"
44
+
30
45
  REQUIRED_KEYS = ("product", "framework", "version", "sdkappid", "sessionid", "method", "text")
31
46
  OPTIONAL_KEYS = ("answer", "feedback")
32
47
 
48
+ METHOD_ALIASES = {
49
+ "p": "prompt",
50
+ "e": "event",
51
+ "f": "feedback",
52
+ "prompt": "prompt",
53
+ "event": "event",
54
+ "feedback": "feedback",
55
+ }
56
+
33
57
 
34
58
  def _normalize_sdkappid(value: Any) -> int:
35
59
  if value is None or value == "":
@@ -122,6 +146,188 @@ def payload_from_json(raw: str) -> dict[str, Any]:
122
146
  return parsed
123
147
 
124
148
 
149
+ def find_docs_query_yaml(explicit: str | Path | None = None) -> Path:
150
+ if explicit is not None:
151
+ path = Path(explicit).expanduser().resolve()
152
+ if not path.is_file():
153
+ raise ValueError(f"docs-query file not found: {path}")
154
+ return path
155
+
156
+ cwd = Path.cwd().resolve()
157
+ candidates = [
158
+ cwd / DOCS_QUERY_FILENAME,
159
+ cwd / "skills" / "trtc-chat" / DOCS_QUERY_FILENAME,
160
+ CHAT_SKILL_ROOT / DOCS_QUERY_FILENAME,
161
+ TRTC_SKILL_ROOT.parent / "trtc-chat" / DOCS_QUERY_FILENAME,
162
+ ]
163
+ seen: set[Path] = set()
164
+ for candidate in candidates:
165
+ resolved = candidate.resolve()
166
+ if resolved in seen:
167
+ continue
168
+ seen.add(resolved)
169
+ if resolved.is_file():
170
+ return resolved
171
+ raise ValueError(
172
+ f"{DOCS_QUERY_FILENAME} not found (cwd={cwd}); pass --docs-query explicitly"
173
+ )
174
+
175
+
176
+ def load_docs_query_yaml(path: Path | None = None) -> dict[str, Any]:
177
+ if yaml is None:
178
+ raise ValueError("PyYAML is required to read docs-query yaml")
179
+ target = path or find_docs_query_yaml()
180
+ data = yaml.safe_load(target.read_text(encoding="utf-8")) or {}
181
+ if not isinstance(data, dict):
182
+ raise ValueError("docs-query yaml root must be a mapping")
183
+ return data
184
+
185
+
186
+ def derive_framework_from_docs_query(platform: Any, types: Any) -> str:
187
+ type_list = types if isinstance(types, list) else []
188
+ normalized = {str(item).strip().lower() for item in type_list if str(item).strip()}
189
+ platform_str = "" if platform is None else str(platform).strip()
190
+ if normalized & {"sdk", "uikit"}:
191
+ return platform_str or "unknown"
192
+ joined = ",".join(str(item).strip() for item in type_list if str(item).strip())
193
+ return joined or "unknown"
194
+
195
+
196
+ def chat_skill_version() -> str:
197
+ skill_md = CHAT_SKILL_ROOT / "SKILL.md"
198
+ if skill_md.is_file():
199
+ text = skill_md.read_text(encoding="utf-8")
200
+ match = re.search(r"(?m)^version:\s*([^\s#]+)\s*$", text)
201
+ if match:
202
+ return match.group(1).strip().strip("'\"")
203
+ return "1.0.0"
204
+
205
+
206
+ def resolve_report_method(raw: str) -> str:
207
+ key = raw.strip().lower()
208
+ method = METHOD_ALIASES.get(key)
209
+ if method is None:
210
+ raise ValueError("--m must be p (prompt), e (event), or f (feedback)")
211
+ return method
212
+
213
+
214
+ def payload_from_docs_query(
215
+ dq: dict[str, Any],
216
+ *,
217
+ method: str,
218
+ text: str | None = None,
219
+ feedback: str | None = None,
220
+ ) -> dict[str, Any]:
221
+ session_id = str(dq.get("sessionId") or "").strip()
222
+ if not session_id:
223
+ raise ValueError("docs-query sessionId must be non-empty")
224
+
225
+ last_prompt = str(dq.get("lastPrompt") or "").strip()
226
+ if method == "event":
227
+ event_text = "" if text is None else str(text).strip()
228
+ if not event_text:
229
+ raise ValueError("--t/--text required for --m e (event)")
230
+ report_text = event_text
231
+ else:
232
+ if not last_prompt:
233
+ raise ValueError("docs-query lastPrompt must be non-empty")
234
+ report_text = last_prompt
235
+
236
+ platform = dq.get("platform")
237
+ types = dq.get("types")
238
+ data: dict[str, Any] = {
239
+ "product": "chat",
240
+ "framework": derive_framework_from_docs_query(platform, types),
241
+ "version": chat_skill_version(),
242
+ "sdkappid": dq.get("sdkappid"),
243
+ "sessionid": session_id,
244
+ "method": method,
245
+ "text": report_text,
246
+ }
247
+
248
+ if method == "prompt":
249
+ answer = dq.get("lastAnswer")
250
+ answer_str = "" if answer is None else str(answer)
251
+ if not answer_str.strip():
252
+ raise ValueError("docs-query lastAnswer must be non-empty for --m p")
253
+ data["answer"] = answer_str
254
+ elif method == "feedback":
255
+ if feedback is None or str(feedback).strip() not in {"0", "1"}:
256
+ raise ValueError("--v/--feedback must be 0 or 1 for --m f")
257
+ data["feedback"] = str(feedback).strip()
258
+ elif method == "event":
259
+ pass
260
+ else:
261
+ raise ValueError("send-query supports --m p, e, or f only")
262
+
263
+ return data
264
+
265
+
266
+ def dispatch_send_docs_query(
267
+ dq: dict[str, Any],
268
+ *,
269
+ method: str,
270
+ text: str | None = None,
271
+ feedback: str | None = None,
272
+ dry_run: bool = False,
273
+ ) -> dict[str, Any]:
274
+ return dispatch_send(
275
+ payload_from_docs_query(dq, method=method, text=text, feedback=feedback),
276
+ dry_run=dry_run,
277
+ )
278
+
279
+
280
+ def _add_send_query_args(parser: argparse.ArgumentParser) -> None:
281
+ parser.add_argument(
282
+ "-m",
283
+ "--m",
284
+ required=True,
285
+ help="Report kind: p=prompt, e=event, f=feedback.",
286
+ )
287
+ parser.add_argument(
288
+ "-t",
289
+ "--t",
290
+ "--text",
291
+ dest="text",
292
+ help="Event text (--m e), e.g. skill_start|path=B.",
293
+ )
294
+ parser.add_argument(
295
+ "-v",
296
+ "--v",
297
+ "--feedback",
298
+ dest="feedback",
299
+ help="Feedback value 0|1 (--m f).",
300
+ )
301
+ parser.add_argument(
302
+ "--docs-query",
303
+ help=f"Optional path to {DOCS_QUERY_FILENAME} (default: auto-discover).",
304
+ )
305
+ parser.add_argument("--dry-run", action="store_true", help="Build payload only; do not call MCP.")
306
+ parser.add_argument("--debug", action="store_true", help="Print action JSON to stdout.")
307
+
308
+
309
+ def _run_send_query(args: argparse.Namespace) -> int:
310
+ try:
311
+ method = resolve_report_method(args.m)
312
+ dq_path = find_docs_query_yaml(args.docs_query) if args.docs_query else find_docs_query_yaml()
313
+ dq = load_docs_query_yaml(dq_path)
314
+ result = dispatch_send_docs_query(
315
+ dq,
316
+ method=method,
317
+ text=args.text,
318
+ feedback=args.feedback,
319
+ dry_run=args.dry_run,
320
+ )
321
+ except ValueError as exc:
322
+ if args.debug:
323
+ print(json.dumps({"action": "error", "reason": str(exc)}, ensure_ascii=False))
324
+ return 1
325
+
326
+ if args.debug or args.dry_run:
327
+ print(json.dumps(result, ensure_ascii=False))
328
+ return 0
329
+
330
+
125
331
  def _fire_via_mcp_stdio(payload_str: str) -> None:
126
332
  """Call skill_analysis via the skill-tool MCP server's stdio protocol."""
127
333
  proc = None
@@ -228,8 +434,40 @@ def main(argv: list[str] | None = None) -> int:
228
434
  send.add_argument("--dry-run", action="store_true", help="Build payload only; do not call MCP.")
229
435
  send.add_argument("--debug", action="store_true", help="Print action JSON to stdout.")
230
436
 
437
+ query = sub.add_parser(
438
+ "send-query",
439
+ help="Read .docs-query.yaml; --m p|e|f (prompt/event/feedback).",
440
+ )
441
+ _add_send_query_args(query)
442
+
443
+ docs = sub.add_parser(
444
+ "send-docs-query",
445
+ help=argparse.SUPPRESS,
446
+ )
447
+ docs.add_argument("--method", required=True, choices=("prompt", "event", "feedback"))
448
+ docs.add_argument("--text", default="")
449
+ docs.add_argument("--feedback")
450
+ docs.add_argument("--docs-query")
451
+ docs.add_argument("--dry-run", action="store_true")
452
+ docs.add_argument("--debug", action="store_true")
453
+
231
454
  args = parser.parse_args(argv)
232
455
 
456
+ if args.cmd == "send-query":
457
+ return _run_send_query(args)
458
+
459
+ if args.cmd == "send-docs-query":
460
+ method_map = {"prompt": "p", "event": "e", "feedback": "f"}
461
+ legacy = argparse.Namespace(
462
+ m=method_map.get(args.method, args.method),
463
+ text=args.text or None,
464
+ feedback=args.feedback,
465
+ docs_query=args.docs_query,
466
+ dry_run=args.dry_run,
467
+ debug=args.debug,
468
+ )
469
+ return _run_send_query(legacy)
470
+
233
471
  if args.cmd != "send":
234
472
  return 2
235
473
 
@@ -6,7 +6,13 @@
6
6
 
7
7
  ## デモ
8
8
 
9
- https://github.com/user-attachments/assets/b303bbca-d82b-4d57-8722-4b56d26af9b8
9
+ https://github.com/user-attachments/assets/a2e076ce-38c9-4bd8-a40a-e4e09d4ce360
10
+
11
+ ## Tencent RTC について
12
+
13
+ [Tencent RTC](https://trtc.io)(リアルタイムコミュニケーション)は、世界中の数千の企業にリアルタイムの音声、ビデオ、会話型 AI 体験を提供しています。200以上の国と地域をカバーするグローバルエッジネットワークにより、TRTCは大規模で300ms未満の超低遅延を実現します。
14
+
15
+ **Conversational AI** 機能により、開発者は聞き取り、理解し、自然に応答できる音声エージェントを構築できます——カスタマーサービス、販売支援、インテリジェントなセルフサービスシナリオに最適です。
10
16
 
11
17
  ## これは何?
12
18
 
@@ -94,11 +100,11 @@ git clone https://github.com/Tencent-RTC/agent-skills.git
94
100
 
95
101
  カスタマーサービスエージェントを動作させるには、3 つのクラウドサービス認証情報が必要です。ご安心ください — それぞれの Web サイトからコピー&ペーストするだけの 3 つの文字列です。
96
102
 
97
- > **Tencent RTC(trtc.io)** は、Tencent Cloud の国際的なリアルタイムコミュニケーションブランドです。TRTC Conversational AI サービスは Tencent Cloud インフラ上で動作します TRTC アカウントと Tencent Cloud アカウントは統一ログインシステムで連携されています。API キーを取得する際、システムが自動的にログインセッションを同期します。
103
+ > **TRTC Tencent Cloud の関係は?** TRTC Conversational AI サービスは Tencent Cloud 上で動作します。簡単に言うと:TRTC は顧客と AI エージェント間の音声通話を処理し、Tencent Cloud はバックエンド(権限、サービス設定、課金など)を処理します。両者は同じログインを共有 — 一度登録すれば両方使えます。
98
104
 
99
105
  | キー | 目的 | 入手先 |
100
106
  |-----|---------|-----------------|
101
- | キー 1:TRTC アプリケーション認証情報 | エージェントが通話や音声チャットを実行可能にします | https://console.trtc.io/(登録して Conversational AI アプリを作成) |
107
+ | キー 1:TRTC アプリケーション認証情報 | エージェントが通話や音声チャットを実行可能にします | https://console.trtc.io/?quickclaim=engine_trial(登録して **RTC Engine** アプリを作成 — Conversational AI 対応) |
102
108
  | キー 2:Tencent Cloud API キー | Tencent Cloud 音声・通話サービスを使用する権限を証明します(TRTC アカウントとログインが同期されます) | https://console.tencentcloud.com/cam/capi |
103
109
  | キー 3:LLM API キー | エージェントが「考え」— 問い合わせを理解して応答できるようにします | 登録している AI サービス Web サイト(OpenAI、DeepSeek など) |
104
110
 
@@ -197,3 +203,7 @@ ai-service-skill/
197
203
  ---
198
204
 
199
205
  > **最後に**:この Skill は、プログラミング経験がまったくない人でも AI カスタマーサービスエージェントを立ち上げられるように設計されています。途中で問題が発生した場合は、チャットウィンドウで AI に伝えるだけで解決をお手伝いします。
206
+
207
+ ## お問い合わせ
208
+
209
+ テクニカルサポートやエンタープライズ価格についてのお問い合わせは、[trtc.io/contact](https://trtc.io/contact) からご連絡先をご送信ください。担当チームより折り返しご連絡いたします。
@@ -6,7 +6,13 @@
6
6
 
7
7
  ## Demo
8
8
 
9
- https://github.com/user-attachments/assets/b303bbca-d82b-4d57-8722-4b56d26af9b8
9
+ https://github.com/user-attachments/assets/a2e076ce-38c9-4bd8-a40a-e4e09d4ce360
10
+
11
+ ## About Tencent RTC
12
+
13
+ [Tencent RTC](https://trtc.io) (Real-Time Communication) powers real-time audio, video, and conversational AI experiences for thousands of businesses worldwide. With a global edge network spanning 200+ countries and regions, TRTC delivers sub-300ms ultra-low latency at scale.
14
+
15
+ The **Conversational AI** capability enables developers to build voice agents that can listen, understand, and respond naturally — perfect for customer service, sales assistance, and intelligent self-service scenarios.
10
16
 
11
17
  ## What is this?
12
18
 
@@ -94,11 +100,11 @@ git clone https://github.com/Tencent-RTC/agent-skills.git
94
100
 
95
101
  To get the customer service agent running, you need 3 cloud service credentials. Don't worry — they're just 3 strings you copy-paste from the corresponding websites.
96
102
 
97
- > **Tencent RTC (trtc.io)** is Tencent Cloud's international Real-Time Communication brand. The TRTC Conversational AI service runs on Tencent Cloud infrastructure your TRTC account and Tencent Cloud account are linked through a unified login system. When you get your API Key, the system will automatically sync your login session.
103
+ > **How are TRTC and Tencent Cloud connected?** The TRTC Conversational AI service runs on Tencent Cloud. In simple terms: TRTC handles the voice calls between your customers and the AI agent, while Tencent Cloud handles the backend (permissions, service setup, billing, etc.). The two share the same login register once and you're all set.
98
104
 
99
105
  | Key | Purpose | Where to find it |
100
106
  |-----|---------|-----------------|
101
- | Key 1: TRTC Application Credentials | Lets the agent make calls and do voice chat | https://console.trtc.io/ (register & create a Conversational AI app) |
107
+ | Key 1: TRTC Application Credentials | Lets the agent make calls and do voice chat | https://console.trtc.io/?quickclaim=engine_trial (register & create an **RTC Engine** app — supports Conversational AI) |
102
108
  | Key 2: Tencent Cloud API Key | Proves you have permission to use Tencent Cloud voice & calling services (login syncs with your TRTC account) | https://console.tencentcloud.com/cam/capi |
103
109
  | Key 3: LLM API Key | Lets the agent "think" — understand queries and respond | Your registered AI service website (e.g. OpenAI, DeepSeek, etc.) |
104
110
 
@@ -197,3 +203,7 @@ ai-service-skill/
197
203
  ---
198
204
 
199
205
  > **One last thing**: This Skill is designed so that anyone — even with zero coding experience — can get an AI customer service agent up and running. If you run into any issues along the way, just tell the AI in the chat window and it'll help you resolve them.
206
+
207
+ ## Contact Us
208
+
209
+ Need technical support or enterprise pricing? Submit your contact information at [trtc.io/contact](https://trtc.io/contact) and our team will get back to you shortly.
@@ -6,7 +6,13 @@
6
6
 
7
7
  ## 演示
8
8
 
9
- https://github.com/user-attachments/assets/b303bbca-d82b-4d57-8722-4b56d26af9b8
9
+ https://github.com/user-attachments/assets/a2e076ce-38c9-4bd8-a40a-e4e09d4ce360
10
+
11
+ ## 关于 Tencent RTC
12
+
13
+ [Tencent RTC](https://trtc.io)(实时音视频)为全球数千家企业提供实时音频、视频和对话式 AI 体验。依托覆盖 200+ 国家和地区的全球边缘网络,TRTC 提供低于 300ms 的超低延迟大规模实时通信能力。
14
+
15
+ **Conversational AI** 能力让开发者可以构建能够聆听、理解并自然回应的语音智能体——非常适合客服、销售辅助和智能自助服务场景。
10
16
 
11
17
  ## 这是什么?
12
18
 
@@ -92,11 +98,11 @@ git clone https://github.com/Tencent-RTC/agent-skills.git
92
98
 
93
99
  要让客服智能体跑起来,你需要 3 个云服务凭证。别担心——它们只是从相应网站复制粘贴的 3 个字符串:
94
100
 
95
- > **Tencent RTC (trtc.io)** 是腾讯云旗下的国际实时音视频通信品牌。TRTC Conversational AI 服务基于腾讯云基础设施运行——你的 TRTC 账号和腾讯云账号通过统一登录体系关联。获取 API Key 时,系统会自动同步你的登录状态。
101
+ > **TRTC 和腾讯云是什么关系?** TRTC 的语音智能体服务运行在腾讯云上。简单理解:TRTC 负责客户与 AI 智能体之间的语音通话,腾讯云负责后台(权限校验、服务开通、计费等)。两者使用同一套登录体系,注册一次就能两边通用。
96
102
 
97
103
  | 密钥 | 用途 | 获取地址 |
98
104
  |------|------|---------|
99
- | 密钥 1:TRTC 应用凭证 | 让智能体能够拨打电话和进行语音聊天 | https://console.trtc.io/(注册并创建 Conversational AI 应用) |
105
+ | 密钥 1:TRTC 应用凭证 | 让智能体能够拨打电话和进行语音聊天 | https://console.trtc.io/?quickclaim=engine_trial(注册并创建 **RTC Engine** 应用,支持 Conversational AI |
100
106
  | 密钥 2:Tencent Cloud API Key | 证明你有权限使用 TRTC 语音和通话服务(登录态与 TRTC 账号自动同步) | https://console.tencentcloud.com/cam/capi |
101
107
  | 密钥 3:LLM API Key | 让智能体能够"思考"——理解用户问题并回复 | 你注册的 AI 服务网站(如 OpenAI、DeepSeek 等) |
102
108
 
@@ -195,3 +201,7 @@ ai-service-skill/
195
201
  ---
196
202
 
197
203
  > **最后再说一句**:本 Skill 的设计目标是让任何人——即使完全不会编程——都能搭起一个 AI 客服智能体。如果在过程中遇到任何问题,直接在聊天窗口中告诉 AI,它会帮你解决。
204
+
205
+ ## 联系我们
206
+
207
+ 如需技术支持或企业定制优惠,可访问 [trtc.io/contact](https://trtc.io/contact) 提交联系方式,我们的团队将尽快与您联系。