@contractspec/lib.ai-agent 1.61.0 → 2.0.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/dist/agent/agent-factory.d.ts +5 -1
- package/dist/agent/agent-factory.js +2293 -31
- package/dist/agent/agent.test.d.ts +0 -1
- package/dist/agent/contract-spec-agent.d.ts +6 -1
- package/dist/agent/contract-spec-agent.js +2292 -31
- package/dist/agent/index.d.ts +0 -1
- package/dist/agent/index.js +2408 -91
- package/dist/agent/json-runner.d.ts +1 -1
- package/dist/agent/json-runner.js +2326 -57
- package/dist/agent/json-runner.test.d.ts +0 -1
- package/dist/agent/unified-agent.d.ts +0 -1
- package/dist/agent/unified-agent.js +2374 -65
- package/dist/approval/index.d.ts +0 -1
- package/dist/approval/index.js +2122 -2
- package/dist/approval/workflow.d.ts +7 -2
- package/dist/approval/workflow.js +2122 -2
- package/dist/exporters/claude-agent-exporter.d.ts +0 -1
- package/dist/exporters/claude-agent-exporter.js +2144 -35
- package/dist/exporters/index.d.ts +0 -1
- package/dist/exporters/index.js +2193 -69
- package/dist/exporters/opencode-exporter.d.ts +0 -1
- package/dist/exporters/opencode-exporter.js +2152 -39
- package/dist/exporters/types.d.ts +0 -1
- package/dist/i18n/catalogs/en.d.ts +8 -0
- package/dist/i18n/catalogs/en.js +614 -0
- package/dist/i18n/catalogs/es.d.ts +8 -0
- package/dist/i18n/catalogs/es.js +663 -0
- package/dist/i18n/catalogs/fr.d.ts +8 -0
- package/dist/i18n/catalogs/fr.js +629 -0
- package/dist/i18n/catalogs/index.d.ts +8 -0
- package/dist/i18n/catalogs/index.js +1875 -0
- package/dist/i18n/i18n.test.d.ts +1 -0
- package/dist/i18n/index.d.ts +29 -0
- package/dist/i18n/index.js +2127 -0
- package/dist/i18n/keys.d.ts +552 -0
- package/dist/i18n/keys.js +188 -0
- package/dist/i18n/locale.d.ts +33 -0
- package/dist/i18n/locale.js +41 -0
- package/dist/i18n/messages.d.ts +65 -0
- package/dist/i18n/messages.js +1939 -0
- package/dist/index.d.ts +0 -13
- package/dist/index.js +2106 -3254
- package/dist/interop/index.d.ts +0 -1
- package/dist/interop/index.js +2182 -47
- package/dist/interop/spec-consumer.d.ts +0 -1
- package/dist/interop/spec-consumer.js +2151 -34
- package/dist/interop/tool-consumer.d.ts +0 -1
- package/dist/interop/tool-consumer.js +2122 -13
- package/dist/interop/types.d.ts +0 -1
- package/dist/knowledge/index.d.ts +0 -1
- package/dist/knowledge/index.js +2105 -7
- package/dist/knowledge/injector.d.ts +2 -3
- package/dist/knowledge/injector.js +2104 -7
- package/dist/memory/in-memory.d.ts +0 -1
- package/dist/memory/index.d.ts +0 -1
- package/dist/memory/manager.d.ts +0 -1
- package/dist/memory/memory.test.d.ts +0 -1
- package/dist/node/agent/agent-factory.js +2293 -31
- package/dist/node/agent/contract-spec-agent.js +2292 -31
- package/dist/node/agent/index.js +2408 -91
- package/dist/node/agent/json-runner.js +2326 -57
- package/dist/node/agent/unified-agent.js +2374 -65
- package/dist/node/approval/index.js +2122 -2
- package/dist/node/approval/workflow.js +2122 -2
- package/dist/node/exporters/claude-agent-exporter.js +2144 -35
- package/dist/node/exporters/index.js +2193 -69
- package/dist/node/exporters/opencode-exporter.js +2152 -39
- package/dist/node/i18n/catalogs/en.js +614 -0
- package/dist/node/i18n/catalogs/es.js +663 -0
- package/dist/node/i18n/catalogs/fr.js +629 -0
- package/dist/node/i18n/catalogs/index.js +1875 -0
- package/dist/node/i18n/index.js +2127 -0
- package/dist/node/i18n/keys.js +188 -0
- package/dist/node/i18n/locale.js +41 -0
- package/dist/node/i18n/messages.js +1939 -0
- package/dist/node/index.js +2106 -3254
- package/dist/node/interop/index.js +2182 -47
- package/dist/node/interop/spec-consumer.js +2151 -34
- package/dist/node/interop/tool-consumer.js +2122 -13
- package/dist/node/knowledge/index.js +2105 -7
- package/dist/node/knowledge/injector.js +2104 -7
- package/dist/node/providers/claude-agent-sdk/adapter.js +2143 -22
- package/dist/node/providers/claude-agent-sdk/index.js +2144 -22
- package/dist/node/providers/claude-agent-sdk/tool-bridge.js +2101 -3
- package/dist/node/providers/index.js +2182 -39
- package/dist/node/providers/opencode-sdk/adapter.js +2148 -27
- package/dist/node/providers/opencode-sdk/agent-bridge.js +2110 -10
- package/dist/node/providers/opencode-sdk/index.js +2149 -27
- package/dist/node/providers/opencode-sdk/tool-bridge.js +2101 -3
- package/dist/node/providers/registry.js +2094 -2
- package/dist/node/session/index.js +37 -2
- package/dist/node/session/store.js +37 -2
- package/dist/node/spec/index.js +2111 -7
- package/dist/node/spec/registry.js +2096 -2
- package/dist/node/spec/spec.js +2105 -5
- package/dist/node/telemetry/index.js +117 -1
- package/dist/node/telemetry/posthog-types.js +0 -0
- package/dist/node/telemetry/posthog.js +132 -0
- package/dist/node/tools/index.js +2117 -17
- package/dist/node/tools/knowledge-tool.js +2105 -11
- package/dist/node/tools/mcp-server.js +2101 -5
- package/dist/node/tools/tool-adapter.js +2093 -1
- package/dist/providers/claude-agent-sdk/adapter.d.ts +0 -1
- package/dist/providers/claude-agent-sdk/adapter.js +2143 -22
- package/dist/providers/claude-agent-sdk/index.d.ts +0 -1
- package/dist/providers/claude-agent-sdk/index.js +2144 -22
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts +0 -1
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +0 -1
- package/dist/providers/claude-agent-sdk/tool-bridge.js +2101 -3
- package/dist/providers/index.d.ts +0 -1
- package/dist/providers/index.js +2182 -39
- package/dist/providers/opencode-sdk/adapter.d.ts +0 -1
- package/dist/providers/opencode-sdk/adapter.js +2148 -27
- package/dist/providers/opencode-sdk/agent-bridge.d.ts +0 -1
- package/dist/providers/opencode-sdk/agent-bridge.js +2110 -10
- package/dist/providers/opencode-sdk/index.d.ts +0 -1
- package/dist/providers/opencode-sdk/index.js +2149 -27
- package/dist/providers/opencode-sdk/tool-bridge.d.ts +0 -1
- package/dist/providers/opencode-sdk/tool-bridge.js +2101 -3
- package/dist/providers/registry.d.ts +0 -1
- package/dist/providers/registry.js +2094 -2
- package/dist/providers/types.d.ts +0 -1
- package/dist/schema/index.d.ts +0 -1
- package/dist/schema/json-schema-to-zod.d.ts +0 -1
- package/dist/schema/schema-output.d.ts +0 -1
- package/dist/session/index.d.ts +0 -1
- package/dist/session/index.js +37 -2
- package/dist/session/store.d.ts +12 -2
- package/dist/session/store.js +37 -2
- package/dist/spec/index.d.ts +0 -1
- package/dist/spec/index.js +2111 -7
- package/dist/spec/registry.d.ts +1 -2
- package/dist/spec/registry.js +2096 -2
- package/dist/spec/spec.d.ts +5 -4
- package/dist/spec/spec.js +2105 -5
- package/dist/telemetry/adapter.d.ts +0 -1
- package/dist/telemetry/index.d.ts +2 -1
- package/dist/telemetry/index.js +117 -1
- package/dist/telemetry/posthog-types.d.ts +59 -0
- package/dist/telemetry/posthog-types.js +1 -0
- package/dist/telemetry/posthog.d.ts +80 -0
- package/dist/telemetry/posthog.js +132 -0
- package/dist/telemetry/posthog.test.d.ts +1 -0
- package/dist/tools/index.d.ts +0 -1
- package/dist/tools/index.js +2117 -17
- package/dist/tools/knowledge-tool.d.ts +1 -2
- package/dist/tools/knowledge-tool.js +2105 -11
- package/dist/tools/mcp-client.d.ts +0 -1
- package/dist/tools/mcp-server.d.ts +0 -1
- package/dist/tools/mcp-server.js +2101 -5
- package/dist/tools/tool-adapter.d.ts +0 -1
- package/dist/tools/tool-adapter.js +2093 -1
- package/dist/tools/tools.test.d.ts +0 -1
- package/dist/types.d.ts +4 -1
- package/package.json +166 -13
- package/dist/agent/agent-factory.d.ts.map +0 -1
- package/dist/agent/agent.test.d.ts.map +0 -1
- package/dist/agent/contract-spec-agent.d.ts.map +0 -1
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/json-runner.d.ts.map +0 -1
- package/dist/agent/json-runner.test.d.ts.map +0 -1
- package/dist/agent/unified-agent.d.ts.map +0 -1
- package/dist/approval/index.d.ts.map +0 -1
- package/dist/approval/workflow.d.ts.map +0 -1
- package/dist/exporters/claude-agent-exporter.d.ts.map +0 -1
- package/dist/exporters/index.d.ts.map +0 -1
- package/dist/exporters/opencode-exporter.d.ts.map +0 -1
- package/dist/exporters/types.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/interop/index.d.ts.map +0 -1
- package/dist/interop/spec-consumer.d.ts.map +0 -1
- package/dist/interop/tool-consumer.d.ts.map +0 -1
- package/dist/interop/types.d.ts.map +0 -1
- package/dist/knowledge/index.d.ts.map +0 -1
- package/dist/knowledge/injector.d.ts.map +0 -1
- package/dist/memory/in-memory.d.ts.map +0 -1
- package/dist/memory/index.d.ts.map +0 -1
- package/dist/memory/manager.d.ts.map +0 -1
- package/dist/memory/memory.test.d.ts.map +0 -1
- package/dist/providers/claude-agent-sdk/adapter.d.ts.map +0 -1
- package/dist/providers/claude-agent-sdk/index.d.ts.map +0 -1
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +0 -1
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +0 -1
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/opencode-sdk/adapter.d.ts.map +0 -1
- package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +0 -1
- package/dist/providers/opencode-sdk/index.d.ts.map +0 -1
- package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +0 -1
- package/dist/providers/registry.d.ts.map +0 -1
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/schema/index.d.ts.map +0 -1
- package/dist/schema/json-schema-to-zod.d.ts.map +0 -1
- package/dist/schema/schema-output.d.ts.map +0 -1
- package/dist/session/index.d.ts.map +0 -1
- package/dist/session/store.d.ts.map +0 -1
- package/dist/spec/index.d.ts.map +0 -1
- package/dist/spec/registry.d.ts.map +0 -1
- package/dist/spec/spec.d.ts.map +0 -1
- package/dist/telemetry/adapter.d.ts.map +0 -1
- package/dist/telemetry/index.d.ts.map +0 -1
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/knowledge-tool.d.ts.map +0 -1
- package/dist/tools/mcp-client.d.ts.map +0 -1
- package/dist/tools/mcp-server.d.ts.map +0 -1
- package/dist/tools/tool-adapter.d.ts.map +0 -1
- package/dist/tools/tools.test.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
package/dist/telemetry/index.js
CHANGED
|
@@ -76,11 +76,127 @@ var init_adapter = __esm(() => {
|
|
|
76
76
|
};
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
+
// src/telemetry/posthog.ts
|
|
80
|
+
var exports_posthog = {};
|
|
81
|
+
__export(exports_posthog, {
|
|
82
|
+
createPostHogTracedModel: () => createPostHogTracedModel,
|
|
83
|
+
createPostHogTelemetryCollector: () => createPostHogTelemetryCollector,
|
|
84
|
+
createCompositeTelemetryCollector: () => createCompositeTelemetryCollector,
|
|
85
|
+
PostHogTelemetryCollector: () => PostHogTelemetryCollector,
|
|
86
|
+
CompositeTelemetryCollector: () => CompositeTelemetryCollector
|
|
87
|
+
});
|
|
88
|
+
async function createPostHogTracedModel(model, config, overrides) {
|
|
89
|
+
const { withTracing } = await importPostHogAI();
|
|
90
|
+
const phClient = await resolvePostHogClient(config);
|
|
91
|
+
const tracingOptions = {
|
|
92
|
+
...config.defaults,
|
|
93
|
+
...overrides
|
|
94
|
+
};
|
|
95
|
+
return withTracing(model, phClient, tracingOptions);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
class PostHogTelemetryCollector {
|
|
99
|
+
phClient;
|
|
100
|
+
config;
|
|
101
|
+
initPromise;
|
|
102
|
+
constructor(config) {
|
|
103
|
+
this.config = config;
|
|
104
|
+
this.phClient = config.client;
|
|
105
|
+
}
|
|
106
|
+
async collect(sample) {
|
|
107
|
+
const client = await this.getClient();
|
|
108
|
+
const distinctId = this.config.defaults?.posthogDistinctId ?? sample.metadata?.["actorId"] ?? "system";
|
|
109
|
+
client.capture({
|
|
110
|
+
distinctId,
|
|
111
|
+
event: "$ai_generation",
|
|
112
|
+
properties: {
|
|
113
|
+
$ai_model: sample.operation.name,
|
|
114
|
+
$ai_provider: "contractspec",
|
|
115
|
+
$ai_latency: sample.durationMs / 1000,
|
|
116
|
+
$ai_is_error: !sample.success,
|
|
117
|
+
$ai_trace_id: this.config.defaults?.posthogTraceId,
|
|
118
|
+
...sample.metadata?.["tokenUsage"] ? mapTokenUsage(sample.metadata["tokenUsage"]) : {},
|
|
119
|
+
...this.config.defaults?.posthogProperties,
|
|
120
|
+
contractspec_operation: sample.operation.name,
|
|
121
|
+
contractspec_version: sample.operation.version,
|
|
122
|
+
contractspec_agent_id: sample.metadata?.["agentId"],
|
|
123
|
+
contractspec_finish_reason: sample.metadata?.["finishReason"],
|
|
124
|
+
contractspec_tool_count: sample.metadata?.["toolCallCount"]
|
|
125
|
+
},
|
|
126
|
+
groups: this.config.defaults?.posthogGroups
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async shutdown() {
|
|
130
|
+
if (this.phClient?.shutdown) {
|
|
131
|
+
await this.phClient.shutdown();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async getClient() {
|
|
135
|
+
if (this.phClient)
|
|
136
|
+
return this.phClient;
|
|
137
|
+
if (!this.initPromise) {
|
|
138
|
+
this.initPromise = resolvePostHogClient(this.config).then((client) => {
|
|
139
|
+
this.phClient = client;
|
|
140
|
+
return client;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return this.initPromise;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function createPostHogTelemetryCollector(config) {
|
|
147
|
+
return new PostHogTelemetryCollector(config);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
class CompositeTelemetryCollector {
|
|
151
|
+
collectors;
|
|
152
|
+
constructor(collectors) {
|
|
153
|
+
this.collectors = collectors;
|
|
154
|
+
}
|
|
155
|
+
async collect(sample) {
|
|
156
|
+
await Promise.all(this.collectors.map((c) => c.collect(sample)));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function createCompositeTelemetryCollector(collectors) {
|
|
160
|
+
return new CompositeTelemetryCollector(collectors);
|
|
161
|
+
}
|
|
162
|
+
async function importPostHogAI() {
|
|
163
|
+
try {
|
|
164
|
+
return await import("@posthog/ai");
|
|
165
|
+
} catch {
|
|
166
|
+
throw new Error("PostHog LLM Analytics requires @posthog/ai to be installed. Run: npm install @posthog/ai posthog-node");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async function resolvePostHogClient(config) {
|
|
170
|
+
if (config.client)
|
|
171
|
+
return config.client;
|
|
172
|
+
if (!config.apiKey) {
|
|
173
|
+
throw new Error("PostHog LLM Analytics requires either a client instance or an apiKey.");
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const { PostHog } = await import("posthog-node");
|
|
177
|
+
return new PostHog(config.apiKey, {
|
|
178
|
+
host: config.host ?? "https://us.i.posthog.com"
|
|
179
|
+
});
|
|
180
|
+
} catch {
|
|
181
|
+
throw new Error("PostHog LLM Analytics requires posthog-node to be installed. Run: npm install posthog-node");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function mapTokenUsage(usage) {
|
|
185
|
+
return {
|
|
186
|
+
$ai_input_tokens: usage["promptTokens"],
|
|
187
|
+
$ai_output_tokens: usage["completionTokens"]
|
|
188
|
+
};
|
|
189
|
+
}
|
|
79
190
|
// src/telemetry/index.ts
|
|
80
191
|
init_adapter();
|
|
81
192
|
export {
|
|
82
193
|
trackAgentStep,
|
|
83
194
|
noopTelemetryCollector,
|
|
195
|
+
createPostHogTracedModel,
|
|
196
|
+
createPostHogTelemetryCollector,
|
|
84
197
|
createInMemoryTelemetryCollector,
|
|
85
|
-
|
|
198
|
+
createCompositeTelemetryCollector,
|
|
199
|
+
PostHogTelemetryCollector,
|
|
200
|
+
InMemoryTelemetryCollector,
|
|
201
|
+
CompositeTelemetryCollector
|
|
86
202
|
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostHog LLM Analytics type definitions.
|
|
3
|
+
*
|
|
4
|
+
* Shared types for PostHog integration. Separated from implementation
|
|
5
|
+
* to allow importing types without pulling in dynamic imports.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* PostHog tracing options passed to @posthog/ai withTracing wrapper.
|
|
9
|
+
* These enrich captured $ai_generation events with contextual data.
|
|
10
|
+
*
|
|
11
|
+
* @see https://posthog.com/docs/llm-analytics/installation/vercel-ai
|
|
12
|
+
*/
|
|
13
|
+
export interface PostHogTracingOptions {
|
|
14
|
+
/** Distinct user ID for attribution */
|
|
15
|
+
posthogDistinctId?: string;
|
|
16
|
+
/** Trace ID for grouping related generations */
|
|
17
|
+
posthogTraceId?: string;
|
|
18
|
+
/** Custom properties attached to every generation event */
|
|
19
|
+
posthogProperties?: Record<string, unknown>;
|
|
20
|
+
/** When true, input/output content is redacted */
|
|
21
|
+
posthogPrivacyMode?: boolean;
|
|
22
|
+
/** Group analytics (e.g., { company: "companyId" }) */
|
|
23
|
+
posthogGroups?: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Minimal interface for posthog-node PostHog client.
|
|
27
|
+
* Avoids hard dependency on posthog-node types.
|
|
28
|
+
*/
|
|
29
|
+
export interface PostHogClient {
|
|
30
|
+
capture(params: {
|
|
31
|
+
distinctId: string;
|
|
32
|
+
event: string;
|
|
33
|
+
properties?: Record<string, unknown>;
|
|
34
|
+
groups?: Record<string, string>;
|
|
35
|
+
}): void;
|
|
36
|
+
shutdown?(): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Configuration for PostHog LLM Analytics integration.
|
|
40
|
+
*
|
|
41
|
+
* Provide either an existing PostHog client instance or
|
|
42
|
+
* apiKey + host to create one internally.
|
|
43
|
+
*
|
|
44
|
+
* PostHog Evaluations (Relevance, Helpfulness, Hallucination, Toxicity,
|
|
45
|
+
* Jailbreak, and custom prompts) run server-side on captured $ai_generation
|
|
46
|
+
* events. Configure them in PostHog UI under LLM Analytics > Evaluations.
|
|
47
|
+
*
|
|
48
|
+
* @see https://posthog.com/docs/llm-analytics/evaluations
|
|
49
|
+
*/
|
|
50
|
+
export interface PostHogLLMConfig {
|
|
51
|
+
/** Existing posthog-node client instance */
|
|
52
|
+
client?: PostHogClient;
|
|
53
|
+
/** PostHog project API key (used when client is not provided) */
|
|
54
|
+
apiKey?: string;
|
|
55
|
+
/** PostHog ingestion host (defaults to https://us.i.posthog.com) */
|
|
56
|
+
host?: string;
|
|
57
|
+
/** Default tracing options applied to all wrapped models */
|
|
58
|
+
defaults?: PostHogTracingOptions;
|
|
59
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// @bun
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { LanguageModel } from 'ai';
|
|
2
|
+
import type { TelemetryCollector, OperationMetricSample } from './adapter';
|
|
3
|
+
import type { PostHogLLMConfig, PostHogTracingOptions } from './posthog-types';
|
|
4
|
+
export type { PostHogClient, PostHogLLMConfig, PostHogTracingOptions, } from './posthog-types';
|
|
5
|
+
/**
|
|
6
|
+
* Wrap a Vercel AI SDK LanguageModel with PostHog LLM tracing.
|
|
7
|
+
*
|
|
8
|
+
* Requires `@posthog/ai` and `posthog-node` to be installed as peer deps.
|
|
9
|
+
* Automatically captures `$ai_generation` events for every LLM call,
|
|
10
|
+
* including token usage, latency, cost, input/output, and tool metadata.
|
|
11
|
+
*
|
|
12
|
+
* These events power PostHog's LLM Analytics dashboard (Traces, Generations)
|
|
13
|
+
* and are the basis for server-side Evaluations.
|
|
14
|
+
*
|
|
15
|
+
* @param model - AI SDK LanguageModel to wrap
|
|
16
|
+
* @param config - PostHog configuration
|
|
17
|
+
* @param overrides - Per-call tracing option overrides
|
|
18
|
+
* @returns Wrapped LanguageModel that auto-reports to PostHog
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import { createPostHogTracedModel } from '@contractspec/lib.ai-agent/telemetry/posthog';
|
|
23
|
+
*
|
|
24
|
+
* const model = await createPostHogTracedModel(
|
|
25
|
+
* anthropic('claude-sonnet-4-20250514'),
|
|
26
|
+
* { apiKey: process.env.POSTHOG_API_KEY },
|
|
27
|
+
* { posthogDistinctId: 'user_123' },
|
|
28
|
+
* );
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function createPostHogTracedModel(model: LanguageModel, config: PostHogLLMConfig, overrides?: PostHogTracingOptions): Promise<LanguageModel>;
|
|
32
|
+
/**
|
|
33
|
+
* PostHog-backed telemetry collector.
|
|
34
|
+
*
|
|
35
|
+
* Implements the existing TelemetryCollector interface so it integrates
|
|
36
|
+
* seamlessly with trackAgentStep(). Each OperationMetricSample is captured
|
|
37
|
+
* as a PostHog $ai_generation event, bridging ContractSpec's evolution
|
|
38
|
+
* engine with PostHog's LLM Analytics dashboard.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const collector = createPostHogTelemetryCollector({
|
|
43
|
+
* apiKey: process.env.POSTHOG_API_KEY,
|
|
44
|
+
* defaults: { posthogDistinctId: 'system' },
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class PostHogTelemetryCollector implements TelemetryCollector {
|
|
49
|
+
private phClient;
|
|
50
|
+
private readonly config;
|
|
51
|
+
private initPromise;
|
|
52
|
+
constructor(config: PostHogLLMConfig);
|
|
53
|
+
collect(sample: OperationMetricSample): Promise<void>;
|
|
54
|
+
/** Shut down the PostHog client (flushes pending events). */
|
|
55
|
+
shutdown(): Promise<void>;
|
|
56
|
+
private getClient;
|
|
57
|
+
}
|
|
58
|
+
/** Create a PostHog-backed telemetry collector. */
|
|
59
|
+
export declare function createPostHogTelemetryCollector(config: PostHogLLMConfig): PostHogTelemetryCollector;
|
|
60
|
+
/**
|
|
61
|
+
* Composite telemetry collector that forwards samples to multiple collectors.
|
|
62
|
+
*
|
|
63
|
+
* Useful when you want both PostHog LLM Analytics and the existing
|
|
64
|
+
* evolution engine to receive the same telemetry data.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const composite = createCompositeTelemetryCollector([
|
|
69
|
+
* evolutionCollector,
|
|
70
|
+
* createPostHogTelemetryCollector({ apiKey: '...' }),
|
|
71
|
+
* ]);
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare class CompositeTelemetryCollector implements TelemetryCollector {
|
|
75
|
+
private readonly collectors;
|
|
76
|
+
constructor(collectors: TelemetryCollector[]);
|
|
77
|
+
collect(sample: OperationMetricSample): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
/** Create a composite telemetry collector. */
|
|
80
|
+
export declare function createCompositeTelemetryCollector(collectors: TelemetryCollector[]): CompositeTelemetryCollector;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
set: (newValue) => all[name] = () => newValue
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
13
|
+
var __require = import.meta.require;
|
|
14
|
+
|
|
15
|
+
// src/telemetry/posthog.ts
|
|
16
|
+
var exports_posthog = {};
|
|
17
|
+
__export(exports_posthog, {
|
|
18
|
+
createPostHogTracedModel: () => createPostHogTracedModel,
|
|
19
|
+
createPostHogTelemetryCollector: () => createPostHogTelemetryCollector,
|
|
20
|
+
createCompositeTelemetryCollector: () => createCompositeTelemetryCollector,
|
|
21
|
+
PostHogTelemetryCollector: () => PostHogTelemetryCollector,
|
|
22
|
+
CompositeTelemetryCollector: () => CompositeTelemetryCollector
|
|
23
|
+
});
|
|
24
|
+
async function createPostHogTracedModel(model, config, overrides) {
|
|
25
|
+
const { withTracing } = await importPostHogAI();
|
|
26
|
+
const phClient = await resolvePostHogClient(config);
|
|
27
|
+
const tracingOptions = {
|
|
28
|
+
...config.defaults,
|
|
29
|
+
...overrides
|
|
30
|
+
};
|
|
31
|
+
return withTracing(model, phClient, tracingOptions);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
class PostHogTelemetryCollector {
|
|
35
|
+
phClient;
|
|
36
|
+
config;
|
|
37
|
+
initPromise;
|
|
38
|
+
constructor(config) {
|
|
39
|
+
this.config = config;
|
|
40
|
+
this.phClient = config.client;
|
|
41
|
+
}
|
|
42
|
+
async collect(sample) {
|
|
43
|
+
const client = await this.getClient();
|
|
44
|
+
const distinctId = this.config.defaults?.posthogDistinctId ?? sample.metadata?.["actorId"] ?? "system";
|
|
45
|
+
client.capture({
|
|
46
|
+
distinctId,
|
|
47
|
+
event: "$ai_generation",
|
|
48
|
+
properties: {
|
|
49
|
+
$ai_model: sample.operation.name,
|
|
50
|
+
$ai_provider: "contractspec",
|
|
51
|
+
$ai_latency: sample.durationMs / 1000,
|
|
52
|
+
$ai_is_error: !sample.success,
|
|
53
|
+
$ai_trace_id: this.config.defaults?.posthogTraceId,
|
|
54
|
+
...sample.metadata?.["tokenUsage"] ? mapTokenUsage(sample.metadata["tokenUsage"]) : {},
|
|
55
|
+
...this.config.defaults?.posthogProperties,
|
|
56
|
+
contractspec_operation: sample.operation.name,
|
|
57
|
+
contractspec_version: sample.operation.version,
|
|
58
|
+
contractspec_agent_id: sample.metadata?.["agentId"],
|
|
59
|
+
contractspec_finish_reason: sample.metadata?.["finishReason"],
|
|
60
|
+
contractspec_tool_count: sample.metadata?.["toolCallCount"]
|
|
61
|
+
},
|
|
62
|
+
groups: this.config.defaults?.posthogGroups
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async shutdown() {
|
|
66
|
+
if (this.phClient?.shutdown) {
|
|
67
|
+
await this.phClient.shutdown();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async getClient() {
|
|
71
|
+
if (this.phClient)
|
|
72
|
+
return this.phClient;
|
|
73
|
+
if (!this.initPromise) {
|
|
74
|
+
this.initPromise = resolvePostHogClient(this.config).then((client) => {
|
|
75
|
+
this.phClient = client;
|
|
76
|
+
return client;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return this.initPromise;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function createPostHogTelemetryCollector(config) {
|
|
83
|
+
return new PostHogTelemetryCollector(config);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
class CompositeTelemetryCollector {
|
|
87
|
+
collectors;
|
|
88
|
+
constructor(collectors) {
|
|
89
|
+
this.collectors = collectors;
|
|
90
|
+
}
|
|
91
|
+
async collect(sample) {
|
|
92
|
+
await Promise.all(this.collectors.map((c) => c.collect(sample)));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function createCompositeTelemetryCollector(collectors) {
|
|
96
|
+
return new CompositeTelemetryCollector(collectors);
|
|
97
|
+
}
|
|
98
|
+
async function importPostHogAI() {
|
|
99
|
+
try {
|
|
100
|
+
return await import("@posthog/ai");
|
|
101
|
+
} catch {
|
|
102
|
+
throw new Error("PostHog LLM Analytics requires @posthog/ai to be installed. Run: npm install @posthog/ai posthog-node");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function resolvePostHogClient(config) {
|
|
106
|
+
if (config.client)
|
|
107
|
+
return config.client;
|
|
108
|
+
if (!config.apiKey) {
|
|
109
|
+
throw new Error("PostHog LLM Analytics requires either a client instance or an apiKey.");
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const { PostHog } = await import("posthog-node");
|
|
113
|
+
return new PostHog(config.apiKey, {
|
|
114
|
+
host: config.host ?? "https://us.i.posthog.com"
|
|
115
|
+
});
|
|
116
|
+
} catch {
|
|
117
|
+
throw new Error("PostHog LLM Analytics requires posthog-node to be installed. Run: npm install posthog-node");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function mapTokenUsage(usage) {
|
|
121
|
+
return {
|
|
122
|
+
$ai_input_tokens: usage["promptTokens"],
|
|
123
|
+
$ai_output_tokens: usage["completionTokens"]
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export {
|
|
127
|
+
createPostHogTracedModel,
|
|
128
|
+
createPostHogTelemetryCollector,
|
|
129
|
+
createCompositeTelemetryCollector,
|
|
130
|
+
PostHogTelemetryCollector,
|
|
131
|
+
CompositeTelemetryCollector
|
|
132
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/tools/index.d.ts
CHANGED