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.
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +7 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/layout/index.d.ts +7 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +7 -0
- package/dist/components/layout/index.js.map +1 -0
- package/dist/components/layout/layout.d.ts +21 -0
- package/dist/components/layout/layout.d.ts.map +1 -0
- package/dist/components/layout/layout.js +18 -0
- package/dist/components/layout/layout.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config/config_parser.d.ts +131 -0
- package/dist/lib/config/config_parser.d.ts.map +1 -0
- package/dist/lib/config/config_parser.js +297 -0
- package/dist/lib/config/config_parser.js.map +1 -0
- package/dist/lib/config/index.d.ts +8 -0
- package/dist/lib/config/index.d.ts.map +1 -0
- package/dist/lib/config/index.js +22 -0
- package/dist/lib/config/index.js.map +1 -0
- package/dist/lib/config/provider_loader.d.ts +113 -0
- package/dist/lib/config/provider_loader.d.ts.map +1 -0
- package/dist/lib/config/provider_loader.js +169 -0
- package/dist/lib/config/provider_loader.js.map +1 -0
- package/dist/lib/database/index.d.ts +8 -0
- package/dist/lib/database/index.d.ts.map +1 -0
- package/dist/lib/database/index.js +10 -0
- package/dist/lib/database/index.js.map +1 -0
- package/dist/lib/database/init_database.d.ts +118 -0
- package/dist/lib/database/init_database.d.ts.map +1 -0
- package/dist/lib/database/init_database.js +591 -0
- package/dist/lib/database/init_database.js.map +1 -0
- package/dist/lib/database/utils.d.ts +53 -0
- package/dist/lib/database/utils.d.ts.map +1 -0
- package/dist/lib/database/utils.js +87 -0
- package/dist/lib/database/utils.js.map +1 -0
- package/dist/lib/index.d.ts +14 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +17 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/llm_api/chain_helpers.d.ts +117 -0
- package/dist/lib/llm_api/chain_helpers.d.ts.map +1 -0
- package/dist/lib/llm_api/chain_helpers.js +445 -0
- package/dist/lib/llm_api/chain_helpers.js.map +1 -0
- package/dist/lib/llm_api/hazo_llm_image_image.d.ts +26 -0
- package/dist/lib/llm_api/hazo_llm_image_image.d.ts.map +1 -0
- package/dist/lib/llm_api/hazo_llm_image_image.js +94 -0
- package/dist/lib/llm_api/hazo_llm_image_image.js.map +1 -0
- package/dist/lib/llm_api/hazo_llm_image_image_text.d.ts +26 -0
- package/dist/lib/llm_api/hazo_llm_image_image_text.d.ts.map +1 -0
- package/dist/lib/llm_api/hazo_llm_image_image_text.js +222 -0
- package/dist/lib/llm_api/hazo_llm_image_image_text.js.map +1 -0
- package/dist/lib/llm_api/hazo_llm_image_text.d.ts +20 -0
- package/dist/lib/llm_api/hazo_llm_image_text.d.ts.map +1 -0
- package/dist/lib/llm_api/hazo_llm_image_text.js +78 -0
- package/dist/lib/llm_api/hazo_llm_image_text.js.map +1 -0
- package/dist/lib/llm_api/hazo_llm_prompt_chain.d.ts +20 -0
- package/dist/lib/llm_api/hazo_llm_prompt_chain.d.ts.map +1 -0
- package/dist/lib/llm_api/hazo_llm_prompt_chain.js +368 -0
- package/dist/lib/llm_api/hazo_llm_prompt_chain.js.map +1 -0
- package/dist/lib/llm_api/hazo_llm_text_image.d.ts +20 -0
- package/dist/lib/llm_api/hazo_llm_text_image.d.ts.map +1 -0
- package/dist/lib/llm_api/hazo_llm_text_image.js +69 -0
- package/dist/lib/llm_api/hazo_llm_text_image.js.map +1 -0
- package/dist/lib/llm_api/hazo_llm_text_image_text.d.ts +26 -0
- package/dist/lib/llm_api/hazo_llm_text_image_text.d.ts.map +1 -0
- package/dist/lib/llm_api/hazo_llm_text_image_text.js +154 -0
- package/dist/lib/llm_api/hazo_llm_text_image_text.js.map +1 -0
- package/dist/lib/llm_api/hazo_llm_text_text.d.ts +20 -0
- package/dist/lib/llm_api/hazo_llm_text_text.d.ts.map +1 -0
- package/dist/lib/llm_api/hazo_llm_text_text.js +91 -0
- package/dist/lib/llm_api/hazo_llm_text_text.js.map +1 -0
- package/dist/lib/llm_api/index.d.ts +223 -0
- package/dist/lib/llm_api/index.d.ts.map +1 -0
- package/dist/lib/llm_api/index.js +1220 -0
- package/dist/lib/llm_api/index.js.map +1 -0
- package/dist/lib/llm_api/provider_helper.d.ts +163 -0
- package/dist/lib/llm_api/provider_helper.d.ts.map +1 -0
- package/dist/lib/llm_api/provider_helper.js +346 -0
- package/dist/lib/llm_api/provider_helper.js.map +1 -0
- package/dist/lib/llm_api/types.d.ts +667 -0
- package/dist/lib/llm_api/types.d.ts.map +1 -0
- package/dist/lib/llm_api/types.js +49 -0
- package/dist/lib/llm_api/types.js.map +1 -0
- package/dist/lib/prompts/get_prompt.d.ts +76 -0
- package/dist/lib/prompts/get_prompt.d.ts.map +1 -0
- package/dist/lib/prompts/get_prompt.js +342 -0
- package/dist/lib/prompts/get_prompt.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +9 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +9 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/prompts/prompt_cache.d.ts +151 -0
- package/dist/lib/prompts/prompt_cache.d.ts.map +1 -0
- package/dist/lib/prompts/prompt_cache.js +276 -0
- package/dist/lib/prompts/prompt_cache.js.map +1 -0
- package/dist/lib/prompts/substitute_variables.d.ts +38 -0
- package/dist/lib/prompts/substitute_variables.d.ts.map +1 -0
- package/dist/lib/prompts/substitute_variables.js +171 -0
- package/dist/lib/prompts/substitute_variables.js.map +1 -0
- package/dist/lib/providers/gemini/gemini_client.d.ts +25 -0
- package/dist/lib/providers/gemini/gemini_client.d.ts.map +1 -0
- package/dist/lib/providers/gemini/gemini_client.js +235 -0
- package/dist/lib/providers/gemini/gemini_client.js.map +1 -0
- package/dist/lib/providers/gemini/gemini_provider.d.ts +111 -0
- package/dist/lib/providers/gemini/gemini_provider.d.ts.map +1 -0
- package/dist/lib/providers/gemini/gemini_provider.js +431 -0
- package/dist/lib/providers/gemini/gemini_provider.js.map +1 -0
- package/dist/lib/providers/gemini/index.d.ts +8 -0
- package/dist/lib/providers/gemini/index.d.ts.map +1 -0
- package/dist/lib/providers/gemini/index.js +8 -0
- package/dist/lib/providers/gemini/index.js.map +1 -0
- package/dist/lib/providers/index.d.ts +8 -0
- package/dist/lib/providers/index.d.ts.map +1 -0
- package/dist/lib/providers/index.js +8 -0
- package/dist/lib/providers/index.js.map +1 -0
- package/dist/lib/providers/qwen/index.d.ts +8 -0
- package/dist/lib/providers/qwen/index.d.ts.map +1 -0
- package/dist/lib/providers/qwen/index.js +8 -0
- package/dist/lib/providers/qwen/index.js.map +1 -0
- package/dist/lib/providers/qwen/qwen_client.d.ts +154 -0
- package/dist/lib/providers/qwen/qwen_client.d.ts.map +1 -0
- package/dist/lib/providers/qwen/qwen_client.js +1002 -0
- package/dist/lib/providers/qwen/qwen_client.js.map +1 -0
- package/dist/lib/providers/qwen/qwen_provider.d.ts +139 -0
- package/dist/lib/providers/qwen/qwen_provider.d.ts.map +1 -0
- package/dist/lib/providers/qwen/qwen_provider.js +304 -0
- package/dist/lib/providers/qwen/qwen_provider.js.map +1 -0
- package/dist/lib/providers/registry.d.ts +66 -0
- package/dist/lib/providers/registry.d.ts.map +1 -0
- package/dist/lib/providers/registry.js +158 -0
- package/dist/lib/providers/registry.js.map +1 -0
- package/dist/lib/providers/types.d.ts +145 -0
- package/dist/lib/providers/types.d.ts.map +1 -0
- package/dist/lib/providers/types.js +37 -0
- package/dist/lib/providers/types.js.map +1 -0
- package/dist/server.d.ts +27 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +50 -0
- package/dist/server.js.map +1 -0
- 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"}
|