@exochain/llm-proxy 0.2.1-beta
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/AGENTS.md +48 -0
- package/README.md +124 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +42 -0
- package/dist/cli.js.map +1 -0
- package/dist/delivery.d.ts +3 -0
- package/dist/delivery.d.ts.map +1 -0
- package/dist/delivery.js +39 -0
- package/dist/delivery.js.map +1 -0
- package/dist/evidence.d.ts +23 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +214 -0
- package/dist/evidence.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +6 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +107 -0
- package/dist/mcp.js.map +1 -0
- package/dist/openai.d.ts +19 -0
- package/dist/openai.d.ts.map +1 -0
- package/dist/openai.js +208 -0
- package/dist/openai.js.map +1 -0
- package/dist/receipt.d.ts +12 -0
- package/dist/receipt.d.ts.map +1 -0
- package/dist/receipt.js +60 -0
- package/dist/receipt.js.map +1 -0
- package/dist/types.d.ts +169 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/examples/chat-completions.ts +40 -0
- package/examples/external-payload-ref.ts +54 -0
- package/examples/mcp-tool-call.ts +38 -0
- package/examples/openai-responses.ts +39 -0
- package/examples/receipt-pending-retry.ts +48 -0
- package/package.json +41 -0
- package/snippets/agent-integration-brief.md +18 -0
- package/snippets/env-template.md +18 -0
- package/snippets/receipt-pending-runbook.md +18 -0
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Exochain Foundation
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at:
|
|
7
|
+
*
|
|
8
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
*/
|
|
12
|
+
import { buildLlmUsageReceiptIntent, hashProviderPayload, LynkConfigurationError, LynkValidationError, maybeStoreExternalPayloads, } from "./evidence.js";
|
|
13
|
+
import { releaseWithReceipt } from "./delivery.js";
|
|
14
|
+
import { emitUsageReceipt, resolveFetch } from "./receipt.js";
|
|
15
|
+
export function createReceiptedMcpProxy(config, mcp) {
|
|
16
|
+
if (!mcp.serverUrl || mcp.serverUrl.trim() === "") {
|
|
17
|
+
throw new LynkConfigurationError("MCP LYNK proxy requires serverUrl");
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
callTool: (call, options) => callMcpTool(config, mcp.serverUrl, call, options),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async function callMcpTool(config, serverUrl, call, options) {
|
|
24
|
+
if (!call.name || call.name.trim() === "") {
|
|
25
|
+
throw new LynkValidationError("MCP tools/call requires a tool name");
|
|
26
|
+
}
|
|
27
|
+
const requestPayload = {
|
|
28
|
+
jsonrpc: "2.0",
|
|
29
|
+
id: options.idempotencyKey,
|
|
30
|
+
method: "tools/call",
|
|
31
|
+
params: {
|
|
32
|
+
name: call.name,
|
|
33
|
+
arguments: call.arguments ?? {},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
const response = await resolveFetch(config.fetch)(serverUrl, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: {
|
|
39
|
+
"content-type": "application/json",
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify(requestPayload),
|
|
42
|
+
});
|
|
43
|
+
const responsePayload = (await response.json());
|
|
44
|
+
if (!response.ok || (isRecord(responsePayload) && responsePayload.error !== undefined)) {
|
|
45
|
+
return emitMcpFailureReceipt(config, call, requestPayload, response.status, options);
|
|
46
|
+
}
|
|
47
|
+
if (!isValidMcpToolResult(responsePayload)) {
|
|
48
|
+
throw new LynkValidationError("MCP tools/call response was malformed or untrusted");
|
|
49
|
+
}
|
|
50
|
+
const encryptedPayloadRefs = await maybeStoreExternalPayloads(config, [
|
|
51
|
+
{ payloadKind: "mcp_tool_call", payload: requestPayload },
|
|
52
|
+
{ payloadKind: "mcp_tool_result", payload: responsePayload },
|
|
53
|
+
]);
|
|
54
|
+
const context = mcpUsageContext(call, requestPayload, responsePayload, zeroUsage(true), options, encryptedPayloadRefs);
|
|
55
|
+
const receiptIntent = await buildLlmUsageReceiptIntent(config, context);
|
|
56
|
+
return releaseWithReceipt(config, receiptIntent, responsePayload);
|
|
57
|
+
}
|
|
58
|
+
async function emitMcpFailureReceipt(config, call, requestPayload, providerStatus, options) {
|
|
59
|
+
const context = mcpUsageContext(call, requestPayload, { provider_status: providerStatus }, zeroUsage(false), options, []);
|
|
60
|
+
const receiptIntent = await buildLlmUsageReceiptIntent(config, context);
|
|
61
|
+
const receipt = await emitUsageReceipt(config, receiptIntent).catch(() => undefined);
|
|
62
|
+
return {
|
|
63
|
+
status: "provider_error",
|
|
64
|
+
providerStatus,
|
|
65
|
+
receipt,
|
|
66
|
+
receiptIntent,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function mcpUsageContext(call, requestPayload, responsePayload, usage, options, encryptedPayloadRefs) {
|
|
70
|
+
return {
|
|
71
|
+
provider: "mcp",
|
|
72
|
+
providerEndpoint: "tools/call",
|
|
73
|
+
modelId: call.name,
|
|
74
|
+
requestPayload,
|
|
75
|
+
responsePayload,
|
|
76
|
+
toolCallPayload: requestPayload,
|
|
77
|
+
toolResultPayload: responsePayload,
|
|
78
|
+
idempotencyKey: options.idempotencyKey,
|
|
79
|
+
actionId: options.actionId ?? hashProviderPayload(["mcp", call.name, options.idempotencyKey]),
|
|
80
|
+
usage,
|
|
81
|
+
createdAt: options.createdAt,
|
|
82
|
+
issuedAt: options.issuedAt ?? options.createdAt,
|
|
83
|
+
encryptedPayloadRefs,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function isValidMcpToolResult(payload) {
|
|
87
|
+
if (!isRecord(payload)) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (payload.jsonrpc !== undefined && payload.jsonrpc !== "2.0") {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const result = payload.result;
|
|
94
|
+
return isRecord(result) && (Array.isArray(result.content) || result.structuredContent !== undefined);
|
|
95
|
+
}
|
|
96
|
+
function isRecord(value) {
|
|
97
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
98
|
+
}
|
|
99
|
+
function zeroUsage(usageComplete) {
|
|
100
|
+
return {
|
|
101
|
+
input_tokens: 0,
|
|
102
|
+
output_tokens: 0,
|
|
103
|
+
total_tokens: 0,
|
|
104
|
+
usage_complete: usageComplete,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/openai.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LlmProxyConfig, OpenAIProxyOptions, PerCallReceiptOptions, ProviderUsageMetrics, ReceiptedResult } from "./types.js";
|
|
2
|
+
type JsonRecord = Record<string, unknown>;
|
|
3
|
+
export interface ReceiptedOpenAIClient {
|
|
4
|
+
responses: {
|
|
5
|
+
create(body: JsonRecord, options: PerCallReceiptOptions): Promise<ReceiptedResult<unknown>>;
|
|
6
|
+
};
|
|
7
|
+
chat: {
|
|
8
|
+
completions: {
|
|
9
|
+
create(body: JsonRecord, options: PerCallReceiptOptions): Promise<ReceiptedResult<unknown>>;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export declare function createReceiptedOpenAIClient(config: LlmProxyConfig, openAI: OpenAIProxyOptions): ReceiptedOpenAIClient;
|
|
14
|
+
export declare function createReceiptedOpenAIProxy(config: LlmProxyConfig, openAI: OpenAIProxyOptions): ReceiptedOpenAIClient;
|
|
15
|
+
export declare function parseSseStream(text: string): JsonRecord;
|
|
16
|
+
export declare function usageFromResponses(payload: unknown): ProviderUsageMetrics;
|
|
17
|
+
export declare function usageFromChatCompletions(payload: unknown): ProviderUsageMetrics;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EAErB,oBAAoB,EACpB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAGpB,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE;QACT,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;KAC7F,CAAC;IACF,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;SAC7F,CAAC;KACH,CAAC;CACH;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,kBAAkB,GACzB,qBAAqB,CAqBvB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,kBAAkB,GACzB,qBAAqB,CAEvB;AAqED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAwBvD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,oBAAoB,CAqBzE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,oBAAoB,CAwB/E"}
|
package/dist/openai.js
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Exochain Foundation
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at:
|
|
7
|
+
*
|
|
8
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
*/
|
|
12
|
+
import { buildLlmUsageReceiptIntent, maybeStoreExternalPayloads } from "./evidence.js";
|
|
13
|
+
import { releaseWithReceipt } from "./delivery.js";
|
|
14
|
+
import { emitUsageReceipt } from "./receipt.js";
|
|
15
|
+
import { hashProviderPayload, LynkValidationError } from "./evidence.js";
|
|
16
|
+
import { resolveFetch } from "./receipt.js";
|
|
17
|
+
export function createReceiptedOpenAIClient(config, openAI) {
|
|
18
|
+
assertProductionDevelopmentFlag(config);
|
|
19
|
+
return {
|
|
20
|
+
responses: {
|
|
21
|
+
create: (body, options) => callOpenAIEndpoint(config, openAI, "responses", "/v1/responses", body, options),
|
|
22
|
+
},
|
|
23
|
+
chat: {
|
|
24
|
+
completions: {
|
|
25
|
+
create: (body, options) => callOpenAIEndpoint(config, openAI, "chat_completions", "/v1/chat/completions", body, options),
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function createReceiptedOpenAIProxy(config, openAI) {
|
|
31
|
+
return createReceiptedOpenAIClient(config, openAI);
|
|
32
|
+
}
|
|
33
|
+
async function callOpenAIEndpoint(config, openAI, endpointName, path, body, options) {
|
|
34
|
+
const fetchImpl = resolveFetch(config.fetch);
|
|
35
|
+
const response = await fetchImpl(`${openAI.openAIBaseUrl.replace(/\/+$/, "")}${path}`, {
|
|
36
|
+
method: "POST",
|
|
37
|
+
headers: openAI.apiKey
|
|
38
|
+
? {
|
|
39
|
+
"content-type": "application/json",
|
|
40
|
+
authorization: `Bearer ${openAI.apiKey}`,
|
|
41
|
+
}
|
|
42
|
+
: {
|
|
43
|
+
"content-type": "application/json",
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
return emitProviderFailureReceipt(config, endpointName, body, response.status, options);
|
|
49
|
+
}
|
|
50
|
+
const responsePayload = await parseOpenAIResponse(response, body);
|
|
51
|
+
const usage = endpointName === "responses"
|
|
52
|
+
? usageFromResponses(responsePayload)
|
|
53
|
+
: usageFromChatCompletions(responsePayload);
|
|
54
|
+
if (config.requireCompleteUsage === true && usage.usage_complete !== true) {
|
|
55
|
+
throw new LynkValidationError("OpenAI endpoint policy requires complete usage fields");
|
|
56
|
+
}
|
|
57
|
+
const encryptedPayloadRefs = await maybeStoreExternalPayloads(config, [
|
|
58
|
+
{ payloadKind: "openai_request", payload: body },
|
|
59
|
+
{ payloadKind: "openai_response", payload: responsePayload },
|
|
60
|
+
]);
|
|
61
|
+
const context = usageContext(endpointName, body, responsePayload, usage, options, encryptedPayloadRefs);
|
|
62
|
+
const receiptIntent = await buildLlmUsageReceiptIntent(config, context);
|
|
63
|
+
return releaseWithReceipt(config, receiptIntent, responsePayload);
|
|
64
|
+
}
|
|
65
|
+
async function emitProviderFailureReceipt(config, endpointName, body, providerStatus, options) {
|
|
66
|
+
const context = usageContext(endpointName, body, { provider_status: providerStatus }, zeroUsage(false), options, []);
|
|
67
|
+
const receiptIntent = await buildLlmUsageReceiptIntent(config, context);
|
|
68
|
+
const receipt = await emitUsageReceipt(config, receiptIntent).catch(() => undefined);
|
|
69
|
+
return {
|
|
70
|
+
status: "provider_error",
|
|
71
|
+
providerStatus,
|
|
72
|
+
receipt,
|
|
73
|
+
receiptIntent,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function parseOpenAIResponse(response, requestBody) {
|
|
77
|
+
if (requestBody.stream === true) {
|
|
78
|
+
const text = await response.text();
|
|
79
|
+
return parseSseStream(text);
|
|
80
|
+
}
|
|
81
|
+
return response.json();
|
|
82
|
+
}
|
|
83
|
+
export function parseSseStream(text) {
|
|
84
|
+
const events = [];
|
|
85
|
+
let finalUsage;
|
|
86
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
87
|
+
const line = rawLine.trim();
|
|
88
|
+
if (!line.startsWith("data:")) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const data = line.slice("data:".length).trim();
|
|
92
|
+
if (data === "[DONE]") {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const parsed = JSON.parse(data);
|
|
96
|
+
events.push(parsed);
|
|
97
|
+
if (isRecord(parsed.usage)) {
|
|
98
|
+
finalUsage = parsed.usage;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
object: "openai_stream",
|
|
103
|
+
events,
|
|
104
|
+
usage: finalUsage,
|
|
105
|
+
usage_complete: finalUsage !== undefined,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export function usageFromResponses(payload) {
|
|
109
|
+
if (!isRecord(payload)) {
|
|
110
|
+
return zeroUsage(false);
|
|
111
|
+
}
|
|
112
|
+
if (payload.object === "openai_stream") {
|
|
113
|
+
return usageFromResponses(payload.usage);
|
|
114
|
+
}
|
|
115
|
+
const usage = isRecord(payload.usage) ? payload.usage : payload;
|
|
116
|
+
const inputTokens = integerField(usage, "input_tokens", 0);
|
|
117
|
+
const outputTokens = integerField(usage, "output_tokens", 0);
|
|
118
|
+
const totalTokens = integerField(usage, "total_tokens", inputTokens + outputTokens);
|
|
119
|
+
const inputDetails = isRecord(usage.input_tokens_details) ? usage.input_tokens_details : {};
|
|
120
|
+
const outputDetails = isRecord(usage.output_tokens_details) ? usage.output_tokens_details : {};
|
|
121
|
+
return {
|
|
122
|
+
input_tokens: inputTokens,
|
|
123
|
+
output_tokens: outputTokens,
|
|
124
|
+
total_tokens: totalTokens,
|
|
125
|
+
cached_input_tokens: optionalIntegerField(inputDetails, "cached_tokens"),
|
|
126
|
+
reasoning_tokens: optionalIntegerField(outputDetails, "reasoning_tokens"),
|
|
127
|
+
usage_complete: inputTokens + outputTokens > 0 || totalTokens > 0,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export function usageFromChatCompletions(payload) {
|
|
131
|
+
if (!isRecord(payload)) {
|
|
132
|
+
return zeroUsage(false);
|
|
133
|
+
}
|
|
134
|
+
if (payload.object === "openai_stream") {
|
|
135
|
+
if (payload.usage_complete !== true) {
|
|
136
|
+
return zeroUsage(false);
|
|
137
|
+
}
|
|
138
|
+
return usageFromChatCompletions(payload.usage);
|
|
139
|
+
}
|
|
140
|
+
const usage = isRecord(payload.usage) ? payload.usage : payload;
|
|
141
|
+
const inputTokens = integerField(usage, "prompt_tokens", 0);
|
|
142
|
+
const outputTokens = integerField(usage, "completion_tokens", 0);
|
|
143
|
+
const totalTokens = integerField(usage, "total_tokens", inputTokens + outputTokens);
|
|
144
|
+
const inputDetails = isRecord(usage.prompt_tokens_details) ? usage.prompt_tokens_details : {};
|
|
145
|
+
const outputDetails = isRecord(usage.completion_tokens_details) ? usage.completion_tokens_details : {};
|
|
146
|
+
return {
|
|
147
|
+
input_tokens: inputTokens,
|
|
148
|
+
output_tokens: outputTokens,
|
|
149
|
+
total_tokens: totalTokens,
|
|
150
|
+
cached_input_tokens: optionalIntegerField(inputDetails, "cached_tokens"),
|
|
151
|
+
reasoning_tokens: optionalIntegerField(outputDetails, "reasoning_tokens"),
|
|
152
|
+
usage_complete: inputTokens + outputTokens > 0 || totalTokens > 0,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function usageContext(endpointName, requestPayload, responsePayload, usage, options, encryptedPayloadRefs) {
|
|
156
|
+
return {
|
|
157
|
+
provider: "openai",
|
|
158
|
+
providerEndpoint: endpointName,
|
|
159
|
+
modelId: typeof requestPayload.model === "string" ? requestPayload.model : "unknown",
|
|
160
|
+
requestPayload,
|
|
161
|
+
responsePayload,
|
|
162
|
+
providerRequestId: isRecord(responsePayload) && typeof responsePayload.id === "string" ? responsePayload.id : undefined,
|
|
163
|
+
sessionId: options.sessionId,
|
|
164
|
+
idempotencyKey: options.idempotencyKey,
|
|
165
|
+
actionId: options.actionId ?? hashProviderPayload(["openai", endpointName, options.idempotencyKey]),
|
|
166
|
+
usage,
|
|
167
|
+
createdAt: options.createdAt,
|
|
168
|
+
issuedAt: options.issuedAt ?? options.createdAt,
|
|
169
|
+
encryptedPayloadRefs,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function zeroUsage(usageComplete) {
|
|
173
|
+
return {
|
|
174
|
+
input_tokens: 0,
|
|
175
|
+
output_tokens: 0,
|
|
176
|
+
total_tokens: 0,
|
|
177
|
+
usage_complete: usageComplete,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function isRecord(value) {
|
|
181
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
182
|
+
}
|
|
183
|
+
function integerField(record, name, fallback) {
|
|
184
|
+
const value = record[name];
|
|
185
|
+
if (value === undefined) {
|
|
186
|
+
return fallback;
|
|
187
|
+
}
|
|
188
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
|
|
189
|
+
throw new LynkValidationError(`OpenAI usage field ${name} must be a non-negative integer`);
|
|
190
|
+
}
|
|
191
|
+
return value;
|
|
192
|
+
}
|
|
193
|
+
function optionalIntegerField(record, name) {
|
|
194
|
+
const value = record[name];
|
|
195
|
+
if (value === undefined || value === null) {
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
|
|
199
|
+
throw new LynkValidationError(`OpenAI usage field ${name} must be a non-negative integer`);
|
|
200
|
+
}
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
function assertProductionDevelopmentFlag(config) {
|
|
204
|
+
if (config.mode === "production" && config.allowUnreceiptedOutputForDevelopment === true) {
|
|
205
|
+
throw new LynkValidationError("allowUnreceiptedOutputForDevelopment is forbidden in production");
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FetchLike, LlmProxyConfig, ReceiptEmissionResult, ReceiptIntent, ReceiptPending } from "./types.js";
|
|
2
|
+
export declare class ReceiptEmissionError extends Error {
|
|
3
|
+
readonly statusCode?: number;
|
|
4
|
+
readonly idempotencyKeyHash: string;
|
|
5
|
+
readonly receiptIntent: ReceiptIntent;
|
|
6
|
+
constructor(message: string, idempotencyKeyHash: string, receiptIntent: ReceiptIntent, statusCode?: number);
|
|
7
|
+
}
|
|
8
|
+
export declare function receiptPendingFromError(error: ReceiptEmissionError): ReceiptPending;
|
|
9
|
+
export declare function emitUsageReceipt(config: LlmProxyConfig, receiptIntent: ReceiptIntent): Promise<ReceiptEmissionResult>;
|
|
10
|
+
export declare function resolveReceiptPending(config: LlmProxyConfig, pending: ReceiptPending): Promise<ReceiptEmissionResult>;
|
|
11
|
+
export declare function resolveFetch(fetchImpl?: FetchLike): FetchLike;
|
|
12
|
+
//# sourceMappingURL=receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../src/receipt.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;gBAE1B,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM;CAO3G;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc,CAMnF;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,qBAAqB,CAAC,CAoBhC;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,qBAAqB,CAAC,CAEhC;AAED,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAQ7D"}
|
package/dist/receipt.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Exochain Foundation
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at:
|
|
7
|
+
*
|
|
8
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
*/
|
|
12
|
+
import { assertNoForbiddenReceiptMaterial, LynkConfigurationError } from "./evidence.js";
|
|
13
|
+
export class ReceiptEmissionError extends Error {
|
|
14
|
+
statusCode;
|
|
15
|
+
idempotencyKeyHash;
|
|
16
|
+
receiptIntent;
|
|
17
|
+
constructor(message, idempotencyKeyHash, receiptIntent, statusCode) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "ReceiptEmissionError";
|
|
20
|
+
this.statusCode = statusCode;
|
|
21
|
+
this.idempotencyKeyHash = idempotencyKeyHash;
|
|
22
|
+
this.receiptIntent = receiptIntent;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function receiptPendingFromError(error) {
|
|
26
|
+
return {
|
|
27
|
+
status: "receipt_pending",
|
|
28
|
+
idempotencyKeyHash: error.idempotencyKeyHash,
|
|
29
|
+
receiptIntent: error.receiptIntent,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function emitUsageReceipt(config, receiptIntent) {
|
|
33
|
+
assertNoForbiddenReceiptMaterial(receiptIntent);
|
|
34
|
+
const fetchImpl = resolveFetch(config.fetch);
|
|
35
|
+
const endpoint = `${config.gatewayUrl.replace(/\/+$/, "")}/api/v1/avc/llm-usage/receipts/emit`;
|
|
36
|
+
const response = await fetchImpl(endpoint, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: {
|
|
39
|
+
"content-type": "application/json",
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify(receiptIntent),
|
|
42
|
+
});
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
throw new ReceiptEmissionError("EXOCHAIN LYNK receipt emission failed", receiptIntent.llm_usage_evidence.evidence.idempotency_key_hash, receiptIntent, response.status);
|
|
45
|
+
}
|
|
46
|
+
return (await response.json());
|
|
47
|
+
}
|
|
48
|
+
export async function resolveReceiptPending(config, pending) {
|
|
49
|
+
return emitUsageReceipt(config, pending.receiptIntent);
|
|
50
|
+
}
|
|
51
|
+
export function resolveFetch(fetchImpl) {
|
|
52
|
+
if (fetchImpl) {
|
|
53
|
+
return fetchImpl;
|
|
54
|
+
}
|
|
55
|
+
if (globalThis.fetch) {
|
|
56
|
+
return globalThis.fetch.bind(globalThis);
|
|
57
|
+
}
|
|
58
|
+
throw new LynkConfigurationError("LYNK proxy requires fetch");
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../src/receipt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AASzF,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,UAAU,CAAU;IACpB,kBAAkB,CAAS;IAC3B,aAAa,CAAgB;IAEtC,YAAY,OAAe,EAAE,kBAA0B,EAAE,aAA4B,EAAE,UAAmB;QACxG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA2B;IACjE,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,aAAa,EAAE,KAAK,CAAC,aAAa;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAsB,EACtB,aAA4B;IAE5B,gCAAgC,CAAC,aAAa,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,qCAAqC,CAAC;IAC/F,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;QACzC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,oBAAoB,CAC5B,uCAAuC,EACvC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB,EAC9D,aAAa,EACb,QAAQ,CAAC,MAAM,CAChB,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA0B,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAsB,EACtB,OAAuB;IAEvB,OAAO,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAqB;IAChD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAc,CAAC;IACxD,CAAC;IACD,MAAM,IAAI,sBAAsB,CAAC,2BAA2B,CAAC,CAAC;AAChE,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
export type FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
2
|
+
export interface HlcTimestamp {
|
|
3
|
+
physical_ms: number;
|
|
4
|
+
logical: number;
|
|
5
|
+
}
|
|
6
|
+
export type StorageMode = "receipt_minimized" | "external_payload_ref" | "dagdb_custody";
|
|
7
|
+
export interface ProviderUsageMetrics {
|
|
8
|
+
input_tokens: number;
|
|
9
|
+
output_tokens: number;
|
|
10
|
+
total_tokens: number;
|
|
11
|
+
cached_input_tokens?: number;
|
|
12
|
+
reasoning_tokens?: number;
|
|
13
|
+
cost_minor_units?: number;
|
|
14
|
+
cost_currency?: string;
|
|
15
|
+
usage_complete: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface EncryptedPayloadRef {
|
|
18
|
+
ref_id_hash: string;
|
|
19
|
+
ciphertext_hash: string;
|
|
20
|
+
storage_policy_hash: string;
|
|
21
|
+
key_policy_hash: string;
|
|
22
|
+
payload_kind: string;
|
|
23
|
+
byte_length: number;
|
|
24
|
+
}
|
|
25
|
+
export interface LlmUsageEvidence {
|
|
26
|
+
schema_version: number;
|
|
27
|
+
tenant_id: string;
|
|
28
|
+
namespace: string;
|
|
29
|
+
actor_did: string;
|
|
30
|
+
provider: string;
|
|
31
|
+
provider_endpoint: string;
|
|
32
|
+
model_id: string;
|
|
33
|
+
provider_request_id_hash?: string;
|
|
34
|
+
session_id_hash?: string;
|
|
35
|
+
idempotency_key_hash: string;
|
|
36
|
+
action_id: string;
|
|
37
|
+
prompt_hash: string;
|
|
38
|
+
completion_hash?: string;
|
|
39
|
+
tool_call_hash?: string;
|
|
40
|
+
tool_result_hash?: string;
|
|
41
|
+
usage: ProviderUsageMetrics;
|
|
42
|
+
custody_mode: StorageMode;
|
|
43
|
+
encrypted_payload_refs: EncryptedPayloadRef[];
|
|
44
|
+
custody_policy_hash: string;
|
|
45
|
+
created_at: HlcTimestamp;
|
|
46
|
+
}
|
|
47
|
+
export interface LlmUsageEvidenceEnvelope {
|
|
48
|
+
schema_version: number;
|
|
49
|
+
adapter_did: string;
|
|
50
|
+
issued_at: HlcTimestamp;
|
|
51
|
+
evidence: LlmUsageEvidence;
|
|
52
|
+
}
|
|
53
|
+
export interface ReceiptIntent {
|
|
54
|
+
validation: unknown;
|
|
55
|
+
subject_signature: string;
|
|
56
|
+
subject_public_key?: string;
|
|
57
|
+
llm_usage_evidence: LlmUsageEvidenceEnvelope;
|
|
58
|
+
adapter_signature: string;
|
|
59
|
+
adapter_public_key?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface ReceiptEmissionResult {
|
|
62
|
+
receipt_hash?: string;
|
|
63
|
+
receipt?: unknown;
|
|
64
|
+
validation?: unknown;
|
|
65
|
+
exochain_finality_hash?: string;
|
|
66
|
+
exochain_finality_height?: number;
|
|
67
|
+
exochain_finality_receipt_hash?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface ReceiptPending {
|
|
70
|
+
status: "receipt_pending";
|
|
71
|
+
idempotencyKeyHash: string;
|
|
72
|
+
receiptIntent: ReceiptIntent;
|
|
73
|
+
}
|
|
74
|
+
export interface ReceiptedSuccess<T> {
|
|
75
|
+
status: "receipted";
|
|
76
|
+
output: T;
|
|
77
|
+
receipt: ReceiptEmissionResult;
|
|
78
|
+
receiptIntent: ReceiptIntent;
|
|
79
|
+
}
|
|
80
|
+
export interface ProviderFailure {
|
|
81
|
+
status: "provider_error";
|
|
82
|
+
providerStatus: number;
|
|
83
|
+
receipt?: ReceiptEmissionResult;
|
|
84
|
+
receiptIntent: ReceiptIntent;
|
|
85
|
+
}
|
|
86
|
+
export interface ReceiptedDevelopmentBypass<T> {
|
|
87
|
+
status: "development_unreceipted";
|
|
88
|
+
output: T;
|
|
89
|
+
receiptPending: ReceiptPending;
|
|
90
|
+
}
|
|
91
|
+
export type ReceiptedResult<T> = ReceiptedSuccess<T> | ReceiptPending | ProviderFailure | ReceiptedDevelopmentBypass<T>;
|
|
92
|
+
export interface KmsEncryptRequest {
|
|
93
|
+
payload: Uint8Array;
|
|
94
|
+
payloadKind: string;
|
|
95
|
+
}
|
|
96
|
+
export interface KmsEncryptResult {
|
|
97
|
+
ciphertext: Uint8Array | string;
|
|
98
|
+
keyPolicyId: string;
|
|
99
|
+
}
|
|
100
|
+
export interface KmsLike {
|
|
101
|
+
encrypt(request: KmsEncryptRequest): Promise<KmsEncryptResult>;
|
|
102
|
+
}
|
|
103
|
+
export interface ObjectStorePutRequest {
|
|
104
|
+
payloadKind: string;
|
|
105
|
+
ciphertext: Uint8Array;
|
|
106
|
+
}
|
|
107
|
+
export interface ObjectStorePutResult {
|
|
108
|
+
refId: string;
|
|
109
|
+
storagePolicyId: string;
|
|
110
|
+
}
|
|
111
|
+
export interface ObjectStoreLike {
|
|
112
|
+
put(request: ObjectStorePutRequest): Promise<ObjectStorePutResult>;
|
|
113
|
+
}
|
|
114
|
+
export interface LlmProxyConfig {
|
|
115
|
+
mode: "production" | "development";
|
|
116
|
+
allowUnreceiptedOutputForDevelopment?: boolean;
|
|
117
|
+
gatewayUrl: string;
|
|
118
|
+
tenantId: string;
|
|
119
|
+
namespace: string;
|
|
120
|
+
actorDid: string;
|
|
121
|
+
adapterDid: string;
|
|
122
|
+
adapterPublicKey?: string;
|
|
123
|
+
subjectPublicKey?: string;
|
|
124
|
+
custodyPolicyHash: string;
|
|
125
|
+
storageMode: StorageMode;
|
|
126
|
+
requireCompleteUsage?: boolean;
|
|
127
|
+
validation: unknown;
|
|
128
|
+
subjectSignature: string;
|
|
129
|
+
adapterSignature: string | ((envelope: LlmUsageEvidenceEnvelope) => Promise<string> | string);
|
|
130
|
+
fetch?: FetchLike;
|
|
131
|
+
objectStore?: ObjectStoreLike;
|
|
132
|
+
kms?: KmsLike;
|
|
133
|
+
}
|
|
134
|
+
export interface UsageContext {
|
|
135
|
+
provider: string;
|
|
136
|
+
providerEndpoint: string;
|
|
137
|
+
modelId: string;
|
|
138
|
+
requestPayload: unknown;
|
|
139
|
+
responsePayload?: unknown;
|
|
140
|
+
toolCallPayload?: unknown;
|
|
141
|
+
toolResultPayload?: unknown;
|
|
142
|
+
providerRequestId?: string;
|
|
143
|
+
sessionId?: string;
|
|
144
|
+
idempotencyKey: string;
|
|
145
|
+
actionId?: string;
|
|
146
|
+
usage: ProviderUsageMetrics;
|
|
147
|
+
createdAt: HlcTimestamp;
|
|
148
|
+
issuedAt: HlcTimestamp;
|
|
149
|
+
encryptedPayloadRefs?: EncryptedPayloadRef[];
|
|
150
|
+
}
|
|
151
|
+
export interface OpenAIProxyOptions {
|
|
152
|
+
openAIBaseUrl: string;
|
|
153
|
+
apiKey?: string;
|
|
154
|
+
}
|
|
155
|
+
export interface PerCallReceiptOptions {
|
|
156
|
+
idempotencyKey: string;
|
|
157
|
+
actionId?: string;
|
|
158
|
+
createdAt: HlcTimestamp;
|
|
159
|
+
issuedAt?: HlcTimestamp;
|
|
160
|
+
sessionId?: string;
|
|
161
|
+
}
|
|
162
|
+
export interface McpProxyOptions {
|
|
163
|
+
serverUrl?: string;
|
|
164
|
+
}
|
|
165
|
+
export interface McpToolCall {
|
|
166
|
+
name: string;
|
|
167
|
+
arguments?: unknown;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Exochain Foundation
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at:
|
|
7
|
+
*
|
|
8
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|