@sogni-ai/sogni-client 4.2.0-alpha.21 → 4.2.0-alpha.22

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 (170) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/CLAUDE.md +7 -0
  3. package/README.md +45 -25
  4. package/dist/Chat/ChatTools.js +30 -16
  5. package/dist/Chat/ChatTools.js.map +1 -1
  6. package/dist/Chat/hostedToolValidation.generated.d.ts +46 -0
  7. package/dist/Chat/hostedToolValidation.generated.js +306 -0
  8. package/dist/Chat/hostedToolValidation.generated.js.map +1 -0
  9. package/dist/Chat/index.d.ts +41 -1
  10. package/dist/Chat/index.js +166 -2
  11. package/dist/Chat/index.js.map +1 -1
  12. package/dist/Chat/modelRouting.d.ts +8 -26
  13. package/dist/Chat/modelRouting.js +11 -106
  14. package/dist/Chat/modelRouting.js.map +1 -1
  15. package/dist/Chat/sogniHostedTools.generated.json +1285 -283
  16. package/dist/Chat/tools.d.ts +52 -3
  17. package/dist/Chat/tools.js +80 -27
  18. package/dist/Chat/tools.js.map +1 -1
  19. package/dist/Chat/types.d.ts +119 -3
  20. package/dist/CreativeWorkflows/index.d.ts +1 -7
  21. package/dist/CreativeWorkflows/index.js +23 -21
  22. package/dist/CreativeWorkflows/index.js.map +1 -1
  23. package/dist/CreativeWorkflows/types.d.ts +27 -33
  24. package/dist/index.d.ts +19 -4
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/Cache.js +6 -1
  28. package/dist/lib/Cache.js.map +1 -1
  29. package/dist-esm/Account/CurrentAccount.js +59 -0
  30. package/dist-esm/Account/CurrentAccount.js.map +1 -0
  31. package/dist-esm/Account/index.js +543 -0
  32. package/dist-esm/Account/index.js.map +1 -0
  33. package/dist-esm/Account/types.js +2 -0
  34. package/dist-esm/Account/types.js.map +1 -0
  35. package/dist-esm/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.js +327 -0
  36. package/dist-esm/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.js.map +1 -0
  37. package/dist-esm/ApiClient/WebSocketClient/BrowserWebSocketClient/index.js +222 -0
  38. package/dist-esm/ApiClient/WebSocketClient/BrowserWebSocketClient/index.js.map +1 -0
  39. package/dist-esm/ApiClient/WebSocketClient/ErrorCode.js +15 -0
  40. package/dist-esm/ApiClient/WebSocketClient/ErrorCode.js.map +1 -0
  41. package/dist-esm/ApiClient/WebSocketClient/eventSubscriptions.js +35 -0
  42. package/dist-esm/ApiClient/WebSocketClient/eventSubscriptions.js.map +1 -0
  43. package/dist-esm/ApiClient/WebSocketClient/events.js +2 -0
  44. package/dist-esm/ApiClient/WebSocketClient/events.js.map +1 -0
  45. package/dist-esm/ApiClient/WebSocketClient/index.js +221 -0
  46. package/dist-esm/ApiClient/WebSocketClient/index.js.map +1 -0
  47. package/dist-esm/ApiClient/WebSocketClient/messages.js +2 -0
  48. package/dist-esm/ApiClient/WebSocketClient/messages.js.map +1 -0
  49. package/dist-esm/ApiClient/WebSocketClient/types.js +2 -0
  50. package/dist-esm/ApiClient/WebSocketClient/types.js.map +1 -0
  51. package/dist-esm/ApiClient/events.js +2 -0
  52. package/dist-esm/ApiClient/events.js.map +1 -0
  53. package/dist-esm/ApiClient/index.js +120 -0
  54. package/dist-esm/ApiClient/index.js.map +1 -0
  55. package/dist-esm/ApiGroup.js +10 -0
  56. package/dist-esm/ApiGroup.js.map +1 -0
  57. package/dist-esm/Chat/ChatStream.js +181 -0
  58. package/dist-esm/Chat/ChatStream.js.map +1 -0
  59. package/dist-esm/Chat/ChatTools.js +562 -0
  60. package/dist-esm/Chat/ChatTools.js.map +1 -0
  61. package/dist-esm/Chat/hostedToolValidation.generated.js +301 -0
  62. package/dist-esm/Chat/hostedToolValidation.generated.js.map +1 -0
  63. package/dist-esm/Chat/index.js +598 -0
  64. package/dist-esm/Chat/index.js.map +1 -0
  65. package/dist-esm/Chat/modelRouting.js +326 -0
  66. package/dist-esm/Chat/modelRouting.js.map +1 -0
  67. package/dist-esm/Chat/sogniHostedTools.generated.json +1531 -0
  68. package/dist-esm/Chat/tools.js +149 -0
  69. package/dist-esm/Chat/tools.js.map +1 -0
  70. package/dist-esm/Chat/types.js +2 -0
  71. package/dist-esm/Chat/types.js.map +1 -0
  72. package/dist-esm/CreativeWorkflows/index.js +256 -0
  73. package/dist-esm/CreativeWorkflows/index.js.map +1 -0
  74. package/dist-esm/CreativeWorkflows/types.js +2 -0
  75. package/dist-esm/CreativeWorkflows/types.js.map +1 -0
  76. package/dist-esm/Projects/Job.js +391 -0
  77. package/dist-esm/Projects/Job.js.map +1 -0
  78. package/dist-esm/Projects/Project.js +295 -0
  79. package/dist-esm/Projects/Project.js.map +1 -0
  80. package/dist-esm/Projects/createJobRequestMessage.js +528 -0
  81. package/dist-esm/Projects/createJobRequestMessage.js.map +1 -0
  82. package/dist-esm/Projects/index.js +1309 -0
  83. package/dist-esm/Projects/index.js.map +1 -0
  84. package/dist-esm/Projects/types/ComfySamplerParams.js +2 -0
  85. package/dist-esm/Projects/types/ComfySamplerParams.js.map +1 -0
  86. package/dist-esm/Projects/types/ControlNetParams.js +2 -0
  87. package/dist-esm/Projects/types/ControlNetParams.js.map +1 -0
  88. package/dist-esm/Projects/types/EstimationResponse.js +2 -0
  89. package/dist-esm/Projects/types/EstimationResponse.js.map +1 -0
  90. package/dist-esm/Projects/types/ModelOptions.js +89 -0
  91. package/dist-esm/Projects/types/ModelOptions.js.map +1 -0
  92. package/dist-esm/Projects/types/ModelTiersRaw.js +13 -0
  93. package/dist-esm/Projects/types/ModelTiersRaw.js.map +1 -0
  94. package/dist-esm/Projects/types/RawProject.js +2 -0
  95. package/dist-esm/Projects/types/RawProject.js.map +1 -0
  96. package/dist-esm/Projects/types/events.js +2 -0
  97. package/dist-esm/Projects/types/events.js.map +1 -0
  98. package/dist-esm/Projects/types/index.js +10 -0
  99. package/dist-esm/Projects/types/index.js.map +1 -0
  100. package/dist-esm/Projects/utils/index.js +229 -0
  101. package/dist-esm/Projects/utils/index.js.map +1 -0
  102. package/dist-esm/Projects/utils/samplers.js +36 -0
  103. package/dist-esm/Projects/utils/samplers.js.map +1 -0
  104. package/dist-esm/Projects/utils/scheduler.js +27 -0
  105. package/dist-esm/Projects/utils/scheduler.js.map +1 -0
  106. package/dist-esm/Stats/index.js +20 -0
  107. package/dist-esm/Stats/index.js.map +1 -0
  108. package/dist-esm/Stats/types.js +2 -0
  109. package/dist-esm/Stats/types.js.map +1 -0
  110. package/dist-esm/events.js +2 -0
  111. package/dist-esm/events.js.map +1 -0
  112. package/dist-esm/index.js +144 -0
  113. package/dist-esm/index.js.map +1 -0
  114. package/dist-esm/lib/AuthManager/ApiKeyAuthManager.js +58 -0
  115. package/dist-esm/lib/AuthManager/ApiKeyAuthManager.js.map +1 -0
  116. package/dist-esm/lib/AuthManager/AuthManagerBase.js +9 -0
  117. package/dist-esm/lib/AuthManager/AuthManagerBase.js.map +1 -0
  118. package/dist-esm/lib/AuthManager/CookieAuthManager.js +48 -0
  119. package/dist-esm/lib/AuthManager/CookieAuthManager.js.map +1 -0
  120. package/dist-esm/lib/AuthManager/TokenAuthManager.js +186 -0
  121. package/dist-esm/lib/AuthManager/TokenAuthManager.js.map +1 -0
  122. package/dist-esm/lib/AuthManager/index.js +5 -0
  123. package/dist-esm/lib/AuthManager/index.js.map +1 -0
  124. package/dist-esm/lib/Cache.js +32 -0
  125. package/dist-esm/lib/Cache.js.map +1 -0
  126. package/dist-esm/lib/DataEntity.js +30 -0
  127. package/dist-esm/lib/DataEntity.js.map +1 -0
  128. package/dist-esm/lib/DefaultLogger.js +32 -0
  129. package/dist-esm/lib/DefaultLogger.js.map +1 -0
  130. package/dist-esm/lib/EIP712Helper.js +37 -0
  131. package/dist-esm/lib/EIP712Helper.js.map +1 -0
  132. package/dist-esm/lib/RestClient.js +90 -0
  133. package/dist-esm/lib/RestClient.js.map +1 -0
  134. package/dist-esm/lib/TypedEventEmitter.js +68 -0
  135. package/dist-esm/lib/TypedEventEmitter.js.map +1 -0
  136. package/dist-esm/lib/base64.js +18 -0
  137. package/dist-esm/lib/base64.js.map +1 -0
  138. package/dist-esm/lib/getUUID.js +7 -0
  139. package/dist-esm/lib/getUUID.js.map +1 -0
  140. package/dist-esm/lib/isNodejs.js +3 -0
  141. package/dist-esm/lib/isNodejs.js.map +1 -0
  142. package/dist-esm/lib/mediaValidation.js +277 -0
  143. package/dist-esm/lib/mediaValidation.js.map +1 -0
  144. package/dist-esm/lib/utils/index.js +30 -0
  145. package/dist-esm/lib/utils/index.js.map +1 -0
  146. package/dist-esm/lib/validation.js +138 -0
  147. package/dist-esm/lib/validation.js.map +1 -0
  148. package/dist-esm/package.json +3 -0
  149. package/dist-esm/types/ErrorData.js +2 -0
  150. package/dist-esm/types/ErrorData.js.map +1 -0
  151. package/dist-esm/types/json.js +2 -0
  152. package/dist-esm/types/json.js.map +1 -0
  153. package/dist-esm/types/token.js +2 -0
  154. package/dist-esm/types/token.js.map +1 -0
  155. package/dist-esm/version.js +3 -0
  156. package/dist-esm/version.js.map +1 -0
  157. package/llms-full.txt +11 -20
  158. package/llms.txt +9 -18
  159. package/package.json +21 -5
  160. package/src/Chat/ChatTools.ts +36 -16
  161. package/src/Chat/hostedToolValidation.generated.ts +453 -0
  162. package/src/Chat/index.ts +198 -3
  163. package/src/Chat/modelRouting.ts +26 -150
  164. package/src/Chat/sogniHostedTools.generated.json +1285 -283
  165. package/src/Chat/tools.ts +106 -41
  166. package/src/Chat/types.ts +131 -3
  167. package/src/CreativeWorkflows/index.ts +22 -41
  168. package/src/CreativeWorkflows/types.ts +69 -42
  169. package/src/index.ts +33 -12
  170. package/src/lib/Cache.ts +8 -1
