@llm4ts/core 2.54.0 → 3.0.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 +1 -1
- package/dist/Capability.d.ts +0 -9
- package/dist/Capability.d.ts.map +1 -1
- package/dist/Capability.js +0 -38
- package/dist/Capability.js.map +1 -1
- package/dist/Connector.d.ts +2 -3
- package/dist/Connector.d.ts.map +1 -1
- package/dist/Connector.js +0 -5
- package/dist/Connector.js.map +1 -1
- package/dist/ConnectorRegistry.d.ts +0 -3
- package/dist/ConnectorRegistry.d.ts.map +1 -1
- package/dist/ConnectorRegistry.js +0 -3
- package/dist/ConnectorRegistry.js.map +1 -1
- package/dist/HttpClient.d.ts +0 -2
- package/dist/HttpClient.d.ts.map +1 -1
- package/dist/HttpClient.js +0 -2
- package/dist/HttpClient.js.map +1 -1
- package/dist/LlmService.d.ts +1 -2
- package/dist/LlmService.d.ts.map +1 -1
- package/dist/LlmService.js.map +1 -1
- package/dist/Models.d.ts +0 -21
- package/dist/Models.d.ts.map +1 -1
- package/dist/Models.js +0 -19
- package/dist/Models.js.map +1 -1
- package/dist/Streaming.d.ts +4 -11
- package/dist/Streaming.d.ts.map +1 -1
- package/dist/Streaming.js +2 -29
- package/dist/Streaming.js.map +1 -1
- package/dist/providers/AnthropicModels.d.ts +0 -43
- package/dist/providers/AnthropicModels.d.ts.map +1 -1
- package/dist/providers/AnthropicModels.js +0 -39
- package/dist/providers/AnthropicModels.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +2 -3
- package/dist/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/AnthropicProvider.js +2 -49
- package/dist/providers/AnthropicProvider.js.map +1 -1
- package/dist/providers/GeminiApiProvider.d.ts +2 -3
- package/dist/providers/GeminiApiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiApiProvider.js +2 -44
- package/dist/providers/GeminiApiProvider.js.map +1 -1
- package/dist/providers/GeminiModels.d.ts +0 -48
- package/dist/providers/GeminiModels.d.ts.map +1 -1
- package/dist/providers/GeminiModels.js +0 -40
- package/dist/providers/GeminiModels.js.map +1 -1
- package/dist/providers/LmStudioProvider.d.ts.map +1 -1
- package/dist/providers/LmStudioProvider.js +1 -4
- package/dist/providers/LmStudioProvider.js.map +1 -1
- package/dist/providers/MlxLmProvider.d.ts.map +1 -1
- package/dist/providers/MlxLmProvider.js +1 -2
- package/dist/providers/MlxLmProvider.js.map +1 -1
- package/dist/providers/MockProvider.d.ts.map +1 -1
- package/dist/providers/MockProvider.js +1 -6
- package/dist/providers/MockProvider.js.map +1 -1
- package/dist/providers/OllamaProvider.d.ts.map +1 -1
- package/dist/providers/OllamaProvider.js +1 -4
- package/dist/providers/OllamaProvider.js.map +1 -1
- package/dist/providers/OpenAIModels.d.ts +0 -58
- package/dist/providers/OpenAIModels.d.ts.map +1 -1
- package/dist/providers/OpenAIModels.js +0 -51
- package/dist/providers/OpenAIModels.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +2 -3
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +2 -46
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/package.json +2 -14
- package/src/Capability.ts +0 -50
- package/src/Connector.ts +2 -20
- package/src/ConnectorRegistry.ts +0 -15
- package/src/HttpClient.ts +0 -15
- package/src/LlmService.ts +1 -13
- package/src/Models.ts +0 -22
- package/src/Streaming.ts +3 -99
- package/src/providers/AnthropicModels.ts +0 -47
- package/src/providers/AnthropicProvider.ts +1 -87
- package/src/providers/GeminiApiProvider.ts +2 -83
- package/src/providers/GeminiModels.ts +0 -46
- package/src/providers/LmStudioProvider.ts +1 -7
- package/src/providers/MlxLmProvider.ts +1 -3
- package/src/providers/MockProvider.ts +0 -9
- package/src/providers/OllamaProvider.ts +1 -7
- package/src/providers/OpenAIModels.ts +0 -64
- package/src/providers/OpenAIProvider.ts +2 -83
- package/dist/ContextManagement.d.ts +0 -78
- package/dist/ContextManagement.d.ts.map +0 -1
- package/dist/ContextManagement.js +0 -222
- package/dist/ContextManagement.js.map +0 -1
- package/dist/Conversation.d.ts +0 -18
- package/dist/Conversation.d.ts.map +0 -1
- package/dist/Conversation.js +0 -17
- package/dist/Conversation.js.map +0 -1
- package/dist/RateLimiter.d.ts +0 -44
- package/dist/RateLimiter.d.ts.map +0 -1
- package/dist/RateLimiter.js +0 -155
- package/dist/RateLimiter.js.map +0 -1
- package/dist/observability/MeteredLlmService.d.ts +0 -16
- package/dist/observability/MeteredLlmService.d.ts.map +0 -1
- package/dist/observability/MeteredLlmService.js +0 -72
- package/dist/observability/MeteredLlmService.js.map +0 -1
- package/dist/observability/Metrics.d.ts +0 -76
- package/dist/observability/Metrics.d.ts.map +0 -1
- package/dist/observability/Metrics.js +0 -152
- package/dist/observability/Metrics.js.map +0 -1
- package/dist/observability/StructuredLogger.d.ts +0 -31
- package/dist/observability/StructuredLogger.d.ts.map +0 -1
- package/dist/observability/StructuredLogger.js +0 -39
- package/dist/observability/StructuredLogger.js.map +0 -1
- package/dist/observability/Tracing.d.ts +0 -38
- package/dist/observability/Tracing.d.ts.map +0 -1
- package/dist/observability/Tracing.js +0 -80
- package/dist/observability/Tracing.js.map +0 -1
- package/dist/providers/OpenCodeModels.d.ts +0 -61
- package/dist/providers/OpenCodeModels.d.ts.map +0 -1
- package/dist/providers/OpenCodeModels.js +0 -53
- package/dist/providers/OpenCodeModels.js.map +0 -1
- package/dist/providers/OpenCodeProvider.d.ts +0 -10
- package/dist/providers/OpenCodeProvider.d.ts.map +0 -1
- package/dist/providers/OpenCodeProvider.js +0 -154
- package/dist/providers/OpenCodeProvider.js.map +0 -1
- package/dist/tools/Tool.d.ts +0 -83
- package/dist/tools/Tool.d.ts.map +0 -1
- package/dist/tools/Tool.js +0 -278
- package/dist/tools/Tool.js.map +0 -1
- package/dist/tools/ToolCallingExecutor.d.ts +0 -18
- package/dist/tools/ToolCallingExecutor.d.ts.map +0 -1
- package/dist/tools/ToolCallingExecutor.js +0 -64
- package/dist/tools/ToolCallingExecutor.js.map +0 -1
- package/dist/tools/ToolRegistry.d.ts +0 -45
- package/dist/tools/ToolRegistry.d.ts.map +0 -1
- package/dist/tools/ToolRegistry.js +0 -133
- package/dist/tools/ToolRegistry.js.map +0 -1
- package/src/ContextManagement.ts +0 -367
- package/src/Conversation.ts +0 -21
- package/src/RateLimiter.ts +0 -238
- package/src/observability/MeteredLlmService.ts +0 -168
- package/src/observability/Metrics.ts +0 -200
- package/src/observability/StructuredLogger.ts +0 -67
- package/src/observability/Tracing.ts +0 -146
- package/src/providers/OpenCodeModels.ts +0 -60
- package/src/providers/OpenCodeProvider.ts +0 -278
- package/src/tools/Tool.ts +0 -376
- package/src/tools/ToolCallingExecutor.ts +0 -106
- package/src/tools/ToolRegistry.ts +0 -224
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import * as Crypto from "effect/Crypto";
|
|
2
|
-
import * as DateTime from "effect/DateTime";
|
|
3
|
-
import * as Effect from "effect/Effect";
|
|
4
|
-
import * as Schema from "effect/Schema";
|
|
5
|
-
import { ConversationMessage } from "./Conversation.js";
|
|
6
|
-
export class ContextInvalidInput extends Schema.TaggedError()("InvalidInput", {
|
|
7
|
-
message: Schema.String
|
|
8
|
-
}) {
|
|
9
|
-
}
|
|
10
|
-
export class ContextParseFailed extends Schema.TaggedError()("ParseFailed", {
|
|
11
|
-
message: Schema.String
|
|
12
|
-
}) {
|
|
13
|
-
}
|
|
14
|
-
export class ContextSummarizationFailed extends Schema.TaggedError()("SummarizationFailed", {
|
|
15
|
-
message: Schema.String
|
|
16
|
-
}) {
|
|
17
|
-
}
|
|
18
|
-
export class ContextToolLoopFailed extends Schema.TaggedError()("ToolLoopFailed", {
|
|
19
|
-
message: Schema.String
|
|
20
|
-
}) {
|
|
21
|
-
}
|
|
22
|
-
export const ContextError = Schema.Union([
|
|
23
|
-
ContextInvalidInput,
|
|
24
|
-
ContextParseFailed,
|
|
25
|
-
ContextSummarizationFailed,
|
|
26
|
-
ContextToolLoopFailed
|
|
27
|
-
]);
|
|
28
|
-
export class ContextLimits extends Schema.Class("ContextLimits")({
|
|
29
|
-
maxTokens: Schema.Int,
|
|
30
|
-
warningThresholdPct: Schema.Number.pipe(Schema.withConstructorDefault(Effect.succeed(0.85)))
|
|
31
|
-
}) {
|
|
32
|
-
}
|
|
33
|
-
export class ContextWindow extends Schema.Class("ContextWindow")({
|
|
34
|
-
messages: Schema.Array(ConversationMessage),
|
|
35
|
-
totalTokens: Schema.Int,
|
|
36
|
-
approachingLimit: Schema.Boolean,
|
|
37
|
-
trimmed: Schema.Boolean
|
|
38
|
-
}) {
|
|
39
|
-
}
|
|
40
|
-
export class DropOldestFifo extends Schema.TaggedClass()("DropOldestFifo", {}) {
|
|
41
|
-
}
|
|
42
|
-
export class SlidingWindow extends Schema.TaggedClass()("SlidingWindow", {}) {
|
|
43
|
-
}
|
|
44
|
-
export class PriorityBased extends Schema.TaggedClass()("PriorityBased", {}) {
|
|
45
|
-
}
|
|
46
|
-
export class SummarizeOldMessages extends Schema.TaggedClass()("SummarizeOldMessages", {
|
|
47
|
-
summaryTargetTokens: Schema.Int.pipe(Schema.withConstructorDefault(Effect.succeed(256)))
|
|
48
|
-
}) {
|
|
49
|
-
}
|
|
50
|
-
export const ContextTrimmingStrategy = Schema.Union([
|
|
51
|
-
DropOldestFifo,
|
|
52
|
-
SlidingWindow,
|
|
53
|
-
PriorityBased,
|
|
54
|
-
SummarizeOldMessages
|
|
55
|
-
]);
|
|
56
|
-
export const ContextTrimmingStrategies = Object.freeze({
|
|
57
|
-
DropOldestFifo: DropOldestFifo.make({}),
|
|
58
|
-
SlidingWindow: SlidingWindow.make({}),
|
|
59
|
-
PriorityBased: PriorityBased.make({}),
|
|
60
|
-
SummarizeOldMessages: (summaryTargetTokens = 256) => SummarizeOldMessages.make({ summaryTargetTokens })
|
|
61
|
-
});
|
|
62
|
-
const roleOverhead = (role) => {
|
|
63
|
-
switch (role) {
|
|
64
|
-
case "System":
|
|
65
|
-
return 6;
|
|
66
|
-
case "User":
|
|
67
|
-
case "Assistant":
|
|
68
|
-
return 5;
|
|
69
|
-
case "Tool":
|
|
70
|
-
return 8;
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
const providerCharactersPerToken = (provider) => {
|
|
74
|
-
switch (provider) {
|
|
75
|
-
case "OpenAI":
|
|
76
|
-
case "OpenCode":
|
|
77
|
-
return 4;
|
|
78
|
-
case "Anthropic":
|
|
79
|
-
return 3.8;
|
|
80
|
-
case "GeminiApi":
|
|
81
|
-
case "GeminiCli":
|
|
82
|
-
return 4.2;
|
|
83
|
-
case "LmStudio":
|
|
84
|
-
case "Ollama":
|
|
85
|
-
case "MlxLm":
|
|
86
|
-
case "Mock":
|
|
87
|
-
return 4.5;
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
const countText = (provider, text) => Math.max(1, Math.ceil(Math.max(text.length, 1) / providerCharactersPerToken(provider)));
|
|
91
|
-
const countMessage = (provider, message) => countText(provider, message.content) + roleOverhead(message.role);
|
|
92
|
-
export const defaultTokenCounter = {
|
|
93
|
-
countText,
|
|
94
|
-
countMessage,
|
|
95
|
-
countMessages: (provider, messages) => Array.from(messages).reduce((total, message) => total + countMessage(provider, message), 0)
|
|
96
|
-
};
|
|
97
|
-
export const simpleMessageSummarizer = {
|
|
98
|
-
summarize: (messages, targetTokens) => {
|
|
99
|
-
if (messages.length === 0) {
|
|
100
|
-
return Effect.fail(ContextInvalidInput.make({
|
|
101
|
-
message: "Cannot summarize empty messages"
|
|
102
|
-
}));
|
|
103
|
-
}
|
|
104
|
-
const summaryText = messages
|
|
105
|
-
.slice(0, 8)
|
|
106
|
-
.map((message) => `${message.role.toLowerCase()}: ${message.content.slice(0, 160)}`)
|
|
107
|
-
.join("\n");
|
|
108
|
-
return Effect.gen(function* () {
|
|
109
|
-
const crypto = yield* Crypto.Crypto;
|
|
110
|
-
const id = yield* crypto.randomUUIDv4.pipe(Effect.mapError((error) => ContextSummarizationFailed.make({
|
|
111
|
-
message: `Failed to generate summary id: ${error.message}`
|
|
112
|
-
})));
|
|
113
|
-
const timestamp = yield* DateTime.now;
|
|
114
|
-
return ConversationMessage.make({
|
|
115
|
-
id,
|
|
116
|
-
role: "Assistant",
|
|
117
|
-
content: `Summary of previous context:\n${summaryText}`,
|
|
118
|
-
timestamp,
|
|
119
|
-
tokens: Math.max(1, targetTokens),
|
|
120
|
-
metadata: { summary: "true" },
|
|
121
|
-
important: true
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
const annotateTokens = (messages, provider, tokenCounter) => messages.map((message) => message.tokens > 0
|
|
127
|
-
? message
|
|
128
|
-
: ConversationMessage.make({
|
|
129
|
-
...message,
|
|
130
|
-
tokens: tokenCounter.countMessage(provider, message)
|
|
131
|
-
}));
|
|
132
|
-
const dropOldest = (messages, maxTokens) => {
|
|
133
|
-
let used = 0;
|
|
134
|
-
let kept = [];
|
|
135
|
-
for (const message of Array.from(messages).reverse()) {
|
|
136
|
-
if (used + message.tokens <= maxTokens) {
|
|
137
|
-
used += message.tokens;
|
|
138
|
-
kept = [message, ...kept];
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return kept;
|
|
142
|
-
};
|
|
143
|
-
const slidingWindow = (messages, maxTokens) => {
|
|
144
|
-
const system = messages.filter((message) => message.role === "System");
|
|
145
|
-
const recentNonSystem = messages.filter((message) => message.role !== "System");
|
|
146
|
-
const systemTokens = system.reduce((total, message) => total + message.tokens, 0);
|
|
147
|
-
const tail = dropOldest(recentNonSystem, Math.max(0, maxTokens - systemTokens));
|
|
148
|
-
return [...system, ...tail].slice(-messages.length);
|
|
149
|
-
};
|
|
150
|
-
const priorityWindow = (messages, maxTokens) => {
|
|
151
|
-
const scored = messages.map((message, index) => ({
|
|
152
|
-
message,
|
|
153
|
-
score: (message.role === "System" ? 1_000 : 0) +
|
|
154
|
-
(message.role === "Tool" ? 600 : 0) +
|
|
155
|
-
(message.important ? 400 : 0) +
|
|
156
|
-
index
|
|
157
|
-
}));
|
|
158
|
-
scored.sort((left, right) => right.score - left.score ||
|
|
159
|
-
DateTime.toEpochMillis(left.message.timestamp) -
|
|
160
|
-
DateTime.toEpochMillis(right.message.timestamp));
|
|
161
|
-
let used = 0;
|
|
162
|
-
const selected = [];
|
|
163
|
-
for (const candidate of scored) {
|
|
164
|
-
if (used + candidate.message.tokens <= maxTokens) {
|
|
165
|
-
used += candidate.message.tokens;
|
|
166
|
-
selected.push(candidate.message);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return selected.sort((left, right) => DateTime.toEpochMillis(left.timestamp) - DateTime.toEpochMillis(right.timestamp));
|
|
170
|
-
};
|
|
171
|
-
const summarizeOldMessages = (messages, maxTokens, summaryTargetTokens, provider, tokenCounter, summarizer) => {
|
|
172
|
-
if (messages.length <= 2) {
|
|
173
|
-
return Effect.succeed(dropOldest(messages, maxTokens));
|
|
174
|
-
}
|
|
175
|
-
const splitIndex = Math.max(1, Math.floor(messages.length / 2));
|
|
176
|
-
const oldMessages = messages.slice(0, splitIndex);
|
|
177
|
-
const recentMessages = messages.slice(splitIndex);
|
|
178
|
-
return Effect.map(summarizer.summarize(oldMessages, summaryTargetTokens), (summary) => {
|
|
179
|
-
const annotatedSummary = ConversationMessage.make({
|
|
180
|
-
...summary,
|
|
181
|
-
tokens: tokenCounter.countMessage(provider, summary)
|
|
182
|
-
});
|
|
183
|
-
return dropOldest([annotatedSummary, ...recentMessages], maxTokens);
|
|
184
|
-
});
|
|
185
|
-
};
|
|
186
|
-
export function applyContextWindow(messages, provider, limits, strategy, tokenCounter = defaultTokenCounter, summarizer) {
|
|
187
|
-
if (limits.maxTokens <= 0) {
|
|
188
|
-
return Effect.fail(ContextInvalidInput.make({
|
|
189
|
-
message: "maxTokens must be > 0"
|
|
190
|
-
}));
|
|
191
|
-
}
|
|
192
|
-
const withTokens = annotateTokens(messages, provider, tokenCounter);
|
|
193
|
-
const totalBefore = withTokens.reduce((total, message) => total + message.tokens, 0);
|
|
194
|
-
const trimmed = totalBefore <= limits.maxTokens
|
|
195
|
-
? Effect.succeed([withTokens, false])
|
|
196
|
-
: (() => {
|
|
197
|
-
switch (strategy._tag) {
|
|
198
|
-
case "DropOldestFifo":
|
|
199
|
-
return Effect.succeed([dropOldest(withTokens, limits.maxTokens), true]);
|
|
200
|
-
case "SlidingWindow":
|
|
201
|
-
return Effect.succeed([slidingWindow(withTokens, limits.maxTokens), true]);
|
|
202
|
-
case "PriorityBased":
|
|
203
|
-
return Effect.succeed([priorityWindow(withTokens, limits.maxTokens), true]);
|
|
204
|
-
case "SummarizeOldMessages": {
|
|
205
|
-
const summarized = summarizer === undefined
|
|
206
|
-
? summarizeOldMessages(withTokens, limits.maxTokens, strategy.summaryTargetTokens, provider, tokenCounter, simpleMessageSummarizer)
|
|
207
|
-
: summarizeOldMessages(withTokens, limits.maxTokens, strategy.summaryTargetTokens, provider, tokenCounter, summarizer);
|
|
208
|
-
return Effect.map(summarized, (messages) => [messages, true]);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
})();
|
|
212
|
-
return Effect.map(trimmed, ([finalMessages, wasTrimmed]) => {
|
|
213
|
-
const totalTokens = finalMessages.reduce((total, message) => total + message.tokens, 0);
|
|
214
|
-
return ContextWindow.make({
|
|
215
|
-
messages: finalMessages,
|
|
216
|
-
totalTokens,
|
|
217
|
-
approachingLimit: totalTokens >= limits.maxTokens * limits.warningThresholdPct,
|
|
218
|
-
trimmed: wasTrimmed
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
//# sourceMappingURL=ContextManagement.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ContextManagement.js","sourceRoot":"","sources":["../src/ContextManagement.ts"],"names":[],"mappings":"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"}
|
package/dist/Conversation.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as Schema from "effect/Schema";
|
|
2
|
-
export declare const PromptRole: Schema.Literals<readonly ["System", "User", "Assistant", "Tool"]>;
|
|
3
|
-
export type PromptRole = typeof PromptRole.Type;
|
|
4
|
-
declare const ConversationMessage_base: Schema.Class<ConversationMessage, Schema.Struct<{
|
|
5
|
-
readonly id: Schema.String;
|
|
6
|
-
readonly role: Schema.Literals<readonly ["System", "User", "Assistant", "Tool"]>;
|
|
7
|
-
readonly content: Schema.String;
|
|
8
|
-
readonly timestamp: Schema.DateTimeUtc;
|
|
9
|
-
readonly tokens: Schema.withConstructorDefault<Schema.Int>;
|
|
10
|
-
readonly model: Schema.optionalKey<Schema.String>;
|
|
11
|
-
readonly costUsd: Schema.optionalKey<Schema.Number>;
|
|
12
|
-
readonly metadata: Schema.withConstructorDefault<Schema.$Record<Schema.String, Schema.String>>;
|
|
13
|
-
readonly important: Schema.withConstructorDefault<Schema.Boolean>;
|
|
14
|
-
}>, {}>;
|
|
15
|
-
export declare class ConversationMessage extends ConversationMessage_base {
|
|
16
|
-
}
|
|
17
|
-
export {};
|
|
18
|
-
//# sourceMappingURL=Conversation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Conversation.d.ts","sourceRoot":"","sources":["../src/Conversation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,eAAO,MAAM,UAAU,mEAA2D,CAAA;AAClF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;;;;;;;;;;;;AAI/C,qBAAa,mBAAoB,SAAQ,wBAYvC;CAAG"}
|
package/dist/Conversation.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import * as Effect from "effect/Effect";
|
|
2
|
-
import * as Schema from "effect/Schema";
|
|
3
|
-
export const PromptRole = Schema.Literals(["System", "User", "Assistant", "Tool"]);
|
|
4
|
-
const emptyMetadata = Object.freeze({});
|
|
5
|
-
export class ConversationMessage extends Schema.Class("ConversationMessage")({
|
|
6
|
-
id: Schema.String,
|
|
7
|
-
role: PromptRole,
|
|
8
|
-
content: Schema.String,
|
|
9
|
-
timestamp: Schema.DateTimeUtc,
|
|
10
|
-
tokens: Schema.Int.pipe(Schema.withConstructorDefault(Effect.succeed(0))),
|
|
11
|
-
model: Schema.optionalKey(Schema.String),
|
|
12
|
-
costUsd: Schema.optionalKey(Schema.Number),
|
|
13
|
-
metadata: Schema.Record(Schema.String, Schema.String).pipe(Schema.withConstructorDefault(Effect.succeed(emptyMetadata))),
|
|
14
|
-
important: Schema.Boolean.pipe(Schema.withConstructorDefault(Effect.succeed(false)))
|
|
15
|
-
}) {
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=Conversation.js.map
|
package/dist/Conversation.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Conversation.js","sourceRoot":"","sources":["../src/Conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAA;AAGlF,MAAM,aAAa,GAAqC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAEzE,MAAM,OAAO,mBAAoB,SAAQ,MAAM,CAAC,KAAK,CAAsB,qBAAqB,CAAC,CAAC;IAChG,EAAE,EAAE,MAAM,CAAC,MAAM;IACjB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,SAAS,EAAE,MAAM,CAAC,WAAW;IAC7B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACxD,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAC7D;IACD,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;CACrF,CAAC;CAAG"}
|
package/dist/RateLimiter.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import * as Context from "effect/Context";
|
|
2
|
-
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as Layer from "effect/Layer";
|
|
4
|
-
import * as Schema from "effect/Schema";
|
|
5
|
-
import type { LlmConfig } from "./Models.ts";
|
|
6
|
-
declare const RateLimiterAcquireTimeout_base: Schema.Class<RateLimiterAcquireTimeout, Schema.TaggedStruct<"AcquireTimeout", {
|
|
7
|
-
readonly timeout: Schema.Duration;
|
|
8
|
-
}>, import("effect/Cause").YieldableError>;
|
|
9
|
-
export declare class RateLimiterAcquireTimeout extends RateLimiterAcquireTimeout_base {
|
|
10
|
-
}
|
|
11
|
-
declare const RateLimiterInvalidConfig_base: Schema.Class<RateLimiterInvalidConfig, Schema.TaggedStruct<"InvalidConfig", {
|
|
12
|
-
readonly details: Schema.String;
|
|
13
|
-
}>, import("effect/Cause").YieldableError>;
|
|
14
|
-
export declare class RateLimiterInvalidConfig extends RateLimiterInvalidConfig_base {
|
|
15
|
-
}
|
|
16
|
-
export declare const RateLimiterError: Schema.Union<readonly [typeof RateLimiterAcquireTimeout, typeof RateLimiterInvalidConfig]>;
|
|
17
|
-
export type RateLimiterError = typeof RateLimiterError.Type;
|
|
18
|
-
declare const RateLimiterConfig_base: Schema.Class<RateLimiterConfig, Schema.Struct<{
|
|
19
|
-
readonly requestsPerMinute: Schema.withConstructorDefault<Schema.Int>;
|
|
20
|
-
readonly burstSize: Schema.withConstructorDefault<Schema.Int>;
|
|
21
|
-
readonly acquireTimeout: Schema.withConstructorDefault<Schema.Duration>;
|
|
22
|
-
}>, {}>;
|
|
23
|
-
export declare class RateLimiterConfig extends RateLimiterConfig_base {
|
|
24
|
-
}
|
|
25
|
-
export declare const rateLimiterConfigFromLlmConfig: (config: LlmConfig) => RateLimiterConfig;
|
|
26
|
-
declare const RateLimiterMetrics_base: Schema.Class<RateLimiterMetrics, Schema.Struct<{
|
|
27
|
-
readonly totalRequests: Schema.Int;
|
|
28
|
-
readonly throttledRequests: Schema.Int;
|
|
29
|
-
readonly currentTokens: Schema.Int;
|
|
30
|
-
}>, {}>;
|
|
31
|
-
export declare class RateLimiterMetrics extends RateLimiterMetrics_base {
|
|
32
|
-
}
|
|
33
|
-
export interface RateLimiterShape {
|
|
34
|
-
readonly acquire: Effect.Effect<void, RateLimiterError>;
|
|
35
|
-
readonly tryAcquire: Effect.Effect<boolean>;
|
|
36
|
-
readonly metrics: Effect.Effect<RateLimiterMetrics>;
|
|
37
|
-
}
|
|
38
|
-
declare const RateLimiter_base: Context.ServiceClass<RateLimiter, "@llm4ts/core/RateLimiter", RateLimiterShape>;
|
|
39
|
-
export declare class RateLimiter extends RateLimiter_base {
|
|
40
|
-
}
|
|
41
|
-
export declare const makeRateLimiter: (config: RateLimiterConfig) => Effect.Effect<RateLimiterShape, never, never>;
|
|
42
|
-
export declare const rateLimiterLayer: (config: RateLimiterConfig) => Layer.Layer<RateLimiter>;
|
|
43
|
-
export {};
|
|
44
|
-
//# sourceMappingURL=RateLimiter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../src/RateLimiter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;;;;AAE5C,qBAAa,yBAA0B,SAAQ,8BAK9C;CAAG;;;;AAEJ,qBAAa,wBAAyB,SAAQ,6BAK7C;CAAG;AAEJ,eAAO,MAAM,gBAAgB,4FAAsE,CAAA;AACnG,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,IAAI,CAAA;;;;;;AAE3D,qBAAa,iBAAkB,SAAQ,sBAMrC;CAAG;AAEL,eAAO,MAAM,8BAA8B,GAAI,QAAQ,SAAS,KAAG,iBAK/D,CAAA;;;;;;AAEJ,qBAAa,kBAAmB,SAAQ,uBAItC;CAAG;AAEL,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;CACpD;;AAED,qBAAa,WAAY,SAAQ,gBAEhC;CAAG;AAwBJ,eAAO,MAAM,eAAe,8EA2J1B,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,iBAAiB,KAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAChC,CAAA"}
|
package/dist/RateLimiter.js
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import * as Clock from "effect/Clock";
|
|
2
|
-
import * as Context from "effect/Context";
|
|
3
|
-
import * as Duration from "effect/Duration";
|
|
4
|
-
import * as Effect from "effect/Effect";
|
|
5
|
-
import * as Layer from "effect/Layer";
|
|
6
|
-
import * as Ref from "effect/Ref";
|
|
7
|
-
import * as Schema from "effect/Schema";
|
|
8
|
-
export class RateLimiterAcquireTimeout extends Schema.TaggedError()("AcquireTimeout", {
|
|
9
|
-
timeout: Schema.Duration
|
|
10
|
-
}) {
|
|
11
|
-
}
|
|
12
|
-
export class RateLimiterInvalidConfig extends Schema.TaggedError()("InvalidConfig", {
|
|
13
|
-
details: Schema.String
|
|
14
|
-
}) {
|
|
15
|
-
}
|
|
16
|
-
export const RateLimiterError = Schema.Union([RateLimiterAcquireTimeout, RateLimiterInvalidConfig]);
|
|
17
|
-
export class RateLimiterConfig extends Schema.Class("RateLimiterConfig")({
|
|
18
|
-
requestsPerMinute: Schema.Int.pipe(Schema.withConstructorDefault(Effect.succeed(60))),
|
|
19
|
-
burstSize: Schema.Int.pipe(Schema.withConstructorDefault(Effect.succeed(10))),
|
|
20
|
-
acquireTimeout: Schema.Duration.pipe(Schema.withConstructorDefault(Effect.succeed(Duration.seconds(30))))
|
|
21
|
-
}) {
|
|
22
|
-
}
|
|
23
|
-
export const rateLimiterConfigFromLlmConfig = (config) => RateLimiterConfig.make({
|
|
24
|
-
requestsPerMinute: config.requestsPerMinute,
|
|
25
|
-
burstSize: config.burstSize,
|
|
26
|
-
acquireTimeout: config.acquireTimeout
|
|
27
|
-
});
|
|
28
|
-
export class RateLimiterMetrics extends Schema.Class("RateLimiterMetrics")({
|
|
29
|
-
totalRequests: Schema.Int,
|
|
30
|
-
throttledRequests: Schema.Int,
|
|
31
|
-
currentTokens: Schema.Int
|
|
32
|
-
}) {
|
|
33
|
-
}
|
|
34
|
-
export class RateLimiter extends Context.Service()("@llm4ts/core/RateLimiter") {
|
|
35
|
-
}
|
|
36
|
-
const nanosPerSecond = 1_000_000_000;
|
|
37
|
-
const configDetails = (config) => `requestsPerMinute=${config.requestsPerMinute}, burstSize=${config.burstSize}, ` +
|
|
38
|
-
`acquireTimeout=${Duration.format(config.acquireTimeout)}`;
|
|
39
|
-
const isConfigValid = (config) => config.requestsPerMinute > 0 &&
|
|
40
|
-
config.burstSize > 0 &&
|
|
41
|
-
Duration.toMillis(config.acquireTimeout) > 0;
|
|
42
|
-
export const makeRateLimiter = Effect.fn("@llm4ts/core/RateLimiter.make")(function* (config) {
|
|
43
|
-
const initialNanos = yield* Clock.currentTimeNanos;
|
|
44
|
-
const state = yield* Ref.make({
|
|
45
|
-
tokens: config.burstSize,
|
|
46
|
-
lastRefillNanos: initialNanos
|
|
47
|
-
});
|
|
48
|
-
const metrics = yield* Ref.make(RateLimiterMetrics.make({
|
|
49
|
-
totalRequests: 0,
|
|
50
|
-
throttledRequests: 0,
|
|
51
|
-
currentTokens: config.burstSize
|
|
52
|
-
}));
|
|
53
|
-
const capacity = config.burstSize;
|
|
54
|
-
const ratePerSecond = config.requestsPerMinute / 60;
|
|
55
|
-
const takeToken = Effect.gen(function* () {
|
|
56
|
-
const now = yield* Clock.currentTimeNanos;
|
|
57
|
-
return yield* Ref.modify(state, (current) => {
|
|
58
|
-
const elapsedNanos = now - current.lastRefillNanos;
|
|
59
|
-
const tokensToAdd = elapsedNanos <= 0n ? 0 : (Number(elapsedNanos) / nanosPerSecond) * ratePerSecond;
|
|
60
|
-
const refilled = tokensToAdd <= 0 ? current.tokens : Math.min(capacity, current.tokens + tokensToAdd);
|
|
61
|
-
const lastRefillNanos = tokensToAdd <= 0 ? current.lastRefillNanos : now;
|
|
62
|
-
if (refilled >= 1) {
|
|
63
|
-
const remaining = refilled - 1;
|
|
64
|
-
return [
|
|
65
|
-
{
|
|
66
|
-
acquired: true,
|
|
67
|
-
tokensAfter: remaining,
|
|
68
|
-
deficit: 0
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
tokens: remaining,
|
|
72
|
-
lastRefillNanos
|
|
73
|
-
}
|
|
74
|
-
];
|
|
75
|
-
}
|
|
76
|
-
return [
|
|
77
|
-
{
|
|
78
|
-
acquired: false,
|
|
79
|
-
tokensAfter: refilled,
|
|
80
|
-
deficit: 1 - refilled
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
tokens: refilled,
|
|
84
|
-
lastRefillNanos
|
|
85
|
-
}
|
|
86
|
-
];
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
const updateCurrentTokens = (tokens) => Ref.update(metrics, (current) => RateLimiterMetrics.make({
|
|
90
|
-
...current,
|
|
91
|
-
currentTokens: Math.trunc(tokens)
|
|
92
|
-
}));
|
|
93
|
-
const waitForToken = (deficit) => {
|
|
94
|
-
if (ratePerSecond <= 0) {
|
|
95
|
-
return Effect.fail(RateLimiterInvalidConfig.make({
|
|
96
|
-
details: configDetails(config)
|
|
97
|
-
}));
|
|
98
|
-
}
|
|
99
|
-
const nanoseconds = BigInt(Math.max(0, Math.ceil((deficit / ratePerSecond) * nanosPerSecond)));
|
|
100
|
-
return Effect.sleep(Duration.nanos(nanoseconds));
|
|
101
|
-
};
|
|
102
|
-
const acquireLoop = (alreadyThrottled) => Effect.gen(function* () {
|
|
103
|
-
const result = yield* takeToken;
|
|
104
|
-
yield* updateCurrentTokens(result.tokensAfter);
|
|
105
|
-
if (result.acquired) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
if (!alreadyThrottled) {
|
|
109
|
-
yield* Ref.update(metrics, (current) => RateLimiterMetrics.make({
|
|
110
|
-
...current,
|
|
111
|
-
throttledRequests: current.throttledRequests + 1
|
|
112
|
-
}));
|
|
113
|
-
}
|
|
114
|
-
yield* waitForToken(result.deficit);
|
|
115
|
-
return yield* Effect.suspend(() => acquireLoop(true));
|
|
116
|
-
});
|
|
117
|
-
const acquire = Effect.suspend(() => {
|
|
118
|
-
if (!isConfigValid(config)) {
|
|
119
|
-
return Effect.fail(RateLimiterInvalidConfig.make({
|
|
120
|
-
details: configDetails(config)
|
|
121
|
-
}));
|
|
122
|
-
}
|
|
123
|
-
return Ref.update(metrics, (current) => RateLimiterMetrics.make({
|
|
124
|
-
...current,
|
|
125
|
-
totalRequests: current.totalRequests + 1
|
|
126
|
-
})).pipe(Effect.andThen(acquireLoop(false)), Effect.timeoutOrElse({
|
|
127
|
-
duration: config.acquireTimeout,
|
|
128
|
-
orElse: () => Effect.fail(RateLimiterAcquireTimeout.make({
|
|
129
|
-
timeout: config.acquireTimeout
|
|
130
|
-
}))
|
|
131
|
-
}));
|
|
132
|
-
});
|
|
133
|
-
const tryAcquire = Effect.suspend(() => {
|
|
134
|
-
if (!isConfigValid(config)) {
|
|
135
|
-
return Effect.logWarning(`Rate limiter config invalid: ${configDetails(config)}`).pipe(Effect.as(false));
|
|
136
|
-
}
|
|
137
|
-
return Effect.gen(function* () {
|
|
138
|
-
const result = yield* takeToken;
|
|
139
|
-
yield* updateCurrentTokens(result.tokensAfter);
|
|
140
|
-
yield* Ref.update(metrics, (current) => RateLimiterMetrics.make({
|
|
141
|
-
...current,
|
|
142
|
-
totalRequests: current.totalRequests + 1,
|
|
143
|
-
throttledRequests: current.throttledRequests + (result.acquired ? 0 : 1)
|
|
144
|
-
}));
|
|
145
|
-
return result.acquired;
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
return RateLimiter.of({
|
|
149
|
-
acquire,
|
|
150
|
-
tryAcquire,
|
|
151
|
-
metrics: Ref.get(metrics)
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
export const rateLimiterLayer = (config) => Layer.effect(RateLimiter, makeRateLimiter(config));
|
|
155
|
-
//# sourceMappingURL=RateLimiter.js.map
|
package/dist/RateLimiter.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../src/RateLimiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import * as Schema from "effect/Schema";
|
|
2
|
-
import type { LlmServiceShape } from "../LlmService.ts";
|
|
3
|
-
import type { MetricsCollectorShape, RequestLabels } from "./Metrics.ts";
|
|
4
|
-
declare const LlmPricing_base: Schema.Class<LlmPricing, Schema.Struct<{
|
|
5
|
-
readonly inputUsdPer1k: Schema.Number;
|
|
6
|
-
readonly outputUsdPer1k: Schema.Number;
|
|
7
|
-
}>, {}>;
|
|
8
|
-
export declare class LlmPricing extends LlmPricing_base {
|
|
9
|
-
}
|
|
10
|
-
export interface MeteredLlmOptions {
|
|
11
|
-
readonly labels: RequestLabels;
|
|
12
|
-
readonly pricing?: LlmPricing;
|
|
13
|
-
}
|
|
14
|
-
export declare const meterLlmService: (service: LlmServiceShape, collector: MetricsCollectorShape, options: MeteredLlmOptions) => LlmServiceShape;
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=MeteredLlmService.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MeteredLlmService.d.ts","sourceRoot":"","sources":["../../src/observability/MeteredLlmService.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,kBAAkB,CAAA;AAGzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;;;;;AAExE,qBAAa,UAAW,SAAQ,eAG9B;CAAG;AAEL,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAA;CAC9B;AA+GD,eAAO,MAAM,eAAe,GAC1B,SAAS,eAAe,EACxB,WAAW,qBAAqB,EAChC,SAAS,iBAAiB,KACzB,eA4BD,CAAA"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @deprecated Since 2.30.0 (ADR 0026): llm4ts exports OpenTelemetry spans and
|
|
3
|
-
* metrics over OTLP from `@llm4ts/runner/Otel`; this in-memory module is not
|
|
4
|
-
* used by flow or runner and will be removed in the next major.
|
|
5
|
-
*/
|
|
6
|
-
import * as Clock from "effect/Clock";
|
|
7
|
-
import * as Effect from "effect/Effect";
|
|
8
|
-
import * as Ref from "effect/Ref";
|
|
9
|
-
import * as Schema from "effect/Schema";
|
|
10
|
-
import * as Stream from "effect/Stream";
|
|
11
|
-
import { RequestMetrics } from "./Metrics.js";
|
|
12
|
-
export class LlmPricing extends Schema.Class("LlmPricing")({
|
|
13
|
-
inputUsdPer1k: Schema.Number,
|
|
14
|
-
outputUsdPer1k: Schema.Number
|
|
15
|
-
}) {
|
|
16
|
-
}
|
|
17
|
-
const estimatedCost = (usage, pricing) => usage === undefined || pricing === undefined
|
|
18
|
-
? undefined
|
|
19
|
-
: (usage.prompt / 1_000) * pricing.inputUsdPer1k +
|
|
20
|
-
(usage.completion / 1_000) * pricing.outputUsdPer1k;
|
|
21
|
-
const complete = (collector, options, startedAt, endedAt, success, errorType, usage) => {
|
|
22
|
-
const cost = estimatedCost(usage, options.pricing);
|
|
23
|
-
return collector.recordCompleted(RequestMetrics.make({
|
|
24
|
-
labels: options.labels,
|
|
25
|
-
latencyMs: Math.max(0, endedAt - startedAt),
|
|
26
|
-
success,
|
|
27
|
-
...(errorType === undefined ? {} : { errorType }),
|
|
28
|
-
...(usage === undefined ? {} : { tokenUsage: usage }),
|
|
29
|
-
...(cost === undefined ? {} : { estimatedCostUsd: cost })
|
|
30
|
-
}));
|
|
31
|
-
};
|
|
32
|
-
const meterEffect = (effect, collector, options, usageOf) => Effect.gen(function* () {
|
|
33
|
-
const startedAt = yield* Clock.currentTimeMillis;
|
|
34
|
-
yield* collector.markRequestStarted(options.labels);
|
|
35
|
-
const result = yield* Effect.result(effect);
|
|
36
|
-
const endedAt = yield* Clock.currentTimeMillis;
|
|
37
|
-
yield* complete(collector, options, startedAt, endedAt, result._tag === "Success", result._tag === "Failure" ? result.failure._tag : undefined, result._tag === "Success" ? usageOf(result.success) : undefined);
|
|
38
|
-
return yield* Effect.fromResult(result);
|
|
39
|
-
});
|
|
40
|
-
const meterStream = (stream, collector, options) => Stream.unwrap(Effect.gen(function* () {
|
|
41
|
-
const startedAt = yield* Clock.currentTimeMillis;
|
|
42
|
-
yield* collector.markRequestStarted(options.labels);
|
|
43
|
-
const measurement = yield* Ref.make({
|
|
44
|
-
success: true,
|
|
45
|
-
errorType: undefined,
|
|
46
|
-
usage: undefined
|
|
47
|
-
});
|
|
48
|
-
return stream.pipe(Stream.tap((chunk) => chunk.usage === undefined
|
|
49
|
-
? Effect.void
|
|
50
|
-
: Ref.update(measurement, (current) => ({
|
|
51
|
-
...current,
|
|
52
|
-
usage: chunk.usage
|
|
53
|
-
}))), Stream.tapError((error) => Ref.update(measurement, (current) => ({
|
|
54
|
-
...current,
|
|
55
|
-
success: false,
|
|
56
|
-
errorType: error._tag
|
|
57
|
-
}))), Stream.ensuring(Effect.gen(function* () {
|
|
58
|
-
const current = yield* Ref.get(measurement);
|
|
59
|
-
const endedAt = yield* Clock.currentTimeMillis;
|
|
60
|
-
yield* complete(collector, options, startedAt, endedAt, current.success, current.errorType, current.usage);
|
|
61
|
-
})));
|
|
62
|
-
}));
|
|
63
|
-
export const meterLlmService = (service, collector, options) => ({
|
|
64
|
-
executeStream: (prompt) => meterStream(service.executeStream(prompt), collector, options),
|
|
65
|
-
executeStreamWithHistory: (messages) => meterStream(service.executeStreamWithHistory(messages), collector, options),
|
|
66
|
-
executeWithTools: (prompt, tools) => meterEffect(service.executeWithTools(prompt, tools), collector, options, () => undefined),
|
|
67
|
-
executeStructured: (prompt, schema, jsonSchema) => meterEffect(service.executeStructured(prompt, schema, jsonSchema), collector, options, () => undefined),
|
|
68
|
-
executeStructuredWithUsage: (prompt, schema, jsonSchema) => meterEffect(service.executeStructuredWithUsage(prompt, schema, jsonSchema), collector, options, (result) => result[1]),
|
|
69
|
-
scoreLabels: (prompt, labels) => meterEffect(service.scoreLabels(prompt, labels), collector, options, (distribution) => distribution.usage),
|
|
70
|
-
isAvailable: service.isAvailable
|
|
71
|
-
});
|
|
72
|
-
//# sourceMappingURL=MeteredLlmService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MeteredLlmService.js","sourceRoot":"","sources":["../../src/observability/MeteredLlmService.ts"],"names":[],"mappings":"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"}
|