@owlmeans/llm 0.1.16 → 0.1.18-rc.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 (56) hide show
  1. package/README.md +1 -0
  2. package/agent-meta/manifest.json +2 -2
  3. package/agent-meta/skills/llm/SKILL.md +29 -12
  4. package/build/consts.d.ts +7 -0
  5. package/build/consts.d.ts.map +1 -1
  6. package/build/consts.js +7 -0
  7. package/build/consts.js.map +1 -1
  8. package/build/errors.d.ts.map +1 -1
  9. package/build/errors.js.map +1 -1
  10. package/build/execution/service.d.ts.map +1 -1
  11. package/build/execution/service.js.map +1 -1
  12. package/build/execution/utils.d.ts.map +1 -1
  13. package/build/helpers/cache.d.ts.map +1 -1
  14. package/build/helpers/json.d.ts.map +1 -1
  15. package/build/helpers/messages.d.ts.map +1 -1
  16. package/build/helpers/retry.d.ts.map +1 -1
  17. package/build/helpers/spectate.d.ts.map +1 -1
  18. package/build/model.d.ts.map +1 -1
  19. package/build/model.js +2 -1
  20. package/build/model.js.map +1 -1
  21. package/build/plugins/anthropic.d.ts.map +1 -1
  22. package/build/plugins/anthropic.js +12 -11
  23. package/build/plugins/anthropic.js.map +1 -1
  24. package/build/plugins/index.d.ts.map +1 -1
  25. package/build/plugins/openai.d.ts +7 -5
  26. package/build/plugins/openai.d.ts.map +1 -1
  27. package/build/plugins/openai.js +9 -7
  28. package/build/plugins/openai.js.map +1 -1
  29. package/build/plugins/utils.d.ts +17 -0
  30. package/build/plugins/utils.d.ts.map +1 -1
  31. package/build/plugins/utils.js +30 -0
  32. package/build/plugins/utils.js.map +1 -1
  33. package/build/prompt/render.d.ts.map +1 -1
  34. package/build/prompt/service.d.ts.map +1 -1
  35. package/build/prompt/service.js.map +1 -1
  36. package/build/service.d.ts.map +1 -1
  37. package/build/service.js.map +1 -1
  38. package/build/utils/config.d.ts.map +1 -1
  39. package/build/utils/null-report.d.ts.map +1 -1
  40. package/build/utils/prompt.d.ts +13 -0
  41. package/build/utils/prompt.d.ts.map +1 -1
  42. package/build/utils/prompt.js +50 -1
  43. package/build/utils/prompt.js.map +1 -1
  44. package/build/utils/schema.d.ts.map +1 -1
  45. package/build/utils/stream.d.ts.map +1 -1
  46. package/build/utils/stream.js.map +1 -1
  47. package/package.json +7 -7
  48. package/src/consts.ts +8 -0
  49. package/src/model.ts +2 -1
  50. package/src/plugins/anthropic.ts +12 -11
  51. package/src/plugins/openai.ts +9 -8
  52. package/src/plugins/utils.ts +30 -0
  53. package/src/utils/prompt.ts +51 -1
  54. package/tests/internals.spec.ts +67 -2
  55. package/tests/model.spec.ts +7 -1
  56. package/tests/plugins.spec.ts +23 -0
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/prompt/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AASlE,OAAO,KAAK,EACoC,aAAa,EAAE,oBAAoB,EACjF,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAKnB,gGAAgG;AAChG,MAAM,MAAM,gBAAgB,GAC1B,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAA;AAEpF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAC3B,SAAS,oBAAoB,EAC7B,MAAM,MAAM,aAAa,KACxB,gBAuIF,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,UAAS,oBAAyB,EAClC,QAAO,MAAuB,KAC7B,aAMF,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAClF,KAAK,CAAC,EACN,UAAS,oBAAyB,EAClC,QAAO,MAAuB,KAC7B,CAAC,GAAG,iBAQN,CAAA"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/prompt/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AASlE,OAAO,KAAK,EACoC,aAAa,EAAE,oBAAoB,EACjF,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAKnB,gGAAgG;AAChG,MAAM,MAAM,gBAAgB,GAC1B,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAA;AAEpF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,YAClB,oBAAoB,QACvB,MAAM,aAAa,KACxB,gBAuIF,CAAA;AAED,eAAO,MAAM,iBAAiB,aACnB,oBAAoB,UACtB,MAAM,KACZ,aAMF,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,OAC7E,CAAC,YACG,oBAAoB,UACtB,MAAM,KACZ,CAAC,GAAG,iBAQN,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/prompt/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/prompt/service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKlE,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAe,cAAc,EAAE,MAAM,YAAY,CAAA;AAE5F,0FAA0F;AAC1F,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC,CAAA;AAE9G;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,iBAAiB,EAAE,MAAM,MAAM,UAAU,KAAG,aA8ElF,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,SAAS,iBAAiB,EAAE,QAAO,MAAoB,KAAG,UAMxF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAC/E,KAAK,CAAC,EACN,SAAS,iBAAiB,EAC1B,QAAO,MAAoB,KAC1B,CAAC,GAAG,cAQN,CAAA"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKlE,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAe,cAAc,EAAE,MAAM,YAAY,CAAA;AAE5F,0FAA0F;AAC1F,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC,CAAA;AAE9G;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,aAAa,YAAa,iBAAiB,QAAQ,MAAM,UAAU,KAAG,aA8ElF,CAAA;AAED,eAAO,MAAM,cAAc,YAAa,iBAAiB,UAAS,MAAM,KAAiB,UAMxF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,OAC1E,CAAC,WACG,iBAAiB,UACnB,MAAM,KACZ,CAAC,GAAG,cAQN,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAA;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,aAAa,KAAG,OAAO,CAAC,WAAW,CAGpE,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,WAAW,GAAI,QAAQ,OAAO,CAAC,WAAW,CAAC,KAAG,MACV,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAA;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,UAAW,aAAa,KAAG,OAAO,CAAC,WAAW,CAGpE,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,WAAW,WAAY,OAAO,CAAC,WAAW,CAAC,KAAG,MACV,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"null-report.d.ts","sourceRoot":"","sources":["../../src/utils/null-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAA;AAEhF,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,0FAA0F;IAC1F,OAAO,EAAE,aAAa,CAAA;IACtB,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC5B,IAAI,EAAE,oBAAoB,EAAE,CAAA;IAC5B,GAAG,EAAE,cAAc,GAAG,IAAI,CAAA;IAC1B,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAA;IACnD,QAAQ,EAAE,OAAO,CAAA;CAClB;AAKD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,GAAG,gBAAgB,KAAG,WA4DrD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,WAAW,YAAY,EACvB,aAAa,OAAO,EACpB,GAAG,gBAAgB,KAClB,OAAO,CAAC,IAAI,CAsBd,CAAA"}
1
+ {"version":3,"file":"null-report.d.ts","sourceRoot":"","sources":["../../src/utils/null-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAA;AAEhF,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,0FAA0F;IAC1F,OAAO,EAAE,aAAa,CAAA;IACtB,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC5B,IAAI,EAAE,oBAAoB,EAAE,CAAA;IAC5B,GAAG,EAAE,cAAc,GAAG,IAAI,CAAA;IAC1B,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAA;IACnD,QAAQ,EAAE,OAAO,CAAA;CAClB;AAKD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,MAAO,gBAAgB,KAAG,WA4DrD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,cACV,YAAY,eACV,OAAO,KACjB,gBAAgB,KAClB,OAAO,CAAC,IAAI,CAsBd,CAAA"}
@@ -13,6 +13,19 @@ import type { MessageFieldWithRole } from '@langchain/core/messages';
13
13
  * makes the per-request count a function of THIS call alone.
14
14
  */
15
15
  export declare const stripCacheMarkers: (msgs: MessageFieldWithRole[]) => void;
16
+ /**
17
+ * Remove whitespace-only text content so no request carries a blank text block.
18
+ *
19
+ * Anthropic rejects one outright (`400 messages: text content blocks must contain
20
+ * non-whitespace text`), and a 400 is fatal — a single blank block, typically a file
21
+ * read that returned nothing, kills the whole call with no retry. Blank text blocks
22
+ * are dropped from block arrays; a message left without content is removed, with two
23
+ * exceptions: a tool result keeps its `tool_use` pairing by carrying a stub instead,
24
+ * and an AI message that still holds tool calls keeps an empty string, which
25
+ * serializes without a text block. An input that loses every message gets one stub
26
+ * user message so the request stays valid.
27
+ */
28
+ export declare const dropBlankContent: (msgs: MessageFieldWithRole[]) => void;
16
29
  /**
17
30
  * Ensure the word "json" appears somewhere in the prompt. Several providers refuse or
18
31
  * silently ignore a JSON mode unless it does; when it is missing the JSON instruction is
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAyBpE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,oBAAoB,EAAE,KAAG,IAkBhE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,oBAAoB,EAAE,KAAG,IAGhE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,oBAAoB,EAAE,EAAE,iBAAiB,OAAO,GAAG,SAAS,KAAG,IAIjG,CAAA"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAyBpE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,SAAU,oBAAoB,EAAE,KAAG,IAkBhE,CAAA;AAQD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,SAAU,oBAAoB,EAAE,KAAG,IA6B/D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAU,oBAAoB,EAAE,KAAG,IAGhE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,SAAU,oBAAoB,EAAE,mBAAmB,OAAO,GAAG,SAAS,KAAG,IAIjG,CAAA"}
@@ -1,4 +1,5 @@
1
- import { JSON_INSTRUCTION, NO_THINK_DIRECTIVE } from '../consts.js';
1
+ import { BaseMessage } from '@langchain/core/messages';
2
+ import { EMPTY_CONTENT_STUB, JSON_INSTRUCTION, NO_THINK_DIRECTIVE } from '../consts.js';
2
3
  const messageMentions = (msg, needle) => {
3
4
  if (typeof msg.content === 'string')
4
5
  return msg.content.toLowerCase().includes(needle);
@@ -51,6 +52,54 @@ export const stripCacheMarkers = (msgs) => {
51
52
  }
52
53
  }
53
54
  };
55
+ const isBlankTextBlock = (part) => typeof part === 'object' && part !== null
56
+ && part.type === 'text'
57
+ && typeof part.text === 'string'
58
+ && part.text.trim() === '';
59
+ /**
60
+ * Remove whitespace-only text content so no request carries a blank text block.
61
+ *
62
+ * Anthropic rejects one outright (`400 messages: text content blocks must contain
63
+ * non-whitespace text`), and a 400 is fatal — a single blank block, typically a file
64
+ * read that returned nothing, kills the whole call with no retry. Blank text blocks
65
+ * are dropped from block arrays; a message left without content is removed, with two
66
+ * exceptions: a tool result keeps its `tool_use` pairing by carrying a stub instead,
67
+ * and an AI message that still holds tool calls keeps an empty string, which
68
+ * serializes without a text block. An input that loses every message gets one stub
69
+ * user message so the request stays valid.
70
+ */
71
+ export const dropBlankContent = (msgs) => {
72
+ for (let i = msgs.length - 1; i >= 0; i--) {
73
+ const msg = msgs[i];
74
+ let content = msg.content;
75
+ if (Array.isArray(content)) {
76
+ const kept = content.filter(part => !isBlankTextBlock(part));
77
+ if (kept.length !== content.length) {
78
+ msg.content = kept;
79
+ }
80
+ if (kept.length > 0) {
81
+ continue;
82
+ }
83
+ content = '';
84
+ }
85
+ if (typeof content === 'string' && content.trim() === '') {
86
+ const role = msg instanceof BaseMessage ? msg.getType() : `${msg.role}`;
87
+ const toolCalls = msg.tool_calls;
88
+ if (role === 'tool') {
89
+ msg.content = EMPTY_CONTENT_STUB;
90
+ }
91
+ else if (toolCalls != null && toolCalls.length > 0) {
92
+ msg.content = '';
93
+ }
94
+ else {
95
+ msgs.splice(i, 1);
96
+ }
97
+ }
98
+ }
99
+ if (msgs.length === 0) {
100
+ msgs.push({ role: 'user', content: EMPTY_CONTENT_STUB });
101
+ }
102
+ };
54
103
  /**
55
104
  * Ensure the word "json" appears somewhere in the prompt. Several providers refuse or
56
105
  * silently ignore a JSON mode unless it does; when it is missing the JSON instruction is
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAA;AAGhE;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,EAAE,KAAK,GAAG,EAAE,QAAQ,cAAc,CAAC,CAAC,CAAC,KAAG;IAC9E,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;IAC9B,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;CAK9B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,GAAG,SAAS,KAAG,MAGpD,CAAA;AAED,0EAA0E;AAC1E,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,KAAG,CAKpE,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAA;AAGhE;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,OAAO,GAAG,UAAU,cAAc,CAAC,CAAC,CAAC,KAAG;IAC9E,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;IAC9B,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;CAK9B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAS,MAAM,GAAG,SAAS,KAAG,MAGpD,CAAA;AAED,0EAA0E;AAC1E,eAAO,MAAM,WAAW,GAAI,CAAC,UAAU,CAAC,QAAQ,MAAM,GAAG,SAAS,KAAG,CAKpE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/utils/stream.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAM9D,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAuB,kBAAkB,CAAC,CAAC,EACzC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EACzD,SAAS,GAAE,MAAgC,GAC1C,cAAc,CAAC,CAAC,CAAC,CAwBnB"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/utils/stream.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,UAAW,OAAO,KAAG,MAAM,GAAG,SAM9D,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAuB,kBAAkB,CAAC,CAAC,EACzC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EACzD,SAAS,GAAE,MAAgC,GAC1C,cAAc,CAAC,CAAC,CAAC,CAwBnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/utils/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAsB,EAAE;IACzE,MAAM,CAAC,GAAG,KAGT,CAAA;IACD,OAAO,CAAC,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,CAAC,GAAG,EAAE,iBAAiB,EAAE,aAAa,CAAA;AACtF,CAAC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,kBAAkB,CACvC,KAAyD,EACzD,YAAoB,uBAAuB;IAE3C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,IAAI,KAAoC,CAAA;IACxC,MAAM,GAAG,GAAG,GAAG,EAAE;QACf,YAAY,CAAC,KAAK,CAAC,CAAA;QACnB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IACzD,CAAC,CAAA;IACD,GAAG,EAAE,CAAA;IACL,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QAC7C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,GAAG,EAAE,CAAA,CAAC,8CAA8C;YACpD,MAAM,KAAK,CAAA;YACX,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;YAC1C,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,EAAE;gBAAE,MAAK;QAC5C,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,aAAa,CAAC,+BAA+B,SAAS,oBAAoB,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,CAAC,CAAA;IACT,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAM,CAAC,CAAA;IACtB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/utils/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAsB,EAAE;IACzE,MAAM,CAAC,GAAG,KAGT,CAAA;IACD,OAAO,CAAC,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,CAAC,GAAG,EAAE,iBAAiB,EAAE,aAAa,CAAA;AACtF,CAAC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,kBAAkB,CACvC,KAAyD,EACzD,SAAS,GAAW,uBAAuB;IAE3C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,IAAI,KAAoC,CAAA;IACxC,MAAM,GAAG,GAAG,GAAG,EAAE;QACf,YAAY,CAAC,KAAK,CAAC,CAAA;QACnB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IACzD,CAAC,CAAA;IACD,GAAG,EAAE,CAAA;IACL,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QAC7C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,GAAG,EAAE,CAAA,CAAC,8CAA8C;YACpD,MAAM,KAAK,CAAA;YACX,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;YAC1C,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,EAAE;gBAAE,MAAK;QAC5C,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,aAAa,CAAC,+BAA+B,SAAS,oBAAoB,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,CAAC,CAAA;IACT,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAM,CAAC,CAAA;IACtB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/llm",
3
- "version": "0.1.16",
3
+ "version": "0.1.18-rc.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -47,18 +47,18 @@
47
47
  "@langchain/core": "^1.1.39",
48
48
  "@langchain/openai": "^1.4.4",
49
49
  "@owlmeans/dep-config": "workspace:*",
50
- "@owlmeans/test": "^0.1.16",
50
+ "@owlmeans/test": "^0.1.18-rc.0",
51
51
  "@types/bun": "^1.3.14",
52
52
  "@types/node": "^26.1.0",
53
53
  "nodemon": "^3.1.14",
54
- "typescript": "^6.0.3"
54
+ "typescript": "^7.0.2"
55
55
  },
56
56
  "dependencies": {
57
57
  "@anthropic-ai/sdk": "^0.78.0",
58
- "@owlmeans/basic-ids": "^0.1.16",
59
- "@owlmeans/context": "^0.1.16",
60
- "@owlmeans/error": "^0.1.16",
61
- "@owlmeans/llm-common": "^0.1.16",
58
+ "@owlmeans/basic-ids": "^0.1.18-rc.0",
59
+ "@owlmeans/context": "^0.1.18-rc.0",
60
+ "@owlmeans/error": "^0.1.18-rc.0",
61
+ "@owlmeans/llm-common": "^0.1.18-rc.0",
62
62
  "ajv": "^8.17.1"
63
63
  },
64
64
  "publishConfig": {
package/src/consts.ts CHANGED
@@ -99,6 +99,14 @@ export const NO_THINK_DIRECTIVE = '/no_think'
99
99
  /** Tool name used for structured output when a schema carries no usable title/name. */
100
100
  export const DEFAULT_TOOL_NAME = 'extract'
101
101
 
102
+ /**
103
+ * Placeholder content for a message that must survive blank-content sanitization —
104
+ * a tool result whose `tool_use` pairing may not be broken, or an input whose every
105
+ * message was blank. Providers reject whitespace-only text outright, so the stub is
106
+ * the smallest honest signal that the caller supplied nothing.
107
+ */
108
+ export const EMPTY_CONTENT_STUB = '(empty)'
109
+
102
110
  /** Default effort tier when a policy does not specify one. */
103
111
  export const DEFAULT_EFFORT = ExecutionEffort.Standard
104
112
 
package/src/model.ts CHANGED
@@ -18,7 +18,7 @@ import { spectate } from './helpers/spectate.js'
18
18
  import { idleTimeout, readConfig } from './utils/config.js'
19
19
  import { reportNull } from './utils/null-report.js'
20
20
  import type { NullReportParams } from './utils/null-report.js'
21
- import { applyNoThink, ensureJsonMention, stripCacheMarkers } from './utils/prompt.js'
21
+ import { applyNoThink, dropBlankContent, ensureJsonMention, stripCacheMarkers } from './utils/prompt.js'
22
22
  import { resolveSchemaValidator, toToolName, unwrapNamed } from './utils/schema.js'
23
23
  import { streamWithDeadline } from './utils/stream.js'
24
24
  import type {
@@ -121,6 +121,7 @@ export const makeLlmModel = ({
121
121
  // markers live on its own objects. The budget is per request, so clear them and
122
122
  // re-place our own below; otherwise they accumulate until the provider 400s.
123
123
  stripCacheMarkers(msgs)
124
+ dropBlankContent(msgs)
124
125
  let reserved = 0
125
126
 
126
127
  if (prompts != null) {
@@ -7,7 +7,7 @@ import type { CacheTtl } from '@owlmeans/llm-common'
7
7
  import type { LlmPlugin } from './types.js'
8
8
  import { CHARS_PER_TOKEN, MAX_CACHE_BREAKPOINTS, MIN_CACHEABLE_TOKENS } from '../consts.js'
9
9
  import { readConfig } from '../utils/config.js'
10
- import { escalateMaxTokens, makeClientOptions } from './utils.js'
10
+ import { escalateMaxTokens, isBadRequest, makeClientOptions } from './utils.js'
11
11
 
12
12
  /** Model-name prefix that supports prompt caching through `cache_control` markers. */
13
13
  const CACHEABLE_PREFIX = 'claude-'
@@ -221,16 +221,17 @@ export const anthropicPlugin: LlmPlugin = {
221
221
 
222
222
  /**
223
223
  * A malformed request (bad schema, unsupported parameter, oversized `max_tokens`, too
224
- * many cache breakpoints) cannot be fixed by retrying — surface it immediately instead
225
- * of burning the budget.
224
+ * many cache breakpoints, an input past the context window) cannot be fixed by retrying —
225
+ * surface it immediately instead of burning the budget.
226
226
  *
227
- * The `status` check is not redundant with the `instanceof`: `@langchain/anthropic`
228
- * carries its OWN nested copy of `@anthropic-ai/sdk`, so the error it throws is an
229
- * instance of a DIFFERENT `BadRequestError` class than the one imported here and the
230
- * `instanceof` silently fails. That turned every fatal 400 into eight full retries —
231
- * a single malformed request became minutes of thrash with the real cause buried.
227
+ * The `isBadRequest` walk is not redundant with the `instanceof`, and neither is a plain
228
+ * `e.status === 400`. `@langchain/anthropic` carries its OWN nested copy of
229
+ * `@anthropic-ai/sdk`, so the error it throws is an instance of a DIFFERENT
230
+ * `BadRequestError` class than the one imported here; and langchain additionally re-wraps
231
+ * the failure in its own typed error (`ContextOverflowError` for an oversized prompt),
232
+ * which holds the 400 only under `cause`. Each layer alone turned a fatal 400 into eight
233
+ * full retries — a single unfixable request became minutes of thrash with the real cause
234
+ * buried under the repeats.
232
235
  */
233
- isFatal: e => e instanceof BadRequestError || (e as { status?: unknown })?.status === 400
234
- ? e as Error
235
- : null,
236
+ isFatal: e => e instanceof BadRequestError || isBadRequest(e) ? e as Error : null,
236
237
  }
@@ -3,7 +3,7 @@ import type { BaseChatModel } from '@langchain/core/language_models/chat_models'
3
3
  import { ModelProvider, StructuredMode } from '@owlmeans/llm-common'
4
4
  import type { LlmPlugin, LlmRefineParams } from './types.js'
5
5
  import type { ModelConfig } from '../types.js'
6
- import { escalateMaxTokens, makeConfiguration } from './utils.js'
6
+ import { escalateMaxTokens, isBadRequest, makeConfiguration } from './utils.js'
7
7
 
8
8
  /** Model families served through OpenAI's Responses API rather than chat completions. */
9
9
  const RESPONSES_API_PREFIXES = ['gpt-5', 'codex-']
@@ -35,14 +35,15 @@ export const openAiFamily = {
35
35
 
36
36
  /**
37
37
  * A 400 means the request itself is malformed — a schema the endpoint rejects, an
38
- * unsupported parameter, a `max_tokens` above the model's per-request limit. Retrying
39
- * re-sends the same shape (and the escalator raises `max_tokens`, making the last case
40
- * strictly worse), so eight attempts only bury the real message. Matched on `status`
41
- * rather than an SDK class: aggregators and nested SDK copies throw their own error
42
- * types, and an `instanceof` against one of them silently never matches.
38
+ * unsupported parameter, a `max_tokens` above the model's per-request limit, an input
39
+ * past the context window. Retrying re-sends the same shape (and the escalator raises
40
+ * `max_tokens`, making some of those strictly worse), so eight attempts only bury the
41
+ * real message. Matched through `isBadRequest` rather than an SDK class: aggregators and
42
+ * nested SDK copies throw their own error types, and langchain re-wraps the failure in a
43
+ * typed error that keeps the 400 only under `cause` — so both an `instanceof` and a
44
+ * surface `status` read silently miss it.
43
45
  */
44
- isFatal: (e: unknown): Error | null =>
45
- (e as { status?: unknown })?.status === 400 ? e as Error : null,
46
+ isFatal: (e: unknown): Error | null => isBadRequest(e) ? e as Error : null,
46
47
 
47
48
  refine: ({ base, attempt, temperature, maxOutputCap }: LlmRefineParams): BaseChatModel => {
48
49
  const model = base as ChatOpenAI
@@ -36,3 +36,33 @@ export const makeClientOptions = (
36
36
  */
37
37
  export const escalateMaxTokens = (base: number | undefined, attempt: number, cap: number): number =>
38
38
  Math.min((base ?? 2048) * Math.pow(2, attempt), cap)
39
+
40
+ /** How deep to follow `cause` before giving up — guards a self-referential chain. */
41
+ const MAX_CAUSE_DEPTH = 8
42
+
43
+ /**
44
+ * Whether the error is — or wraps — an HTTP 400 from a provider.
45
+ *
46
+ * A 400 means the request itself is malformed: a schema the endpoint rejects, an
47
+ * unsupported parameter, a `max_tokens` above the per-request limit, or an input past the
48
+ * context window. Retrying re-sends the same shape and the retry escalator only raises the
49
+ * OUTPUT budget, so none of those can improve with another attempt.
50
+ *
51
+ * The check walks the `cause` chain and never uses `instanceof`. Two independent reasons:
52
+ * `@langchain/anthropic` and `@langchain/openai` bundle their own nested copies of the
53
+ * provider SDKs, so their errors are instances of a DIFFERENT class than the one this
54
+ * package imports; and langchain re-wraps provider failures in its own typed errors
55
+ * (`ContextOverflowError` and friends) that carry the original only as `cause`, with no
56
+ * `status` of their own. Either one silently defeats a surface-level check — an oversized
57
+ * prompt then burns all eight attempts on a request that cannot succeed.
58
+ */
59
+ export const isBadRequest = (e: unknown): boolean => {
60
+ let current: unknown = e
61
+ for (let depth = 0; current != null && depth < MAX_CAUSE_DEPTH; ++depth) {
62
+ if ((current as { status?: unknown }).status === 400) return true
63
+ const cause = (current as { cause?: unknown }).cause
64
+ if (cause === current) return false
65
+ current = cause
66
+ }
67
+ return false
68
+ }
@@ -1,5 +1,6 @@
1
+ import { BaseMessage } from '@langchain/core/messages'
1
2
  import type { MessageFieldWithRole } from '@langchain/core/messages'
2
- import { JSON_INSTRUCTION, NO_THINK_DIRECTIVE } from '../consts.js'
3
+ import { EMPTY_CONTENT_STUB, JSON_INSTRUCTION, NO_THINK_DIRECTIVE } from '../consts.js'
3
4
 
4
5
  const messageMentions = (msg: MessageFieldWithRole, needle: string): boolean => {
5
6
  if (typeof msg.content === 'string') return msg.content.toLowerCase().includes(needle)
@@ -56,6 +57,55 @@ export const stripCacheMarkers = (msgs: MessageFieldWithRole[]): void => {
56
57
  }
57
58
  }
58
59
 
60
+ const isBlankTextBlock = (part: unknown): boolean =>
61
+ typeof part === 'object' && part !== null
62
+ && (part as Record<string, unknown>).type === 'text'
63
+ && typeof (part as Record<string, unknown>).text === 'string'
64
+ && (part as Record<string, string>).text.trim() === ''
65
+
66
+ /**
67
+ * Remove whitespace-only text content so no request carries a blank text block.
68
+ *
69
+ * Anthropic rejects one outright (`400 messages: text content blocks must contain
70
+ * non-whitespace text`), and a 400 is fatal — a single blank block, typically a file
71
+ * read that returned nothing, kills the whole call with no retry. Blank text blocks
72
+ * are dropped from block arrays; a message left without content is removed, with two
73
+ * exceptions: a tool result keeps its `tool_use` pairing by carrying a stub instead,
74
+ * and an AI message that still holds tool calls keeps an empty string, which
75
+ * serializes without a text block. An input that loses every message gets one stub
76
+ * user message so the request stays valid.
77
+ */
78
+ export const dropBlankContent = (msgs: MessageFieldWithRole[]): void => {
79
+ for (let i = msgs.length - 1; i >= 0; i--) {
80
+ const msg = msgs[i]
81
+ let content = msg.content
82
+ if (Array.isArray(content)) {
83
+ const kept = content.filter(part => !isBlankTextBlock(part))
84
+ if (kept.length !== content.length) {
85
+ msg.content = kept as unknown as typeof msg.content
86
+ }
87
+ if (kept.length > 0) {
88
+ continue
89
+ }
90
+ content = ''
91
+ }
92
+ if (typeof content === 'string' && content.trim() === '') {
93
+ const role = msg instanceof BaseMessage ? msg.getType() : `${msg.role}`
94
+ const toolCalls = (msg as { tool_calls?: unknown[] }).tool_calls
95
+ if (role === 'tool') {
96
+ msg.content = EMPTY_CONTENT_STUB
97
+ } else if (toolCalls != null && toolCalls.length > 0) {
98
+ msg.content = ''
99
+ } else {
100
+ msgs.splice(i, 1)
101
+ }
102
+ }
103
+ }
104
+ if (msgs.length === 0) {
105
+ msgs.push({ role: 'user', content: EMPTY_CONTENT_STUB })
106
+ }
107
+ }
108
+
59
109
  /**
60
110
  * Ensure the word "json" appears somewhere in the prompt. Several providers refuse or
61
111
  * silently ignore a JSON mode unless it does; when it is missing the JSON instruction is
@@ -1,7 +1,8 @@
1
1
  import { describe, expect, test } from 'bun:test'
2
+ import { AIMessage, ToolMessage } from '@langchain/core/messages'
2
3
  import type { MessageFieldWithRole } from '@langchain/core/messages'
3
- import { JSON_INSTRUCTION, NO_THINK_DIRECTIVE } from '../src/consts.js'
4
- import { applyNoThink, ensureJsonMention } from '../src/utils/prompt.js'
4
+ import { EMPTY_CONTENT_STUB, JSON_INSTRUCTION, NO_THINK_DIRECTIVE } from '../src/consts.js'
5
+ import { applyNoThink, dropBlankContent, ensureJsonMention } from '../src/utils/prompt.js'
5
6
  import { toToolName, unwrapNamed } from '../src/utils/schema.js'
6
7
  import { getChunkFinishReason, streamWithDeadline } from '../src/utils/stream.js'
7
8
 
@@ -58,6 +59,70 @@ describe('utils/prompt — thinking suppression', () => {
58
59
  })
59
60
  })
60
61
 
62
+ describe('utils/prompt — blank content sanitization', () => {
63
+ test('drops a whitespace-only user message and keeps the rest', () => {
64
+ const msgs: MessageFieldWithRole[] = [
65
+ { role: 'user', content: 'the task' },
66
+ { role: 'user', content: '\n\n ' },
67
+ { role: 'user', content: 'the file' },
68
+ ]
69
+ dropBlankContent(msgs)
70
+ expect(msgs.map(m => m.content)).toEqual(['the task', 'the file'])
71
+ })
72
+
73
+ test('filters blank text blocks out of block arrays, keeping non-text blocks', () => {
74
+ const msgs: MessageFieldWithRole[] = [{
75
+ role: 'user',
76
+ content: [
77
+ { type: 'text', text: ' \n' },
78
+ { type: 'text', text: 'kept' },
79
+ { type: 'image_url', image_url: { url: 'data:,x' } },
80
+ ],
81
+ }]
82
+ dropBlankContent(msgs)
83
+ expect(msgs).toHaveLength(1)
84
+ expect(msgs[0]!.content).toEqual([
85
+ { type: 'text', text: 'kept' },
86
+ { type: 'image_url', image_url: { url: 'data:,x' } },
87
+ ])
88
+ })
89
+
90
+ test('removes a message whose block array becomes empty', () => {
91
+ const msgs: MessageFieldWithRole[] = [
92
+ { role: 'user', content: 'the task' },
93
+ { role: 'user', content: [{ type: 'text', text: ' ' }] },
94
+ ]
95
+ dropBlankContent(msgs)
96
+ expect(msgs.map(m => m.content)).toEqual(['the task'])
97
+ })
98
+
99
+ test('stubs a blank tool result instead of dropping it', () => {
100
+ const msgs = [
101
+ { role: 'user', content: 'run it' },
102
+ new ToolMessage({ tool_call_id: 'call_1', content: ' ' }),
103
+ ] as MessageFieldWithRole[]
104
+ dropBlankContent(msgs)
105
+ expect(msgs).toHaveLength(2)
106
+ expect((msgs[1] as ToolMessage).content).toBe(EMPTY_CONTENT_STUB)
107
+ })
108
+
109
+ test('keeps a blank AI message that carries tool calls, with empty string content', () => {
110
+ const msgs = [
111
+ { role: 'user', content: 'run it' },
112
+ new AIMessage({ content: '\n', tool_calls: [{ id: 'call_1', name: 'run', args: {} }] }),
113
+ ] as MessageFieldWithRole[]
114
+ dropBlankContent(msgs)
115
+ expect(msgs).toHaveLength(2)
116
+ expect((msgs[1] as AIMessage).content).toBe('')
117
+ })
118
+
119
+ test('replaces an all-blank input with a single stub user message', () => {
120
+ const msgs: MessageFieldWithRole[] = [{ role: 'user', content: ' ' }]
121
+ dropBlankContent(msgs)
122
+ expect(msgs).toEqual([{ role: 'user', content: EMPTY_CONTENT_STUB }])
123
+ })
124
+ })
125
+
61
126
  describe('utils/schema — tool naming and unwrapping', () => {
62
127
  test('sanitises a schema title into a provider-acceptable tool name', () => {
63
128
  expect(toToolName('User Story')).toBe('User_Story')
@@ -112,5 +112,11 @@ const suite = (name: string, configs: () => ModelConfig[], skip: string | null)
112
112
  })
113
113
  }
114
114
 
115
- suite('openrouter', openRouterConfigs, 'skip' in gates.openrouter ? gates.openrouter.reason : null)
115
+ // The live OpenRouter suite is DISABLED unconditionally: OpenRouter is an aggregator outside
116
+ // the main model set (OpenAI + Anthropic), so it bills a separate account and serves models no
117
+ // deployment runs — a `402 requires more credits` there reads as a failure of the code under
118
+ // test. The gate alone was not enough, since it runs the moment OPENROUTER_SECRET is present in
119
+ // any developer's .env. The `Compatible` provider itself stays covered offline by plugins.spec.ts
120
+ // (baseUrl/kwargs shaping). Drop the literal below back to the gate expression to re-enable.
121
+ suite('openrouter', openRouterConfigs, 'disabled: OpenRouter is outside the main model set')
116
122
  suite('anthropic', anthropicConfigs, 'skip' in gates.anthropic ? gates.anthropic.reason : null)
@@ -2,6 +2,7 @@ import { describe, expect, test } from 'bun:test'
2
2
  import { ChatAnthropic } from '@langchain/anthropic'
3
3
  import { ChatOpenAI } from '@langchain/openai'
4
4
  import { BadRequestError } from '@anthropic-ai/sdk'
5
+ import { ContextOverflowError } from '@langchain/core/errors'
5
6
  import { ModelProvider, PromptBlock, StructuredMode } from '@owlmeans/llm-common'
6
7
  import {
7
8
  anthropicPlugin, compatiblePlugin, makeLlmService, openAiPlugin, pluginFor, pluginOf,
@@ -430,11 +431,33 @@ describe('@owlmeans/llm — fatal error classification', () => {
430
431
  expect(compatiblePlugin.isFatal?.(foreign)).toBe(foreign)
431
432
  })
432
433
 
434
+ // langchain re-wraps a provider failure in its own typed error and keeps the original
435
+ // only under `cause`, so the wrapper carries no `status` of its own. An oversized prompt
436
+ // arrives this way — and since the retry escalator raises only the OUTPUT budget, every
437
+ // one of the eight attempts re-sent the same over-limit input and failed identically.
438
+ test('a 400 wrapped in a langchain error is still fatal', () => {
439
+ const raw = Object.assign(new Error('prompt is too long: 323182 tokens > 200000 maximum'), { status: 400 })
440
+ const wrapped = ContextOverflowError.fromError(raw)
441
+ expect(anthropicPlugin.isFatal?.(wrapped)).toBe(wrapped)
442
+ expect(openAiPlugin.isFatal?.(wrapped)).toBe(wrapped)
443
+ expect(compatiblePlugin.isFatal?.(wrapped)).toBe(wrapped)
444
+
445
+ const nested = Object.assign(new Error('outer'), { cause: wrapped })
446
+ expect(anthropicPlugin.isFatal?.(nested)).toBe(nested)
447
+ })
448
+
433
449
  test('a retryable status is not treated as fatal', () => {
434
450
  const overloaded = Object.assign(new Error('529'), { status: 529 })
435
451
  expect(anthropicPlugin.isFatal?.(overloaded)).toBeNull()
436
452
  expect(openAiPlugin.isFatal?.(overloaded)).toBeNull()
437
453
  })
454
+
455
+ // The cause walk must terminate on a chain that points back at itself.
456
+ test('a self-referential cause chain does not hang', () => {
457
+ const looped: Error & { cause?: unknown } = new Error('loop')
458
+ looped.cause = looped
459
+ expect(anthropicPlugin.isFatal?.(looped)).toBeNull()
460
+ })
438
461
  })
439
462
 
440
463
  describe('@owlmeans/llm — service', () => {