@@ -0,0 +1,138 @@
1
+ import { ApiError } from '../ApiClient';
2
+ const EXTENDED_IMAGE_SIZE_MODEL_IDS = new Set([
3
+ 'z_image_bf16',
4
+ 'z_image_turbo_bf16',
5
+ 'qwen_image_edit_2511_fp8',
6
+ 'qwen_image_edit_2511_fp8_lightning',
7
+ 'qwen_image_2512_fp8',
8
+ 'qwen_image_2512_fp8_lightning',
9
+ 'flux2_dev_fp8'
10
+ ]);
11
+ function getMaxCustomImageSize(modelId) {
12
+ if (modelId === 'gpt-image-2') {
13
+ return 3840;
14
+ }
15
+ if (modelId && EXTENDED_IMAGE_SIZE_MODEL_IDS.has(modelId)) {
16
+ return 2560;
17
+ }
18
+ return 2048;
19
+ }
20
+ export function validateCustomImageSize(value, { modelId, propertyName = 'Width and height' } = {}) {
21
+ return validateNumber(value, {
22
+ min: 256,
23
+ max: getMaxCustomImageSize(modelId),
24
+ propertyName
25
+ });
26
+ }
27
+ /**
28
+ * Validate video dimensions for Wan 2.2 models.
29
+ * Minimum dimension is 480px for both width and height.
30
+ */
31
+ export function validateVideoSize(value, propertyName) {
32
+ return validateNumber(value, { min: 480, propertyName: `Video ${propertyName}` });
33
+ }
34
+ export function validateVideoDuration(value, min = 1, max = 10) {
35
+ return validateNumber(value, { min, max, propertyName: 'Video duration' });
36
+ }
37
+ export function validateNumber(value, { min, max, propertyName, defaultValue } = {}) {
38
+ const number = Number(value);
39
+ const hasDefaultValue = defaultValue !== undefined;
40
+ if (!propertyName) {
41
+ propertyName = 'Value';
42
+ }
43
+ if (isNaN(number)) {
44
+ if (hasDefaultValue) {
45
+ return defaultValue;
46
+ }
47
+ throw new Error(`${propertyName} must be a number, got ${value}`);
48
+ }
49
+ if (min !== undefined && number < min) {
50
+ if (hasDefaultValue) {
51
+ return defaultValue;
52
+ }
53
+ throw new Error(`${propertyName} must greater or equal ${min}, got ${number}`);
54
+ }
55
+ if (max !== undefined && number > max) {
56
+ if (hasDefaultValue) {
57
+ return defaultValue;
58
+ }
59
+ throw new Error(`${propertyName} must be less or equal ${max}, got ${number}`);
60
+ }
61
+ return number;
62
+ }
63
+ /**
64
+ * Validate teacacheThreshold for T2V and I2V models.
65
+ * Range: 0.0-1.0. 0.0 = disabled.
66
+ */
67
+ export function validateTeacacheThreshold(value) {
68
+ if (value === undefined || value === null) {
69
+ return undefined;
70
+ }
71
+ const num = Number(value);
72
+ if (isNaN(num)) {
73
+ throw new Error(`teacacheThreshold must be a number, got ${value}`);
74
+ }
75
+ if (num < 0.0 || num > 1.0) {
76
+ throw new Error(`teacacheThreshold must be between 0.0 and 1.0 (got ${num})`);
77
+ }
78
+ return num;
79
+ }
80
+ export function isComfyModel(modelId) {
81
+ const COMFY_PREFIXES = ['z_image_', 'qwen_image_', 'flux2_', 'wan_', 'ace_step'];
82
+ return COMFY_PREFIXES.some((prefix) => modelId.startsWith(prefix));
83
+ }
84
+ /**
85
+ * Get the maximum number of context images supported by a model.
86
+ * - GPT Image 2: 16 images
87
+ * - Flux.2 Dev: 6 images
88
+ * - Qwen Image Edit: 3 images
89
+ * - Flux Kontext: 2 images
90
+ * - Default: 3 images
91
+ */
92
+ export function getMaxContextImages(modelId) {
93
+ if (modelId === 'gpt-image-2') {
94
+ return 16;
95
+ }
96
+ if (modelId.startsWith('flux2_')) {
97
+ return 6;
98
+ }
99
+ if (modelId.startsWith('qwen_image_')) {
100
+ return 3;
101
+ }
102
+ if (modelId.includes('kontext')) {
103
+ return 2;
104
+ }
105
+ // Default fallback for other models that might support context images
106
+ return 3;
107
+ }
108
+ function validateOption(value, options, errorMessage) {
109
+ if (!options.includes(value)) {
110
+ throw new ApiError(400, {
111
+ status: 'error',
112
+ errorCode: 0,
113
+ message: errorMessage
114
+ });
115
+ }
116
+ return value;
117
+ }
118
+ /**
119
+ * Validate sampler value against allowed options.
120
+ * Returns the validated value unchanged - sogni-socket handles normalization.
121
+ */
122
+ export function validateSampler(value, options) {
123
+ if (!options.sampler.allowed.length || !value) {
124
+ return null;
125
+ }
126
+ return validateOption(value, options.sampler.allowed, `Invalid sampler ${value}. Must be one of "${options.sampler.allowed.join('", "')}".`);
127
+ }
128
+ /**
129
+ * Validate scheduler value against allowed options.
130
+ * Returns the validated value unchanged - sogni-socket handles normalization.
131
+ */
132
+ export function validateScheduler(value, options) {
133
+ if (!options.scheduler.allowed.length || !value) {
134
+ return null;
135
+ }
136
+ return validateOption(value, options.scheduler.allowed, `Invalid scheduler ${value}. Must be one of "${options.scheduler.allowed.join('", "')}".`);
137
+ }
138
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC;IAC5C,cAAc;IACd,oBAAoB;IACpB,0BAA0B;IAC1B,oCAAoC;IACpC,qBAAqB;IACrB,+BAA+B;IAC/B,eAAe;CAChB,CAAC,CAAC;AAOH,SAAS,qBAAqB,CAAC,OAAgB;IAC7C,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,IAAI,6BAA6B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAU,EACV,EAAE,OAAO,EAAE,YAAY,GAAG,kBAAkB,KAAiC,EAAE;IAE/E,OAAO,cAAc,CAAC,KAAK,EAAE;QAC3B,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,qBAAqB,CAAC,OAAO,CAAC;QACnC,YAAY;KACb,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAU,EAAE,YAAgC;IAC5E,OAAO,cAAc,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,YAAY,EAAE,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAU,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE;IACjE,OAAO,cAAc,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC7E,CAAC;AASD,MAAM,UAAU,cAAc,CAC5B,KAAU,EACV,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,KAA8B,EAAE;IAEtE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,eAAe,GAAG,YAAY,KAAK,SAAS,CAAC;IACnD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,OAAO,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAClB,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,0BAA0B,KAAK,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QACtC,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,0BAA0B,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QACtC,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,0BAA0B,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,sDAAsD,GAAG,GAAG,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACjF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,sEAAsE;IACtE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,cAAc,CAAc,KAAQ,EAAE,OAAY,EAAE,YAAoB;IAC/E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE;YACtB,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAyB,EAAE,OAAqB;IAC9E,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,cAAc,CACnB,KAAK,EACL,OAAO,CAAC,OAAO,CAAC,OAAO,EACvB,mBAAmB,KAAK,qBAAqB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CACtF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAyB,EAAE,OAAqB;IAChF,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,cAAc,CACnB,KAAK,EACL,OAAO,CAAC,SAAS,CAAC,OAAO,EACzB,qBAAqB,KAAK,qBAAqB,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAC1F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ErrorData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorData.js","sourceRoot":"","sources":["../../src/types/ErrorData.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/types/json.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/types/token.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { version } from '../package.json';
2
+ export const LIB_VERSION = version;
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
package/llms-full.txt CHANGED
@@ -934,17 +934,8 @@ Sogni's generation APIs automatically:
934
934
  - Video-to-Video: "Restyle this video as anime"
