@wokuapp/ai-toolkit 0.1.0 → 0.2.0
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +2 -2
- package/CHANGELOG.md +9 -0
- package/README.md +4 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/skills/woku-sdk-javascript/SKILL.md +98 -0
- package/skills/woku-sdk-python/SKILL.md +121 -0
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
"name": "woku",
|
|
12
12
|
"source": "./",
|
|
13
13
|
"description": "Design a listening program for your customer journey, run the VoC instruments (NPS, CSAT, CES, wokus), and turn every signal into a support ticket or an action plan, through woku's MCP server.",
|
|
14
|
-
"version": "0.
|
|
14
|
+
"version": "0.2.0",
|
|
15
15
|
"author": { "name": "woku" },
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"homepage": "https://woku.app",
|
|
18
|
-
"keywords": ["woku", "mcp", "voice-of-customer", "cx", "nps", "csat", "ces", "surveys", "feedback"]
|
|
18
|
+
"keywords": ["woku", "mcp", "voice-of-customer", "cx", "nps", "csat", "ces", "surveys", "feedback", "sdk"]
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
21
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "woku",
|
|
3
3
|
"description": "Voice-of-customer for Claude Code. Design a listening program for your customer journey, run the fast VoC instruments (NPS, CSAT, CES, wokus), and turn every signal into a support ticket or an action plan, through woku's MCP server. Bundles the woku method so the agent acts as a CX consultant.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"author": { "name": "woku" },
|
|
6
6
|
"homepage": "https://woku.app",
|
|
7
7
|
"license": "MIT",
|
|
8
|
-
"keywords": ["woku", "mcp", "voice-of-customer", "cx", "nps", "csat", "ces", "surveys", "feedback"]
|
|
8
|
+
"keywords": ["woku", "mcp", "voice-of-customer", "cx", "nps", "csat", "ces", "surveys", "feedback", "sdk"]
|
|
9
9
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "woku",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Voice-of-customer for OpenAI Codex. Design a listening program, run the VoC instruments (NPS, CSAT, CES, wokus), and turn every signal into a support ticket or an action plan, through woku's MCP server.",
|
|
5
5
|
"author": { "name": "woku" },
|
|
6
6
|
"homepage": "https://docs.woku.app/mcp/agent-guide",
|
|
7
7
|
"repository": "https://github.com/wokuApp/woku-ai-toolkit",
|
|
8
8
|
"license": "MIT",
|
|
9
|
-
"keywords": ["woku", "voice-of-customer", "cx", "nps", "csat", "ces", "surveys", "feedback"],
|
|
9
|
+
"keywords": ["woku", "voice-of-customer", "cx", "nps", "csat", "ces", "surveys", "feedback", "sdk"],
|
|
10
10
|
"skills": "./skills/",
|
|
11
11
|
"mcpServers": {
|
|
12
12
|
"woku": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
Add two developer skills so the agent can build server-side woku integrations in code, not only operate the account through the MCP server:
|
|
6
|
+
|
|
7
|
+
- `woku-sdk-javascript`: use the official `@wokuapp/sdk` (Node.js) to manage trackers, VoC tools, sends, tickets and action plans.
|
|
8
|
+
- `woku-sdk-python`: use the official `woku` package (sync and async over httpx) with the same surface.
|
|
9
|
+
|
|
10
|
+
Both skills are auto-discovered from `skills/`; no manifest changes are needed to load them.
|
|
11
|
+
|
|
3
12
|
## 0.1.0
|
|
4
13
|
|
|
5
14
|
Initial release. Bundles woku's MCP server connection (`https://api.woku.app/mcp`) and the woku skill (the woku method plus the `woku_guide` / `design_voc_program` entry points). Plugin manifests for Claude Code (`.claude-plugin/`), Codex (`.codex-plugin/`), OpenClaw (`openclaw.plugin.json`) and Pi (`package.json`). OpenCode, claude.ai and ChatGPT connect to the MCP server through their own configuration.
|
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@ It bundles:
|
|
|
8
8
|
|
|
9
9
|
- The **woku MCP server** connection (`https://api.woku.app/mcp`), so the agent gets the full catalog (143 tools) with woku's OAuth. No API keys to copy.
|
|
10
10
|
- The **woku skill**, which primes the agent with the method and tells it to call `woku_guide` first.
|
|
11
|
+
- The **woku SDK skills** for JavaScript (`@wokuapp/sdk`) and Python (`woku`), so the agent can build server-side woku integrations in code (create tools, send surveys, read responses, drive tickets and action plans) over the public `/v1` API.
|
|
11
12
|
|
|
12
13
|
## Install
|
|
13
14
|
|
|
@@ -61,9 +62,11 @@ OpenCode runs OAuth automatically on the first authenticated call. To start the
|
|
|
61
62
|
Install the plugin (this ships the woku skill):
|
|
62
63
|
|
|
63
64
|
```
|
|
64
|
-
openclaw plugins install
|
|
65
|
+
openclaw plugins install npm:@wokuapp/ai-toolkit
|
|
65
66
|
```
|
|
66
67
|
|
|
68
|
+
You can also install from the git repository with `openclaw plugins install git:github.com/wokuApp/woku-ai-toolkit`.
|
|
69
|
+
|
|
67
70
|
OpenClaw's plugin manifest declares local MCP servers only, so add woku's remote MCP server (`https://api.woku.app/mcp`) through your OpenClaw MCP configuration.
|
|
68
71
|
|
|
69
72
|
### Pi
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "woku-ai-toolkit",
|
|
3
3
|
"name": "woku AI Toolkit",
|
|
4
4
|
"description": "Voice-of-customer for your agent. Design a listening program, run the VoC instruments (NPS, CSAT, CES, wokus), and turn every signal into a support ticket or an action plan, through woku's MCP server.",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.2.0",
|
|
6
6
|
"skills": ["./skills"],
|
|
7
7
|
"configSchema": {
|
|
8
8
|
"type": "object",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wokuapp/ai-toolkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "woku AI Toolkit: connect your agent to woku's voice-of-customer platform. Design VoC programs and turn customer feedback into support tickets and action plans, through woku's MCP server.",
|
|
5
5
|
"author": "woku",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"ces",
|
|
20
20
|
"surveys",
|
|
21
21
|
"feedback",
|
|
22
|
+
"sdk",
|
|
22
23
|
"plugin",
|
|
23
24
|
"pi-package"
|
|
24
25
|
],
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: woku-sdk-javascript
|
|
3
|
+
description: "Build a server-side woku integration in JavaScript or TypeScript with the official @wokuapp/sdk. Use when the user wants to manage their woku account from a Node.js backend: create trackers and VoC tools (NPS, CSAT, CES), send surveys by email or WhatsApp, read responses and delivery, curate support tickets, or drive action plans in code. This is server-only (secret key); for capturing feedback in a mobile app use @wokuapp/react-native instead."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# woku SDK for JavaScript and TypeScript
|
|
7
|
+
|
|
8
|
+
`@wokuapp/sdk` is the official **server-side** client for the woku management API
|
|
9
|
+
(`/v1`). Use it when the user wants woku operations in their Node.js backend
|
|
10
|
+
instead of raw HTTP. It is typed, retries transient failures, makes creates
|
|
11
|
+
idempotent, and auto-paginates lists.
|
|
12
|
+
|
|
13
|
+
**Server-only.** The company secret key grants full management access. Keep it on
|
|
14
|
+
the backend, never in a browser, mobile app or other untrusted client. For
|
|
15
|
+
capturing feedback from a mobile app, use `@wokuapp/react-native` (a public
|
|
16
|
+
capture key) instead.
|
|
17
|
+
|
|
18
|
+
## Install and initialize
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @wokuapp/sdk
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Requires Node.js 18+. Create one client and reuse it. The key comes from
|
|
25
|
+
`WOKU_API_KEY` when you omit `apiKey`; the user gets it from the company
|
|
26
|
+
Information section at admin.woku.app.
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { Woku } from '@wokuapp/sdk';
|
|
30
|
+
|
|
31
|
+
const woku = new Woku({ apiKey: process.env.WOKU_API_KEY });
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Core operations
|
|
35
|
+
|
|
36
|
+
Creates are idempotent (auto `Idempotency-Key`); actions (send, test, reply) are
|
|
37
|
+
never auto-retried.
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// Tracker definitions and values (wire your CRM/ERP ids to feedback tools).
|
|
41
|
+
const tracker = await woku.trackers.create({ name: 'Store #1', system: 'retail' });
|
|
42
|
+
await woku.trackers.assignToWoku('woku_123', { name: 'Store #1', value: 'TX-42' });
|
|
43
|
+
|
|
44
|
+
// VoC tools: npsTools / csatTools / cesTools (create/list/get/update/delete).
|
|
45
|
+
const tool = await woku.npsTools.create({
|
|
46
|
+
name: 'Post-purchase',
|
|
47
|
+
npsMessage: 'How likely are you to recommend us?',
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Send a survey. IMPORTANT: `channel` is required and `recipients` is an array
|
|
51
|
+
// of bare strings (emails for email, phone numbers for whatsapp), NOT objects.
|
|
52
|
+
await woku.nps.sendInvitations({
|
|
53
|
+
channel: 'email',
|
|
54
|
+
npsToolId: tool._id,
|
|
55
|
+
recipients: ['ana@example.com'],
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Read responses and delivery/response-rate.
|
|
59
|
+
for await (const r of await woku.nps.listResponses()) console.log(r);
|
|
60
|
+
const delivery = await woku.dispatches.stats({ channel: 'email' });
|
|
61
|
+
|
|
62
|
+
// Support tickets (AI-generated): list, filter, curate.
|
|
63
|
+
for await (const t of await woku.tickets.list({ severity: 'high' })) console.log(t.title);
|
|
64
|
+
|
|
65
|
+
// Action plans: approve and send to Jira/Monday/ClickUp/Notion or manage in woku.
|
|
66
|
+
await woku.actionPlans.approve('plan_123');
|
|
67
|
+
await woku.actionPlans.send('plan_123', {
|
|
68
|
+
provider: 'jira',
|
|
69
|
+
target: { projectId: '10032', issueTypeId: '10001' },
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Namespaces: `trackers`, `npsTools` / `csatTools` / `cesTools`, `nps` / `csat` /
|
|
74
|
+
`ces`, `wokus`, `forms`, `flows`, `actionPlans`, `actionPlanGroups`, `tickets`,
|
|
75
|
+
`ticketDestinations`, `dispatches`, `reports`, `company`, `quarantines`.
|
|
76
|
+
|
|
77
|
+
## Pagination, errors, retries
|
|
78
|
+
|
|
79
|
+
- List methods return a `Page`: iterate items with `for await (const x of page)`,
|
|
80
|
+
or walk pages with `page.hasNextPage()` and `page.getNextPage()`.
|
|
81
|
+
- Every failure is a `WokuError`. HTTP errors are typed subclasses
|
|
82
|
+
(`NotFoundError`, `RateLimitError`, `AuthenticationError`, ...) carrying
|
|
83
|
+
`status`, the parsed body and the server `requestId`. Transport failures are
|
|
84
|
+
`WokuConnectionError` / `WokuTimeoutError`.
|
|
85
|
+
- GETs and idempotent writes retry automatically with backoff, honoring the
|
|
86
|
+
`Retry-After` header.
|
|
87
|
+
|
|
88
|
+
## Rotating the key
|
|
89
|
+
|
|
90
|
+
`woku.company.rotateKey()` returns a new secret key and immediately invalidates
|
|
91
|
+
the old one; store the returned key. `woku.company.revokeKey()` disables the key.
|
|
92
|
+
|
|
93
|
+
## When to reach for the reference
|
|
94
|
+
|
|
95
|
+
For the full method list, request/response shapes and per-call options, point the
|
|
96
|
+
user to the SDK page at https://docs.woku.app/development/sdk-javascript and the
|
|
97
|
+
API reference at https://docs.woku.app/development/api. There is an equivalent
|
|
98
|
+
Python SDK (`woku`) documented at /development/sdk-python.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: woku-sdk-python
|
|
3
|
+
description: "Build a server-side woku integration in Python with the official woku package. Use when the user wants to manage their woku account from a Python backend: create trackers and VoC tools (NPS, CSAT, CES), send surveys by email or WhatsApp, read responses and delivery, curate support tickets, or drive action plans in code. Sync and async clients over httpx. This is server-only (secret key); for capturing feedback in a mobile app use @wokuapp/react-native instead."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# woku SDK for Python
|
|
7
|
+
|
|
8
|
+
The `woku` package is the official **server-side** client for the woku
|
|
9
|
+
management API (`/v1`), over `httpx`. Use it when the user wants woku operations
|
|
10
|
+
in their Python backend instead of raw HTTP. It offers a synchronous client
|
|
11
|
+
(`Woku`) and an asynchronous twin (`AsyncWoku`), typed request models, automatic
|
|
12
|
+
retries, idempotent creates and auto-pagination. It is the counterpart of the
|
|
13
|
+
JavaScript SDK (`@wokuapp/sdk`), with the same surface.
|
|
14
|
+
|
|
15
|
+
**Server-only.** The company secret key grants full management access. Keep it on
|
|
16
|
+
the backend, never in a client you do not control. For capturing feedback from a
|
|
17
|
+
mobile app, use `@wokuapp/react-native` instead.
|
|
18
|
+
|
|
19
|
+
## Install and initialize
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install woku
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Requires Python 3.9+. Create one client and reuse it. The key comes from
|
|
26
|
+
`WOKU_API_KEY` when you omit `api_key`; the user gets it from the company
|
|
27
|
+
Information section at admin.woku.app. Request bodies accept a plain dict (as
|
|
28
|
+
below) or a generated Pydantic model from `woku._generated.models`.
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
from woku import Woku
|
|
32
|
+
|
|
33
|
+
woku = Woku(api_key="sk_...") # or set WOKU_API_KEY and call Woku()
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Core operations
|
|
37
|
+
|
|
38
|
+
Creates are idempotent (auto `Idempotency-Key`); actions (send, test, reply) are
|
|
39
|
+
never auto-retried.
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
# Tracker definitions and values (wire your CRM/ERP ids to feedback tools).
|
|
43
|
+
tracker = woku.trackers.create({"name": "Store #1", "system": "retail"})
|
|
44
|
+
woku.trackers.assign_to_woku("woku_123", {"name": "Store #1", "value": "TX-42"})
|
|
45
|
+
|
|
46
|
+
# VoC tools: nps_tools / csat_tools / ces_tools (create/list/get/update/delete).
|
|
47
|
+
tool = woku.nps_tools.create(
|
|
48
|
+
{"name": "Post-purchase", "npsMessage": "How likely are you to recommend us?"}
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# Send a survey. IMPORTANT: `channel` is required and `recipients` is a list of
|
|
52
|
+
# bare strings (emails for email, phone numbers for whatsapp), NOT objects.
|
|
53
|
+
woku.nps.send_invitations(
|
|
54
|
+
{"channel": "email", "npsToolId": tool["_id"], "recipients": ["ana@example.com"]}
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Read responses and delivery/response-rate.
|
|
58
|
+
for r in woku.nps.list_responses():
|
|
59
|
+
print(r)
|
|
60
|
+
delivery = woku.dispatches.stats({"channel": "email"})
|
|
61
|
+
|
|
62
|
+
# Support tickets (AI-generated): list, filter, curate.
|
|
63
|
+
for t in woku.tickets.list({"severity": "high"}):
|
|
64
|
+
print(t["title"])
|
|
65
|
+
|
|
66
|
+
# Action plans: approve and send to Jira/Monday/ClickUp/Notion or manage in woku.
|
|
67
|
+
woku.action_plans.approve("plan_123")
|
|
68
|
+
woku.action_plans.send(
|
|
69
|
+
"plan_123",
|
|
70
|
+
{"provider": "jira", "target": {"projectId": "10032", "issueTypeId": "10001"}},
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Namespaces: `trackers`, `nps_tools` / `csat_tools` / `ces_tools`, `nps` / `csat`
|
|
75
|
+
/ `ces`, `wokus`, `forms`, `flows`, `action_plans`, `action_plan_groups`,
|
|
76
|
+
`tickets`, `ticket_destinations`, `dispatches`, `reports`, `company`,
|
|
77
|
+
`quarantines`.
|
|
78
|
+
|
|
79
|
+
## Async
|
|
80
|
+
|
|
81
|
+
Use `AsyncWoku` for awaitable methods and `async for` iteration; use it as a
|
|
82
|
+
context manager to close the connection pool.
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
import asyncio
|
|
86
|
+
from woku import AsyncWoku
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
async def main() -> None:
|
|
90
|
+
async with AsyncWoku(api_key="sk_...") as woku:
|
|
91
|
+
async for ticket in await woku.tickets.list({"severity": "high"}):
|
|
92
|
+
print(ticket["title"])
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
asyncio.run(main())
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Pagination, errors, retries
|
|
99
|
+
|
|
100
|
+
- Sync list methods return an iterable page: iterate items with `for x in page`,
|
|
101
|
+
or walk pages with `page.has_next_page()` and `page.get_next_page()`. The async
|
|
102
|
+
client iterates with `async for`.
|
|
103
|
+
- Every failure is a `WokuError`. HTTP errors are typed subclasses
|
|
104
|
+
(`NotFoundError`, `RateLimitError`, `AuthenticationError`, ...) carrying
|
|
105
|
+
`status`, the parsed body and the server `request_id`. Transport failures are
|
|
106
|
+
`WokuConnectionError` / `WokuTimeoutError`.
|
|
107
|
+
- GETs and idempotent writes retry automatically with backoff, honoring the
|
|
108
|
+
`Retry-After` header. Per-call overrides go in the `options` argument.
|
|
109
|
+
|
|
110
|
+
## Rotating the key
|
|
111
|
+
|
|
112
|
+
`woku.company.rotate_key()` returns a new secret key and immediately invalidates
|
|
113
|
+
the old one; store `result["secretKey"]`. `woku.company.revoke_key()` disables
|
|
114
|
+
the key.
|
|
115
|
+
|
|
116
|
+
## When to reach for the reference
|
|
117
|
+
|
|
118
|
+
For the full method list, request/response shapes and per-call options, point the
|
|
119
|
+
user to the SDK page at https://docs.woku.app/development/sdk-python and the API
|
|
120
|
+
reference at https://docs.woku.app/development/api. There is an equivalent
|
|
121
|
+
JavaScript SDK (`@wokuapp/sdk`) documented at /development/sdk-javascript.
|