@byline/ai 1.9.0 → 1.10.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.
Files changed (129) hide show
  1. package/dist/@types.d.ts +0 -9
  2. package/dist/@types.d.ts.map +1 -1
  3. package/dist/@types.js +0 -10
  4. package/dist/@types.js.map +1 -1
  5. package/dist/execute.d.ts.map +1 -1
  6. package/dist/execute.js +13 -38
  7. package/dist/execute.js.map +1 -1
  8. package/dist/generate.d.ts +1 -2
  9. package/dist/generate.d.ts.map +1 -1
  10. package/dist/generate.js +53 -49
  11. package/dist/generate.js.map +1 -1
  12. package/dist/index.d.ts +3 -5
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -8
  15. package/dist/index.js.map +1 -1
  16. package/dist/lib/logger.d.ts +2 -2
  17. package/dist/lib/logger.d.ts.map +1 -1
  18. package/dist/lib/logger.js +27 -5
  19. package/dist/lib/logger.js.map +1 -1
  20. package/dist/models/anthropic/generate.d.ts +51 -8
  21. package/dist/models/anthropic/generate.d.ts.map +1 -1
  22. package/dist/models/anthropic/generate.js +261 -18
  23. package/dist/models/anthropic/generate.js.map +1 -1
  24. package/dist/models/anthropic/generate.test.node.js +7 -56
  25. package/dist/models/anthropic/generate.test.node.js.map +1 -1
  26. package/dist/models/anthropic/patch.d.ts +25 -4
  27. package/dist/models/anthropic/patch.d.ts.map +1 -1
  28. package/dist/models/anthropic/patch.js +142 -6
  29. package/dist/models/anthropic/patch.js.map +1 -1
  30. package/dist/models/anthropic/patch.test.node.js +7 -57
  31. package/dist/models/anthropic/patch.test.node.js.map +1 -1
  32. package/dist/models/google/generate.d.ts +51 -8
  33. package/dist/models/google/generate.d.ts.map +1 -1
  34. package/dist/models/google/generate.js +235 -19
  35. package/dist/models/google/generate.js.map +1 -1
  36. package/dist/models/google/generate.test.node.js +8 -56
  37. package/dist/models/google/generate.test.node.js.map +1 -1
  38. package/dist/models/google/patch.d.ts +25 -4
  39. package/dist/models/google/patch.d.ts.map +1 -1
  40. package/dist/models/google/patch.js +154 -6
  41. package/dist/models/google/patch.js.map +1 -1
  42. package/dist/models/google/patch.test.node.js +7 -57
  43. package/dist/models/google/patch.test.node.js.map +1 -1
  44. package/dist/models/openai/generate.d.ts +57 -8
  45. package/dist/models/openai/generate.d.ts.map +1 -1
  46. package/dist/models/openai/generate.js +266 -18
  47. package/dist/models/openai/generate.js.map +1 -1
  48. package/dist/models/openai/generate.test.node.js +7 -56
  49. package/dist/models/openai/generate.test.node.js.map +1 -1
  50. package/dist/models/openai/patch.d.ts +25 -4
  51. package/dist/models/openai/patch.d.ts.map +1 -1
  52. package/dist/models/openai/patch.js +141 -6
  53. package/dist/models/openai/patch.js.map +1 -1
  54. package/dist/models/openai/patch.test.node.js +7 -57
  55. package/dist/models/openai/patch.test.node.js.map +1 -1
  56. package/dist/patch.d.ts +2 -3
  57. package/dist/patch.d.ts.map +1 -1
  58. package/dist/patch.js +18 -16
  59. package/dist/patch.js.map +1 -1
  60. package/dist/plugins/ai-plugin-base.d.ts +1 -2
  61. package/dist/plugins/ai-plugin-base.d.ts.map +1 -1
  62. package/dist/plugins/ai-plugin-base.js +5 -20
  63. package/dist/plugins/ai-plugin-base.js.map +1 -1
  64. package/dist/plugins/lexical/plugin.d.ts.map +1 -1
  65. package/dist/plugins/lexical/plugin.js +3 -5
  66. package/dist/plugins/lexical/plugin.js.map +1 -1
  67. package/dist/plugins/storage.d.ts +1 -2
  68. package/dist/plugins/storage.d.ts.map +1 -1
  69. package/dist/plugins/storage.js +2 -4
  70. package/dist/plugins/storage.js.map +1 -1
  71. package/dist/plugins/text/plugin.d.ts.map +1 -1
  72. package/dist/plugins/text/plugin.js +3 -5
  73. package/dist/plugins/text/plugin.js.map +1 -1
  74. package/dist/{models/anthropic/anthropic.d.ts → utils/has-text.test.node.d.ts} +2 -2
  75. package/dist/utils/has-text.test.node.d.ts.map +1 -0
  76. package/dist/utils/has-text.test.node.js +70 -0
  77. package/dist/utils/has-text.test.node.js.map +1 -0
  78. package/package.json +6 -14
  79. package/dist/models/anthropic/anthropic.d.ts.map +0 -1
  80. package/dist/models/anthropic/anthropic.js +0 -20
  81. package/dist/models/anthropic/anthropic.js.map +0 -1
  82. package/dist/models/anthropic/generate-native.d.ts +0 -59
  83. package/dist/models/anthropic/generate-native.d.ts.map +0 -1
  84. package/dist/models/anthropic/generate-native.js +0 -271
  85. package/dist/models/anthropic/generate-native.js.map +0 -1
  86. package/dist/models/anthropic/generate-vercel.d.ts +0 -59
  87. package/dist/models/anthropic/generate-vercel.d.ts.map +0 -1
  88. package/dist/models/anthropic/generate-vercel.js +0 -126
  89. package/dist/models/anthropic/generate-vercel.js.map +0 -1
  90. package/dist/models/anthropic/patch-native.d.ts +0 -33
  91. package/dist/models/anthropic/patch-native.d.ts.map +0 -1
  92. package/dist/models/anthropic/patch-native.js +0 -152
  93. package/dist/models/anthropic/patch-native.js.map +0 -1
  94. package/dist/models/anthropic/patch-vercel.d.ts +0 -33
  95. package/dist/models/anthropic/patch-vercel.d.ts.map +0 -1
  96. package/dist/models/anthropic/patch-vercel.js +0 -47
  97. package/dist/models/anthropic/patch-vercel.js.map +0 -1
  98. package/dist/models/google/generate-native.d.ts +0 -59
  99. package/dist/models/google/generate-native.d.ts.map +0 -1
  100. package/dist/models/google/generate-native.js +0 -244
  101. package/dist/models/google/generate-native.js.map +0 -1
  102. package/dist/models/google/generate-vercel.d.ts +0 -59
  103. package/dist/models/google/generate-vercel.d.ts.map +0 -1
  104. package/dist/models/google/generate-vercel.js +0 -133
  105. package/dist/models/google/generate-vercel.js.map +0 -1
  106. package/dist/models/google/patch-native.d.ts +0 -33
  107. package/dist/models/google/patch-native.d.ts.map +0 -1
  108. package/dist/models/google/patch-native.js +0 -164
  109. package/dist/models/google/patch-native.js.map +0 -1
  110. package/dist/models/google/patch-vercel.d.ts +0 -33
  111. package/dist/models/google/patch-vercel.d.ts.map +0 -1
  112. package/dist/models/google/patch-vercel.js +0 -49
  113. package/dist/models/google/patch-vercel.js.map +0 -1
  114. package/dist/models/openai/generate-native.d.ts +0 -65
  115. package/dist/models/openai/generate-native.d.ts.map +0 -1
  116. package/dist/models/openai/generate-native.js +0 -276
  117. package/dist/models/openai/generate-native.js.map +0 -1
  118. package/dist/models/openai/generate-vercel.d.ts +0 -59
  119. package/dist/models/openai/generate-vercel.d.ts.map +0 -1
  120. package/dist/models/openai/generate-vercel.js +0 -132
  121. package/dist/models/openai/generate-vercel.js.map +0 -1
  122. package/dist/models/openai/patch-native.d.ts +0 -33
  123. package/dist/models/openai/patch-native.d.ts.map +0 -1
  124. package/dist/models/openai/patch-native.js +0 -151
  125. package/dist/models/openai/patch-native.js.map +0 -1
  126. package/dist/models/openai/patch-vercel.d.ts +0 -33
  127. package/dist/models/openai/patch-vercel.d.ts.map +0 -1
  128. package/dist/models/openai/patch-vercel.js +0 -49
  129. package/dist/models/openai/patch-vercel.js.map +0 -1
