@owlmeans/llm 0.1.15 → 0.1.16

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 (99) hide show
  1. package/README.md +3 -4
  2. package/agent-meta/manifest.json +9 -9
  3. package/agent-meta/skills/llm/SKILL.md +54 -4
  4. package/agent-meta/skills/llm-prompt-caching/SKILL.md +135 -0
  5. package/build/consts.d.ts +36 -3
  6. package/build/consts.d.ts.map +1 -1
  7. package/build/consts.js +37 -4
  8. package/build/consts.js.map +1 -1
  9. package/build/execution/service.d.ts.map +1 -1
  10. package/build/execution/service.js +8 -3
  11. package/build/execution/service.js.map +1 -1
  12. package/build/execution/types.d.ts +20 -1
  13. package/build/execution/types.d.ts.map +1 -1
  14. package/build/execution/utils.d.ts +12 -1
  15. package/build/execution/utils.d.ts.map +1 -1
  16. package/build/execution/utils.js +22 -0
  17. package/build/execution/utils.js.map +1 -1
  18. package/build/helpers/cache.d.ts +17 -0
  19. package/build/helpers/cache.d.ts.map +1 -0
  20. package/build/helpers/cache.js +22 -0
  21. package/build/helpers/cache.js.map +1 -0
  22. package/build/helpers/index.d.ts +1 -0
  23. package/build/helpers/index.d.ts.map +1 -1
  24. package/build/helpers/index.js +1 -0
  25. package/build/helpers/index.js.map +1 -1
  26. package/build/helpers/spectate.d.ts.map +1 -1
  27. package/build/helpers/spectate.js +7 -0
  28. package/build/helpers/spectate.js.map +1 -1
  29. package/build/index.d.ts +1 -0
  30. package/build/index.d.ts.map +1 -1
  31. package/build/index.js +1 -0
  32. package/build/index.js.map +1 -1
  33. package/build/model.d.ts +1 -1
  34. package/build/model.d.ts.map +1 -1
  35. package/build/model.js +90 -16
  36. package/build/model.js.map +1 -1
  37. package/build/plugins/anthropic.d.ts.map +1 -1
  38. package/build/plugins/anthropic.js +136 -21
  39. package/build/plugins/anthropic.js.map +1 -1
  40. package/build/plugins/openai.d.ts +9 -0
  41. package/build/plugins/openai.d.ts.map +1 -1
  42. package/build/plugins/openai.js +23 -1
  43. package/build/plugins/openai.js.map +1 -1
  44. package/build/plugins/types.d.ts +38 -5
  45. package/build/plugins/types.d.ts.map +1 -1
  46. package/build/prompt/index.d.ts +5 -0
  47. package/build/prompt/index.d.ts.map +1 -0
  48. package/build/prompt/index.js +4 -0
  49. package/build/prompt/index.js.map +1 -0
  50. package/build/prompt/plugins.d.ts +24 -0
  51. package/build/prompt/plugins.d.ts.map +1 -0
  52. package/build/prompt/plugins.js +64 -0
  53. package/build/prompt/plugins.js.map +1 -0
  54. package/build/prompt/render.d.ts +28 -0
  55. package/build/prompt/render.d.ts.map +1 -0
  56. package/build/prompt/render.js +39 -0
  57. package/build/prompt/render.js.map +1 -0
  58. package/build/prompt/service.d.ts +16 -0
  59. package/build/prompt/service.d.ts.map +1 -0
  60. package/build/prompt/service.js +145 -0
  61. package/build/prompt/service.js.map +1 -0
  62. package/build/prompt/types.d.ts +101 -0
  63. package/build/prompt/types.d.ts.map +1 -0
  64. package/build/prompt/types.js +2 -0
  65. package/build/prompt/types.js.map +1 -0
  66. package/build/service.d.ts.map +1 -1
  67. package/build/service.js +3 -0
  68. package/build/service.js.map +1 -1
  69. package/build/types.d.ts +53 -3
  70. package/build/types.d.ts.map +1 -1
  71. package/build/utils/prompt.d.ts +14 -0
  72. package/build/utils/prompt.d.ts.map +1 -1
  73. package/build/utils/prompt.js +32 -0
  74. package/build/utils/prompt.js.map +1 -1
  75. package/package.json +13 -6
  76. package/src/consts.ts +43 -5
  77. package/src/execution/service.ts +9 -3
  78. package/src/execution/types.ts +21 -2
  79. package/src/execution/utils.ts +28 -1
  80. package/src/helpers/cache.ts +33 -0
  81. package/src/helpers/index.ts +1 -0
  82. package/src/helpers/spectate.ts +10 -0
  83. package/src/index.ts +1 -0
  84. package/src/model.ts +119 -16
  85. package/src/plugins/anthropic.ts +159 -20
  86. package/src/plugins/openai.ts +26 -1
  87. package/src/plugins/types.ts +42 -5
  88. package/src/prompt/index.ts +5 -0
  89. package/src/prompt/plugins.ts +69 -0
  90. package/src/prompt/render.ts +48 -0
  91. package/src/prompt/service.ts +194 -0
  92. package/src/prompt/types.ts +114 -0
  93. package/src/service.ts +3 -0
  94. package/src/types.ts +54 -3
  95. package/src/utils/prompt.ts +33 -0
  96. package/tests/execution.spec.ts +42 -0
  97. package/tests/plugins.spec.ts +279 -14
  98. package/tests/prompt.spec.ts +194 -0
  99. package/agent-meta/instructions/llm.instructions.md +0 -66