935
935
  - Music Generation: "Compose a jazz song about the rain"
936
936
 
937
- SDK-LOCAL PUBLIC TOOL NAMES (`SogniTools.all`, client-managed execution):
938
-
939
- - `sogni_generate_image`
940
- - `sogni_edit_image`
941
- - `sogni_generate_video`
942
- - `sogni_sound_to_video`
943
- - `sogni_video_to_video`
944
- - `sogni_generate_music`
945
-
946
- HOSTED CREATIVE TOOL FAMILIES:
947
- The Sogni API can also inject hosted Sogni tool families into the same chat completions endpoint. The default `creative-tools` surface provides media, post-production, analysis, metadata, and synchronous composition tools; `sogni_tools: "creative-agent"` adds workflow control and asset-manifest tools:
937
+ CANONICAL HOSTED CREATIVE-TOOL SURFACE (`SogniTools.all`, 22 tools):
938
+ All tool calls execute server-side via `sogni.chat.hosted.create()` / `sogni.chat.runs.create()`. The default `creative-tools` value of `sogni_tools` injects this surface server-side; `sogni_tools: "creative-agent"` adds workflow control and asset-manifest tools on top.
948
939
 
949
940
  - `generate_image`, `edit_image`, `generate_video`, `generate_music`, `sound_to_video`, `video_to_video` — core media-generation tools with creative-agent naming.
