truthguard-ai 0.1.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/README.md +363 -0
- package/dist/Advisor/index.d.ts +78 -0
- package/dist/Advisor/index.d.ts.map +1 -0
- package/dist/Advisor/index.js +539 -0
- package/dist/Advisor/index.js.map +1 -0
- package/dist/Alerting/index.d.ts +35 -0
- package/dist/Alerting/index.d.ts.map +1 -0
- package/dist/Alerting/index.js +76 -0
- package/dist/Alerting/index.js.map +1 -0
- package/dist/Auth/index.d.ts +82 -0
- package/dist/Auth/index.d.ts.map +1 -0
- package/dist/Auth/index.js +242 -0
- package/dist/Auth/index.js.map +1 -0
- package/dist/Baseline/index.d.ts +43 -0
- package/dist/Baseline/index.d.ts.map +1 -0
- package/dist/Baseline/index.js +195 -0
- package/dist/Baseline/index.js.map +1 -0
- package/dist/Claims/index.d.ts +73 -0
- package/dist/Claims/index.d.ts.map +1 -0
- package/dist/Claims/index.js +1669 -0
- package/dist/Claims/index.js.map +1 -0
- package/dist/Client/index.d.ts +90 -0
- package/dist/Client/index.d.ts.map +1 -0
- package/dist/Client/index.js +186 -0
- package/dist/Client/index.js.map +1 -0
- package/dist/Config/index.d.ts +41 -0
- package/dist/Config/index.d.ts.map +1 -0
- package/dist/Config/index.js +129 -0
- package/dist/Config/index.js.map +1 -0
- package/dist/Coverage/index.d.ts +28 -0
- package/dist/Coverage/index.d.ts.map +1 -0
- package/dist/Coverage/index.js +134 -0
- package/dist/Coverage/index.js.map +1 -0
- package/dist/Demo/index.d.ts +16 -0
- package/dist/Demo/index.d.ts.map +1 -0
- package/dist/Demo/index.js +189 -0
- package/dist/Demo/index.js.map +1 -0
- package/dist/Gate/index.d.ts +39 -0
- package/dist/Gate/index.d.ts.map +1 -0
- package/dist/Gate/index.js +207 -0
- package/dist/Gate/index.js.map +1 -0
- package/dist/Grounding/index.d.ts +40 -0
- package/dist/Grounding/index.d.ts.map +1 -0
- package/dist/Grounding/index.js +1433 -0
- package/dist/Grounding/index.js.map +1 -0
- package/dist/L2/index.d.ts +93 -0
- package/dist/L2/index.d.ts.map +1 -0
- package/dist/L2/index.js +1773 -0
- package/dist/L2/index.js.map +1 -0
- package/dist/MCP/index.d.ts +139 -0
- package/dist/MCP/index.d.ts.map +1 -0
- package/dist/MCP/index.js +1250 -0
- package/dist/MCP/index.js.map +1 -0
- package/dist/Matchers/index.d.ts +101 -0
- package/dist/Matchers/index.d.ts.map +1 -0
- package/dist/Matchers/index.js +690 -0
- package/dist/Matchers/index.js.map +1 -0
- package/dist/Middleware/index.d.ts +146 -0
- package/dist/Middleware/index.d.ts.map +1 -0
- package/dist/Middleware/index.js +239 -0
- package/dist/Middleware/index.js.map +1 -0
- package/dist/Mode/index.d.ts +87 -0
- package/dist/Mode/index.d.ts.map +1 -0
- package/dist/Mode/index.js +117 -0
- package/dist/Mode/index.js.map +1 -0
- package/dist/Policy/index.d.ts +89 -0
- package/dist/Policy/index.d.ts.map +1 -0
- package/dist/Policy/index.js +143 -0
- package/dist/Policy/index.js.map +1 -0
- package/dist/Proxy/SessionStore.d.ts +94 -0
- package/dist/Proxy/SessionStore.d.ts.map +1 -0
- package/dist/Proxy/SessionStore.js +225 -0
- package/dist/Proxy/SessionStore.js.map +1 -0
- package/dist/Proxy/index.d.ts +166 -0
- package/dist/Proxy/index.d.ts.map +1 -0
- package/dist/Proxy/index.js +531 -0
- package/dist/Proxy/index.js.map +1 -0
- package/dist/Registry/index.d.ts +93 -0
- package/dist/Registry/index.d.ts.map +1 -0
- package/dist/Registry/index.js +818 -0
- package/dist/Registry/index.js.map +1 -0
- package/dist/Reports/index.d.ts +38 -0
- package/dist/Reports/index.d.ts.map +1 -0
- package/dist/Reports/index.js +149 -0
- package/dist/Reports/index.js.map +1 -0
- package/dist/Rules/index.d.ts +587 -0
- package/dist/Rules/index.d.ts.map +1 -0
- package/dist/Rules/index.js +6236 -0
- package/dist/Rules/index.js.map +1 -0
- package/dist/Rules/intents.d.ts +22 -0
- package/dist/Rules/intents.d.ts.map +1 -0
- package/dist/Rules/intents.js +242 -0
- package/dist/Rules/intents.js.map +1 -0
- package/dist/Runner/index.d.ts +39 -0
- package/dist/Runner/index.d.ts.map +1 -0
- package/dist/Runner/index.js +185 -0
- package/dist/Runner/index.js.map +1 -0
- package/dist/SDK/anthropic.d.ts +102 -0
- package/dist/SDK/anthropic.d.ts.map +1 -0
- package/dist/SDK/anthropic.js +425 -0
- package/dist/SDK/anthropic.js.map +1 -0
- package/dist/SDK/openai.d.ts +164 -0
- package/dist/SDK/openai.d.ts.map +1 -0
- package/dist/SDK/openai.js +557 -0
- package/dist/SDK/openai.js.map +1 -0
- package/dist/Store/index.d.ts +72 -0
- package/dist/Store/index.d.ts.map +1 -0
- package/dist/Store/index.js +136 -0
- package/dist/Store/index.js.map +1 -0
- package/dist/Telemetry/index.d.ts +84 -0
- package/dist/Telemetry/index.d.ts.map +1 -0
- package/dist/Telemetry/index.js +239 -0
- package/dist/Telemetry/index.js.map +1 -0
- package/dist/Trace/index.d.ts +219 -0
- package/dist/Trace/index.d.ts.map +1 -0
- package/dist/Trace/index.js +763 -0
- package/dist/Trace/index.js.map +1 -0
- package/dist/TraceReadiness/index.d.ts +42 -0
- package/dist/TraceReadiness/index.d.ts.map +1 -0
- package/dist/TraceReadiness/index.js +169 -0
- package/dist/TraceReadiness/index.js.map +1 -0
- package/dist/cli/index.d.ts +15 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +807 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/i18n/index.d.ts +44 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +124 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +218 -0
- package/dist/index.js.map +1 -0
- package/dist/thin.d.ts +39 -0
- package/dist/thin.d.ts.map +1 -0
- package/dist/thin.js +120 -0
- package/dist/thin.js.map +1 -0
- package/dist/types/index.d.ts +498 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +17 -0
- package/dist/types/index.js.map +1 -0
- package/dist-npm/Alerting/index.d.ts +35 -0
- package/dist-npm/Alerting/index.d.ts.map +1 -0
- package/dist-npm/Alerting/index.js +76 -0
- package/dist-npm/Alerting/index.js.map +1 -0
- package/dist-npm/Auth/index.d.ts +82 -0
- package/dist-npm/Auth/index.d.ts.map +1 -0
- package/dist-npm/Auth/index.js +242 -0
- package/dist-npm/Auth/index.js.map +1 -0
- package/dist-npm/Client/index.d.ts +90 -0
- package/dist-npm/Client/index.d.ts.map +1 -0
- package/dist-npm/Client/index.js +186 -0
- package/dist-npm/Client/index.js.map +1 -0
- package/dist-npm/Demo/index.d.ts +16 -0
- package/dist-npm/Demo/index.d.ts.map +1 -0
- package/dist-npm/Demo/index.js +189 -0
- package/dist-npm/Demo/index.js.map +1 -0
- package/dist-npm/Middleware/index.d.ts +146 -0
- package/dist-npm/Middleware/index.d.ts.map +1 -0
- package/dist-npm/Middleware/index.js +239 -0
- package/dist-npm/Middleware/index.js.map +1 -0
- package/dist-npm/Proxy/SessionStore.d.ts +94 -0
- package/dist-npm/Proxy/SessionStore.d.ts.map +1 -0
- package/dist-npm/Proxy/SessionStore.js +225 -0
- package/dist-npm/Proxy/SessionStore.js.map +1 -0
- package/dist-npm/Proxy/index.d.ts +166 -0
- package/dist-npm/Proxy/index.d.ts.map +1 -0
- package/dist-npm/Proxy/index.js +531 -0
- package/dist-npm/Proxy/index.js.map +1 -0
- package/dist-npm/SDK/anthropic.d.ts +102 -0
- package/dist-npm/SDK/anthropic.d.ts.map +1 -0
- package/dist-npm/SDK/anthropic.js +425 -0
- package/dist-npm/SDK/anthropic.js.map +1 -0
- package/dist-npm/SDK/openai.d.ts +164 -0
- package/dist-npm/SDK/openai.d.ts.map +1 -0
- package/dist-npm/SDK/openai.js +557 -0
- package/dist-npm/SDK/openai.js.map +1 -0
- package/dist-npm/Store/index.d.ts +72 -0
- package/dist-npm/Store/index.d.ts.map +1 -0
- package/dist-npm/Store/index.js +136 -0
- package/dist-npm/Store/index.js.map +1 -0
- package/dist-npm/Telemetry/index.d.ts +84 -0
- package/dist-npm/Telemetry/index.d.ts.map +1 -0
- package/dist-npm/Telemetry/index.js +239 -0
- package/dist-npm/Telemetry/index.js.map +1 -0
- package/dist-npm/Trace/index.d.ts +219 -0
- package/dist-npm/Trace/index.d.ts.map +1 -0
- package/dist-npm/Trace/index.js +763 -0
- package/dist-npm/Trace/index.js.map +1 -0
- package/dist-npm/thin.d.ts +39 -0
- package/dist-npm/thin.d.ts.map +1 -0
- package/dist-npm/thin.js +120 -0
- package/dist-npm/thin.js.map +1 -0
- package/dist-npm/types/index.d.ts +498 -0
- package/dist-npm/types/index.d.ts.map +1 -0
- package/dist-npm/types/index.js +17 -0
- package/dist-npm/types/index.js.map +1 -0
- package/package.json +114 -0
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ai-rcp Anthropic SDK Wrapper
|
|
4
|
+
*
|
|
5
|
+
* Wraps an Anthropic client to automatically capture tool-calling traces
|
|
6
|
+
* and run them through the grounding pipeline.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import Anthropic from '@anthropic-ai/sdk';
|
|
11
|
+
* import { wrapAnthropic } from 'ai-rcp';
|
|
12
|
+
*
|
|
13
|
+
* const client = wrapAnthropic(new Anthropic(), {
|
|
14
|
+
* mode: 'warn',
|
|
15
|
+
* threshold: 0.8,
|
|
16
|
+
* onEvaluate: (report) => console.log('Score:', report.groundingScore),
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Use exactly like the normal Anthropic client
|
|
20
|
+
* const response = await client.messages.create({
|
|
21
|
+
* model: 'claude-sonnet-4-20250514',
|
|
22
|
+
* max_tokens: 1024,
|
|
23
|
+
* messages: [{ role: 'user', content: 'What appointments do I have?' }],
|
|
24
|
+
* tools: [...],
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
29
|
+
if (k2 === undefined) k2 = k;
|
|
30
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
31
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
32
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
33
|
+
}
|
|
34
|
+
Object.defineProperty(o, k2, desc);
|
|
35
|
+
}) : (function(o, m, k, k2) {
|
|
36
|
+
if (k2 === undefined) k2 = k;
|
|
37
|
+
o[k2] = m[k];
|
|
38
|
+
}));
|
|
39
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
40
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
41
|
+
}) : function(o, v) {
|
|
42
|
+
o["default"] = v;
|
|
43
|
+
});
|
|
44
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
45
|
+
var ownKeys = function(o) {
|
|
46
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
47
|
+
var ar = [];
|
|
48
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
49
|
+
return ar;
|
|
50
|
+
};
|
|
51
|
+
return ownKeys(o);
|
|
52
|
+
};
|
|
53
|
+
return function (mod) {
|
|
54
|
+
if (mod && mod.__esModule) return mod;
|
|
55
|
+
var result = {};
|
|
56
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
57
|
+
__setModuleDefault(result, mod);
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
})();
|
|
61
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
62
|
+
exports.GroundingError = void 0;
|
|
63
|
+
exports.buildTraceFromAnthropic = buildTraceFromAnthropic;
|
|
64
|
+
exports.buildErrorTrace = buildErrorTrace;
|
|
65
|
+
exports.wrapAnthropic = wrapAnthropic;
|
|
66
|
+
const openai_1 = require("./openai");
|
|
67
|
+
Object.defineProperty(exports, "GroundingError", { enumerable: true, get: function () { return openai_1.GroundingError; } });
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Trace builder
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
let traceCounter = 0;
|
|
72
|
+
function extractTextContent(content) {
|
|
73
|
+
if (!content)
|
|
74
|
+
return '';
|
|
75
|
+
if (typeof content === 'string')
|
|
76
|
+
return content;
|
|
77
|
+
if (!Array.isArray(content))
|
|
78
|
+
return '';
|
|
79
|
+
return content
|
|
80
|
+
.filter((b) => b.type === 'text' && b.text)
|
|
81
|
+
.map((b) => b.text)
|
|
82
|
+
.join('\n');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Build a TruthGuard Trace from Anthropic messages and response.
|
|
86
|
+
*/
|
|
87
|
+
function buildTraceFromAnthropic(messages, systemPrompt,
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
response) {
|
|
90
|
+
const traceId = `anthropic-${Date.now()}-${++traceCounter}`;
|
|
91
|
+
try {
|
|
92
|
+
return _buildTraceInner(traceId, messages, systemPrompt, response);
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
return {
|
|
96
|
+
traceId,
|
|
97
|
+
steps: [{
|
|
98
|
+
stepId: 'step-error',
|
|
99
|
+
role: 'final_response',
|
|
100
|
+
content: `[TruthGuard Trace Error] ${e instanceof Error ? e.message : String(e)}`,
|
|
101
|
+
metadata: { traceError: true },
|
|
102
|
+
}],
|
|
103
|
+
startedAt: new Date().toISOString(),
|
|
104
|
+
metadata: { provider: 'anthropic', traceError: true },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function _buildTraceInner(traceId, messages, systemPrompt,
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
110
|
+
response) {
|
|
111
|
+
const steps = [];
|
|
112
|
+
let stepCounter = 0;
|
|
113
|
+
// Build tool_use_id → name map
|
|
114
|
+
const toolUseIdToName = new Map();
|
|
115
|
+
for (const msg of messages) {
|
|
116
|
+
if (msg.role === 'assistant' && Array.isArray(msg.content)) {
|
|
117
|
+
for (const block of msg.content) {
|
|
118
|
+
if (block.type === 'tool_use' && block.id && block.name) {
|
|
119
|
+
toolUseIdToName.set(block.id, block.name);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// System prompt
|
|
125
|
+
if (systemPrompt) {
|
|
126
|
+
const text = typeof systemPrompt === 'string'
|
|
127
|
+
? systemPrompt
|
|
128
|
+
: systemPrompt.map(s => s.text).join('\n');
|
|
129
|
+
if (text.trim()) {
|
|
130
|
+
steps.push({ stepId: `step-${++stepCounter}`, role: 'system_prompt', content: text });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Parse messages
|
|
134
|
+
for (const msg of messages) {
|
|
135
|
+
if (msg.role === 'user') {
|
|
136
|
+
if (typeof msg.content === 'string') {
|
|
137
|
+
steps.push({ stepId: `step-${++stepCounter}`, role: 'user_input', content: msg.content });
|
|
138
|
+
}
|
|
139
|
+
else if (Array.isArray(msg.content)) {
|
|
140
|
+
// User message may contain text blocks and tool_result blocks
|
|
141
|
+
for (const block of msg.content) {
|
|
142
|
+
if (block.type === 'text' && block.text) {
|
|
143
|
+
steps.push({ stepId: `step-${++stepCounter}`, role: 'user_input', content: block.text });
|
|
144
|
+
}
|
|
145
|
+
else if (block.type === 'tool_result') {
|
|
146
|
+
const toolName = block.tool_use_id ? (toolUseIdToName.get(block.tool_use_id) ?? 'unknown') : 'unknown';
|
|
147
|
+
const outputText = extractTextContent(block.content);
|
|
148
|
+
let output = outputText;
|
|
149
|
+
try {
|
|
150
|
+
output = JSON.parse(outputText);
|
|
151
|
+
}
|
|
152
|
+
catch { /* keep string */ }
|
|
153
|
+
steps.push({
|
|
154
|
+
stepId: `step-${++stepCounter}`,
|
|
155
|
+
role: 'tool_output',
|
|
156
|
+
content: outputText,
|
|
157
|
+
toolOutputs: [{ toolName, output }],
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else if (msg.role === 'assistant') {
|
|
164
|
+
if (typeof msg.content === 'string') {
|
|
165
|
+
steps.push({ stepId: `step-${++stepCounter}`, role: 'final_response', content: msg.content });
|
|
166
|
+
}
|
|
167
|
+
else if (Array.isArray(msg.content)) {
|
|
168
|
+
for (const block of msg.content) {
|
|
169
|
+
if (block.type === 'tool_use') {
|
|
170
|
+
steps.push({
|
|
171
|
+
stepId: `step-${++stepCounter}`,
|
|
172
|
+
role: 'tool_call',
|
|
173
|
+
content: '',
|
|
174
|
+
toolCalls: [{ toolName: block.name ?? 'unknown', parameters: block.input ?? {} }],
|
|
175
|
+
});
|
|
176
|
+
// Track ID→name for tool_result resolution
|
|
177
|
+
if (block.id && block.name) {
|
|
178
|
+
toolUseIdToName.set(block.id, block.name);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else if (block.type === 'text' && block.text) {
|
|
182
|
+
steps.push({ stepId: `step-${++stepCounter}`, role: 'final_response', content: block.text });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Add response content
|
|
189
|
+
if (response?.content) {
|
|
190
|
+
const content = response.content;
|
|
191
|
+
for (const block of content) {
|
|
192
|
+
if (block.type === 'tool_use') {
|
|
193
|
+
steps.push({
|
|
194
|
+
stepId: `step-${++stepCounter}`,
|
|
195
|
+
role: 'tool_call',
|
|
196
|
+
content: '',
|
|
197
|
+
toolCalls: [{ toolName: block.name ?? 'unknown', parameters: block.input ?? {} }],
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else if (block.type === 'text' && block.text) {
|
|
201
|
+
steps.push({
|
|
202
|
+
stepId: `step-${++stepCounter}`,
|
|
203
|
+
role: 'final_response',
|
|
204
|
+
content: block.text,
|
|
205
|
+
...(response.usage ? {
|
|
206
|
+
tokens: {
|
|
207
|
+
prompt: response.usage.input_tokens,
|
|
208
|
+
completion: response.usage.output_tokens,
|
|
209
|
+
total: (response.usage.input_tokens ?? 0) + (response.usage.output_tokens ?? 0),
|
|
210
|
+
...(response.stop_reason ? { finishReason: response.stop_reason } : {}),
|
|
211
|
+
},
|
|
212
|
+
} : {}),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
traceId,
|
|
219
|
+
steps,
|
|
220
|
+
startedAt: new Date().toISOString(),
|
|
221
|
+
metadata: {
|
|
222
|
+
provider: 'anthropic',
|
|
223
|
+
model: response?.model,
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Build an error trace from Anthropic messages when the API call fails.
|
|
229
|
+
*/
|
|
230
|
+
function buildErrorTrace(messages, systemPrompt, error) {
|
|
231
|
+
const traceId = `anthropic-err-${Date.now()}-${++traceCounter}`;
|
|
232
|
+
const steps = [];
|
|
233
|
+
let stepCounter = 0;
|
|
234
|
+
// System prompt
|
|
235
|
+
if (systemPrompt) {
|
|
236
|
+
const text = typeof systemPrompt === 'string'
|
|
237
|
+
? systemPrompt
|
|
238
|
+
: systemPrompt.map(s => s.text).join('\n');
|
|
239
|
+
if (text.trim()) {
|
|
240
|
+
steps.push({ stepId: `step-${++stepCounter}`, role: 'system_prompt', content: text });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// User input
|
|
244
|
+
if (Array.isArray(messages)) {
|
|
245
|
+
for (const msg of messages) {
|
|
246
|
+
if (msg.role === 'user') {
|
|
247
|
+
const text = extractTextContent(typeof msg.content === 'string' ? msg.content : msg.content);
|
|
248
|
+
if (text.trim()) {
|
|
249
|
+
steps.push({ stepId: `step-${++stepCounter}`, role: 'user_input', content: text });
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Error as final response
|
|
256
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
257
|
+
const errName = error instanceof Error ? error.name : 'UnknownError';
|
|
258
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
259
|
+
const statusCode = error?.status ?? error?.statusCode;
|
|
260
|
+
steps.push({
|
|
261
|
+
stepId: `step-${++stepCounter}`,
|
|
262
|
+
role: 'final_response',
|
|
263
|
+
content: `[API Error] ${errName}: ${errMsg}`,
|
|
264
|
+
metadata: {
|
|
265
|
+
apiError: true,
|
|
266
|
+
errorType: errName,
|
|
267
|
+
errorMessage: errMsg,
|
|
268
|
+
...(statusCode ? { statusCode } : {}),
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
return {
|
|
272
|
+
traceId,
|
|
273
|
+
steps,
|
|
274
|
+
startedAt: new Date().toISOString(),
|
|
275
|
+
metadata: {
|
|
276
|
+
provider: 'anthropic',
|
|
277
|
+
apiError: true,
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
function buildEvaluator(options, mode) {
|
|
282
|
+
if (options.client) {
|
|
283
|
+
const client = options.client;
|
|
284
|
+
const threshold = options.threshold;
|
|
285
|
+
return async (trace) => {
|
|
286
|
+
const result = await client.evaluate(trace, { mode, threshold });
|
|
287
|
+
options.onEvaluate?.(result.report, trace);
|
|
288
|
+
return result;
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
if (options._pipeline) {
|
|
292
|
+
const pipeline = options._pipeline;
|
|
293
|
+
return async (trace) => {
|
|
294
|
+
const result = await pipeline.evaluate(trace);
|
|
295
|
+
options.onEvaluate?.(result.report, trace);
|
|
296
|
+
return result;
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
let lazyPipeline = null;
|
|
300
|
+
return async (trace) => {
|
|
301
|
+
if (!lazyPipeline) {
|
|
302
|
+
try {
|
|
303
|
+
const { Pipeline } = await Promise.resolve().then(() => __importStar(require('../Mode')));
|
|
304
|
+
lazyPipeline = new Pipeline({ ...options, mode });
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
throw new Error('TruthGuard: No evaluation backend available. ' +
|
|
308
|
+
'Provide a `client` option (TruthGuardClient) for remote evaluation, ' +
|
|
309
|
+
'or install the full engine for local evaluation.');
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
const result = await lazyPipeline.evaluate(trace);
|
|
313
|
+
options.onEvaluate?.(result.report, trace);
|
|
314
|
+
return result;
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
// ---------------------------------------------------------------------------
|
|
318
|
+
// SDK Wrapper
|
|
319
|
+
// ---------------------------------------------------------------------------
|
|
320
|
+
/**
|
|
321
|
+
* Wraps an Anthropic client instance to auto-capture traces and evaluate grounding.
|
|
322
|
+
*
|
|
323
|
+
* Returns a proxy that intercepts `client.messages.create()`.
|
|
324
|
+
* All other methods pass through unchanged.
|
|
325
|
+
*
|
|
326
|
+
* @example
|
|
327
|
+
* ```ts
|
|
328
|
+
* import Anthropic from '@anthropic-ai/sdk';
|
|
329
|
+
* import { wrapAnthropic } from 'ai-rcp';
|
|
330
|
+
*
|
|
331
|
+
* const client = wrapAnthropic(new Anthropic(), { mode: 'observe' });
|
|
332
|
+
*
|
|
333
|
+
* const response = await client.messages.create({
|
|
334
|
+
* model: 'claude-sonnet-4-20250514',
|
|
335
|
+
* max_tokens: 1024,
|
|
336
|
+
* messages,
|
|
337
|
+
* tools,
|
|
338
|
+
* });
|
|
339
|
+
* ```
|
|
340
|
+
*/
|
|
341
|
+
function wrapAnthropic(client, options = {}) {
|
|
342
|
+
const mode = options.mode ?? 'observe';
|
|
343
|
+
const shouldBlock = mode === 'block';
|
|
344
|
+
const awaitEval = options.awaitEvaluation ?? shouldBlock;
|
|
345
|
+
const evaluator = buildEvaluator(options, mode);
|
|
346
|
+
// Intercept: client.messages.create()
|
|
347
|
+
return new Proxy(client, {
|
|
348
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
349
|
+
get(target, prop) {
|
|
350
|
+
if (prop === 'messages') {
|
|
351
|
+
return new Proxy(target.messages, {
|
|
352
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
353
|
+
get(messagesTarget, messagesProp) {
|
|
354
|
+
if (messagesProp === 'create') {
|
|
355
|
+
return async function wrappedCreate(
|
|
356
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
357
|
+
params,
|
|
358
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
359
|
+
...rest) {
|
|
360
|
+
let response;
|
|
361
|
+
let apiError;
|
|
362
|
+
try {
|
|
363
|
+
response = await messagesTarget.create.call(messagesTarget, params, ...rest);
|
|
364
|
+
}
|
|
365
|
+
catch (err) {
|
|
366
|
+
apiError = err;
|
|
367
|
+
}
|
|
368
|
+
const messages = params.messages ?? [];
|
|
369
|
+
const systemPrompt = params.system;
|
|
370
|
+
// Check if the conversation involves tool usage
|
|
371
|
+
const hasToolContext = messages.some((m) => {
|
|
372
|
+
if (m.role === 'assistant' && Array.isArray(m.content)) {
|
|
373
|
+
return m.content.some(b => b.type === 'tool_use');
|
|
374
|
+
}
|
|
375
|
+
if (m.role === 'user' && Array.isArray(m.content)) {
|
|
376
|
+
return m.content.some(b => b.type === 'tool_result');
|
|
377
|
+
}
|
|
378
|
+
return false;
|
|
379
|
+
});
|
|
380
|
+
if (apiError) {
|
|
381
|
+
if (hasToolContext) {
|
|
382
|
+
const trace = buildErrorTrace(messages, systemPrompt, apiError);
|
|
383
|
+
if (awaitEval) {
|
|
384
|
+
const result = await evaluator(trace);
|
|
385
|
+
options.onResult?.(result, trace);
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
evaluator(trace).then((result) => options.onResult?.(result, trace), () => { });
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
throw apiError;
|
|
392
|
+
}
|
|
393
|
+
// Detect final response: no tool_use blocks in response
|
|
394
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
395
|
+
const resp = response;
|
|
396
|
+
const responseContent = resp?.content;
|
|
397
|
+
const responseHasToolUse = Array.isArray(responseContent)
|
|
398
|
+
&& responseContent.some(b => b.type === 'tool_use');
|
|
399
|
+
const isFinalResponse = resp && !responseHasToolUse
|
|
400
|
+
&& (resp.stop_reason === 'end_turn' || resp.stop_reason === 'max_tokens');
|
|
401
|
+
if (hasToolContext && isFinalResponse) {
|
|
402
|
+
const trace = buildTraceFromAnthropic(messages, systemPrompt, response);
|
|
403
|
+
if (awaitEval) {
|
|
404
|
+
const result = await evaluator(trace);
|
|
405
|
+
options.onResult?.(result, trace);
|
|
406
|
+
if (shouldBlock && !result.allowed) {
|
|
407
|
+
throw new openai_1.GroundingError(result.fallbackResponse ?? 'Response blocked due to low grounding score', result.report, trace);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
evaluator(trace).then((result) => options.onResult?.(result, trace), () => { });
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return response;
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
return messagesTarget[messagesProp];
|
|
418
|
+
},
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
return target[prop];
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/SDK/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ai-rcp OpenAI SDK Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Wraps an OpenAI client to automatically capture tool-calling traces
|
|
5
|
+
* and run them through the grounding pipeline.
|
|
6
|
+
*
|
|
7
|
+
* This is the "zero-config" integration: import, wrap, and you get
|
|
8
|
+
* grounding evaluation on every tool-calling conversation.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import OpenAI from 'openai';
|
|
13
|
+
* import { wrapOpenAI } from 'ai-rcp';
|
|
14
|
+
*
|
|
15
|
+
* const openai = wrapOpenAI(new OpenAI(), {
|
|
16
|
+
* mode: 'warn',
|
|
17
|
+
* threshold: 0.8,
|
|
18
|
+
* onEvaluate: (report) => console.log('Score:', report.groundingScore),
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // Use exactly like the normal OpenAI client
|
|
22
|
+
* const response = await openai.chat.completions.create({
|
|
23
|
+
* model: 'gpt-4',
|
|
24
|
+
* messages: [{ role: 'user', content: 'What appointments do I have?' }],
|
|
25
|
+
* tools: [...],
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // ai-rcp has already evaluated the trace in the background.
|
|
29
|
+
* // In 'block' mode, a GroundingError is thrown if the score is too low.
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
import type { Trace, GroundingReport } from '../types';
|
|
33
|
+
import type { TruthGuardClient } from '../Client';
|
|
34
|
+
/** Operating mode. */
|
|
35
|
+
export type WrapMode = 'observe' | 'warn' | 'block' | 'debug' | 'ci';
|
|
36
|
+
/** Result returned after evaluation (thin-client compatible). */
|
|
37
|
+
export interface WrapPipelineResult {
|
|
38
|
+
report: GroundingReport;
|
|
39
|
+
allowed: boolean;
|
|
40
|
+
fallbackResponse?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface WrapOpenAIOptions {
|
|
43
|
+
/** Operating mode. Default: 'observe'. */
|
|
44
|
+
mode?: WrapMode;
|
|
45
|
+
/** Score threshold for block/warn decisions. Default: 0.75. */
|
|
46
|
+
threshold?: number;
|
|
47
|
+
/**
|
|
48
|
+
* TruthGuard client for remote evaluation (thin-client mode).
|
|
49
|
+
* When provided, traces are sent to the server for evaluation.
|
|
50
|
+
* When omitted, falls back to local Pipeline evaluation (server-side only).
|
|
51
|
+
*/
|
|
52
|
+
client?: TruthGuardClient;
|
|
53
|
+
/**
|
|
54
|
+
* Local Pipeline instance for server-side evaluation.
|
|
55
|
+
* Only used when `client` is not provided. Set internally by the full engine.
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
_pipeline?: {
|
|
59
|
+
evaluate(trace: Trace): Promise<WrapPipelineResult>;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* When true, blocks the response until grounding evaluation completes.
|
|
63
|
+
* When false (default), evaluation runs async and doesn't delay the response.
|
|
64
|
+
* Automatically set to true for 'block' mode.
|
|
65
|
+
*/
|
|
66
|
+
awaitEvaluation?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Called with the evaluation result after each tool-calling conversation.
|
|
69
|
+
* Useful for logging or metrics.
|
|
70
|
+
*/
|
|
71
|
+
onResult?: (result: WrapPipelineResult, trace: Trace) => void;
|
|
72
|
+
/**
|
|
73
|
+
* Callback when a response is blocked (block mode only).
|
|
74
|
+
* Return a fallback response string, or null to use the default.
|
|
75
|
+
*/
|
|
76
|
+
onBlock?: (report: GroundingReport) => string | null;
|
|
77
|
+
/**
|
|
78
|
+
* Callback fired after every evaluation (all modes).
|
|
79
|
+
*/
|
|
80
|
+
onEvaluate?: (report: GroundingReport, trace: Trace) => void;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Error thrown in block mode when a response fails grounding.
|
|
84
|
+
*/
|
|
85
|
+
export declare class GroundingError extends Error {
|
|
86
|
+
readonly report: GroundingReport;
|
|
87
|
+
readonly trace: Trace;
|
|
88
|
+
constructor(message: string, report: GroundingReport, trace: Trace);
|
|
89
|
+
}
|
|
90
|
+
interface ChatMessage {
|
|
91
|
+
role: string;
|
|
92
|
+
content?: string | null;
|
|
93
|
+
tool_calls?: Array<{
|
|
94
|
+
id: string;
|
|
95
|
+
type: string;
|
|
96
|
+
function: {
|
|
97
|
+
name: string;
|
|
98
|
+
arguments: string;
|
|
99
|
+
};
|
|
100
|
+
}>;
|
|
101
|
+
tool_call_id?: string;
|
|
102
|
+
name?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Build an ai-rcp Trace from the OpenAI messages array and the final response.
|
|
106
|
+
*/
|
|
107
|
+
export declare function buildTraceFromOpenAI(messages: ChatMessage[], response: any): Trace;
|
|
108
|
+
/**
|
|
109
|
+
* Build an ai-rcp Trace when the OpenAI API call fails (rate limit, timeout, etc.).
|
|
110
|
+
* Records the conversation context + the error so TruthGuard can still evaluate
|
|
111
|
+
* whatever fallback response the caller surfaces to the user.
|
|
112
|
+
*/
|
|
113
|
+
export declare function buildErrorTrace(messages: ChatMessage[], error: unknown): Trace;
|
|
114
|
+
export interface ReportUnavailableOptions {
|
|
115
|
+
/** The user's question that was not answered. */
|
|
116
|
+
userMessage: string;
|
|
117
|
+
/** The error message shown to the user (e.g. "AI server unavailable"). */
|
|
118
|
+
errorMessage: string;
|
|
119
|
+
/** Reason category: 'timeout', 'overloaded', 'rate_limit', 'quota', 'network', 'unknown'. */
|
|
120
|
+
reason?: string;
|
|
121
|
+
/** HTTP status code from the AI provider, if available. */
|
|
122
|
+
statusCode?: number;
|
|
123
|
+
/** AI provider name (e.g. 'openai', 'anthropic'). */
|
|
124
|
+
provider?: string;
|
|
125
|
+
/** System prompt, if available. */
|
|
126
|
+
systemPrompt?: string;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Build a trace for scenarios where the AI service was unavailable.
|
|
130
|
+
*
|
|
131
|
+
* Use this when your application catches an error **before or instead of**
|
|
132
|
+
* calling the AI API, and shows an error message to the user. This ensures
|
|
133
|
+
* the event appears in TruthGuard's Live Observe dashboard.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```ts
|
|
137
|
+
* import { reportUnavailable } from 'ai-rcp';
|
|
138
|
+
*
|
|
139
|
+
* try {
|
|
140
|
+
* const response = await callAI(userMessage);
|
|
141
|
+
* } catch (err) {
|
|
142
|
+
* const trace = reportUnavailable({
|
|
143
|
+
* userMessage: 'Daj mi izveštaj za mart',
|
|
144
|
+
* errorMessage: 'AI server trenutno nije dostupan',
|
|
145
|
+
* reason: 'timeout',
|
|
146
|
+
* provider: 'anthropic',
|
|
147
|
+
* });
|
|
148
|
+
* // Send to TruthGuard: await fetch('/api/ingest', { body: JSON.stringify({ trace }) });
|
|
149
|
+
* }
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
export declare function reportUnavailable(options: ReportUnavailableOptions): Trace;
|
|
153
|
+
/**
|
|
154
|
+
* Wraps an OpenAI client instance to auto-capture traces and evaluate grounding.
|
|
155
|
+
*
|
|
156
|
+
* Returns a proxy that intercepts `client.chat.completions.create()`.
|
|
157
|
+
* All other methods pass through unchanged.
|
|
158
|
+
*
|
|
159
|
+
* In thin-client mode (when `client` option is provided), traces are sent to
|
|
160
|
+
* the TruthGuard server for evaluation — no engine code runs locally.
|
|
161
|
+
*/
|
|
162
|
+
export declare function wrapOpenAI<T extends object>(client: T, options?: WrapOpenAIOptions): T;
|
|
163
|
+
export {};
|
|
164
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/SDK/openai.ts"],"names":[],"mappings":"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"}
|