@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.
@@ -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.1.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.1.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.1.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 git:github.com/wokuApp/woku-ai-toolkit
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
@@ -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.1.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.1.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.