@llm4ts/core 2.9.0 → 2.9.2
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.
|
@@ -14,6 +14,8 @@ import type { ProcessExecutorShape } from "../ProcessExecutor.ts";
|
|
|
14
14
|
export declare const claudeReadOnlyTools = "Read,Grep,Glob,Skill";
|
|
15
15
|
export declare const claudeCliExtraArgs: (config: CliConnectorConfig) => ReadonlyArray<string>;
|
|
16
16
|
export declare const claudeCliInitModel: (line: string) => string | undefined;
|
|
17
|
+
/** The text of a `result` event that reports an error, if the line is one. */
|
|
18
|
+
export declare const claudeCliErrorResult: (line: string) => string | undefined;
|
|
17
19
|
export declare const parseClaudeCliStreamLine: (line: string) => ReadonlyArray<LlmChunk>;
|
|
18
20
|
export declare const makeClaudeCliConnector: (config: CliConnectorConfig, executor: ProcessExecutorShape) => CliConnectorShape;
|
|
19
21
|
//# sourceMappingURL=ClaudeCliConnector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeCliConnector.d.ts","sourceRoot":"","sources":["../../src/providers/ClaudeCliConnector.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAG/D,OAAO,EAGL,QAAQ,EAGT,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAiBjE;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,yBAAyB,CAAA;AAEzD,eAAO,MAAM,kBAAkB,GAAI,QAAQ,kBAAkB,KAAG,aAAa,CAAC,MAAM,CAQnF,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAK1D,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,QAAQ,CA4D7E,CAAA;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,kBAAkB,EAC1B,UAAU,oBAAoB,KAC7B,
|
|
1
|
+
{"version":3,"file":"ClaudeCliConnector.d.ts","sourceRoot":"","sources":["../../src/providers/ClaudeCliConnector.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAG/D,OAAO,EAGL,QAAQ,EAGT,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAiBjE;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,yBAAyB,CAAA;AAEzD,eAAO,MAAM,kBAAkB,GAAI,QAAQ,kBAAkB,KAAG,aAAa,CAAC,MAAM,CAQnF,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAK1D,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAQ5D,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,QAAQ,CA4D7E,CAAA;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,kBAAkB,EAC1B,UAAU,oBAAoB,KAC7B,iBAgIF,CAAA"}
|
|
@@ -31,6 +31,16 @@ export const claudeCliInitModel = (line) => {
|
|
|
31
31
|
? jsonStringField(json, "model")
|
|
32
32
|
: undefined;
|
|
33
33
|
};
|
|
34
|
+
/** The text of a `result` event that reports an error, if the line is one. */
|
|
35
|
+
export const claudeCliErrorResult = (line) => {
|
|
36
|
+
const json = parseJsonLine(line);
|
|
37
|
+
if (json === undefined || jsonStringField(json, "type") !== "result") {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const failed = jsonField(json, "is_error") === true;
|
|
41
|
+
const text = jsonStringField(json, "result");
|
|
42
|
+
return failed && text !== undefined && text.trim().length > 0 ? text : undefined;
|
|
43
|
+
};
|
|
34
44
|
export const parseClaudeCliStreamLine = (line) => {
|
|
35
45
|
const json = parseJsonLine(line);
|
|
36
46
|
if (json === undefined) {
|
|
@@ -91,19 +101,32 @@ export const makeClaudeCliConnector = (config, executor) => {
|
|
|
91
101
|
const complete = Effect.fn("@llm4ts/core/providers/ClaudeCliConnector.complete")(function* (prompt) {
|
|
92
102
|
const result = yield* executor.runWithStdin(["claude", "--print", ...extraArgs], cwd, config.envVars, prompt);
|
|
93
103
|
if (result.exitCode !== 0) {
|
|
94
|
-
|
|
104
|
+
// claude explains most refusals on stdout (a usage limit), but a
|
|
105
|
+
// startup failure only on stderr: an empty reason is useless, so both
|
|
106
|
+
// streams are reported.
|
|
107
|
+
const raw = [...result.stdout, ...result.stderr].join("\n").trim();
|
|
95
108
|
return yield* failClassifiedCliError("claude", `claude exited with code ${result.exitCode}`, raw);
|
|
96
109
|
}
|
|
97
110
|
return result.stdout.join("\n");
|
|
98
111
|
});
|
|
99
|
-
const completeStream = (prompt) => Stream.unwrap(Effect.map(Ref.make(undefined), (model) => executor
|
|
112
|
+
const completeStream = (prompt) => Stream.unwrap(Effect.map(Effect.all([Ref.make(undefined), Ref.make("")]), ([model, said]) => executor
|
|
100
113
|
.runStreamingWithStdin(["claude", "--print", "--output-format", "stream-json", "--verbose", ...extraArgs], cwd, config.envVars, prompt)
|
|
101
114
|
.pipe(Stream.mapEffect((line) => {
|
|
102
115
|
const initializedModel = claudeCliInitModel(line);
|
|
116
|
+
const refusal = claudeCliErrorResult(line);
|
|
117
|
+
const noted = refusal === undefined ? Effect.void : Ref.set(said, refusal);
|
|
103
118
|
return initializedModel === undefined
|
|
104
|
-
? Effect.
|
|
105
|
-
: Ref.set(model, initializedModel).pipe(Effect.as(line));
|
|
106
|
-
}), Stream.flatMap((line) => Stream.fromIterable(parseClaudeCliStreamLine(line))),
|
|
119
|
+
? Effect.as(noted, line)
|
|
120
|
+
: Ref.set(model, initializedModel).pipe(Effect.andThen(noted), Effect.as(line));
|
|
121
|
+
}), Stream.flatMap((line) => Stream.fromIterable(parseClaudeCliStreamLine(line))),
|
|
122
|
+
// What claude last said is the reason when it then exits non-zero
|
|
123
|
+
// with an empty stderr (a bad model name, a usage limit): kept so
|
|
124
|
+
// the failure can name it instead of "exited with code 1".
|
|
125
|
+
Stream.tap((chunk) => chunk.delta.length === 0
|
|
126
|
+
? Effect.void
|
|
127
|
+
: Ref.update(said, (text) => `${text}${chunk.delta}`.slice(-2_000))), Stream.catchIf(() => true, (error) => Stream.unwrap(Effect.map(Ref.get(said), (text) => text.trim().length === 0
|
|
128
|
+
? Stream.fail(error)
|
|
129
|
+
: Stream.fromEffect(failClassifiedCliError("claude", error.message, text.trim()))))), Stream.mapEffect((chunk) => chunk.usage === undefined
|
|
107
130
|
? Effect.succeed(chunk)
|
|
108
131
|
: Effect.map(Ref.get(model), (servedModel) => servedModel === undefined
|
|
109
132
|
? chunk
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeCliConnector.js","sourceRoot":"","sources":["../../src/providers/ClaudeCliConnector.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ClaudeCliConnector.js","sourceRoot":"","sources":["../../src/providers/ClaudeCliConnector.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -58,6 +58,17 @@ export const claudeCliInitModel = (line: string): string | undefined => {
|
|
|
58
58
|
: undefined
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/** The text of a `result` event that reports an error, if the line is one. */
|
|
62
|
+
export const claudeCliErrorResult = (line: string): string | undefined => {
|
|
63
|
+
const json = parseJsonLine(line)
|
|
64
|
+
if (json === undefined || jsonStringField(json, "type") !== "result") {
|
|
65
|
+
return undefined
|
|
66
|
+
}
|
|
67
|
+
const failed = jsonField(json, "is_error") === true
|
|
68
|
+
const text = jsonStringField(json, "result")
|
|
69
|
+
return failed && text !== undefined && text.trim().length > 0 ? text : undefined
|
|
70
|
+
}
|
|
71
|
+
|
|
61
72
|
export const parseClaudeCliStreamLine = (line: string): ReadonlyArray<LlmChunk> => {
|
|
62
73
|
const json = parseJsonLine(line)
|
|
63
74
|
if (json === undefined) {
|
|
@@ -137,7 +148,10 @@ export const makeClaudeCliConnector = (
|
|
|
137
148
|
prompt
|
|
138
149
|
)
|
|
139
150
|
if (result.exitCode !== 0) {
|
|
140
|
-
|
|
151
|
+
// claude explains most refusals on stdout (a usage limit), but a
|
|
152
|
+
// startup failure only on stderr: an empty reason is useless, so both
|
|
153
|
+
// streams are reported.
|
|
154
|
+
const raw = [...result.stdout, ...result.stderr].join("\n").trim()
|
|
141
155
|
return yield* failClassifiedCliError(
|
|
142
156
|
"claude",
|
|
143
157
|
`claude exited with code ${result.exitCode}`,
|
|
@@ -149,38 +163,63 @@ export const makeClaudeCliConnector = (
|
|
|
149
163
|
|
|
150
164
|
const completeStream = (prompt: string) =>
|
|
151
165
|
Stream.unwrap(
|
|
152
|
-
Effect.map(
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
166
|
+
Effect.map(
|
|
167
|
+
Effect.all([Ref.make<string | undefined>(undefined), Ref.make("")]),
|
|
168
|
+
([model, said]) =>
|
|
169
|
+
executor
|
|
170
|
+
.runStreamingWithStdin(
|
|
171
|
+
["claude", "--print", "--output-format", "stream-json", "--verbose", ...extraArgs],
|
|
172
|
+
cwd,
|
|
173
|
+
config.envVars,
|
|
174
|
+
prompt
|
|
175
|
+
)
|
|
176
|
+
.pipe(
|
|
177
|
+
Stream.mapEffect((line) => {
|
|
178
|
+
const initializedModel = claudeCliInitModel(line)
|
|
179
|
+
const refusal = claudeCliErrorResult(line)
|
|
180
|
+
const noted = refusal === undefined ? Effect.void : Ref.set(said, refusal)
|
|
181
|
+
return initializedModel === undefined
|
|
182
|
+
? Effect.as(noted, line)
|
|
183
|
+
: Ref.set(model, initializedModel).pipe(Effect.andThen(noted), Effect.as(line))
|
|
184
|
+
}),
|
|
185
|
+
Stream.flatMap((line) => Stream.fromIterable(parseClaudeCliStreamLine(line))),
|
|
186
|
+
// What claude last said is the reason when it then exits non-zero
|
|
187
|
+
// with an empty stderr (a bad model name, a usage limit): kept so
|
|
188
|
+
// the failure can name it instead of "exited with code 1".
|
|
189
|
+
Stream.tap((chunk) =>
|
|
190
|
+
chunk.delta.length === 0
|
|
191
|
+
? Effect.void
|
|
192
|
+
: Ref.update(said, (text) => `${text}${chunk.delta}`.slice(-2_000))
|
|
193
|
+
),
|
|
194
|
+
Stream.catchIf(
|
|
195
|
+
() => true,
|
|
196
|
+
(error) =>
|
|
197
|
+
Stream.unwrap(
|
|
198
|
+
Effect.map(Ref.get(said), (text) =>
|
|
199
|
+
text.trim().length === 0
|
|
200
|
+
? Stream.fail(error)
|
|
201
|
+
: Stream.fromEffect(
|
|
202
|
+
failClassifiedCliError("claude", error.message, text.trim())
|
|
203
|
+
)
|
|
204
|
+
)
|
|
181
205
|
)
|
|
206
|
+
),
|
|
207
|
+
Stream.mapEffect((chunk) =>
|
|
208
|
+
chunk.usage === undefined
|
|
209
|
+
? Effect.succeed(chunk)
|
|
210
|
+
: Effect.map(Ref.get(model), (servedModel) =>
|
|
211
|
+
servedModel === undefined
|
|
212
|
+
? chunk
|
|
213
|
+
: LlmChunk.make({
|
|
214
|
+
...chunk,
|
|
215
|
+
metadata: {
|
|
216
|
+
...chunk.metadata,
|
|
217
|
+
model: servedModel
|
|
218
|
+
}
|
|
219
|
+
})
|
|
220
|
+
)
|
|
221
|
+
)
|
|
182
222
|
)
|
|
183
|
-
)
|
|
184
223
|
)
|
|
185
224
|
)
|
|
186
225
|
|