node-llama-cpp 3.0.0-beta.16 → 3.0.0-beta.18
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 +8 -5
- package/dist/ChatWrapper.d.ts +1 -15
- package/dist/ChatWrapper.js +22 -32
- package/dist/ChatWrapper.js.map +1 -1
- package/dist/apiDocsOverrides.d.ts +1 -0
- package/dist/apiDocsOverrides.js +5 -0
- package/dist/apiDocsOverrides.js.map +1 -0
- package/dist/bindings/AddonTypes.d.ts +4 -1
- package/dist/bindings/getLlama.d.ts +5 -1
- package/dist/bindings/getLlama.js +11 -4
- package/dist/bindings/getLlama.js.map +1 -1
- package/dist/bindings/utils/hasBuildingFromSourceDependenciesInstalled.d.ts +3 -0
- package/dist/bindings/utils/hasBuildingFromSourceDependenciesInstalled.js +27 -0
- package/dist/bindings/utils/hasBuildingFromSourceDependenciesInstalled.js.map +1 -0
- package/dist/chatWrappers/FunctionaryChatWrapper.js +39 -40
- package/dist/chatWrappers/FunctionaryChatWrapper.js.map +1 -1
- package/dist/chatWrappers/{LlamaChatWrapper.d.ts → Llama2ChatWrapper.d.ts} +1 -1
- package/dist/chatWrappers/{LlamaChatWrapper.js → Llama2ChatWrapper.js} +3 -3
- package/dist/chatWrappers/Llama2ChatWrapper.js.map +1 -0
- package/dist/chatWrappers/Llama3ChatWrapper.d.ts +31 -0
- package/dist/chatWrappers/Llama3ChatWrapper.js +129 -0
- package/dist/chatWrappers/Llama3ChatWrapper.js.map +1 -0
- package/dist/chatWrappers/generic/JinjaTemplateChatWrapper.d.ts +2 -2
- package/dist/chatWrappers/generic/JinjaTemplateChatWrapper.js +6 -2
- package/dist/chatWrappers/generic/JinjaTemplateChatWrapper.js.map +1 -1
- package/dist/chatWrappers/generic/TemplateChatWrapper.d.ts +3 -4
- package/dist/chatWrappers/generic/TemplateChatWrapper.js +1 -2
- package/dist/chatWrappers/generic/TemplateChatWrapper.js.map +1 -1
- package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.d.ts +42 -0
- package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.js +82 -0
- package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.js.map +1 -0
- package/dist/chatWrappers/utils/isJinjaTemplateEquivalentToSpecializedChatWrapper.js +3 -3
- package/dist/chatWrappers/utils/isJinjaTemplateEquivalentToSpecializedChatWrapper.js.map +1 -1
- package/dist/chatWrappers/utils/resolveChatWrapper.d.ts +6 -4
- package/dist/chatWrappers/utils/resolveChatWrapper.js +23 -17
- package/dist/chatWrappers/utils/resolveChatWrapper.js.map +1 -1
- package/dist/cli/cli.js +5 -3
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/ChatCommand.d.ts +2 -0
- package/dist/cli/commands/ChatCommand.js +26 -9
- package/dist/cli/commands/ChatCommand.js.map +1 -1
- package/dist/cli/commands/CompleteCommand.d.ts +2 -0
- package/dist/cli/commands/CompleteCommand.js +24 -7
- package/dist/cli/commands/CompleteCommand.js.map +1 -1
- package/dist/cli/commands/DebugCommand.js +3 -5
- package/dist/cli/commands/DebugCommand.js.map +1 -1
- package/dist/cli/commands/DownloadCommand.d.ts +1 -1
- package/dist/cli/commands/DownloadCommand.js +2 -1
- package/dist/cli/commands/DownloadCommand.js.map +1 -1
- package/dist/cli/commands/InfillCommand.d.ts +2 -0
- package/dist/cli/commands/InfillCommand.js +24 -7
- package/dist/cli/commands/InfillCommand.js.map +1 -1
- package/dist/cli/commands/PullCommand.d.ts +12 -0
- package/dist/cli/commands/PullCommand.js +109 -0
- package/dist/cli/commands/PullCommand.js.map +1 -0
- package/dist/cli/commands/inspect/commands/InspectGgufCommand.d.ts +1 -0
- package/dist/cli/commands/inspect/commands/InspectGgufCommand.js +23 -11
- package/dist/cli/commands/inspect/commands/InspectGgufCommand.js.map +1 -1
- package/dist/cli/commands/inspect/commands/InspectMeasureCommand.d.ts +2 -0
- package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js +43 -11
- package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js.map +1 -1
- package/dist/cli/recommendedModels.js +61 -0
- package/dist/cli/recommendedModels.js.map +1 -1
- package/dist/cli/utils/printCommonInfoLines.js +4 -3
- package/dist/cli/utils/printCommonInfoLines.js.map +1 -1
- package/dist/cli/utils/resolveCommandGgufPath.d.ts +3 -1
- package/dist/cli/utils/resolveCommandGgufPath.js +44 -39
- package/dist/cli/utils/resolveCommandGgufPath.js.map +1 -1
- package/dist/cli/utils/resolveModelRecommendationFileOptions.d.ts +1 -1
- package/dist/evaluator/LlamaChat/LlamaChat.d.ts +18 -2
- package/dist/evaluator/LlamaChat/LlamaChat.js +271 -186
- package/dist/evaluator/LlamaChat/LlamaChat.js.map +1 -1
- package/dist/evaluator/LlamaChat/utils/FunctionCallGrammar.js +3 -1
- package/dist/evaluator/LlamaChat/utils/FunctionCallGrammar.js.map +1 -1
- package/dist/evaluator/LlamaChatSession/LlamaChatSession.d.ts +22 -3
- package/dist/evaluator/LlamaChatSession/LlamaChatSession.js +18 -7
- package/dist/evaluator/LlamaChatSession/LlamaChatSession.js.map +1 -1
- package/dist/evaluator/LlamaCompletion.d.ts +2 -2
- package/dist/evaluator/LlamaCompletion.js +11 -13
- package/dist/evaluator/LlamaCompletion.js.map +1 -1
- package/dist/evaluator/LlamaContext/LlamaContext.d.ts +6 -11
- package/dist/evaluator/LlamaContext/LlamaContext.js +23 -16
- package/dist/evaluator/LlamaContext/LlamaContext.js.map +1 -1
- package/dist/evaluator/LlamaEmbeddingContext.d.ts +2 -10
- package/dist/evaluator/LlamaEmbeddingContext.js +10 -24
- package/dist/evaluator/LlamaEmbeddingContext.js.map +1 -1
- package/dist/evaluator/LlamaGrammar.d.ts +1 -1
- package/dist/evaluator/LlamaModel.d.ts +23 -3
- package/dist/evaluator/LlamaModel.js +32 -5
- package/dist/evaluator/LlamaModel.js.map +1 -1
- package/dist/evaluator/TokenBias.d.ts +1 -1
- package/dist/evaluator/TokenBias.js +3 -3
- package/dist/evaluator/TokenBias.js.map +1 -1
- package/dist/gguf/insights/GgufInsights.js +12 -12
- package/dist/gguf/insights/GgufInsights.js.map +1 -1
- package/dist/gguf/insights/utils/resolveContextContextSizeOption.js +27 -3
- package/dist/gguf/insights/utils/resolveContextContextSizeOption.js.map +1 -1
- package/dist/gguf/parser/parseGguf.js +5 -0
- package/dist/gguf/parser/parseGguf.js.map +1 -1
- package/dist/gguf/readGgufFileInfo.d.ts +5 -2
- package/dist/gguf/readGgufFileInfo.js +38 -10
- package/dist/gguf/readGgufFileInfo.js.map +1 -1
- package/dist/gguf/types/GgufFileInfoTypes.d.ts +32 -0
- package/dist/gguf/types/GgufFileInfoTypes.js.map +1 -1
- package/dist/gguf/types/GgufMetadataTypes.d.ts +4 -0
- package/dist/gguf/types/GgufMetadataTypes.js.map +1 -1
- package/dist/gguf/utils/getGgufMetadataArchitectureData.js +1 -1
- package/dist/gguf/utils/getGgufMetadataArchitectureData.js.map +1 -1
- package/dist/gguf/utils/resolveBinarySplitGgufPartUrls.d.ts +2 -0
- package/dist/gguf/utils/resolveBinarySplitGgufPartUrls.js +39 -0
- package/dist/gguf/utils/resolveBinarySplitGgufPartUrls.js.map +1 -0
- package/dist/gguf/utils/resolveSplitGgufParts.d.ts +7 -0
- package/dist/gguf/utils/resolveSplitGgufParts.js +55 -0
- package/dist/gguf/utils/resolveSplitGgufParts.js.map +1 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +21 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/LlamaText.d.ts +31 -21
- package/dist/utils/LlamaText.js +253 -223
- package/dist/utils/LlamaText.js.map +1 -1
- package/dist/utils/StopGenerationDetector.d.ts +1 -1
- package/dist/utils/StopGenerationDetector.js +21 -18
- package/dist/utils/StopGenerationDetector.js.map +1 -1
- package/dist/utils/TokenStreamRegulator.d.ts +4 -2
- package/dist/utils/TokenStreamRegulator.js +22 -4
- package/dist/utils/TokenStreamRegulator.js.map +1 -1
- package/dist/utils/createModelDownloader.d.ts +99 -0
- package/dist/utils/createModelDownloader.js +226 -0
- package/dist/utils/createModelDownloader.js.map +1 -0
- package/dist/utils/findCharacterRemovalCountToFitChatHistoryInContext.js +18 -8
- package/dist/utils/findCharacterRemovalCountToFitChatHistoryInContext.js.map +1 -1
- package/dist/utils/getTypeScriptTypeStringForGbnfJsonSchema.js +15 -11
- package/dist/utils/getTypeScriptTypeStringForGbnfJsonSchema.js.map +1 -1
- package/dist/utils/parseTextTemplate.d.ts +2 -2
- package/dist/utils/parseTextTemplate.js +2 -2
- package/dist/utils/runtime.d.ts +4 -0
- package/dist/utils/runtime.js +8 -0
- package/dist/utils/runtime.js.map +1 -0
- package/dist/utils/utilTypes.d.ts +3 -0
- package/dist/utils/utilTypes.js +2 -0
- package/dist/utils/utilTypes.js.map +1 -0
- package/llama/addon.cpp +67 -14
- package/llama/binariesGithubRelease.json +1 -1
- package/llama/gitRelease.bundle +0 -0
- package/llama/grammars/README.md +1 -1
- package/llama/llama.cpp.info.json +1 -1
- package/llamaBins/linux-arm64/_nlcBuildMetadata.json +1 -1
- package/llamaBins/linux-arm64/llama-addon.node +0 -0
- package/llamaBins/linux-armv7l/_nlcBuildMetadata.json +1 -1
- package/llamaBins/linux-armv7l/llama-addon.node +0 -0
- package/llamaBins/linux-x64/_nlcBuildMetadata.json +1 -1
- package/llamaBins/linux-x64/llama-addon.node +0 -0
- package/llamaBins/linux-x64-cuda/_nlcBuildMetadata.json +1 -1
- package/llamaBins/linux-x64-cuda/llama-addon.node +0 -0
- package/llamaBins/linux-x64-vulkan/_nlcBuildMetadata.json +1 -1
- package/llamaBins/linux-x64-vulkan/llama-addon.node +0 -0
- package/llamaBins/mac-arm64-metal/_nlcBuildMetadata.json +1 -1
- package/llamaBins/mac-arm64-metal/default.metallib +0 -0
- package/llamaBins/mac-arm64-metal/llama-addon.node +0 -0
- package/llamaBins/mac-x64/_nlcBuildMetadata.json +1 -1
- package/llamaBins/mac-x64/llama-addon.node +0 -0
- package/llamaBins/win-arm64/_nlcBuildMetadata.json +1 -1
- package/llamaBins/win-arm64/llama-addon.node +0 -0
- package/llamaBins/win-x64/_nlcBuildMetadata.json +1 -1
- package/llamaBins/win-x64/llama-addon.node +0 -0
- package/llamaBins/win-x64-cuda/_nlcBuildMetadata.json +1 -1
- package/llamaBins/win-x64-cuda/llama-addon.node +0 -0
- package/llamaBins/win-x64-vulkan/_nlcBuildMetadata.json +1 -1
- package/llamaBins/win-x64-vulkan/llama-addon.node +0 -0
- package/package.json +9 -5
- package/dist/chatWrappers/LlamaChatWrapper.js.map +0 -1
|
@@ -7,20 +7,20 @@ export class StopGenerationDetector {
|
|
|
7
7
|
const currentActiveChecks = this._activeChecks;
|
|
8
8
|
this._activeChecks = new Set();
|
|
9
9
|
for (const check of currentActiveChecks) {
|
|
10
|
-
let
|
|
10
|
+
let checkKept = false;
|
|
11
11
|
if (text.length > 0)
|
|
12
|
-
|
|
12
|
+
this._checkTriggerPart(check, text);
|
|
13
13
|
else {
|
|
14
14
|
this._activeChecks.add(check);
|
|
15
|
-
|
|
15
|
+
checkKept = true;
|
|
16
16
|
}
|
|
17
17
|
if (tokens.length > 0)
|
|
18
|
-
|
|
18
|
+
this._checkTriggerPart(check, tokens);
|
|
19
19
|
else {
|
|
20
20
|
this._activeChecks.add(check);
|
|
21
|
-
|
|
21
|
+
checkKept = true;
|
|
22
22
|
}
|
|
23
|
-
if (!
|
|
23
|
+
if (!checkKept)
|
|
24
24
|
check.queuedTokenReleaseLock?.dispose();
|
|
25
25
|
}
|
|
26
26
|
if (!startNewChecks)
|
|
@@ -34,9 +34,8 @@ export class StopGenerationDetector {
|
|
|
34
34
|
queuedTokenReleaseLock: queuedTokenRelease?.createTextIndexLock(i),
|
|
35
35
|
currentPart
|
|
36
36
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
textCheck.queuedTokenReleaseLock?.dispose();
|
|
37
|
+
this._checkTriggerPart(textCheck, text.slice(i + 1));
|
|
38
|
+
textCheck.queuedTokenReleaseLock?.dispose();
|
|
40
39
|
}
|
|
41
40
|
for (let i = 0; i < tokens.length; i++) {
|
|
42
41
|
const token = tokens[i];
|
|
@@ -47,9 +46,8 @@ export class StopGenerationDetector {
|
|
|
47
46
|
queuedTokenReleaseLock: queuedTokenRelease?.createTokenIndexLock(i),
|
|
48
47
|
currentPart
|
|
49
48
|
};
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
tokenCheck.queuedTokenReleaseLock?.dispose();
|
|
49
|
+
this._checkTriggerPart(tokenCheck, tokens.slice(i + 1));
|
|
50
|
+
tokenCheck.queuedTokenReleaseLock?.dispose();
|
|
53
51
|
}
|
|
54
52
|
}
|
|
55
53
|
addStopTrigger(stopTrigger, completeEvent) {
|
|
@@ -140,7 +138,7 @@ export class StopGenerationDetector {
|
|
|
140
138
|
for (let i = 0; i < value.length && part != null; i++) {
|
|
141
139
|
const item = value[i];
|
|
142
140
|
if (part.next == null) {
|
|
143
|
-
this._addFoundStop(part, value.slice(i), check.queuedTokenReleaseLock);
|
|
141
|
+
this._addFoundStop(part, value.slice(i), check.queuedTokenReleaseLock?.duplicate?.());
|
|
144
142
|
return true;
|
|
145
143
|
}
|
|
146
144
|
if (part.next.has(item)) {
|
|
@@ -152,24 +150,29 @@ export class StopGenerationDetector {
|
|
|
152
150
|
if (part == null)
|
|
153
151
|
return false;
|
|
154
152
|
if (part.next == null) {
|
|
155
|
-
this._addFoundStop(part, undefined, check.queuedTokenReleaseLock);
|
|
153
|
+
this._addFoundStop(part, undefined, check.queuedTokenReleaseLock?.duplicate?.());
|
|
156
154
|
return true;
|
|
157
155
|
}
|
|
158
156
|
else {
|
|
159
157
|
this._activeChecks.add({
|
|
160
158
|
...check,
|
|
161
|
-
currentPart: part
|
|
159
|
+
currentPart: part,
|
|
160
|
+
queuedTokenReleaseLock: check.queuedTokenReleaseLock?.duplicate?.()
|
|
162
161
|
});
|
|
163
162
|
return true;
|
|
164
163
|
}
|
|
165
164
|
}
|
|
166
165
|
static resolveStopTriggers(stopTriggers, tokenizer) {
|
|
167
|
-
return stopTriggers
|
|
166
|
+
return stopTriggers
|
|
167
|
+
.map((stopTrigger) => {
|
|
168
168
|
if (isLlamaText(stopTrigger))
|
|
169
169
|
return StopGenerationDetector.resolveLlamaTextTrigger(stopTrigger, tokenizer);
|
|
170
|
+
else if (typeof stopTrigger === "string")
|
|
171
|
+
return simplifyStopTrigger([stopTrigger]);
|
|
170
172
|
else
|
|
171
173
|
return simplifyStopTrigger(stopTrigger);
|
|
172
|
-
})
|
|
174
|
+
})
|
|
175
|
+
.filter((stopTrigger) => stopTrigger.length > 0);
|
|
173
176
|
}
|
|
174
177
|
static resolveLlamaTextTrigger(llamaText, tokenizer) {
|
|
175
178
|
return simplifyStopTrigger(llamaText.values
|
|
@@ -180,7 +183,7 @@ export class StopGenerationDetector {
|
|
|
180
183
|
else if (value instanceof SpecialToken)
|
|
181
184
|
return value.tokenize(tokenizer);
|
|
182
185
|
else if (value instanceof SpecialTokensText)
|
|
183
|
-
return value.
|
|
186
|
+
return value.tokenizeSpecialTokensOnly(tokenizer);
|
|
184
187
|
return value;
|
|
185
188
|
})
|
|
186
189
|
.flat(1));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StopGenerationDetector.js","sourceRoot":"","sources":["../../src/utils/StopGenerationDetector.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAE,WAAW,EAAa,iBAAiB,EAAC,MAAM,gBAAgB,CAAC;AAKvF,MAAM,OAAO,sBAAsB;IAC/B,gBAAgB,CAAS,aAAa,GAAG,IAAI,GAAG,EAAkC,CAAC;IACnF,gBAAgB,CAAS,aAAa,GAAG,IAAI,GAAG,EAAmB,CAAC;IACpE,gBAAgB,CAAS,eAAe,GAAG,IAAI,GAAG,EAG9C,CAAC;IAEE,gBAAgB,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,cAAc,GAAG,IAAI,EAE/E;QACG,MAAM,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAE/B,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE;YACrC,IAAI,
|
|
1
|
+
{"version":3,"file":"StopGenerationDetector.js","sourceRoot":"","sources":["../../src/utils/StopGenerationDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,19 +12,21 @@ export declare class TokenStreamRegulator {
|
|
|
12
12
|
getAllQueuedChunkTokens(): Token[];
|
|
13
13
|
}
|
|
14
14
|
export declare class QueuedTokenRelease {
|
|
15
|
-
readonly tokens: readonly Token[];
|
|
16
|
-
readonly text: string;
|
|
17
15
|
private constructor();
|
|
16
|
+
get tokens(): readonly Token[];
|
|
17
|
+
get text(): string;
|
|
18
18
|
get isFree(): boolean;
|
|
19
19
|
get isPartiallyFree(): boolean;
|
|
20
20
|
getFreeTextIndex(): number;
|
|
21
21
|
getFreeTokenIndex(): number;
|
|
22
22
|
createTextIndexLock(startIndex: number): QueuedTokenReleaseLock;
|
|
23
23
|
createTokenIndexLock(startIndex: number): QueuedTokenReleaseLock;
|
|
24
|
+
modifyTokensAndText(tokens: readonly Token[], text: string): void;
|
|
24
25
|
}
|
|
25
26
|
export declare class QueuedTokenReleaseLock {
|
|
26
27
|
private constructor();
|
|
27
28
|
get index(): number;
|
|
29
|
+
duplicate(): QueuedTokenReleaseLock;
|
|
28
30
|
dispose(): void;
|
|
29
31
|
[Symbol.dispose](): void;
|
|
30
32
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DisposedError } from "lifecycle-utils";
|
|
1
2
|
export class TokenStreamRegulator {
|
|
2
3
|
/** @internal */ _queue = [];
|
|
3
4
|
addChunk({ tokens, text }) {
|
|
@@ -31,11 +32,17 @@ export class TokenStreamRegulator {
|
|
|
31
32
|
export class QueuedTokenRelease {
|
|
32
33
|
/** @internal */ _textLocks = new Set();
|
|
33
34
|
/** @internal */ _tokenLocks = new Set();
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
/** @internal */ _tokens;
|
|
36
|
+
/** @internal */ _text;
|
|
36
37
|
constructor(tokens, text) {
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
38
|
+
this._tokens = tokens;
|
|
39
|
+
this._text = text;
|
|
40
|
+
}
|
|
41
|
+
get tokens() {
|
|
42
|
+
return this._tokens;
|
|
43
|
+
}
|
|
44
|
+
get text() {
|
|
45
|
+
return this._text;
|
|
39
46
|
}
|
|
40
47
|
get isFree() {
|
|
41
48
|
return this._textLocks.size === 0 && this._tokenLocks.size === 0;
|
|
@@ -67,6 +74,10 @@ export class QueuedTokenRelease {
|
|
|
67
74
|
this._tokenLocks.add(lock);
|
|
68
75
|
return lock;
|
|
69
76
|
}
|
|
77
|
+
modifyTokensAndText(tokens, text) {
|
|
78
|
+
this._tokens = tokens;
|
|
79
|
+
this._text = text;
|
|
80
|
+
}
|
|
70
81
|
/** @internal */
|
|
71
82
|
static _create(tokens, text) {
|
|
72
83
|
return new QueuedTokenRelease(tokens, text);
|
|
@@ -82,6 +93,13 @@ export class QueuedTokenReleaseLock {
|
|
|
82
93
|
get index() {
|
|
83
94
|
return this._index;
|
|
84
95
|
}
|
|
96
|
+
duplicate() {
|
|
97
|
+
if (!this._locks.has(this))
|
|
98
|
+
throw new DisposedError();
|
|
99
|
+
const lock = QueuedTokenReleaseLock._create(this._index, this._locks);
|
|
100
|
+
this._locks.add(lock);
|
|
101
|
+
return lock;
|
|
102
|
+
}
|
|
85
103
|
dispose() {
|
|
86
104
|
this._locks.delete(this);
|
|
87
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenStreamRegulator.js","sourceRoot":"","sources":["../../src/utils/TokenStreamRegulator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TokenStreamRegulator.js","sourceRoot":"","sources":["../../src/utils/TokenStreamRegulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export type ModelDownloaderOptions = {
|
|
3
|
+
modelUrl: string;
|
|
4
|
+
/**
|
|
5
|
+
* The directory to save the model file to.
|
|
6
|
+
* Default to `node-llama-cpp`'s default global models directory (`~/.node-llama-cpp/models`).
|
|
7
|
+
*/
|
|
8
|
+
dirPath?: string;
|
|
9
|
+
fileName?: string;
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
showCliProgress?: boolean;
|
|
12
|
+
onProgress?: (status: {
|
|
13
|
+
totalSize: number;
|
|
14
|
+
downloadedSize: number;
|
|
15
|
+
}) => void;
|
|
16
|
+
/**
|
|
17
|
+
* If true, the downloader will skip the download if the file already exists, and its size matches the size of the remote file.
|
|
18
|
+
*
|
|
19
|
+
* Defaults to `true`.
|
|
20
|
+
*/
|
|
21
|
+
skipExisting?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* If true, the temporary file will be deleted when the download is canceled.
|
|
24
|
+
*
|
|
25
|
+
* Defaults to `true`.
|
|
26
|
+
*/
|
|
27
|
+
deleteTempFileOnCancel?: boolean;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Create a model downloader to download a model from a URL.
|
|
31
|
+
* Uses [`ipull`](https://github.com/ido-pluto/ipull) to download a model file as fast as possible with parallel connections
|
|
32
|
+
* and other optimizations.
|
|
33
|
+
*
|
|
34
|
+
* If the url points to a `.gguf` file that is split into multiple parts (for example, `model-00001-of-00009.gguf`),
|
|
35
|
+
* all the parts will be downloaded to the specified directory.
|
|
36
|
+
*
|
|
37
|
+
* If the url points to a `.gguf` file that is binary spliced into multiple parts (for example, `model.gguf.part1of9`),
|
|
38
|
+
* all the parts will be spliced into a single file and be downloaded to the specified directory.
|
|
39
|
+
*
|
|
40
|
+
* If the url points to a `.gguf` file that is not split or binary spliced (for example, `model.gguf`),
|
|
41
|
+
* the file will be downloaded to the specified directory.
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* import {fileURLToPath} from "url";
|
|
45
|
+
* import path from "path";
|
|
46
|
+
* import {createModelDownloader, getLlama} from "node-llama-cpp";
|
|
47
|
+
*
|
|
48
|
+
* const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
49
|
+
*
|
|
50
|
+
* const downloader = await createModelDownloader({
|
|
51
|
+
* modelUrl: "https://example.com/model.gguf",
|
|
52
|
+
* dirPath: path.join(__dirname, "models")
|
|
53
|
+
* });
|
|
54
|
+
* const modelPath = await downloader.download();
|
|
55
|
+
*
|
|
56
|
+
* const llama = await getLlama();
|
|
57
|
+
* const model = llama.loadModel({
|
|
58
|
+
* modelPath
|
|
59
|
+
* });
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare function createModelDownloader(options: ModelDownloaderOptions): Promise<ModelDownloader>;
|
|
63
|
+
export declare class ModelDownloader {
|
|
64
|
+
private constructor();
|
|
65
|
+
/**
|
|
66
|
+
* The filename of the entrypoint file that should be used to load the model.
|
|
67
|
+
*/
|
|
68
|
+
get entrypointFilename(): string;
|
|
69
|
+
/**
|
|
70
|
+
* The full path to the entrypoint file that should be used to load the model.
|
|
71
|
+
*/
|
|
72
|
+
get entrypointFilePath(): string;
|
|
73
|
+
/**
|
|
74
|
+
* If the model is binary spliced from multiple parts, this will return the number of those binary parts.
|
|
75
|
+
*/
|
|
76
|
+
get splitBinaryParts(): number | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* The total number of files that will be saved to the directory.
|
|
79
|
+
* For split files, this will be the number of split parts, as multiple files will be saved.
|
|
80
|
+
* For binary-split files, this will be 1, as the parts will be spliced into a single file.
|
|
81
|
+
*/
|
|
82
|
+
get totalFiles(): number;
|
|
83
|
+
get totalSize(): number;
|
|
84
|
+
get downloadedSize(): number;
|
|
85
|
+
/**
|
|
86
|
+
* @returns The path to the entrypoint file that should be used to load the model
|
|
87
|
+
*/
|
|
88
|
+
download({ signal }?: {
|
|
89
|
+
signal?: AbortSignal;
|
|
90
|
+
}): Promise<string>;
|
|
91
|
+
cancel({ deleteTempFile }?: {
|
|
92
|
+
/**
|
|
93
|
+
* Delete the temporary file that was created during the download.
|
|
94
|
+
*
|
|
95
|
+
* Defaults to the value of `deleteTempFileOnCancel` in the constructor.
|
|
96
|
+
*/
|
|
97
|
+
deleteTempFile?: boolean;
|
|
98
|
+
}): Promise<void>;
|
|
99
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import process from "process";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { downloadFile, downloadSequence } from "ipull";
|
|
4
|
+
import fs from "fs-extra";
|
|
5
|
+
import { normalizeGgufDownloadUrl } from "../gguf/utils/normalizeGgufDownloadUrl.js";
|
|
6
|
+
import { createSplitPartFilename, resolveSplitGgufParts } from "../gguf/utils/resolveSplitGgufParts.js";
|
|
7
|
+
import { getFilenameForBinarySplitGgufPartUrls, resolveBinarySplitGgufPartUrls } from "../gguf/utils/resolveBinarySplitGgufPartUrls.js";
|
|
8
|
+
import { cliModelsDirectory } from "../config.js";
|
|
9
|
+
/**
|
|
10
|
+
* Create a model downloader to download a model from a URL.
|
|
11
|
+
* Uses [`ipull`](https://github.com/ido-pluto/ipull) to download a model file as fast as possible with parallel connections
|
|
12
|
+
* and other optimizations.
|
|
13
|
+
*
|
|
14
|
+
* If the url points to a `.gguf` file that is split into multiple parts (for example, `model-00001-of-00009.gguf`),
|
|
15
|
+
* all the parts will be downloaded to the specified directory.
|
|
16
|
+
*
|
|
17
|
+
* If the url points to a `.gguf` file that is binary spliced into multiple parts (for example, `model.gguf.part1of9`),
|
|
18
|
+
* all the parts will be spliced into a single file and be downloaded to the specified directory.
|
|
19
|
+
*
|
|
20
|
+
* If the url points to a `.gguf` file that is not split or binary spliced (for example, `model.gguf`),
|
|
21
|
+
* the file will be downloaded to the specified directory.
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* import {fileURLToPath} from "url";
|
|
25
|
+
* import path from "path";
|
|
26
|
+
* import {createModelDownloader, getLlama} from "node-llama-cpp";
|
|
27
|
+
*
|
|
28
|
+
* const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
29
|
+
*
|
|
30
|
+
* const downloader = await createModelDownloader({
|
|
31
|
+
* modelUrl: "https://example.com/model.gguf",
|
|
32
|
+
* dirPath: path.join(__dirname, "models")
|
|
33
|
+
* });
|
|
34
|
+
* const modelPath = await downloader.download();
|
|
35
|
+
*
|
|
36
|
+
* const llama = await getLlama();
|
|
37
|
+
* const model = llama.loadModel({
|
|
38
|
+
* modelPath
|
|
39
|
+
* });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export async function createModelDownloader(options) {
|
|
43
|
+
const downloader = ModelDownloader._create(options);
|
|
44
|
+
await downloader._init();
|
|
45
|
+
return downloader;
|
|
46
|
+
}
|
|
47
|
+
export class ModelDownloader {
|
|
48
|
+
/** @internal */ _modelUrl;
|
|
49
|
+
/** @internal */ _dirPath;
|
|
50
|
+
/** @internal */ _fileName;
|
|
51
|
+
/** @internal */ _headers;
|
|
52
|
+
/** @internal */ _showCliProgress;
|
|
53
|
+
/** @internal */ _onProgress;
|
|
54
|
+
/** @internal */ _deleteTempFileOnCancel;
|
|
55
|
+
/** @internal */ _skipExisting;
|
|
56
|
+
/** @internal */ _downloader;
|
|
57
|
+
/** @internal */ _specificFileDownloaders = [];
|
|
58
|
+
/** @internal */ _entrypointFilename;
|
|
59
|
+
/** @internal */ _splitBinaryParts;
|
|
60
|
+
/** @internal */ _totalFiles;
|
|
61
|
+
constructor({ modelUrl, dirPath = cliModelsDirectory, fileName, headers, showCliProgress = false, onProgress, deleteTempFileOnCancel = true, skipExisting = true }) {
|
|
62
|
+
if (modelUrl == null || dirPath == null)
|
|
63
|
+
throw new Error("modelUrl and dirPath cannot be null");
|
|
64
|
+
this._modelUrl = normalizeGgufDownloadUrl(modelUrl);
|
|
65
|
+
this._dirPath = path.resolve(process.cwd(), dirPath);
|
|
66
|
+
this._fileName = fileName;
|
|
67
|
+
this._headers = headers;
|
|
68
|
+
this._showCliProgress = showCliProgress;
|
|
69
|
+
this._onProgress = onProgress;
|
|
70
|
+
this._deleteTempFileOnCancel = deleteTempFileOnCancel;
|
|
71
|
+
this._skipExisting = skipExisting;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The filename of the entrypoint file that should be used to load the model.
|
|
75
|
+
*/
|
|
76
|
+
get entrypointFilename() {
|
|
77
|
+
return this._entrypointFilename;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The full path to the entrypoint file that should be used to load the model.
|
|
81
|
+
*/
|
|
82
|
+
get entrypointFilePath() {
|
|
83
|
+
return path.join(this._dirPath, this.entrypointFilename);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* If the model is binary spliced from multiple parts, this will return the number of those binary parts.
|
|
87
|
+
*/
|
|
88
|
+
get splitBinaryParts() {
|
|
89
|
+
return this._splitBinaryParts;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The total number of files that will be saved to the directory.
|
|
93
|
+
* For split files, this will be the number of split parts, as multiple files will be saved.
|
|
94
|
+
* For binary-split files, this will be 1, as the parts will be spliced into a single file.
|
|
95
|
+
*/
|
|
96
|
+
get totalFiles() {
|
|
97
|
+
return this._totalFiles;
|
|
98
|
+
}
|
|
99
|
+
get totalSize() {
|
|
100
|
+
return this._downloader.downloadStatues
|
|
101
|
+
.map(status => status.totalBytes)
|
|
102
|
+
.reduce((acc, totalBytes) => acc + totalBytes, 0);
|
|
103
|
+
}
|
|
104
|
+
get downloadedSize() {
|
|
105
|
+
return this._downloader.downloadStatues
|
|
106
|
+
.map(status => status.transferredBytes)
|
|
107
|
+
.reduce((acc, transferredBytes) => acc + transferredBytes, 0);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* @returns The path to the entrypoint file that should be used to load the model
|
|
111
|
+
*/
|
|
112
|
+
async download({ signal } = {}) {
|
|
113
|
+
if (signal?.aborted)
|
|
114
|
+
throw signal.reason;
|
|
115
|
+
if (this._skipExisting) {
|
|
116
|
+
if (this._specificFileDownloaders.length === 1 && await fs.pathExists(this.entrypointFilePath)) {
|
|
117
|
+
const fileStat = await fs.stat(this.entrypointFilePath);
|
|
118
|
+
if (this._specificFileDownloaders[0].status.totalBytes === fileStat.size)
|
|
119
|
+
return this.entrypointFilePath;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// TODO: skip existing split files
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const onAbort = () => {
|
|
126
|
+
signal?.removeEventListener("abort", onAbort);
|
|
127
|
+
this.cancel();
|
|
128
|
+
};
|
|
129
|
+
if (signal != null)
|
|
130
|
+
signal.addEventListener("abort", onAbort);
|
|
131
|
+
try {
|
|
132
|
+
if (this._onProgress)
|
|
133
|
+
this._downloader.on("progress", this._onDownloadProgress);
|
|
134
|
+
await this._downloader.download();
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
if (signal?.aborted)
|
|
138
|
+
throw signal.reason;
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
if (this._onProgress)
|
|
143
|
+
this._downloader.off("progress", this._onDownloadProgress);
|
|
144
|
+
if (signal != null)
|
|
145
|
+
signal.removeEventListener("abort", onAbort);
|
|
146
|
+
}
|
|
147
|
+
return this.entrypointFilePath;
|
|
148
|
+
}
|
|
149
|
+
async cancel({ deleteTempFile = this._deleteTempFileOnCancel } = {}) {
|
|
150
|
+
for (const downloader of this._specificFileDownloaders) {
|
|
151
|
+
if (deleteTempFile)
|
|
152
|
+
await downloader.closeAndDeleteFile();
|
|
153
|
+
else
|
|
154
|
+
await downloader.close();
|
|
155
|
+
}
|
|
156
|
+
if (this._downloader !== this._specificFileDownloaders[0])
|
|
157
|
+
await this._downloader?.close();
|
|
158
|
+
}
|
|
159
|
+
/** @internal */
|
|
160
|
+
_onDownloadProgress() {
|
|
161
|
+
this._onProgress?.({
|
|
162
|
+
totalSize: this.totalSize,
|
|
163
|
+
downloadedSize: this.downloadedSize
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/** @internal */
|
|
167
|
+
async _init() {
|
|
168
|
+
const binarySplitPartUrls = resolveBinarySplitGgufPartUrls(this._modelUrl);
|
|
169
|
+
await fs.ensureDir(this._dirPath);
|
|
170
|
+
if (binarySplitPartUrls instanceof Array) {
|
|
171
|
+
this._downloader = await downloadFile({
|
|
172
|
+
partURLs: binarySplitPartUrls,
|
|
173
|
+
directory: this._dirPath,
|
|
174
|
+
fileName: this._fileName ?? getFilenameForBinarySplitGgufPartUrls(binarySplitPartUrls),
|
|
175
|
+
cliProgress: this._showCliProgress,
|
|
176
|
+
headers: this._headers ?? {}
|
|
177
|
+
});
|
|
178
|
+
this._specificFileDownloaders.push(this._downloader);
|
|
179
|
+
this._entrypointFilename = this._downloader.fileName;
|
|
180
|
+
this._splitBinaryParts = binarySplitPartUrls.length;
|
|
181
|
+
this._totalFiles = 1;
|
|
182
|
+
if (this._downloader.fileName == null || this._downloader.fileName === "")
|
|
183
|
+
throw new Error("Failed to get the file name from the given URL");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const splitGgufPartUrls = resolveSplitGgufParts(this._modelUrl);
|
|
187
|
+
if (splitGgufPartUrls.length === 1) {
|
|
188
|
+
this._downloader = await downloadFile({
|
|
189
|
+
url: splitGgufPartUrls[0],
|
|
190
|
+
directory: this._dirPath,
|
|
191
|
+
fileName: this._fileName ?? undefined,
|
|
192
|
+
cliProgress: this._showCliProgress,
|
|
193
|
+
headers: this._headers ?? {}
|
|
194
|
+
});
|
|
195
|
+
this._specificFileDownloaders.push(this._downloader);
|
|
196
|
+
this._entrypointFilename = this._downloader.fileName;
|
|
197
|
+
this._totalFiles = 1;
|
|
198
|
+
if (this._downloader.fileName == null || this._downloader.fileName === "")
|
|
199
|
+
throw new Error("Failed to get the file name from the given URL");
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const partDownloads = splitGgufPartUrls.map((url, index) => downloadFile({
|
|
203
|
+
url,
|
|
204
|
+
directory: this._dirPath,
|
|
205
|
+
fileName: this._fileName != null
|
|
206
|
+
? createSplitPartFilename(this._fileName, index + 1, splitGgufPartUrls.length)
|
|
207
|
+
: undefined,
|
|
208
|
+
headers: this._headers ?? {}
|
|
209
|
+
}));
|
|
210
|
+
this._downloader = await downloadSequence({
|
|
211
|
+
cliProgress: this._showCliProgress
|
|
212
|
+
}, ...partDownloads);
|
|
213
|
+
const firstDownload = await partDownloads[0];
|
|
214
|
+
this._specificFileDownloaders = await Promise.all(partDownloads);
|
|
215
|
+
this._entrypointFilename = firstDownload.fileName;
|
|
216
|
+
this._totalFiles = partDownloads.length;
|
|
217
|
+
if (this._entrypointFilename == null || this._entrypointFilename === "")
|
|
218
|
+
throw new Error("Failed to get the file name from the given URL");
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
/** @internal */
|
|
222
|
+
static _create(options) {
|
|
223
|
+
return new ModelDownloader(options);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=createModelDownloader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createModelDownloader.js","sourceRoot":"","sources":["../../src/utils/createModelDownloader.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,15 +29,18 @@ export async function findCharacterRemovalCountToFitChatHistoryInContext({ compr
|
|
|
29
29
|
removedCharactersCount: initialCharactersRemovalCount,
|
|
30
30
|
compressedChatHistory: latestCompressionAttempt.compressedHistory
|
|
31
31
|
};
|
|
32
|
-
|
|
32
|
+
let bestCompressionAttempt = latestCompressionAttempt;
|
|
33
|
+
for (let compressionAttempts = 0, decompressionAttempts = 0; bestCompressionAttempt.tokensCount !== tokensCountToFit;) {
|
|
33
34
|
if (compressionAttempts > 0) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
if (latestCompressionAttempt.tokensCount != firstCompressionAttempt.tokensCount &&
|
|
36
|
+
latestCompressionAttempt.characterRemovalCount != firstCompressionAttempt.characterRemovalCount)
|
|
37
|
+
currentEstimatedCharactersPerToken =
|
|
38
|
+
Math.abs(latestCompressionAttempt.characterRemovalCount - firstCompressionAttempt.characterRemovalCount) /
|
|
39
|
+
Math.abs(latestCompressionAttempt.tokensCount - firstCompressionAttempt.tokensCount);
|
|
40
|
+
if (!Number.isFinite(currentEstimatedCharactersPerToken) || currentEstimatedCharactersPerToken === 0)
|
|
38
41
|
currentEstimatedCharactersPerToken = estimatedCharactersPerToken;
|
|
39
42
|
}
|
|
40
|
-
const tokensLeftToRemove =
|
|
43
|
+
const tokensLeftToRemove = latestCompressionAttempt.tokensCount - tokensCountToFit;
|
|
41
44
|
let additionalCharactersToRemove = Math.round(tokensLeftToRemove * currentEstimatedCharactersPerToken);
|
|
42
45
|
if (additionalCharactersToRemove === 0) {
|
|
43
46
|
if (tokensLeftToRemove > 0)
|
|
@@ -52,10 +55,17 @@ export async function findCharacterRemovalCountToFitChatHistoryInContext({ compr
|
|
|
52
55
|
if (decompressionAttempts >= maxDecompressionAttempts)
|
|
53
56
|
break;
|
|
54
57
|
latestCompressionAttempt = await getResultForCharacterRemovalCount(latestCompressionAttempt.characterRemovalCount + additionalCharactersToRemove);
|
|
58
|
+
if ((bestCompressionAttempt.tokensCount > tokensCountToFit &&
|
|
59
|
+
latestCompressionAttempt.tokensCount <= bestCompressionAttempt.tokensCount) || (bestCompressionAttempt.tokensCount < tokensCountToFit &&
|
|
60
|
+
latestCompressionAttempt.tokensCount < tokensCountToFit &&
|
|
61
|
+
latestCompressionAttempt.tokensCount > bestCompressionAttempt.tokensCount) || (bestCompressionAttempt.tokensCount <= tokensCountToFit &&
|
|
62
|
+
latestCompressionAttempt.tokensCount <= tokensCountToFit &&
|
|
63
|
+
latestCompressionAttempt.characterRemovalCount < bestCompressionAttempt.characterRemovalCount))
|
|
64
|
+
bestCompressionAttempt = latestCompressionAttempt;
|
|
55
65
|
}
|
|
56
66
|
return {
|
|
57
|
-
removedCharactersCount:
|
|
58
|
-
compressedChatHistory:
|
|
67
|
+
removedCharactersCount: bestCompressionAttempt.characterRemovalCount,
|
|
68
|
+
compressedChatHistory: bestCompressionAttempt.compressedHistory
|
|
59
69
|
};
|
|
60
70
|
}
|
|
61
71
|
//# sourceMappingURL=findCharacterRemovalCountToFitChatHistoryInContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findCharacterRemovalCountToFitChatHistoryInContext.js","sourceRoot":"","sources":["../../src/utils/findCharacterRemovalCountToFitChatHistoryInContext.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,kDAAkD,CAAC,EACrE,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,6BAA6B,GAAG,CAAC,EACjC,2BAA2B,GAAG,CAAC,EAC/B,wBAAwB,GAAG,CAAC,EAY/B;IAIG,SAAS,4BAA4B,CAAC,WAAuC;QACzE,MAAM,EAAC,WAAW,EAAC,GAAG,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACnE,OAAO,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAClD,CAAC;IAED,KAAK,UAAU,iCAAiC,CAAC,qBAA6B;QAC1E,IAAI,qBAAqB,KAAK,CAAC;YAC3B,OAAO;gBACH,iBAAiB,EAAE,WAAW;gBAC9B,WAAW,EAAE,4BAA4B,CAAC,WAAW,CAAC;gBACtD,qBAAqB;aACxB,CAAC;QAEN,MAAM,iBAAiB,GAAG,MAAM,mBAAmB,CAAC;YAChD,WAAW;YACX,kBAAkB,EAAE,qBAAqB;SAC5C,CAAC,CAAC;QAEH,OAAO;YACH,iBAAiB;YACjB,WAAW,EAAE,4BAA4B,CAAC,iBAAiB,CAAC;YAC5D,qBAAqB;SACxB,CAAC;IACN,CAAC;IAED,IAAI,wBAAwB,GAAG,MAAM,iCAAiC,CAAC,6BAA6B,CAAC,CAAC;IACtG,MAAM,uBAAuB,GAAG,wBAAwB,CAAC;IACzD,IAAI,kCAAkC,GAAG,2BAA2B,CAAC;IAErE,IAAI,wBAAwB,CAAC,WAAW,KAAK,gBAAgB;QACzD,CAAC,wBAAwB,CAAC,WAAW,GAAG,gBAAgB,IAAI,wBAAwB,CAAC,qBAAqB,KAAK,CAAC,CAAC;QAEjH,OAAO;YACH,sBAAsB,EAAE,6BAA6B;YACrD,qBAAqB,EAAE,wBAAwB,CAAC,iBAAiB;SACpE,CAAC;IAEN,KACI,IAAI,mBAAmB,GAAG,CAAC,EAAE,qBAAqB,GAAG,CAAC,EACtD,
|
|
1
|
+
{"version":3,"file":"findCharacterRemovalCountToFitChatHistoryInContext.js","sourceRoot":"","sources":["../../src/utils/findCharacterRemovalCountToFitChatHistoryInContext.ts"],"names":[],"mappings":"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"}
|