950
941
  - `restore_photo`, `apply_style`, `refine_result`, `change_angle` — image-edit adapters backed by the shared image-edit workflow.
@@ -974,15 +965,15 @@ MEDIA-CONDITIONED TOOL INPUTS:
974
965
  - `reference_video_url`
975
966
  All media-conditioned tool inputs must be inline base64-encoded `data:` URIs. Remote `http(s)` URLs are not allowed. Tool image inputs accept PNG/JPEG only, tool audio inputs accept MP3/M4A/WAV only, and tool video inputs accept MP4 or MOV/QuickTime only.
976
967
 
977
- DEFAULT GENERATION MODELS (used by SDK-local platform tools):
968
+ DEFAULT GENERATION MODELS (used by the canonical generation tools):
978
969
  | Tool | Model ID | Description |
979
970
  |------|----------|-------------|
980
- | `sogni_generate_image` | z_image_turbo_bf16 | Z-Image Turbo, ultra-fast 8-step generation |
981
- | `sogni_edit_image` | workflow/model-dependent | Reference-guided image editing with edit-capable Qwen/Flux models |
982
- | `sogni_generate_video` | ltx23-22b-fp8_t2v_distilled / ltx23-22b-fp8_i2v_distilled / Seedance selectors | Text-to-video or image-to-video |
983
- | `sogni_sound_to_video` | ltx23-22b-fp8_a2v_distilled / ltx23-22b-fp8_ia2v_distilled | Audio-driven video generation |
984
- | `sogni_video_to_video` | ltx23-22b-fp8_v2v_distilled / seedance-2-0 / WAN animate models | Video transformation / motion transfer |
985
- | `sogni_generate_music` | ace_step_1.5_turbo | ACE-Step 1.5 Turbo, fast music generation |
971
+ | `generate_image` | z_image_turbo_bf16 | Z-Image Turbo, ultra-fast 8-step generation |
972
+ | `edit_image` | workflow/model-dependent | Reference-guided image editing with edit-capable Qwen/Flux models |
973
+ | `generate_video` | ltx23-22b-fp8_t2v_distilled / ltx23-22b-fp8_i2v_distilled / Seedance selectors | Text-to-video or image-to-video |
974
+ | `sound_to_video` | ltx23-22b-fp8_a2v_distilled / ltx23-22b-fp8_ia2v_distilled | Audio-driven video generation |
975
+ | `video_to_video` | ltx23-22b-fp8_v2v_distilled / seedance-2-0 / WAN animate models | Video transformation / motion transfer |
976
+ | `generate_music` | ace_step_1.5_turbo | ACE-Step 1.5 Turbo, fast music generation |
986
977
 
