ai-world-sdk 1.5.9 → 1.5.11

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 (173) hide show
  1. package/dist/cli/commands/plugin-token.d.ts +2 -0
  2. package/dist/cli/commands/plugin-token.js +181 -0
  3. package/dist/cli/index.js +2 -0
  4. package/dist/config.d.ts +3 -3
  5. package/dist/config.js +2 -2
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +4 -1
  8. package/dist/plugin-token.d.ts +71 -0
  9. package/dist/plugin-token.js +133 -0
  10. package/pacakges/ai-sdk-provider/.changeset/README.md +34 -0
  11. package/pacakges/ai-sdk-provider/.changeset/config.json +13 -0
  12. package/pacakges/ai-sdk-provider/.github/PULL_REQUEST_TEMPLATE.md +16 -0
  13. package/pacakges/ai-sdk-provider/.github/workflows/ci.yaml +24 -0
  14. package/pacakges/ai-sdk-provider/.github/workflows/publish-manual.yaml +36 -0
  15. package/pacakges/ai-sdk-provider/.github/workflows/publish.yaml +107 -0
  16. package/pacakges/ai-sdk-provider/.vscode/settings.json +32 -0
  17. package/pacakges/ai-sdk-provider/CHANGELOG.md +631 -0
  18. package/pacakges/ai-sdk-provider/CLAUDE.md +79 -0
  19. package/pacakges/ai-sdk-provider/CONTRIBUTING.md +241 -0
  20. package/pacakges/ai-sdk-provider/LICENSE +201 -0
  21. package/pacakges/ai-sdk-provider/README.md +426 -0
  22. package/pacakges/ai-sdk-provider/biome.json +122 -0
  23. package/pacakges/ai-sdk-provider/dist/index.d.mts +880 -0
  24. package/pacakges/ai-sdk-provider/dist/index.d.ts +880 -0
  25. package/pacakges/ai-sdk-provider/dist/index.js +5382 -0
  26. package/pacakges/ai-sdk-provider/dist/index.js.map +1 -0
  27. package/pacakges/ai-sdk-provider/dist/index.mjs +5348 -0
  28. package/pacakges/ai-sdk-provider/dist/index.mjs.map +1 -0
  29. package/pacakges/ai-sdk-provider/dist/internal/index.d.mts +723 -0
  30. package/pacakges/ai-sdk-provider/dist/internal/index.d.ts +723 -0
  31. package/pacakges/ai-sdk-provider/dist/internal/index.js +5112 -0
  32. package/pacakges/ai-sdk-provider/dist/internal/index.js.map +1 -0
  33. package/pacakges/ai-sdk-provider/dist/internal/index.mjs +5076 -0
  34. package/pacakges/ai-sdk-provider/dist/internal/index.mjs.map +1 -0
  35. package/pacakges/ai-sdk-provider/e2e/cache-control.test.ts +74 -0
  36. package/pacakges/ai-sdk-provider/e2e/embeddings/index.test.ts +128 -0
  37. package/pacakges/ai-sdk-provider/e2e/fixtures/pdfs/generate-pdfs.sh +181 -0
  38. package/pacakges/ai-sdk-provider/e2e/fixtures/pdfs/large.json +7 -0
  39. package/pacakges/ai-sdk-provider/e2e/fixtures/pdfs/large.pdf +12865 -70
  40. package/pacakges/ai-sdk-provider/e2e/gemini/reasoning-multiturn.test.ts +221 -0
  41. package/pacakges/ai-sdk-provider/e2e/issues/issue-160-toolcallid-uniqueness.test.ts +88 -0
  42. package/pacakges/ai-sdk-provider/e2e/issues/issue-166-finish-reason-null.test.ts +129 -0
  43. package/pacakges/ai-sdk-provider/e2e/issues/issue-171-cache-tool-key-ordering.test.ts +70 -0
  44. package/pacakges/ai-sdk-provider/e2e/issues/issue-181-tool-response-image.test.ts +199 -0
  45. package/pacakges/ai-sdk-provider/e2e/issues/issue-190-streamobject-flush-error.test.ts +114 -0
  46. package/pacakges/ai-sdk-provider/e2e/issues/issue-194-grok-invalid-json.test.ts +93 -0
  47. package/pacakges/ai-sdk-provider/e2e/issues/issue-196-anthropic-1h-cache-ttl.test.ts +85 -0
  48. package/pacakges/ai-sdk-provider/e2e/issues/issue-199-openai-pdf-processing.test.ts +102 -0
  49. package/pacakges/ai-sdk-provider/e2e/issues/issue-212-anthropic-web-search-online.test.ts +128 -0
  50. package/pacakges/ai-sdk-provider/e2e/issues/issue-234-prompt-caching.test.ts +201 -0
  51. package/pacakges/ai-sdk-provider/e2e/issues/issue-237-reasoning-linebreaks.test.ts +103 -0
  52. package/pacakges/ai-sdk-provider/e2e/issues/issue-248-gemini-web-search-empty-response.test.ts +210 -0
  53. package/pacakges/ai-sdk-provider/e2e/issues/issue-269-image-size-parameter.test.ts +208 -0
  54. package/pacakges/ai-sdk-provider/e2e/issues/issue-287-tool-calls-missing-arguments.test.ts +87 -0
  55. package/pacakges/ai-sdk-provider/e2e/issues/issue-341-cache-control-last-text-part.test.ts +138 -0
  56. package/pacakges/ai-sdk-provider/e2e/issues/issue-383-video-url-support.test.ts +120 -0
  57. package/pacakges/ai-sdk-provider/e2e/issues/issue-386-image-files-parameter.test.ts +109 -0
  58. package/pacakges/ai-sdk-provider/e2e/issues/issue-387-temperature-settings.test.ts +113 -0
  59. package/pacakges/ai-sdk-provider/e2e/issues/issue-389-system-cache-control.test.ts +107 -0
  60. package/pacakges/ai-sdk-provider/e2e/issues/issue-391-reasoning-effort-values.test.ts +121 -0
  61. package/pacakges/ai-sdk-provider/e2e/issues/issue-392-auto-router-plugin.test.ts +84 -0
  62. package/pacakges/ai-sdk-provider/e2e/issues/issue-394-reasoning-end-signature.test.ts +157 -0
  63. package/pacakges/ai-sdk-provider/e2e/issues/issue-407-token-usage-details.test.ts +141 -0
  64. package/pacakges/ai-sdk-provider/e2e/issues/issue-411-output-object-tools-conflict.test.ts +75 -0
  65. package/pacakges/ai-sdk-provider/e2e/issues/issue-412-mid-stream-termination.test.ts +217 -0
  66. package/pacakges/ai-sdk-provider/e2e/issues/issue-413-reasoning-metadata-bloat.test.ts +292 -0
  67. package/pacakges/ai-sdk-provider/e2e/issues/issue-413-tool-input-end-streaming.test.ts +167 -0
  68. package/pacakges/ai-sdk-provider/e2e/issues/issue-418-gemini-thought-signature.test.ts +171 -0
  69. package/pacakges/ai-sdk-provider/e2e/issues/issue-419-420-finish-reason-usage-fallback.test.ts +87 -0
  70. package/pacakges/ai-sdk-provider/e2e/issues/issue-419-usage-fallback.test.ts +106 -0
  71. package/pacakges/ai-sdk-provider/e2e/issues/issue-422-incomplete-error-information.test.ts +46 -0
  72. package/pacakges/ai-sdk-provider/e2e/issues/issue-423-signature-stripped.test.ts +165 -0
  73. package/pacakges/ai-sdk-provider/e2e/issues/issue-423-streaming-signature-loss.test.ts +161 -0
  74. package/pacakges/ai-sdk-provider/e2e/issues/issue-423-uimessage-roundtrip.test.ts +111 -0
  75. package/pacakges/ai-sdk-provider/e2e/issues/issue-424-anthropic-auto-cache.test.ts +66 -0
  76. package/pacakges/ai-sdk-provider/e2e/issues/issue-432-raw-response-body.test.ts +52 -0
  77. package/pacakges/ai-sdk-provider/e2e/issues/issue-438-gemini-reasoning-redacted.test.ts +120 -0
  78. package/pacakges/ai-sdk-provider/e2e/issues/issue-439-exact-payload.test.ts +108 -0
  79. package/pacakges/ai-sdk-provider/e2e/issues/issue-443-eager-input-streaming.test.ts +204 -0
  80. package/pacakges/ai-sdk-provider/e2e/issues/issue-453-signature-reopen.test.ts +203 -0
  81. package/pacakges/ai-sdk-provider/e2e/issues/issue-474-web-search-server-tool.test.ts +102 -0
  82. package/pacakges/ai-sdk-provider/e2e/issues/issue-483-response-format-strict-option.test.ts +199 -0
  83. package/pacakges/ai-sdk-provider/e2e/issues/issue-484-image-url-query-params.test.ts +165 -0
  84. package/pacakges/ai-sdk-provider/e2e/issues/issue-63-web-search-annotations.test.ts +159 -0
  85. package/pacakges/ai-sdk-provider/e2e/parallel-tool-calls.test.ts +425 -0
  86. package/pacakges/ai-sdk-provider/e2e/pdf-blob/index.test.ts +139 -0
  87. package/pacakges/ai-sdk-provider/e2e/pdf-url/index.test.ts +60 -0
  88. package/pacakges/ai-sdk-provider/e2e/reasoning-effort.test.ts +139 -0
  89. package/pacakges/ai-sdk-provider/e2e/reasoning-multiturn/index.test.ts +69 -0
  90. package/pacakges/ai-sdk-provider/e2e/tools-with-reasoning.test.ts +76 -0
  91. package/pacakges/ai-sdk-provider/e2e/tools.ts +61 -0
  92. package/pacakges/ai-sdk-provider/e2e/usage-accounting.test.ts +55 -0
  93. package/pacakges/ai-sdk-provider/e2e/utils.ts +15 -0
  94. package/pacakges/ai-sdk-provider/e2e/video-generation.test.ts +43 -0
  95. package/pacakges/ai-sdk-provider/e2e/web-search/index.test.ts +50 -0
  96. package/pacakges/ai-sdk-provider/example.env.e2e +3 -0
  97. package/pacakges/ai-sdk-provider/package.json +89 -0
  98. package/pacakges/ai-sdk-provider/pnpm-lock.yaml +3075 -0
  99. package/pacakges/ai-sdk-provider/pnpm-workspace.yaml +6 -0
  100. package/pacakges/ai-sdk-provider/src/chat/convert-to-openrouter-chat-messages.test.ts +3079 -0
  101. package/pacakges/ai-sdk-provider/src/chat/convert-to-openrouter-chat-messages.ts +618 -0
  102. package/pacakges/ai-sdk-provider/src/chat/errors.test.ts +97 -0
  103. package/pacakges/ai-sdk-provider/src/chat/file-parser-schema.test.ts +112 -0
  104. package/pacakges/ai-sdk-provider/src/chat/file-url-utils.ts +167 -0
  105. package/pacakges/ai-sdk-provider/src/chat/get-tool-choice.ts +42 -0
  106. package/pacakges/ai-sdk-provider/src/chat/index.test.ts +6093 -0
  107. package/pacakges/ai-sdk-provider/src/chat/index.ts +1300 -0
  108. package/pacakges/ai-sdk-provider/src/chat/is-url.ts +15 -0
  109. package/pacakges/ai-sdk-provider/src/chat/large-pdf-response.test.ts +108 -0
  110. package/pacakges/ai-sdk-provider/src/chat/payload-comparison.test.ts +154 -0
  111. package/pacakges/ai-sdk-provider/src/chat/schemas.ts +288 -0
  112. package/pacakges/ai-sdk-provider/src/chat/signature-roundtrip.test.ts +777 -0
  113. package/pacakges/ai-sdk-provider/src/completion/convert-to-openrouter-completion-prompt.ts +150 -0
  114. package/pacakges/ai-sdk-provider/src/completion/index.test.ts +958 -0
  115. package/pacakges/ai-sdk-provider/src/completion/index.ts +441 -0
  116. package/pacakges/ai-sdk-provider/src/completion/schemas.ts +67 -0
  117. package/pacakges/ai-sdk-provider/src/embedding/index.test.ts +262 -0
  118. package/pacakges/ai-sdk-provider/src/embedding/index.ts +113 -0
  119. package/pacakges/ai-sdk-provider/src/embedding/schemas.ts +26 -0
  120. package/pacakges/ai-sdk-provider/src/facade.ts +131 -0
  121. package/pacakges/ai-sdk-provider/src/image/index.test.ts +769 -0
  122. package/pacakges/ai-sdk-provider/src/image/index.ts +206 -0
  123. package/pacakges/ai-sdk-provider/src/image/schemas.ts +48 -0
  124. package/pacakges/ai-sdk-provider/src/index.ts +3 -0
  125. package/pacakges/ai-sdk-provider/src/internal/index.ts +10 -0
  126. package/pacakges/ai-sdk-provider/src/provider.ts +327 -0
  127. package/pacakges/ai-sdk-provider/src/schemas/error-response.test.ts +171 -0
  128. package/pacakges/ai-sdk-provider/src/schemas/error-response.ts +105 -0
  129. package/pacakges/ai-sdk-provider/src/schemas/format.ts +12 -0
  130. package/pacakges/ai-sdk-provider/src/schemas/image.ts +23 -0
  131. package/pacakges/ai-sdk-provider/src/schemas/provider-metadata.ts +91 -0
  132. package/pacakges/ai-sdk-provider/src/schemas/reasoning-details.ts +92 -0
  133. package/pacakges/ai-sdk-provider/src/tests/provider-options.test.ts +234 -0
  134. package/pacakges/ai-sdk-provider/src/tests/stream-usage-accounting.test.ts +409 -0
  135. package/pacakges/ai-sdk-provider/src/tests/usage-accounting.test.ts +555 -0
  136. package/pacakges/ai-sdk-provider/src/tests/web-search-tool.test.ts +319 -0
  137. package/pacakges/ai-sdk-provider/src/tool/web-search.ts +52 -0
  138. package/pacakges/ai-sdk-provider/src/types/index.ts +114 -0
  139. package/pacakges/ai-sdk-provider/src/types/openrouter-api-types.ts +83 -0
  140. package/pacakges/ai-sdk-provider/src/types/openrouter-chat-completions-input.ts +116 -0
  141. package/pacakges/ai-sdk-provider/src/types/openrouter-chat-settings.ts +233 -0
  142. package/pacakges/ai-sdk-provider/src/types/openrouter-completion-settings.ts +39 -0
  143. package/pacakges/ai-sdk-provider/src/types/openrouter-embedding-settings.ts +56 -0
  144. package/pacakges/ai-sdk-provider/src/types/openrouter-image-settings.ts +49 -0
  145. package/pacakges/ai-sdk-provider/src/types/openrouter-video-settings.ts +26 -0
  146. package/pacakges/ai-sdk-provider/src/utils/compute-token-usage.test.ts +186 -0
  147. package/pacakges/ai-sdk-provider/src/utils/compute-token-usage.ts +55 -0
  148. package/pacakges/ai-sdk-provider/src/utils/deterministic-stringify.test.ts +87 -0
  149. package/pacakges/ai-sdk-provider/src/utils/deterministic-stringify.ts +35 -0
  150. package/pacakges/ai-sdk-provider/src/utils/map-finish-reason.ts +43 -0
  151. package/pacakges/ai-sdk-provider/src/utils/reasoning-details-duplicate-tracker.test.ts +324 -0
  152. package/pacakges/ai-sdk-provider/src/utils/reasoning-details-duplicate-tracker.ts +70 -0
  153. package/pacakges/ai-sdk-provider/src/utils/remove-undefined.ts +12 -0
  154. package/pacakges/ai-sdk-provider/src/utils/type-guards.ts +6 -0
  155. package/pacakges/ai-sdk-provider/src/utils/with-stream-error-handling.test.ts +119 -0
  156. package/pacakges/ai-sdk-provider/src/utils/with-stream-error-handling.ts +25 -0
  157. package/pacakges/ai-sdk-provider/src/utils/with-user-agent-suffix.test.ts +133 -0
  158. package/pacakges/ai-sdk-provider/src/utils/with-user-agent-suffix.ts +78 -0
  159. package/pacakges/ai-sdk-provider/src/version.ts +4 -0
  160. package/pacakges/ai-sdk-provider/src/video/index.test.ts +515 -0
  161. package/pacakges/ai-sdk-provider/src/video/index.ts +275 -0
  162. package/pacakges/ai-sdk-provider/src/video/schemas.ts +36 -0
  163. package/pacakges/ai-sdk-provider/tsconfig.json +42 -0
  164. package/pacakges/ai-sdk-provider/tsup.config.ts +28 -0
  165. package/pacakges/ai-sdk-provider/turbo.json +8 -0
  166. package/pacakges/ai-sdk-provider/vitest.e2e.config.ts +21 -0
  167. package/pacakges/ai-sdk-provider/vitest.edge.config.ts +16 -0
  168. package/pacakges/ai-sdk-provider/vitest.issues.config.ts +28 -0
  169. package/pacakges/ai-sdk-provider/vitest.node.config.ts +16 -0
  170. package/package.json +3 -2
  171. package/skills/ai-world-sdk/SKILL.md +1 -0
  172. package/skills/ai-world-sdk/docs/admin-api.md +55 -0
  173. package/skills/ai-world-sdk/docs/cli-commands.md +14 -0
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPluginTokenCommands(program: Command): void;
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerPluginTokenCommands = registerPluginTokenCommands;
4
+ const config_1 = require("../config");
5
+ const output_1 = require("../output");
6
+ const utils_1 = require("../utils");
7
+ function collectOpts(cmd) {
8
+ const chain = [];
9
+ for (let c = cmd; c; c = c.parent)
10
+ chain.unshift(c);
11
+ const o = {};
12
+ for (const c of chain)
13
+ Object.assign(o, c.opts());
14
+ return o;
15
+ }
16
+ function resolveAndInit(cmd) {
17
+ const o = collectOpts(cmd);
18
+ const auth = (0, config_1.resolveAuth)({
19
+ baseUrl: o.baseUrl,
20
+ token: o.token,
21
+ pluginId: o.pluginId,
22
+ });
23
+ (0, utils_1.initSDK)(auth);
24
+ return o;
25
+ }
26
+ function parsePositiveInt(raw, flag) {
27
+ if (raw == null || raw === '')
28
+ return undefined;
29
+ const n = parseInt(raw, 10);
30
+ if (!Number.isFinite(n)) {
31
+ const err = new Error(`无效的 ${flag}: ${raw}`);
32
+ err.code = 'VALIDATION_ERROR';
33
+ throw err;
34
+ }
35
+ return n;
36
+ }
37
+ function registerPluginTokenCommands(program) {
38
+ const pt = program.command('plugin-token').description('插件 Token 管理(需管理员权限)');
39
+ pt.command('list')
40
+ .description('列出插件 Token')
41
+ .option('--plugin-id <id>', '按插件 ID 过滤')
42
+ .option('--active', '仅显示启用')
43
+ .option('--inactive', '仅显示停用')
44
+ .option('--page <n>', '页码')
45
+ .option('--page-size <n>', '每页条数')
46
+ .action(async (opts, cmd) => {
47
+ try {
48
+ const o = resolveAndInit(cmd);
49
+ const { PluginTokenClient } = require('../../plugin-token');
50
+ const client = new PluginTokenClient();
51
+ const isActive = opts.active ? true : opts.inactive ? false : undefined;
52
+ const result = await client.list({
53
+ pluginId: opts.pluginId,
54
+ isActive,
55
+ page: parsePositiveInt(opts.page, '--page') || 1,
56
+ pageSize: parsePositiveInt(opts.pageSize, '--page-size') || 20,
57
+ });
58
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
59
+ }
60
+ catch (err) {
61
+ (0, utils_1.handleError)(err, 'plugin-token list');
62
+ }
63
+ });
64
+ pt.command('create')
65
+ .description('创建插件 Token')
66
+ .requiredOption('--plugin-id <id>', '插件 ID')
67
+ .requiredOption('--name <name>', 'Token 名称')
68
+ .requiredOption('--role-id <id>', '角色 ID')
69
+ .option('--description <desc>', '描述')
70
+ .option('--expires <date>', '过期时间 (ISO 8601)')
71
+ .action(async (opts, cmd) => {
72
+ try {
73
+ resolveAndInit(cmd);
74
+ const { PluginTokenClient } = require('../../plugin-token');
75
+ const client = new PluginTokenClient();
76
+ const result = await client.create({
77
+ plugin_id: opts.pluginId,
78
+ name: opts.name,
79
+ role_id: Number(opts.roleId),
80
+ description: opts.description,
81
+ expires_at: opts.expires,
82
+ });
83
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
84
+ console.error(`\n⚠️ Token 仅显示一次,请妥善保存: ${result.token}`);
85
+ }
86
+ catch (err) {
87
+ (0, utils_1.handleError)(err, 'plugin-token create');
88
+ }
89
+ });
90
+ pt.command('get')
91
+ .argument('<id>', 'Token ID')
92
+ .description('获取插件 Token 详情')
93
+ .action(async (idArg, _opts, cmd) => {
94
+ try {
95
+ resolveAndInit(cmd);
96
+ const { PluginTokenClient } = require('../../plugin-token');
97
+ const client = new PluginTokenClient();
98
+ const result = await client.get(Number(idArg));
99
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
100
+ }
101
+ catch (err) {
102
+ (0, utils_1.handleError)(err, 'plugin-token get');
103
+ }
104
+ });
105
+ pt.command('update')
106
+ .argument('<id>', 'Token ID')
107
+ .description('更新插件 Token')
108
+ .option('--name <name>', '名称')
109
+ .option('--description <desc>', '描述')
110
+ .option('--role-id <id>', '角色 ID')
111
+ .option('--expires <date>', '过期时间 (ISO 8601)')
112
+ .action(async (idArg, opts, cmd) => {
113
+ try {
114
+ resolveAndInit(cmd);
115
+ const { PluginTokenClient } = require('../../plugin-token');
116
+ const client = new PluginTokenClient();
117
+ const data = {};
118
+ if (opts.name != null)
119
+ data.name = opts.name;
120
+ if (opts.description != null)
121
+ data.description = opts.description;
122
+ if (opts.roleId != null)
123
+ data.role_id = Number(opts.roleId);
124
+ if (opts.expires != null)
125
+ data.expires_at = opts.expires;
126
+ const result = await client.update(Number(idArg), data);
127
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
128
+ }
129
+ catch (err) {
130
+ (0, utils_1.handleError)(err, 'plugin-token update');
131
+ }
132
+ });
133
+ pt.command('delete')
134
+ .argument('<id>', 'Token ID')
135
+ .description('删除插件 Token')
136
+ .action(async (idArg, _opts, cmd) => {
137
+ try {
138
+ resolveAndInit(cmd);
139
+ const { PluginTokenClient } = require('../../plugin-token');
140
+ const client = new PluginTokenClient();
141
+ await client.delete(Number(idArg));
142
+ (0, output_1.output)({ deleted: true, id: Number(idArg) }, (0, utils_1.getFormat)(program));
143
+ }
144
+ catch (err) {
145
+ (0, utils_1.handleError)(err, 'plugin-token delete');
146
+ }
147
+ });
148
+ pt.command('regenerate')
149
+ .argument('<id>', 'Token ID')
150
+ .description('重新生成 Token(旧 Token 立即失效)')
151
+ .action(async (idArg, _opts, cmd) => {
152
+ try {
153
+ resolveAndInit(cmd);
154
+ const { PluginTokenClient } = require('../../plugin-token');
155
+ const client = new PluginTokenClient();
156
+ const result = await client.regenerate(Number(idArg));
157
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
158
+ console.error(`\n⚠️ 新 Token 仅显示一次: ${result.token}`);
159
+ }
160
+ catch (err) {
161
+ (0, utils_1.handleError)(err, 'plugin-token regenerate');
162
+ }
163
+ });
164
+ pt.command('toggle')
165
+ .argument('<id>', 'Token ID')
166
+ .description('切换启用/停用状态')
167
+ .action(async (idArg, _opts, cmd) => {
168
+ try {
169
+ resolveAndInit(cmd);
170
+ const { PluginTokenClient } = require('../../plugin-token');
171
+ const client = new PluginTokenClient();
172
+ const result = await client.toggle(Number(idArg));
173
+ const status = result.is_active ? '已启用' : '已停用';
174
+ console.error(`Token #${idArg} ${status}`);
175
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
176
+ }
177
+ catch (err) {
178
+ (0, utils_1.handleError)(err, 'plugin-token toggle');
179
+ }
180
+ });
181
+ }
package/dist/cli/index.js CHANGED
@@ -104,6 +104,7 @@ const stats_1 = require("./commands/stats");
104
104
  const ai_config_1 = require("./commands/ai-config");
