hazo_llm_api 1.0.4 → 1.0.6
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,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Loader Factory
|
|
3
|
+
*
|
|
4
|
+
* Generic factory for loading LLM providers from configuration.
|
|
5
|
+
* Reduces duplication by providing a unified approach to provider loading.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMProvider, ServiceType } from '../providers/types.js';
|
|
8
|
+
import type { Logger } from '../llm_api/types.js';
|
|
9
|
+
import { type ParameterMapping } from './config_parser.js';
|
|
10
|
+
/**
|
|
11
|
+
* Base configuration that all providers share
|
|
12
|
+
*/
|
|
13
|
+
export interface BaseProviderConfig {
|
|
14
|
+
api_key: string;
|
|
15
|
+
api_url?: string;
|
|
16
|
+
capabilities?: ServiceType[];
|
|
17
|
+
logger: Logger;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Provider factory definition
|
|
21
|
+
* Used to register how to load a specific provider type
|
|
22
|
+
*/
|
|
23
|
+
export interface ProviderFactory<TConfig extends BaseProviderConfig> {
|
|
24
|
+
/** Provider name (lowercase) */
|
|
25
|
+
name: string;
|
|
26
|
+
/** INI section name (e.g., "llm_gemini") */
|
|
27
|
+
config_section: string;
|
|
28
|
+
/** Parameter mappings for text generation config */
|
|
29
|
+
text_param_mappings: ParameterMapping[];
|
|
30
|
+
/** Parameter mappings for image generation config */
|
|
31
|
+
image_param_mappings: ParameterMapping[];
|
|
32
|
+
/**
|
|
33
|
+
* Build provider-specific config from INI section
|
|
34
|
+
*
|
|
35
|
+
* @param section - The parsed INI section
|
|
36
|
+
* @param api_key - The API key loaded from environment
|
|
37
|
+
* @param text_config - Parsed text generation config
|
|
38
|
+
* @param image_config - Parsed image generation config
|
|
39
|
+
* @param capabilities - Parsed capabilities
|
|
40
|
+
* @param logger - Logger instance
|
|
41
|
+
* @returns Provider-specific config object
|
|
42
|
+
*/
|
|
43
|
+
build_config(section: Record<string, string>, api_key: string, text_config: unknown, image_config: unknown, capabilities: ServiceType[], logger: Logger): TConfig;
|
|
44
|
+
/**
|
|
45
|
+
* Create provider instance from config
|
|
46
|
+
*
|
|
47
|
+
* @param config - Provider-specific config object
|
|
48
|
+
* @returns Provider instance
|
|
49
|
+
*/
|
|
50
|
+
create_provider(config: TConfig): LLMProvider;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Result of loading a provider
|
|
54
|
+
*/
|
|
55
|
+
export type ProviderLoadResult = {
|
|
56
|
+
success: true;
|
|
57
|
+
provider: LLMProvider;
|
|
58
|
+
} | {
|
|
59
|
+
success: false;
|
|
60
|
+
error: string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Register a provider factory
|
|
64
|
+
*
|
|
65
|
+
* @param factory - Provider factory to register
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* register_provider_factory({
|
|
70
|
+
* name: 'gemini',
|
|
71
|
+
* config_section: 'llm_gemini',
|
|
72
|
+
* text_param_mappings: GEMINI_PARAM_MAPPINGS,
|
|
73
|
+
* image_param_mappings: GEMINI_PARAM_MAPPINGS,
|
|
74
|
+
* build_config: (section, api_key, text_config, image_config, capabilities, logger) => ({
|
|
75
|
+
* api_key,
|
|
76
|
+
* api_url: section.api_url,
|
|
77
|
+
* // ... other gemini-specific fields
|
|
78
|
+
* }),
|
|
79
|
+
* create_provider: (config) => new GeminiProvider(config),
|
|
80
|
+
* });
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function register_provider_factory<TConfig extends BaseProviderConfig>(factory: ProviderFactory<TConfig>): void;
|
|
84
|
+
/**
|
|
85
|
+
* Get a registered provider factory by name
|
|
86
|
+
*
|
|
87
|
+
* @param name - Provider name (case-insensitive)
|
|
88
|
+
* @returns Provider factory or undefined
|
|
89
|
+
*/
|
|
90
|
+
export declare function get_provider_factory(name: string): ProviderFactory<BaseProviderConfig> | undefined;
|
|
91
|
+
/**
|
|
92
|
+
* Get all registered provider factory names
|
|
93
|
+
*
|
|
94
|
+
* @returns Array of provider names
|
|
95
|
+
*/
|
|
96
|
+
export declare function get_registered_factory_names(): string[];
|
|
97
|
+
/**
|
|
98
|
+
* Load a provider from config using its registered factory
|
|
99
|
+
*
|
|
100
|
+
* @param provider_name - Name of the provider to load
|
|
101
|
+
* @param logger - Logger instance
|
|
102
|
+
* @returns Provider instance or error result
|
|
103
|
+
*/
|
|
104
|
+
export declare function load_provider_from_config(provider_name: string, logger: Logger): ProviderLoadResult;
|
|
105
|
+
/**
|
|
106
|
+
* Load all enabled providers from config
|
|
107
|
+
*
|
|
108
|
+
* @param enabled_llms - List of enabled LLM names
|
|
109
|
+
* @param logger - Logger instance
|
|
110
|
+
* @returns Map of successfully loaded providers
|
|
111
|
+
*/
|
|
112
|
+
export declare function load_all_providers(enabled_llms: string[], logger: Logger): Map<string, LLMProvider>;
|
|
113
|
+
//# sourceMappingURL=provider_loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider_loader.d.ts","sourceRoot":"","sources":["../../../src/lib/config/provider_loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAOL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAM5B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,kBAAkB;IACjE,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IAEb,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IAEvB,oDAAoD;IACpD,mBAAmB,EAAE,gBAAgB,EAAE,CAAC;IAExC,qDAAqD;IACrD,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;IAEzC;;;;;;;;;;OAUG;IACH,YAAY,CACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,EACpB,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,WAAW,EAAE,EAC3B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAEX;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,GACxC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAWtC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,SAAS,kBAAkB,EAC1E,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAChC,IAAI,CAKN;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GACX,eAAe,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,EAAE,CAEvD;AAMD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAmGpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAsB1B"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Loader Factory
|
|
3
|
+
*
|
|
4
|
+
* Generic factory for loading LLM providers from configuration.
|
|
5
|
+
* Reduces duplication by providing a unified approach to provider loading.
|
|
6
|
+
*/
|
|
7
|
+
import { find_config_file, read_config_file, parse_generation_config, parse_capabilities, load_api_key_from_env, get_api_key_env_var_name, } from './config_parser.js';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// Provider Registry
|
|
10
|
+
// =============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Map of registered provider factories by name
|
|
13
|
+
*/
|
|
14
|
+
const provider_factories = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Register a provider factory
|
|
17
|
+
*
|
|
18
|
+
* @param factory - Provider factory to register
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* register_provider_factory({
|
|
23
|
+
* name: 'gemini',
|
|
24
|
+
* config_section: 'llm_gemini',
|
|
25
|
+
* text_param_mappings: GEMINI_PARAM_MAPPINGS,
|
|
26
|
+
* image_param_mappings: GEMINI_PARAM_MAPPINGS,
|
|
27
|
+
* build_config: (section, api_key, text_config, image_config, capabilities, logger) => ({
|
|
28
|
+
* api_key,
|
|
29
|
+
* api_url: section.api_url,
|
|
30
|
+
* // ... other gemini-specific fields
|
|
31
|
+
* }),
|
|
32
|
+
* create_provider: (config) => new GeminiProvider(config),
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function register_provider_factory(factory) {
|
|
37
|
+
provider_factories.set(factory.name.toLowerCase(), factory);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get a registered provider factory by name
|
|
41
|
+
*
|
|
42
|
+
* @param name - Provider name (case-insensitive)
|
|
43
|
+
* @returns Provider factory or undefined
|
|
44
|
+
*/
|
|
45
|
+
export function get_provider_factory(name) {
|
|
46
|
+
return provider_factories.get(name.toLowerCase());
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get all registered provider factory names
|
|
50
|
+
*
|
|
51
|
+
* @returns Array of provider names
|
|
52
|
+
*/
|
|
53
|
+
export function get_registered_factory_names() {
|
|
54
|
+
return Array.from(provider_factories.keys());
|
|
55
|
+
}
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// Provider Loading
|
|
58
|
+
// =============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Load a provider from config using its registered factory
|
|
61
|
+
*
|
|
62
|
+
* @param provider_name - Name of the provider to load
|
|
63
|
+
* @param logger - Logger instance
|
|
64
|
+
* @returns Provider instance or error result
|
|
65
|
+
*/
|
|
66
|
+
export function load_provider_from_config(provider_name, logger) {
|
|
67
|
+
const file_name = 'provider_loader.ts';
|
|
68
|
+
const name_lower = provider_name.toLowerCase();
|
|
69
|
+
// Get the factory for this provider
|
|
70
|
+
const factory = provider_factories.get(name_lower);
|
|
71
|
+
if (!factory) {
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
error: `No factory registered for provider "${provider_name}". Available: ${get_registered_factory_names().join(', ')}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Find and read config file
|
|
78
|
+
const config_path = find_config_file();
|
|
79
|
+
if (!config_path) {
|
|
80
|
+
logger.warn('Config file not found', {
|
|
81
|
+
file: file_name,
|
|
82
|
+
data: { provider: provider_name },
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: 'Config file config/hazo_llm_api_config.ini not found',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const config = read_config_file(config_path);
|
|
90
|
+
if (!config) {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
error: `Failed to read config file: ${config_path}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Get the provider's section
|
|
97
|
+
const section = config[factory.config_section] || {};
|
|
98
|
+
// Load API key from environment
|
|
99
|
+
const api_key = load_api_key_from_env(name_lower);
|
|
100
|
+
if (!api_key) {
|
|
101
|
+
const env_var = get_api_key_env_var_name(name_lower);
|
|
102
|
+
logger.error(`${env_var} not found in environment variables`, {
|
|
103
|
+
file: file_name,
|
|
104
|
+
data: { provider: provider_name, config_path },
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
error: `${env_var} not found in environment variables. Add it to your .env.local file.`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
// Parse generation configs
|
|
113
|
+
const text_config = parse_generation_config(section, factory.text_param_mappings, 'text_');
|
|
114
|
+
const image_config = parse_generation_config(section, factory.image_param_mappings, 'image_');
|
|
115
|
+
// Parse capabilities
|
|
116
|
+
const capabilities = parse_capabilities(section.capabilities);
|
|
117
|
+
// Build provider config
|
|
118
|
+
const provider_config = factory.build_config(section, api_key, text_config, image_config, capabilities, logger);
|
|
119
|
+
// Create provider instance
|
|
120
|
+
const provider = factory.create_provider(provider_config);
|
|
121
|
+
logger.info(`Loaded ${provider_name} provider`, {
|
|
122
|
+
file: file_name,
|
|
123
|
+
data: {
|
|
124
|
+
capabilities: Array.from(provider.get_capabilities()),
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
return { success: true, provider };
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
const error_message = error instanceof Error ? error.message : String(error);
|
|
131
|
+
logger.error(`Failed to load ${provider_name} provider`, {
|
|
132
|
+
file: file_name,
|
|
133
|
+
data: { error: error_message, config_path },
|
|
134
|
+
});
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
error: `Failed to create ${provider_name} provider: ${error_message}`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Load all enabled providers from config
|
|
143
|
+
*
|
|
144
|
+
* @param enabled_llms - List of enabled LLM names
|
|
145
|
+
* @param logger - Logger instance
|
|
146
|
+
* @returns Map of successfully loaded providers
|
|
147
|
+
*/
|
|
148
|
+
export function load_all_providers(enabled_llms, logger) {
|
|
149
|
+
const file_name = 'provider_loader.ts';
|
|
150
|
+
const providers = new Map();
|
|
151
|
+
for (const llm_name of enabled_llms) {
|
|
152
|
+
const result = load_provider_from_config(llm_name, logger);
|
|
153
|
+
if (result.success) {
|
|
154
|
+
providers.set(llm_name.toLowerCase(), result.provider);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
logger.warn(`${llm_name} provider is enabled but failed to load`, {
|
|
158
|
+
file: file_name,
|
|
159
|
+
data: {
|
|
160
|
+
llm_name,
|
|
161
|
+
error: result.error,
|
|
162
|
+
hint: `Check ${get_api_key_env_var_name(llm_name)} in environment variables and [llm_${llm_name.toLowerCase()}] section in config.`,
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return providers;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=provider_loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider_loader.js","sourceRoot":"","sources":["../../../src/lib/config/provider_loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Module Exports
|
|
3
|
+
*
|
|
4
|
+
* Export all database-related functions from this module
|
|
5
|
+
*/
|
|
6
|
+
export { initialize_database, get_database, close_database, insert_prompt, update_prompt, delete_prompt, get_default_sqlite_path, expand_path, resolve_sqlite_path, } from './init_database.js';
|
|
7
|
+
export { row_to_prompt_record, PROMPT_COLUMNS, PROMPT_COLUMN_NAMES, get_prompt_select_clause, } from './utils.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EAEb,uBAAuB,EACvB,WAAW,EACX,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Module Exports
|
|
3
|
+
*
|
|
4
|
+
* Export all database-related functions from this module
|
|
5
|
+
*/
|
|
6
|
+
export { initialize_database, get_database, close_database, insert_prompt, update_prompt, delete_prompt,
|
|
7
|
+
// Path helpers
|
|
8
|
+
get_default_sqlite_path, expand_path, resolve_sqlite_path, } from './init_database.js';
|
|
9
|
+
export { row_to_prompt_record, PROMPT_COLUMNS, PROMPT_COLUMN_NAMES, get_prompt_select_clause, } from './utils.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa;AACb,eAAe;AACf,uBAAuB,EACvB,WAAW,EACX,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Initialization Module
|
|
3
|
+
*
|
|
4
|
+
* Initializes and manages the SQLite database for prompt storage.
|
|
5
|
+
* Uses sql.js for database operations (pure JavaScript SQLite).
|
|
6
|
+
* Creates the prompts_library table if it doesn't exist.
|
|
7
|
+
*/
|
|
8
|
+
import { Database as SqlJsDatabase } from 'sql.js';
|
|
9
|
+
import type { Logger, PromptRecord } from '../llm_api/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Get the default SQLite database path
|
|
12
|
+
* Returns an absolute path relative to the current working directory
|
|
13
|
+
*
|
|
14
|
+
* @returns Default database path: "{process.cwd()}/prompt_library.sqlite"
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { get_default_sqlite_path } from 'hazo_llm_api/server';
|
|
19
|
+
*
|
|
20
|
+
* const path = get_default_sqlite_path();
|
|
21
|
+
* // Returns: "/path/to/your/app/prompt_library.sqlite"
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function get_default_sqlite_path(): string;
|
|
25
|
+
/**
|
|
26
|
+
* Expand tilde (~) in path to user's home directory
|
|
27
|
+
* Also supports environment variables in the format ${VAR_NAME}
|
|
28
|
+
*
|
|
29
|
+
* @param file_path - Path that may contain ~ or environment variables
|
|
30
|
+
* @returns Expanded path
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* import { expand_path } from 'hazo_llm_api/server';
|
|
35
|
+
*
|
|
36
|
+
* expand_path('~/data/prompts.db');
|
|
37
|
+
* // Returns: "/Users/username/data/prompts.db"
|
|
38
|
+
*
|
|
39
|
+
* expand_path('${HOME}/data/prompts.db');
|
|
40
|
+
* // Returns: "/Users/username/data/prompts.db"
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function expand_path(file_path: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve a database path to an absolute path
|
|
46
|
+
* Handles tilde expansion, environment variables, and relative paths
|
|
47
|
+
*
|
|
48
|
+
* @param sqlite_path - Path to resolve (can be relative, absolute, or contain ~/$VAR)
|
|
49
|
+
* @returns Absolute path to the database file
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* import { resolve_sqlite_path } from 'hazo_llm_api/server';
|
|
54
|
+
*
|
|
55
|
+
* resolve_sqlite_path('prompt_library.sqlite');
|
|
56
|
+
* // Returns: "/path/to/cwd/prompt_library.sqlite"
|
|
57
|
+
*
|
|
58
|
+
* resolve_sqlite_path('~/data/prompts.db');
|
|
59
|
+
* // Returns: "/Users/username/data/prompts.db"
|
|
60
|
+
*
|
|
61
|
+
* resolve_sqlite_path('/absolute/path/prompts.db');
|
|
62
|
+
* // Returns: "/absolute/path/prompts.db"
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function resolve_sqlite_path(sqlite_path: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* Initialize the SQLite database connection and create tables if needed
|
|
68
|
+
* @param sqlite_path - Path to the SQLite database file (relative to app root)
|
|
69
|
+
* @param logger - Logger instance for logging operations
|
|
70
|
+
* @returns Database instance
|
|
71
|
+
*/
|
|
72
|
+
export declare function initialize_database(sqlite_path: string, logger: Logger): Promise<SqlJsDatabase>;
|
|
73
|
+
/**
|
|
74
|
+
* Initialize database synchronously (for use in already async contexts)
|
|
75
|
+
* Note: This should only be called after initialize_database has been called once
|
|
76
|
+
*/
|
|
77
|
+
export declare function initialize_database_sync(sqlite_path: string, logger: Logger): SqlJsDatabase | null;
|
|
78
|
+
/**
|
|
79
|
+
* Get the current database instance
|
|
80
|
+
* @returns Database instance or null if not initialized
|
|
81
|
+
*/
|
|
82
|
+
export declare function get_database(): SqlJsDatabase | null;
|
|
83
|
+
/**
|
|
84
|
+
* Save the database to file
|
|
85
|
+
* @param logger - Logger instance
|
|
86
|
+
*/
|
|
87
|
+
export declare function save_database(logger: Logger): void;
|
|
88
|
+
/**
|
|
89
|
+
* Close the database connection
|
|
90
|
+
* @param logger - Logger instance
|
|
91
|
+
*/
|
|
92
|
+
export declare function close_database(logger: Logger): void;
|
|
93
|
+
/**
|
|
94
|
+
* Insert a new prompt into the database
|
|
95
|
+
* @param db - Database instance
|
|
96
|
+
* @param prompt - Prompt data to insert
|
|
97
|
+
* @param logger - Logger instance
|
|
98
|
+
* @returns The inserted prompt record
|
|
99
|
+
*/
|
|
100
|
+
export declare function insert_prompt(db: SqlJsDatabase, prompt: Omit<PromptRecord, 'uuid' | 'created_at' | 'changed_by'>, logger: Logger): PromptRecord;
|
|
101
|
+
/**
|
|
102
|
+
* Update an existing prompt in the database
|
|
103
|
+
* @param db - Database instance
|
|
104
|
+
* @param uuid - UUID of the prompt to update
|
|
105
|
+
* @param updates - Fields to update
|
|
106
|
+
* @param logger - Logger instance
|
|
107
|
+
* @returns The updated prompt record
|
|
108
|
+
*/
|
|
109
|
+
export declare function update_prompt(db: SqlJsDatabase, uuid: string, updates: Partial<Omit<PromptRecord, 'uuid' | 'created_at' | 'changed_by'>>, logger: Logger): PromptRecord | null;
|
|
110
|
+
/**
|
|
111
|
+
* Delete a prompt from the database
|
|
112
|
+
* @param db - Database instance
|
|
113
|
+
* @param uuid - UUID of the prompt to delete
|
|
114
|
+
* @param logger - Logger instance
|
|
115
|
+
* @returns True if deleted successfully, false if not found
|
|
116
|
+
*/
|
|
117
|
+
export declare function delete_prompt(db: SqlJsDatabase, uuid: string, logger: Logger): boolean;
|
|
118
|
+
//# sourceMappingURL=init_database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init_database.d.ts","sourceRoot":"","sources":["../../../src/lib/database/init_database.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAkB,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AAK9D,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAYhE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBrD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQ/D;AAcD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CAgFxB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,aAAa,GAAG,IAAI,CAatB;AA+GD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,aAAa,GAAG,IAAI,CAEnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAoClD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAyBnD;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,aAAa,EACjB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,CAAC,EAChE,MAAM,EAAE,MAAM,GACb,YAAY,CAqEd;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,EAC1E,MAAM,EAAE,MAAM,GACb,YAAY,GAAG,IAAI,CA2GrB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAgDT"}
|