@@ -0,0 +1,145 @@
1
+ import { createService } from '@owlmeans/context';
2
+ import { PROMPT_BLOCK_ORDER } from '@owlmeans/llm-common';
3
+ import { DEFAULT_CACHE_TTL, MAX_CACHE_BREAKPOINTS, MAX_SYSTEM_BREAKPOINTS, PROMPT_SERVICE, } from '../consts.js';
4
+ import { BUILT_IN_PROMPT_PLUGINS } from './plugins.js';
5
+ import { CHUNK_SEPARATOR, compareAlias, joinChunks } from './render.js';
6
+ /** Sort weight of a plugin that declares none — between the built-in skills and context. */
7
+ const DEFAULT_PLUGIN_ORDER = 50;
8
+ /**
9
+ * Build the skill registry and composition chain WITHOUT registering a context service,
10
+ * so a consumer can spread it into its own `createService` and publish extra methods
11
+ * alongside it — the same pattern as `llmServiceApi` / `executionServiceApi`.
12
+ *
13
+ * `self` is late-bound because plugins resolve skills through the finished service, which
14
+ * a consumer may have extended.
15
+ */
16
+ export const promptServiceApi = (options, self) => {
17
+ const registry = new Map();
18
+ /** Registration index per plugin alias — the stable tiebreaker for equal `order`. */
19
+ const seats = new Map();
20
+ let seq = 0;
21
+ const seat = (plugin) => {
22
+ const existing = seats.get(plugin.alias);
23
+ // Re-registering under the same alias REPLACES rather than appends, so wiring the
24
+ // same plugin twice (a shared context builder plus an app) cannot double-emit.
25
+ seats.set(plugin.alias, { plugin, index: existing?.index ?? seq++ });
26
+ };
27
+ for (const plugin of [...BUILT_IN_PROMPT_PLUGINS, ...(options.plugins ?? [])]) {
28
+ seat(plugin);
29
+ }
30
+ const ordered = () => [...seats.values()]
31
+ .sort((a, b) => {
32
+ const left = a.plugin.order ?? DEFAULT_PLUGIN_ORDER;
33
+ const right = b.plugin.order ?? DEFAULT_PLUGIN_ORDER;
34
+ return left !== right ? left - right : a.index - b.index;
35
+ })
36
+ .map(entry => entry.plugin);
37
+ const api = {
38
+ use: plugin => {
39
+ seat(plugin);
40
+ },
41
+ register: (...skills) => {
42
+ for (const skill of skills) {
43
+ registry.set(skill.alias, skill);
44
+ }
45
+ },
46
+ has: alias => registry.has(alias),
47
+ skills: () => [...registry.values()].sort((a, b) => compareAlias(a.alias, b.alias)),
48
+ /**
49
+ * Depth-first over `requires` so a dependency is emitted before the skill that pulled
50
+ * it in. Unknown aliases are skipped rather than thrown: a skill catalogue is often
51
+ * assembled from several packages and a missing optional one should degrade the
52
+ * prompt, not break the call.
53
+ */
54
+ resolve: aliases => {
55
+ const seen = new Set();
56
+ const out = [];
57
+ const walk = (alias) => {
58
+ if (seen.has(alias)) {
59
+ return;
60
+ }
61
+ seen.add(alias);
62
+ const skill = registry.get(alias);
63
+ if (skill == null) {
64
+ return;
65
+ }
66
+ for (const required of skill.requires ?? []) {
67
+ walk(required);
68
+ }
69
+ out.push(skill);
70
+ };
71
+ for (const alias of aliases) {
72
+ walk(alias);
73
+ }
74
+ return out;
75
+ },
76
+ compose: async (input, messages, params) => {
77
+ const sections = new Map();
78
+ const ctx = {
79
+ ...params,
80
+ input,
81
+ messages,
82
+ add: (block, text) => {
83
+ const trimmed = text.trim();
84
+ if (trimmed === '') {
85
+ return;
86
+ }
87
+ const chunks = sections.get(block);
88
+ if (chunks == null) {
89
+ sections.set(block, [trimmed]);
90
+ }
91
+ else {
92
+ chunks.push(trimmed);
93
+ }
94
+ },
95
+ resolve: aliases => self().resolve(aliases),
96
+ };
97
+ // Two passes, not one: every static contribution must be in place before a plugin
98
+ // that reacts to the messages runs, so detection can see what is already covered.
99
+ const chain = ordered();
100
+ for (const plugin of chain) {
101
+ await plugin.compose?.(ctx);
102
+ }
103
+ for (const plugin of chain) {
104
+ await plugin.inspect?.(ctx);
105
+ }
106
+ const blocks = [];
107
+ for (const block of PROMPT_BLOCK_ORDER) {
108
+ const text = joinChunks(sections.get(block) ?? []);
109
+ if (text !== '') {
110
+ blocks.push({ block, text });
111
+ }
112
+ }
113
+ if (blocks.length === 0) {
114
+ return { system: null, breakpoints: 0, blocks };
115
+ }
116
+ const cacheSystem = input.cacheSystem ?? options.cacheSystem ?? true;
117
+ const ttl = input.cacheTtl ?? options.cacheTtl ?? DEFAULT_CACHE_TTL;
118
+ const budget = Math.min(params.cacheMax ?? MAX_CACHE_BREAKPOINTS, MAX_SYSTEM_BREAKPOINTS);
119
+ const render = cacheSystem && budget > 0
120
+ ? params.provider?.patchSystem?.(blocks, { model: params.model, cacheMax: budget, ttl })
121
+ : null;
122
+ return {
123
+ system: {
124
+ role: 'system',
125
+ content: render?.content ?? blocks.map(block => block.text).join(CHUNK_SEPARATOR),
126
+ },
127
+ breakpoints: render?.breakpoints ?? 0,
128
+ blocks,
129
+ };
130
+ },
131
+ };
132
+ api.register(...(options.skills ?? []));
133
+ return api;
134
+ };
135
+ export const makePromptService = (options = {}, alias = PROMPT_SERVICE) => {
136
+ const service = createService(alias, promptServiceApi(options, () => service));
137
+ return service;
138
+ };
139
+ export const appendPromptService = (ctx, options = {}, alias = PROMPT_SERVICE) => {
140
+ const context = ctx;
141
+ context.registerService(makePromptService(options, alias));
142
+ context.prompts = () => context.service(alias);
143
+ return context;
144
+ };
145
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/prompt/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
2
+ import type { MessageFieldWithRole } from '@langchain/core/messages';
3
+ import type { InitializedService } from '@owlmeans/context';
4
+ import type { CacheTtl, FileProviderRef, LlmPurpose, PromptBlock, PromptPolicy, SkillDefinition } from '@owlmeans/llm-common';
5
+ import type { LlmPlugin, LlmSystemBlock } from '../plugins/types.js';
6
+ /**
7
+ * Everything that shapes one composed system prompt. The serializable part
8
+ * ({@link PromptPolicy}) travels on the execution state; the rest is per-call.
9
+ */
10
+ export interface PromptInput extends PromptPolicy {
11
+ /** Skills supplied verbatim, without registering them first. */
12
+ inline?: SkillDefinition[];
13
+ /**
14
+ * Raw text for the volatile `Context` block — a caller's own system message, carried
15
+ * through unchanged. Never part of the cached prefix.
16
+ */
17
+ context?: string[];
18
+ /**
19
+ * Skill aliases requested for THIS call only. Rendered into `Context`, not `Skills`:
20
+ * a set that changes per call must not sit inside the region other calls cache.
21
+ */
22
+ callSkills?: string[];
23
+ }
24
+ export interface PromptComposeParams {
25
+ /** The ORIGINAL (unrefined) model the composed prompt will be sent to. */
26
+ model: BaseChatModel;
27
+ /** Provider plugin governing the call — supplies the cache-marker strategy. */
28
+ provider?: LlmPlugin;
29
+ purpose?: LlmPurpose;
30
+ action?: string;
31
+ /** Total breakpoint budget for the request. */
32
+ cacheMax?: number;
33
+ /** File access a plugin may use to resolve knowledge from disk. */
34
+ files?: FileProviderRef;
35
+ }
36
+ /** What a prompt plugin sees and may contribute to. */
37
+ export interface PromptContext extends PromptComposeParams {
38
+ input: PromptInput;
39
+ /** The call's messages. Read them for detection; do NOT mutate. */
40
+ messages: readonly MessageFieldWithRole[];
41
+ /** Append a rendered chunk to a block. Empty text is ignored. */
42
+ add: (block: PromptBlock, text: string) => void;
43
+ /** Resolve skill aliases through the registry, following `requires`. */
44
+ resolve: (aliases: readonly string[]) => SkillDefinition[];
45
+ }
46
+ /**
47
+ * A unit of system-prompt composition, registered on the {@link PromptService} at context
48
+ * composition time. This is the seam that makes the LLM layer pluggable: the package
49
+ * ships the role and skills plugins, an application adds its own.
50
+ *
51
+ * A plugin MUST be deterministic — same input, same bytes. Anything it contributes to a
52
+ * cached block and cannot reproduce exactly invalidates the prefix for every call that
53
+ * shares it.
54
+ */
55
+ export interface LlmPromptPlugin {
56
+ alias: string;
57
+ /** Lower runs first. The built-ins occupy 0 (role), 10 (skills) and 90 (context). */
58
+ order?: number;
59
+ /** Contribute static content, before anything has looked at the messages. */
60
+ compose?: (ctx: PromptContext) => void | Promise<void>;
61
+ /** Contribute content derived from the messages (detection, lookup, fetch). */
62
+ inspect?: (ctx: PromptContext) => void | Promise<void>;
63
+ }
64
+ export interface PromptResult {
65
+ /** The composed system message, or `null` when nothing was contributed. */
66
+ system: MessageFieldWithRole | null;
67
+ /** Breakpoints the system prompt consumed; subtract from the message budget. */
68
+ breakpoints: number;
69
+ /** The rendered blocks in emission order — exposed for tests and diagnostics. */
70
+ blocks: LlmSystemBlock[];
71
+ }
72
+ export interface PromptServiceOptions {
73
+ /** Skills registered up front; equivalent to calling `register` after construction. */
74
+ skills?: SkillDefinition[];
75
+ /** Plugins registered up front, in addition to the built-ins. */
76
+ plugins?: LlmPromptPlugin[];
77
+ /** Default for `PromptPolicy.cacheSystem`. Defaults to `true`. */
78
+ cacheSystem?: boolean;
79
+ /** Default for `PromptPolicy.cacheTtl`. */
80
+ cacheTtl?: CacheTtl;
81
+ }
82
+ /**
83
+ * Registry of reusable skills plus the plugin chain that turns a role and a set of skill
84
+ * aliases into a cache-friendly system prompt.
85
+ */
86
+ export interface PromptService extends InitializedService {
87
+ /** Register a composition plugin. Runs in `order` then registration order. */
88
+ use: (plugin: LlmPromptPlugin) => void;
89
+ /** Register (or replace, by alias) reusable skills. */
90
+ register: (...skills: SkillDefinition[]) => void;
91
+ has: (alias: string) => boolean;
92
+ /** Resolve aliases to definitions, pulling in `requires` transitively. Unknown aliases are skipped. */
93
+ resolve: (aliases: readonly string[]) => SkillDefinition[];
94
+ /** Every registered skill, in deterministic order. */
95
+ skills: () => SkillDefinition[];
96
+ compose: (input: PromptInput, messages: readonly MessageFieldWithRole[], params: PromptComposeParams) => Promise<PromptResult>;
97
+ }
98
+ export interface WithPromptService {
99
+ prompts: () => PromptService;
100
+ }
101
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prompt/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/prompt/types.ts"],"names":[],"mappings":""}
@@ -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,aA2ElF,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,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"}
package/build/service.js CHANGED
@@ -42,6 +42,9 @@ export const llmServiceApi = (options, self) => {
42
42
  throw new LlmMissconfiguredError(alias);
43
43
  }
