@flutchai/flutch-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +287 -0
- package/dist/api/callback-token.guard.d.ts +17 -0
- package/dist/api/callback-token.guard.js +80 -0
- package/dist/api/callback-token.guard.js.map +1 -0
- package/dist/api/callback.controller.d.ts +7 -0
- package/dist/api/callback.controller.js +44 -0
- package/dist/api/callback.controller.js.map +1 -0
- package/dist/api/graph.controller.d.ts +32 -0
- package/dist/api/graph.controller.js +187 -0
- package/dist/api/graph.controller.js.map +1 -0
- package/dist/api/ui-dispatch.controller.d.ts +34 -0
- package/dist/api/ui-dispatch.controller.js +178 -0
- package/dist/api/ui-dispatch.controller.js.map +1 -0
- package/dist/bootstrap.d.ts +4 -0
- package/dist/bootstrap.js +177 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/callbacks/callback-acl.service.d.ts +24 -0
- package/dist/callbacks/callback-acl.service.js +144 -0
- package/dist/callbacks/callback-acl.service.js.map +1 -0
- package/dist/callbacks/callback-auditor.service.d.ts +47 -0
- package/dist/callbacks/callback-auditor.service.js +286 -0
- package/dist/callbacks/callback-auditor.service.js.map +1 -0
- package/dist/callbacks/callback-metrics.service.d.ts +34 -0
- package/dist/callbacks/callback-metrics.service.js +216 -0
- package/dist/callbacks/callback-metrics.service.js.map +1 -0
- package/dist/callbacks/callback-patch.service.d.ts +13 -0
- package/dist/callbacks/callback-patch.service.js +51 -0
- package/dist/callbacks/callback-patch.service.js.map +1 -0
- package/dist/callbacks/callback-rate-limiter.d.ts +27 -0
- package/dist/callbacks/callback-rate-limiter.js +129 -0
- package/dist/callbacks/callback-rate-limiter.js.map +1 -0
- package/dist/callbacks/callback-registry.d.ts +7 -0
- package/dist/callbacks/callback-registry.js +29 -0
- package/dist/callbacks/callback-registry.js.map +1 -0
- package/dist/callbacks/callback-store.d.ts +19 -0
- package/dist/callbacks/callback-store.js +145 -0
- package/dist/callbacks/callback-store.js.map +1 -0
- package/dist/callbacks/example.callback.d.ts +2 -0
- package/dist/callbacks/example.callback.js +10 -0
- package/dist/callbacks/example.callback.js.map +1 -0
- package/dist/callbacks/idempotency-manager.d.ts +54 -0
- package/dist/callbacks/idempotency-manager.js +230 -0
- package/dist/callbacks/idempotency-manager.js.map +1 -0
- package/dist/callbacks/index.d.ts +13 -0
- package/dist/callbacks/index.js +30 -0
- package/dist/callbacks/index.js.map +1 -0
- package/dist/callbacks/smart-callback.router.d.ts +52 -0
- package/dist/callbacks/smart-callback.router.js +213 -0
- package/dist/callbacks/smart-callback.router.js.map +1 -0
- package/dist/callbacks/telegram-patch.handler.d.ts +6 -0
- package/dist/callbacks/telegram-patch.handler.js +24 -0
- package/dist/callbacks/telegram-patch.handler.js.map +1 -0
- package/dist/callbacks/universal-callback.service.d.ts +14 -0
- package/dist/callbacks/universal-callback.service.js +20 -0
- package/dist/callbacks/universal-callback.service.js.map +1 -0
- package/dist/callbacks/web-patch.handler.d.ts +6 -0
- package/dist/callbacks/web-patch.handler.js +24 -0
- package/dist/callbacks/web-patch.handler.js.map +1 -0
- package/dist/core/abstract-graph.builder.d.ts +128 -0
- package/dist/core/abstract-graph.builder.js +488 -0
- package/dist/core/abstract-graph.builder.js.map +1 -0
- package/dist/core/builder-registry.service.d.ts +6 -0
- package/dist/core/builder-registry.service.js +29 -0
- package/dist/core/builder-registry.service.js.map +1 -0
- package/dist/core/universal-graph.module.d.ts +10 -0
- package/dist/core/universal-graph.module.js +294 -0
- package/dist/core/universal-graph.module.js.map +1 -0
- package/dist/decorators/callback.decorators.d.ts +21 -0
- package/dist/decorators/callback.decorators.js +73 -0
- package/dist/decorators/callback.decorators.js.map +1 -0
- package/dist/endpoint-registry/endpoint.decorators.d.ts +35 -0
- package/dist/endpoint-registry/endpoint.decorators.js +115 -0
- package/dist/endpoint-registry/endpoint.decorators.js.map +1 -0
- package/dist/endpoint-registry/endpoint.registry.d.ts +44 -0
- package/dist/endpoint-registry/endpoint.registry.js +90 -0
- package/dist/endpoint-registry/endpoint.registry.js.map +1 -0
- package/dist/endpoint-registry/index.d.ts +3 -0
- package/dist/endpoint-registry/index.js +20 -0
- package/dist/endpoint-registry/index.js.map +1 -0
- package/dist/endpoint-registry/ui-endpoints.discovery.d.ts +11 -0
- package/dist/endpoint-registry/ui-endpoints.discovery.js +72 -0
- package/dist/endpoint-registry/ui-endpoints.discovery.js.map +1 -0
- package/dist/engine/api-call-tracer.utils.d.ts +8 -0
- package/dist/engine/api-call-tracer.utils.js +184 -0
- package/dist/engine/api-call-tracer.utils.js.map +1 -0
- package/dist/engine/event-processor.utils.d.ts +49 -0
- package/dist/engine/event-processor.utils.js +314 -0
- package/dist/engine/event-processor.utils.js.map +1 -0
- package/dist/engine/graph-engine.factory.d.ts +12 -0
- package/dist/engine/graph-engine.factory.js +43 -0
- package/dist/engine/graph-engine.factory.js.map +1 -0
- package/dist/engine/langgraph-engine.d.ts +14 -0
- package/dist/engine/langgraph-engine.js +261 -0
- package/dist/engine/langgraph-engine.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/callback.interface.d.ts +46 -0
- package/dist/interfaces/callback.interface.js +3 -0
- package/dist/interfaces/callback.interface.js.map +1 -0
- package/dist/interfaces/graph-registry.interface.d.ts +8 -0
- package/dist/interfaces/graph-registry.interface.js +3 -0
- package/dist/interfaces/graph-registry.interface.js.map +1 -0
- package/dist/interfaces/graph-service.interface.d.ts +43 -0
- package/dist/interfaces/graph-service.interface.js +9 -0
- package/dist/interfaces/graph-service.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +3 -0
- package/dist/interfaces/index.js +20 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/llm/index.d.ts +6 -0
- package/dist/llm/index.js +23 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/llm.initializer.d.ts +14 -0
- package/dist/llm/llm.initializer.js +167 -0
- package/dist/llm/llm.initializer.js.map +1 -0
- package/dist/llm/llm.interface.d.ts +6 -0
- package/dist/llm/llm.interface.js +3 -0
- package/dist/llm/llm.interface.js.map +1 -0
- package/dist/llm/llm.types.d.ts +32 -0
- package/dist/llm/llm.types.js +3 -0
- package/dist/llm/llm.types.js.map +1 -0
- package/dist/llm/model.initializer.d.ts +45 -0
- package/dist/llm/model.initializer.js +630 -0
- package/dist/llm/model.initializer.js.map +1 -0
- package/dist/llm/model.interface.d.ts +38 -0
- package/dist/llm/model.interface.js +4 -0
- package/dist/llm/model.interface.js.map +1 -0
- package/dist/llm/rerankers/voyageai-rerank.d.ts +17 -0
- package/dist/llm/rerankers/voyageai-rerank.js +56 -0
- package/dist/llm/rerankers/voyageai-rerank.js.map +1 -0
- package/dist/retriever/database-factory.d.ts +15 -0
- package/dist/retriever/database-factory.js +83 -0
- package/dist/retriever/database-factory.js.map +1 -0
- package/dist/retriever/index.d.ts +2 -0
- package/dist/retriever/index.js +19 -0
- package/dist/retriever/index.js.map +1 -0
- package/dist/retriever/retriever.client.d.ts +28 -0
- package/dist/retriever/retriever.client.js +97 -0
- package/dist/retriever/retriever.client.js.map +1 -0
- package/dist/retriever/retriever.service.d.ts +25 -0
- package/dist/retriever/retriever.service.js +265 -0
- package/dist/retriever/retriever.service.js.map +1 -0
- package/dist/retriever/types.d.ts +22 -0
- package/dist/retriever/types.js +3 -0
- package/dist/retriever/types.js.map +1 -0
- package/dist/schemas/graph-manifest.schema.d.ts +134 -0
- package/dist/schemas/graph-manifest.schema.js +180 -0
- package/dist/schemas/graph-manifest.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +1 -0
- package/dist/schemas/index.js +18 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/shared-types/index.d.ts +199 -0
- package/dist/shared-types/index.js +58 -0
- package/dist/shared-types/index.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +20 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/mcp-converter.d.ts +15 -0
- package/dist/tools/mcp-converter.js +133 -0
- package/dist/tools/mcp-converter.js.map +1 -0
- package/dist/tools/mcp-tool-filter.d.ts +11 -0
- package/dist/tools/mcp-tool-filter.js +123 -0
- package/dist/tools/mcp-tool-filter.js.map +1 -0
- package/dist/tools/mcp.interfaces.d.ts +19 -0
- package/dist/tools/mcp.interfaces.js +3 -0
- package/dist/tools/mcp.interfaces.js.map +1 -0
- package/dist/types/graph-types.d.ts +82 -0
- package/dist/types/graph-types.js +6 -0
- package/dist/types/graph-types.js.map +1 -0
- package/dist/utils/error.utils.d.ts +18 -0
- package/dist/utils/error.utils.js +78 -0
- package/dist/utils/error.utils.js.map +1 -0
- package/dist/utils/graph-type.utils.d.ts +14 -0
- package/dist/utils/graph-type.utils.js +71 -0
- package/dist/utils/graph-type.utils.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/usage-recorder.d.ts +23 -0
- package/dist/utils/usage-recorder.js +29 -0
- package/dist/utils/usage-recorder.js.map +1 -0
- package/dist/versioning/index.d.ts +2 -0
- package/dist/versioning/index.js +19 -0
- package/dist/versioning/index.js.map +1 -0
- package/dist/versioning/versioned-graph.service.d.ts +16 -0
- package/dist/versioning/versioned-graph.service.js +132 -0
- package/dist/versioning/versioned-graph.service.js.map +1 -0
- package/dist/versioning/versioning.types.d.ts +21 -0
- package/dist/versioning/versioning.types.js +3 -0
- package/dist/versioning/versioning.types.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,630 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModelInitializer = void 0;
|
|
4
|
+
exports.prepareModelWithTools = prepareModelWithTools;
|
|
5
|
+
const openai_1 = require("@langchain/openai");
|
|
6
|
+
const azure_openai_1 = require("@langchain/azure-openai");
|
|
7
|
+
const common_1 = require("@nestjs/common");
|
|
8
|
+
function patchChatOpenAIForGPT5() {
|
|
9
|
+
const logger = new common_1.Logger("ModelInitializer.Patch");
|
|
10
|
+
logger.warn(`TEMPORARY WORKAROUND: Applying monkey patch for GPT-5 support in LangChain. Fixes: max_tokens->max_completion_tokens, temperature->1. This patch will be removed once LangChain officially supports GPT-5 models.`);
|
|
11
|
+
const prototypes = [
|
|
12
|
+
openai_1.ChatOpenAI.prototype,
|
|
13
|
+
azure_openai_1.AzureChatOpenAI.prototype,
|
|
14
|
+
];
|
|
15
|
+
prototypes.forEach((prototype, index) => {
|
|
16
|
+
const modelName = index === 0 ? "ChatOpenAI" : "AzureChatOpenAI";
|
|
17
|
+
logger.warn(`Patching ${modelName} for GPT-5 support`);
|
|
18
|
+
const originalInvocationParams = prototype.invocationParams;
|
|
19
|
+
if (originalInvocationParams) {
|
|
20
|
+
prototype.invocationParams = function (options) {
|
|
21
|
+
const params = originalInvocationParams.call(this, options);
|
|
22
|
+
if (params.model &&
|
|
23
|
+
(params.model.includes("gpt-5") ||
|
|
24
|
+
/^gpt-(5|6|7|8|9)/.test(params.model))) {
|
|
25
|
+
if (params.max_tokens !== undefined) {
|
|
26
|
+
params.max_completion_tokens = params.max_tokens;
|
|
27
|
+
delete params.max_tokens;
|
|
28
|
+
}
|
|
29
|
+
if (params.max_output_tokens !== undefined &&
|
|
30
|
+
!params.max_completion_tokens) {
|
|
31
|
+
params.max_completion_tokens = params.max_output_tokens;
|
|
32
|
+
delete params.max_output_tokens;
|
|
33
|
+
}
|
|
34
|
+
const originalTemperature = params.temperature;
|
|
35
|
+
if (params.temperature !== undefined && params.temperature !== 1) {
|
|
36
|
+
params.temperature = 1;
|
|
37
|
+
logger.debug(`Fixed temperature for ${params.model}: ${originalTemperature} -> 1 (GPT-5 models only support temperature=1)`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (params.model &&
|
|
41
|
+
(params.model.includes("gpt-5") ||
|
|
42
|
+
/^gpt-(5|6|7|8|9)/.test(params.model))) {
|
|
43
|
+
if (!params.stream_options) {
|
|
44
|
+
params.stream_options = { include_usage: true };
|
|
45
|
+
logger.warn(`[GPT-5 PATCH] Added stream_options.include_usage=true for ${params.model}`);
|
|
46
|
+
}
|
|
47
|
+
else if (params.stream_options.include_usage !== true) {
|
|
48
|
+
params.stream_options.include_usage = true;
|
|
49
|
+
logger.warn(`[GPT-5 PATCH] Updated stream_options.include_usage=true for ${params.model}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return params;
|
|
53
|
+
};
|
|
54
|
+
logger.warn(`Successfully patched ${modelName}.invocationParams for GPT-5 support (TEMPORARY WORKAROUND)`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
logger.warn(`Could not find invocationParams method to patch in ${modelName}`);
|
|
58
|
+
}
|
|
59
|
+
const originalCompletionWithRetry = prototype.completionWithRetry;
|
|
60
|
+
if (originalCompletionWithRetry) {
|
|
61
|
+
prototype.completionWithRetry = async function (request, options) {
|
|
62
|
+
if ((request === null || request === void 0 ? void 0 : request.model) &&
|
|
63
|
+
(request.model.includes("gpt-5") ||
|
|
64
|
+
/^gpt-(5|6|7|8|9)/.test(request.model))) {
|
|
65
|
+
let hasChanges = false;
|
|
66
|
+
if (request.max_tokens !== undefined) {
|
|
67
|
+
request.max_completion_tokens = request.max_tokens;
|
|
68
|
+
delete request.max_tokens;
|
|
69
|
+
hasChanges = true;
|
|
70
|
+
}
|
|
71
|
+
if (request.temperature !== undefined && request.temperature !== 1) {
|
|
72
|
+
const originalTemp = request.temperature;
|
|
73
|
+
request.temperature = 1;
|
|
74
|
+
logger.debug(`Fixed temperature in completionWithRetry for ${request.model}: ${originalTemp} -> 1`);
|
|
75
|
+
hasChanges = true;
|
|
76
|
+
}
|
|
77
|
+
if (!request.stream_options) {
|
|
78
|
+
request.stream_options = { include_usage: true };
|
|
79
|
+
logger.debug(`Added stream_options.include_usage=true in completionWithRetry for ${request.model}`);
|
|
80
|
+
hasChanges = true;
|
|
81
|
+
}
|
|
82
|
+
else if (request.stream_options.include_usage !== true) {
|
|
83
|
+
request.stream_options.include_usage = true;
|
|
84
|
+
logger.debug(`Updated stream_options.include_usage=true in completionWithRetry for ${request.model}`);
|
|
85
|
+
hasChanges = true;
|
|
86
|
+
}
|
|
87
|
+
if (hasChanges) {
|
|
88
|
+
logger.debug(`Fixed request params in completionWithRetry for ${request.model}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const result = await originalCompletionWithRetry.call(this, request, options);
|
|
92
|
+
if ((request === null || request === void 0 ? void 0 : request.model) &&
|
|
93
|
+
(request.model.includes("gpt-5") ||
|
|
94
|
+
/^gpt-(5|6|7|8|9)/.test(request.model))) {
|
|
95
|
+
logger.warn(`[GPT-5 PATCH] Azure OpenAI Response for ${request.model}:`);
|
|
96
|
+
logger.warn(`Response keys: ${Object.keys(result || {}).join(", ")}`);
|
|
97
|
+
if (result === null || result === void 0 ? void 0 : result.usage) {
|
|
98
|
+
logger.warn(`Usage found: ${JSON.stringify(result.usage, null, 2)}`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
logger.warn(`No usage found in response`);
|
|
102
|
+
}
|
|
103
|
+
if ((result === null || result === void 0 ? void 0 : result.choices) && result.choices[0]) {
|
|
104
|
+
logger.warn(`First choice keys: ${Object.keys(result.choices[0]).join(", ")}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
};
|
|
109
|
+
logger.warn(`Successfully patched ${modelName}.completionWithRetry for GPT-5 support (TEMPORARY WORKAROUND)`);
|
|
110
|
+
}
|
|
111
|
+
const originalIsReasoningModel = prototype.isReasoningModel;
|
|
112
|
+
if (originalIsReasoningModel) {
|
|
113
|
+
prototype.isReasoningModel = function () {
|
|
114
|
+
var _a, _b;
|
|
115
|
+
const model = this.modelName || this.model || ((_a = this.lc_kwargs) === null || _a === void 0 ? void 0 : _a.modelName);
|
|
116
|
+
const isReasoning = /^o\d/.test(model) ||
|
|
117
|
+
model.includes("gpt-5") ||
|
|
118
|
+
/^gpt-(6|7|8|9)/.test(model);
|
|
119
|
+
const originalResult = originalIsReasoningModel.call(this);
|
|
120
|
+
logger.warn(`[GPT-5 PATCH] isReasoningModel check for "${model}": patched=${isReasoning}, original=${originalResult}, modelName=${this.modelName}, model=${this.model}, lc_kwargs=${JSON.stringify((_b = this.lc_kwargs) === null || _b === void 0 ? void 0 : _b.modelName)}`);
|
|
121
|
+
return isReasoning;
|
|
122
|
+
};
|
|
123
|
+
logger.warn(`Successfully patched ${modelName}.isReasoningModel for GPT-5+ reasoning models (TEMPORARY WORKAROUND)`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
logger.warn(`Could not find isReasoningModel method to patch in ${modelName}`);
|
|
127
|
+
}
|
|
128
|
+
const originalInvoke = prototype.invoke;
|
|
129
|
+
if (originalInvoke) {
|
|
130
|
+
prototype.invoke = async function (...args) {
|
|
131
|
+
var _a, _b, _c, _d;
|
|
132
|
+
const model = this.modelName || this.model || ((_a = this.lc_kwargs) === null || _a === void 0 ? void 0 : _a.modelName);
|
|
133
|
+
if (model && model.includes("gpt-5")) {
|
|
134
|
+
logger.warn(`[GPT-5 PATCH] Starting invoke for ${model}`);
|
|
135
|
+
if (args[1]) {
|
|
136
|
+
const config = args[1];
|
|
137
|
+
logger.warn(`[GPT-5 PATCH] Invoke config keys: ${Object.keys(config || {}).join(", ")}`);
|
|
138
|
+
if (config.tools) {
|
|
139
|
+
logger.warn(`[GPT-5 PATCH] Tools in config: ${config.tools.length} tools`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const boundTools = this.bound ||
|
|
143
|
+
this.boundTools ||
|
|
144
|
+
this.tools;
|
|
145
|
+
if (boundTools) {
|
|
146
|
+
logger.warn(`[GPT-5 PATCH] Model has bound tools: ${Array.isArray(boundTools) ? boundTools.length : "yes"}`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
logger.warn(`[GPT-5 PATCH] Model has NO bound tools`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
let result;
|
|
153
|
+
try {
|
|
154
|
+
result = await originalInvoke.apply(this, args);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
if (model && model.includes("gpt-5")) {
|
|
158
|
+
logger.error(`[GPT-5 PATCH] Azure OpenAI invoke failed for ${model}:`, {
|
|
159
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
160
|
+
errorStack: error instanceof Error ? error.stack : undefined,
|
|
161
|
+
errorType: (_b = error === null || error === void 0 ? void 0 : error.constructor) === null || _b === void 0 ? void 0 : _b.name,
|
|
162
|
+
args: args.length,
|
|
163
|
+
hasConfig: !!args[1],
|
|
164
|
+
configKeys: args[1] ? Object.keys(args[1] || {}) : [],
|
|
165
|
+
tools: ((_d = (_c = args[1]) === null || _c === void 0 ? void 0 : _c.tools) === null || _d === void 0 ? void 0 : _d.length) || 0,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
if (model && model.includes("gpt-5")) {
|
|
171
|
+
logger.warn(`[GPT-5 PATCH] Azure OpenAI invoke result for ${model}:`);
|
|
172
|
+
logger.warn(`Result keys: ${Object.keys(result || {}).join(", ")}`);
|
|
173
|
+
if ((result === null || result === void 0 ? void 0 : result.usage_metadata) || (result === null || result === void 0 ? void 0 : result.usageMetadata)) {
|
|
174
|
+
const usage = result.usage_metadata || result.usageMetadata;
|
|
175
|
+
logger.warn(`Usage metadata found: ${JSON.stringify(usage, null, 2)}`);
|
|
176
|
+
}
|
|
177
|
+
if ((result === null || result === void 0 ? void 0 : result.response_metadata) || (result === null || result === void 0 ? void 0 : result.responseMetadata)) {
|
|
178
|
+
const responseMetadata = result.response_metadata || result.responseMetadata;
|
|
179
|
+
logger.warn(`Response metadata found: ${JSON.stringify(responseMetadata, null, 2)}`);
|
|
180
|
+
if (!result.usage_metadata &&
|
|
181
|
+
(responseMetadata === null || responseMetadata === void 0 ? void 0 : responseMetadata.estimatedTokenUsage)) {
|
|
182
|
+
const estimatedUsage = responseMetadata.estimatedTokenUsage;
|
|
183
|
+
result.usage_metadata = {
|
|
184
|
+
input_tokens: estimatedUsage.promptTokens || 0,
|
|
185
|
+
output_tokens: estimatedUsage.completionTokens || 0,
|
|
186
|
+
total_tokens: estimatedUsage.totalTokens || 0,
|
|
187
|
+
};
|
|
188
|
+
logger.warn(`[GPT-5 PATCH] Created usage_metadata from estimatedTokenUsage: ${JSON.stringify(result.usage_metadata, null, 2)}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (!(result === null || result === void 0 ? void 0 : result.usage_metadata) && !(result === null || result === void 0 ? void 0 : result.usageMetadata)) {
|
|
192
|
+
logger.warn(`No usage_metadata found in invoke result`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
196
|
+
};
|
|
197
|
+
logger.warn(`Successfully patched ${modelName}.invoke for GPT-5 response logging (TEMPORARY WORKAROUND)`);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
patchChatOpenAIForGPT5();
|
|
202
|
+
const openai_2 = require("@langchain/openai");
|
|
203
|
+
const anthropic_1 = require("@langchain/anthropic");
|
|
204
|
+
const cohere_1 = require("@langchain/cohere");
|
|
205
|
+
const cohere_2 = require("@langchain/cohere");
|
|
206
|
+
const voyageai_rerank_1 = require("./rerankers/voyageai-rerank");
|
|
207
|
+
const mistralai_1 = require("@langchain/mistralai");
|
|
208
|
+
const shared_types_1 = require("../shared-types");
|
|
209
|
+
class ModelInitializer {
|
|
210
|
+
constructor(configFetcher, logger) {
|
|
211
|
+
this.configFetcher = configFetcher;
|
|
212
|
+
this.modelConfigCache = new Map();
|
|
213
|
+
this.modelInstanceCache = new Map();
|
|
214
|
+
this.chatModelCreators = {
|
|
215
|
+
[shared_types_1.ModelProvider.OPENAI]: ({ modelName, defaultTemperature, defaultMaxTokens, apiToken, }) => {
|
|
216
|
+
if (this.requiresMaxCompletionTokens(modelName)) {
|
|
217
|
+
const fixedTemperature = 1;
|
|
218
|
+
const config = {
|
|
219
|
+
modelName,
|
|
220
|
+
temperature: fixedTemperature,
|
|
221
|
+
maxCompletionTokens: defaultMaxTokens,
|
|
222
|
+
streaming: true,
|
|
223
|
+
openAIApiKey: apiToken || process.env.OPENAI_API_KEY,
|
|
224
|
+
};
|
|
225
|
+
if (defaultTemperature !== 1) {
|
|
226
|
+
this.logger.debug(`Fixed temperature for GPT-5+ model ${modelName}: ${defaultTemperature} -> 1 (GPT-5+ models only support temperature=1)`);
|
|
227
|
+
}
|
|
228
|
+
const chatOpenAI = new openai_1.ChatOpenAI(config);
|
|
229
|
+
return chatOpenAI;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
const config = {
|
|
233
|
+
modelName,
|
|
234
|
+
temperature: defaultTemperature,
|
|
235
|
+
maxTokens: defaultMaxTokens,
|
|
236
|
+
streaming: true,
|
|
237
|
+
openAIApiKey: apiToken || process.env.OPENAI_API_KEY,
|
|
238
|
+
};
|
|
239
|
+
const chatOpenAI = new openai_1.ChatOpenAI(config);
|
|
240
|
+
return chatOpenAI;
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
[shared_types_1.ModelProvider.ANTHROPIC]: ({ modelName, defaultTemperature, defaultMaxTokens, apiToken, }) => new anthropic_1.ChatAnthropic({
|
|
244
|
+
modelName,
|
|
245
|
+
temperature: defaultTemperature,
|
|
246
|
+
maxTokens: defaultMaxTokens,
|
|
247
|
+
anthropicApiKey: apiToken || process.env.ANTHROPIC_API_KEY,
|
|
248
|
+
}),
|
|
249
|
+
[shared_types_1.ModelProvider.COHERE]: ({ modelName, defaultTemperature, defaultMaxTokens, apiToken, }) => new cohere_1.ChatCohere({
|
|
250
|
+
model: modelName,
|
|
251
|
+
temperature: defaultTemperature,
|
|
252
|
+
apiKey: apiToken || process.env.COHERE_API_KEY,
|
|
253
|
+
}),
|
|
254
|
+
[shared_types_1.ModelProvider.MISTRAL]: ({ modelName, defaultTemperature, defaultMaxTokens, apiToken, }) => new mistralai_1.ChatMistralAI({
|
|
255
|
+
model: modelName,
|
|
256
|
+
temperature: defaultTemperature,
|
|
257
|
+
maxTokens: defaultMaxTokens,
|
|
258
|
+
apiKey: apiToken || process.env.MISTRAL_API_KEY,
|
|
259
|
+
}),
|
|
260
|
+
[shared_types_1.ModelProvider.FLUTCH_OPENAI]: ({ modelName, defaultTemperature, defaultMaxTokens, apiToken, }) => {
|
|
261
|
+
if (this.requiresMaxCompletionTokens(modelName)) {
|
|
262
|
+
const fixedTemperature = 1;
|
|
263
|
+
const config = {
|
|
264
|
+
modelName,
|
|
265
|
+
temperature: fixedTemperature,
|
|
266
|
+
maxCompletionTokens: defaultMaxTokens,
|
|
267
|
+
streaming: true,
|
|
268
|
+
openAIApiKey: apiToken || process.env.OPENAI_API_KEY,
|
|
269
|
+
};
|
|
270
|
+
if (defaultTemperature !== 1) {
|
|
271
|
+
this.logger.debug(`Fixed temperature for FLUTCH GPT-5+ model ${modelName}: ${defaultTemperature} -> 1 (GPT-5+ models only support temperature=1)`);
|
|
272
|
+
}
|
|
273
|
+
this.logger.debug(`Creating FLUTCH GPT-5+ model with config`, {
|
|
274
|
+
modelName,
|
|
275
|
+
maxCompletionTokens: defaultMaxTokens,
|
|
276
|
+
temperature: fixedTemperature,
|
|
277
|
+
originalTemperature: defaultTemperature,
|
|
278
|
+
hasApiKey: !!config.openAIApiKey,
|
|
279
|
+
});
|
|
280
|
+
const chatOpenAI = new openai_1.ChatOpenAI(config);
|
|
281
|
+
this.logger.debug(`FLUTCH ChatOpenAI GPT-5+ instance created`, {
|
|
282
|
+
modelName: modelName,
|
|
283
|
+
maxTokens: chatOpenAI.maxTokens,
|
|
284
|
+
maxCompletionTokens: chatOpenAI.maxCompletionTokens,
|
|
285
|
+
temperature: chatOpenAI.temperature,
|
|
286
|
+
streaming: chatOpenAI.streaming,
|
|
287
|
+
clientConfig: chatOpenAI.clientConfig,
|
|
288
|
+
kwargs: chatOpenAI.kwargs,
|
|
289
|
+
});
|
|
290
|
+
return chatOpenAI;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
const config = {
|
|
294
|
+
modelName,
|
|
295
|
+
temperature: defaultTemperature,
|
|
296
|
+
maxTokens: defaultMaxTokens,
|
|
297
|
+
streaming: true,
|
|
298
|
+
openAIApiKey: apiToken || process.env.OPENAI_API_KEY,
|
|
299
|
+
};
|
|
300
|
+
this.logger.debug(`Creating FLUTCH legacy model with config`, {
|
|
301
|
+
modelName,
|
|
302
|
+
maxTokens: defaultMaxTokens,
|
|
303
|
+
temperature: defaultTemperature,
|
|
304
|
+
hasApiKey: !!config.openAIApiKey,
|
|
305
|
+
});
|
|
306
|
+
const chatOpenAI = new openai_1.ChatOpenAI(config);
|
|
307
|
+
this.logger.debug(`FLUTCH ChatOpenAI legacy instance created`, {
|
|
308
|
+
modelName: modelName,
|
|
309
|
+
maxTokens: chatOpenAI.maxTokens,
|
|
310
|
+
maxCompletionTokens: chatOpenAI.maxCompletionTokens,
|
|
311
|
+
temperature: chatOpenAI.temperature,
|
|
312
|
+
streaming: chatOpenAI.streaming,
|
|
313
|
+
clientConfig: chatOpenAI.clientConfig,
|
|
314
|
+
kwargs: chatOpenAI.kwargs,
|
|
315
|
+
});
|
|
316
|
+
return chatOpenAI;
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
[shared_types_1.ModelProvider.FLUTCH]: () => {
|
|
320
|
+
throw new Error("Flutch chat models not implemented");
|
|
321
|
+
},
|
|
322
|
+
[shared_types_1.ModelProvider.FLUTCH_MISTRAL]: () => {
|
|
323
|
+
throw new Error("Flutch Mistral chat models not implemented");
|
|
324
|
+
},
|
|
325
|
+
[shared_types_1.ModelProvider.FLUTCH_ANTHROPIC]: () => {
|
|
326
|
+
throw new Error("Flutch Anthropic chat models not implemented");
|
|
327
|
+
},
|
|
328
|
+
[shared_types_1.ModelProvider.VOYAGEAI]: () => {
|
|
329
|
+
throw new Error("VoyageAI chat models not implemented");
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
this.rerankModelCreators = {
|
|
333
|
+
[shared_types_1.ModelProvider.COHERE]: ({ modelName, apiToken, maxDocuments }) => {
|
|
334
|
+
return new cohere_2.CohereRerank({
|
|
335
|
+
apiKey: apiToken || process.env.COHERE_API_KEY,
|
|
336
|
+
model: modelName,
|
|
337
|
+
topN: maxDocuments || 20,
|
|
338
|
+
});
|
|
339
|
+
},
|
|
340
|
+
[shared_types_1.ModelProvider.VOYAGEAI]: ({ modelName, apiToken, maxDocuments }) => {
|
|
341
|
+
return new voyageai_rerank_1.VoyageAIRerank({
|
|
342
|
+
apiKey: apiToken || process.env.VOYAGEAI_API_KEY,
|
|
343
|
+
model: modelName,
|
|
344
|
+
topN: maxDocuments || 20,
|
|
345
|
+
});
|
|
346
|
+
},
|
|
347
|
+
[shared_types_1.ModelProvider.OPENAI]: undefined,
|
|
348
|
+
[shared_types_1.ModelProvider.ANTHROPIC]: undefined,
|
|
349
|
+
[shared_types_1.ModelProvider.MISTRAL]: undefined,
|
|
350
|
+
[shared_types_1.ModelProvider.AWS]: undefined,
|
|
351
|
+
[shared_types_1.ModelProvider.FLUTCH]: undefined,
|
|
352
|
+
[shared_types_1.ModelProvider.FLUTCH_MISTRAL]: undefined,
|
|
353
|
+
[shared_types_1.ModelProvider.FLUTCH_OPENAI]: undefined,
|
|
354
|
+
[shared_types_1.ModelProvider.FLUTCH_ANTHROPIC]: undefined,
|
|
355
|
+
};
|
|
356
|
+
this.embeddingModelCreators = {
|
|
357
|
+
[shared_types_1.ModelProvider.OPENAI]: ({ modelName, apiToken }) => new openai_2.OpenAIEmbeddings({
|
|
358
|
+
model: modelName,
|
|
359
|
+
apiKey: apiToken || process.env.OPENAI_API_KEY,
|
|
360
|
+
}),
|
|
361
|
+
[shared_types_1.ModelProvider.ANTHROPIC]: undefined,
|
|
362
|
+
[shared_types_1.ModelProvider.COHERE]: undefined,
|
|
363
|
+
[shared_types_1.ModelProvider.MISTRAL]: undefined,
|
|
364
|
+
[shared_types_1.ModelProvider.AWS]: undefined,
|
|
365
|
+
[shared_types_1.ModelProvider.FLUTCH]: undefined,
|
|
366
|
+
[shared_types_1.ModelProvider.FLUTCH_MISTRAL]: undefined,
|
|
367
|
+
[shared_types_1.ModelProvider.FLUTCH_OPENAI]: undefined,
|
|
368
|
+
[shared_types_1.ModelProvider.FLUTCH_ANTHROPIC]: undefined,
|
|
369
|
+
[shared_types_1.ModelProvider.VOYAGEAI]: undefined,
|
|
370
|
+
};
|
|
371
|
+
this.logger = logger || new common_1.Logger(ModelInitializer.name);
|
|
372
|
+
}
|
|
373
|
+
generateModelCacheKey(modelId, temperature, maxTokens, modelType) {
|
|
374
|
+
return `${modelId}:${temperature || "default"}:${maxTokens || "default"}:${modelType || shared_types_1.ModelType.CHAT}`;
|
|
375
|
+
}
|
|
376
|
+
requiresMaxCompletionTokens(modelName) {
|
|
377
|
+
const requiresNew = modelName.includes("gpt-5") ||
|
|
378
|
+
modelName.includes("gpt-o1") ||
|
|
379
|
+
modelName.includes("gpt-o2") ||
|
|
380
|
+
modelName.includes("gpt-o3") ||
|
|
381
|
+
modelName.includes("gpt-o4") ||
|
|
382
|
+
/^gpt-(5|6|7|8|9)/.test(modelName) ||
|
|
383
|
+
/^gpt-o[1-4]/.test(modelName);
|
|
384
|
+
this.logger.debug(`Checking token parameter for model "${modelName}"`, {
|
|
385
|
+
modelName,
|
|
386
|
+
requiresMaxCompletionTokens: requiresNew,
|
|
387
|
+
checks: {
|
|
388
|
+
includesGpt5: modelName.includes("gpt-5"),
|
|
389
|
+
includesO1: modelName.includes("gpt-o1"),
|
|
390
|
+
includesO2: modelName.includes("gpt-o2"),
|
|
391
|
+
includesO3: modelName.includes("gpt-o3"),
|
|
392
|
+
includesO4: modelName.includes("gpt-o4"),
|
|
393
|
+
regexGpt5Plus: /^gpt-(5|6|7|8|9)/.test(modelName),
|
|
394
|
+
regexO1to4: /^gpt-o[1-4]/.test(modelName),
|
|
395
|
+
},
|
|
396
|
+
});
|
|
397
|
+
return requiresNew;
|
|
398
|
+
}
|
|
399
|
+
async initializeChatModel(config) {
|
|
400
|
+
var _a, _b, _c;
|
|
401
|
+
const cacheKey = this.generateModelCacheKey(config.modelId, config.temperature, config.maxTokens, shared_types_1.ModelType.CHAT);
|
|
402
|
+
const cachedModel = this.modelInstanceCache.get(cacheKey);
|
|
403
|
+
if (cachedModel) {
|
|
404
|
+
this.logger.debug(`Using cached chat model instance: ${cacheKey}`);
|
|
405
|
+
return cachedModel;
|
|
406
|
+
}
|
|
407
|
+
const modelConfig = await this.getModelConfigWithType(config.modelId);
|
|
408
|
+
if (modelConfig.modelType !== shared_types_1.ModelType.CHAT) {
|
|
409
|
+
throw new Error(`Model ${config.modelId} is not a chat model (type: ${modelConfig.modelType})`);
|
|
410
|
+
}
|
|
411
|
+
const creator = this.chatModelCreators[modelConfig.provider];
|
|
412
|
+
if (!creator) {
|
|
413
|
+
throw new Error(`Chat models not supported for provider: ${modelConfig.provider}`);
|
|
414
|
+
}
|
|
415
|
+
const finalConfig = Object.assign(Object.assign({}, modelConfig), { defaultTemperature: Number((_a = config.temperature) !== null && _a !== void 0 ? _a : modelConfig.defaultTemperature), defaultMaxTokens: Number((_b = config.maxTokens) !== null && _b !== void 0 ? _b : modelConfig.defaultMaxTokens) });
|
|
416
|
+
this.logger.debug(`Creating new chat model instance: ${cacheKey}`);
|
|
417
|
+
const model = creator(finalConfig);
|
|
418
|
+
model.metadata = Object.assign(Object.assign({}, model.metadata), { modelId: config.modelId });
|
|
419
|
+
this.logger.debug("🔧 Model initialized with metadata", {
|
|
420
|
+
modelId: config.modelId,
|
|
421
|
+
metadataKeys: Object.keys(model.metadata || {}),
|
|
422
|
+
hasModelId: !!((_c = model.metadata) === null || _c === void 0 ? void 0 : _c.modelId),
|
|
423
|
+
});
|
|
424
|
+
this.modelInstanceCache.set(cacheKey, model);
|
|
425
|
+
return model;
|
|
426
|
+
}
|
|
427
|
+
async initializeRerankModel(config) {
|
|
428
|
+
const cacheKey = this.generateModelCacheKey(config.modelId, undefined, config.maxTokens, shared_types_1.ModelType.RERANK);
|
|
429
|
+
const cachedModel = this.modelInstanceCache.get(cacheKey);
|
|
430
|
+
if (cachedModel) {
|
|
431
|
+
this.logger.debug(`Using cached rerank model instance: ${cacheKey}`);
|
|
432
|
+
return cachedModel;
|
|
433
|
+
}
|
|
434
|
+
const modelConfig = await this.getModelConfigWithType(config.modelId);
|
|
435
|
+
if (modelConfig.modelType !== shared_types_1.ModelType.RERANK) {
|
|
436
|
+
throw new Error(`Model ${config.modelId} is not a rerank model (type: ${modelConfig.modelType})`);
|
|
437
|
+
}
|
|
438
|
+
const creator = this.rerankModelCreators[modelConfig.provider];
|
|
439
|
+
if (!creator) {
|
|
440
|
+
throw new Error(`Rerank models not supported for provider: ${modelConfig.provider}`);
|
|
441
|
+
}
|
|
442
|
+
this.logger.debug(`Creating new rerank model instance: ${cacheKey}`);
|
|
443
|
+
const model = creator(modelConfig);
|
|
444
|
+
model.metadata = Object.assign(Object.assign({}, model.metadata), { modelId: config.modelId });
|
|
445
|
+
this.modelInstanceCache.set(cacheKey, model);
|
|
446
|
+
return model;
|
|
447
|
+
}
|
|
448
|
+
async initializeEmbeddingModel(config) {
|
|
449
|
+
const cacheKey = this.generateModelCacheKey(config.modelId, undefined, undefined, shared_types_1.ModelType.EMBEDDING);
|
|
450
|
+
const cachedModel = this.modelInstanceCache.get(cacheKey);
|
|
451
|
+
if (cachedModel) {
|
|
452
|
+
this.logger.debug(`Using cached embedding model instance: ${cacheKey}`);
|
|
453
|
+
return cachedModel;
|
|
454
|
+
}
|
|
455
|
+
const modelConfig = await this.getModelConfigWithType(config.modelId);
|
|
456
|
+
if (modelConfig.modelType !== shared_types_1.ModelType.EMBEDDING) {
|
|
457
|
+
throw new Error(`Model ${config.modelId} is not an embedding model (type: ${modelConfig.modelType})`);
|
|
458
|
+
}
|
|
459
|
+
const creator = this.embeddingModelCreators[modelConfig.provider];
|
|
460
|
+
if (!creator) {
|
|
461
|
+
throw new Error(`Embedding models not supported for provider: ${modelConfig.provider}`);
|
|
462
|
+
}
|
|
463
|
+
this.logger.debug(`Creating new embedding model instance: ${cacheKey}`);
|
|
464
|
+
const model = creator(modelConfig);
|
|
465
|
+
model.metadata = Object.assign(Object.assign({}, model.metadata), { modelId: config.modelId });
|
|
466
|
+
this.modelInstanceCache.set(cacheKey, model);
|
|
467
|
+
return model;
|
|
468
|
+
}
|
|
469
|
+
async createChatModelById(modelId) {
|
|
470
|
+
const config = await this.getModelConfigWithType(modelId);
|
|
471
|
+
if (config.modelType !== shared_types_1.ModelType.CHAT) {
|
|
472
|
+
throw new Error(`Model ${modelId} is not a chat model, got: ${config.modelType}`);
|
|
473
|
+
}
|
|
474
|
+
return this.initializeChatModel(config);
|
|
475
|
+
}
|
|
476
|
+
async createRerankModelById(modelId) {
|
|
477
|
+
const config = await this.getModelConfigWithType(modelId);
|
|
478
|
+
if (config.modelType !== shared_types_1.ModelType.RERANK) {
|
|
479
|
+
throw new Error(`Model ${modelId} is not a rerank model, got: ${config.modelType}`);
|
|
480
|
+
}
|
|
481
|
+
return this.initializeRerankModel(config);
|
|
482
|
+
}
|
|
483
|
+
async createEmbeddingModelById(modelId) {
|
|
484
|
+
const config = await this.getModelConfigWithType(modelId);
|
|
485
|
+
if (config.modelType !== shared_types_1.ModelType.EMBEDDING) {
|
|
486
|
+
throw new Error(`Model ${modelId} is not an embedding model, got: ${config.modelType}`);
|
|
487
|
+
}
|
|
488
|
+
return this.initializeEmbeddingModel(config);
|
|
489
|
+
}
|
|
490
|
+
async createModelById(modelId, expectedType) {
|
|
491
|
+
const config = await this.getModelConfigWithType(modelId);
|
|
492
|
+
if (expectedType && config.modelType !== expectedType) {
|
|
493
|
+
throw new Error(`Model ${modelId} expected to be ${expectedType}, but got: ${config.modelType}`);
|
|
494
|
+
}
|
|
495
|
+
return this.initializeModelByType(config);
|
|
496
|
+
}
|
|
497
|
+
async initializeModelByType(config) {
|
|
498
|
+
switch (config.modelType) {
|
|
499
|
+
case shared_types_1.ModelType.CHAT:
|
|
500
|
+
return this.initializeChatModel(config);
|
|
501
|
+
case shared_types_1.ModelType.RERANK:
|
|
502
|
+
return this.initializeRerankModel(config);
|
|
503
|
+
case shared_types_1.ModelType.EMBEDDING:
|
|
504
|
+
return this.initializeEmbeddingModel(config);
|
|
505
|
+
case shared_types_1.ModelType.IMAGE:
|
|
506
|
+
case shared_types_1.ModelType.SPEECH:
|
|
507
|
+
throw new Error(`Model type ${config.modelType} not yet supported`);
|
|
508
|
+
default:
|
|
509
|
+
throw new Error(`Unknown model type: ${config.modelType}`);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
async getModelConfigWithType(modelId) {
|
|
513
|
+
const cachedConfig = this.modelConfigCache.get(modelId);
|
|
514
|
+
if (cachedConfig) {
|
|
515
|
+
this.logger.debug(`Using cached model config: ${modelId}`);
|
|
516
|
+
return cachedConfig;
|
|
517
|
+
}
|
|
518
|
+
this.logger.debug(`Fetching model config: ${modelId}`);
|
|
519
|
+
const baseConfig = this.configFetcher
|
|
520
|
+
? await this.configFetcher(modelId)
|
|
521
|
+
: await this.fetchFromApi(modelId);
|
|
522
|
+
const result = Object.assign(Object.assign({}, baseConfig), { modelType: baseConfig.modelType || shared_types_1.ModelType.CHAT, maxDocuments: baseConfig.maxDocuments, dimensions: baseConfig.dimensions, supportedFormats: baseConfig.supportedFormats });
|
|
523
|
+
this.modelConfigCache.set(modelId, result);
|
|
524
|
+
return result;
|
|
525
|
+
}
|
|
526
|
+
isModelTypeSupported(modelType) {
|
|
527
|
+
return [shared_types_1.ModelType.CHAT, shared_types_1.ModelType.RERANK, shared_types_1.ModelType.EMBEDDING].includes(modelType);
|
|
528
|
+
}
|
|
529
|
+
getSupportedModelTypes() {
|
|
530
|
+
return [shared_types_1.ModelType.CHAT, shared_types_1.ModelType.RERANK, shared_types_1.ModelType.EMBEDDING];
|
|
531
|
+
}
|
|
532
|
+
clearCache() {
|
|
533
|
+
this.logger.debug(`Clearing ModelInitializer cache: ${this.modelConfigCache.size} configs, ${this.modelInstanceCache.size} instances`);
|
|
534
|
+
this.modelConfigCache.clear();
|
|
535
|
+
this.modelInstanceCache.clear();
|
|
536
|
+
}
|
|
537
|
+
clearModelCache(modelId) {
|
|
538
|
+
this.modelConfigCache.delete(modelId);
|
|
539
|
+
const keysToDelete = [];
|
|
540
|
+
for (const [key] of this.modelInstanceCache.entries()) {
|
|
541
|
+
if (key.startsWith(`${modelId}:`)) {
|
|
542
|
+
keysToDelete.push(key);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
keysToDelete.forEach(key => {
|
|
546
|
+
this.modelInstanceCache.delete(key);
|
|
547
|
+
});
|
|
548
|
+
this.logger.debug(`Cleared cache for model ${modelId}: ${keysToDelete.length} instances`);
|
|
549
|
+
}
|
|
550
|
+
getCacheStats() {
|
|
551
|
+
return {
|
|
552
|
+
configCacheSize: this.modelConfigCache.size,
|
|
553
|
+
instanceCacheSize: this.modelInstanceCache.size,
|
|
554
|
+
configCacheKeys: Array.from(this.modelConfigCache.keys()),
|
|
555
|
+
instanceCacheKeys: Array.from(this.modelInstanceCache.keys()),
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
async fetchFromApi(modelId) {
|
|
559
|
+
const apiUrl = process.env.API_URL || "http://amelie-service";
|
|
560
|
+
const token = process.env.INTERNAL_API_TOKEN;
|
|
561
|
+
if (!token) {
|
|
562
|
+
throw new Error("INTERNAL_API_TOKEN required for API mode");
|
|
563
|
+
}
|
|
564
|
+
const url = `${apiUrl}/internal/model-catalog/models/${modelId}/config`;
|
|
565
|
+
const response = await fetch(url, {
|
|
566
|
+
method: "GET",
|
|
567
|
+
headers: {
|
|
568
|
+
"x-internal-token": token,
|
|
569
|
+
"Content-Type": "application/json",
|
|
570
|
+
},
|
|
571
|
+
});
|
|
572
|
+
if (!response.ok) {
|
|
573
|
+
throw new Error(`Failed to fetch model config: ${response.status} ${response.statusText}`);
|
|
574
|
+
}
|
|
575
|
+
const config = await response.json();
|
|
576
|
+
console.debug(`ModelInitializer.fetchFromApi - API response for ${modelId}:`, {
|
|
577
|
+
url,
|
|
578
|
+
statusCode: response.status,
|
|
579
|
+
configKeys: Object.keys(config),
|
|
580
|
+
modelType: config.modelType,
|
|
581
|
+
hasModelType: !!config.modelType,
|
|
582
|
+
fullConfig: config,
|
|
583
|
+
});
|
|
584
|
+
const result = Object.assign(Object.assign({}, config), { modelType: config.modelType || shared_types_1.ModelType.CHAT });
|
|
585
|
+
console.debug(`ModelInitializer.fetchFromApi - final result:`, {
|
|
586
|
+
modelId,
|
|
587
|
+
resultModelType: result.modelType,
|
|
588
|
+
usedFallback: !config.modelType,
|
|
589
|
+
resultKeys: Object.keys(result),
|
|
590
|
+
});
|
|
591
|
+
return result;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
exports.ModelInitializer = ModelInitializer;
|
|
595
|
+
function prepareModelWithTools(model, tools, baseConfig = {}) {
|
|
596
|
+
if (tools.length === 0) {
|
|
597
|
+
return {
|
|
598
|
+
modelWithTools: model,
|
|
599
|
+
finalConfig: baseConfig,
|
|
600
|
+
toolsMethod: "none",
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
if (model.bindTools && typeof model.bindTools === "function") {
|
|
604
|
+
try {
|
|
605
|
+
const modelWithTools = model.bindTools(tools);
|
|
606
|
+
return {
|
|
607
|
+
modelWithTools,
|
|
608
|
+
finalConfig: baseConfig,
|
|
609
|
+
toolsMethod: "bindTools",
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
catch (error) {
|
|
613
|
+
const invokeConfig = { tools };
|
|
614
|
+
const finalConfig = Object.assign(Object.assign({}, baseConfig), invokeConfig);
|
|
615
|
+
return {
|
|
616
|
+
modelWithTools: model,
|
|
617
|
+
finalConfig,
|
|
618
|
+
toolsMethod: "manual",
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
const invokeConfig = { tools };
|
|
623
|
+
const finalConfig = Object.assign(Object.assign({}, baseConfig), invokeConfig);
|
|
624
|
+
return {
|
|
625
|
+
modelWithTools: model,
|
|
626
|
+
finalConfig,
|
|
627
|
+
toolsMethod: "manual",
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
//# sourceMappingURL=model.initializer.js.map
|