@cat-factory/agents 0.6.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/LICENSE +21 -0
- package/dist/agents/AiAgentExecutor.d.ts +72 -0
- package/dist/agents/AiAgentExecutor.d.ts.map +1 -0
- package/dist/agents/AiAgentExecutor.js +125 -0
- package/dist/agents/AiAgentExecutor.js.map +1 -0
- package/dist/agents/acceptance-prompts.d.ts +29 -0
- package/dist/agents/acceptance-prompts.d.ts.map +1 -0
- package/dist/agents/acceptance-prompts.js +112 -0
- package/dist/agents/acceptance-prompts.js.map +1 -0
- package/dist/agents/agent-catalog.d.ts +6 -0
- package/dist/agents/agent-catalog.d.ts.map +1 -0
- package/dist/agents/agent-catalog.js +197 -0
- package/dist/agents/agent-catalog.js.map +1 -0
- package/dist/agents/agent-configs.d.ts +17 -0
- package/dist/agents/agent-configs.d.ts.map +1 -0
- package/dist/agents/agent-configs.js +66 -0
- package/dist/agents/agent-configs.js.map +1 -0
- package/dist/agents/agent-routing.d.ts +57 -0
- package/dist/agents/agent-routing.d.ts.map +1 -0
- package/dist/agents/agent-routing.js +41 -0
- package/dist/agents/agent-routing.js.map +1 -0
- package/dist/agents/business-logic-prompts.d.ts +28 -0
- package/dist/agents/business-logic-prompts.d.ts.map +1 -0
- package/dist/agents/business-logic-prompts.js +96 -0
- package/dist/agents/business-logic-prompts.js.map +1 -0
- package/dist/agents/catalog.d.ts +6 -0
- package/dist/agents/catalog.d.ts.map +1 -0
- package/dist/agents/catalog.js +168 -0
- package/dist/agents/catalog.js.map +1 -0
- package/dist/agents/ci-gate.d.ts +2 -0
- package/dist/agents/ci-gate.d.ts.map +1 -0
- package/dist/agents/ci-gate.js +33 -0
- package/dist/agents/ci-gate.js.map +1 -0
- package/dist/agents/companion-prompts.d.ts +4 -0
- package/dist/agents/companion-prompts.d.ts.map +1 -0
- package/dist/agents/companion-prompts.js +27 -0
- package/dist/agents/companion-prompts.js.map +1 -0
- package/dist/agents/companions.d.ts +20 -0
- package/dist/agents/companions.d.ts.map +1 -0
- package/dist/agents/companions.js +38 -0
- package/dist/agents/companions.js.map +1 -0
- package/dist/agents/kinds/companions.d.ts +20 -0
- package/dist/agents/kinds/companions.d.ts.map +1 -0
- package/dist/agents/kinds/companions.js +39 -0
- package/dist/agents/kinds/companions.js.map +1 -0
- package/dist/agents/kinds/configs.d.ts +17 -0
- package/dist/agents/kinds/configs.d.ts.map +1 -0
- package/dist/agents/kinds/configs.js +66 -0
- package/dist/agents/kinds/configs.js.map +1 -0
- package/dist/agents/kinds/read-only.d.ts +13 -0
- package/dist/agents/kinds/read-only.d.ts.map +1 -0
- package/dist/agents/kinds/read-only.js +32 -0
- package/dist/agents/kinds/read-only.js.map +1 -0
- package/dist/agents/kinds/registry.d.ts +70 -0
- package/dist/agents/kinds/registry.d.ts.map +1 -0
- package/dist/agents/kinds/registry.js +51 -0
- package/dist/agents/kinds/registry.js.map +1 -0
- package/dist/agents/kinds/traits.d.ts +60 -0
- package/dist/agents/kinds/traits.d.ts.map +1 -0
- package/dist/agents/kinds/traits.js +123 -0
- package/dist/agents/kinds/traits.js.map +1 -0
- package/dist/agents/kinds/versions.d.ts +46 -0
- package/dist/agents/kinds/versions.d.ts.map +1 -0
- package/dist/agents/kinds/versions.js +22 -0
- package/dist/agents/kinds/versions.js.map +1 -0
- package/dist/agents/mock-prompts.d.ts +12 -0
- package/dist/agents/mock-prompts.d.ts.map +1 -0
- package/dist/agents/mock-prompts.js +61 -0
- package/dist/agents/mock-prompts.js.map +1 -0
- package/dist/agents/prompt-fragments.d.ts +17 -0
- package/dist/agents/prompt-fragments.d.ts.map +1 -0
- package/dist/agents/prompt-fragments.js +33 -0
- package/dist/agents/prompt-fragments.js.map +1 -0
- package/dist/agents/prompt-shared.d.ts +7 -0
- package/dist/agents/prompt-shared.d.ts.map +1 -0
- package/dist/agents/prompt-shared.js +10 -0
- package/dist/agents/prompt-shared.js.map +1 -0
- package/dist/agents/prompt-versions.d.ts +48 -0
- package/dist/agents/prompt-versions.d.ts.map +1 -0
- package/dist/agents/prompt-versions.js +55 -0
- package/dist/agents/prompt-versions.js.map +1 -0
- package/dist/agents/prompts/acceptance.d.ts +29 -0
- package/dist/agents/prompts/acceptance.d.ts.map +1 -0
- package/dist/agents/prompts/acceptance.js +112 -0
- package/dist/agents/prompts/acceptance.js.map +1 -0
- package/dist/agents/prompts/business-logic.d.ts +28 -0
- package/dist/agents/prompts/business-logic.d.ts.map +1 -0
- package/dist/agents/prompts/business-logic.js +98 -0
- package/dist/agents/prompts/business-logic.js.map +1 -0
- package/dist/agents/prompts/clarity.d.ts +10 -0
- package/dist/agents/prompts/clarity.d.ts.map +1 -0
- package/dist/agents/prompts/clarity.js +40 -0
- package/dist/agents/prompts/clarity.js.map +1 -0
- package/dist/agents/prompts/companion.d.ts +4 -0
- package/dist/agents/prompts/companion.d.ts.map +1 -0
- package/dist/agents/prompts/companion.js +61 -0
- package/dist/agents/prompts/companion.js.map +1 -0
- package/dist/agents/prompts/delivery-contract.d.ts +2 -0
- package/dist/agents/prompts/delivery-contract.d.ts.map +1 -0
- package/dist/agents/prompts/delivery-contract.js +33 -0
- package/dist/agents/prompts/delivery-contract.js.map +1 -0
- package/dist/agents/prompts/mock.d.ts +12 -0
- package/dist/agents/prompts/mock.d.ts.map +1 -0
- package/dist/agents/prompts/mock.js +61 -0
- package/dist/agents/prompts/mock.js.map +1 -0
- package/dist/agents/prompts/requirements.d.ts +13 -0
- package/dist/agents/prompts/requirements.d.ts.map +1 -0
- package/dist/agents/prompts/requirements.js +45 -0
- package/dist/agents/prompts/requirements.js.map +1 -0
- package/dist/agents/prompts/roles.d.ts +16 -0
- package/dist/agents/prompts/roles.d.ts.map +1 -0
- package/dist/agents/prompts/roles.js +74 -0
- package/dist/agents/prompts/roles.js.map +1 -0
- package/dist/agents/prompts/shared.d.ts +19 -0
- package/dist/agents/prompts/shared.d.ts.map +1 -0
- package/dist/agents/prompts/shared.js +25 -0
- package/dist/agents/prompts/shared.js.map +1 -0
- package/dist/agents/prompts/standard-templates.generated.d.ts +36 -0
- package/dist/agents/prompts/standard-templates.generated.d.ts.map +1 -0
- package/dist/agents/prompts/standard-templates.generated.js +122 -0
- package/dist/agents/prompts/standard-templates.generated.js.map +1 -0
- package/dist/agents/prompts/standard.d.ts +36 -0
- package/dist/agents/prompts/standard.d.ts.map +1 -0
- package/dist/agents/prompts/standard.js +208 -0
- package/dist/agents/prompts/standard.js.map +1 -0
- package/dist/agents/prompts/testing.d.ts +12 -0
- package/dist/agents/prompts/testing.d.ts.map +1 -0
- package/dist/agents/prompts/testing.js +94 -0
- package/dist/agents/prompts/testing.js.map +1 -0
- package/dist/agents/read-only.d.ts +13 -0
- package/dist/agents/read-only.d.ts.map +1 -0
- package/dist/agents/read-only.js +29 -0
- package/dist/agents/read-only.js.map +1 -0
- package/dist/agents/registry.d.ts +70 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +51 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/runtime/executor.d.ts +72 -0
- package/dist/agents/runtime/executor.d.ts.map +1 -0
- package/dist/agents/runtime/executor.js +125 -0
- package/dist/agents/runtime/executor.js.map +1 -0
- package/dist/agents/runtime/fragments.d.ts +17 -0
- package/dist/agents/runtime/fragments.d.ts.map +1 -0
- package/dist/agents/runtime/fragments.js +33 -0
- package/dist/agents/runtime/fragments.js.map +1 -0
- package/dist/agents/runtime/routing.d.ts +57 -0
- package/dist/agents/runtime/routing.d.ts.map +1 -0
- package/dist/agents/runtime/routing.js +41 -0
- package/dist/agents/runtime/routing.js.map +1 -0
- package/dist/agents/runtime/web-search.d.ts +43 -0
- package/dist/agents/runtime/web-search.d.ts.map +1 -0
- package/dist/agents/runtime/web-search.js +102 -0
- package/dist/agents/runtime/web-search.js.map +1 -0
- package/dist/agents/standard-prompt-templates.generated.d.ts +36 -0
- package/dist/agents/standard-prompt-templates.generated.d.ts.map +1 -0
- package/dist/agents/standard-prompt-templates.generated.js +122 -0
- package/dist/agents/standard-prompt-templates.generated.js.map +1 -0
- package/dist/agents/standard-prompts.d.ts +36 -0
- package/dist/agents/standard-prompts.d.ts.map +1 -0
- package/dist/agents/standard-prompts.js +202 -0
- package/dist/agents/standard-prompts.js.map +1 -0
- package/dist/agents/test-prompts.d.ts +12 -0
- package/dist/agents/test-prompts.d.ts.map +1 -0
- package/dist/agents/test-prompts.js +92 -0
- package/dist/agents/test-prompts.js.map +1 -0
- package/dist/agents/traits.d.ts +56 -0
- package/dist/agents/traits.d.ts.map +1 -0
- package/dist/agents/traits.js +100 -0
- package/dist/agents/traits.js.map +1 -0
- package/dist/agents/web-search.d.ts +43 -0
- package/dist/agents/web-search.d.ts.map +1 -0
- package/dist/agents/web-search.js +102 -0
- package/dist/agents/web-search.js.map +1 -0
- package/dist/fragmentLibrary/DeterministicFragmentSelector.d.ts +10 -0
- package/dist/fragmentLibrary/DeterministicFragmentSelector.d.ts.map +1 -0
- package/dist/fragmentLibrary/DeterministicFragmentSelector.js +12 -0
- package/dist/fragmentLibrary/DeterministicFragmentSelector.js.map +1 -0
- package/dist/fragmentLibrary/FragmentLibraryService.d.ts +55 -0
- package/dist/fragmentLibrary/FragmentLibraryService.d.ts.map +1 -0
- package/dist/fragmentLibrary/FragmentLibraryService.js +203 -0
- package/dist/fragmentLibrary/FragmentLibraryService.js.map +1 -0
- package/dist/fragmentLibrary/FragmentSourceService.d.ts +51 -0
- package/dist/fragmentLibrary/FragmentSourceService.d.ts.map +1 -0
- package/dist/fragmentLibrary/FragmentSourceService.js +181 -0
- package/dist/fragmentLibrary/FragmentSourceService.js.map +1 -0
- package/dist/fragmentLibrary/LlmFragmentSelector.d.ts +21 -0
- package/dist/fragmentLibrary/LlmFragmentSelector.d.ts.map +1 -0
- package/dist/fragmentLibrary/LlmFragmentSelector.js +87 -0
- package/dist/fragmentLibrary/LlmFragmentSelector.js.map +1 -0
- package/dist/fragmentLibrary/fragment-catalog.d.ts +43 -0
- package/dist/fragmentLibrary/fragment-catalog.d.ts.map +1 -0
- package/dist/fragmentLibrary/fragment-catalog.js +129 -0
- package/dist/fragmentLibrary/fragment-catalog.js.map +1 -0
- package/dist/fragmentLibrary/fragment-source.logic.d.ts +34 -0
- package/dist/fragmentLibrary/fragment-source.logic.d.ts.map +1 -0
- package/dist/fragmentLibrary/fragment-source.logic.js +172 -0
- package/dist/fragmentLibrary/fragment-source.logic.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/cache.d.ts +22 -0
- package/dist/providers/cache.d.ts.map +1 -0
- package/dist/providers/cache.js +64 -0
- package/dist/providers/cache.js.map +1 -0
- package/dist/providers/endpoints.d.ts +8 -0
- package/dist/providers/endpoints.d.ts.map +1 -0
- package/dist/providers/endpoints.js +23 -0
- package/dist/providers/endpoints.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/instrumented.d.ts +28 -0
- package/dist/providers/instrumented.d.ts.map +1 -0
- package/dist/providers/instrumented.js +147 -0
- package/dist/providers/instrumented.js.map +1 -0
- package/dist/providers/registry.d.ts +26 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +32 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/resolvers.d.ts +58 -0
- package/dist/providers/resolvers.d.ts.map +1 -0
- package/dist/providers/resolvers.js +78 -0
- package/dist/providers/resolvers.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { LanguageModel } from 'ai';
|
|
2
|
+
import type { InlineObservabilityContext, LlmTraceSink, ModelProvider, ModelRef } from '@cat-factory/kernel';
|
|
3
|
+
import { catFactoryObservability } from '@cat-factory/kernel';
|
|
4
|
+
export { catFactoryObservability };
|
|
5
|
+
export type { InlineObservabilityContext };
|
|
6
|
+
/**
|
|
7
|
+
* A {@link ModelProvider} that wraps every resolved model so inline LLM calls surface
|
|
8
|
+
* on the trace sink. Build it only when a sink is wired AND the deployment opts in; an
|
|
9
|
+
* unwrapped provider behaves exactly as before.
|
|
10
|
+
*/
|
|
11
|
+
export declare class InstrumentedModelProvider implements ModelProvider {
|
|
12
|
+
private readonly inner;
|
|
13
|
+
private readonly traceSink;
|
|
14
|
+
private readonly recordPrompts;
|
|
15
|
+
private readonly now;
|
|
16
|
+
constructor(deps: {
|
|
17
|
+
inner: ModelProvider;
|
|
18
|
+
traceSink: LlmTraceSink;
|
|
19
|
+
/** Honour the same `LLM_RECORD_PROMPTS` switch as the local store; default true. */
|
|
20
|
+
recordPrompts?: boolean;
|
|
21
|
+
/** Injectable clock (tests); defaults to `Date.now`. */
|
|
22
|
+
now?: () => number;
|
|
23
|
+
});
|
|
24
|
+
resolve(ref: ModelRef): LanguageModel;
|
|
25
|
+
private middlewareFor;
|
|
26
|
+
private emit;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=instrumented.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumented.d.ts","sourceRoot":"","sources":["../../src/providers/instrumented.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACvC,OAAO,KAAK,EACV,0BAA0B,EAE1B,YAAY,EACZ,aAAa,EACb,QAAQ,EACT,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,uBAAuB,EAAkC,MAAM,qBAAqB,CAAA;AAK7F,OAAO,EAAE,uBAAuB,EAAE,CAAA;AAClC,YAAY,EAAE,0BAA0B,EAAE,CAAA;AAwD1C;;;;GAIG;AACH,qBAAa,yBAA0B,YAAW,aAAa;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAElC,YAAY,IAAI,EAAE;QAChB,KAAK,EAAE,aAAa,CAAA;QACpB,SAAS,EAAE,YAAY,CAAA;QACvB,oFAAoF;QACpF,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,wDAAwD;QACxD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KACnB,EAKA;IAED,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAWpC;IAED,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,IAAI;CAoCb"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { wrapLanguageModel } from 'ai';
|
|
2
|
+
import { catFactoryObservability, readInlineObservabilityContext } from '@cat-factory/kernel';
|
|
3
|
+
// Re-exported so existing `@cat-factory/agents` consumers keep importing the inline
|
|
4
|
+
// observability tag from here; the canonical, dependency-free definition lives in the
|
|
5
|
+
// kernel so any caller layer can build the tag without depending on this package.
|
|
6
|
+
export { catFactoryObservability };
|
|
7
|
+
// Instruments the INLINE (non-proxied) LLM calls so they reach the SAME trace sink as
|
|
8
|
+
// the container-agent calls. Container calls go through the LLM proxy, which the
|
|
9
|
+
// orchestration `LlmObservabilityService` fans out to the sink; inline calls
|
|
10
|
+
// (requirements review/rework, the document planner, the fragment selector, the inline
|
|
11
|
+
// agent executor) call the AI SDK directly. This decorator wraps every resolved model
|
|
12
|
+
// with an AI SDK middleware that, after each generate, builds the SAME
|
|
13
|
+
// {@link LlmGenerationEvent} and calls the SAME `sink.recordGeneration` — so adding the
|
|
14
|
+
// inline feeder never means a second sink.
|
|
15
|
+
//
|
|
16
|
+
// The middleware is transparent: callers keep calling `generateText({ model })`
|
|
17
|
+
// unchanged. To group a call under its run's trace and label it, a caller passes
|
|
18
|
+
// `providerOptions: catFactoryObservability({ agentKind, workspaceId, executionId })`
|
|
19
|
+
// (the kernel helper); absent ⇒ the call still emits, as its own standalone trace
|
|
20
|
+
// named `inline`. The instrumentation never changes the model's behaviour and never
|
|
21
|
+
// throws into the call.
|
|
22
|
+
/** Read token counts defensively across the AI SDK's flat (v2) and nested (v3) usage shapes. */
|
|
23
|
+
function readUsage(usage) {
|
|
24
|
+
const u = usage;
|
|
25
|
+
if (!u)
|
|
26
|
+
return { prompt: 0, completion: 0, total: 0 };
|
|
27
|
+
const inputTokens = u.inputTokens;
|
|
28
|
+
const outputTokens = u.outputTokens;
|
|
29
|
+
// v3: nested { total, … }
|
|
30
|
+
if (inputTokens && typeof inputTokens === 'object') {
|
|
31
|
+
const prompt = Number(inputTokens.total ?? 0);
|
|
32
|
+
const completion = Number(outputTokens?.total ?? 0);
|
|
33
|
+
const total = typeof u.totalTokens === 'number' ? u.totalTokens : prompt + completion;
|
|
34
|
+
return { prompt, completion, total };
|
|
35
|
+
}
|
|
36
|
+
// v2 / legacy flat
|
|
37
|
+
const prompt = Number(inputTokens ?? u.promptTokens ?? 0);
|
|
38
|
+
const completion = Number(outputTokens ?? u.completionTokens ?? 0);
|
|
39
|
+
const total = typeof u.totalTokens === 'number' ? u.totalTokens : prompt + completion;
|
|
40
|
+
return { prompt, completion, total };
|
|
41
|
+
}
|
|
42
|
+
/** Extract the assistant text from a generate result, across result shapes. */
|
|
43
|
+
function readOutputText(result) {
|
|
44
|
+
const r = result;
|
|
45
|
+
if (typeof r?.text === 'string')
|
|
46
|
+
return r.text;
|
|
47
|
+
if (Array.isArray(r?.content)) {
|
|
48
|
+
return r.content
|
|
49
|
+
.filter((part) => part?.type === 'text')
|
|
50
|
+
.map((part) => String(part.text ?? ''))
|
|
51
|
+
.join('');
|
|
52
|
+
}
|
|
53
|
+
return '';
|
|
54
|
+
}
|
|
55
|
+
function readFinishReason(result) {
|
|
56
|
+
const reason = result?.finishReason;
|
|
57
|
+
return typeof reason === 'string' ? reason : null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A {@link ModelProvider} that wraps every resolved model so inline LLM calls surface
|
|
61
|
+
* on the trace sink. Build it only when a sink is wired AND the deployment opts in; an
|
|
62
|
+
* unwrapped provider behaves exactly as before.
|
|
63
|
+
*/
|
|
64
|
+
export class InstrumentedModelProvider {
|
|
65
|
+
inner;
|
|
66
|
+
traceSink;
|
|
67
|
+
recordPrompts;
|
|
68
|
+
now;
|
|
69
|
+
constructor(deps) {
|
|
70
|
+
this.inner = deps.inner;
|
|
71
|
+
this.traceSink = deps.traceSink;
|
|
72
|
+
this.recordPrompts = deps.recordPrompts ?? true;
|
|
73
|
+
this.now = deps.now ?? (() => Date.now());
|
|
74
|
+
}
|
|
75
|
+
resolve(ref) {
|
|
76
|
+
const model = this.inner.resolve(ref);
|
|
77
|
+
// wrapLanguageModel only accepts a model instance (not a model-id string). A bare
|
|
78
|
+
// string ref would be unusual for inline kinds, but pass it through untouched. The
|
|
79
|
+
// base resolvers return current-spec (v3) models; the cast bridges the broader
|
|
80
|
+
// `LanguageModel` union to wrapLanguageModel's exact model param.
|
|
81
|
+
if (typeof model === 'string')
|
|
82
|
+
return model;
|
|
83
|
+
return wrapLanguageModel({
|
|
84
|
+
model: model,
|
|
85
|
+
middleware: this.middlewareFor(ref),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
middlewareFor(ref) {
|
|
89
|
+
return {
|
|
90
|
+
specificationVersion: 'v3',
|
|
91
|
+
wrapGenerate: async ({ doGenerate, params }) => {
|
|
92
|
+
const startedAt = this.now();
|
|
93
|
+
try {
|
|
94
|
+
const result = await doGenerate();
|
|
95
|
+
this.emit(ref, params, result, startedAt, true, null);
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
this.emit(ref, params, undefined, startedAt, false, errorMessage(err));
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
emit(ref, params, result, startedAt, ok, errMessage) {
|
|
106
|
+
const endedAt = this.now();
|
|
107
|
+
const context = readInlineObservabilityContext(params);
|
|
108
|
+
const usage = readUsage(result?.usage);
|
|
109
|
+
const event = {
|
|
110
|
+
workspaceId: context.workspaceId ?? null,
|
|
111
|
+
executionId: context.executionId ?? null,
|
|
112
|
+
agentKind: context.agentKind,
|
|
113
|
+
provider: ref.provider,
|
|
114
|
+
model: ref.model,
|
|
115
|
+
startedAt,
|
|
116
|
+
endedAt,
|
|
117
|
+
promptTokens: usage.prompt,
|
|
118
|
+
completionTokens: usage.completion,
|
|
119
|
+
totalTokens: usage.total,
|
|
120
|
+
finishReason: ok ? readFinishReason(result) : null,
|
|
121
|
+
ok,
|
|
122
|
+
errorMessage: errMessage,
|
|
123
|
+
input: this.recordPrompts ? safeJson(params?.prompt) : '',
|
|
124
|
+
output: this.recordPrompts && ok ? readOutputText(result) : '',
|
|
125
|
+
};
|
|
126
|
+
// Best-effort and fully isolated: the sink itself swallows + logs, but guard the
|
|
127
|
+
// synchronous build/dispatch too so instrumentation can never break the LLM call.
|
|
128
|
+
try {
|
|
129
|
+
void Promise.resolve(this.traceSink.recordGeneration(event)).catch(() => { });
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// ignored
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function safeJson(value) {
|
|
137
|
+
try {
|
|
138
|
+
return JSON.stringify(value ?? []);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return '';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function errorMessage(err) {
|
|
145
|
+
return err instanceof Error ? err.message : String(err);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=instrumented.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumented.js","sourceRoot":"","sources":["../../src/providers/instrumented.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAgC,MAAM,IAAI,CAAA;AASpE,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AAE7F,oFAAoF;AACpF,sFAAsF;AACtF,kFAAkF;AAClF,OAAO,EAAE,uBAAuB,EAAE,CAAA;AAGlC,sFAAsF;AACtF,iFAAiF;AACjF,6EAA6E;AAC7E,uFAAuF;AACvF,sFAAsF;AACtF,uEAAuE;AACvE,wFAAwF;AACxF,2CAA2C;AAC3C,EAAE;AACF,gFAAgF;AAChF,iFAAiF;AACjF,sFAAsF;AACtF,kFAAkF;AAClF,oFAAoF;AACpF,wBAAwB;AAExB,gGAAgG;AAChG,SAAS,SAAS,CAAC,KAAc;IAC/B,MAAM,CAAC,GAAG,KAA4C,CAAA;IACtD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IACrD,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;IACjC,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,CAAA;IACnC,0BAA0B;IAC1B,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAE,WAAkC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;QACrE,MAAM,UAAU,GAAG,MAAM,CAAE,YAAmC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;QAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,GAAG,UAAU,CAAA;QACrF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;IACtC,CAAC;IACD,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,CAAE,WAAsB,IAAK,CAAC,CAAC,YAAuB,IAAI,CAAC,CAAC,CAAA;IACjF,MAAM,UAAU,GAAG,MAAM,CAAE,YAAuB,IAAK,CAAC,CAAC,gBAA2B,IAAI,CAAC,CAAC,CAAA;IAC1F,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,GAAG,UAAU,CAAA;IACrF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;AACtC,CAAC;AAED,+EAA+E;AAC/E,SAAS,cAAc,CAAC,MAAe;IACrC,MAAM,CAAC,GAAG,MAA+C,CAAA;IACzD,IAAI,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,IAAI,CAAA;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC,OAAO;aACb,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAE,IAA0B,EAAE,IAAI,KAAK,MAAM,CAAC;aAC9D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAE,IAA2B,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;aAC9D,IAAI,CAAC,EAAE,CAAC,CAAA;IACb,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAe;IACvC,MAAM,MAAM,GAAI,MAAqC,EAAE,YAAY,CAAA;IACnE,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,yBAAyB;IACnB,KAAK,CAAe;IACpB,SAAS,CAAc;IACvB,aAAa,CAAS;IACtB,GAAG,CAAc;IAElC,YAAY,IAOX;QACC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAA;QAC/C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,OAAO,CAAC,GAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACrC,kFAAkF;QAClF,mFAAmF;QACnF,+EAA+E;QAC/E,kEAAkE;QAClE,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAA;QAC3C,OAAO,iBAAiB,CAAC;YACvB,KAAK,EAAE,KAAyD;YAChE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;SACpC,CAAC,CAAA;IACJ,CAAC;IAEO,aAAa,CAAC,GAAa;QACjC,OAAO;YACL,oBAAoB,EAAE,IAAI;YAC1B,YAAY,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBAC5B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;oBACjC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;oBACrD,OAAO,MAAM,CAAA;gBACf,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;oBACtE,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;IAEO,IAAI,CACV,GAAa,EACb,MAAe,EACf,MAAe,EACf,SAAiB,EACjB,EAAW,EACX,UAAyB;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC1B,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,KAAK,GAAG,SAAS,CAAE,MAA8B,EAAE,KAAK,CAAC,CAAA;QAC/D,MAAM,KAAK,GAAuB;YAChC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;YACxC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;YACxC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,SAAS;YACT,OAAO;YACP,YAAY,EAAE,KAAK,CAAC,MAAM;YAC1B,gBAAgB,EAAE,KAAK,CAAC,UAAU;YAClC,WAAW,EAAE,KAAK,CAAC,KAAK;YACxB,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YAClD,EAAE;YACF,YAAY,EAAE,UAAU;YACxB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAE,MAA+B,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YACnF,MAAM,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;SAC/D,CAAA;QACD,iFAAiF;QACjF,kFAAkF;QAClF,IAAI,CAAC;YACH,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACzD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ModelProvider, ModelRef } from '@cat-factory/kernel';
|
|
2
|
+
import type { LanguageModel } from 'ai';
|
|
3
|
+
/** Resolves one provider's {@link ModelRef} into a model the AI SDK can call. */
|
|
4
|
+
export type ModelResolver = (ref: ModelRef) => LanguageModel;
|
|
5
|
+
/**
|
|
6
|
+
* A set of resolvers keyed by provider id (`openai`, `anthropic`, `bedrock`, …).
|
|
7
|
+
* An entry may be `undefined` so callers can register conditionally (e.g. only when
|
|
8
|
+
* a credential is configured) without filtering first.
|
|
9
|
+
*/
|
|
10
|
+
export type ProviderRegistry = Record<string, ModelResolver | undefined>;
|
|
11
|
+
/**
|
|
12
|
+
* A {@link ModelProvider} composed from one or more {@link ProviderRegistry registries}.
|
|
13
|
+
* `resolve` dispatches on `ref.provider` and throws a clear error for any provider that
|
|
14
|
+
* was not registered. Later registrations win for the same provider id, so a deployment
|
|
15
|
+
* can override a base resolver by mixing in its own registry afterwards.
|
|
16
|
+
*/
|
|
17
|
+
export declare class CompositeModelProvider implements ModelProvider {
|
|
18
|
+
private readonly resolvers;
|
|
19
|
+
constructor(...registries: ProviderRegistry[]);
|
|
20
|
+
/** Mix in a registry; returns `this` for fluent chaining. */
|
|
21
|
+
register(registry: ProviderRegistry): this;
|
|
22
|
+
/** Provider ids currently registered (useful for diagnostics / a /models gate). */
|
|
23
|
+
providers(): string[];
|
|
24
|
+
resolve(ref: ModelRef): LanguageModel;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAcvC,iFAAiF;AACjF,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,QAAQ,KAAK,aAAa,CAAA;AAE5D;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC,CAAA;AAExE;;;;;GAKG;AACH,qBAAa,sBAAuB,YAAW,aAAa;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAE7D,YAAY,GAAG,UAAU,EAAE,gBAAgB,EAAE,EAE5C;IAED,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAKzC;IAED,mFAAmF;IACnF,SAAS,IAAI,MAAM,EAAE,CAEpB;IAED,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAIpC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A {@link ModelProvider} composed from one or more {@link ProviderRegistry registries}.
|
|
3
|
+
* `resolve` dispatches on `ref.provider` and throws a clear error for any provider that
|
|
4
|
+
* was not registered. Later registrations win for the same provider id, so a deployment
|
|
5
|
+
* can override a base resolver by mixing in its own registry afterwards.
|
|
6
|
+
*/
|
|
7
|
+
export class CompositeModelProvider {
|
|
8
|
+
resolvers = new Map();
|
|
9
|
+
constructor(...registries) {
|
|
10
|
+
for (const registry of registries)
|
|
11
|
+
this.register(registry);
|
|
12
|
+
}
|
|
13
|
+
/** Mix in a registry; returns `this` for fluent chaining. */
|
|
14
|
+
register(registry) {
|
|
15
|
+
for (const [provider, resolver] of Object.entries(registry)) {
|
|
16
|
+
if (resolver)
|
|
17
|
+
this.resolvers.set(provider, resolver);
|
|
18
|
+
}
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
/** Provider ids currently registered (useful for diagnostics / a /models gate). */
|
|
22
|
+
providers() {
|
|
23
|
+
return [...this.resolvers.keys()];
|
|
24
|
+
}
|
|
25
|
+
resolve(ref) {
|
|
26
|
+
const resolver = this.resolvers.get(ref.provider);
|
|
27
|
+
if (!resolver)
|
|
28
|
+
throw new Error(`Unsupported model provider: ${ref.provider}`);
|
|
29
|
+
return resolver(ref);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAyBA;;;;;GAKG;AACH,MAAM,OAAO,sBAAsB;IAChB,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAA;IAE7D,YAAY,GAAG,UAA8B;QAC3C,KAAK,MAAM,QAAQ,IAAI,UAAU;YAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC5D,CAAC;IAED,6DAA6D;IAC7D,QAAQ,CAAC,QAA0B;QACjC,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,IAAI,QAAQ;gBAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QACtD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,mFAAmF;IACnF,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC;IAED,OAAO,CAAC,GAAa;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACjD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC7E,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ModelResolver, ProviderRegistry } from './registry.js';
|
|
2
|
+
/** Resolver for OpenAI (or any drop-in compatible base URL using the OpenAI SDK). */
|
|
3
|
+
export declare function openAiResolver(opts: {
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
baseURL?: string;
|
|
6
|
+
}): ModelResolver;
|
|
7
|
+
/** Resolver for Anthropic. */
|
|
8
|
+
export declare function anthropicResolver(opts: {
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
baseURL?: string;
|
|
11
|
+
}): ModelResolver;
|
|
12
|
+
/**
|
|
13
|
+
* Resolver for an OpenAI-compatible vendor (DashScope/Qwen, DeepSeek, Moonshot, or a
|
|
14
|
+
* self-hosted gateway). `name` is only used by the SDK for telemetry/labels.
|
|
15
|
+
*/
|
|
16
|
+
export declare function openAiCompatibleResolver(opts: {
|
|
17
|
+
name: string;
|
|
18
|
+
apiKey: string;
|
|
19
|
+
baseURL: string;
|
|
20
|
+
}): ModelResolver;
|
|
21
|
+
/**
|
|
22
|
+
* Resolver for Cloudflare-hosted models reached over HTTP (no Workers `AI` binding):
|
|
23
|
+
* either the Workers AI OpenAI-compatible REST endpoint (account id + API token) or an
|
|
24
|
+
* AI Gateway. This is how the Node service uses Cloudflare models; the Worker uses the
|
|
25
|
+
* in-process binding instead. Registered under the `workers-ai` provider id by default so
|
|
26
|
+
* a model pinned `workers-ai` resolves on both deployments (binding vs REST).
|
|
27
|
+
*/
|
|
28
|
+
export declare function cloudflareRestResolver(opts: {
|
|
29
|
+
accountId: string;
|
|
30
|
+
apiToken: string;
|
|
31
|
+
/** AI Gateway slug; when set, routes through the gateway instead of the direct REST API. */
|
|
32
|
+
gateway?: string;
|
|
33
|
+
/** Full override of the base URL (wins over accountId/gateway). */
|
|
34
|
+
baseURL?: string;
|
|
35
|
+
}): ModelResolver;
|
|
36
|
+
/**
|
|
37
|
+
* Build the base provider registry from a deployment's credentials. Each provider is
|
|
38
|
+
* registered only when its credential is present, so an unconfigured provider resolves
|
|
39
|
+
* to a clear "Unsupported model provider" error rather than a deep SDK failure. Mix
|
|
40
|
+
* extra registries (e.g. Bedrock, the Workers AI binding) in afterwards.
|
|
41
|
+
*/
|
|
42
|
+
export declare function baseProviderRegistry(opts: {
|
|
43
|
+
openaiApiKey?: string;
|
|
44
|
+
openaiBaseURL?: string;
|
|
45
|
+
anthropicApiKey?: string;
|
|
46
|
+
/** Per-provider OpenAI-compatible upstreams (base URL + key), keyed by provider id. */
|
|
47
|
+
openAiCompatible?: Record<string, {
|
|
48
|
+
apiKey?: string;
|
|
49
|
+
baseURL: string;
|
|
50
|
+
} | undefined>;
|
|
51
|
+
cloudflareRest?: {
|
|
52
|
+
accountId: string;
|
|
53
|
+
apiToken: string;
|
|
54
|
+
gateway?: string;
|
|
55
|
+
baseURL?: string;
|
|
56
|
+
};
|
|
57
|
+
}): ProviderRegistry;
|
|
58
|
+
//# sourceMappingURL=resolvers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../src/providers/resolvers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAOpE,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAMzF;AAED,8BAA8B;AAC9B,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAM5F;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,GAAG,aAAa,CAOhB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,aAAa,CAOhB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;IACnF,cAAc,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC7F,GAAG,gBAAgB,CAoBnB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createAnthropic } from '@ai-sdk/anthropic';
|
|
2
|
+
import { createOpenAI } from '@ai-sdk/openai';
|
|
3
|
+
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
|
|
4
|
+
// The base, runtime-neutral resolvers. They depend only on `ai` + the `@ai-sdk/*`
|
|
5
|
+
// vendor packages (no Cloudflare bindings, no Node built-ins), so they run on both
|
|
6
|
+
// the Worker and the Node service. Heavier/optional backends (e.g. AWS Bedrock) ship
|
|
7
|
+
// as their own packages and are mixed in as extra registries.
|
|
8
|
+
/** Resolver for OpenAI (or any drop-in compatible base URL using the OpenAI SDK). */
|
|
9
|
+
export function openAiResolver(opts) {
|
|
10
|
+
const provider = createOpenAI({
|
|
11
|
+
apiKey: opts.apiKey,
|
|
12
|
+
...(opts.baseURL ? { baseURL: opts.baseURL } : {}),
|
|
13
|
+
});
|
|
14
|
+
return (ref) => provider(ref.model);
|
|
15
|
+
}
|
|
16
|
+
/** Resolver for Anthropic. */
|
|
17
|
+
export function anthropicResolver(opts) {
|
|
18
|
+
const provider = createAnthropic({
|
|
19
|
+
apiKey: opts.apiKey,
|
|
20
|
+
...(opts.baseURL ? { baseURL: opts.baseURL } : {}),
|
|
21
|
+
});
|
|
22
|
+
return (ref) => provider(ref.model);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolver for an OpenAI-compatible vendor (DashScope/Qwen, DeepSeek, Moonshot, or a
|
|
26
|
+
* self-hosted gateway). `name` is only used by the SDK for telemetry/labels.
|
|
27
|
+
*/
|
|
28
|
+
export function openAiCompatibleResolver(opts) {
|
|
29
|
+
const provider = createOpenAICompatible({
|
|
30
|
+
name: opts.name,
|
|
31
|
+
apiKey: opts.apiKey,
|
|
32
|
+
baseURL: opts.baseURL,
|
|
33
|
+
});
|
|
34
|
+
return (ref) => provider(ref.model);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolver for Cloudflare-hosted models reached over HTTP (no Workers `AI` binding):
|
|
38
|
+
* either the Workers AI OpenAI-compatible REST endpoint (account id + API token) or an
|
|
39
|
+
* AI Gateway. This is how the Node service uses Cloudflare models; the Worker uses the
|
|
40
|
+
* in-process binding instead. Registered under the `workers-ai` provider id by default so
|
|
41
|
+
* a model pinned `workers-ai` resolves on both deployments (binding vs REST).
|
|
42
|
+
*/
|
|
43
|
+
export function cloudflareRestResolver(opts) {
|
|
44
|
+
const baseURL = opts.baseURL ??
|
|
45
|
+
(opts.gateway
|
|
46
|
+
? `https://gateway.ai.cloudflare.com/v1/${opts.accountId}/${opts.gateway}/workers-ai/v1`
|
|
47
|
+
: `https://api.cloudflare.com/client/v4/accounts/${opts.accountId}/ai/v1`);
|
|
48
|
+
return openAiCompatibleResolver({ name: 'cloudflare', apiKey: opts.apiToken, baseURL });
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build the base provider registry from a deployment's credentials. Each provider is
|
|
52
|
+
* registered only when its credential is present, so an unconfigured provider resolves
|
|
53
|
+
* to a clear "Unsupported model provider" error rather than a deep SDK failure. Mix
|
|
54
|
+
* extra registries (e.g. Bedrock, the Workers AI binding) in afterwards.
|
|
55
|
+
*/
|
|
56
|
+
export function baseProviderRegistry(opts) {
|
|
57
|
+
const registry = {
|
|
58
|
+
openai: opts.openaiApiKey
|
|
59
|
+
? openAiResolver({ apiKey: opts.openaiApiKey, baseURL: opts.openaiBaseURL })
|
|
60
|
+
: undefined,
|
|
61
|
+
anthropic: opts.anthropicApiKey
|
|
62
|
+
? anthropicResolver({ apiKey: opts.anthropicApiKey })
|
|
63
|
+
: undefined,
|
|
64
|
+
};
|
|
65
|
+
for (const [provider, upstream] of Object.entries(opts.openAiCompatible ?? {})) {
|
|
66
|
+
if (upstream?.apiKey) {
|
|
67
|
+
registry[provider] = openAiCompatibleResolver({
|
|
68
|
+
name: provider,
|
|
69
|
+
apiKey: upstream.apiKey,
|
|
70
|
+
baseURL: upstream.baseURL,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (opts.cloudflareRest)
|
|
75
|
+
registry['workers-ai'] = cloudflareRestResolver(opts.cloudflareRest);
|
|
76
|
+
return registry;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=resolvers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../../src/providers/resolvers.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cat-factory/agents",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "Agent catalog, routing, prompts and fragment library for the Agent Architecture Board.",
|
|
5
|
+
"files": [
|
|
6
|
+
"dist"
|
|
7
|
+
],
|
|
8
|
+
"type": "module",
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./package.json": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@ai-sdk/anthropic": "^3.0.85",
|
|
23
|
+
"@ai-sdk/openai": "^3.0.73",
|
|
24
|
+
"@ai-sdk/openai-compatible": "^2.0.51",
|
|
25
|
+
"ai": "^6.0.208",
|
|
26
|
+
"handlebars": "^4.7.9",
|
|
27
|
+
"@cat-factory/contracts": "0.6.0",
|
|
28
|
+
"@cat-factory/kernel": "0.6.0",
|
|
29
|
+
"@cat-factory/prompt-fragments": "0.6.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"typescript": "7.0.1-rc"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc -b tsconfig.build.json",
|
|
36
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
37
|
+
"precompile:templates": "node scripts/precompile-prompts.mjs"
|
|
38
|
+
}
|
|
39
|
+
}
|