987
978
  PLATFORM TOOL WORKFLOW:
988
979
 
@@ -996,8 +987,8 @@ PLATFORM TOOL WORKFLOW:
996
987
  See `workflow_text_chat_sogni_tools.mjs` for a composition-pipeline example
997
988
  covering the core image/video/music flows. See `workflow_creative_agent_tools.mjs`
998
989
  for server-side hosted Sogni tool injection with `sogni_tools`.
999
- For the full built-in SDK tool surface, use `SogniTools.all` with
1000
- `sogni.chat.tools.executeAll()` or `autoExecuteTools`.
990
+ Pass `SogniTools.all` (or individual tool defs) to the LLM via `tools` and
991
+ execute calls through `sogni.chat.hosted.create()` / `sogni.chat.runs.create()`.
1001
992
 
1002
993
  DURABLE CREATIVE WORKFLOWS:
1003
994
  Use `sogni.creativeWorkflows` for `/v1/creative-agent/workflows` coverage:
package/llms.txt CHANGED
@@ -456,18 +456,9 @@ Combine LLM tool calling with Sogni's generation APIs to create media from natur
456
456
  - **Video-to-Video** — "Restyle this video as anime"
457
457
  - **Music Generation** — "Compose a jazz song about the rain"
458
458
 
459
- SDK-local public tool names (`SogniTools.all`, client-managed execution):
459
+ Canonical hosted creative-tool surface (`SogniTools.all`, 22 tools, executed server-side via `chat.hosted.create()` / `chat.runs.create()`):
460
460
 