44
44
  const config = { ...baseConfig, ...override };
45
+ // The service-wide idle deadline is a floor, not an override: a preset that states its
46
+ // own `streamTimeout` knows something specific about that model and keeps it.
47
+ config.streamTimeout ??= options.streamTimeout;
45
48
  const preset = config.preset != null
46
49
  ? { ...(models.find(m => m.alias === config.preset) ?? {}) }
47
50
  : {};
@@ -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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"}
package/build/types.d.ts CHANGED
@@ -3,7 +3,8 @@ import type { AIMessage, BaseMessage, MessageFieldWithRole } from '@langchain/co
3
3
  import type { BaseCallbackHandler, CallbackHandlerMethods } from '@langchain/core/callbacks/base';
4
4
  import type { JSONSchemaType } from 'ajv';
5
5
  import type { InitializedService } from '@owlmeans/context';
6
- import type { LlmPurpose, ModelProvider, NullCapture, SpectatorArgument, SpectatorEntryLogged } from '@owlmeans/llm-common';
6
+ import type { FileProviderRef, LlmPurpose, ModelProvider, NullCapture, SpectatorArgument, SpectatorEntryLogged } from '@owlmeans/llm-common';
7
+ import type { PromptInput, PromptService } from './prompt/types.js';
7
8
  export type MaybeArray<T> = T | T[];