105
105
  const shared_1 = require("./commands/shared");
106
106
  const chrome_1 = require("./commands/chrome");
107
+ const plugin_token_1 = require("./commands/plugin-token");
107
108
  (0, help_1.registerHelpCommand)(program);
108
109
  (0, version_1.registerVersionCommand)(program);
109
110
  (0, auth_1.registerAuthCommands)(program);
@@ -121,6 +122,7 @@ const chrome_1 = require("./commands/chrome");
121
122
  (0, ai_config_1.registerAiConfigCommands)(program);
122
123
  (0, shared_1.registerSharedCommands)(program);
123
124
  (0, chrome_1.registerChromeCommands)(program);
125
+ (0, plugin_token_1.registerPluginTokenCommands)(program);
124
126
  program.parseAsync(process.argv).catch((err) => {
125
127
  (0, utils_1.handleError)(err, process.argv.slice(2).join(' '));
126
128
  });
package/dist/config.d.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * 注意: {VERSION} 占位符会在构建时被替换为实际版本号
11
11
  */
12
- export declare const SDK_SIGNATURE = "AI_WORLD_SDK_V:1.5.9";
12
+ export declare const SDK_SIGNATURE = "AI_WORLD_SDK_V:1.5.11";
13
13
  /**
14
14
  * 版本兼容性错误
15
15
  */