461
- - `sogni_generate_image`
462
- - `sogni_edit_image`
463
- - `sogni_generate_video`
464
- - `sogni_sound_to_video`
465
- - `sogni_video_to_video`
466
- - `sogni_generate_music`
467
-
468
- Hosted creative tool families:
469
-
470
- - `generate_image`, `edit_image`, `generate_video`, `generate_music`, `sound_to_video`, `video_to_video`
461
+ - `generate_image`, `edit_image`, `generate_video`, `generate_music`, `sound_to_video`, `video_to_video` (generation)
471
462
  - `restore_photo`, `apply_style`, `refine_result`, `change_angle` (image-edit adapters)
472
463
  - `animate_photo` (image-to-video with multi-source fan-out via `sourceImageIndices`; composed into one MP4 by default — opt out with `stitched: false`)
473
464
  - `stitch_video`, `orbit_video`, `dance_montage` (server-side composition into a single MP4)
@@ -481,19 +472,19 @@ The default `creative-tools` surface includes the tools above. `sogni_tools: "cr
481
472
 
482
473
  Media-conditioned tools accept explicit inline base64 `data:` URIs such as `source_image_url`, `reference_image_url`, `reference_audio_url`, and `reference_video_url`. Remote `http(s)` URLs are not allowed for these tool inputs. Tool image inputs accept PNG/JPEG only, tool audio inputs accept MP3/M4A/WAV only, and tool video inputs accept MP4 or MOV/QuickTime only.
483
474
 
484
- The `workflow_text_chat_sogni_tools.mjs` example demonstrates the core image/video/music composition flows. `workflow_creative_agent_tools.mjs` demonstrates server-side hosted Sogni tool injection through `/v1/chat/completions`. For the full built-in SDK tool surface, use `SogniTools.all` with `sogni.chat.tools.executeAll()` or `autoExecuteTools`.
475
+ The `workflow_text_chat_sogni_tools.mjs` example demonstrates the core image/video/music composition flows. `workflow_creative_agent_tools.mjs` demonstrates server-side hosted Sogni tool injection through `/v1/chat/completions`. Pass `SogniTools.all` (or individual tool defs) to the LLM and execute calls through `sogni.chat.hosted.create()` / `sogni.chat.runs.create()`.
485
476
 
486
477
  Durable creative workflows: the SDK exposes persistent multi-step workflows through `sogni.creativeWorkflows` (`startImageToVideo`, `list`, `get`, `events`, `streamEvents`, `cancel`) backed by `/v1/creative-agent/workflows`. They require API-key auth. See `workflow_creative_agent_workflows.mjs` for start/list/get/events/stream/cancel coverage.
487
478
 
488
479
  Default generation models used by platform tools:
489
480
  | Tool | Model | Description |
490
481
  |------|-------|-------------|
491
- | `sogni_generate_image` | z_image_turbo_bf16 | Z-Image Turbo, ultra-fast 8-step |
492
- | `sogni_edit_image` | workflow/model-dependent | Reference-guided image editing with edit-capable Qwen/Flux models |
493
- | `sogni_generate_video` | ltx23-22b-fp8_t2v_distilled / ltx23-22b-fp8_i2v_distilled / Seedance selectors | Text-to-video or image-to-video |
494
- | `sogni_sound_to_video` | ltx23-22b-fp8_a2v_distilled / ltx23-22b-fp8_ia2v_distilled | Audio-driven video generation |
495
- | `sogni_video_to_video` | ltx23-22b-fp8_v2v_distilled / seedance-2-0 / WAN animate models | Video transformation / motion transfer |
496
- | `sogni_generate_music` | ace_step_1.5_turbo | ACE-Step 1.5 Turbo, fast music |
482
+ | `generate_image` | z_image_turbo_bf16 | Z-Image Turbo, ultra-fast 8-step |
483
+ | `edit_image` | workflow/model-dependent | Reference-guided image editing with edit-capable Qwen/Flux models |
484
+ | `generate_video` | ltx23-22b-fp8_t2v_distilled / ltx23-22b-fp8_i2v_distilled / Seedance selectors | Text-to-video or image-to-video |
485
+ | `sound_to_video` | ltx23-22b-fp8_a2v_distilled / ltx23-22b-fp8_ia2v_distilled | Audio-driven video generation |
486
+ | `video_to_video` | ltx23-22b-fp8_v2v_distilled / seedance-2-0 / WAN animate models | Video transformation / motion transfer |
487
+ | `generate_music` | ace_step_1.5_turbo | ACE-Step 1.5 Turbo, fast music |
497
488
 
498
489
  ---
499
490
 
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "4.2.0-alpha.21",
6
+ "version": "4.2.0-alpha.22",
7
7
  "engines": {
8
8
  "node": ">=22"
9
9
  },
@@ -31,7 +31,18 @@
31
31
  "llm-friendly"
32
32
  ],
33
33
  "main": "dist/index.js",
34
+ "module": "dist-esm/index.js",
34
35
  "types": "dist/index.d.ts",
36
+ "exports": {
37
+ ".": {
38
+ "types": "./dist/index.d.ts",
39
+ "import": "./dist-esm/index.js",
40
+ "require": "./dist/index.js",
41
+ "default": "./dist/index.js"
42
+ },
43
+ "./package.json": "./package.json"
44
+ },
45
+ "sideEffects": false,
35
46
  "files": [
36
47
  "CHANGELOG.md",
37
48
  "README.md",
@@ -39,15 +50,20 @@
39
50
  "llms.txt",
40
51
  "llms-full.txt",
41
52
  "dist/",
53
+ "dist-esm/",
42
54
  "src/"
43
55
  ],
44
56
  "scripts": {
45
- "clean": "rimraf ./dist",
57
+ "clean": "rimraf ./dist ./dist-esm",
46
58
  "prepublishOnly": "npm run build",
47
- "build": "npm run clean && tsc --project tsconfig.json",
48
- "test:chat-routing": "npm run build && node scripts/check-chat-model-routing.cjs",
59
+ "build": "npm run clean && tsc --project tsconfig.json && tsc --project tsconfig.esm.json && node scripts/write-dist-esm-package-json.mjs",
60
+ "test:chat-routing": "npm run check:hosted-tool-validation && npm run build && node scripts/check-chat-model-routing.cjs",
61
+ "sync:hosted-tool-validation": "node scripts/sync-hosted-tool-validation.mjs",
62
+ "check:hosted-tool-validation": "node scripts/sync-hosted-tool-validation.mjs --check",
63
+ "sync:hosted-tools-manifest": "node scripts/sync-hosted-tools-manifest.mjs",
64
+ "check:hosted-tools-manifest": "node scripts/sync-hosted-tools-manifest.mjs --check",
49
65
  "watch": "npm run clean && tsc --watch --project tsconfig.json",
50
- "watch:esm": "npm run clean && tsc --watch --project tsconfig.esm.json",
66
+ "watch:esm": "tsc --watch --project tsconfig.esm.json",
51
67
  "prettier": "prettier --check ./src",
52
68
  "prettier:fix": "prettier --write ./src",
53
69
  "release": "semantic-release",
@@ -31,6 +31,19 @@ import {
31
31
  const DEFAULT_TIMEOUT = 30 * 60 * 1000;
32
32
  const MAX_SOGNI_TOOL_CALLS_PER_ROUND = 8;
33
33
 
34
+ const DIRECT_PROJECT_DISPATCH_TOOL_NAMES: ReadonlySet<string> = new Set([
35
+ 'generate_image',
36
+ 'edit_image',
37
+ 'generate_video',
38
+ 'sound_to_video',
39
+ 'video_to_video',
40
+ 'generate_music'
41
+ ]);
42
+
43
+ function hasDirectProjectDispatch(toolCall: ToolCall): boolean {
44
+ return DIRECT_PROJECT_DISPATCH_TOOL_NAMES.has(toolCall.function.name);
45
+ }
46
+
34
47
  const MAX_INPUT_MEDIA_BYTES: Record<MediaType, number> = {
35
48
  image: 20 * 1024 * 1024,
36
49
  audio: 50 * 1024 * 1024,
@@ -87,21 +100,28 @@ class ChatToolsApi {
87
100
  const args = parseToolCallArguments(toolCall);
88
101
  const name = toolCall.function.name;
89
102
 
103
+ if (!hasDirectProjectDispatch(toolCall)) {
104
+ return this.makeErrorResult(
105
+ toolCall,
106
+ `Tool '${name}' must be executed via chat.hosted.create() or chat.runs.create().`
107
+ );
108
+ }
109
+
90
110
  try {
91
111
  assertHostedToolArguments(SogniTools.all, name, args);
92
112
 
93
113
  switch (name) {
94
- case 'sogni_generate_image':
114
+ case 'generate_image':
95
115
  return await this.executeImageGeneration(toolCall, args, options);
96
- case 'sogni_edit_image':
116
+ case 'edit_image':
97
117
  return await this.executeImageEdit(toolCall, args, options);
98
- case 'sogni_generate_video':
118
+ case 'generate_video':
99
119
  return await this.executeVideoGeneration(toolCall, args, options);
100
- case 'sogni_sound_to_video':
120
+ case 'sound_to_video':
101
121
  return await this.executeSoundToVideo(toolCall, args, options);
102
- case 'sogni_video_to_video':
122
+ case 'video_to_video':
103
123
  return await this.executeVideoToVideo(toolCall, args, options);
104
- case 'sogni_generate_music':
124
+ case 'generate_music':
105
125
  return await this.executeMusicGeneration(toolCall, args, options);
106
126
  default:
107
127
  return this.makeErrorResult(toolCall, `Unknown Sogni tool: ${name}`);
@@ -119,7 +139,7 @@ class ChatToolsApi {
119
139
  onToolProgress?: (toolCall: ToolCall, progress: ToolExecutionProgress) => void;
120
140
  }
121
141
  ): Promise<ToolExecutionResult[]> {
122
- const sogniToolCallCount = toolCalls.filter((toolCall) => isSogniToolCall(toolCall)).length;
142
+ const sogniToolCallCount = toolCalls.filter(hasDirectProjectDispatch).length;
123
143
  if (sogniToolCallCount > MAX_SOGNI_TOOL_CALLS_PER_ROUND) {
124
144
  throw new Error(
125
145
  `Too many Sogni tool calls in a single round (${sogniToolCallCount}); maximum is ${MAX_SOGNI_TOOL_CALLS_PER_ROUND}`
@@ -276,7 +296,7 @@ class ChatToolsApi {
276
296
  ): Promise<ToolExecutionResult> {
277
297
  const modelId = await this.selectModel({
278
298
  mediaType: 'image',
279
- requestedModel: resolveHostedToolModelSelector('sogni_generate_image', args)
299
+ requestedModel: resolveHostedToolModelSelector('generate_image', args)
280
300
  });
281
301
 
282
302
  const projectParams: Record<string, unknown> = {
@@ -318,12 +338,12 @@ class ChatToolsApi {
318
338
  const inputUrls = [...(sourceImageUrl ? [sourceImageUrl] : []), ...referenceImageUrls];
319
339
 
320
340
  if (inputUrls.length === 0) {
321
- throw new Error('sogni_edit_image requires source_image_url or reference_image_urls');
341
+ throw new Error('edit_image requires source_image_url or reference_image_urls');
322
342
  }
323
343
 
324
344
  const modelId = await this.selectModel({
325
345
  mediaType: 'image',
326
- requestedModel: resolveHostedToolModelSelector('sogni_edit_image', args),
346
+ requestedModel: resolveHostedToolModelSelector('edit_image', args),
327
347
  filter: isEditImageModel
328
348
  });
329
349
  const maxContextImages = getMaxContextImages(modelId);
@@ -379,7 +399,7 @@ class ChatToolsApi {
379
399
 
380
400
  const modelId = await this.selectModel({
381
401
  mediaType: 'video',
382
- requestedModel: resolveHostedToolModelSelector('sogni_generate_video', args),
402
+ requestedModel: resolveHostedToolModelSelector('generate_video', args),
383
403
  workflows: workflowPreference,
384
404
  preferredModelIds
385
405
  });
@@ -455,7 +475,7 @@ class ChatToolsApi {
455
475
  options?: ToolExecutionOptions
456
476
  ): Promise<ToolExecutionResult> {
457
477
  if (!isNonEmptyString(args.reference_audio_url)) {
458
- throw new Error('sogni_sound_to_video requires reference_audio_url');
478
+ throw new Error('sound_to_video requires reference_audio_url');
459
479
  }
460
480
 
461
481
  const hasReferenceImage = isNonEmptyString(args.reference_image_url);
@@ -465,7 +485,7 @@ class ChatToolsApi {
465
485
  : [PREFERRED_MODEL_IDS.video.a2v];
466
486
  const modelId = await this.selectModel({
467
487
  mediaType: 'video',
468
- requestedModel: resolveHostedToolModelSelector('sogni_sound_to_video', args),
488
+ requestedModel: resolveHostedToolModelSelector('sound_to_video', args),
469
489
  workflows,
470
490
  preferredModelIds
471
491
  });
@@ -516,7 +536,7 @@ class ChatToolsApi {
516
536
  options?: ToolExecutionOptions
517
537
  ): Promise<ToolExecutionResult> {
518
538
  if (!isNonEmptyString(args.reference_video_url)) {
519
- throw new Error('sogni_video_to_video requires reference_video_url');
539
+ throw new Error('video_to_video requires reference_video_url');
520
540
  }
521
541
 
522
542
  const controlMode = normalizeVideoControlMode(args.control_mode);
@@ -534,7 +554,7 @@ class ChatToolsApi {
534
554
  : [PREFERRED_MODEL_IDS.video.v2v];
535
555
  const modelId = await this.selectModel({
536
556
  mediaType: 'video',
537
- requestedModel: resolveHostedToolModelSelector('sogni_video_to_video', args),
557
+ requestedModel: resolveHostedToolModelSelector('video_to_video', args),
538
558
  workflows,
539
559
  preferredModelIds
540
560
  });
@@ -615,7 +635,7 @@ class ChatToolsApi {
615
635
  ): Promise<ToolExecutionResult> {
616
636
  const modelId = await this.selectModel({
617
637
  mediaType: 'audio',
618
- requestedModel: resolveHostedToolModelSelector('sogni_generate_music', args),
638
+ requestedModel: resolveHostedToolModelSelector('generate_music', args),
619
639
  preferredModelIds: [
620
640
  PREFERRED_MODEL_IDS.audio.aceStepTurbo,
621
641
  PREFERRED_MODEL_IDS.audio.aceStepSft