@llm4ts/core 2.54.1 → 3.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 +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
|
@@ -10,25 +10,18 @@ import {
|
|
|
10
10
|
ConnectorIds,
|
|
11
11
|
LlmChunk,
|
|
12
12
|
TokenUsage,
|
|
13
|
-
ToolCall,
|
|
14
|
-
ToolCallResponse,
|
|
15
13
|
type JsonSchema,
|
|
16
14
|
type LlmConfig,
|
|
17
|
-
type Message
|
|
18
|
-
type ToolDefinition
|
|
15
|
+
type Message
|
|
19
16
|
} from "../Models.ts"
|
|
20
17
|
import { collect } from "../Streaming.ts"
|
|
21
18
|
import { parseFromText } from "../StructuredOutput.ts"
|
|
22
19
|
import {
|
|
23
20
|
GeminiContent,
|
|
24
|
-
GeminiFunctionDeclaration,
|
|
25
21
|
GeminiGenerateContentRequest,
|
|
26
|
-
GeminiGenerateContentRequestWithTools,
|
|
27
22
|
GeminiGenerateContentResponse,
|
|
28
|
-
GeminiGenerateContentResponseFull,
|
|
29
23
|
GeminiGenerationConfig,
|
|
30
|
-
GeminiPart
|
|
31
|
-
GeminiToolDef
|
|
24
|
+
GeminiPart
|
|
32
25
|
} from "./GeminiModels.ts"
|
|
33
26
|
|
|
34
27
|
interface GeminiRequiredConfig {
|
|
@@ -75,25 +68,6 @@ export const buildGeminiRequest = (
|
|
|
75
68
|
})
|
|
76
69
|
})
|
|
77
70
|
|
|
78
|
-
export const buildGeminiToolRequest = (
|
|
79
|
-
prompt: string,
|
|
80
|
-
tools: ReadonlyArray<ToolDefinition>
|
|
81
|
-
): GeminiGenerateContentRequestWithTools =>
|
|
82
|
-
GeminiGenerateContentRequestWithTools.make({
|
|
83
|
-
contents: promptContents(prompt),
|
|
84
|
-
tools: [
|
|
85
|
-
GeminiToolDef.make({
|
|
86
|
-
functionDeclarations: tools.map((tool) =>
|
|
87
|
-
GeminiFunctionDeclaration.make({
|
|
88
|
-
name: tool.name,
|
|
89
|
-
description: tool.description,
|
|
90
|
-
parameters: tool.parameters
|
|
91
|
-
})
|
|
92
|
-
)
|
|
93
|
-
})
|
|
94
|
-
]
|
|
95
|
-
})
|
|
96
|
-
|
|
97
71
|
const decodeResponse = (
|
|
98
72
|
raw: string,
|
|
99
73
|
context: string
|
|
@@ -107,18 +81,6 @@ const decodeResponse = (
|
|
|
107
81
|
)
|
|
108
82
|
)
|
|
109
83
|
|
|
110
|
-
const decodeToolResponse = (
|
|
111
|
-
raw: string
|
|
112
|
-
): Effect.Effect<GeminiGenerateContentResponseFull, ParseError> =>
|
|
113
|
-
Schema.decodeUnknownEffect(Schema.fromJsonString(GeminiGenerateContentResponseFull))(raw).pipe(
|
|
114
|
-
Effect.mapError((error) =>
|
|
115
|
-
ParseError.make({
|
|
116
|
-
message: `Failed to decode Gemini tool response: ${String(error)}`,
|
|
117
|
-
raw
|
|
118
|
-
})
|
|
119
|
-
)
|
|
120
|
-
)
|
|
121
|
-
|
|
122
84
|
const usageFromResponse = (response: GeminiGenerateContentResponse): TokenUsage | undefined => {
|
|
123
85
|
const usage = response.usageMetadata
|
|
124
86
|
return usage === undefined
|
|
@@ -274,48 +236,6 @@ export const makeGeminiApiProvider = (
|
|
|
274
236
|
return result
|
|
275
237
|
})
|
|
276
238
|
|
|
277
|
-
const executeWithTools = (
|
|
278
|
-
prompt: string,
|
|
279
|
-
tools: ReadonlyArray<ToolDefinition>
|
|
280
|
-
): Effect.Effect<ToolCallResponse, LlmError> =>
|
|
281
|
-
Effect.gen(function* () {
|
|
282
|
-
const { apiKey, baseUrl } = yield* requiredConfig
|
|
283
|
-
const raw = yield* httpClient.postJson(
|
|
284
|
-
endpoint(baseUrl, "generateContent"),
|
|
285
|
-
JSON.stringify(buildGeminiToolRequest(prompt, tools)),
|
|
286
|
-
headers(apiKey),
|
|
287
|
-
config.timeout
|
|
288
|
-
)
|
|
289
|
-
const response = yield* decodeToolResponse(raw)
|
|
290
|
-
const candidate = response.candidates[0]
|
|
291
|
-
if (candidate === undefined) {
|
|
292
|
-
return yield* Effect.fail(
|
|
293
|
-
ParseError.make({
|
|
294
|
-
message: "Gemini tool response has no candidates",
|
|
295
|
-
raw
|
|
296
|
-
})
|
|
297
|
-
)
|
|
298
|
-
}
|
|
299
|
-
const calls = candidate.content.parts.flatMap((part) =>
|
|
300
|
-
part.functionCall === undefined ? [] : [part.functionCall]
|
|
301
|
-
)
|
|
302
|
-
const text = candidate.content.parts
|
|
303
|
-
.map((part) => part.text)
|
|
304
|
-
.find((part) => part !== undefined && part !== null)
|
|
305
|
-
|
|
306
|
-
return ToolCallResponse.make({
|
|
307
|
-
toolCalls: calls.map((call, index) =>
|
|
308
|
-
ToolCall.make({
|
|
309
|
-
id: `gemini_call_${index}`,
|
|
310
|
-
name: call.name,
|
|
311
|
-
arguments: JSON.stringify(call.args) ?? "{}"
|
|
312
|
-
})
|
|
313
|
-
),
|
|
314
|
-
finishReason: candidate.finishReason ?? "STOP",
|
|
315
|
-
...(text === undefined || text === null ? {} : { content: text })
|
|
316
|
-
})
|
|
317
|
-
})
|
|
318
|
-
|
|
319
239
|
const executeStream = (prompt: string): Stream.Stream<LlmChunk, LlmError> =>
|
|
320
240
|
executeStreamWithContents(promptContents(prompt))
|
|
321
241
|
|
|
@@ -330,7 +250,6 @@ export const makeGeminiApiProvider = (
|
|
|
330
250
|
id: ConnectorIds.GeminiApi,
|
|
331
251
|
executeStream,
|
|
332
252
|
executeStreamWithHistory: (messages) => executeStreamWithContents(geminiContents(messages)),
|
|
333
|
-
executeWithTools,
|
|
334
253
|
executeStructuredWithUsage,
|
|
335
254
|
isAvailable
|
|
336
255
|
})
|
|
@@ -49,49 +49,3 @@ export class GeminiGenerateContentResponse extends Schema.Class<GeminiGenerateCo
|
|
|
49
49
|
candidates: arrayWithDefaults(GeminiCandidate),
|
|
50
50
|
usageMetadata: Schema.optionalKey(GeminiUsageMetadata)
|
|
51
51
|
}) {}
|
|
52
|
-
|
|
53
|
-
export class GeminiFunctionDeclaration extends Schema.Class<GeminiFunctionDeclaration>(
|
|
54
|
-
"GeminiFunctionDeclaration"
|
|
55
|
-
)({
|
|
56
|
-
name: Schema.String,
|
|
57
|
-
description: Schema.String,
|
|
58
|
-
parameters: JsonSchema
|
|
59
|
-
}) {}
|
|
60
|
-
|
|
61
|
-
export class GeminiToolDef extends Schema.Class<GeminiToolDef>("GeminiToolDef")({
|
|
62
|
-
functionDeclarations: Schema.Array(GeminiFunctionDeclaration)
|
|
63
|
-
}) {}
|
|
64
|
-
|
|
65
|
-
export class GeminiFunctionCall extends Schema.Class<GeminiFunctionCall>("GeminiFunctionCall")({
|
|
66
|
-
name: Schema.String,
|
|
67
|
-
args: Schema.Json
|
|
68
|
-
}) {}
|
|
69
|
-
|
|
70
|
-
export class GeminiPartFull extends Schema.Class<GeminiPartFull>("GeminiPartFull")({
|
|
71
|
-
text: Schema.optionalKey(Schema.NullOr(Schema.String)),
|
|
72
|
-
functionCall: Schema.optionalKey(GeminiFunctionCall)
|
|
73
|
-
}) {}
|
|
74
|
-
|
|
75
|
-
export class GeminiContentFull extends Schema.Class<GeminiContentFull>("GeminiContentFull")({
|
|
76
|
-
parts: Schema.Array(GeminiPartFull)
|
|
77
|
-
}) {}
|
|
78
|
-
|
|
79
|
-
export class GeminiCandidateFull extends Schema.Class<GeminiCandidateFull>("GeminiCandidateFull")({
|
|
80
|
-
content: GeminiContentFull,
|
|
81
|
-
finishReason: Schema.optionalKey(Schema.NullOr(Schema.String))
|
|
82
|
-
}) {}
|
|
83
|
-
|
|
84
|
-
export class GeminiGenerateContentResponseFull extends Schema.Class<GeminiGenerateContentResponseFull>(
|
|
85
|
-
"GeminiGenerateContentResponseFull"
|
|
86
|
-
)({
|
|
87
|
-
candidates: arrayWithDefaults(GeminiCandidateFull),
|
|
88
|
-
usageMetadata: Schema.optionalKey(GeminiUsageMetadata)
|
|
89
|
-
}) {}
|
|
90
|
-
|
|
91
|
-
export class GeminiGenerateContentRequestWithTools extends Schema.Class<GeminiGenerateContentRequestWithTools>(
|
|
92
|
-
"GeminiGenerateContentRequestWithTools"
|
|
93
|
-
)({
|
|
94
|
-
contents: Schema.Array(GeminiContent),
|
|
95
|
-
tools: Schema.Array(GeminiToolDef),
|
|
96
|
-
generationConfig: Schema.optionalKey(GeminiGenerationConfig)
|
|
97
|
-
}) {}
|
|
@@ -3,7 +3,7 @@ import * as Redacted from "effect/Redacted"
|
|
|
3
3
|
import * as Schema from "effect/Schema"
|
|
4
4
|
import * as Stream from "effect/Stream"
|
|
5
5
|
import { makeApiConnector, type ApiConnectorShape } from "../Connector.ts"
|
|
6
|
-
import { ConfigError,
|
|
6
|
+
import { ConfigError, ParseError, type LlmError } from "../Errors.ts"
|
|
7
7
|
import type { HttpClientShape } from "../HttpClient.ts"
|
|
8
8
|
import type { StructuredResult } from "../LlmService.ts"
|
|
9
9
|
import {
|
|
@@ -264,12 +264,6 @@ export const makeLmStudioProvider = (
|
|
|
264
264
|
})
|
|
265
265
|
]),
|
|
266
266
|
executeStreamWithHistory: (messages) => streamRequest(lmStudioHistory(messages)),
|
|
267
|
-
executeWithTools: () =>
|
|
268
|
-
Effect.fail(
|
|
269
|
-
InvalidRequestError.make({
|
|
270
|
-
message: "LmStudio provider does not yet support tool calling in this implementation"
|
|
271
|
-
})
|
|
272
|
-
),
|
|
273
267
|
executeStructuredWithUsage,
|
|
274
268
|
isAvailable
|
|
275
269
|
})
|
|
@@ -2,7 +2,7 @@ import * as Effect from "effect/Effect"
|
|
|
2
2
|
import * as Schema from "effect/Schema"
|
|
3
3
|
import * as Stream from "effect/Stream"
|
|
4
4
|
import { makeApiConnector, type ApiConnectorShape } from "../Connector.ts"
|
|
5
|
-
import { ConfigError,
|
|
5
|
+
import { ConfigError, ParseError, type LlmError } from "../Errors.ts"
|
|
6
6
|
import type { HttpClientShape } from "../HttpClient.ts"
|
|
7
7
|
import { normalizeLabelProbabilities } from "../LabelScoring.ts"
|
|
8
8
|
import type { LabelSequence, StructuredResult } from "../LlmService.ts"
|
|
@@ -346,8 +346,6 @@ export const makeMlxLmProvider = (
|
|
|
346
346
|
executeStream: (prompt) =>
|
|
347
347
|
streamRequest([OpenAIChatMessage.make({ role: "user", content: prompt })]),
|
|
348
348
|
executeStreamWithHistory: (messages) => streamRequest(openAIHistoryMessages(messages)),
|
|
349
|
-
executeWithTools: () =>
|
|
350
|
-
Effect.fail(InvalidRequestError.make({ message: "mlx-lm does not support tool calling" })),
|
|
351
349
|
executeStructuredWithUsage,
|
|
352
350
|
scoreLabels,
|
|
353
351
|
scoreLabelSequence,
|
|
@@ -11,7 +11,6 @@ import {
|
|
|
11
11
|
HealthStatus,
|
|
12
12
|
LlmChunk,
|
|
13
13
|
TokenUsage,
|
|
14
|
-
ToolCallResponse,
|
|
15
14
|
type JsonSchema,
|
|
16
15
|
type LlmConfig,
|
|
17
16
|
type Message
|
|
@@ -307,14 +306,6 @@ export const makeMockProvider = (config: LlmConfig): ApiConnectorShape => {
|
|
|
307
306
|
),
|
|
308
307
|
executeStream,
|
|
309
308
|
executeStreamWithHistory: (messages) => executeStream(lastUserPrompt(messages)),
|
|
310
|
-
executeWithTools: (_prompt) =>
|
|
311
|
-
Effect.succeed(
|
|
312
|
-
ToolCallResponse.make({
|
|
313
|
-
content: mockResponse(),
|
|
314
|
-
toolCalls: [],
|
|
315
|
-
finishReason: "stop"
|
|
316
|
-
})
|
|
317
|
-
),
|
|
318
309
|
executeStructured: <A, E, RD, RE>(
|
|
319
310
|
prompt: string,
|
|
320
311
|
schema: Schema.ConstraintCodec<A, E, RD, RE>,
|
|
@@ -2,7 +2,7 @@ import * as Effect from "effect/Effect"
|
|
|
2
2
|
import * as Schema from "effect/Schema"
|
|
3
3
|
import * as Stream from "effect/Stream"
|
|
4
4
|
import { makeApiConnector, type ApiConnectorShape } from "../Connector.ts"
|
|
5
|
-
import { ConfigError,
|
|
5
|
+
import { ConfigError, ParseError, type LlmError } from "../Errors.ts"
|
|
6
6
|
import type { HttpClientShape } from "../HttpClient.ts"
|
|
7
7
|
import type { StructuredResult } from "../LlmService.ts"
|
|
8
8
|
import {
|
|
@@ -224,12 +224,6 @@ export const makeOllamaProvider = (
|
|
|
224
224
|
id: ConnectorIds.Ollama,
|
|
225
225
|
executeStream: (prompt) => generateStream(prompt),
|
|
226
226
|
executeStreamWithHistory: (messages) => chatStream(ollamaHistory(messages)),
|
|
227
|
-
executeWithTools: () =>
|
|
228
|
-
Effect.fail(
|
|
229
|
-
InvalidRequestError.make({
|
|
230
|
-
message: "Ollama provider does not support tool calling"
|
|
231
|
-
})
|
|
232
|
-
),
|
|
233
227
|
executeStructuredWithUsage,
|
|
234
228
|
isAvailable
|
|
235
229
|
})
|
|
@@ -101,70 +101,6 @@ export class OpenAIChatCompletionResponse extends Schema.Class<OpenAIChatComplet
|
|
|
101
101
|
model: Schema.optionalKey(Schema.String)
|
|
102
102
|
}) {}
|
|
103
103
|
|
|
104
|
-
export class OpenAIFunction extends Schema.Class<OpenAIFunction>("OpenAIFunction")({
|
|
105
|
-
name: Schema.String,
|
|
106
|
-
description: Schema.String,
|
|
107
|
-
parameters: JsonSchema
|
|
108
|
-
}) {}
|
|
109
|
-
|
|
110
|
-
export class OpenAITool extends Schema.Class<OpenAITool>("OpenAITool")({
|
|
111
|
-
type: Schema.String.pipe(Schema.withConstructorDefault(Effect.succeed("function"))),
|
|
112
|
-
function: OpenAIFunction
|
|
113
|
-
}) {}
|
|
114
|
-
|
|
115
|
-
export class OpenAIToolCallFunction extends Schema.Class<OpenAIToolCallFunction>(
|
|
116
|
-
"OpenAIToolCallFunction"
|
|
117
|
-
)({
|
|
118
|
-
name: Schema.String,
|
|
119
|
-
arguments: Schema.String
|
|
120
|
-
}) {}
|
|
121
|
-
|
|
122
|
-
export class OpenAIToolCall extends Schema.Class<OpenAIToolCall>("OpenAIToolCall")({
|
|
123
|
-
id: Schema.String,
|
|
124
|
-
type: Schema.String,
|
|
125
|
-
function: OpenAIToolCallFunction
|
|
126
|
-
}) {}
|
|
127
|
-
|
|
128
|
-
const noToolCalls: ReadonlyArray<OpenAIToolCall> = Object.freeze([])
|
|
129
|
-
|
|
130
|
-
export class OpenAIChatMessageWithTools extends Schema.Class<OpenAIChatMessageWithTools>(
|
|
131
|
-
"OpenAIChatMessageWithTools"
|
|
132
|
-
)({
|
|
133
|
-
role: Schema.String,
|
|
134
|
-
content: Schema.optionalKey(Schema.NullOr(Schema.String)),
|
|
135
|
-
tool_calls: Schema.Array(OpenAIToolCall).pipe(
|
|
136
|
-
Schema.withConstructorDefault(Effect.succeed(noToolCalls))
|
|
137
|
-
)
|
|
138
|
-
}) {}
|
|
139
|
-
|
|
140
|
-
export class OpenAIChatChoiceWithTools extends Schema.Class<OpenAIChatChoiceWithTools>(
|
|
141
|
-
"OpenAIChatChoiceWithTools"
|
|
142
|
-
)({
|
|
143
|
-
index: Schema.Int.pipe(Schema.withConstructorDefault(Effect.succeed(0))),
|
|
144
|
-
message: Schema.optionalKey(OpenAIChatMessageWithTools),
|
|
145
|
-
finish_reason: Schema.optionalKey(Schema.NullOr(Schema.String))
|
|
146
|
-
}) {}
|
|
147
|
-
|
|
148
|
-
export class OpenAIChatCompletionResponseWithTools extends Schema.Class<OpenAIChatCompletionResponseWithTools>(
|
|
149
|
-
"OpenAIChatCompletionResponseWithTools"
|
|
150
|
-
)({
|
|
151
|
-
id: Schema.optionalKey(Schema.String),
|
|
152
|
-
choices: Schema.Array(OpenAIChatChoiceWithTools),
|
|
153
|
-
usage: Schema.optionalKey(OpenAITokenUsage),
|
|
154
|
-
model: Schema.optionalKey(Schema.String)
|
|
155
|
-
}) {}
|
|
156
|
-
|
|
157
|
-
export class OpenAIChatCompletionRequestWithTools extends Schema.Class<OpenAIChatCompletionRequestWithTools>(
|
|
158
|
-
"OpenAIChatCompletionRequestWithTools"
|
|
159
|
-
)({
|
|
160
|
-
model: Schema.String,
|
|
161
|
-
messages: Schema.Array(OpenAIChatMessage),
|
|
162
|
-
tools: Schema.Array(OpenAITool),
|
|
163
|
-
temperature: Schema.optionalKey(Schema.Number),
|
|
164
|
-
max_tokens: Schema.optionalKey(Schema.Int),
|
|
165
|
-
stream: Schema.optionalKey(Schema.Boolean)
|
|
166
|
-
}) {}
|
|
167
|
-
|
|
168
104
|
export class OpenAIChatChunkDelta extends Schema.Class<OpenAIChatChunkDelta>(
|
|
169
105
|
"OpenAIChatChunkDelta"
|
|
170
106
|
)({
|
|
@@ -10,27 +10,20 @@ import {
|
|
|
10
10
|
ConnectorCapabilities,
|
|
11
11
|
ConnectorIds,
|
|
12
12
|
LlmChunk,
|
|
13
|
-
ToolCall,
|
|
14
|
-
ToolCallResponse,
|
|
15
13
|
type JsonSchema,
|
|
16
14
|
type LlmConfig,
|
|
17
15
|
type Message,
|
|
18
|
-
type MessageRole
|
|
19
|
-
type ToolDefinition
|
|
16
|
+
type MessageRole
|
|
20
17
|
} from "../Models.ts"
|
|
21
18
|
import { parseFromText } from "../StructuredOutput.ts"
|
|
22
19
|
import { effortWord } from "./CliSupport.ts"
|
|
23
20
|
import {
|
|
24
21
|
OpenAIChatChunk,
|
|
25
22
|
OpenAIChatCompletionRequest,
|
|
26
|
-
OpenAIChatCompletionRequestWithTools,
|
|
27
23
|
OpenAIChatCompletionResponse,
|
|
28
|
-
OpenAIChatCompletionResponseWithTools,
|
|
29
24
|
OpenAIChatMessage,
|
|
30
|
-
OpenAIFunction,
|
|
31
25
|
OpenAIJsonSchemaSpec,
|
|
32
|
-
OpenAIResponseFormat
|
|
33
|
-
OpenAITool
|
|
26
|
+
OpenAIResponseFormat
|
|
34
27
|
} from "./OpenAIModels.ts"
|
|
35
28
|
|
|
36
29
|
const emptyHeaders: Readonly<Record<string, string>> = Object.freeze({})
|
|
@@ -80,33 +73,6 @@ export const buildOpenAIChatRequest = (
|
|
|
80
73
|
...(config.effort === undefined ? {} : { reasoning_effort: effortWord(config.effort, "xhigh") })
|
|
81
74
|
})
|
|
82
75
|
|
|
83
|
-
export const buildOpenAIToolRequest = (
|
|
84
|
-
config: LlmConfig,
|
|
85
|
-
prompt: string,
|
|
86
|
-
tools: ReadonlyArray<ToolDefinition>
|
|
87
|
-
): OpenAIChatCompletionRequestWithTools =>
|
|
88
|
-
OpenAIChatCompletionRequestWithTools.make({
|
|
89
|
-
model: config.model,
|
|
90
|
-
messages: [
|
|
91
|
-
OpenAIChatMessage.make({
|
|
92
|
-
role: "user",
|
|
93
|
-
content: prompt
|
|
94
|
-
})
|
|
95
|
-
],
|
|
96
|
-
tools: tools.map((tool) =>
|
|
97
|
-
OpenAITool.make({
|
|
98
|
-
function: OpenAIFunction.make({
|
|
99
|
-
name: tool.name,
|
|
100
|
-
description: tool.description,
|
|
101
|
-
parameters: tool.parameters
|
|
102
|
-
})
|
|
103
|
-
})
|
|
104
|
-
),
|
|
105
|
-
temperature: config.temperature ?? 0.7,
|
|
106
|
-
stream: false,
|
|
107
|
-
...(config.maxTokens === undefined ? {} : { max_tokens: config.maxTokens })
|
|
108
|
-
})
|
|
109
|
-
|
|
110
76
|
const decodeCompletionResponse = (
|
|
111
77
|
raw: string
|
|
112
78
|
): Effect.Effect<OpenAIChatCompletionResponse, ParseError> =>
|
|
@@ -119,18 +85,6 @@ const decodeCompletionResponse = (
|
|
|
119
85
|
)
|
|
120
86
|
)
|
|
121
87
|
|
|
122
|
-
const decodeToolResponse = (
|
|
123
|
-
raw: string
|
|
124
|
-
): Effect.Effect<OpenAIChatCompletionResponseWithTools, ParseError> =>
|
|
125
|
-
schemaDecode.tools(raw).pipe(
|
|
126
|
-
Effect.mapError((error) =>
|
|
127
|
-
ParseError.make({
|
|
128
|
-
message: `Failed to decode OpenAI tool response: ${String(error)}`,
|
|
129
|
-
raw
|
|
130
|
-
})
|
|
131
|
-
)
|
|
132
|
-
)
|
|
133
|
-
|
|
134
88
|
const decodeStreamChunk = (raw: string): Effect.Effect<OpenAIChatChunk, ParseError> =>
|
|
135
89
|
schemaDecode.chunk(raw).pipe(
|
|
136
90
|
Effect.mapError((error) =>
|
|
@@ -143,7 +97,6 @@ const decodeStreamChunk = (raw: string): Effect.Effect<OpenAIChatChunk, ParseErr
|
|
|
143
97
|
|
|
144
98
|
const schemaDecode = {
|
|
145
99
|
completion: Schema.decodeUnknownEffect(Schema.fromJsonString(OpenAIChatCompletionResponse)),
|
|
146
|
-
tools: Schema.decodeUnknownEffect(Schema.fromJsonString(OpenAIChatCompletionResponseWithTools)),
|
|
147
100
|
chunk: Schema.decodeUnknownEffect(Schema.fromJsonString(OpenAIChatChunk))
|
|
148
101
|
}
|
|
149
102
|
|
|
@@ -270,39 +223,6 @@ export const makeOpenAIProvider = (
|
|
|
270
223
|
return result
|
|
271
224
|
})
|
|
272
225
|
|
|
273
|
-
const executeWithTools = (
|
|
274
|
-
prompt: string,
|
|
275
|
-
tools: ReadonlyArray<ToolDefinition>
|
|
276
|
-
): Effect.Effect<ToolCallResponse, LlmError> =>
|
|
277
|
-
Effect.gen(function* () {
|
|
278
|
-
const { baseUrl } = yield* requiredConfig
|
|
279
|
-
const request = buildOpenAIToolRequest(config, prompt, tools)
|
|
280
|
-
const raw = yield* httpClient.postJson(
|
|
281
|
-
`${baseUrl}/chat/completions`,
|
|
282
|
-
JSON.stringify(request),
|
|
283
|
-
authHeaders(),
|
|
284
|
-
config.timeout
|
|
285
|
-
)
|
|
286
|
-
const response = yield* decodeToolResponse(raw)
|
|
287
|
-
const choice = response.choices[0]
|
|
288
|
-
const toolCalls =
|
|
289
|
-
choice?.message?.tool_calls.map((toolCall) =>
|
|
290
|
-
ToolCall.make({
|
|
291
|
-
id: toolCall.id,
|
|
292
|
-
name: toolCall.function.name,
|
|
293
|
-
arguments: toolCall.function.arguments
|
|
294
|
-
})
|
|
295
|
-
) ?? []
|
|
296
|
-
const content = choice?.message?.content ?? undefined
|
|
297
|
-
const finishReason = choice?.finish_reason ?? "stop"
|
|
298
|
-
|
|
299
|
-
return ToolCallResponse.make({
|
|
300
|
-
toolCalls,
|
|
301
|
-
finishReason,
|
|
302
|
-
...(content === undefined || content === null ? {} : { content })
|
|
303
|
-
})
|
|
304
|
-
})
|
|
305
|
-
|
|
306
226
|
// Parity with llm4zio v4.2.0 OpenAIProvider.isAvailable (`catchAll(_ => ZIO.succeed(true))`):
|
|
307
227
|
// a configured baseUrl counts as available even when the /models probe fails.
|
|
308
228
|
const isAvailable: Effect.Effect<boolean> =
|
|
@@ -327,7 +247,6 @@ export const makeOpenAIProvider = (
|
|
|
327
247
|
})
|
|
328
248
|
]),
|
|
329
249
|
executeStreamWithHistory: (messages) => executeStreamRequest(openAIHistoryMessages(messages)),
|
|
330
|
-
executeWithTools,
|
|
331
250
|
executeStructuredWithUsage,
|
|
332
251
|
isAvailable,
|
|
333
252
|
capabilities: ConnectorCapabilities.make({ readOnlyEnforcement: "enforced", effort: "mapped" })
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import * as Crypto from "effect/Crypto";
|
|
2
|
-
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as Schema from "effect/Schema";
|
|
4
|
-
import { ConversationMessage } from "./Conversation.ts";
|
|
5
|
-
import type { LlmProvider } from "./Models.ts";
|
|
6
|
-
declare const ContextInvalidInput_base: Schema.Class<ContextInvalidInput, Schema.TaggedStruct<"InvalidInput", {
|
|
7
|
-
readonly message: Schema.String;
|
|
8
|
-
}>, import("effect/Cause").YieldableError>;
|
|
9
|
-
export declare class ContextInvalidInput extends ContextInvalidInput_base {
|
|
10
|
-
}
|
|
11
|
-
declare const ContextParseFailed_base: Schema.Class<ContextParseFailed, Schema.TaggedStruct<"ParseFailed", {
|
|
12
|
-
readonly message: Schema.String;
|
|
13
|
-
}>, import("effect/Cause").YieldableError>;
|
|
14
|
-
export declare class ContextParseFailed extends ContextParseFailed_base {
|
|
15
|
-
}
|
|
16
|
-
declare const ContextSummarizationFailed_base: Schema.Class<ContextSummarizationFailed, Schema.TaggedStruct<"SummarizationFailed", {
|
|
17
|
-
readonly message: Schema.String;
|
|
18
|
-
}>, import("effect/Cause").YieldableError>;
|
|
19
|
-
export declare class ContextSummarizationFailed extends ContextSummarizationFailed_base {
|
|
20
|
-
}
|
|
21
|
-
declare const ContextToolLoopFailed_base: Schema.Class<ContextToolLoopFailed, Schema.TaggedStruct<"ToolLoopFailed", {
|
|
22
|
-
readonly message: Schema.String;
|
|
23
|
-
}>, import("effect/Cause").YieldableError>;
|
|
24
|
-
export declare class ContextToolLoopFailed extends ContextToolLoopFailed_base {
|
|
25
|
-
}
|
|
26
|
-
export declare const ContextError: Schema.Union<readonly [typeof ContextInvalidInput, typeof ContextParseFailed, typeof ContextSummarizationFailed, typeof ContextToolLoopFailed]>;
|
|
27
|
-
export type ContextError = typeof ContextError.Type;
|
|
28
|
-
declare const ContextLimits_base: Schema.Class<ContextLimits, Schema.Struct<{
|
|
29
|
-
readonly maxTokens: Schema.Int;
|
|
30
|
-
readonly warningThresholdPct: Schema.withConstructorDefault<Schema.Number>;
|
|
31
|
-
}>, {}>;
|
|
32
|
-
export declare class ContextLimits extends ContextLimits_base {
|
|
33
|
-
}
|
|
34
|
-
declare const ContextWindow_base: Schema.Class<ContextWindow, Schema.Struct<{
|
|
35
|
-
readonly messages: Schema.$Array<typeof ConversationMessage>;
|
|
36
|
-
readonly totalTokens: Schema.Int;
|
|
37
|
-
readonly approachingLimit: Schema.Boolean;
|
|
38
|
-
readonly trimmed: Schema.Boolean;
|
|
39
|
-
}>, {}>;
|
|
40
|
-
export declare class ContextWindow extends ContextWindow_base {
|
|
41
|
-
}
|
|
42
|
-
declare const DropOldestFifo_base: Schema.Class<DropOldestFifo, Schema.TaggedStruct<"DropOldestFifo", {}>, {}>;
|
|
43
|
-
export declare class DropOldestFifo extends DropOldestFifo_base {
|
|
44
|
-
}
|
|
45
|
-
declare const SlidingWindow_base: Schema.Class<SlidingWindow, Schema.TaggedStruct<"SlidingWindow", {}>, {}>;
|
|
46
|
-
export declare class SlidingWindow extends SlidingWindow_base {
|
|
47
|
-
}
|
|
48
|
-
declare const PriorityBased_base: Schema.Class<PriorityBased, Schema.TaggedStruct<"PriorityBased", {}>, {}>;
|
|
49
|
-
export declare class PriorityBased extends PriorityBased_base {
|
|
50
|
-
}
|
|
51
|
-
declare const SummarizeOldMessages_base: Schema.Class<SummarizeOldMessages, Schema.TaggedStruct<"SummarizeOldMessages", {
|
|
52
|
-
readonly summaryTargetTokens: Schema.withConstructorDefault<Schema.Int>;
|
|
53
|
-
}>, {}>;
|
|
54
|
-
export declare class SummarizeOldMessages extends SummarizeOldMessages_base {
|
|
55
|
-
}
|
|
56
|
-
export declare const ContextTrimmingStrategy: Schema.Union<readonly [typeof DropOldestFifo, typeof SlidingWindow, typeof PriorityBased, typeof SummarizeOldMessages]>;
|
|
57
|
-
export type ContextTrimmingStrategy = typeof ContextTrimmingStrategy.Type;
|
|
58
|
-
export declare const ContextTrimmingStrategies: Readonly<{
|
|
59
|
-
DropOldestFifo: DropOldestFifo;
|
|
60
|
-
SlidingWindow: SlidingWindow;
|
|
61
|
-
PriorityBased: PriorityBased;
|
|
62
|
-
SummarizeOldMessages: (summaryTargetTokens?: number) => SummarizeOldMessages;
|
|
63
|
-
}>;
|
|
64
|
-
export interface TokenCounter {
|
|
65
|
-
readonly countText: (provider: LlmProvider, text: string) => number;
|
|
66
|
-
readonly countMessage: (provider: LlmProvider, message: ConversationMessage) => number;
|
|
67
|
-
readonly countMessages: (provider: LlmProvider, messages: Iterable<ConversationMessage>) => number;
|
|
68
|
-
}
|
|
69
|
-
export declare const defaultTokenCounter: TokenCounter;
|
|
70
|
-
export interface MessageSummarizer<R = never> {
|
|
71
|
-
readonly summarize: (messages: ReadonlyArray<ConversationMessage>, targetTokens: number) => Effect.Effect<ConversationMessage, ContextError, R>;
|
|
72
|
-
}
|
|
73
|
-
export declare const simpleMessageSummarizer: MessageSummarizer<Crypto.Crypto>;
|
|
74
|
-
export declare function applyContextWindow(messages: ReadonlyArray<ConversationMessage>, provider: LlmProvider, limits: ContextLimits, strategy: DropOldestFifo | SlidingWindow | PriorityBased, tokenCounter?: TokenCounter): Effect.Effect<ContextWindow, ContextError>;
|
|
75
|
-
export declare function applyContextWindow(messages: ReadonlyArray<ConversationMessage>, provider: LlmProvider, limits: ContextLimits, strategy: ContextTrimmingStrategy, tokenCounter?: TokenCounter): Effect.Effect<ContextWindow, ContextError, Crypto.Crypto>;
|
|
76
|
-
export declare function applyContextWindow<R>(messages: ReadonlyArray<ConversationMessage>, provider: LlmProvider, limits: ContextLimits, strategy: ContextTrimmingStrategy, tokenCounter: TokenCounter, summarizer: MessageSummarizer<R>): Effect.Effect<ContextWindow, ContextError, R>;
|
|
77
|
-
export {};
|
|
78
|
-
//# sourceMappingURL=ContextManagement.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ContextManagement.d.ts","sourceRoot":"","sources":["../src/ContextManagement.ts"],"names":[],"mappings":"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"}
|