@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.
Files changed (142) hide show
  1. package/README.md +1 -1
  2. package/dist/Capability.d.ts +0 -9
  3. package/dist/Capability.d.ts.map +1 -1
  4. package/dist/Capability.js +0 -38
  5. package/dist/Capability.js.map +1 -1
  6. package/dist/Connector.d.ts +2 -3
  7. package/dist/Connector.d.ts.map +1 -1
  8. package/dist/Connector.js +0 -5
  9. package/dist/Connector.js.map +1 -1
  10. package/dist/ConnectorRegistry.d.ts +0 -3
  11. package/dist/ConnectorRegistry.d.ts.map +1 -1
  12. package/dist/ConnectorRegistry.js +0 -3
  13. package/dist/ConnectorRegistry.js.map +1 -1
  14. package/dist/HttpClient.d.ts +0 -2
  15. package/dist/HttpClient.d.ts.map +1 -1
  16. package/dist/HttpClient.js +0 -2
  17. package/dist/HttpClient.js.map +1 -1
  18. package/dist/LlmService.d.ts +1 -2
  19. package/dist/LlmService.d.ts.map +1 -1
  20. package/dist/LlmService.js.map +1 -1
  21. package/dist/Models.d.ts +0 -21
  22. package/dist/Models.d.ts.map +1 -1
  23. package/dist/Models.js +0 -19
  24. package/dist/Models.js.map +1 -1
  25. package/dist/Streaming.d.ts +4 -11
  26. package/dist/Streaming.d.ts.map +1 -1
  27. package/dist/Streaming.js +2 -29
  28. package/dist/Streaming.js.map +1 -1
  29. package/dist/providers/AnthropicModels.d.ts +0 -43
  30. package/dist/providers/AnthropicModels.d.ts.map +1 -1
  31. package/dist/providers/AnthropicModels.js +0 -39
  32. package/dist/providers/AnthropicModels.js.map +1 -1
  33. package/dist/providers/AnthropicProvider.d.ts +2 -3
  34. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  35. package/dist/providers/AnthropicProvider.js +2 -49
  36. package/dist/providers/AnthropicProvider.js.map +1 -1
  37. package/dist/providers/GeminiApiProvider.d.ts +2 -3
  38. package/dist/providers/GeminiApiProvider.d.ts.map +1 -1
  39. package/dist/providers/GeminiApiProvider.js +2 -44
  40. package/dist/providers/GeminiApiProvider.js.map +1 -1
  41. package/dist/providers/GeminiModels.d.ts +0 -48
  42. package/dist/providers/GeminiModels.d.ts.map +1 -1
  43. package/dist/providers/GeminiModels.js +0 -40
  44. package/dist/providers/GeminiModels.js.map +1 -1
  45. package/dist/providers/LmStudioProvider.d.ts.map +1 -1
  46. package/dist/providers/LmStudioProvider.js +1 -4
  47. package/dist/providers/LmStudioProvider.js.map +1 -1
  48. package/dist/providers/MlxLmProvider.d.ts.map +1 -1
  49. package/dist/providers/MlxLmProvider.js +1 -2
  50. package/dist/providers/MlxLmProvider.js.map +1 -1
  51. package/dist/providers/MockProvider.d.ts.map +1 -1
  52. package/dist/providers/MockProvider.js +1 -6
  53. package/dist/providers/MockProvider.js.map +1 -1
  54. package/dist/providers/OllamaProvider.d.ts.map +1 -1
  55. package/dist/providers/OllamaProvider.js +1 -4
  56. package/dist/providers/OllamaProvider.js.map +1 -1
  57. package/dist/providers/OpenAIModels.d.ts +0 -58
  58. package/dist/providers/OpenAIModels.d.ts.map +1 -1
  59. package/dist/providers/OpenAIModels.js +0 -51
  60. package/dist/providers/OpenAIModels.js.map +1 -1
  61. package/dist/providers/OpenAIProvider.d.ts +2 -3
  62. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  63. package/dist/providers/OpenAIProvider.js +2 -46
  64. package/dist/providers/OpenAIProvider.js.map +1 -1
  65. package/package.json +2 -14
  66. package/src/Capability.ts +0 -50
  67. package/src/Connector.ts +2 -20
  68. package/src/ConnectorRegistry.ts +0 -15
  69. package/src/HttpClient.ts +0 -15
  70. package/src/LlmService.ts +1 -13
  71. package/src/Models.ts +0 -22
  72. package/src/Streaming.ts +3 -99
  73. package/src/providers/AnthropicModels.ts +0 -47
  74. package/src/providers/AnthropicProvider.ts +1 -87
  75. package/src/providers/GeminiApiProvider.ts +2 -83
  76. package/src/providers/GeminiModels.ts +0 -46
  77. package/src/providers/LmStudioProvider.ts +1 -7
  78. package/src/providers/MlxLmProvider.ts +1 -3
  79. package/src/providers/MockProvider.ts +0 -9
  80. package/src/providers/OllamaProvider.ts +1 -7
  81. package/src/providers/OpenAIModels.ts +0 -64
  82. package/src/providers/OpenAIProvider.ts +2 -83
  83. package/dist/ContextManagement.d.ts +0 -78
  84. package/dist/ContextManagement.d.ts.map +0 -1
  85. package/dist/ContextManagement.js +0 -222
  86. package/dist/ContextManagement.js.map +0 -1
  87. package/dist/Conversation.d.ts +0 -18
  88. package/dist/Conversation.d.ts.map +0 -1
  89. package/dist/Conversation.js +0 -17
  90. package/dist/Conversation.js.map +0 -1
  91. package/dist/RateLimiter.d.ts +0 -44
  92. package/dist/RateLimiter.d.ts.map +0 -1
  93. package/dist/RateLimiter.js +0 -155
  94. package/dist/RateLimiter.js.map +0 -1
  95. package/dist/observability/MeteredLlmService.d.ts +0 -16
  96. package/dist/observability/MeteredLlmService.d.ts.map +0 -1
  97. package/dist/observability/MeteredLlmService.js +0 -72
  98. package/dist/observability/MeteredLlmService.js.map +0 -1
  99. package/dist/observability/Metrics.d.ts +0 -76
  100. package/dist/observability/Metrics.d.ts.map +0 -1
  101. package/dist/observability/Metrics.js +0 -152
  102. package/dist/observability/Metrics.js.map +0 -1
  103. package/dist/observability/StructuredLogger.d.ts +0 -31
  104. package/dist/observability/StructuredLogger.d.ts.map +0 -1
  105. package/dist/observability/StructuredLogger.js +0 -39
  106. package/dist/observability/StructuredLogger.js.map +0 -1
  107. package/dist/observability/Tracing.d.ts +0 -38
  108. package/dist/observability/Tracing.d.ts.map +0 -1
  109. package/dist/observability/Tracing.js +0 -80
  110. package/dist/observability/Tracing.js.map +0 -1
  111. package/dist/providers/OpenCodeModels.d.ts +0 -61
  112. package/dist/providers/OpenCodeModels.d.ts.map +0 -1
  113. package/dist/providers/OpenCodeModels.js +0 -53
  114. package/dist/providers/OpenCodeModels.js.map +0 -1
  115. package/dist/providers/OpenCodeProvider.d.ts +0 -10
  116. package/dist/providers/OpenCodeProvider.d.ts.map +0 -1
  117. package/dist/providers/OpenCodeProvider.js +0 -154
  118. package/dist/providers/OpenCodeProvider.js.map +0 -1
  119. package/dist/tools/Tool.d.ts +0 -83
  120. package/dist/tools/Tool.d.ts.map +0 -1
  121. package/dist/tools/Tool.js +0 -278
  122. package/dist/tools/Tool.js.map +0 -1
  123. package/dist/tools/ToolCallingExecutor.d.ts +0 -18
  124. package/dist/tools/ToolCallingExecutor.d.ts.map +0 -1
  125. package/dist/tools/ToolCallingExecutor.js +0 -64
  126. package/dist/tools/ToolCallingExecutor.js.map +0 -1
  127. package/dist/tools/ToolRegistry.d.ts +0 -45
  128. package/dist/tools/ToolRegistry.d.ts.map +0 -1
  129. package/dist/tools/ToolRegistry.js +0 -133
  130. package/dist/tools/ToolRegistry.js.map +0 -1
  131. package/src/ContextManagement.ts +0 -367
  132. package/src/Conversation.ts +0 -21
  133. package/src/RateLimiter.ts +0 -238
  134. package/src/observability/MeteredLlmService.ts +0 -168
  135. package/src/observability/Metrics.ts +0 -200
  136. package/src/observability/StructuredLogger.ts +0 -67
  137. package/src/observability/Tracing.ts +0 -146
  138. package/src/providers/OpenCodeModels.ts +0 -60
  139. package/src/providers/OpenCodeProvider.ts +0 -278
  140. package/src/tools/Tool.ts +0 -376
  141. package/src/tools/ToolCallingExecutor.ts +0 -106
  142. 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, InvalidRequestError, ParseError, type LlmError } from "../Errors.ts"
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, InvalidRequestError, ParseError, type LlmError } from "../Errors.ts"
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, InvalidRequestError, ParseError, type LlmError } from "../Errors.ts"
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":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAmB,MAAM,mBAAmB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;;;;AAE9C,qBAAa,mBAAoB,SAAQ,wBAEvC;CAAG;;;;AAEL,qBAAa,kBAAmB,SAAQ,uBAEtC;CAAG;;;;AAEL,qBAAa,0BAA2B,SAAQ,+BAK/C;CAAG;;;;AAEJ,qBAAa,qBAAsB,SAAQ,0BAK1C;CAAG;AAEJ,eAAO,MAAM,YAAY,iJAKvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;;;;;AAEnD,qBAAa,aAAc,SAAQ,kBAGjC;CAAG;;;;;;;AAEL,qBAAa,aAAc,SAAQ,kBAKjC;CAAG;;AAEL,qBAAa,cAAe,SAAQ,mBAA0D;CAAG;;AAEjG,qBAAa,aAAc,SAAQ,kBAAwD;CAAG;;AAE9F,qBAAa,aAAc,SAAQ,kBAAwD;CAAG;;;;AAE9F,qBAAa,oBAAqB,SAAQ,yBAKzC;CAAG;AAEJ,eAAO,MAAM,uBAAuB,yHAKlC,CAAA;AACF,MAAM,MAAM,uBAAuB,GAAG,OAAO,uBAAuB,CAAC,IAAI,CAAA;AAEzE,eAAO,MAAM,yBAAyB;;;;4DAIe,oBAAoB;EAEvE,CAAA;AAEF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IACnE,QAAQ,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,mBAAmB,KAAK,MAAM,CAAA;IACtF,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,mBAAmB,CAAC,KAAK,MAAM,CAAA;CACnG;AAsCD,eAAO,MAAM,mBAAmB,EAAE,YAKjC,CAAA;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,KAAK;IAC1C,QAAQ,CAAC,SAAS,EAAE,CAClB,QAAQ,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC5C,YAAY,EAAE,MAAM,KACjB,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;CACzD;AAED,eAAO,MAAM,uBAAuB,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAqCpE,CAAA;AAuGD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC5C,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,cAAc,GAAG,aAAa,GAAG,aAAa,EACxD,YAAY,CAAC,EAAE,YAAY,GAC1B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,CAAA;AAC7C,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC5C,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,uBAAuB,EACjC,YAAY,CAAC,EAAE,YAAY,GAC1B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AAC5D,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,QAAQ,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC5C,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,uBAAuB,EACjC,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC/B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA"}