@@ -5,24 +5,272 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- import { generateDoc as generateNativeDoc, generateDocStreaming as generateNativeDocStreaming, generateHtml as generateNativeHtml, generateHtmlStreaming as generateNativeHtmlStreaming, generateText as generateNativeText, generateTextStreaming as generateNativeTextStreaming, } from './generate-native';
9
- import { generateDoc as generateVercelDoc, generateDocStreaming as generateVercelDocStreaming, generateHtml as generateVercelHtml, generateHtmlStreaming as generateVercelHtmlStreaming, generateText as generateVercelText, generateTextStreaming as generateVercelTextStreaming, } from './generate-vercel';
10
- export const getGenerateDoc = (sdk) => {
11
- return sdk === 'vercel' ? generateVercelDoc : generateNativeDoc;
8
+ import OpenAI from 'openai';
9
+ import { buildGenerateHtmlSystemPrompt, buildGenerateHtmlUserPrompt, buildGenerateSystemPrompt, buildGenerateTextSystemPrompt, buildGenerateTextUserPrompt, } from '../../prompts';
10
+ import { openaiGenerationSchema } from './schema';
11
+ export async function generateHtml(options) {
12
+ const client = new OpenAI({ apiKey: options.apiKey });
13
+ const result = await client.responses.create({
14
+ model: options.model,
15
+ input: [
16
+ { role: 'system', content: buildGenerateHtmlSystemPrompt() },
17
+ { role: 'user', content: buildGenerateHtmlUserPrompt(options.prompt) },
18
+ ],
19
+ text: {
20
+ format: { type: 'text' },
21
+ },
22
+ }, options.signal ? { signal: options.signal } : undefined);
23
+ const refusal = result?.output?.[0]?.content?.find((c) => c?.type === 'refusal')?.refusal;
24
+ if (typeof refusal === 'string' && refusal.length > 0) {
25
+ throw new Error(refusal);
26
+ }
27
+ const outputText = getOutputText(result);
28
+ if (typeof outputText === 'string' && outputText.trim().length > 0) {
29
+ return outputText.trim();
30
+ }
31
+ throw new Error('OpenAI did not return any HTML output.');
32
+ }
33
+ export function generateHtmlStreaming(options) {
34
+ const client = new OpenAI({ apiKey: options.apiKey });
35
+ const stream = client.responses.stream({
36
+ model: options.model,
37
+ input: [
38
+ { role: 'system', content: buildGenerateHtmlSystemPrompt() },
39
+ { role: 'user', content: buildGenerateHtmlUserPrompt(options.prompt) },
40
+ ],
41
+ text: {
42
+ format: { type: 'text' },
43
+ },
44
+ stream: true,
45
+ }, options.signal ? { signal: options.signal } : undefined);
46
+ const text = (async function* () {
47
+ for await (const event of stream) {
48
+ if (event.type === 'response.output_text.delta') {
49
+ yield event.delta;
50
+ }
51
+ }
52
+ })();
53
+ const final = (async () => {
54
+ const result = await stream.finalResponse();
55
+ const refusal = result?.output?.[0]?.content?.find((c) => c?.type === 'refusal')?.refusal;
56
+ if (typeof refusal === 'string' && refusal.length > 0) {
57
+ throw new Error(refusal);
58
+ }
59
+ const outputText = getOutputText(result);
60
+ if (typeof outputText === 'string' && outputText.trim().length > 0) {
61
+ return outputText.trim();
62
+ }
63
+ throw new Error('OpenAI did not return any HTML output.');
64
+ })();
65
+ return { text, final };
66
+ }
67
+ export async function generateText(options) {
68
+ const client = new OpenAI({ apiKey: options.apiKey });
69
+ const maxLength = typeof options.maxLength === 'number' && Number.isFinite(options.maxLength)
70
+ ? Math.floor(options.maxLength)
71
+ : undefined;
72
+ const promptWithLength = typeof maxLength === 'number' && maxLength > 0
73
+ ? `${options.prompt}\n\nConstraints:\n- Maximum length: ${maxLength} characters.`
74
+ : options.prompt;
75
+ const result = await client.responses.create({
76
+ model: options.model,
77
+ input: [
78
+ { role: 'system', content: buildGenerateTextSystemPrompt() },
79
+ { role: 'user', content: buildGenerateTextUserPrompt(promptWithLength) },
80
+ ],
81
+ text: {
82
+ format: { type: 'text' },
83
+ },
84
+ }, options.signal ? { signal: options.signal } : undefined);
85
+ const refusal = result?.output?.[0]?.content?.find((c) => c?.type === 'refusal')?.refusal;
86
+ if (typeof refusal === 'string' && refusal.length > 0) {
87
+ throw new Error(refusal);
88
+ }
89
+ const outputText = getOutputText(result);
90
+ if (typeof outputText !== 'string' || outputText.trim().length === 0) {
91
+ throw new Error('OpenAI did not return any plain text output.');
92
+ }
93
+ const normalized = outputText.trim();
94
+ if (typeof maxLength === 'number' && maxLength > 0) {
95
+ return normalized.length > maxLength ? normalized.slice(0, maxLength).trimEnd() : normalized;
96
+ }
97
+ return normalized;
98
+ }
99
+ export function generateTextStreaming(options) {
100
+ const client = new OpenAI({ apiKey: options.apiKey });
101
+ const maxLength = typeof options.maxLength === 'number' && Number.isFinite(options.maxLength)
102
+ ? Math.floor(options.maxLength)
103
+ : undefined;
104
+ const promptWithLength = typeof maxLength === 'number' && maxLength > 0
105
+ ? `${options.prompt}\n\nConstraints:\n- Maximum length: ${maxLength} characters.`
106
+ : options.prompt;
107
+ const stream = client.responses.stream({
108
+ model: options.model,
109
+ input: [
110
+ { role: 'system', content: buildGenerateTextSystemPrompt() },
111
+ { role: 'user', content: buildGenerateTextUserPrompt(promptWithLength) },
112
+ ],
113
+ text: {
114
+ format: { type: 'text' },
115
+ },
116
+ stream: true,
117
+ }, options.signal ? { signal: options.signal } : undefined);
118
+ const text = (async function* () {
119
+ let remaining = typeof maxLength === 'number' && maxLength > 0 ? maxLength : undefined;
120
+ for await (const event of stream) {
121
+ if (event.type !== 'response.output_text.delta') {
122
+ continue;
123
+ }
124
+ if (typeof remaining === 'number') {
125
+ if (remaining <= 0) {
126
+ continue;
127
+ }
128
+ const chunk = event.delta.slice(0, remaining);
129
+ remaining -= chunk.length;
130
+ if (chunk.length > 0) {
131
+ yield chunk;
132
+ }
133
+ continue;
134
+ }
135
+ yield event.delta;
136
+ }
137
+ })();
138
+ const final = (async () => {
139
+ const result = await stream.finalResponse();
140
+ const refusal = result?.output?.[0]?.content?.find((c) => c?.type === 'refusal')?.refusal;
141
+ if (typeof refusal === 'string' && refusal.length > 0) {
142
+ throw new Error(refusal);
143
+ }
144
+ const outputText = getOutputText(result);
145
+ if (typeof outputText !== 'string' || outputText.trim().length === 0) {
146
+ throw new Error('OpenAI did not return any plain text output.');
147
+ }
148
+ const normalized = outputText.trim();
149
+ if (typeof maxLength === 'number' && maxLength > 0) {
150
+ return normalized.length > maxLength ? normalized.slice(0, maxLength).trimEnd() : normalized;
151
+ }
152
+ return normalized;
153
+ })();
154
+ return { text, final };
155
+ }
156
+ const getOutputText = (result) => {
157
+ if (typeof result?.output_text === 'string') {
158
+ return result.output_text;
159
+ }
160
+ if (Array.isArray(result?.output)) {
161
+ const texts = [];
162
+ for (const output of result.output) {
163
+ if (output?.type !== 'message' || !Array.isArray(output?.content)) {
164
+ continue;
165
+ }
166
+ for (const content of output.content) {
167
+ if (content?.type === 'output_text' && typeof content?.text === 'string') {
168
+ texts.push(content.text);
169
+ }
170
+ }
171
+ }
172
+ if (texts.length > 0) {
173
+ return texts.join('');
174
+ }
175
+ }
176
+ return undefined;
12
177
  };
13
- export const getGenerateDocStreaming = (sdk) => {
14
- return sdk === 'vercel' ? generateVercelDocStreaming : generateNativeDocStreaming;
15
- };
16
- export const getGenerateHtml = (sdk) => {
17
- return sdk === 'vercel' ? generateVercelHtml : generateNativeHtml;
18
- };
19
- export const getGenerateHtmlStreaming = (sdk) => {
20
- return sdk === 'vercel' ? generateVercelHtmlStreaming : generateNativeHtmlStreaming;
21
- };
22
- export const getGenerateText = (sdk) => {
23
- return sdk === 'vercel' ? generateVercelText : generateNativeText;
24
- };
25
- export const getGenerateTextStreaming = (sdk) => {
26
- return sdk === 'vercel' ? generateVercelTextStreaming : generateNativeTextStreaming;
178
+ const parseGeneratedDoc = (result) => {
179
+ const parsed = result.output_parsed;
180
+ if (parsed && typeof parsed === 'object') {
181
+ return parsed;
182
+ }
183
+ const outputText = getOutputText(result);
184
+ if (typeof outputText === 'string' && outputText.trim().length > 0) {
185
+ try {
186
+ const json = JSON.parse(outputText);
187
+ if (json && typeof json === 'object') {
188
+ return json;
189
+ }
190
+ }
191
+ catch {
192
+ // fall through to error below
193
+ }
194
+ }
195
+ throw new Error('OpenAI structured output did not return a parsed object.');
27
196
  };
197
+ /***
198
+ * Generates a document from OpenAI using structured outputs.
199
+ */
200
+ export async function generateDoc(options) {
201
+ const client = new OpenAI({ apiKey: options.apiKey });
202
+ // OpenAI Structured Outputs expects `text.format` to be a json_schema format.
203
+ // Our `openaiGenerationSchema` matches the OpenAI shape (name/strict/schema),
204
+ // but we add the required discriminator here.
205
+ const format = {
206
+ type: 'json_schema',
207
+ ...openaiGenerationSchema,
208
+ };
209
+ const result = await client.responses.parse({
210
+ model: options.model,
211
+ input: [
212
+ {
213
+ role: 'system',
214
+ content: buildGenerateSystemPrompt(),
215
+ },
216
+ {
217
+ role: 'user',
218
+ content: options.prompt,
219
+ },
220
+ ],
221
+ text: {
222
+ format,
223
+ },
224
+ }, options.signal ? { signal: options.signal } : undefined);
225
+ // console.log(result.usage)
226
+ // If the model refused, the parsed output will be missing.
227
+ const refusal = result?.output?.[0]?.content?.find((c) => c?.type === 'refusal')?.refusal;
228
+ if (typeof refusal === 'string' && refusal.length > 0) {
229
+ throw new Error(refusal);
230
+ }
231
+ return parseGeneratedDoc(result);
232
+ }
233
+ /***
234
+ * Streams a document generation from OpenAI using structured outputs.
235
+ */
236
+ export function generateDocStreaming(options) {
237
+ const client = new OpenAI({ apiKey: options.apiKey });
238
+ const format = {
239
+ type: 'json_schema',
240
+ ...openaiGenerationSchema,
241
+ };
242
+ const stream = client.responses.stream({
243
+ model: options.model,
244
+ input: [
245
+ {
246
+ role: 'system',
247
+ content: buildGenerateSystemPrompt(),
248
+ },
249
+ {
250
+ role: 'user',
251
+ content: options.prompt,
252
+ },
253
+ ],
254
+ text: {
255
+ format,
256
+ },
257
+ stream: true,
258
+ }, options.signal ? { signal: options.signal } : undefined);
259
+ const text = (async function* () {
260
+ for await (const event of stream) {
261
+ if (event.type === 'response.output_text.delta') {
262
+ yield event.delta;
263
+ }
264
+ }
265
+ })();
266
+ const final = (async () => {
267
+ const result = await stream.finalResponse();
268
+ const refusal = result?.output?.[0]?.content?.find((c) => c?.type === 'refusal')?.refusal;
269
+ if (typeof refusal === 'string' && refusal.length > 0) {
270
+ throw new Error(refusal);
271
+ }
272
+ return parseGeneratedDoc(result);
273
+ })();
274
+ return { text, final };
275
+ }
28
276
  //# sourceMappingURL=generate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/models/openai/generate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,WAAW,IAAI,iBAAiB,EAChC,oBAAoB,IAAI,0BAA0B,EAClD,YAAY,IAAI,kBAAkB,EAClC,qBAAqB,IAAI,2BAA2B,EACpD,YAAY,IAAI,kBAAkB,EAClC,qBAAqB,IAAI,2BAA2B,GACrD,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,WAAW,IAAI,iBAAiB,EAChC,oBAAoB,IAAI,0BAA0B,EAClD,YAAY,IAAI,kBAAkB,EAClC,qBAAqB,IAAI,2BAA2B,EACpD,YAAY,IAAI,kBAAkB,EAClC,qBAAqB,IAAI,2BAA2B,GACrD,MAAM,mBAAmB,CAAA;AAG1B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAQ,EAAE,EAAE;IACzC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAQ,EAAE,EAAE;IAClD,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,0BAA0B,CAAA;AACnF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAQ,EAAE,EAAE;IAC1C,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAA;AACnE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAQ,EAAE,EAAE;IACnD,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,2BAA2B,CAAA;AACrF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAQ,EAAE,EAAE;IAC1C,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAA;AACnE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAQ,EAAE,EAAE;IACnD,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,2BAA2B,CAAA;AACrF,CAAC,CAAA"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/models/openai/generate.ts"],"names":[],"mappings":"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"}
@@ -7,39 +7,31 @@
7
7
  */
8
8
  import { beforeEach, describe, expect, it } from 'vitest';
9
9
  import { getAiServerConfig as getServerConfig } from '../../config/ai-config';
10
- import { generateDoc as generateDocNative, generateDocStreaming as generateDocStreamingNative, } from './generate-native';
11
- import { generateDocStreaming as generateDocStreamingVercel, generateDoc as generateDocVercel, } from './generate-vercel';
10
+ import { generateDoc, generateDocStreaming } from './generate';
12
11
  const MODEL = 'gpt-5.2';
13
12
  describe('openai generate', () => {
14
13
  beforeEach(async () => { });
15
14
  const runReal = process.env.AI_RUN_REAL_TESTS === 'true';
16
15
  if (runReal) {
17
- /***
18
- * Generates a document from OpenAI using structured outputs.
19
- */
20
- it.skip('makes a real OpenAI request (manual run) from native provider', async () => {
16
+ it.skip('makes a real OpenAI request (manual run)', async () => {
21
17
  const config = getServerConfig();
22
18
  if (!config.ai.openai.apiKey) {
23
19
  throw new Error('OPENAI_API_KEY is required for real OpenAI tests.');
24
20
  }
25
- const result = await generateDocNative({
21
+ const result = await generateDoc({
26
22
  apiKey: config.ai.openai.apiKey,
27
23
  model: MODEL,
28
24
  prompt: 'Create a haiku poem about a child by the sea.',
29
25
  });
30
- // console.log(result)
31
26
  expect(result).toBeTruthy();
32
27
  expect(typeof result).toBe('object');
33
28
  }, 30000);
34
- /***
35
- * Generates a document from OpenAI using structured outputs via streaming.
36
- */
37
- it.skip('streams a real OpenAI response (manual run) from native provider', async () => {
29
+ it.skip('streams a real OpenAI response (manual run)', async () => {
38
30
  const config = getServerConfig();
39
31
  if (!config.ai.openai.apiKey) {
40
32
  throw new Error('OPENAI_API_KEY is required for real OpenAI tests.');
41
33
  }
42
- const streamResult = generateDocStreamingNative({
34
+ const streamResult = generateDocStreaming({
43
35
  apiKey: config.ai.openai.apiKey,
44
36
  model: MODEL,
45
37
  prompt: 'Create a haiku poem about a child by the sea.',
@@ -47,51 +39,10 @@ describe('openai generate', () => {
47
39
  let streamedText = '';
48
40
  for await (const chunk of streamResult.text) {
49
41
  streamedText += chunk;
50
- console.log('STREAM CHUNK (OpenAI Native):', chunk);
42
+ console.log('STREAM CHUNK (OpenAI):', chunk);
51
43
  }
52
44
  const final = await streamResult.final;
53
- console.log('FINAL RESULT (OpenAI Native):', final);
54
- expect(streamedText.length).toBeGreaterThanOrEqual(0);
55
- expect(final).toBeTruthy();
56
- expect(typeof final).toBe('object');
57
- }, 30000);
58
- /***
59
- * Generates a document from OpenAI using structured outputs.
60
- */
61
- it.skip('makes a real OpenAI request (manual run) from vercel provider', async () => {
62
- const config = getServerConfig();
63
- if (!config.ai.openai.apiKey) {
64
- throw new Error('OPENAI_API_KEY is required for real OpenAI tests.');
65
- }
66
- const result = await generateDocVercel({
67
- apiKey: config.ai.openai.apiKey,
68
- model: MODEL,
69
- prompt: 'Create a haiku poem about a child by the sea.',
70
- });
71
- // console.log(result)
72
- expect(result).toBeTruthy();
73
- expect(typeof result).toBe('object');
74
- }, 30000);
75
- /***
76
- * Generates a document from OpenAI using structured outputs via streaming.
77
- */
78
- it.skip('streams a real OpenAI response (manual run) from vercel provider', async () => {
79
- const config = getServerConfig();
80
- if (!config.ai.openai.apiKey) {
81
- throw new Error('OPENAI_API_KEY is required for real OpenAI tests.');
82
- }
83
- const streamResult = generateDocStreamingVercel({
84
- apiKey: config.ai.openai.apiKey,
85
- model: MODEL,
86
- prompt: 'Create a haiku poem about a child by the sea.',
87
- });
88
- let streamedText = '';
89
- for await (const chunk of streamResult.text) {
90
- streamedText += chunk;
91
- console.log('STREAM CHUNK (OpenAI Vercel):', chunk);
92
- }
93
- const final = await streamResult.final;
94
- console.log('FINAL RESULT (OpenAI Vercel):', final);
45
+ console.log('FINAL RESULT (OpenAI):', final);
95
46
  expect(streamedText.length).toBeGreaterThanOrEqual(0);
96
47
  expect(final).toBeTruthy();
97
48
  expect(typeof final).toBe('object');
@@ -1 +1 @@
1
- {"version":3,"file":"generate.test.node.js","sourceRoot":"","sources":["../../../src/models/openai/generate.test.node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.test.node.js","sourceRoot":"","sources":["../../../src/models/openai/generate.test.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEzD,OAAO,EAAE,iBAAiB,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7E,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAE9D,MAAM,KAAK,GAAG,SAAS,CAAA;AAEvB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;IAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAA;IAExD,IAAI,OAAO,EAAE,CAAC;QACZ,EAAE,CAAC,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;YAChC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;YACtE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;gBAC/B,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM;gBAC/B,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,+CAA+C;aACxD,CAAC,CAAA;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAA;YAC3B,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtC,CAAC,EAAE,KAAK,CAAC,CAAA;QAET,EAAE,CAAC,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;YAChC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;YACtE,CAAC;YAED,MAAM,YAAY,GAAG,oBAAoB,CAAC;gBACxC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM;gBAC/B,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,+CAA+C;aACxD,CAAC,CAAA;YAEF,IAAI,YAAY,GAAG,EAAE,CAAA;YACrB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;gBAC5C,YAAY,IAAI,KAAK,CAAA;gBACrB,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAA;YAC9C,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAA;YACtC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YACrD,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAA;YAC1B,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrC,CAAC,EAAE,KAAK,CAAC,CAAA;IACX,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACtC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"}
@@ -5,8 +5,29 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- import { patchDoc as patchVercelDoc, patchDocStreaming as patchVercelDocStreaming } from './patch-vercel';
9
- import type { Sdk } from '../../@types';
10
- export declare const getPatchDoc: (sdk: Sdk) => typeof patchVercelDoc;
11
- export declare const getPatchDocStreaming: (sdk: Sdk) => typeof patchVercelDocStreaming;
8
+ import type { LexicalTextEditsResponse } from '../../utils/lexical-text-edits';
9
+ export type PatchDocStreamingResult = {
10
+ text: AsyncIterable<string>;
11
+ final: Promise<LexicalTextEditsResponse>;
12
+ };
13
+ export declare function patchDoc(options: {
14
+ apiKey: string;
15
+ model: string;
16
+ prompt: string;
17
+ textNodes: Array<{
18
+ id: number;
19
+ text: string;
20
+ }>;
21
+ signal?: AbortSignal;
22
+ }): Promise<LexicalTextEditsResponse>;
23
+ export declare function patchDocStreaming(options: {
24
+ apiKey: string;
25
+ model: string;
26
+ prompt: string;
27
+ textNodes: Array<{
28
+ id: number;
29
+ text: string;
30
+ }>;
31
+ signal?: AbortSignal;
32
+ }): PatchDocStreamingResult;
12
33
  //# sourceMappingURL=patch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../../src/models/openai/patch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EACL,QAAQ,IAAI,cAAc,EAC1B,iBAAiB,IAAI,uBAAuB,EAC7C,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAEnC,eAAO,MAAM,WAAW,GAAI,KAAK,GAAG,0BAEnC,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,KAAK,GAAG,mCAE5C,CAAA"}
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../../src/models/openai/patch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AAsC1E,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC3B,KAAK,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAA;CACzC,CAAA;AAgDD,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAsCpC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB,GAAG,uBAAuB,CAmD1B"}
@@ -5,12 +5,147 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- import { patchDoc as patchNativeDoc, patchDocStreaming as patchNativeDocStreaming, } from './patch-native';
9
- import { patchDoc as patchVercelDoc, patchDocStreaming as patchVercelDocStreaming, } from './patch-vercel';
10
- export const getPatchDoc = (sdk) => {
11
- return sdk === 'vercel' ? patchVercelDoc : patchNativeDoc;
8
+ import OpenAI from 'openai';
9
+ import { buildPatchSystemPrompt } from '../../prompts';
10
+ const buildPatchUserPrompt = (instruction, textNodes) => {
11
+ return [
12
+ `INSTRUCTION: ${instruction}`,
13
+ '',
14
+ 'INPUT_TEXT_NODES_JSON:',
15
+ JSON.stringify(textNodes),
16
+ ].join('\n');
12
17
  };
13
- export const getPatchDocStreaming = (sdk) => {
14
- return sdk === 'vercel' ? patchVercelDocStreaming : patchNativeDocStreaming;
18
+ const openaiPatchSchema = {
19
+ name: 'lexical_text_edits_v1',
20
+ strict: true,
21
+ schema: {
22
+ type: 'object',
23
+ additionalProperties: false,
24
+ properties: {
25
+ edits: {
26
+ type: 'array',
27
+ items: {
28
+ type: 'object',
29
+ additionalProperties: false,
30
+ properties: {
31
+ id: { type: 'number' },
32
+ text: { type: 'string' },
33
+ },
34
+ required: ['id', 'text'],
35
+ },
36
+ },
37
+ },
38
+ required: ['edits'],
39
+ },
15
40
  };
41
+ const getOutputText = (result) => {
42
+ if (typeof result?.output_text === 'string') {
43
+ return result.output_text;
44
+ }
45
+ if (Array.isArray(result?.output)) {
46
+ const texts = [];
47
+ for (const output of result.output) {
48
+ if (output?.type !== 'message' || !Array.isArray(output?.content)) {
49
+ continue;
50
+ }
51
+ for (const content of output.content) {
52
+ if (content?.type === 'output_text' && typeof content?.text === 'string') {
53
+ texts.push(content.text);
54
+ }
55
+ }
56
+ }
57
+ if (texts.length > 0) {
58
+ return texts.join('');
59
+ }
60
+ }
61
+ return undefined;
62
+ };
63
+ const parsePatchResponse = (result) => {
64
+ const parsed = result.output_parsed;
65
+ if (parsed && typeof parsed === 'object') {
66
+ return parsed;
67
+ }
68
+ const outputText = getOutputText(result);
69
+ if (typeof outputText === 'string' && outputText.trim().length > 0) {
70
+ try {
71
+ const json = JSON.parse(outputText);
72
+ if (json && typeof json === 'object') {
73
+ return json;
74
+ }
75
+ }
76
+ catch {
77
+ // fall through to error below
78
+ }
79
+ }
80
+ throw new Error('OpenAI structured output did not return a parsed object.');
81
+ };
82
+ export async function patchDoc(options) {
83
+ const client = new OpenAI({ apiKey: options.apiKey });
84
+ const format = {
85
+ type: 'json_schema',
86
+ ...openaiPatchSchema,
87
+ };
88
+ const result = await client.responses.parse({
89
+ model: options.model,
90
+ input: [
91
+ {
92
+ role: 'system',
93
+ content: buildPatchSystemPrompt(),
94
+ },
95
+ {
96
+ role: 'user',
97
+ content: buildPatchUserPrompt(options.prompt, options.textNodes),
98
+ },
99
+ ],
100
+ text: {
101
+ format,
102
+ },
103
+ }, options.signal ? { signal: options.signal } : undefined);
104
+ // console.log(result.usage)
105
+ const refusal = result?.output?.[0]?.content?.find((c) => c?.type === 'refusal')?.refusal;
106
+ if (typeof refusal === 'string' && refusal.length > 0) {
107
+ throw new Error(refusal);
108
+ }
109
+ return parsePatchResponse(result);
110
+ }
111
+ export function patchDocStreaming(options) {
112
+ const client = new OpenAI({ apiKey: options.apiKey });
113
+ const format = {
114
+ type: 'json_schema',
115
+ ...openaiPatchSchema,
116
+ };
117
+ const stream = client.responses.stream({
118
+ model: options.model,
119
+ input: [
120
+ {
121
+ role: 'system',
122
+ content: buildPatchSystemPrompt(),
123
+ },
124
+ {
125
+ role: 'user',
126
+ content: buildPatchUserPrompt(options.prompt, options.textNodes),
127
+ },
128
+ ],
129
+ text: {
130
+ format,
131
+ },
132
+ stream: true,
133
+ }, options.signal ? { signal: options.signal } : undefined);
134
+ const text = (async function* () {
135
+ for await (const event of stream) {
136
+ if (event.type === 'response.output_text.delta') {
137
+ yield event.delta;
138
+ }
139
+ }
140
+ })();
141
+ const final = (async () => {
142
+ const result = await stream.finalResponse();
143
+ const refusal = result?.output?.[0]?.content?.find((c) => c?.type === 'refusal')?.refusal;
144
+ if (typeof refusal === 'string' && refusal.length > 0) {
145
+ throw new Error(refusal);
146
+ }
147
+ return parsePatchResponse(result);
148
+ })();
149
+ return { text, final };
150
+ }
16
151
  //# sourceMappingURL=patch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../../src/models/openai/patch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,QAAQ,IAAI,cAAc,EAC1B,iBAAiB,IAAI,uBAAuB,GAC7C,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,QAAQ,IAAI,cAAc,EAC1B,iBAAiB,IAAI,uBAAuB,GAC7C,MAAM,gBAAgB,CAAA;AAGvB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAQ,EAAE,EAAE;IACtC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAA;AAC3D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAQ,EAAE,EAAE;IAC/C,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,CAAA;AAC7E,CAAC,CAAA"}
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../../src/models/openai/patch.ts"],"names":[],"mappings":"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"}