@llm4ts/core 3.3.0 → 3.4.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/dist/ConnectorConfig.d.ts +3 -1
- package/dist/ConnectorConfig.d.ts.map +1 -1
- package/dist/ConnectorConfig.js +4 -17
- package/dist/ConnectorConfig.js.map +1 -1
- package/dist/Models.d.ts +177 -20
- package/dist/Models.d.ts.map +1 -1
- package/dist/Models.js +151 -98
- package/dist/Models.js.map +1 -1
- package/dist/eval/Eval.d.ts +4 -1
- package/dist/eval/Eval.d.ts.map +1 -1
- package/dist/eval/Eval.js.map +1 -1
- package/dist/eval/Evaluator.d.ts +2 -6
- package/dist/eval/Evaluator.d.ts.map +1 -1
- package/dist/eval/Evaluator.js.map +1 -1
- package/dist/providers/AntigravityConnector.d.ts.map +1 -1
- package/dist/providers/AntigravityConnector.js +5 -4
- package/dist/providers/AntigravityConnector.js.map +1 -1
- package/dist/providers/ClaudeAgentSession.d.ts.map +1 -1
- package/dist/providers/ClaudeAgentSession.js +3 -2
- package/dist/providers/ClaudeAgentSession.js.map +1 -1
- package/dist/providers/ClaudeCliConnector.d.ts.map +1 -1
- package/dist/providers/ClaudeCliConnector.js +7 -6
- package/dist/providers/ClaudeCliConnector.js.map +1 -1
- package/dist/providers/CodexConnector.d.ts.map +1 -1
- package/dist/providers/CodexConnector.js +8 -7
- package/dist/providers/CodexConnector.js.map +1 -1
- package/dist/providers/ConnectorFactories.d.ts.map +1 -1
- package/dist/providers/ConnectorFactories.js +26 -20
- package/dist/providers/ConnectorFactories.js.map +1 -1
- package/dist/providers/CopilotConnector.d.ts.map +1 -1
- package/dist/providers/CopilotConnector.js +5 -4
- package/dist/providers/CopilotConnector.js.map +1 -1
- package/dist/providers/CursorConnector.d.ts.map +1 -1
- package/dist/providers/CursorConnector.js +6 -5
- package/dist/providers/CursorConnector.js.map +1 -1
- package/dist/providers/GeminiAcpSession.d.ts.map +1 -1
- package/dist/providers/GeminiAcpSession.js +3 -1
- package/dist/providers/GeminiAcpSession.js.map +1 -1
- package/dist/providers/GeminiCliProvider.d.ts.map +1 -1
- package/dist/providers/GeminiCliProvider.js +4 -3
- package/dist/providers/GeminiCliProvider.js.map +1 -1
- package/dist/providers/GrokCliConnector.d.ts.map +1 -1
- package/dist/providers/GrokCliConnector.js +11 -5
- package/dist/providers/GrokCliConnector.js.map +1 -1
- package/dist/providers/OpenCodeCliConnector.d.ts.map +1 -1
- package/dist/providers/OpenCodeCliConnector.js +6 -5
- package/dist/providers/OpenCodeCliConnector.js.map +1 -1
- package/dist/providers/PiConnector.d.ts.map +1 -1
- package/dist/providers/PiConnector.js +8 -7
- package/dist/providers/PiConnector.js.map +1 -1
- package/package.json +1 -1
- package/src/ConnectorConfig.ts +18 -17
- package/src/Models.ts +245 -100
- package/src/eval/Eval.ts +4 -1
- package/src/eval/Evaluator.ts +2 -5
- package/src/providers/AntigravityConnector.ts +12 -4
- package/src/providers/ClaudeAgentSession.ts +4 -2
- package/src/providers/ClaudeCliConnector.ts +9 -6
- package/src/providers/CodexConnector.ts +10 -7
- package/src/providers/ConnectorFactories.ts +53 -51
- package/src/providers/CopilotConnector.ts +6 -4
- package/src/providers/CursorConnector.ts +7 -5
- package/src/providers/GeminiAcpSession.ts +4 -1
- package/src/providers/GeminiCliProvider.ts +6 -3
- package/src/providers/GrokCliConnector.ts +12 -5
- package/src/providers/OpenCodeCliConnector.ts +7 -5
- package/src/providers/PiConnector.ts +15 -7
|
@@ -2,8 +2,9 @@ import * as Effect from "effect/Effect";
|
|
|
2
2
|
import * as Stream from "effect/Stream";
|
|
3
3
|
import { makeCliConnector } from "../Connector.js";
|
|
4
4
|
import { InvalidRequestError, ProviderError } from "../Errors.js";
|
|
5
|
-
import { ConnectorCapabilities, ConnectorIds, LlmChunk, TokenUsage } from "../Models.js";
|
|
5
|
+
import { ConnectorCapabilities, ConnectorIds, LlmChunk, TokenUsage, cliExecutable } from "../Models.js";
|
|
6
6
|
import { atLeastVersion, effortWord, cumulativeUsage, failClassifiedCliError, jsonBooleanField, jsonField, jsonIntField, jsonStringField, optionalModelArgs, parseJsonLine, parseJsonOutput, sortedFlagArgs, toolEventChunk, toolResultChunk, toolResultText, usageEventChunk, versionTriple, statusChunk } from "./CliSupport.js";
|
|
7
|
+
const executable = cliExecutable("Pi");
|
|
7
8
|
/**
|
|
8
9
|
* `pi auth check --model <model> --no-refresh --json` says whether pi holds
|
|
9
10
|
* credentials for the provider that model resolves to:
|
|
@@ -189,7 +190,7 @@ export const makePiConnector = (config, executor) => {
|
|
|
189
190
|
let floorChecked = !config.readOnly;
|
|
190
191
|
const checkFloorOnce = Effect.suspend(() => floorChecked
|
|
191
192
|
? Effect.void
|
|
192
|
-
: Effect.flatMap(executor.run([
|
|
193
|
+
: Effect.flatMap(executor.run([executable, "--version"], cwd, config.envVars), (result) => {
|
|
193
194
|
const problem = piReadOnlyProblem([...result.stdout, ...result.stderr].join("\n"));
|
|
194
195
|
return problem === undefined
|
|
195
196
|
? Effect.sync(() => {
|
|
@@ -199,7 +200,7 @@ export const makePiConnector = (config, executor) => {
|
|
|
199
200
|
}));
|
|
200
201
|
const complete = Effect.fn("@llm4ts/core/providers/PiConnector.complete")(function* (prompt) {
|
|
201
202
|
yield* checkFloorOnce;
|
|
202
|
-
const result = yield* executor.runWithStdin([
|
|
203
|
+
const result = yield* executor.runWithStdin([executable, "-p", ...extraArgs], cwd, config.envVars, prompt);
|
|
203
204
|
if (result.exitCode !== 0) {
|
|
204
205
|
// pi explains a refusal on stderr (a usage error, a missing model, an
|
|
205
206
|
// auth failure); stdout is empty then, so both streams are reported.
|
|
@@ -212,7 +213,7 @@ export const makePiConnector = (config, executor) => {
|
|
|
212
213
|
}
|
|
213
214
|
return result.stdout.join("\n");
|
|
214
215
|
});
|
|
215
|
-
const completeStream = (prompt) => Stream.fromEffect(checkFloorOnce).pipe(Stream.drain, Stream.concat(executor.runStreamingWithStdin([
|
|
216
|
+
const completeStream = (prompt) => Stream.fromEffect(checkFloorOnce).pipe(Stream.drain, Stream.concat(executor.runStreamingWithStdin([executable, "-p", "--mode", "json", ...extraArgs], cwd, config.envVars, prompt)), Stream.flatMap((line) => Stream.fromIterable(parsePiStreamLine(line))),
|
|
216
217
|
// pi reports usage per assistant message; a turn is all of them.
|
|
217
218
|
cumulativeUsage, Stream.mapEffect((chunk) => {
|
|
218
219
|
const message = chunk.metadata.piError;
|
|
@@ -236,13 +237,13 @@ export const makePiConnector = (config, executor) => {
|
|
|
236
237
|
}),
|
|
237
238
|
// `--` ends the options (pi >= 0.84.3): a prompt starting with a dash
|
|
238
239
|
// is a prompt, not a flag. Stdin paths need no separator.
|
|
239
|
-
buildArgv: (prompt, _context) => [
|
|
240
|
-
buildInteractiveArgv: (_context) => [
|
|
240
|
+
buildArgv: (prompt, _context) => [executable, "-p", ...extraArgs, "--", prompt],
|
|
241
|
+
buildInteractiveArgv: (_context) => [executable, ...extraArgs],
|
|
241
242
|
complete,
|
|
242
243
|
completeStream,
|
|
243
244
|
versionProbe: {
|
|
244
245
|
executor,
|
|
245
|
-
binary:
|
|
246
|
+
binary: executable,
|
|
246
247
|
cwd,
|
|
247
248
|
...(config.model === undefined ? {} : { authProbe: piAuthProbe(config.model) })
|
|
248
249
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PiConnector.js","sourceRoot":"","sources":["../../src/providers/PiConnector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAA6C,MAAM,iBAAiB,CAAA;AAE7F,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAA;AAChF,OAAO,
|
|
1
|
+
{"version":3,"file":"PiConnector.js","sourceRoot":"","sources":["../../src/providers/PiConnector.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/ConnectorConfig.ts
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import * as Duration from "effect/Duration"
|
|
2
2
|
import * as Effect from "effect/Effect"
|
|
3
3
|
import * as Schema from "effect/Schema"
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
ConnectorId,
|
|
6
|
+
ConnectorIds,
|
|
7
|
+
Effort,
|
|
8
|
+
LlmConfig,
|
|
9
|
+
connectorRow,
|
|
10
|
+
type CliConnectorName,
|
|
11
|
+
type ConnectorName,
|
|
12
|
+
type LlmProvider
|
|
13
|
+
} from "./Models.ts"
|
|
5
14
|
|
|
6
15
|
export class DockerSandbox extends Schema.TaggedClass<DockerSandbox>()("Docker", {
|
|
7
16
|
image: Schema.String,
|
|
@@ -107,23 +116,15 @@ export class CliConnectorConfig extends Schema.TaggedClass<CliConnectorConfig>()
|
|
|
107
116
|
export const ConnectorConfig = Schema.Union([ApiConnectorConfig, CliConnectorConfig])
|
|
108
117
|
export type ConnectorConfig = typeof ConnectorConfig.Type
|
|
109
118
|
|
|
119
|
+
/** The config class the connector named `K` takes, by its kind in `connectorTable`. */
|
|
120
|
+
export type ConnectorConfigOf<K extends ConnectorName> = K extends CliConnectorName
|
|
121
|
+
? CliConnectorConfig
|
|
122
|
+
: ApiConnectorConfig
|
|
123
|
+
|
|
124
|
+
// An id that names no API connector reads as OpenAI, the wire most servers speak.
|
|
110
125
|
const providerForConnector = (connectorId: ConnectorId): LlmProvider => {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
return "Anthropic"
|
|
114
|
-
case "gemini-api":
|
|
115
|
-
return "GeminiApi"
|
|
116
|
-
case "lm-studio":
|
|
117
|
-
return "LmStudio"
|
|
118
|
-
case "ollama":
|
|
119
|
-
return "Ollama"
|
|
120
|
-
case "mlx-lm":
|
|
121
|
-
return "MlxLm"
|
|
122
|
-
case "mock":
|
|
123
|
-
return "Mock"
|
|
124
|
-
default:
|
|
125
|
-
return "OpenAI"
|
|
126
|
-
}
|
|
126
|
+
const row = connectorRow(connectorId)
|
|
127
|
+
return row?.kind === "Api" ? (row.provider ?? "OpenAI") : "OpenAI"
|
|
127
128
|
}
|
|
128
129
|
|
|
129
130
|
export const toLlmConfig = (config: ApiConnectorConfig): LlmConfig =>
|
package/src/Models.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as Duration from "effect/Duration"
|
|
2
2
|
import * as Effect from "effect/Effect"
|
|
3
|
+
import * as Record from "effect/Record"
|
|
3
4
|
import * as Schema from "effect/Schema"
|
|
4
5
|
|
|
5
6
|
export const LlmProvider = Schema.Literals([
|
|
@@ -19,119 +20,263 @@ export class ConnectorId extends Schema.Class<ConnectorId>("ConnectorId")({
|
|
|
19
20
|
value: Schema.String
|
|
20
21
|
}) {}
|
|
21
22
|
|
|
22
|
-
export const
|
|
23
|
-
|
|
24
|
-
Anthropic: new ConnectorId({ value: "anthropic" }),
|
|
25
|
-
GeminiApi: new ConnectorId({ value: "gemini-api" }),
|
|
26
|
-
LmStudio: new ConnectorId({ value: "lm-studio" }),
|
|
27
|
-
Ollama: new ConnectorId({ value: "ollama" }),
|
|
28
|
-
MlxLm: new ConnectorId({ value: "mlx-lm" }),
|
|
29
|
-
ClaudeCli: new ConnectorId({ value: "claude-cli" }),
|
|
30
|
-
GeminiCli: new ConnectorId({ value: "gemini-cli" }),
|
|
31
|
-
OpenCode: new ConnectorId({ value: "opencode" }),
|
|
32
|
-
Codex: new ConnectorId({ value: "codex" }),
|
|
33
|
-
Copilot: new ConnectorId({ value: "copilot" }),
|
|
34
|
-
Pi: new ConnectorId({ value: "pi" }),
|
|
35
|
-
AntigravityCli: new ConnectorId({ value: "antigravity-cli" }),
|
|
36
|
-
Grok: new ConnectorId({ value: "grok" }),
|
|
37
|
-
Cursor: new ConnectorId({ value: "cursor" }),
|
|
38
|
-
Mock: new ConnectorId({ value: "mock" })
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
export const apiConnectorIds: ReadonlyArray<ConnectorId> = Object.freeze([
|
|
42
|
-
ConnectorIds.OpenAI,
|
|
43
|
-
ConnectorIds.Anthropic,
|
|
44
|
-
ConnectorIds.GeminiApi,
|
|
45
|
-
ConnectorIds.LmStudio,
|
|
46
|
-
ConnectorIds.Ollama,
|
|
47
|
-
ConnectorIds.MlxLm
|
|
48
|
-
])
|
|
23
|
+
export const ConnectorKind = Schema.Literals(["Api", "Cli"])
|
|
24
|
+
export type ConnectorKind = typeof ConnectorKind.Type
|
|
49
25
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
26
|
+
interface ConnectorIdentity {
|
|
27
|
+
readonly id: string
|
|
28
|
+
/** The `LlmConfig` provider it serves. Such a row sits under the provider's own name. */
|
|
29
|
+
readonly provider?: LlmProvider
|
|
30
|
+
readonly baseUrl?: string
|
|
31
|
+
/**
|
|
32
|
+
* What an operator may write for it: a coder name on a CLI row
|
|
33
|
+
* (`LLM4TS_CODER`, `LLM4TS_REASONER`), a provider name on an API row
|
|
34
|
+
* (`LLM4TS_PROVIDER`). The first is the one help and menus show. Empty
|
|
35
|
+
* means it is not offered under any name.
|
|
36
|
+
*/
|
|
37
|
+
readonly names: ReadonlyArray<string>
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface ApiConnectorRow extends ConnectorIdentity {
|
|
41
|
+
readonly kind: "Api"
|
|
42
|
+
/** Environment variables that may hold its key; the first one set wins. */
|
|
43
|
+
readonly credentialVariables: ReadonlyArray<string>
|
|
44
|
+
/** Answers without a backend, so it is no part of `apiConnectorIds`. */
|
|
45
|
+
readonly simulated?: true
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface CliConnectorRow extends ConnectorIdentity {
|
|
49
|
+
readonly kind: "Cli"
|
|
50
|
+
/** The program it spawns, and the one looked for on `PATH`. */
|
|
51
|
+
readonly executable: string
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export type ConnectorRow = ApiConnectorRow | CliConnectorRow
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Every connector's identity, one row each. The id lists, the provider
|
|
58
|
+
* mappings and the names an operator may write are all read from here; the
|
|
59
|
+
* factories (`providers/ConnectorFactories.ts`) and the runner's presets are
|
|
60
|
+
* records keyed by these names, so a row without either does not compile.
|
|
61
|
+
*/
|
|
62
|
+
export const connectorTable = {
|
|
63
|
+
OpenAI: {
|
|
64
|
+
id: "openai",
|
|
65
|
+
kind: "Api",
|
|
66
|
+
provider: "OpenAI",
|
|
67
|
+
baseUrl: "https://api.openai.com/v1",
|
|
68
|
+
credentialVariables: ["OPENAI_API_KEY"],
|
|
69
|
+
names: ["openai"]
|
|
70
|
+
},
|
|
71
|
+
Anthropic: {
|
|
72
|
+
id: "anthropic",
|
|
73
|
+
kind: "Api",
|
|
74
|
+
provider: "Anthropic",
|
|
75
|
+
baseUrl: "https://api.anthropic.com",
|
|
76
|
+
credentialVariables: ["ANTHROPIC_API_KEY"],
|
|
77
|
+
names: ["anthropic"]
|
|
78
|
+
},
|
|
79
|
+
GeminiApi: {
|
|
80
|
+
id: "gemini-api",
|
|
81
|
+
kind: "Api",
|
|
82
|
+
provider: "GeminiApi",
|
|
83
|
+
baseUrl: "https://generativelanguage.googleapis.com",
|
|
84
|
+
credentialVariables: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
|
|
85
|
+
names: ["gemini", "gemini-api"]
|
|
86
|
+
},
|
|
87
|
+
LmStudio: {
|
|
88
|
+
id: "lm-studio",
|
|
89
|
+
kind: "Api",
|
|
90
|
+
provider: "LmStudio",
|
|
91
|
+
baseUrl: "http://localhost:1234/v1",
|
|
92
|
+
credentialVariables: [],
|
|
93
|
+
names: ["lm-studio", "lmstudio"]
|
|
94
|
+
},
|
|
95
|
+
Ollama: {
|
|
96
|
+
id: "ollama",
|
|
97
|
+
kind: "Api",
|
|
98
|
+
provider: "Ollama",
|
|
99
|
+
baseUrl: "http://localhost:11434",
|
|
100
|
+
credentialVariables: [],
|
|
101
|
+
names: ["ollama"]
|
|
102
|
+
},
|
|
103
|
+
MlxLm: {
|
|
104
|
+
id: "mlx-lm",
|
|
105
|
+
kind: "Api",
|
|
106
|
+
provider: "MlxLm",
|
|
107
|
+
baseUrl: "http://localhost:8080",
|
|
108
|
+
credentialVariables: [],
|
|
109
|
+
names: ["mlx-lm", "mlxlm", "mlx"]
|
|
110
|
+
},
|
|
111
|
+
ClaudeCli: {
|
|
112
|
+
id: "claude-cli",
|
|
113
|
+
kind: "Cli",
|
|
114
|
+
executable: "claude",
|
|
115
|
+
names: ["claude", "claude-cli"]
|
|
116
|
+
},
|
|
117
|
+
GeminiCli: {
|
|
118
|
+
id: "gemini-cli",
|
|
119
|
+
kind: "Cli",
|
|
120
|
+
provider: "GeminiCli",
|
|
121
|
+
executable: "gemini",
|
|
122
|
+
names: ["gemini", "gemini-cli"]
|
|
123
|
+
},
|
|
124
|
+
OpenCode: {
|
|
125
|
+
id: "opencode",
|
|
126
|
+
kind: "Cli",
|
|
127
|
+
provider: "OpenCode",
|
|
128
|
+
baseUrl: "http://localhost:4096",
|
|
129
|
+
executable: "opencode",
|
|
130
|
+
names: ["opencode"]
|
|
131
|
+
},
|
|
132
|
+
Codex: { id: "codex", kind: "Cli", executable: "codex", names: ["codex"] },
|
|
133
|
+
Copilot: { id: "copilot", kind: "Cli", executable: "gh", names: [] },
|
|
134
|
+
Pi: { id: "pi", kind: "Cli", executable: "pi", names: ["pi"] },
|
|
135
|
+
AntigravityCli: {
|
|
136
|
+
id: "antigravity-cli",
|
|
137
|
+
kind: "Cli",
|
|
138
|
+
executable: "agy",
|
|
139
|
+
names: ["agy", "antigravity", "antigravity-cli"]
|
|
140
|
+
},
|
|
141
|
+
Grok: { id: "grok", kind: "Cli", executable: "grok", names: ["grok"] },
|
|
142
|
+
Cursor: { id: "cursor", kind: "Cli", executable: "cursor-agent", names: ["cursor"] },
|
|
143
|
+
Mock: {
|
|
144
|
+
id: "mock",
|
|
145
|
+
kind: "Api",
|
|
146
|
+
provider: "Mock",
|
|
147
|
+
credentialVariables: [],
|
|
148
|
+
simulated: true,
|
|
149
|
+
names: ["mock"]
|
|
150
|
+
}
|
|
151
|
+
} as const satisfies Readonly<Record<string, ConnectorRow>>
|
|
152
|
+
|
|
153
|
+
export type ConnectorName = keyof typeof connectorTable
|
|
154
|
+
type RowOf<K extends ConnectorName> = (typeof connectorTable)[K]
|
|
155
|
+
|
|
156
|
+
export type CliConnectorName = {
|
|
157
|
+
[K in ConnectorName]: RowOf<K>["kind"] extends "Cli" ? K : never
|
|
158
|
+
}[ConnectorName]
|
|
159
|
+
export type ApiConnectorName = Exclude<ConnectorName, CliConnectorName>
|
|
160
|
+
|
|
161
|
+
/** Every name `LLM4TS_CODER` and `LLM4TS_REASONER` read. */
|
|
162
|
+
export type CoderName = RowOf<CliConnectorName>["names"][number]
|
|
163
|
+
/** Every name `LLM4TS_PROVIDER` and `LLM4TS_JUDGMENT_PROVIDER` read. */
|
|
164
|
+
export type ApiProviderName = RowOf<ApiConnectorName>["names"][number]
|
|
165
|
+
|
|
166
|
+
type OfferedCoder = {
|
|
167
|
+
[K in CliConnectorName]: RowOf<K>["names"] extends readonly [] ? never : K
|
|
168
|
+
}[CliConnectorName]
|
|
169
|
+
|
|
170
|
+
const rows: Readonly<Record<ConnectorName, ConnectorRow>> = connectorTable
|
|
171
|
+
const providerRows: { readonly [P in LlmProvider]: ConnectorRow & { readonly provider: P } } =
|
|
172
|
+
connectorTable
|
|
173
|
+
const names = Record.keys(connectorTable)
|
|
174
|
+
|
|
175
|
+
export const isCliConnectorName = (name: ConnectorName): name is CliConnectorName =>
|
|
176
|
+
rows[name].kind === "Cli"
|
|
177
|
+
|
|
178
|
+
export const ConnectorIds: Readonly<Record<ConnectorName, ConnectorId>> = Object.freeze(
|
|
179
|
+
Record.map(connectorTable, (row) => new ConnectorId({ value: row.id }))
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
const idsWhere = (keep: (row: ConnectorRow) => boolean): ReadonlyArray<ConnectorId> =>
|
|
183
|
+
Object.freeze(names.filter((name) => keep(rows[name])).map((name) => ConnectorIds[name]))
|
|
184
|
+
|
|
185
|
+
export const apiConnectorIds: ReadonlyArray<ConnectorId> = idsWhere(
|
|
186
|
+
(row) => row.kind === "Api" && row.simulated !== true
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
export const cliConnectorIds: ReadonlyArray<ConnectorId> = idsWhere((row) => row.kind === "Cli")
|
|
61
190
|
|
|
62
191
|
export const connectorIds: ReadonlyArray<ConnectorId> = Object.freeze([
|
|
63
192
|
...apiConnectorIds,
|
|
64
193
|
...cliConnectorIds,
|
|
65
|
-
|
|
194
|
+
...idsWhere((row) => row.kind === "Api" && row.simulated === true)
|
|
66
195
|
])
|
|
67
196
|
|
|
68
|
-
|
|
69
|
-
switch (provider) {
|
|
70
|
-
case "GeminiCli":
|
|
71
|
-
case "Mock":
|
|
72
|
-
return undefined
|
|
73
|
-
case "GeminiApi":
|
|
74
|
-
return "https://generativelanguage.googleapis.com"
|
|
75
|
-
case "OpenAI":
|
|
76
|
-
return "https://api.openai.com/v1"
|
|
77
|
-
case "Anthropic":
|
|
78
|
-
return "https://api.anthropic.com"
|
|
79
|
-
case "LmStudio":
|
|
80
|
-
return "http://localhost:1234/v1"
|
|
81
|
-
case "Ollama":
|
|
82
|
-
return "http://localhost:11434"
|
|
83
|
-
case "MlxLm":
|
|
84
|
-
return "http://localhost:8080"
|
|
85
|
-
case "OpenCode":
|
|
86
|
-
return "http://localhost:4096"
|
|
87
|
-
}
|
|
88
|
-
}
|
|
197
|
+
const rowsById = new Map<string, ConnectorRow>(names.map((name) => [rows[name].id, rows[name]]))
|
|
89
198
|
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
"lm-studio": "LmStudio",
|
|
95
|
-
ollama: "Ollama",
|
|
96
|
-
"mlx-lm": "MlxLm",
|
|
97
|
-
opencode: "OpenCode",
|
|
98
|
-
"gemini-cli": "GeminiCli",
|
|
99
|
-
mock: "Mock"
|
|
100
|
-
}
|
|
199
|
+
export const connectorRow = (id: ConnectorId): ConnectorRow | undefined => rowsById.get(id.value)
|
|
200
|
+
|
|
201
|
+
export const defaultBaseUrl = (provider: LlmProvider): string | undefined =>
|
|
202
|
+
providerRows[provider].baseUrl
|
|
101
203
|
|
|
102
204
|
export const connectorProvider = (id: ConnectorId): LlmProvider | undefined =>
|
|
103
|
-
|
|
205
|
+
connectorRow(id)?.provider
|
|
104
206
|
|
|
105
|
-
export const connectorDefaultBaseUrl = (id: ConnectorId): string | undefined =>
|
|
106
|
-
|
|
107
|
-
return provider === undefined ? undefined : defaultBaseUrl(provider)
|
|
108
|
-
}
|
|
207
|
+
export const connectorDefaultBaseUrl = (id: ConnectorId): string | undefined =>
|
|
208
|
+
connectorRow(id)?.baseUrl
|
|
109
209
|
|
|
110
|
-
export const providerConnectorId = (provider: LlmProvider): ConnectorId =>
|
|
111
|
-
switch (provider) {
|
|
112
|
-
case "GeminiCli":
|
|
113
|
-
return ConnectorIds.GeminiCli
|
|
114
|
-
case "GeminiApi":
|
|
115
|
-
return ConnectorIds.GeminiApi
|
|
116
|
-
case "OpenAI":
|
|
117
|
-
return ConnectorIds.OpenAI
|
|
118
|
-
case "Anthropic":
|
|
119
|
-
return ConnectorIds.Anthropic
|
|
120
|
-
case "LmStudio":
|
|
121
|
-
return ConnectorIds.LmStudio
|
|
122
|
-
case "Ollama":
|
|
123
|
-
return ConnectorIds.Ollama
|
|
124
|
-
case "MlxLm":
|
|
125
|
-
return ConnectorIds.MlxLm
|
|
126
|
-
case "OpenCode":
|
|
127
|
-
return ConnectorIds.OpenCode
|
|
128
|
-
case "Mock":
|
|
129
|
-
return ConnectorIds.Mock
|
|
130
|
-
}
|
|
131
|
-
}
|
|
210
|
+
export const providerConnectorId = (provider: LlmProvider): ConnectorId => ConnectorIds[provider]
|
|
132
211
|
|
|
133
|
-
|
|
134
|
-
|
|
212
|
+
const namedConnectors = <K extends ConnectorName>(keys: ReadonlyArray<K>): ReadonlyMap<string, K> =>
|
|
213
|
+
new Map(keys.flatMap((key) => rows[key].names.map((name) => [name, key] as const)))
|
|
214
|
+
|
|
215
|
+
const cliNames = names.filter(isCliConnectorName)
|
|
216
|
+
const apiNames = names.filter((name) => !isCliConnectorName(name))
|
|
217
|
+
const coderConnectors = namedConnectors(cliNames)
|
|
218
|
+
const apiProviderConnectors = namedConnectors(apiNames)
|
|
219
|
+
|
|
220
|
+
/** The CLI connector a coder name stands for; the name as written, lower case. */
|
|
221
|
+
export const coderConnector = (name: string): CliConnectorName | undefined =>
|
|
222
|
+
coderConnectors.get(name)
|
|
223
|
+
|
|
224
|
+
/** The API connector a provider name stands for; the name as written, lower case. */
|
|
225
|
+
export const apiProviderConnector = (name: string): ApiConnectorName | undefined =>
|
|
226
|
+
apiProviderConnectors.get(name)
|
|
227
|
+
|
|
228
|
+
export const coderNames: ReadonlyArray<CoderName> = cliNames.flatMap(
|
|
229
|
+
(name) => connectorTable[name].names
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
export const apiProviderNames: ReadonlyArray<ApiProviderName> = apiNames.flatMap(
|
|
233
|
+
(name) => connectorTable[name].names
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
/** Every variable an API connector reads its key from. Names only, never a value. */
|
|
237
|
+
export const credentialVariables: ReadonlyArray<string> = apiNames.flatMap(
|
|
238
|
+
(name) => connectorTable[name].credentialVariables
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
export const cliExecutable = <K extends CliConnectorName>(name: K): RowOf<K>["executable"] =>
|
|
242
|
+
connectorTable[name].executable
|
|
243
|
+
|
|
244
|
+
const inOrder =
|
|
245
|
+
<All extends string>() =>
|
|
246
|
+
<const L extends ReadonlyArray<All>>(
|
|
247
|
+
list: L,
|
|
248
|
+
..._missing: [Exclude<All, L[number]>] extends [never] ? [] : [missing: Exclude<All, L[number]>]
|
|
249
|
+
): L =>
|
|
250
|
+
list
|
|
251
|
+
|
|
252
|
+
/** The coding agents help and menus offer, in the order they show them. */
|
|
253
|
+
export const offeredCoders = inOrder<OfferedCoder>()([
|
|
254
|
+
"ClaudeCli",
|
|
255
|
+
"Codex",
|
|
256
|
+
"GeminiCli",
|
|
257
|
+
"Pi",
|
|
258
|
+
"AntigravityCli",
|
|
259
|
+
"Grok",
|
|
260
|
+
"Cursor",
|
|
261
|
+
"OpenCode"
|
|
262
|
+
])
|
|
263
|
+
|
|
264
|
+
/** The API providers help and errors offer, in the order they show them. */
|
|
265
|
+
export const offeredApiProviders = inOrder<ApiConnectorName>()([
|
|
266
|
+
"Mock",
|
|
267
|
+
"OpenAI",
|
|
268
|
+
"Anthropic",
|
|
269
|
+
"GeminiApi",
|
|
270
|
+
"LmStudio",
|
|
271
|
+
"Ollama",
|
|
272
|
+
"MlxLm"
|
|
273
|
+
])
|
|
274
|
+
|
|
275
|
+
export const offeredCoderNames = offeredCoders.map((name) => connectorTable[name].names[0])
|
|
276
|
+
|
|
277
|
+
export const offeredApiProviderNames = offeredApiProviders.map(
|
|
278
|
+
(name) => connectorTable[name].names[0]
|
|
279
|
+
)
|
|
135
280
|
|
|
136
281
|
export const MessageRole = Schema.Literals(["System", "User", "Assistant", "Tool"])
|
|
137
282
|
export type MessageRole = typeof MessageRole.Type
|
package/src/eval/Eval.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect"
|
|
2
2
|
import * as Schema from "effect/Schema"
|
|
3
3
|
import type { LlmError } from "../Errors.ts"
|
|
4
|
-
import type { Evaluator } from "./Evaluator.ts"
|
|
5
4
|
|
|
6
5
|
export class Dimension extends Schema.Class<Dimension>("Dimension")({
|
|
7
6
|
name: Schema.String,
|
|
@@ -87,6 +86,10 @@ export class RepeatedEval extends Schema.Class<RepeatedEval>("RepeatedEval")({
|
|
|
87
86
|
const median = (sorted: ReadonlyArray<number>): number =>
|
|
88
87
|
sorted.length === 0 ? 0 : (sorted[Math.floor((sorted.length - 1) / 2)] ?? 0)
|
|
89
88
|
|
|
89
|
+
export interface Evaluator<in In> {
|
|
90
|
+
readonly evaluate: (input: In) => Effect.Effect<EvalResult, LlmError>
|
|
91
|
+
}
|
|
92
|
+
|
|
90
93
|
export const repeat = Effect.fn("@llm4ts/core/eval/Eval.repeat")(function* <In>(
|
|
91
94
|
evaluator: Evaluator<In>,
|
|
92
95
|
input: In,
|
package/src/eval/Evaluator.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect"
|
|
2
|
-
import type
|
|
3
|
-
import { EvalResult } from "./Eval.ts"
|
|
2
|
+
import { EvalResult, type Evaluator } from "./Eval.ts"
|
|
4
3
|
|
|
5
|
-
export
|
|
6
|
-
readonly evaluate: (input: In) => Effect.Effect<EvalResult, LlmError>
|
|
7
|
-
}
|
|
4
|
+
export type { Evaluator }
|
|
8
5
|
|
|
9
6
|
export const makeEvaluator = <In>(evaluate: Evaluator<In>["evaluate"]): Evaluator<In> => ({
|
|
10
7
|
evaluate
|
|
@@ -2,10 +2,18 @@ import * as Effect from "effect/Effect"
|
|
|
2
2
|
import * as Stream from "effect/Stream"
|
|
3
3
|
import { makeCliConnector, type CliConnectorShape } from "../Connector.ts"
|
|
4
4
|
import type { CliConnectorConfig } from "../ConnectorConfig.ts"
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
ConnectorCapabilities,
|
|
7
|
+
ConnectorIds,
|
|
8
|
+
HealthStatus,
|
|
9
|
+
LlmChunk,
|
|
10
|
+
cliExecutable
|
|
11
|
+
} from "../Models.ts"
|
|
6
12
|
import type { ProcessExecutorShape } from "../ProcessExecutor.ts"
|
|
7
13
|
import { failClassifiedCliError, optionalModelArgs, sortedFlagArgs } from "./CliSupport.ts"
|
|
8
14
|
|
|
15
|
+
const executable = cliExecutable("AntigravityCli")
|
|
16
|
+
|
|
9
17
|
// `agy --version` proves the install, not the login: the CLI offers no offline
|
|
10
18
|
// login check, so the auth status stays Unknown rather than claiming a session.
|
|
11
19
|
const healthy = HealthStatus.make({
|
|
@@ -33,14 +41,14 @@ export const antigravityExtraArgs = (config: CliConnectorConfig): ReadonlyArray<
|
|
|
33
41
|
export const buildAntigravityArgv = (
|
|
34
42
|
config: CliConnectorConfig,
|
|
35
43
|
prompt: string
|
|
36
|
-
): ReadonlyArray<string> => [
|
|
44
|
+
): ReadonlyArray<string> => [executable, ...antigravityExtraArgs(config), "--print", prompt]
|
|
37
45
|
|
|
38
46
|
export const makeAntigravityConnector = (
|
|
39
47
|
config: CliConnectorConfig,
|
|
40
48
|
executor: ProcessExecutorShape
|
|
41
49
|
): CliConnectorShape => {
|
|
42
50
|
const cwd = config.workingDir ?? "."
|
|
43
|
-
const healthCheck = executor.run([
|
|
51
|
+
const healthCheck = executor.run([executable, "--version"], cwd, {}).pipe(
|
|
44
52
|
Effect.map((result) => (result.exitCode === 0 ? healthy : unhealthy)),
|
|
45
53
|
Effect.catch(() => Effect.succeed(unhealthy))
|
|
46
54
|
)
|
|
@@ -75,7 +83,7 @@ export const makeAntigravityConnector = (
|
|
|
75
83
|
// therefore cost summaries and budgets) cannot include it.
|
|
76
84
|
capabilities: ConnectorCapabilities.make({ interactiveSessions: true, usageReporting: false }),
|
|
77
85
|
buildArgv: (prompt, _context) => buildAntigravityArgv(config, prompt),
|
|
78
|
-
buildInteractiveArgv: (_context) => [
|
|
86
|
+
buildInteractiveArgv: (_context) => [executable, ...antigravityExtraArgs(config)],
|
|
79
87
|
complete,
|
|
80
88
|
completeStream,
|
|
81
89
|
healthCheck
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
type SessionEvent
|
|
17
17
|
} from "../AgentSession.ts"
|
|
18
18
|
import { ProviderError, type LlmError } from "../Errors.ts"
|
|
19
|
-
import { TokenUsage } from "../Models.ts"
|
|
19
|
+
import { TokenUsage, cliExecutable } from "../Models.ts"
|
|
20
20
|
import type { ProcessExecutorShape } from "../ProcessExecutor.ts"
|
|
21
21
|
import {
|
|
22
22
|
jsonArray,
|
|
@@ -30,11 +30,13 @@ import {
|
|
|
30
30
|
type JsonValue
|
|
31
31
|
} from "./CliSupport.ts"
|
|
32
32
|
|
|
33
|
+
const executable = cliExecutable("ClaudeCli")
|
|
34
|
+
|
|
33
35
|
export const claudeSessionArgv = (
|
|
34
36
|
model: string | undefined,
|
|
35
37
|
extraFlags: ReadonlyArray<string>
|
|
36
38
|
): ReadonlyArray<string> => [
|
|
37
|
-
|
|
39
|
+
executable,
|
|
38
40
|
"--print",
|
|
39
41
|
"--input-format",
|
|
40
42
|
"stream-json",
|