8
9
  /**
9
10
  * Out-of-band result channel for a model call: the caller passes a `ref` and receives
@@ -39,6 +40,20 @@ export interface LlmLogging {
39
40
  export interface LlmModelOptions extends LlmLogging {
40
41
  model: BaseChatModel;
41
42
  retries?: number;
43
+ /**
44
+ * Role and skills for every call this model makes. Composed into a cacheable system
45
+ * prompt by {@link PromptService}; ignored when no `prompts` resolver is supplied.
46
+ * Usually just `exec.prompt` from the helper execution.
47
+ */
48
+ prompt?: PromptInput;
49
+ /**
50
+ * Late-bound resolver for the prompt service — a function, like `Execution.models`, so
51
+ * the service can be swapped or cloned. Without it the model behaves exactly as before
52
+ * this layer existed: the caller's messages are sent untouched.
53
+ */
54
+ prompts?: () => PromptService;
55
+ /** File access offered to prompt plugins that resolve knowledge from disk. */
56
+ files?: FileProviderRef;
42
57
  }
43
58
  export type ModelMessage = BaseMessage | MessageFieldWithRole;
44
59
  export type ModelInputItem = ModelMessage | string;
@@ -46,10 +61,23 @@ export type ModelInput = MaybeArray<ModelInputItem>;
46
61
  export interface LlmCallOptions {
47
62
  /** Short name of the operation — used as the LangChain run name and in spectator entries. */
48
63
  action: string;
49
- /** Ask the provider to cache the prompt prefix (no-op for providers without prompt caching). */
64
+ /**
65
+ * Cache the leading MESSAGES too. The composed system prompt is cached by default and
66
+ * independently of this flag — this one is about the conversation prefix, which is only
67
+ * worth caching when the same leading messages recur across calls.
68
+ */
50
69
  useCache?: boolean;
51
- /** How many leading messages to mark as cacheable (capped by the provider's own limit). */
70
+ /**
71
+ * How many leading messages form the stable prefix. One breakpoint is placed at its
72
+ * end (not one per message), capped by whatever the system prompt left unspent.
73
+ */
52
74
  cacheMax?: number;
75
+ /**
76
+ * Skill aliases for THIS call only. Rendered into the volatile `Context` block, so they
77
+ * never disturb the cached region — declare a skill on the execution instead when it
78
+ * should be part of the shared prefix.
79
+ */
80
+ skills?: string[];
53
81
  }
