hazo_llm_api 1.0.4 → 1.0.5

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 (145) hide show
  1. package/dist/components/index.d.ts +7 -0
  2. package/dist/components/index.d.ts.map +1 -0
  3. package/dist/components/index.js +7 -0
  4. package/dist/components/index.js.map +1 -0
  5. package/dist/components/layout/index.d.ts +7 -0
  6. package/dist/components/layout/index.d.ts.map +1 -0
  7. package/dist/components/layout/index.js +7 -0
  8. package/dist/components/layout/index.js.map +1 -0
  9. package/dist/components/layout/layout.d.ts +21 -0
  10. package/dist/components/layout/layout.d.ts.map +1 -0
  11. package/dist/components/layout/layout.js +18 -0
  12. package/dist/components/layout/layout.js.map +1 -0
  13. package/dist/index.d.ts +15 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +21 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/lib/config/config_parser.d.ts +131 -0
  18. package/dist/lib/config/config_parser.d.ts.map +1 -0
  19. package/dist/lib/config/config_parser.js +297 -0
  20. package/dist/lib/config/config_parser.js.map +1 -0
  21. package/dist/lib/config/index.d.ts +8 -0
  22. package/dist/lib/config/index.d.ts.map +1 -0
  23. package/dist/lib/config/index.js +22 -0
  24. package/dist/lib/config/index.js.map +1 -0
  25. package/dist/lib/config/provider_loader.d.ts +113 -0
  26. package/dist/lib/config/provider_loader.d.ts.map +1 -0
  27. package/dist/lib/config/provider_loader.js +169 -0
  28. package/dist/lib/config/provider_loader.js.map +1 -0
  29. package/dist/lib/database/index.d.ts +8 -0
  30. package/dist/lib/database/index.d.ts.map +1 -0
  31. package/dist/lib/database/index.js +10 -0
  32. package/dist/lib/database/index.js.map +1 -0
  33. package/dist/lib/database/init_database.d.ts +118 -0
  34. package/dist/lib/database/init_database.d.ts.map +1 -0
  35. package/dist/lib/database/init_database.js +591 -0
  36. package/dist/lib/database/init_database.js.map +1 -0
  37. package/dist/lib/database/utils.d.ts +53 -0
  38. package/dist/lib/database/utils.d.ts.map +1 -0
  39. package/dist/lib/database/utils.js +87 -0
  40. package/dist/lib/database/utils.js.map +1 -0
  41. package/dist/lib/index.d.ts +14 -0
  42. package/dist/lib/index.d.ts.map +1 -0
  43. package/dist/lib/index.js +17 -0
  44. package/dist/lib/index.js.map +1 -0
  45. package/dist/lib/llm_api/chain_helpers.d.ts +117 -0
  46. package/dist/lib/llm_api/chain_helpers.d.ts.map +1 -0
  47. package/dist/lib/llm_api/chain_helpers.js +445 -0
  48. package/dist/lib/llm_api/chain_helpers.js.map +1 -0
  49. package/dist/lib/llm_api/hazo_llm_image_image.d.ts +26 -0
  50. package/dist/lib/llm_api/hazo_llm_image_image.d.ts.map +1 -0
  51. package/dist/lib/llm_api/hazo_llm_image_image.js +94 -0
  52. package/dist/lib/llm_api/hazo_llm_image_image.js.map +1 -0
  53. package/dist/lib/llm_api/hazo_llm_image_image_text.d.ts +26 -0
  54. package/dist/lib/llm_api/hazo_llm_image_image_text.d.ts.map +1 -0
  55. package/dist/lib/llm_api/hazo_llm_image_image_text.js +222 -0
  56. package/dist/lib/llm_api/hazo_llm_image_image_text.js.map +1 -0
  57. package/dist/lib/llm_api/hazo_llm_image_text.d.ts +20 -0
  58. package/dist/lib/llm_api/hazo_llm_image_text.d.ts.map +1 -0
  59. package/dist/lib/llm_api/hazo_llm_image_text.js +78 -0
  60. package/dist/lib/llm_api/hazo_llm_image_text.js.map +1 -0
  61. package/dist/lib/llm_api/hazo_llm_prompt_chain.d.ts +20 -0
  62. package/dist/lib/llm_api/hazo_llm_prompt_chain.d.ts.map +1 -0
  63. package/dist/lib/llm_api/hazo_llm_prompt_chain.js +368 -0
  64. package/dist/lib/llm_api/hazo_llm_prompt_chain.js.map +1 -0
  65. package/dist/lib/llm_api/hazo_llm_text_image.d.ts +20 -0
  66. package/dist/lib/llm_api/hazo_llm_text_image.d.ts.map +1 -0
  67. package/dist/lib/llm_api/hazo_llm_text_image.js +69 -0
  68. package/dist/lib/llm_api/hazo_llm_text_image.js.map +1 -0
  69. package/dist/lib/llm_api/hazo_llm_text_image_text.d.ts +26 -0
  70. package/dist/lib/llm_api/hazo_llm_text_image_text.d.ts.map +1 -0
  71. package/dist/lib/llm_api/hazo_llm_text_image_text.js +154 -0
  72. package/dist/lib/llm_api/hazo_llm_text_image_text.js.map +1 -0
  73. package/dist/lib/llm_api/hazo_llm_text_text.d.ts +20 -0
  74. package/dist/lib/llm_api/hazo_llm_text_text.d.ts.map +1 -0
  75. package/dist/lib/llm_api/hazo_llm_text_text.js +91 -0
  76. package/dist/lib/llm_api/hazo_llm_text_text.js.map +1 -0
  77. package/dist/lib/llm_api/index.d.ts +223 -0
  78. package/dist/lib/llm_api/index.d.ts.map +1 -0
  79. package/dist/lib/llm_api/index.js +1220 -0
  80. package/dist/lib/llm_api/index.js.map +1 -0
  81. package/dist/lib/llm_api/provider_helper.d.ts +163 -0
  82. package/dist/lib/llm_api/provider_helper.d.ts.map +1 -0
  83. package/dist/lib/llm_api/provider_helper.js +346 -0
  84. package/dist/lib/llm_api/provider_helper.js.map +1 -0
  85. package/dist/lib/llm_api/types.d.ts +667 -0
  86. package/dist/lib/llm_api/types.d.ts.map +1 -0
  87. package/dist/lib/llm_api/types.js +49 -0
  88. package/dist/lib/llm_api/types.js.map +1 -0
  89. package/dist/lib/prompts/get_prompt.d.ts +76 -0
  90. package/dist/lib/prompts/get_prompt.d.ts.map +1 -0
  91. package/dist/lib/prompts/get_prompt.js +342 -0
  92. package/dist/lib/prompts/get_prompt.js.map +1 -0
  93. package/dist/lib/prompts/index.d.ts +9 -0
  94. package/dist/lib/prompts/index.d.ts.map +1 -0
  95. package/dist/lib/prompts/index.js +9 -0
  96. package/dist/lib/prompts/index.js.map +1 -0
  97. package/dist/lib/prompts/prompt_cache.d.ts +151 -0
  98. package/dist/lib/prompts/prompt_cache.d.ts.map +1 -0
  99. package/dist/lib/prompts/prompt_cache.js +276 -0
  100. package/dist/lib/prompts/prompt_cache.js.map +1 -0
  101. package/dist/lib/prompts/substitute_variables.d.ts +38 -0
  102. package/dist/lib/prompts/substitute_variables.d.ts.map +1 -0
  103. package/dist/lib/prompts/substitute_variables.js +171 -0
  104. package/dist/lib/prompts/substitute_variables.js.map +1 -0
  105. package/dist/lib/providers/gemini/gemini_client.d.ts +25 -0
  106. package/dist/lib/providers/gemini/gemini_client.d.ts.map +1 -0
  107. package/dist/lib/providers/gemini/gemini_client.js +235 -0
  108. package/dist/lib/providers/gemini/gemini_client.js.map +1 -0
  109. package/dist/lib/providers/gemini/gemini_provider.d.ts +111 -0
  110. package/dist/lib/providers/gemini/gemini_provider.d.ts.map +1 -0
  111. package/dist/lib/providers/gemini/gemini_provider.js +431 -0
  112. package/dist/lib/providers/gemini/gemini_provider.js.map +1 -0
  113. package/dist/lib/providers/gemini/index.d.ts +8 -0
  114. package/dist/lib/providers/gemini/index.d.ts.map +1 -0
  115. package/dist/lib/providers/gemini/index.js +8 -0
  116. package/dist/lib/providers/gemini/index.js.map +1 -0
  117. package/dist/lib/providers/index.d.ts +8 -0
  118. package/dist/lib/providers/index.d.ts.map +1 -0
  119. package/dist/lib/providers/index.js +8 -0
  120. package/dist/lib/providers/index.js.map +1 -0
  121. package/dist/lib/providers/qwen/index.d.ts +8 -0
  122. package/dist/lib/providers/qwen/index.d.ts.map +1 -0
  123. package/dist/lib/providers/qwen/index.js +8 -0
  124. package/dist/lib/providers/qwen/index.js.map +1 -0
  125. package/dist/lib/providers/qwen/qwen_client.d.ts +154 -0
  126. package/dist/lib/providers/qwen/qwen_client.d.ts.map +1 -0
  127. package/dist/lib/providers/qwen/qwen_client.js +1002 -0
  128. package/dist/lib/providers/qwen/qwen_client.js.map +1 -0
  129. package/dist/lib/providers/qwen/qwen_provider.d.ts +139 -0
  130. package/dist/lib/providers/qwen/qwen_provider.d.ts.map +1 -0
  131. package/dist/lib/providers/qwen/qwen_provider.js +304 -0
  132. package/dist/lib/providers/qwen/qwen_provider.js.map +1 -0
  133. package/dist/lib/providers/registry.d.ts +66 -0
  134. package/dist/lib/providers/registry.d.ts.map +1 -0
  135. package/dist/lib/providers/registry.js +158 -0
  136. package/dist/lib/providers/registry.js.map +1 -0
  137. package/dist/lib/providers/types.d.ts +145 -0
  138. package/dist/lib/providers/types.d.ts.map +1 -0
  139. package/dist/lib/providers/types.js +37 -0
  140. package/dist/lib/providers/types.js.map +1 -0
  141. package/dist/server.d.ts +27 -0
  142. package/dist/server.d.ts.map +1 -0
  143. package/dist/server.js +50 -0
  144. package/dist/server.js.map +1 -0
  145. package/package.json +12 -1
