hazo_llm_api 1.0.1
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/README.md +536 -0
- package/dist/components/hazo_llm_prompt_config/hazo_llm_prompt_config.d.ts +16 -0
- package/dist/components/hazo_llm_prompt_config/hazo_llm_prompt_config.d.ts.map +1 -0
- package/dist/components/hazo_llm_prompt_config/hazo_llm_prompt_config.js +258 -0
- package/dist/components/hazo_llm_prompt_config/hazo_llm_prompt_config.js.map +1 -0
- package/dist/components/hazo_llm_prompt_config/index.d.ts +8 -0
- package/dist/components/hazo_llm_prompt_config/index.d.ts.map +1 -0
- package/dist/components/hazo_llm_prompt_config/index.js +7 -0
- package/dist/components/hazo_llm_prompt_config/index.js.map +1 -0
- package/dist/components/hazo_llm_prompt_config/types.d.ts +74 -0
- package/dist/components/hazo_llm_prompt_config/types.d.ts.map +1 -0
- package/dist/components/hazo_llm_prompt_config/types.js +8 -0
- package/dist/components/hazo_llm_prompt_config/types.js.map +1 -0
- 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 +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -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 +8 -0
- package/dist/lib/database/index.js.map +1 -0
- package/dist/lib/database/init_database.d.ts +62 -0
- package/dist/lib/database/init_database.d.ts.map +1 -0
- package/dist/lib/database/init_database.js +436 -0
- package/dist/lib/database/init_database.js.map +1 -0
- package/dist/lib/database/utils.d.ts +50 -0
- package/dist/lib/database/utils.d.ts.map +1 -0
- package/dist/lib/database/utils.js +78 -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/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 +92 -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 +220 -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 +76 -0
- package/dist/lib/llm_api/hazo_llm_image_text.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 +67 -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 +152 -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 +89 -0
- package/dist/lib/llm_api/hazo_llm_text_text.js.map +1 -0
- package/dist/lib/llm_api/index.d.ts +99 -0
- package/dist/lib/llm_api/index.d.ts.map +1 -0
- package/dist/lib/llm_api/index.js +952 -0
- package/dist/lib/llm_api/index.js.map +1 -0
- package/dist/lib/llm_api/provider_helper.d.ts +107 -0
- package/dist/lib/llm_api/provider_helper.d.ts.map +1 -0
- package/dist/lib/llm_api/provider_helper.js +159 -0
- package/dist/lib/llm_api/provider_helper.js.map +1 -0
- package/dist/lib/llm_api/types.d.ts +352 -0
- package/dist/lib/llm_api/types.d.ts.map +1 -0
- package/dist/lib/llm_api/types.js +8 -0
- package/dist/lib/llm_api/types.js.map +1 -0
- package/dist/lib/prompts/get_prompt.d.ts +50 -0
- package/dist/lib/prompts/get_prompt.d.ts.map +1 -0
- package/dist/lib/prompts/get_prompt.js +232 -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 +175 -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 +95 -0
- package/dist/lib/providers/types.d.ts.map +1 -0
- package/dist/lib/providers/types.js +19 -0
- package/dist/lib/providers/types.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +32 -0
- package/dist/server.js.map +1 -0
- package/package.json +68 -0
- package/techdoc.md +857 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hazo_llm_text_image_text Function
|
|
3
|
+
*
|
|
4
|
+
* Text → Image → Text (Chained)
|
|
5
|
+
* 1. Generate an image from prompt_image using hazo_llm_text_image
|
|
6
|
+
* 2. Analyze the generated image with prompt_text using hazo_llm_image_text
|
|
7
|
+
* 3. Return both the generated image and the analysis text
|
|
8
|
+
*/
|
|
9
|
+
import { hazo_llm_text_image } from './hazo_llm_text_image.js';
|
|
10
|
+
import { hazo_llm_image_text } from './hazo_llm_image_text.js';
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// hazo_llm_text_image_text Function
|
|
13
|
+
// =============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Generate an image from text, then analyze it with a second prompt
|
|
16
|
+
*
|
|
17
|
+
* Flow:
|
|
18
|
+
* 1. Call hazo_llm_text_image with prompt_image to generate an image
|
|
19
|
+
* 2. Call hazo_llm_image_text with the generated image and prompt_text
|
|
20
|
+
* 3. Return the generated image and the text analysis from step 2
|
|
21
|
+
*
|
|
22
|
+
* @param params - Parameters with two prompts: one for image gen, one for analysis
|
|
23
|
+
* @param db - Database instance
|
|
24
|
+
* @param config - LLM API configuration
|
|
25
|
+
* @param llm - Optional LLM provider name (uses primary LLM if not specified)
|
|
26
|
+
* @returns LLM response with generated image and analysis text
|
|
27
|
+
*/
|
|
28
|
+
export async function hazo_llm_text_image_text(params, db, config, llm) {
|
|
29
|
+
const file_name = 'hazo_llm_text_image_text.ts';
|
|
30
|
+
const logger = config.logger;
|
|
31
|
+
const api_name = 'text_image_text';
|
|
32
|
+
try {
|
|
33
|
+
// ==========================================================================
|
|
34
|
+
// Log API call start
|
|
35
|
+
// ==========================================================================
|
|
36
|
+
logger.debug(`########################################################################### ${api_name}`, {
|
|
37
|
+
file: file_name,
|
|
38
|
+
line: 48,
|
|
39
|
+
});
|
|
40
|
+
// Log API call details with generation configs
|
|
41
|
+
logger.debug('API call details', {
|
|
42
|
+
file: file_name,
|
|
43
|
+
line: 53,
|
|
44
|
+
data: {
|
|
45
|
+
chain_steps: ['text_image', 'image_text'],
|
|
46
|
+
prompt_image: params.prompt_image,
|
|
47
|
+
prompt_text: params.prompt_text,
|
|
48
|
+
prompt_image_variables: params.prompt_image_variables,
|
|
49
|
+
prompt_text_variables: params.prompt_text_variables,
|
|
50
|
+
llm_requested: llm || 'primary',
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
// ==========================================================================
|
|
54
|
+
// Step 1: Generate image from prompt_image
|
|
55
|
+
// ==========================================================================
|
|
56
|
+
logger.debug('Chain Step 1: Image generation', {
|
|
57
|
+
file: file_name,
|
|
58
|
+
line: 66,
|
|
59
|
+
});
|
|
60
|
+
const image_response = await hazo_llm_text_image({
|
|
61
|
+
prompt: params.prompt_image,
|
|
62
|
+
prompt_variables: params.prompt_image_variables,
|
|
63
|
+
}, db, config, llm);
|
|
64
|
+
// Check if image generation succeeded
|
|
65
|
+
if (!image_response.success) {
|
|
66
|
+
logger.error('Image generation failed in text_image_text chain', {
|
|
67
|
+
file: file_name,
|
|
68
|
+
line: 79,
|
|
69
|
+
data: { error: image_response.error },
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
error: `Image generation failed: ${image_response.error}`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Check if we got an image
|
|
77
|
+
if (!image_response.image_b64 || !image_response.image_mime_type) {
|
|
78
|
+
logger.error('No image returned from image generation', {
|
|
79
|
+
file: file_name,
|
|
80
|
+
line: 90,
|
|
81
|
+
});
|
|
82
|
+
return {
|
|
83
|
+
success: false,
|
|
84
|
+
error: 'Image generation did not return an image',
|
|
85
|
+
text: image_response.text, // Include any text that was returned
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// ==========================================================================
|
|
89
|
+
// Step 2: Analyze the generated image with prompt_text
|
|
90
|
+
// ==========================================================================
|
|
91
|
+
logger.debug('Chain Step 2: Image analysis', {
|
|
92
|
+
file: file_name,
|
|
93
|
+
line: 103,
|
|
94
|
+
});
|
|
95
|
+
const text_response = await hazo_llm_image_text({
|
|
96
|
+
prompt: params.prompt_text,
|
|
97
|
+
image_b64: image_response.image_b64,
|
|
98
|
+
image_mime_type: image_response.image_mime_type,
|
|
99
|
+
prompt_variables: params.prompt_text_variables,
|
|
100
|
+
}, db, config, llm);
|
|
101
|
+
// Check if text analysis succeeded
|
|
102
|
+
if (!text_response.success) {
|
|
103
|
+
logger.error('Text analysis failed in text_image_text chain', {
|
|
104
|
+
file: file_name,
|
|
105
|
+
line: 120,
|
|
106
|
+
data: { error: text_response.error },
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
success: false,
|
|
110
|
+
error: `Image analysis failed: ${text_response.error}`,
|
|
111
|
+
// Still return the generated image even if analysis failed
|
|
112
|
+
image_b64: image_response.image_b64,
|
|
113
|
+
image_mime_type: image_response.image_mime_type,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// ==========================================================================
|
|
117
|
+
// Log API response
|
|
118
|
+
// ==========================================================================
|
|
119
|
+
logger.debug('API response', {
|
|
120
|
+
file: file_name,
|
|
121
|
+
line: 136,
|
|
122
|
+
data: {
|
|
123
|
+
success: true,
|
|
124
|
+
text: text_response.text,
|
|
125
|
+
image_b64: '[IMAGE_DATA_PLACEHOLDER]',
|
|
126
|
+
image_mime_type: image_response.image_mime_type,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
// Log API call complete
|
|
130
|
+
logger.debug(`<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ${api_name} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`, {
|
|
131
|
+
file: file_name,
|
|
132
|
+
line: 147,
|
|
133
|
+
data: { success: true, has_image: true },
|
|
134
|
+
});
|
|
135
|
+
return {
|
|
136
|
+
success: true,
|
|
137
|
+
text: text_response.text,
|
|
138
|
+
image_b64: image_response.image_b64,
|
|
139
|
+
image_mime_type: image_response.image_mime_type,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const error_message = error instanceof Error ? error.message : String(error);
|
|
144
|
+
logger.error('Error in hazo_llm_text_image_text', {
|
|
145
|
+
file: file_name,
|
|
146
|
+
line: 138,
|
|
147
|
+
data: { error: error_message },
|
|
148
|
+
});
|
|
149
|
+
return { success: false, error: error_message };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=hazo_llm_text_image_text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_llm_text_image_text.js","sourceRoot":"","sources":["../../../src/lib/llm_api/hazo_llm_text_image_text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hazo_llm_text_text Function
|
|
3
|
+
*
|
|
4
|
+
* Text input → Text output
|
|
5
|
+
* Standard text generation using LLM.
|
|
6
|
+
* Supports static prompts, dynamic prompts from database, and variable substitution.
|
|
7
|
+
*/
|
|
8
|
+
import type { Database as SqlJsDatabase } from 'sql.js';
|
|
9
|
+
import type { TextTextParams, LLMResponse, LLMApiConfig } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Call the LLM with text input and get text output
|
|
12
|
+
*
|
|
13
|
+
* @param params - Text input parameters
|
|
14
|
+
* @param db - Database instance for dynamic prompts
|
|
15
|
+
* @param config - LLM API configuration
|
|
16
|
+
* @param llm - Optional LLM provider name (uses primary LLM if not specified)
|
|
17
|
+
* @returns LLM response with generated text
|
|
18
|
+
*/
|
|
19
|
+
export declare function hazo_llm_text_text(params: TextTextParams, db: SqlJsDatabase | null, config: LLMApiConfig, llm?: string): Promise<LLMResponse>;
|
|
20
|
+
//# sourceMappingURL=hazo_llm_text_text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_llm_text_text.d.ts","sourceRoot":"","sources":["../../../src/lib/llm_api/hazo_llm_text_text.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAwBpB;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,EAAE,EAAE,aAAa,GAAG,IAAI,EACxB,MAAM,EAAE,YAAY,EACpB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,CAAC,CA0EtB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hazo_llm_text_text Function
|
|
3
|
+
*
|
|
4
|
+
* Text input → Text output
|
|
5
|
+
* Standard text generation using LLM.
|
|
6
|
+
* Supports static prompts, dynamic prompts from database, and variable substitution.
|
|
7
|
+
*/
|
|
8
|
+
import { get_prompt_text } from '../prompts/get_prompt.js';
|
|
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_text_text.ts';
|
|
16
|
+
const API_NAME = 'text_text';
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// hazo_llm_text_text Function
|
|
19
|
+
// =============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Call the LLM with text input and get text output
|
|
22
|
+
*
|
|
23
|
+
* @param params - Text input parameters
|
|
24
|
+
* @param db - Database instance for dynamic prompts
|
|
25
|
+
* @param config - LLM API configuration
|
|
26
|
+
* @param llm - Optional LLM provider name (uses primary LLM if not specified)
|
|
27
|
+
* @returns LLM response with generated text
|
|
28
|
+
*/
|
|
29
|
+
export async function hazo_llm_text_text(params, db, config, llm) {
|
|
30
|
+
const logger = config.logger;
|
|
31
|
+
try {
|
|
32
|
+
log_api_start(API_NAME, FILE_NAME, logger);
|
|
33
|
+
// ==========================================================================
|
|
34
|
+
// Step 1: Get the prompt text
|
|
35
|
+
// ==========================================================================
|
|
36
|
+
let prompt_text;
|
|
37
|
+
if (params.prompt_area && params.prompt_key) {
|
|
38
|
+
if (!db) {
|
|
39
|
+
const error_msg = 'Database not initialized for dynamic prompt retrieval';
|
|
40
|
+
logger.error(error_msg, { file: FILE_NAME });
|
|
41
|
+
return { success: false, error: error_msg };
|
|
42
|
+
}
|
|
43
|
+
const dynamic_prompt = get_prompt_text(db, params.prompt_area, params.prompt_key, logger);
|
|
44
|
+
if (!dynamic_prompt) {
|
|
45
|
+
const error_msg = `Prompt not found for area="${params.prompt_area}" key="${params.prompt_key}"`;
|
|
46
|
+
logger.error(error_msg, { file: FILE_NAME });
|
|
47
|
+
return { success: false, error: error_msg };
|
|
48
|
+
}
|
|
49
|
+
prompt_text = dynamic_prompt;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
prompt_text = params.prompt;
|
|
53
|
+
}
|
|
54
|
+
// ==========================================================================
|
|
55
|
+
// Step 2: Substitute variables
|
|
56
|
+
// ==========================================================================
|
|
57
|
+
const final_prompt = substitute_variables(prompt_text, params.prompt_variables, logger);
|
|
58
|
+
// ==========================================================================
|
|
59
|
+
// Step 3: Get and validate provider
|
|
60
|
+
// ==========================================================================
|
|
61
|
+
const provider_result = get_validated_provider({
|
|
62
|
+
llm,
|
|
63
|
+
service_type: SERVICE_TYPES.TEXT_TEXT,
|
|
64
|
+
logger,
|
|
65
|
+
});
|
|
66
|
+
if (!provider_result.success) {
|
|
67
|
+
return provider_result.error_response;
|
|
68
|
+
}
|
|
69
|
+
const provider = provider_result.provider;
|
|
70
|
+
log_api_details(provider, SERVICE_TYPES.TEXT_TEXT, FILE_NAME, logger, {
|
|
71
|
+
prompt_text: final_prompt,
|
|
72
|
+
llm_requested: llm || 'primary',
|
|
73
|
+
});
|
|
74
|
+
// ==========================================================================
|
|
75
|
+
// Step 4: Call the provider
|
|
76
|
+
// ==========================================================================
|
|
77
|
+
const response = await provider.text_text({
|
|
78
|
+
...params,
|
|
79
|
+
prompt: final_prompt,
|
|
80
|
+
}, logger);
|
|
81
|
+
log_api_response(response, FILE_NAME, logger);
|
|
82
|
+
log_api_complete(API_NAME, FILE_NAME, response.success, logger);
|
|
83
|
+
return response;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return handle_caught_error(error, 'hazo_llm_text_text', FILE_NAME, logger);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=hazo_llm_text_text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_llm_text_text.js","sourceRoot":"","sources":["../../../src/lib/llm_api/hazo_llm_text_text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM API Module
|
|
3
|
+
*
|
|
4
|
+
* Main entry point for the LLM API functionality.
|
|
5
|
+
* Provides initialization and specialized LLM functions:
|
|
6
|
+
* - hazo_llm_text_text: Text input → Text output
|
|
7
|
+
* - hazo_llm_image_text: Image input → Text output
|
|
8
|
+
* - hazo_llm_text_image: Text input → Image output
|
|
9
|
+
* - hazo_llm_image_image: Image input → Image output
|
|
10
|
+
* - hazo_llm_text_image_text: Text → Image → Text (chained)
|
|
11
|
+
* - hazo_llm_image_image_text: Images → Image → Text (chained)
|
|
12
|
+
*
|
|
13
|
+
* Database is auto-initialized on module import using config defaults.
|
|
14
|
+
*/
|
|
15
|
+
import type { LLMApiConfig, LLMApiClient, LLMResponse, TextTextParams, ImageTextParams, TextImageParams, ImageImageParams, TextImageTextParams, ImageImageTextParams } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Initialize the LLM API with the given configuration
|
|
18
|
+
* Creates/connects to the database and prepares the client for use
|
|
19
|
+
*
|
|
20
|
+
* @param config - Configuration options for the LLM API
|
|
21
|
+
* @returns Initialized LLM API client
|
|
22
|
+
*/
|
|
23
|
+
export declare function initialize_llm_api(config: LLMApiConfig): Promise<LLMApiClient>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if database has been initialized (either auto or manual)
|
|
26
|
+
* @returns true if database is ready for use
|
|
27
|
+
*/
|
|
28
|
+
export declare function is_database_ready(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Wait for auto-initialization to complete
|
|
31
|
+
* Useful if you need to ensure database is ready before operations
|
|
32
|
+
*/
|
|
33
|
+
export declare function ensure_database_ready(): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Text input → Text output
|
|
36
|
+
* Standard text generation using LLM
|
|
37
|
+
*
|
|
38
|
+
* @param params - Text input parameters
|
|
39
|
+
* @param llm - Optional LLM provider name (uses primary LLM if not specified)
|
|
40
|
+
* @returns LLM response with generated text
|
|
41
|
+
*/
|
|
42
|
+
export declare function hazo_llm_text_text(params: TextTextParams, llm?: string): Promise<LLMResponse>;
|
|
43
|
+
/**
|
|
44
|
+
* Image input → Text output
|
|
45
|
+
* Analyze an image and get text description
|
|
46
|
+
*
|
|
47
|
+
* @param params - Image input parameters
|
|
48
|
+
* @param llm - Optional LLM provider name (uses primary LLM if not specified)
|
|
49
|
+
* @returns LLM response with text description
|
|
50
|
+
*/
|
|
51
|
+
export declare function hazo_llm_image_text(params: ImageTextParams, llm?: string): Promise<LLMResponse>;
|
|
52
|
+
/**
|
|
53
|
+
* Text input → Image output
|
|
54
|
+
* Generate an image from text description
|
|
55
|
+
*
|
|
56
|
+
* @param params - Text input parameters for image generation
|
|
57
|
+
* @param llm - Optional LLM provider name (uses primary LLM if not specified)
|
|
58
|
+
* @returns LLM response with generated image
|
|
59
|
+
*/
|
|
60
|
+
export declare function hazo_llm_text_image(params: TextImageParams, llm?: string): Promise<LLMResponse>;
|
|
61
|
+
/**
|
|
62
|
+
* Image input → Image output
|
|
63
|
+
* Transform/edit an image based on instructions
|
|
64
|
+
*
|
|
65
|
+
* @param params - Image input parameters with transformation instructions
|
|
66
|
+
* @param llm - Optional LLM provider name (uses primary LLM if not specified)
|
|
67
|
+
* @returns LLM response with transformed image
|
|
68
|
+
*/
|
|
69
|
+
export declare function hazo_llm_image_image(params: ImageImageParams, llm?: string): Promise<LLMResponse>;
|
|
70
|
+
/**
|
|
71
|
+
* Text → Image → Text (Chained)
|
|
72
|
+
* Generate an image from prompt_image, then analyze it with prompt_text
|
|
73
|
+
*
|
|
74
|
+
* @param params - Parameters with two prompts: one for image gen, one for analysis
|
|
75
|
+
* @param llm - Optional LLM provider name (uses primary LLM if not specified)
|
|
76
|
+
* @returns LLM response with generated image and analysis text
|
|
77
|
+
*/
|
|
78
|
+
export declare function hazo_llm_text_image_text(params: TextImageTextParams, llm?: string): Promise<LLMResponse>;
|
|
79
|
+
/**
|
|
80
|
+
* Images → Image → Text (Chained)
|
|
81
|
+
* Chain multiple image transformations, then describe the final result
|
|
82
|
+
*
|
|
83
|
+
* @param params - Parameters with images, prompts, and description prompt
|
|
84
|
+
* @param llm - Optional LLM provider name (uses primary LLM if not specified)
|
|
85
|
+
* @returns LLM response with final image and description text
|
|
86
|
+
*/
|
|
87
|
+
export declare function hazo_llm_image_image_text(params: ImageImageTextParams, llm?: string): Promise<LLMResponse>;
|
|
88
|
+
/**
|
|
89
|
+
* Check if the LLM API has been initialized
|
|
90
|
+
* @returns true if initialized
|
|
91
|
+
*/
|
|
92
|
+
export declare function is_initialized(): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Get the current configuration (without sensitive data)
|
|
95
|
+
* @returns Current configuration or null if not initialized
|
|
96
|
+
*/
|
|
97
|
+
export declare function get_current_config(): Omit<LLMApiConfig, 'api_key' | 'logger'> | null;
|
|
98
|
+
export type { LLMApiConfig, LLMApiClient, LLMResponse, TextTextParams, ImageTextParams, TextImageParams, ImageImageParams, TextImageTextParams, ImageImageTextParams, ChainImage, Logger, PromptVariable, PromptVariables, Base64Data, PromptTextMode, PromptRecord, CallLLMParams, GeminiGenerationConfig, GeminiApiGenerationConfig, } from './types.js';
|
|
99
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/llm_api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EAGrB,MAAM,YAAY,CAAC;AAqwBpB;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA8FpF;AAgBD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQ9D;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQnG;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQrG;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQrG;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQvG;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQ9G;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQhH;AAMD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,QAAQ,CAAC,GAAG,IAAI,CAUpF;AAMD,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,MAAM,EACN,cAAc,EACd,eAAe,EACf,UAAU,EACV,cAAc,EACd,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}
|