54
82
  export interface LlmAskOptions extends LlmCallOptions {
55
83
  ref?: RefferedResult<AIMessage>;
@@ -165,10 +193,32 @@ export interface ModelConfig {
165
193
  * rotating providers mid-call would flip the structured-output format.
166
194
  */
167
195
  fallback?: Partial<ModelConfig>;
196
+ /**
197
+ * Per-model override of {@link MIN_CACHEABLE_TOKENS} — the shortest prefix worth a
198
+ * cache breakpoint. Anthropic's own minimum is model-dependent and NOT monotonic
199
+ * across generations (512 on the newest, 1024 on most, 4096 on a few older ones), so a
200
+ * preset that pins an old model should raise this rather than pay for markers that
201
+ * silently never cache.
202
+ */
203
+ cacheMinTokens?: number;
204
+ /**
205
+ * Cache-routing key for providers whose prompt cache is automatic (OpenAI's
206
+ * `prompt_cache_key`): requests sharing a key are routed to the same backend, which
207
+ * raises the hit rate for a shared prefix. Must be STABLE and low-cardinality — one
208
+ * value per role, never per user or per request. Defaults to the config alias.
209
+ */
210
+ cacheKey?: string;
168
211
  }
169
212
  export interface LlmServiceOptions {
170
213
  /** The full config list; resolved by `alias` on every `getModel` call. */
171
214
  models: () => ModelConfig[];
215
+ /**
216
+ * Idle deadline (ms) applied to every model this service builds, unless the model's own
217
+ * config overrides it. This is the knob an application sets where it composes its
218
+ * context — one place to tune how long the whole deployment waits on a silent provider,
219
+ * without touching a preset. Falls back to {@link MODEL_STREAM_TIMEOUT_MS}.
220
+ */
221
+ streamTimeout?: number;
172
222
  }
173
223
  /**
174
224
  * Model factory and registry. Builds a `BaseChatModel` from a `ModelConfig` through the
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,18 @@
1
1
  import type { MessageFieldWithRole } from '@langchain/core/messages';
2
+ /**
3
+ * Drop every `cache_control` marker from the messages.
4
+ *
5
+ * Markers are placed in-place, on the caller's own message objects — and a caller that
6
+ * carries its message array across calls (the coder's growing conversation, a fix loop
7
+ * re-sending the same sources) hands them back still marked. The provider counts markers
8
+ * per REQUEST, not per message: Anthropic rejects the fifth outright with
9
+ * `400 A maximum of 4 blocks with cache_control may be provided. Found 5.`, and since a
10
+ * 400 is fatal it burns the entire retry budget before surfacing.
11
+ *
12
+ * So the pipeline always starts from a clean slate and re-places its own markers, which
13
+ * makes the per-request count a function of THIS call alone.
14
+ */
15
+ export declare const stripCacheMarkers: (msgs: MessageFieldWithRole[]) => void;
2
16
  /**
3
17
  * Ensure the word "json" appears somewhere in the prompt. Several providers refuse or
4
18
  * 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;;;;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":"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"}
@@ -19,6 +19,38 @@ const appendDirective = (msgs, text) => {
19
19
  msgs.push({ role: 'user', content: text });
20
20
  }
21
21
  };
22
+ /**
23
+ * Drop every `cache_control` marker from the messages.
24
+ *
25
+ * Markers are placed in-place, on the caller's own message objects — and a caller that
26
+ * carries its message array across calls (the coder's growing conversation, a fix loop
27
+ * re-sending the same sources) hands them back still marked. The provider counts markers
28
+ * per REQUEST, not per message: Anthropic rejects the fifth outright with
29
+ * `400 A maximum of 4 blocks with cache_control may be provided. Found 5.`, and since a
30
+ * 400 is fatal it burns the entire retry budget before surfacing.
31
+ *
32
+ * So the pipeline always starts from a clean slate and re-places its own markers, which
33
+ * makes the per-request count a function of THIS call alone.
34
+ */
35
+ export const stripCacheMarkers = (msgs) => {
36
+ for (const msg of msgs) {
37
+ if (!Array.isArray(msg.content)) {
38
+ continue;
39
+ }
40
+ let found = false;
41
+ const blocks = msg.content.map(part => {
42
+ if (typeof part === 'object' && part !== null && 'cache_control' in part) {
43
+ found = true;
44
+ const { cache_control: _dropped, ...rest } = part;
45
+ return rest;
46
+ }
47
+ return part;
48
+ });
49
+ if (found) {
50
+ msg.content = blocks;
51
+ }
52
+ }
53
+ };
22
54
  /**
23
55
  * Ensure the word "json" appears somewhere in the prompt. Several providers refuse or
24
56
  * 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":"AACA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEnE,MAAM,eAAe,GAAG,CAAC,GAAyB,EAAE,MAAc,EAAW,EAAE;IAC7E,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACtF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CACrB,CAAC,IAAa,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,IAAK,IAAgC;eACtG,OAAQ,IAA+B,CAAC,IAAI,KAAK,QAAQ;eACxD,IAA+B,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC1E,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,qGAAqG;AACrG,MAAM,eAAe,GAAG,CAAC,IAA4B,EAAE,IAAY,EAAQ,EAAE;IAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAClC,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAA;IAC3C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAA4B,EAAQ,EAAE;IACtE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAAE,OAAM;IAC1D,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;AACzC,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAA4B,EAAE,eAAoC,EAAQ,EAAE;IACvG,IAAI,eAAe,KAAK,IAAI;QAAE,OAAM;IACpC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAAE,OAAM;IACzG,eAAe,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;AAC3C,CAAC,CAAA"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/llm",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -33,6 +33,13 @@
33
33
  "default": "./build/helpers/index.js",
34
34
  "module": "./build/helpers/index.js",
35
35
  "types": "./build/helpers/index.d.ts"
36
+ },
37
+ "./prompt": {
38
+ "import": "./build/prompt/index.js",
39
+ "require": "./build/prompt/index.js",
40
+ "default": "./build/prompt/index.js",
41
+ "module": "./build/prompt/index.js",
42
+ "types": "./build/prompt/index.d.ts"
36
43
  }
37
44
  },
38
45
  "devDependencies": {
@@ -40,7 +47,7 @@
40
47
  "@langchain/core": "^1.1.39",
41
48
  "@langchain/openai": "^1.4.4",
42
49
  "@owlmeans/dep-config": "workspace:*",
43
- "@owlmeans/test": "^0.1.15",
50
+ "@owlmeans/test": "^0.1.16",
44
51
  "@types/bun": "^1.3.14",
45
52
  "@types/node": "^26.1.0",
46
53
  "nodemon": "^3.1.14",
@@ -48,10 +55,10 @@
48
55
  },
49
56
  "dependencies": {
50
57
  "@anthropic-ai/sdk": "^0.78.0",
51
- "@owlmeans/basic-ids": "^0.1.15",
52
- "@owlmeans/context": "^0.1.15",
53
- "@owlmeans/error": "^0.1.15",
54
- "@owlmeans/llm-common": "^0.1.15",
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",
55
62
  "ajv": "^8.17.1"
56
63
  },
57
64
  "publishConfig": {
package/src/consts.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ExecutionEffort } from '@owlmeans/llm-common'
2
- import type { ModelConfigPatch } from '@owlmeans/llm-common'
2
+ import type { CacheTtl, ModelConfigPatch } from '@owlmeans/llm-common'
3
3
 
4
4
  /** Context-service alias for the {@link LlmService} (model factory / registry). */
5
5
  export const LLM_SERVICE = 'owlmeans-llm-service'
@@ -7,6 +7,9 @@ export const LLM_SERVICE = 'owlmeans-llm-service'
7
7
  /** Context-service alias for the {@link ExecutionService}. */
8
8
  export const EXECUTION_SERVICE = 'owlmeans-llm-execution-service'
9
9
 
10
+ /** Context-service alias for the {@link PromptService} (skill registry + composition). */
11
+ export const PROMPT_SERVICE = 'owlmeans-llm-prompt-service'
12
+
10
13
  /** Default number of attempts a single model call makes before giving up. */
11
14
  export const DEFAULT_MODEL_RETRIES = 8
12
15
 
@@ -17,9 +20,15 @@ export const DEFAULT_MODEL_RETRIES = 8
17
20
  * against a provider that accepts the request and then never streams anything (observed
18
21
  * with throughput-sorted OpenRouter routing), which would otherwise block forever —
19
22
  * `maxRetries` never helps there because the request never errors, it just hangs.
20
- * Overridable per model via `ModelConfig.streamTimeout`.
23
+ * Overridable per model via `ModelConfig.streamTimeout`, or for every model at once via
24
+ * `LlmServiceOptions.streamTimeout` where the application composes its context.
25
+ *
26
+ * Three minutes, not longer: the timer resets on every token, so a legitimately long
27
+ * generation is never at risk — this only bounds SILENCE. The cost of a high value is
28
+ * paid entirely by hung calls, and a hang that takes five minutes to notice is a hang
29
+ * that can stall an agent run for half an hour once retries multiply it.
21
30
  */
22
- export const MODEL_STREAM_TIMEOUT_MS = 5 * 60 * 1000
31
+ export const MODEL_STREAM_TIMEOUT_MS = 3 * 60 * 1000
23
32
 
24
33
  /**
25
34
  * Number of failed attempts after which the retry escalator switches from a role's
@@ -37,9 +46,38 @@ export const FALLBACK_AFTER_ATTEMPTS = 3
37
46
  */
38
47
  export const DEFAULT_MAX_OUTPUT_CAP = 3 * 64000
39
48
 
40
- /** Provider hard limit on prompt-cache breakpoints (Anthropic). */
49
+ /** Provider hard limit on prompt-cache breakpoints per REQUEST (Anthropic). */
41
50
  export const MAX_CACHE_BREAKPOINTS = 4
42
51
 
52
+ /**
53
+ * Share of {@link MAX_CACHE_BREAKPOINTS} the composed system prompt may spend.
54
+ *
55
+ * Two is all it can use: the only STABLE boundaries are the end of role+skills and the end
56
+ * of the packages block. The trailing context block is volatile and deliberately never
57
+ * marked, so the remaining two breakpoints always stay available to the message prefix.
58
+ */
59
+ export const MAX_SYSTEM_BREAKPOINTS = 2
60
+
61
+ /** Cache lifetime used when neither the call nor the service asks for another. */
62
+ export const DEFAULT_CACHE_TTL: CacheTtl = '5m'
63
+
64
+ /**
65
+ * Smallest prefix worth marking as cacheable, in tokens. Providers silently refuse to
66
+ * create an entry below their own threshold (1024 tokens on most Claude models, 512 on
67
+ * the newest, 4096 on a few older ones — it is NOT monotonic across generations), so a
68
+ * marker on a short prefix costs nothing but wastes a breakpoint and produces a
69
+ * "caching enabled" log for an entry that was never written. Override per model with
70
+ * `ModelConfig.cacheMinTokens`.
71
+ */
72
+ export const MIN_CACHEABLE_TOKENS = 1024
73
+
74
+ /**
75
+ * Characters per token used to size a prefix against {@link MIN_CACHEABLE_TOKENS}. A rough
76
+ * average for English prose and TypeScript; only ever used to decide whether marking is
77
+ * worth a breakpoint, never for billing or budgeting.
78
+ */
79
+ export const CHARS_PER_TOKEN = 4
80
+
43
81
  /**
44
82
  * Appended to the prompt of `invoke`/`request` when no message already mentions JSON.
45
83
  * Some providers refuse or ignore JSON modes unless the word appears in the prompt;
@@ -85,5 +123,5 @@ export const EFFORT_TABLE: Record<ExecutionEffort, ModelConfigPatch> = {
85
123
  * without excluding it every `derive`/`escalate`/`withPurpose` would nest another copy.
86
124
  */
87
125
  export const COLLABORATOR_KEYS: string[] = [
88
- 'state', 'models', 'model', 'temperatureFactory', 'outputErrors',
126
+ 'state', 'models', 'model', 'temperatureFactory', 'outputErrors', 'files', 'prompts',
89
127
  ]