@@ -35,8 +35,8 @@ declare class SDKConfig {
35
35
  private _authCheckPromise;
36
36
  private _currentUser;
37
37
  private _cliMode;
38
- readonly sdkSignature = "AI_WORLD_SDK_V:1.5.9";
39
- readonly sdkVersion = "1.5.9";
38
+ readonly sdkSignature = "AI_WORLD_SDK_V:1.5.11";
39
+ readonly sdkVersion = "1.5.11";
40
40
  constructor();
41
41
  /**
42
42
  * Set global base URL
package/dist/config.js CHANGED
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.sdkConfig = exports.VersionCompatibilityError = exports.SDK_SIGNATURE = void 0;
8
8
  // SDK 版本号(构建时自动从 package.json 更新)
9
9
  // 此版本号会在运行 npm run build 时自动从 package.json 读取并更新
10
- const SDK_VERSION = "1.5.9";
10
+ const SDK_VERSION = "1.5.11";
11
11
  /**
12
12
  * SDK 特征码 - 用于在构建后的 JS 文件中识别 SDK 版本
13
13
  * 格式: AI_WORLD_SDK_V:版本号
@@ -15,7 +15,7 @@ const SDK_VERSION = "1.5.9";
15
15
  *
16
16
  * 注意: {VERSION} 占位符会在构建时被替换为实际版本号
17
17
  */
18
- exports.SDK_SIGNATURE = "AI_WORLD_SDK_V:1.5.9";
18
+ exports.SDK_SIGNATURE = "AI_WORLD_SDK_V:1.5.11";
19
19
  /**
20
20
  * 版本兼容性错误
21
21
  */
package/dist/index.d.ts CHANGED
@@ -39,6 +39,7 @@ export { StatsClient, DashboardClient, type StatsClientConfig, type AiApiCallsOp
39
39
  export { AIConfigClient, type AIConfigClientConfig, } from "./ai-config";
40
40
  export { SharedResourceClient, type SharedResourceClientConfig, type SharedResourceInfo, type SharedResourceListResponse, type ListSharedResourceOptions, type UpdateSharedResourceData, } from "./shared-resource";
41
41
  export { ChromeExtensionClient, type ChromeExtensionClientConfig, type ChromeExtensionInfo, type ChromeExtensionListResponse, type ListChromeExtensionsOptions, type CreateChromeExtensionData, } from "./chrome-extension";
42
+ export { PluginTokenClient, type PluginTokenClientConfig, type PluginTokenInfo, type PluginTokenCreateResponse, type PluginTokenListResponse, type ListPluginTokensOptions, type CreatePluginTokenData, type UpdatePluginTokenData, } from "./plugin-token";
42
43
  export { sdkConfig, VersionCompatibilityError, SDK_SIGNATURE, type AuthenticatedUser } from "./config";
43
44
  /**
44
45
  * Create a chat model instance based on model name
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
20
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.bytesFromUrl = exports.getImageProxyConfig = exports.pollImageTask = exports.getImageTask = exports.submitImageTask = exports.generateImageSync = exports.generateKunpoImage = exports.SDK_SIGNATURE = exports.VersionCompatibilityError = exports.sdkConfig = exports.ChromeExtensionClient = exports.SharedResourceClient = exports.AIConfigClient = exports.DashboardClient = exports.StatsClient = exports.PluginManagementClient = exports.AdminClient = exports.getCurrentUserInfo = exports.AuthClient = exports.AgentSkillClient = exports.VersionedResourceClient = exports.ResourceClient = exports.MinioStorageClient = exports.DownloadClient = exports.OpenAIVideoGenerationClient = exports.VideoUnderstandingClient = exports.VideoGenerationClient = exports.GeminiImageGenerationClient = exports.DoubaoImageGenerationClient = exports.ChatAnthropic = exports.ChatGoogleGenerativeAI = exports.ChatOpenAI = exports.BaseChatModel = exports.AIMessageChunk = exports.SystemMessage = exports.AIMessage = exports.HumanMessage = void 0;
23
+ exports.bytesFromUrl = exports.getImageProxyConfig = exports.pollImageTask = exports.getImageTask = exports.submitImageTask = exports.generateImageSync = exports.generateKunpoImage = exports.SDK_SIGNATURE = exports.VersionCompatibilityError = exports.sdkConfig = exports.PluginTokenClient = exports.ChromeExtensionClient = exports.SharedResourceClient = exports.AIConfigClient = exports.DashboardClient = exports.StatsClient = exports.PluginManagementClient = exports.AdminClient = exports.getCurrentUserInfo = exports.AuthClient = exports.AgentSkillClient = exports.VersionedResourceClient = exports.ResourceClient = exports.MinioStorageClient = exports.DownloadClient = exports.OpenAIVideoGenerationClient = exports.VideoUnderstandingClient = exports.VideoGenerationClient = exports.GeminiImageGenerationClient = exports.DoubaoImageGenerationClient = exports.ChatAnthropic = exports.ChatGoogleGenerativeAI = exports.ChatOpenAI = exports.BaseChatModel = exports.AIMessageChunk = exports.SystemMessage = exports.AIMessage = exports.HumanMessage = void 0;
24
24
  exports.createChatModel = createChatModel;
25
25
  const openai_1 = require("./chat_models/openai");
26
26
  const google_1 = require("./chat_models/google");
@@ -85,6 +85,9 @@ Object.defineProperty(exports, "SharedResourceClient", { enumerable: true, get:
85
85
  // Export chrome extension client
86
86
  var chrome_extension_1 = require("./chrome-extension");
87
87
  Object.defineProperty(exports, "ChromeExtensionClient", { enumerable: true, get: function () { return chrome_extension_1.ChromeExtensionClient; } });
88
+ // Export plugin token client
89
+ var plugin_token_1 = require("./plugin-token");
90
+ Object.defineProperty(exports, "PluginTokenClient", { enumerable: true, get: function () { return plugin_token_1.PluginTokenClient; } });
88
91
  // Export global configuration
89
92
  var config_2 = require("./config");
90
93
  Object.defineProperty(exports, "sdkConfig", { enumerable: true, get: function () { return config_2.sdkConfig; } });
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Plugin Token Client
3
+ * 插件 Token 管理客户端(管理员接口)
4
+ */
5
+ export interface PluginTokenClientConfig {
6
+ baseUrl?: string;
7
+ token?: string;
8
+ headers?: Record<string, string>;
9
+ }
10
+ export interface PluginTokenInfo {
11
+ id: number;
12
+ plugin_id: string;
13
+ name: string;
14
+ description?: string;
15
+ is_active: boolean;
16
+ token_prefix: string;
17
+ last_used_at?: string;
18
+ expires_at?: string;
19
+ created_at: string;
20
+ updated_at: string;
21
+ role?: {
22
+ id: number;
23
+ name: string;
24
+ description?: string;
25
+ permissions: Record<string, any>;
26
+ };
27
+ created_by_name?: string;
28
+ }
29
+ export interface PluginTokenCreateResponse extends PluginTokenInfo {
30
+ token: string;
31
+ }
32
+ export interface PluginTokenListResponse {
33
+ items: PluginTokenInfo[];
34
+ total: number;
35
+ page: number;
36
+ page_size: number;
37
+ }
38
+ export interface ListPluginTokensOptions {
39
+ page?: number;
40
+ pageSize?: number;
41
+ pluginId?: string;
42
+ search?: string;
43
+ isActive?: boolean;
44
+ }
45
+ export interface CreatePluginTokenData {
46
+ plugin_id: string;
47
+ name: string;
48
+ description?: string;
49
+ role_id: number;
50
+ expires_at?: string;
51
+ }
52
+ export interface UpdatePluginTokenData {
53
+ name?: string;
54
+ description?: string;
55
+ role_id?: number;
56
+ expires_at?: string | null;
57
+ }
58
+ export declare class PluginTokenClient {
59
+ private baseUrl;
60
+ private headers;
61
+ constructor(config?: PluginTokenClientConfig);
62
+ private handleErrorResponse;
63
+ private buildUrl;
64
+ list(options?: ListPluginTokensOptions): Promise<PluginTokenListResponse>;
65
+ create(data: CreatePluginTokenData): Promise<PluginTokenCreateResponse>;
66
+ get(id: number): Promise<PluginTokenInfo>;
67
+ update(id: number, data: UpdatePluginTokenData): Promise<PluginTokenInfo>;
68
+ delete(id: number): Promise<void>;
69
+ regenerate(id: number): Promise<PluginTokenCreateResponse>;
70
+ toggle(id: number): Promise<PluginTokenInfo>;
71
+ }
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ /**
3
+ * Plugin Token Client
4
+ * 插件 Token 管理客户端(管理员接口)
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PluginTokenClient = void 0;
8
+ const config_1 = require("./config");
9
+ const log_1 = require("./log");
10
+ class PluginTokenClient {
11
+ constructor(config = {}) {
12
+ this.baseUrl =
13
+ config.baseUrl ||
14
+ config_1.sdkConfig.getServerUrl() ||
15
+ (typeof window !== "undefined" ? window.location.origin : "");
16
+ const globalHeaders = config_1.sdkConfig.getHeaders();
17
+ const globalToken = config.token || config_1.sdkConfig.getToken();
18
+ this.headers = {
19
+ "Content-Type": "application/json",
20
+ ...globalHeaders,
21
+ ...config.headers,
22
+ };
23
+ if (globalToken) {
24
+ this.headers["Authorization"] = `Bearer ${globalToken}`;
25
+ }
26
+ }
27
+ async handleErrorResponse(response) {
28
+ let errorMessage = `Request failed: ${response.status} ${response.statusText}`;
29
+ try {
30
+ const errorText = await response.text();
31
+ const errorJson = JSON.parse(errorText);
32
+ errorMessage = errorJson.detail || errorMessage;
33
+ }
34
+ catch { }
35
+ throw new Error(errorMessage);
36
+ }
37
+ buildUrl(path, params) {
38
+ const url = `${this.baseUrl}${path}`;
39
+ if (!params)
40
+ return url;
41
+ const sp = new URLSearchParams();
42
+ for (const [k, v] of Object.entries(params)) {
43
+ if (v !== undefined && v !== null)
44
+ sp.set(k, String(v));
45
+ }
46
+ const qs = sp.toString();
47
+ return qs ? `${url}?${qs}` : url;
48
+ }
49
+ async list(options = {}) {
50
+ const url = this.buildUrl("/api/admin/plugin-tokens", {
51
+ page: options.page,
52
+ page_size: options.pageSize,
53
+ plugin_id: options.pluginId,
54
+ search: options.search,
55
+ is_active: options.isActive,
56
+ });
57
+ (0, log_1.debugLog)("PluginTokenClient.list", url);
58
+ (0, log_1.logRequest)("GET", url, this.headers);
59
+ const resp = await fetch(url, { method: "GET", headers: this.headers });
60
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
61
+ if (!resp.ok)
62
+ await this.handleErrorResponse(resp);
63
+ return resp.json();
64
+ }
65
+ async create(data) {
66
+ const url = `${this.baseUrl}/api/admin/plugin-tokens`;
67
+ (0, log_1.debugLog)("PluginTokenClient.create", url);
68
+ (0, log_1.logRequest)("POST", url, this.headers, data);
69
+ const resp = await fetch(url, {
70
+ method: "POST",
71
+ headers: this.headers,
72
+ body: JSON.stringify(data),
73
+ });
74
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
75
+ if (!resp.ok)
76
+ await this.handleErrorResponse(resp);
77
+ return resp.json();
78
+ }
79
+ async get(id) {
80
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}`;
81
+ (0, log_1.debugLog)("PluginTokenClient.get", url);
82
+ (0, log_1.logRequest)("GET", url);
83
+ const resp = await fetch(url, { method: "GET", headers: this.headers });
84
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
85
+ if (!resp.ok)
86
+ await this.handleErrorResponse(resp);
87
+ return resp.json();
88
+ }
89
+ async update(id, data) {
90
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}`;
91
+ (0, log_1.debugLog)("PluginTokenClient.update", url);
92
+ (0, log_1.logRequest)("PATCH", url, this.headers, data);
93
+ const resp = await fetch(url, {
94
+ method: "PATCH",
95
+ headers: this.headers,
96
+ body: JSON.stringify(data),
97
+ });
98
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
99
+ if (!resp.ok)
100
+ await this.handleErrorResponse(resp);
101
+ return resp.json();
102
+ }
103
+ async delete(id) {
104
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}`;
105
+ (0, log_1.debugLog)("PluginTokenClient.delete", url);
106
+ (0, log_1.logRequest)("DELETE", url, this.headers);
107
+ const resp = await fetch(url, { method: "DELETE", headers: this.headers });
108
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
109
+ if (!resp.ok)
110
+ await this.handleErrorResponse(resp);
111
+ }
112
+ async regenerate(id) {
113
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}/regenerate`;
114
+ (0, log_1.debugLog)("PluginTokenClient.regenerate", url);
115
+ (0, log_1.logRequest)("POST", url, this.headers);
116
+ const resp = await fetch(url, { method: "POST", headers: this.headers });
117
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
118
+ if (!resp.ok)
119
+ await this.handleErrorResponse(resp);
120
+ return resp.json();
121
+ }
122
+ async toggle(id) {
123
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}/toggle`;
124
+ (0, log_1.debugLog)("PluginTokenClient.toggle", url);
125
+ (0, log_1.logRequest)("PATCH", url, this.headers);
126
+ const resp = await fetch(url, { method: "PATCH", headers: this.headers });
127
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
128
+ if (!resp.ok)
129
+ await this.handleErrorResponse(resp);
130
+ return resp.json();
131
+ }
132
+ }
133
+ exports.PluginTokenClient = PluginTokenClient;
@@ -0,0 +1,34 @@
1
+ # Changesets
2
+
3
+ Hello! This folder contains [Changesets](https://github.com/changesets/changesets), which help manage releases and changelogs.
4
+
5
+ ## Adding a changeset
6
+
7
+ To create a new changeset, run:
8
+
9
+ ```bash
10
+ pnpm changeset
11
+ ```
12
+
13
+ This will prompt you for:
14
+
15
+ 1. Which type of change (patch/minor/major)
16
+ 2. A summary of the changes
17
+
18
+ The tool will create a markdown file in `.changeset/` with your changes.
19
+
20
+ ## How releases work
21
+
22
+ When changes are merged to `main`:
23
+
24
+ 1. The Release workflow creates/updates a "Version Packages" PR
25
+ 2. This PR will bump versions and update CHANGELOGs based on all changesets
26
+ 3. When you merge the "Version Packages" PR, packages are automatically published to npm
27
+
28
+ ## Empty changesets
29
+
30
+ If your changes don't need a release (docs, tests, CI config):
31
+
32
+ ```bash
33
+ pnpm changeset --empty
34
+ ```
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@changesets/config@1.6.4/schema.json",
3
+ "changelog": [
4
+ "@changesets/changelog-github",
5
+ { "repo": "OpenRouterTeam/ai-sdk-provider" }
6
+ ],
7
+ "commit": false,
8
+ "linked": [],
9
+ "access": "public",
10
+ "baseBranch": "main",
11
+ "updateInternalDependencies": "patch",
12
+ "ignore": []
13
+ }
@@ -0,0 +1,16 @@
1
+ ## Description
2
+
3
+ <!-- Briefly describe your changes -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] I have run `pnpm stylecheck` and `pnpm typecheck`
8
+ - [ ] I have run `pnpm test` and all tests pass
9
+ - [ ] I have added tests for my changes (if applicable)
10
+ - [ ] I have updated documentation (if applicable)
11
+
12
+ ### Changeset
13
+
14
+ - [ ] I have run `pnpm changeset` to create a changeset file
15
+
16
+ > **Note:** A changeset is required for your changes to trigger a release. If your PR only contains docs, tests, or CI changes that don't need a release, run `pnpm changeset --empty` instead.
@@ -0,0 +1,24 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ jobs:
9
+ ci:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ packages: write
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: actions/setup-node@v4
17
+ with:
18
+ node-version: "20.x"
19
+ - uses: pnpm/action-setup@v4
20
+ - run: pnpm install
21
+ - run: pnpm test
22
+ - run: pnpm build
23
+ - run: pnpm typecheck
24
+ - run: pnpm stylecheck
@@ -0,0 +1,36 @@
1
+ # DEPRECATED: This workflow is kept for emergency manual releases only.
2
+ # Normal releases should use the changeset-based publish.yaml workflow.
3
+ # To use this, manually create a GitHub Release.
4
+ name: Publish package (legacy)
5
+ on:
6
+ release:
7
+ types: [published]
8
+ workflow_dispatch: {}
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: read
14
+ packages: write
15
+ id-token: write
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-node@v4
19
+ with:
20
+ node-version: "20.x"
21
+ registry-url: "https://registry.npmjs.org"
22
+ scope: "@openrouter"
23
+ - uses: pnpm/action-setup@v4
24
+ - run: pnpm install --frozen-lockfile
25
+ - run: pnpm typecheck
26
+ - run: pnpm build
27
+ - run: pnpm test
28
+ - name: Publish to npm
29
+ run: |
30
+ if [ "${{ github.event.release.prerelease }}" = "true" ]; then
31
+ pnpm publish --provenance --access public --no-git-checks --tag beta
32
+ else
33
+ pnpm publish --provenance --access public --no-git-checks
34
+ fi
35
+ env:
36
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}