@owlmeans/llm 0.1.14 → 0.1.16-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.
- package/agent-meta/instructions/llm-prompt-caching.instructions.md +100 -0
- package/agent-meta/instructions/llm.instructions.md +13 -3
- package/agent-meta/manifest.json +16 -2
- package/agent-meta/skills/llm/SKILL.md +54 -4
- package/agent-meta/skills/llm-prompt-caching/SKILL.md +135 -0
- package/build/consts.d.ts +36 -3
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +37 -4
- package/build/consts.js.map +1 -1
- package/build/execution/service.d.ts.map +1 -1
- package/build/execution/service.js +8 -3
- package/build/execution/service.js.map +1 -1
- package/build/execution/types.d.ts +20 -1
- package/build/execution/types.d.ts.map +1 -1
- package/build/execution/utils.d.ts +12 -1
- package/build/execution/utils.d.ts.map +1 -1
- package/build/execution/utils.js +22 -0
- package/build/execution/utils.js.map +1 -1
- package/build/helpers/cache.d.ts +17 -0
- package/build/helpers/cache.d.ts.map +1 -0
- package/build/helpers/cache.js +22 -0
- package/build/helpers/cache.js.map +1 -0
- package/build/helpers/index.d.ts +1 -0
- package/build/helpers/index.d.ts.map +1 -1
- package/build/helpers/index.js +1 -0
- package/build/helpers/index.js.map +1 -1
- package/build/helpers/spectate.d.ts.map +1 -1
- package/build/helpers/spectate.js +7 -0
- package/build/helpers/spectate.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/model.d.ts +1 -1
- package/build/model.d.ts.map +1 -1
- package/build/model.js +90 -16
- package/build/model.js.map +1 -1
- package/build/plugins/anthropic.d.ts.map +1 -1
- package/build/plugins/anthropic.js +136 -21
- package/build/plugins/anthropic.js.map +1 -1
- package/build/plugins/openai.d.ts +9 -0
- package/build/plugins/openai.d.ts.map +1 -1
- package/build/plugins/openai.js +23 -1
- package/build/plugins/openai.js.map +1 -1
- package/build/plugins/types.d.ts +38 -5
- package/build/plugins/types.d.ts.map +1 -1
- package/build/prompt/index.d.ts +5 -0
- package/build/prompt/index.d.ts.map +1 -0
- package/build/prompt/index.js +4 -0
- package/build/prompt/index.js.map +1 -0
- package/build/prompt/plugins.d.ts +24 -0
- package/build/prompt/plugins.d.ts.map +1 -0
- package/build/prompt/plugins.js +64 -0
- package/build/prompt/plugins.js.map +1 -0
- package/build/prompt/render.d.ts +28 -0
- package/build/prompt/render.d.ts.map +1 -0
- package/build/prompt/render.js +39 -0
- package/build/prompt/render.js.map +1 -0
- package/build/prompt/service.d.ts +16 -0
- package/build/prompt/service.d.ts.map +1 -0
- package/build/prompt/service.js +145 -0
- package/build/prompt/service.js.map +1 -0
- package/build/prompt/types.d.ts +101 -0
- package/build/prompt/types.d.ts.map +1 -0
- package/build/prompt/types.js +2 -0
- package/build/prompt/types.js.map +1 -0
- package/build/service.d.ts.map +1 -1
- package/build/service.js +3 -0
- package/build/service.js.map +1 -1
- package/build/types.d.ts +53 -3
- package/build/types.d.ts.map +1 -1
- package/build/utils/prompt.d.ts +14 -0
- package/build/utils/prompt.d.ts.map +1 -1
- package/build/utils/prompt.js +32 -0
- package/build/utils/prompt.js.map +1 -1
- package/package.json +13 -6
- package/src/consts.ts +43 -5
- package/src/execution/service.ts +9 -3
- package/src/execution/types.ts +21 -2
- package/src/execution/utils.ts +28 -1
- package/src/helpers/cache.ts +33 -0
- package/src/helpers/index.ts +1 -0
- package/src/helpers/spectate.ts +10 -0
- package/src/index.ts +1 -0
- package/src/model.ts +119 -16
- package/src/plugins/anthropic.ts +159 -20
- package/src/plugins/openai.ts +26 -1
- package/src/plugins/types.ts +42 -5
- package/src/prompt/index.ts +5 -0
- package/src/prompt/plugins.ts +69 -0
- package/src/prompt/render.ts +48 -0
- package/src/prompt/service.ts +194 -0
- package/src/prompt/types.ts +114 -0
- package/src/service.ts +3 -0
- package/src/types.ts +54 -3
- package/src/utils/prompt.ts +33 -0
- package/tests/execution.spec.ts +42 -0
- package/tests/plugins.spec.ts +279 -14
- package/tests/prompt.spec.ts +194 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createService } from '@owlmeans/context';
|
|
2
2
|
import { ExecutionLevel } from '@owlmeans/llm-common';
|
|
3
3
|
import { COLLABORATOR_KEYS, EXECUTION_SERVICE } from '../consts.js';
|
|
4
|
-
import { composeExecState, composeTaskState, effortPatch, freeze, mergeOverride, mergePolicy, resolveRole, } from './utils.js';
|
|
4
|
+
import { composeExecState, composeTaskState, effortPatch, freeze, mergeOverride, mergePolicy, mergePrompt, resolveRole, } from './utils.js';
|
|
5
5
|
/**
|
|
6
6
|
* Build the execution service implementation WITHOUT registering it as a context
|
|
7
7
|
* service, so a consumer can publish extra methods alongside it (observability
|
|
@@ -34,16 +34,19 @@ export const executionServiceApi = (options, self) => {
|
|
|
34
34
|
level: ExecutionLevel.Project,
|
|
35
35
|
purpose: { ...input.purpose },
|
|
36
36
|
policy: { ...input.policy },
|
|
37
|
+
...(input.prompt != null ? { prompt: { ...input.prompt } } : {}),
|
|
37
38
|
}),
|
|
38
39
|
forTask: (parent, input) => {
|
|
39
|
-
const { effort, phase, data, ...extras } = input;
|
|
40
|
+
const { effort, phase, data, prompt, ...extras } = input;
|
|
40
41
|
const policy = effort != null
|
|
41
42
|
? mergePolicy(parent.policy, { effort })
|
|
42
43
|
: { ...parent.policy };
|
|
44
|
+
const merged = mergePrompt(parent.prompt, prompt);
|
|
43
45
|
// Spreading the parent carries every collaborator and domain field forward; the
|
|
44
46
|
// task's own state is composed afterwards, from the seeded resumable fields.
|
|
45
47
|
const taskExec = {
|
|
46
48
|
...parent, ...extras, level: ExecutionLevel.Task, purpose: { ...parent.purpose }, policy,
|
|
49
|
+
...(merged != null ? { prompt: merged } : {}),
|
|
47
50
|
};
|
|
48
51
|
taskExec.state = composeTaskState({
|
|
49
52
|
...taskExec,
|
|
@@ -58,9 +61,10 @@ export const executionServiceApi = (options, self) => {
|
|
|
58
61
|
return freeze(taskExec);
|
|
59
62
|
},
|
|
60
63
|
forHelper: (parent, input) => {
|
|
61
|
-
const { role, effort, dedication, ...extras } = input;
|
|
64
|
+
const { role, effort, dedication, prompt, ...extras } = input;
|
|
62
65
|
const localPolicy = effort != null ? mergePolicy(parent.policy, { effort }) : parent.policy;
|
|
63
66
|
const scoped = { ...parent, policy: localPolicy };
|
|
67
|
+
const merged = mergePrompt(parent.prompt, prompt);
|
|
64
68
|
const helperExec = {
|
|
65
69
|
...parent,
|
|
66
70
|
...extras,
|
|
@@ -69,6 +73,7 @@ export const executionServiceApi = (options, self) => {
|
|
|
69
73
|
? { ...parent.purpose, dedication }
|
|
70
74
|
: { ...parent.purpose },
|
|
71
75
|
policy: localPolicy,
|
|
76
|
+
...(merged != null ? { prompt: merged } : {}),
|
|
72
77
|
role: resolveRole(localPolicy, role),
|
|
73
78
|
model: self().model(scoped, role),
|
|
74
79
|
temperatureFactory: self().temperatureFactory(scoped, role),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/execution/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAMnE,OAAO,EACL,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/execution/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
2
2
|
import type { InitializedService } from '@owlmeans/context';
|
|
3
|
-
import type { ExecutionEffort, ExecutionLevel, ExecutionState, LlmPurpose, ModelConfigOverride, ModelPolicy, ModelRole, TaskExecutionState } from '@owlmeans/llm-common';
|
|
3
|
+
import type { ExecutionEffort, ExecutionLevel, ExecutionState, FileProviderRef, LlmPurpose, ModelConfigOverride, ModelPolicy, ModelRole, PromptPolicy, TaskExecutionState } from '@owlmeans/llm-common';
|
|
4
4
|
import type { LlmService, TemperatureFactory } from '../types.js';
|
|
5
|
+
import type { PromptService } from '../prompt/types.js';
|
|
5
6
|
/**
|
|
6
7
|
* Runtime execution = serializable {@link ExecutionState} + attached collaborators.
|
|
7
8
|
* A frozen data object with NO behavior of its own — all logic (construct, refine,
|
|
@@ -14,6 +15,10 @@ import type { LlmService, TemperatureFactory } from '../types.js';
|
|
|
14
15
|
export interface Execution extends ExecutionState {
|
|
15
16
|
/** Resolver for the model factory — a function so the service can be swapped/cloned. */
|
|
16
17
|
models: () => LlmService;
|
|
18
|
+
/** Resolver for the skill registry / prompt composer. Same late-binding rationale. */
|
|
19
|
+
prompts?: () => PromptService;
|
|
20
|
+
/** File access offered to prompt plugins. Declared a collaborator, never snapshotted. */
|
|
21
|
+
files?: FileProviderRef;
|
|
17
22
|
outputErrors?: boolean;
|
|
18
23
|
captureNull?: boolean;
|
|
19
24
|
}
|
|
@@ -34,28 +39,42 @@ export interface HelperExecution extends Execution {
|
|
|
34
39
|
}
|
|
35
40
|
export interface ProjectExecutionInput {
|
|
36
41
|
models: () => LlmService;
|
|
42
|
+
prompts?: () => PromptService;
|
|
43
|
+
files?: FileProviderRef;
|
|
37
44
|
policy: ModelPolicy;
|
|
38
45
|
purpose: LlmPurpose;
|
|
46
|
+
/** Baseline role and skills for the whole run. */
|
|
47
|
+
prompt?: PromptPolicy;
|
|
39
48
|
outputErrors?: boolean;
|
|
40
49
|
captureNull?: boolean;
|
|
41
50
|
}
|
|
42
51
|
export interface TaskExecutionInput {
|
|
43
52
|
/** Raise (or lower) the effort tier for this task and everything derived from it. */
|
|
44
53
|
effort?: ExecutionEffort;
|
|
54
|
+
/** Skills (and optionally a role) layered on top of the project's. Skills accumulate. */
|
|
55
|
+
prompt?: PromptPolicy;
|
|
45
56
|
/** Optional seeds for the resumable task state. */
|
|
46
57
|
phase?: string;
|
|
47
58
|
data?: Record<string, unknown>;
|
|
48
59
|
}
|
|
49
60
|
export interface HelperExecutionInput {
|
|
61
|
+
/**
|
|
62
|
+
* Which MODEL to use. Distinct from `prompt.role`, which is the system-prompt text
|
|
63
|
+
* defining the persona — one selects hardware, the other writes the job description.
|
|
64
|
+
*/
|
|
50
65
|
role: ModelRole;
|
|
51
66
|
/** Local effort bump without escalating the whole branch. */
|
|
52
67
|
effort?: ExecutionEffort;
|
|
68
|
+
/** The helper's persona and its own skills, layered on top of the task's. */
|
|
69
|
+
prompt?: PromptPolicy;
|
|
53
70
|
/** Refines `purpose.dedication`. */
|
|
54
71
|
dedication?: string;
|
|
55
72
|
}
|
|
56
73
|
/** Collaborators re-attached to a state that was restored from storage. */
|
|
57
74
|
export interface RestoreCollaborators {
|
|
58
75
|
models?: () => LlmService;
|
|
76
|
+
prompts?: () => PromptService;
|
|
77
|
+
files?: FileProviderRef;
|
|
59
78
|
}
|
|
60
79
|
/**
|
|
61
80
|
* Resilience extension seam. A plugin observes flow boundaries (via
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/execution/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAA;AAChF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,KAAK,EACV,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/execution/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,19 @@
|
|
|
1
|
-
import type { ExecutionEffort, ExecutionState, ModelConfigOverride, ModelConfigPatch, ModelPolicy, ModelRole, TaskExecutionState } from '@owlmeans/llm-common';
|
|
1
|
+
import type { ExecutionEffort, ExecutionState, ModelConfigOverride, ModelConfigPatch, ModelPolicy, ModelRole, PromptPolicy, TaskExecutionState } from '@owlmeans/llm-common';
|
|
2
2
|
import type { Execution, TaskExecution } from './types.js';
|
|
3
3
|
export declare const freeze: <T extends object>(o: T) => Readonly<T>;
|
|
4
4
|
/** Overlay a partial policy onto a base one. Override maps are merged, not replaced. */
|
|
5
5
|
export declare const mergePolicy: (base: ModelPolicy, patch: Partial<ModelPolicy>) => ModelPolicy;
|
|
6
|
+
/**
|
|
7
|
+
* Overlay a prompt policy onto the one inherited from the parent level.
|
|
8
|
+
*
|
|
9
|
+
* Skills ACCUMULATE — a task adds to what the project declared, a helper adds to the
|
|
10
|
+
* task — because that is how a capability set is built up as work narrows. The role is
|
|
11
|
+
* replaced instead: the deepest level that names one owns the persona.
|
|
12
|
+
*
|
|
13
|
+
* The union preserves first-seen order and de-duplicates, so the composed prompt is
|
|
14
|
+
* byte-identical no matter how many levels contributed the same skill.
|
|
15
|
+
*/
|
|
16
|
+
export declare const mergePrompt: (base: PromptPolicy | undefined, patch: PromptPolicy | undefined) => PromptPolicy | undefined;
|
|
6
17
|
/** Apply the policy's role→role remap. */
|
|
7
18
|
export declare const resolveRole: (policy: ModelPolicy, role: ModelRole) => ModelRole;
|
|
8
19
|
export declare const effortPatch: (effort: ExecutionEffort) => ModelConfigPatch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/execution/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EACtE,WAAW,EAAE,SAAS,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/execution/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EACtE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EACzD,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1D,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,MAAM,EAAE,GAAG,CAAC,KAAG,QAAQ,CAAC,CAAC,CAAqB,CAAA;AAE/E,wFAAwF;AACxF,eAAO,MAAM,WAAW,GAAI,MAAM,WAAW,EAAE,OAAO,OAAO,CAAC,WAAW,CAAC,KAAG,WAQ3E,CAAA;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,YAAY,GAAG,SAAS,EAC9B,OAAO,YAAY,GAAG,SAAS,KAC9B,YAAY,GAAG,SAYjB,CAAA;AAED,0CAA0C;AAC1C,eAAO,MAAM,WAAW,GAAI,QAAQ,WAAW,EAAE,MAAM,SAAS,KAAG,SACF,CAAA;AAEjE,eAAO,MAAM,WAAW,GAAI,QAAQ,eAAe,KAAG,gBAAwC,CAAA;AAE9F,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,GAAI,UAAU,mBAAmB,KAAG,gBACH,CAAA;AAEhE;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,YAAY,gBAAgB,EAC5B,gBAAgB,mBAAmB,GAAG,SAAS,EAC/C,cAAc,mBAAmB,GAAG,SAAS,KAC5C,gBAIF,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,SAAS,EAAE,kBAAkB,MAAM,EAAE,KAAG,cAQ9E,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,aAAa,EAAE,kBAAkB,MAAM,EAAE,KAAG,kBAWlF,CAAA"}
|
package/build/execution/utils.js
CHANGED
|
@@ -11,6 +11,28 @@ export const mergePolicy = (base, patch) => ({
|
|
|
11
11
|
? { ...base.modelOverrides, ...patch.modelOverrides }
|
|
12
12
|
: undefined,
|
|
13
13
|
});
|
|
14
|
+
/**
|
|
15
|
+
* Overlay a prompt policy onto the one inherited from the parent level.
|
|
16
|
+
*
|
|
17
|
+
* Skills ACCUMULATE — a task adds to what the project declared, a helper adds to the
|
|
18
|
+
* task — because that is how a capability set is built up as work narrows. The role is
|
|
19
|
+
* replaced instead: the deepest level that names one owns the persona.
|
|
20
|
+
*
|
|
21
|
+
* The union preserves first-seen order and de-duplicates, so the composed prompt is
|
|
22
|
+
* byte-identical no matter how many levels contributed the same skill.
|
|
23
|
+
*/
|
|
24
|
+
export const mergePrompt = (base, patch) => {
|
|
25
|
+
if (base == null && patch == null) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const skills = [...new Set([...(base?.skills ?? []), ...(patch?.skills ?? [])])];
|
|
29
|
+
return {
|
|
30
|
+
...base,
|
|
31
|
+
...patch,
|
|
32
|
+
...(base?.role != null || patch?.role != null ? { role: patch?.role ?? base?.role } : {}),
|
|
33
|
+
...(skills.length > 0 ? { skills } : {}),
|
|
34
|
+
};
|
|
35
|
+
};
|
|
14
36
|
/** Apply the policy's role→role remap. */
|
|
15
37
|
export const resolveRole = (policy, role) => policy.roleOverrides?.[role] ?? role;
|
|
16
38
|
export const effortPatch = (effort) => EFFORT_TABLE[effort];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/execution/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/execution/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { UsageMetadata } from '@langchain/core/messages';
|
|
2
|
+
import type { CacheUsage } from '@owlmeans/llm-common';
|
|
3
|
+
/**
|
|
4
|
+
* Prompt-cache accounting for one completion.
|
|
5
|
+
*
|
|
6
|
+
* This is the only honest answer to "is caching actually working". A composed prefix can
|
|
7
|
+
* look perfectly stable and still miss on every call — a stray timestamp, a set iterated
|
|
8
|
+
* in a different order, a tool list rebuilt per request. If `read` stays at zero across
|
|
9
|
+
* repeated calls that share a prefix, something is invalidating it; diff the rendered
|
|
10
|
+
* blocks between two calls to find out what.
|
|
11
|
+
*/
|
|
12
|
+
export declare const readCacheUsage: (message: {
|
|
13
|
+
usage_metadata?: UsageMetadata;
|
|
14
|
+
}) => CacheUsage;
|
|
15
|
+
/** `true` when the provider reported any cache activity at all. */
|
|
16
|
+
export declare const hasCacheActivity: (usage: CacheUsage) => boolean;
|
|
17
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/helpers/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAQtD;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS;IAAE,cAAc,CAAC,EAAE,aAAa,CAAA;CAAE,KAAG,UAU5E,CAAA;AAED,mEAAmE;AACnE,eAAO,MAAM,gBAAgB,GAAI,OAAO,UAAU,KAAG,OACf,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt-cache accounting for one completion.
|
|
3
|
+
*
|
|
4
|
+
* This is the only honest answer to "is caching actually working". A composed prefix can
|
|
5
|
+
* look perfectly stable and still miss on every call — a stray timestamp, a set iterated
|
|
6
|
+
* in a different order, a tool list rebuilt per request. If `read` stays at zero across
|
|
7
|
+
* repeated calls that share a prefix, something is invalidating it; diff the rendered
|
|
8
|
+
* blocks between two calls to find out what.
|
|
9
|
+
*/
|
|
10
|
+
export const readCacheUsage = (message) => {
|
|
11
|
+
const usage = message.usage_metadata;
|
|
12
|
+
const details = usage?.input_token_details;
|
|
13
|
+
return {
|
|
14
|
+
read: details?.cache_read ?? 0,
|
|
15
|
+
creation: details?.cache_creation ?? 0,
|
|
16
|
+
input: usage?.input_tokens ?? 0,
|
|
17
|
+
output: usage?.output_tokens ?? 0,
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
/** `true` when the provider reported any cache activity at all. */
|
|
21
|
+
export const hasCacheActivity = (usage) => usage.read > 0 || usage.creation > 0;
|
|
22
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/helpers/cache.ts"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAA2C,EAAc,EAAE;IACxF,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAA;IACpC,MAAM,OAAO,GAAG,KAAK,EAAE,mBAAoD,CAAA;IAE3E,OAAO;QACL,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC;QAC9B,QAAQ,EAAE,OAAO,EAAE,cAAc,IAAI,CAAC;QACtC,KAAK,EAAE,KAAK,EAAE,YAAY,IAAI,CAAC;QAC/B,MAAM,EAAE,KAAK,EAAE,aAAa,IAAI,CAAC;KAClC,CAAA;AACH,CAAC,CAAA;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAiB,EAAW,EAAE,CAC7D,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAA"}
|
package/build/helpers/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
|
package/build/helpers/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spectate.d.ts","sourceRoot":"","sources":["../../src/helpers/spectate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,0BAA0B,CAAA;AAIjE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"spectate.d.ts","sourceRoot":"","sources":["../../src/helpers/spectate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,0BAA0B,CAAA;AAIjE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AA+B/D;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW,YAAY,EAAE,UAAU,MAAM,MAE9D,OAAO,cAAc,EAAE,EACvB,SAAS,SAAS,EAClB,QAAQ,MAAM,EACd,SAAS,MAAM,EACf,YAAY,MAAM,iEA+BnB,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BaseMessage } from '@langchain/core/messages';
|
|
2
2
|
import { SpectatorContentType } from '@owlmeans/llm-common';
|
|
3
|
+
import { hasCacheActivity, readCacheUsage } from './cache.js';
|
|
3
4
|
/** Normalize one prompt message into the spectator's storage shape. */
|
|
4
5
|
const describeInput = (msg, callType) => {
|
|
5
6
|
const entry = {
|
|
@@ -49,6 +50,12 @@ export const spectate = (spectator, callType) => async (input, message, action,
|
|
|
49
50
|
else {
|
|
50
51
|
completion.content = message.content;
|
|
51
52
|
}
|
|
53
|
+
// Silent unless the provider reported cache activity, so it costs nothing when
|
|
54
|
+
// caching is off — and is the one signal that tells a stable prefix from a broken one.
|
|
55
|
+
const cache = readCacheUsage(message);
|
|
56
|
+
if (hasCacheActivity(cache)) {
|
|
57
|
+
console.log(`Prompt cache [${action}]: read ${cache.read}, written ${cache.creation}, uncached ${cache.input}`);
|
|
58
|
+
}
|
|
52
59
|
return spectator.log({ action, retries, startedAt, messages: [...messages, completion] });
|
|
53
60
|
};
|
|
54
61
|
//# sourceMappingURL=spectate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spectate.js","sourceRoot":"","sources":["../../src/helpers/spectate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"spectate.js","sourceRoot":"","sources":["../../src/helpers/spectate.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export * from './model.js';
|
|
|
5
5
|
export * from './service.js';
|
|
6
6
|
export * from './helpers/index.js';
|
|
7
7
|
export * from './execution/index.js';
|
|
8
|
+
export * from './prompt/index.js';
|
|
8
9
|
export type * from './plugins/types.js';
|
|
9
10
|
export { plugins, registerLlmPlugin, pluginOf, pluginFor, resolvePlugin } from './plugins/index.js';
|
|
10
11
|
export { anthropicPlugin, ANTHROPIC_FAMILY } from './plugins/anthropic.js';
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,mBAAmB,YAAY,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,mBAAmB,oBAAoB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnG,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,mBAAmB,YAAY,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,mBAAmB,oBAAoB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnG,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
package/build/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export * from './model.js';
|
|
|
4
4
|
export * from './service.js';
|
|
5
5
|
export * from './helpers/index.js';
|
|
6
6
|
export * from './execution/index.js';
|
|
7
|
+
export * from './prompt/index.js';
|
|
7
8
|
export { plugins, registerLlmPlugin, pluginOf, pluginFor, resolvePlugin } from './plugins/index.js';
|
|
8
9
|
export { anthropicPlugin, ANTHROPIC_FAMILY } from './plugins/anthropic.js';
|
|
9
10
|
export { compatiblePlugin } from './plugins/compatible.js';
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAE3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAE3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AAEjC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnG,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
package/build/model.d.ts
CHANGED
|
@@ -8,5 +8,5 @@ import type { LlmModel, LlmModelOptions, LlmSpectator } from './types.js';
|
|
|
8
8
|
* provider-independent parts: streaming under an idle deadline, retry/fallback
|
|
9
9
|
* escalation, schema validation and coercion, spectator logging, and null diagnostics.
|
|
10
10
|
*/
|
|
11
|
-
export declare const makeLlmModel: ({ model, outputErrors, captureNull, retries, purpose, }: LlmModelOptions, spectator: LlmSpectator) => LlmModel;
|
|
11
|
+
export declare const makeLlmModel: ({ model, outputErrors, captureNull, retries, purpose, prompt, prompts, files, }: LlmModelOptions, spectator: LlmSpectator) => LlmModel;
|
|
12
12
|
//# sourceMappingURL=model.d.ts.map
|
package/build/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EACuB,QAAQ,EAAE,eAAe,EAC1D,YAAY,EACb,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EACuB,QAAQ,EAAE,eAAe,EAC1D,YAAY,EACb,MAAM,YAAY,CAAA;AA8CnB;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GAAI,iFAS1B,eAAe,EAAE,WAAW,YAAY,KAAG,QAuY7C,CAAA"}
|
package/build/model.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Ajv } from 'ajv';
|
|
2
|
-
import { AIMessage } from '@langchain/core/messages';
|
|
2
|
+
import { AIMessage, BaseMessage } from '@langchain/core/messages';
|
|
3
3
|
import { StructuredMode } from '@owlmeans/llm-common';
|
|
4
|
-
import { DEFAULT_MAX_OUTPUT_CAP, DEFAULT_MODEL_RETRIES, FALLBACK_AFTER_ATTEMPTS, } from './consts.js';
|
|
4
|
+
import { DEFAULT_MAX_OUTPUT_CAP, DEFAULT_MODEL_RETRIES, FALLBACK_AFTER_ATTEMPTS, MAX_CACHE_BREAKPOINTS, } from './consts.js';
|
|
5
5
|
import { LlmModelError } from './errors.js';
|
|
6
6
|
import { pluginFor, pluginOf } from './plugins/index.js';
|
|
7
7
|
import { coerceToSchema, parseJsonContent } from './helpers/json.js';
|
|
@@ -10,9 +10,46 @@ import { withRetry } from './helpers/retry.js';
|
|
|
10
10
|
import { spectate } from './helpers/spectate.js';
|
|
11
11
|
import { idleTimeout, readConfig } from './utils/config.js';
|
|
12
12
|
import { reportNull } from './utils/null-report.js';
|
|
13
|
-
import { applyNoThink, ensureJsonMention } from './utils/prompt.js';
|
|
13
|
+
import { applyNoThink, ensureJsonMention, stripCacheMarkers } from './utils/prompt.js';
|
|
14
14
|
import { resolveSchemaValidator, toToolName, unwrapNamed } from './utils/schema.js';
|
|
15
15
|
import { streamWithDeadline } from './utils/stream.js';
|
|
16
|
+
const isSystem = (msg) => msg instanceof BaseMessage ? msg.getType() === 'system' : `${msg.role}` === 'system';
|
|
17
|
+
const textOf = (content) => {
|
|
18
|
+
if (typeof content === 'string') {
|
|
19
|
+
return content.trim();
|
|
20
|
+
}
|
|
21
|
+
if (Array.isArray(content)) {
|
|
22
|
+
return content
|
|
23
|
+
.map(part => {
|
|
24
|
+
const text = part.text;
|
|
25
|
+
return typeof text === 'string' ? text : '';
|
|
26
|
+
})
|
|
27
|
+
.filter(text => text !== '')
|
|
28
|
+
.join('\n\n')
|
|
29
|
+
.trim();
|
|
30
|
+
}
|
|
31
|
+
return '';
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Detach the caller's LEADING system messages and return their text.
|
|
35
|
+
*
|
|
36
|
+
* They are re-emitted as the `Context` block of the composed prompt, which is what keeps
|
|
37
|
+
* a caller that still builds its own `SystemMessage` working unchanged — the text simply
|
|
38
|
+
* travels a different route and lands in the same place. Only the leading run is taken:
|
|
39
|
+
* a system message deliberately placed mid-conversation is an operator instruction whose
|
|
40
|
+
* position carries meaning, and moving it would change what the model sees.
|
|
41
|
+
*/
|
|
42
|
+
const takeLeadingSystem = (msgs) => {
|
|
43
|
+
const carried = [];
|
|
44
|
+
while (msgs.length > 0 && isSystem(msgs[0])) {
|
|
45
|
+
const [msg] = msgs.splice(0, 1);
|
|
46
|
+
const text = textOf(msg.content);
|
|
47
|
+
if (text !== '') {
|
|
48
|
+
carried.push(text);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return carried;
|
|
52
|
+
};
|
|
16
53
|
/**
|
|
17
54
|
* Build the four-method model API on top of a LangChain chat model.
|
|
18
55
|
*
|
|
@@ -22,22 +59,59 @@ import { streamWithDeadline } from './utils/stream.js';
|
|
|
22
59
|
* provider-independent parts: streaming under an idle deadline, retry/fallback
|
|
23
60
|
* escalation, schema validation and coercion, spectator logging, and null diagnostics.
|
|
24
61
|
*/
|
|
25
|
-
export const makeLlmModel = ({ model, outputErrors = false, captureNull = false, retries = DEFAULT_MODEL_RETRIES, purpose, }, spectator) => {
|
|
62
|
+
export const makeLlmModel = ({ model, outputErrors = false, captureNull = false, retries = DEFAULT_MODEL_RETRIES, purpose, prompt, prompts, files, }, spectator) => {
|
|
26
63
|
const ajv = new Ajv({ strict: false });
|
|
27
64
|
// The original config and its plugin are static per model instance: a REFINED instance
|
|
28
65
|
// is rebuilt from `lc_kwargs` and does not reliably carry the metadata back.
|
|
29
66
|
const config = readConfig(model);
|
|
30
67
|
const plugin = pluginOf(config.provider) ?? pluginFor(model);
|
|
31
68
|
const timeout = idleTimeout(config);
|
|
32
|
-
/**
|
|
33
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Normalize, compose the system prompt, then apply every in-place prompt adaptation, in
|
|
71
|
+
* dependency order.
|
|
72
|
+
*
|
|
73
|
+
* With no prompt service wired this is exactly what it always was — the caller's
|
|
74
|
+
* messages, a JSON nudge, `/no_think`, cache markers. With one, the caller's leading
|
|
75
|
+
* system text is folded into a composed prompt whose stable sections come first, which
|
|
76
|
+
* is the whole point: a prompt cache is a PREFIX match, so the bytes every call shares
|
|
77
|
+
* have to be physically ahead of the bytes that differ.
|
|
78
|
+
*/
|
|
79
|
+
const prepare = async (input, action, useCache, cacheMax, json, callSkills) => {
|
|
34
80
|
const msgs = normalizeInput(input);
|
|
81
|
+
// The caller may hand back messages this pipeline marked on a PREVIOUS call — the
|
|
82
|
+
// markers live on its own objects. The budget is per request, so clear them and
|
|
83
|
+
// re-place our own below; otherwise they accumulate until the provider 400s.
|
|
84
|
+
stripCacheMarkers(msgs);
|
|
85
|
+
let reserved = 0;
|
|
86
|
+
if (prompts != null) {
|
|
87
|
+
const carried = takeLeadingSystem(msgs);
|
|
88
|
+
const composed = await prompts().compose({
|
|
89
|
+
...prompt,
|
|
90
|
+
context: [...(prompt?.context ?? []), ...carried],
|
|
91
|
+
callSkills: callSkills ?? prompt?.callSkills,
|
|
92
|
+
}, msgs, { model, provider: plugin, purpose, action, cacheMax, files });
|
|
93
|
+
if (composed.system != null) {
|
|
94
|
+
msgs.unshift(composed.system);
|
|
95
|
+
reserved = composed.breakpoints;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Defensive: nothing was contributed, so hand the caller's own text straight back.
|
|
99
|
+
for (let i = carried.length - 1; i >= 0; i--) {
|
|
100
|
+
msgs.unshift({ role: 'system', content: carried[i] });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
35
104
|
if (json)
|
|
36
105
|
ensureJsonMention(msgs);
|
|
37
106
|
applyNoThink(msgs, config.disableThinking);
|
|
38
107
|
// Cache markers replace string content with content blocks, so they must go last.
|
|
39
|
-
|
|
40
|
-
|
|
108
|
+
const ttl = prompt?.cacheTtl;
|
|
109
|
+
const marked = plugin?.patchCache?.(msgs, {
|
|
110
|
+
model, useCache, cacheMax, reserved, ...(ttl != null ? { ttl } : {}),
|
|
111
|
+
});
|
|
112
|
+
if (reserved > 0 || marked === true) {
|
|
113
|
+
console.log(`Prompt caching for ${plugin?.type}: ${reserved} system breakpoint(s)`
|
|
114
|
+
+ `${marked === true ? ', 1 message breakpoint' : ''}`);
|
|
41
115
|
}
|
|
42
116
|
return msgs;
|
|
43
117
|
};
|
|
@@ -145,8 +219,8 @@ export const makeLlmModel = ({ model, outputErrors = false, captureNull = false,
|
|
|
145
219
|
return { piece, result, mode };
|
|
146
220
|
};
|
|
147
221
|
const helper = {
|
|
148
|
-
ask: async (input, { ref, filter, action, useCache = false, cacheMax =
|
|
149
|
-
const msgs = prepare(input, useCache, cacheMax, false);
|
|
222
|
+
ask: async (input, { ref, filter, action, useCache = false, cacheMax = MAX_CACHE_BREAKPOINTS, skills }) => {
|
|
223
|
+
const msgs = await prepare(input, action, useCache, cacheMax, false, skills);
|
|
150
224
|
return withRetry({ retries, outputErrors }, async (i) => {
|
|
151
225
|
const refined = refineModel(i);
|
|
152
226
|
console.log('Use model to ask: ', refined.getName(), refined.lc_kwargs.model);
|
|
@@ -183,8 +257,8 @@ export const makeLlmModel = ({ model, outputErrors = false, captureNull = false,
|
|
|
183
257
|
return output;
|
|
184
258
|
});
|
|
185
259
|
},
|
|
186
|
-
talk: async (input, { ref, filter, action, useCache = false, cacheMax =
|
|
187
|
-
const msgs = prepare(input, useCache, cacheMax, false);
|
|
260
|
+
talk: async (input, { ref, filter, action, useCache = false, cacheMax = MAX_CACHE_BREAKPOINTS, skills }) => {
|
|
261
|
+
const msgs = await prepare(input, action, useCache, cacheMax, false, skills);
|
|
188
262
|
return withRetry({ retries, outputErrors }, async (i) => {
|
|
189
263
|
const refined = refineModel(i);
|
|
190
264
|
console.log('Use model to talk: ', refined.getName(), refined.lc_kwargs.model);
|
|
@@ -210,8 +284,8 @@ export const makeLlmModel = ({ model, outputErrors = false, captureNull = false,
|
|
|
210
284
|
return message;
|
|
211
285
|
});
|
|
212
286
|
},
|
|
213
|
-
invoke: async (input, schema, { temperature, ref, filter, action, useCache = false, cacheMax =
|
|
214
|
-
const msgs = prepare(input, useCache, cacheMax, true);
|
|
287
|
+
invoke: async (input, schema, { temperature, ref, filter, action, useCache = false, cacheMax = MAX_CACHE_BREAKPOINTS, skills }) => {
|
|
288
|
+
const msgs = await prepare(input, action, useCache, cacheMax, true, skills);
|
|
215
289
|
const { name, innerSchema, validate } = resolveSchemaValidator(ajv, schema);
|
|
216
290
|
const toolName = toToolName(innerSchema.title ?? name);
|
|
217
291
|
return withRetry({ retries, outputErrors }, async (i) => {
|
|
@@ -248,8 +322,8 @@ export const makeLlmModel = ({ model, outputErrors = false, captureNull = false,
|
|
|
248
322
|
return result;
|
|
249
323
|
});
|
|
250
324
|
},
|
|
251
|
-
request: async (input, schema, { ref, filter, action, useCache = false, cacheMax =
|
|
252
|
-
const msgs = prepare(input, useCache, cacheMax, true);
|
|
325
|
+
request: async (input, schema, { ref, filter, action, useCache = false, cacheMax = MAX_CACHE_BREAKPOINTS, skills }) => {
|
|
326
|
+
const msgs = await prepare(input, action, useCache, cacheMax, true, skills);
|
|
253
327
|
const { name, innerSchema, validate } = resolveSchemaValidator(ajv, schema);
|
|
254
328
|
const toolName = toToolName(innerSchema.title ?? name);
|
|
255
329
|
return withRetry({ retries, outputErrors }, async (i) => {
|