@llm4ts/core 2.9.0 → 2.9.1

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,iBAoGF,CAAA"}
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
- const raw = result.stdout.join("\n");
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.succeed(line)
105
- : Ref.set(model, initializedModel).pipe(Effect.as(line));
106
- }), Stream.flatMap((line) => Stream.fromIterable(parseClaudeCliStreamLine(line))), Stream.mapEffect((chunk) => chunk.usage === undefined
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llm4ts/core",
3
- "version": "2.9.0",
3
+ "version": "2.9.1",
4
4
  "description": "Effect-native LLM contracts, providers, tools, evaluation, and observability",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -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
- const raw = result.stdout.join("\n")
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(Ref.make<string | undefined>(undefined), (model) =>
153
- executor
154
- .runStreamingWithStdin(
155
- ["claude", "--print", "--output-format", "stream-json", "--verbose", ...extraArgs],
156
- cwd,
157
- config.envVars,
158
- prompt
159
- )
160
- .pipe(
161
- Stream.mapEffect((line) => {
162
- const initializedModel = claudeCliInitModel(line)
163
- return initializedModel === undefined
164
- ? Effect.succeed(line)
165
- : Ref.set(model, initializedModel).pipe(Effect.as(line))
166
- }),
167
- Stream.flatMap((line) => Stream.fromIterable(parseClaudeCliStreamLine(line))),
168
- Stream.mapEffect((chunk) =>
169
- chunk.usage === undefined
170
- ? Effect.succeed(chunk)
171
- : Effect.map(Ref.get(model), (servedModel) =>
172
- servedModel === undefined
173
- ? chunk
174
- : LlmChunk.make({
175
- ...chunk,
176
- metadata: {
177
- ...chunk.metadata,
178
- model: servedModel
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