@@ -0,0 +1,445 @@
1
+ /**
2
+ * Chain Helper Functions
3
+ *
4
+ * Utility functions for parsing call_chain paths, resolving values,
5
+ * and deep merging results in prompt chains.
6
+ */
7
+ const FILE_NAME = 'chain_helpers.ts';
8
+ // =============================================================================
9
+ // Path Parsing Functions
10
+ // =============================================================================
11
+ /**
12
+ * Parse a call_chain path expression like "call[0].tax_category" or "call[2].data.nested.value"
13
+ *
14
+ * @param path_expr - The path expression to parse
15
+ * @param logger - Logger instance
16
+ * @returns Parsed path with call index and property path array, or null if invalid
17
+ */
18
+ export function parse_call_chain_path(path_expr, logger) {
19
+ // Pattern: call[N].property.path
20
+ const match = path_expr.match(/^call\[(\d+)\]\.(.+)$/);
21
+ if (!match) {
22
+ logger.error('Invalid call_chain path format', {
23
+ file: FILE_NAME,
24
+ data: { path_expr, expected_format: 'call[N].property.path' },
25
+ });
26
+ return null;
27
+ }
28
+ const call_index = parseInt(match[1], 10);
29
+ const property_path = match[2].split('.');
30
+ logger.debug('Parsed call_chain path', {
31
+ file: FILE_NAME,
32
+ data: { path_expr, call_index, property_path },
33
+ });
34
+ return { call_index, property_path };
35
+ }
36
+ /**
37
+ * Extract a value from a nested object using a property path array
38
+ *
39
+ * @param obj - The object to extract from
40
+ * @param path - Array of property names to traverse
41
+ * @param logger - Logger instance
42
+ * @returns The extracted value as a string, or null if not found
43
+ */
44
+ export function extract_value_from_path(obj, path, logger) {
45
+ let current = obj;
46
+ for (const key of path) {
47
+ if (current === null || current === undefined) {
48
+ logger.warn('Path traversal encountered null/undefined', {
49
+ file: FILE_NAME,
50
+ data: { path, failed_at: key },
51
+ });
52
+ return null;
53
+ }
54
+ if (typeof current !== 'object') {
55
+ logger.warn('Path traversal encountered non-object', {
56
+ file: FILE_NAME,
57
+ data: { path, failed_at: key, type: typeof current },
58
+ });
59
+ return null;
60
+ }
61
+ current = current[key];
62
+ }
63
+ // Convert result to string
64
+ if (current === null || current === undefined) {
65
+ return null;
66
+ }
67
+ if (typeof current === 'string') {
68
+ return current;
69
+ }
70
+ if (typeof current === 'number' || typeof current === 'boolean') {
71
+ return String(current);
72
+ }
73
+ // For objects/arrays, return JSON string
74
+ return JSON.stringify(current);
75
+ }
76
+ /**
77
+ * Extract a value from a ChainCallResult using a property path
78
+ * Supports both parsed_result fields and top-level image/text fields
79
+ *
80
+ * Examples:
81
+ * - "image_b64" -> returns result.image_b64
82
+ * - "image_mime_type" -> returns result.image_mime_type
83
+ * - "raw_text" -> returns result.raw_text
84
+ * - "country" -> traverses result.parsed_result.country
85
+ * - "data.nested.value" -> traverses result.parsed_result.data.nested.value
86
+ *
87
+ * @param result - The ChainCallResult to extract from
88
+ * @param property_path - Array of property names to traverse
89
+ * @param logger - Logger instance
90
+ * @returns The extracted value as a string, or null if not found
91
+ */
92
+ export function extract_value_from_result(result, property_path, logger) {
93
+ if (property_path.length === 0) {
94
+ logger.warn('Empty property path provided', { file: FILE_NAME });
95
+ return null;
96
+ }
97
+ const first_key = property_path[0];
98
+ // Handle top-level image fields directly
99
+ if (property_path.length === 1) {
100
+ if (first_key === 'image_b64' && result.image_b64) {
101
+ return result.image_b64;
102
+ }
103
+ if (first_key === 'image_mime_type' && result.image_mime_type) {
104
+ return result.image_mime_type;
105
+ }
106
+ if (first_key === 'raw_text' && result.raw_text) {
107
+ return result.raw_text;
108
+ }
109
+ }
110
+ // For paths starting with top-level fields that don't exist, try parsed_result
111
+ if (first_key === 'image_b64' || first_key === 'image_mime_type' || first_key === 'raw_text') {
112
+ // These are top-level only, no nesting
113
+ if (property_path.length === 1) {
114
+ logger.warn('Top-level field not found in result', {
115
+ file: FILE_NAME,
116
+ data: { field: first_key, has_field: false },
117
+ });
118
+ return null;
119
+ }
120
+ }
121
+ // Otherwise, extract from parsed_result
122
+ if (!result.parsed_result) {
123
+ logger.warn('No parsed_result available for path extraction', {
124
+ file: FILE_NAME,
125
+ data: { property_path },
126
+ });
127
+ return null;
128
+ }
129
+ return extract_value_from_path(result.parsed_result, property_path, logger);
130
+ }
131
+ // =============================================================================
132
+ // Value Resolution Functions
133
+ // =============================================================================
134
+ /**
135
+ * Resolve a chain field definition to its actual value
136
+ * Supports both parsed_result fields and top-level image/text fields
137
+ *
138
+ * @param field - The field definition to resolve
139
+ * @param previous_results - Array of previous call results
140
+ * @param logger - Logger instance
141
+ * @returns Resolved string value, or null if resolution failed
142
+ */
143
+ export function resolve_chain_field(field, previous_results, logger) {
144
+ if (field.match_type === 'direct') {
145
+ return field.value;
146
+ }
147
+ // match_type === 'call_chain'
148
+ const parsed = parse_call_chain_path(field.value, logger);
149
+ if (!parsed) {
150
+ return null;
151
+ }
152
+ // Check if referenced call exists
153
+ if (parsed.call_index >= previous_results.length) {
154
+ logger.error('call_chain references future or non-existent call', {
155
+ file: FILE_NAME,
156
+ data: {
157
+ call_index: parsed.call_index,
158
+ available_calls: previous_results.length,
159
+ },
160
+ });
161
+ return null;
162
+ }
163
+ const referenced_result = previous_results[parsed.call_index];
164
+ // Check if referenced call was successful
165
+ if (!referenced_result.success) {
166
+ logger.warn('call_chain references failed call', {
167
+ file: FILE_NAME,
168
+ data: {
169
+ call_index: parsed.call_index,
170
+ success: referenced_result.success,
171
+ },
172
+ });
173
+ return null;
174
+ }
175
+ // Extract value from result (supports both image fields and parsed_result)
176
+ const value = extract_value_from_result(referenced_result, parsed.property_path, logger);
177
+ if (value === null) {
178
+ logger.warn('Could not extract value from call_chain path', {
179
+ file: FILE_NAME,
180
+ data: {
181
+ path: field.value,
182
+ call_index: parsed.call_index,
183
+ },
184
+ });
185
+ }
186
+ return value;
187
+ }
188
+ // =============================================================================
189
+ // Variable Building Functions
190
+ // =============================================================================
191
+ /**
192
+ * Resolve a chain variable definition to its actual value
193
+ * Supports both parsed_result fields and top-level image/text fields
194
+ *
195
+ * @param variable - The variable definition to resolve
196
+ * @param previous_results - Array of previous call results
197
+ * @param logger - Logger instance
198
+ * @returns Resolved string value, or null if resolution failed
199
+ */
200
+ export function resolve_chain_variable(variable, previous_results, logger) {
201
+ if (variable.match_type === 'direct') {
202
+ return variable.value;
203
+ }
204
+ // match_type === 'call_chain'
205
+ const parsed = parse_call_chain_path(variable.value, logger);
206
+ if (!parsed) {
207
+ return null;
208
+ }
209
+ // Check if referenced call exists
210
+ if (parsed.call_index >= previous_results.length) {
211
+ logger.error('call_chain references future or non-existent call', {
212
+ file: FILE_NAME,
213
+ data: {
214
+ call_index: parsed.call_index,
215
+ available_calls: previous_results.length,
216
+ variable_name: variable.variable_name,
217
+ },
218
+ });
219
+ return null;
220
+ }
221
+ const referenced_result = previous_results[parsed.call_index];
222
+ // Check if referenced call was successful
223
+ if (!referenced_result.success) {
224
+ logger.warn('call_chain references failed call', {
225
+ file: FILE_NAME,
226
+ data: {
227
+ call_index: parsed.call_index,
228
+ success: referenced_result.success,
229
+ variable_name: variable.variable_name,
230
+ },
231
+ });
232
+ return null;
233
+ }
234
+ // Extract value from result (supports both image fields and parsed_result)
235
+ const value = extract_value_from_result(referenced_result, parsed.property_path, logger);
236
+ if (value === null) {
237
+ logger.warn('Could not extract value from call_chain path', {
238
+ file: FILE_NAME,
239
+ data: {
240
+ path: variable.value,
241
+ call_index: parsed.call_index,
242
+ variable_name: variable.variable_name,
243
+ },
244
+ });
245
+ }
246
+ return value;
247
+ }
248
+ /**
249
+ * Build prompt variables from a variables array in a chain call definition
250
+ *
251
+ * @param variables_array - Array of variable definitions
252
+ * @param previous_results - Array of previous call results
253
+ * @param logger - Logger instance
254
+ * @returns PromptVariables array for substitution
255
+ */
256
+ export function build_prompt_variables(variables_array, previous_results, logger) {
257
+ if (!variables_array || variables_array.length === 0) {
258
+ return [];
259
+ }
260
+ const variables = {};
261
+ variables_array.forEach((variable, index) => {
262
+ if (!variable.variable_name) {
263
+ logger.warn('Variable definition missing variable_name', {
264
+ file: FILE_NAME,
265
+ data: { index },
266
+ });
267
+ return;
268
+ }
269
+ const resolved_value = resolve_chain_variable(variable, previous_results, logger);
270
+ if (resolved_value !== null) {
271
+ variables[variable.variable_name] = resolved_value;
272
+ logger.debug('Built variable from definition', {
273
+ file: FILE_NAME,
274
+ data: {
275
+ index,
276
+ variable_name: variable.variable_name,
277
+ match_type: variable.match_type,
278
+ value_preview: resolved_value.substring(0, 50),
279
+ },
280
+ });
281
+ }
282
+ else {
283
+ logger.warn('Could not resolve variable value', {
284
+ file: FILE_NAME,
285
+ data: {
286
+ index,
287
+ variable_name: variable.variable_name,
288
+ match_type: variable.match_type,
289
+ value: variable.value,
290
+ },
291
+ });
292
+ }
293
+ });
294
+ return Object.keys(variables).length > 0 ? [variables] : [];
295
+ }
296
+ /**
297
+ * Resolve a ChainImageDefinition to actual image data
298
+ *
299
+ * @param image_def - The image definition to resolve
300
+ * @param previous_results - Array of previous call results
301
+ * @param logger - Logger instance
302
+ * @returns Resolved image data or null if resolution failed
303
+ */
304
+ export function resolve_chain_image_definition(image_def, previous_results, logger) {
305
+ const image_b64 = resolve_chain_field(image_def.image_b64, previous_results, logger);
306
+ const image_mime_type = resolve_chain_field(image_def.image_mime_type, previous_results, logger);
307
+ if (!image_b64) {
308
+ logger.error('Could not resolve image_b64 from definition', {
309
+ file: FILE_NAME,
310
+ data: {
311
+ match_type: image_def.image_b64.match_type,
312
+ value: image_def.image_b64.value,
313
+ },
314
+ });
315
+ return null;
316
+ }
317
+ if (!image_mime_type) {
318
+ logger.error('Could not resolve image_mime_type from definition', {
319
+ file: FILE_NAME,
320
+ data: {
321
+ match_type: image_def.image_mime_type.match_type,
322
+ value: image_def.image_mime_type.value,
323
+ },
324
+ });
325
+ return null;
326
+ }
327
+ logger.debug('Resolved image definition', {
328
+ file: FILE_NAME,
329
+ data: {
330
+ image_b64_length: image_b64.length,
331
+ image_mime_type,
332
+ },
333
+ });
334
+ return { image_b64, image_mime_type };
335
+ }
336
+ // =============================================================================
337
+ // Deep Merge Functions
338
+ // =============================================================================
339
+ /**
340
+ * Deep merge two objects, with source values overwriting target values
341
+ *
342
+ * @param target - Target object
343
+ * @param source - Source object to merge in
344
+ * @returns New merged object
345
+ */
346
+ export function deep_merge(target, source) {
347
+ const result = { ...target };
348
+ for (const key of Object.keys(source)) {
349
+ const source_value = source[key];
350
+ const target_value = result[key];
351
+ if (source_value !== null &&
352
+ typeof source_value === 'object' &&
353
+ !Array.isArray(source_value) &&
354
+ target_value !== null &&
355
+ typeof target_value === 'object' &&
356
+ !Array.isArray(target_value)) {
357
+ // Both are objects - recurse
358
+ result[key] = deep_merge(target_value, source_value);
359
+ }
360
+ else {
361
+ // Overwrite with source value
362
+ result[key] = source_value;
363
+ }
364
+ }
365
+ return result;
366
+ }
367
+ /**
368
+ * Merge multiple call results into a single object
369
+ *
370
+ * @param results - Array of chain call results
371
+ * @param logger - Logger instance
372
+ * @returns Deep-merged object from all successful calls
373
+ */
374
+ export function merge_chain_results(results, logger) {
375
+ let merged = {};
376
+ for (const result of results) {
377
+ if (result.success && result.parsed_result) {
378
+ merged = deep_merge(merged, result.parsed_result);
379
+ logger.debug('Merged result from call', {
380
+ file: FILE_NAME,
381
+ data: { call_index: result.call_index },
382
+ });
383
+ }
384
+ }
385
+ return merged;
386
+ }
387
+ // =============================================================================
388
+ // JSON Parsing Functions
389
+ // =============================================================================
390
+ /**
391
+ * Attempt to parse LLM response text as JSON
392
+ * Handles common LLM output formats (with markdown code blocks, etc.)
393
+ *
394
+ * @param text - Raw text response from LLM
395
+ * @param logger - Logger instance
396
+ * @returns Parsed JSON object or null if parsing fails
397
+ */
398
+ export function parse_llm_json_response(text, logger) {
399
+ // Try direct JSON parse first
400
+ try {
401
+ const parsed = JSON.parse(text);
402
+ if (typeof parsed === 'object' && parsed !== null) {
403
+ return parsed;
404
+ }
405
+ }
406
+ catch {
407
+ // Continue to try other formats
408
+ }
409
+ // Try extracting JSON from markdown code block
410
+ const code_block_match = text.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
411
+ if (code_block_match) {
412
+ try {
413
+ const parsed = JSON.parse(code_block_match[1].trim());
414
+ if (typeof parsed === 'object' && parsed !== null) {
415
+ logger.debug('Extracted JSON from code block', { file: FILE_NAME });
416
+ return parsed;
417
+ }
418
+ }
419
+ catch {
420
+ // Continue
421
+ }
422
+ }
423
+ // Try finding first { to last }
424
+ const first_brace = text.indexOf('{');
425
+ const last_brace = text.lastIndexOf('}');
426
+ if (first_brace !== -1 && last_brace > first_brace) {
427
+ try {
428
+ const json_substr = text.substring(first_brace, last_brace + 1);
429
+ const parsed = JSON.parse(json_substr);
430
+ if (typeof parsed === 'object' && parsed !== null) {
431
+ logger.debug('Extracted JSON by brace matching', { file: FILE_NAME });
432
+ return parsed;
433
+ }
434
+ }
435
+ catch {
436
+ // Continue
437
+ }
438
+ }
439
+ logger.warn('Could not parse LLM response as JSON', {
440
+ file: FILE_NAME,
441
+ data: { text_preview: text.substring(0, 100) },
442
+ });
443
+ return null;
444
+ }
445
+ //# sourceMappingURL=chain_helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain_helpers.js","sourceRoot":"","sources":["../../../src/lib/llm_api/chain_helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * hazo_llm_image_image Function
3
+ *
4
+ * Image(s) input → Image output
5
+ * Transform/edit/combine images based on text instructions.
6
+ * Supports single or multiple input images.
7
+ * Uses image generation capable models with input image(s).
8
+ */
9
+ import type { Database as SqlJsDatabase } from 'sql.js';
10
+ import type { ImageImageParams, LLMResponse, LLMApiConfig } from './types.js';
11
+ /**
12
+ * Call the LLM with image(s) input and get image output
13
+ * Used for image editing, transformation, style transfer, combining images, etc.
14
+ *
15
+ * Supports two modes:
16
+ * 1. Single image: Use image_b64 and image_mime_type
17
+ * 2. Multiple images: Use images array
18
+ *
19
+ * @param params - Image input parameters with transformation instructions
20
+ * @param _db - Database instance (unused, kept for API consistency)
21
+ * @param config - LLM API configuration
22
+ * @param llm - Optional LLM provider name (uses primary LLM if not specified)
23
+ * @returns LLM response with transformed/generated image data
24
+ */
25
+ export declare function hazo_llm_image_image(params: ImageImageParams, _db: SqlJsDatabase | null, config: LLMApiConfig, llm?: string): Promise<LLMResponse>;
26
+ //# sourceMappingURL=hazo_llm_image_image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_llm_image_image.d.ts","sourceRoot":"","sources":["../../../src/lib/llm_api/hazo_llm_image_image.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EAEb,MAAM,YAAY,CAAC;AAuBpB;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,aAAa,GAAG,IAAI,EACzB,MAAM,EAAE,YAAY,EACpB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,CAAC,CAwEtB"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * hazo_llm_image_image Function
3
+ *
4
+ * Image(s) input → Image output
5
+ * Transform/edit/combine images based on text instructions.
6
+ * Supports single or multiple input images.
7
+ * Uses image generation capable models with input image(s).
8
+ */
9
+ import { substitute_variables } from '../prompts/substitute_variables.js';
10
+ import { SERVICE_TYPES } from '../providers/types.js';
11
+ import { get_validated_provider, log_api_start, log_api_complete, log_api_details, log_api_response, handle_caught_error, } from './provider_helper.js';
12
+ // =============================================================================
13
+ // Constants
14
+ // =============================================================================
15
+ const FILE_NAME = 'hazo_llm_image_image.ts';
16
+ const API_NAME = 'image_image';
17
+ // =============================================================================
18
+ // hazo_llm_image_image Function
19
+ // =============================================================================
20
+ /**
21
+ * Call the LLM with image(s) input and get image output
22
+ * Used for image editing, transformation, style transfer, combining images, etc.
23
+ *
24
+ * Supports two modes:
25
+ * 1. Single image: Use image_b64 and image_mime_type
26
+ * 2. Multiple images: Use images array
27
+ *
28
+ * @param params - Image input parameters with transformation instructions
29
+ * @param _db - Database instance (unused, kept for API consistency)
30
+ * @param config - LLM API configuration
31
+ * @param llm - Optional LLM provider name (uses primary LLM if not specified)
32
+ * @returns LLM response with transformed/generated image data
33
+ */
34
+ export async function hazo_llm_image_image(params, _db, config, llm) {
35
+ // Use default logger if not provided
36
+ const { default_logger } = await import('./index.js');
37
+ const logger = config.logger || default_logger;
38
+ try {
39
+ log_api_start(API_NAME, FILE_NAME, logger);
40
+ // ==========================================================================
41
+ // Step 1: Validate and collect image data
42
+ // ==========================================================================
43
+ const images = [];
44
+ if (params.images && params.images.length > 0) {
45
+ images.push(...params.images);
46
+ }
47
+ else if (params.image_b64 && params.image_mime_type) {
48
+ images.push({
49
+ data: params.image_b64,
50
+ mime_type: params.image_mime_type,
51
+ });
52
+ }
53
+ if (images.length === 0) {
54
+ const error_msg = 'At least one image is required. Provide image_b64/image_mime_type or images array.';
55
+ logger.error(error_msg, { file: FILE_NAME });
56
+ return { success: false, error: error_msg };
57
+ }
58
+ // ==========================================================================
59
+ // Step 2: Prepare prompt with variable substitution
60
+ // ==========================================================================
61
+ const final_prompt = substitute_variables(params.prompt, params.prompt_variables, logger);
62
+ // ==========================================================================
63
+ // Step 3: Get and validate provider
64
+ // ==========================================================================
65
+ const provider_result = get_validated_provider({
66
+ llm,
67
+ service_type: SERVICE_TYPES.IMAGE_IMAGE,
68
+ logger,
69
+ });
70
+ if (!provider_result.success) {
71
+ return provider_result.error_response;
72
+ }
73
+ const provider = provider_result.provider;
74
+ log_api_details(provider, SERVICE_TYPES.IMAGE_IMAGE, FILE_NAME, logger, {
75
+ prompt_text: final_prompt,
76
+ image_count: images.length,
77
+ llm_requested: llm || 'primary',
78
+ });
79
+ // ==========================================================================
80
+ // Step 4: Call the provider
81
+ // ==========================================================================
82
+ const response = await provider.image_image({
83
+ ...params,
84
+ prompt: final_prompt,
85
+ }, logger);
86
+ log_api_response(response, FILE_NAME, logger);
87
+ log_api_complete(API_NAME, FILE_NAME, response.success, logger);
88
+ return response;
89
+ }
90
+ catch (error) {
91
+ return handle_caught_error(error, 'hazo_llm_image_image', FILE_NAME, logger);
92
+ }
93
+ }
94
+ //# sourceMappingURL=hazo_llm_image_image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_llm_image_image.js","sourceRoot":"","sources":["../../../src/lib/llm_api/hazo_llm_image_image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * hazo_llm_image_image_text Function
3
+ *
4
+ * Images → Image → Text (Chained)
5
+ *
6
+ * Flow:
7
+ * 1. Combine images[0] + images[1] using prompts[0] → result_1
8
+ * 2. Combine result_1 + images[2] using prompts[1] → result_2
9
+ * 3. Continue chaining through all images
10
+ * 4. Analyze final result with description_prompt → text output
11
+ *
12
+ * Returns both the final generated image and the text description.
13
+ */
14
+ import type { Database as SqlJsDatabase } from 'sql.js';
15
+ import type { ImageImageTextParams, LLMResponse, LLMApiConfig } from './types.js';
16
+ /**
17
+ * Chain multiple image transformations, then describe the final result
18
+ *
19
+ * @param params - Parameters with images, prompts, and description prompt
20
+ * @param db - Database instance
21
+ * @param config - LLM API configuration
22
+ * @param llm - Optional LLM provider name (uses primary LLM if not specified)
23
+ * @returns LLM response with final image and description text
24
+ */
25
+ export declare function hazo_llm_image_image_text(params: ImageImageTextParams, db: SqlJsDatabase | null, config: LLMApiConfig, llm?: string): Promise<LLMResponse>;
26
+ //# sourceMappingURL=hazo_llm_image_image_text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_llm_image_image_text.d.ts","sourceRoot":"","sources":["../../../src/lib/llm_api/hazo_llm_image_image_text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EACV,oBAAoB,EACpB,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAQpB;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,oBAAoB,EAC5B,EAAE,EAAE,aAAa,GAAG,IAAI,EACxB,MAAM,EAAE,YAAY,EACpB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,CAAC,CAqOtB"}