@paid-ai/paid-node 0.0.6 → 0.0.8-alpha0
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 +95 -11
- package/dist/cjs/Client.d.ts +3 -1
- package/dist/cjs/Client.js +25 -2
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -3
- package/dist/cjs/tracing/index.d.ts +1 -0
- package/dist/cjs/tracing/index.js +17 -0
- package/dist/cjs/tracing/tracing.d.ts +4 -0
- package/dist/cjs/tracing/tracing.js +79 -0
- package/dist/cjs/tracing/wrappers/openAiWrapper.d.ts +48 -0
- package/dist/cjs/tracing/wrappers/openAiWrapper.js +252 -0
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/wrapper/BatchUsage.d.ts +8 -0
- package/dist/cjs/wrapper/BatchUsage.js +60 -0
- package/dist/esm/Client.d.mts +3 -1
- package/dist/esm/Client.mjs +24 -1
- package/dist/esm/index.d.mts +3 -1
- package/dist/esm/index.mjs +3 -1
- package/dist/esm/tracing/index.d.mts +1 -0
- package/dist/esm/tracing/index.mjs +1 -0
- package/dist/esm/tracing/tracing.d.mts +4 -0
- package/dist/esm/tracing/tracing.mjs +72 -0
- package/dist/esm/tracing/wrappers/openAiWrapper.d.mts +48 -0
- package/dist/esm/tracing/wrappers/openAiWrapper.mjs +248 -0
- package/dist/esm/version.d.mts +1 -1
- package/dist/esm/version.mjs +1 -1
- package/dist/esm/wrapper/BatchUsage.d.mts +8 -0
- package/dist/esm/wrapper/BatchUsage.mjs +23 -0
- package/package.json +16 -12
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as core from "../core/index.js";
|
|
2
|
+
import { Usage as UsageClient } from "../api/resources/usage/client/Client";
|
|
3
|
+
import * as Paid from "../api/types/Signal.js";
|
|
4
|
+
export declare class Usage extends UsageClient {
|
|
5
|
+
private signals;
|
|
6
|
+
flush(requestOptions?: UsageClient.RequestOptions): core.HttpResponsePromise<unknown[]>;
|
|
7
|
+
record(signal?: Paid.Signal, requestOptions?: UsageClient.RequestOptions): core.HttpResponsePromise<unknown[]>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Usage = void 0;
|
|
37
|
+
const core = __importStar(require("../core/index.js"));
|
|
38
|
+
const Client_1 = require("../api/resources/usage/client/Client");
|
|
39
|
+
class Usage extends Client_1.Usage {
|
|
40
|
+
constructor() {
|
|
41
|
+
super(...arguments);
|
|
42
|
+
this.signals = [];
|
|
43
|
+
}
|
|
44
|
+
flush(requestOptions) {
|
|
45
|
+
return this.recordBulk({ signals: this.signals }, requestOptions);
|
|
46
|
+
}
|
|
47
|
+
record(signal = {}, requestOptions) {
|
|
48
|
+
if (!this.signals) {
|
|
49
|
+
this.signals = [];
|
|
50
|
+
}
|
|
51
|
+
this.signals.push(signal);
|
|
52
|
+
if (this.signals.length >= 100) {
|
|
53
|
+
const response = this.recordBulk({ signals: this.signals }, requestOptions);
|
|
54
|
+
this.signals = [];
|
|
55
|
+
return response;
|
|
56
|
+
}
|
|
57
|
+
return core.HttpResponsePromise.fromResult({ data: [], rawResponse: {} });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.Usage = Usage;
|
package/dist/esm/Client.d.mts
CHANGED
|
@@ -7,7 +7,7 @@ import { Customers } from "./api/resources/customers/client/Client.mjs";
|
|
|
7
7
|
import { Agents } from "./api/resources/agents/client/Client.mjs";
|
|
8
8
|
import { Contacts } from "./api/resources/contacts/client/Client.mjs";
|
|
9
9
|
import { Orders } from "./api/resources/orders/client/Client.mjs";
|
|
10
|
-
import { Usage } from "./
|
|
10
|
+
import { Usage } from "./wrapper/BatchUsage.mjs";
|
|
11
11
|
export declare namespace PaidClient {
|
|
12
12
|
interface Options {
|
|
13
13
|
environment?: core.Supplier<environments.PaidEnvironment | string>;
|
|
@@ -41,4 +41,6 @@ export declare class PaidClient {
|
|
|
41
41
|
get contacts(): Contacts;
|
|
42
42
|
get orders(): Orders;
|
|
43
43
|
get usage(): Usage;
|
|
44
|
+
initializeTracing(): Promise<void>;
|
|
45
|
+
capture<T extends (...args: any[]) => any>(externalCustomerId: string, fn: T, ...args: Parameters<T>): Promise<ReturnType<T>>;
|
|
44
46
|
}
|
package/dist/esm/Client.mjs
CHANGED
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* This file was auto-generated by Fern from our API Definition.
|
|
3
3
|
*/
|
|
4
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
5
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
6
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
7
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
8
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
9
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
10
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
|
+
});
|
|
12
|
+
};
|
|
4
13
|
import * as core from "./core/index.mjs";
|
|
5
14
|
import { mergeHeaders } from "./core/headers.mjs";
|
|
6
15
|
import { Customers } from "./api/resources/customers/client/Client.mjs";
|
|
7
16
|
import { Agents } from "./api/resources/agents/client/Client.mjs";
|
|
8
17
|
import { Contacts } from "./api/resources/contacts/client/Client.mjs";
|
|
9
18
|
import { Orders } from "./api/resources/orders/client/Client.mjs";
|
|
10
|
-
import { Usage } from "./
|
|
19
|
+
import { Usage } from "./wrapper/BatchUsage.mjs";
|
|
20
|
+
import { capture, initializeTracing } from "./tracing/tracing.mjs";
|
|
11
21
|
export class PaidClient {
|
|
12
22
|
constructor(_options) {
|
|
13
23
|
this._options = Object.assign(Object.assign({}, _options), { headers: mergeHeaders({
|
|
@@ -39,4 +49,17 @@ export class PaidClient {
|
|
|
39
49
|
var _a;
|
|
40
50
|
return ((_a = this._usage) !== null && _a !== void 0 ? _a : (this._usage = new Usage(this._options)));
|
|
41
51
|
}
|
|
52
|
+
initializeTracing() {
|
|
53
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
54
|
+
const tokenSupplier = this._options.token;
|
|
55
|
+
const token = typeof tokenSupplier === "function" ? yield tokenSupplier() : tokenSupplier;
|
|
56
|
+
const resolvedToken = yield Promise.resolve(token);
|
|
57
|
+
initializeTracing(resolvedToken);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
capture(externalCustomerId, fn, ...args) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
return yield capture(externalCustomerId, fn, ...args);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
42
65
|
}
|
package/dist/esm/index.d.mts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export * as Paid from "./api/index.mjs";
|
|
2
2
|
export { PaidClient } from "./Client.mjs";
|
|
3
|
-
export { PaidEnvironment } from "./environments.mjs";
|
|
4
3
|
export { PaidError, PaidTimeoutError } from "./errors/index.mjs";
|
|
4
|
+
export { PaidEnvironment } from "./environments.mjs";
|
|
5
|
+
export { PaidOpenAI } from "./tracing/wrappers/openAiWrapper.mjs";
|
|
6
|
+
export { initializeTracing, capture } from "./tracing/tracing.mjs";
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export * as Paid from "./api/index.mjs";
|
|
2
2
|
export { PaidClient } from "./Client.mjs";
|
|
3
|
-
export { PaidEnvironment } from "./environments.mjs";
|
|
4
3
|
export { PaidError, PaidTimeoutError } from "./errors/index.mjs";
|
|
4
|
+
export { PaidEnvironment } from "./environments.mjs";
|
|
5
|
+
export { PaidOpenAI } from "./tracing/wrappers/openAiWrapper.mjs";
|
|
6
|
+
export { initializeTracing, capture } from "./tracing/tracing.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./wrappers/openAiWrapper";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./wrappers/openAiWrapper";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const getCustomerId: () => string | null | undefined;
|
|
2
|
+
export declare const getTokenStorage: () => string | null | undefined;
|
|
3
|
+
export declare function initializeTracing(apiKey: string): void;
|
|
4
|
+
export declare function capture<T extends (...args: any[]) => any>(externalCustomerId: string, fn: T, ...args: Parameters<T>): Promise<ReturnType<T>>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { NodeSDK } from '@opentelemetry/sdk-node';
|
|
11
|
+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
12
|
+
import { trace, SpanStatusCode } from "@opentelemetry/api";
|
|
13
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
14
|
+
const customerIdStorage = new AsyncLocalStorage();
|
|
15
|
+
const tokenStorage = new AsyncLocalStorage();
|
|
16
|
+
export const getCustomerId = () => customerIdStorage.getStore();
|
|
17
|
+
export const getTokenStorage = () => tokenStorage.getStore();
|
|
18
|
+
let _token;
|
|
19
|
+
const setToken = (token) => { _token = token; };
|
|
20
|
+
const getToken = () => { return _token; };
|
|
21
|
+
export function initializeTracing(apiKey) {
|
|
22
|
+
setToken(apiKey);
|
|
23
|
+
const sdk = new NodeSDK({
|
|
24
|
+
traceExporter: new OTLPTraceExporter({
|
|
25
|
+
url: 'https://collector.agentpaid.io:4318/v1/traces',
|
|
26
|
+
// url: 'http://localhost:4318/v1/traces',
|
|
27
|
+
}),
|
|
28
|
+
});
|
|
29
|
+
sdk.start();
|
|
30
|
+
// Graceful shutdown
|
|
31
|
+
['SIGINT', 'SIGTERM'].forEach(signal => {
|
|
32
|
+
process.on(signal, () => {
|
|
33
|
+
sdk.shutdown()
|
|
34
|
+
.then(() => console.log('Paid tracing SDK shut down'))
|
|
35
|
+
.catch(error => console.error('Error shutting down Paid tracing SDK', error));
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export function capture(externalCustomerId, fn, ...args) {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
const tracer = trace.getTracer('paid.node');
|
|
42
|
+
const token = getToken();
|
|
43
|
+
if (!token) {
|
|
44
|
+
console.warn('No token found - tracing will not be captured');
|
|
45
|
+
return fn(...args);
|
|
46
|
+
}
|
|
47
|
+
return tracer.startActiveSpan("paid.node", (span) => __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
span.setAttribute('external_customer_id', externalCustomerId);
|
|
49
|
+
span.setAttribute('token', token);
|
|
50
|
+
try {
|
|
51
|
+
const result = yield customerIdStorage.run(externalCustomerId, () => __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
return yield tokenStorage.run(token, () => __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
return yield fn(...args);
|
|
54
|
+
}));
|
|
55
|
+
}));
|
|
56
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
span.setStatus({
|
|
61
|
+
code: SpanStatusCode.ERROR,
|
|
62
|
+
message: error.message,
|
|
63
|
+
});
|
|
64
|
+
span.recordException(error);
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
span.end();
|
|
69
|
+
}
|
|
70
|
+
}));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import OpenAI from "openai";
|
|
2
|
+
import { Tracer } from "@opentelemetry/api";
|
|
3
|
+
import { ChatCompletion, ChatCompletionCreateParams } from "openai/resources/chat/completions";
|
|
4
|
+
import { EmbeddingCreateParams } from "openai/resources/embeddings";
|
|
5
|
+
import { ImagesResponse, ImageGenerateParams } from "openai/resources/images";
|
|
6
|
+
import { CreateEmbeddingResponse } from "openai/resources/embeddings";
|
|
7
|
+
export declare class PaidOpenAI {
|
|
8
|
+
private readonly openai;
|
|
9
|
+
private readonly tracer;
|
|
10
|
+
constructor(openaiClient: any);
|
|
11
|
+
get chat(): ChatWrapper;
|
|
12
|
+
get embeddings(): EmbeddingsWrapper;
|
|
13
|
+
get images(): ImagesWrapper;
|
|
14
|
+
get responses(): ResponsesWrapper;
|
|
15
|
+
}
|
|
16
|
+
declare class ChatWrapper {
|
|
17
|
+
private openai;
|
|
18
|
+
private tracer;
|
|
19
|
+
constructor(openai: OpenAI, tracer: Tracer);
|
|
20
|
+
get completions(): ChatCompletionsWrapper;
|
|
21
|
+
}
|
|
22
|
+
declare class ChatCompletionsWrapper {
|
|
23
|
+
private openai;
|
|
24
|
+
private tracer;
|
|
25
|
+
constructor(openai: OpenAI, tracer: Tracer);
|
|
26
|
+
create(params: ChatCompletionCreateParams): Promise<ChatCompletion>;
|
|
27
|
+
}
|
|
28
|
+
type ResponseCreateParams = any;
|
|
29
|
+
type Response = any;
|
|
30
|
+
declare class ResponsesWrapper {
|
|
31
|
+
private openai;
|
|
32
|
+
private tracer;
|
|
33
|
+
constructor(openai: any, tracer: Tracer);
|
|
34
|
+
create(params: ResponseCreateParams): Promise<Response>;
|
|
35
|
+
}
|
|
36
|
+
declare class EmbeddingsWrapper {
|
|
37
|
+
private openai;
|
|
38
|
+
private tracer;
|
|
39
|
+
constructor(openai: OpenAI, tracer: Tracer);
|
|
40
|
+
create(params: EmbeddingCreateParams): Promise<CreateEmbeddingResponse>;
|
|
41
|
+
}
|
|
42
|
+
declare class ImagesWrapper {
|
|
43
|
+
private openai;
|
|
44
|
+
private tracer;
|
|
45
|
+
constructor(openai: OpenAI, tracer: Tracer);
|
|
46
|
+
generate(params: ImageGenerateParams): Promise<ImagesResponse>;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { trace, SpanStatusCode, context } from "@opentelemetry/api";
|
|
11
|
+
import { getCustomerId, getTokenStorage } from "../tracing";
|
|
12
|
+
export class PaidOpenAI {
|
|
13
|
+
constructor(openaiClient) {
|
|
14
|
+
this.openai = openaiClient;
|
|
15
|
+
this.tracer = trace.getTracer("paid.node");
|
|
16
|
+
}
|
|
17
|
+
get chat() {
|
|
18
|
+
return new ChatWrapper(this.openai, this.tracer);
|
|
19
|
+
}
|
|
20
|
+
get embeddings() {
|
|
21
|
+
return new EmbeddingsWrapper(this.openai, this.tracer);
|
|
22
|
+
}
|
|
23
|
+
get images() {
|
|
24
|
+
return new ImagesWrapper(this.openai, this.tracer);
|
|
25
|
+
}
|
|
26
|
+
get responses() {
|
|
27
|
+
return new ResponsesWrapper(this.openai, this.tracer);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
class ChatWrapper {
|
|
31
|
+
constructor(openai, tracer) {
|
|
32
|
+
this.openai = openai;
|
|
33
|
+
this.tracer = tracer;
|
|
34
|
+
}
|
|
35
|
+
get completions() {
|
|
36
|
+
return new ChatCompletionsWrapper(this.openai, this.tracer);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
class ChatCompletionsWrapper {
|
|
40
|
+
constructor(openai, tracer) {
|
|
41
|
+
this.openai = openai;
|
|
42
|
+
this.tracer = tracer;
|
|
43
|
+
}
|
|
44
|
+
create(params) {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
const currentSpan = trace.getSpan(context.active());
|
|
47
|
+
if (!currentSpan) {
|
|
48
|
+
console.warn("No active span found, calling OpenAI directly without tracing.");
|
|
49
|
+
return this.openai.chat.completions.create(params);
|
|
50
|
+
}
|
|
51
|
+
const externalCustomerId = getCustomerId();
|
|
52
|
+
const token = getTokenStorage();
|
|
53
|
+
const model = params.model;
|
|
54
|
+
const spanName = `trace.chat ${model}`;
|
|
55
|
+
return this.tracer.startActiveSpan(spanName, (span) => __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
const attributes = {
|
|
57
|
+
"gen_ai.system": "openai",
|
|
58
|
+
"gen_ai.operation.name": "chat",
|
|
59
|
+
};
|
|
60
|
+
if (externalCustomerId) {
|
|
61
|
+
attributes["external_customer_id"] = externalCustomerId;
|
|
62
|
+
}
|
|
63
|
+
if (token) {
|
|
64
|
+
attributes["token"] = token;
|
|
65
|
+
}
|
|
66
|
+
span.setAttributes(attributes);
|
|
67
|
+
try {
|
|
68
|
+
const response = (yield this.openai.chat.completions.create(params));
|
|
69
|
+
if (response.usage) {
|
|
70
|
+
span.setAttributes({
|
|
71
|
+
"gen_ai.usage.input_tokens": response.usage.prompt_tokens,
|
|
72
|
+
"gen_ai.usage.output_tokens": response.usage.completion_tokens,
|
|
73
|
+
"gen_ai.response.model": response.model,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
77
|
+
return response;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
|
|
81
|
+
span.recordException(error);
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
span.end();
|
|
86
|
+
}
|
|
87
|
+
}));
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
class ResponsesWrapper {
|
|
92
|
+
constructor(openai, tracer) {
|
|
93
|
+
this.openai = openai;
|
|
94
|
+
this.tracer = tracer;
|
|
95
|
+
}
|
|
96
|
+
create(params) {
|
|
97
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
var _a;
|
|
99
|
+
const currentSpan = trace.getSpan(context.active());
|
|
100
|
+
if (!currentSpan) {
|
|
101
|
+
console.warn("No active span found, calling OpenAI directly without tracing.");
|
|
102
|
+
return this.openai.responses.create(params);
|
|
103
|
+
}
|
|
104
|
+
const externalCustomerId = getCustomerId();
|
|
105
|
+
const token = getTokenStorage();
|
|
106
|
+
const model = (_a = params.model) !== null && _a !== void 0 ? _a : "unknown";
|
|
107
|
+
const spanName = `trace.responses ${model}`;
|
|
108
|
+
return this.tracer.startActiveSpan(spanName, (span) => __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
const attributes = {
|
|
110
|
+
"gen_ai.system": "openai",
|
|
111
|
+
"gen_ai.operation.name": "chat", // Equivalent to chat.completions
|
|
112
|
+
};
|
|
113
|
+
if (externalCustomerId) {
|
|
114
|
+
attributes["external_customer_id"] = externalCustomerId;
|
|
115
|
+
}
|
|
116
|
+
if (token) {
|
|
117
|
+
attributes["token"] = token;
|
|
118
|
+
}
|
|
119
|
+
span.setAttributes(attributes);
|
|
120
|
+
try {
|
|
121
|
+
const response = yield this.openai.responses.create(params);
|
|
122
|
+
if (response.usage) {
|
|
123
|
+
span.setAttributes({
|
|
124
|
+
"gen_ai.usage.input_tokens": response.usage.prompt_tokens,
|
|
125
|
+
"gen_ai.usage.output_tokens": response.usage.completion_tokens,
|
|
126
|
+
"gen_ai.response.model": response.model,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
130
|
+
return response;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
|
|
134
|
+
span.recordException(error);
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
span.end();
|
|
139
|
+
}
|
|
140
|
+
}));
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
class EmbeddingsWrapper {
|
|
145
|
+
constructor(openai, tracer) {
|
|
146
|
+
this.openai = openai;
|
|
147
|
+
this.tracer = tracer;
|
|
148
|
+
}
|
|
149
|
+
create(params) {
|
|
150
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
+
var _a;
|
|
152
|
+
const currentSpan = trace.getSpan(context.active());
|
|
153
|
+
if (!currentSpan) {
|
|
154
|
+
console.warn("No active span found, calling OpenAI directly without tracing.");
|
|
155
|
+
return this.openai.embeddings.create(params);
|
|
156
|
+
}
|
|
157
|
+
const externalCustomerId = getCustomerId();
|
|
158
|
+
const token = getTokenStorage();
|
|
159
|
+
const model = (_a = params.model) !== null && _a !== void 0 ? _a : "unknown";
|
|
160
|
+
const spanName = `trace.embeddings ${model}`;
|
|
161
|
+
return this.tracer.startActiveSpan(spanName, (span) => __awaiter(this, void 0, void 0, function* () {
|
|
162
|
+
const attributes = {
|
|
163
|
+
"gen_ai.system": "openai",
|
|
164
|
+
"gen_ai.operation.name": "embeddings",
|
|
165
|
+
};
|
|
166
|
+
if (externalCustomerId) {
|
|
167
|
+
attributes["external_customer_id"] = externalCustomerId;
|
|
168
|
+
}
|
|
169
|
+
if (token) {
|
|
170
|
+
attributes["token"] = token;
|
|
171
|
+
}
|
|
172
|
+
span.setAttributes(attributes);
|
|
173
|
+
try {
|
|
174
|
+
const response = yield this.openai.embeddings.create(params);
|
|
175
|
+
if (response.usage) {
|
|
176
|
+
span.setAttributes({
|
|
177
|
+
"gen_ai.usage.input_tokens": response.usage.prompt_tokens,
|
|
178
|
+
"gen_ai.response.model": response.model,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
182
|
+
return response;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
|
|
186
|
+
span.recordException(error);
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
span.end();
|
|
191
|
+
}
|
|
192
|
+
}));
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
class ImagesWrapper {
|
|
197
|
+
constructor(openai, tracer) {
|
|
198
|
+
this.openai = openai;
|
|
199
|
+
this.tracer = tracer;
|
|
200
|
+
}
|
|
201
|
+
generate(params) {
|
|
202
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
203
|
+
var _a;
|
|
204
|
+
const currentSpan = trace.getSpan(context.active());
|
|
205
|
+
if (!currentSpan) {
|
|
206
|
+
console.warn("No active span found, calling OpenAI directly without tracing.");
|
|
207
|
+
return this.openai.images.generate(params);
|
|
208
|
+
}
|
|
209
|
+
const externalCustomerId = getCustomerId();
|
|
210
|
+
const token = getTokenStorage();
|
|
211
|
+
const model = (_a = params.model) !== null && _a !== void 0 ? _a : "dall-e-3";
|
|
212
|
+
const spanName = `trace.images ${model}`;
|
|
213
|
+
return this.tracer.startActiveSpan(spanName, (span) => __awaiter(this, void 0, void 0, function* () {
|
|
214
|
+
var _a, _b, _c;
|
|
215
|
+
const attributes = {
|
|
216
|
+
"gen_ai.request.model": model,
|
|
217
|
+
"gen_ai.system": "openai",
|
|
218
|
+
"gen_ai.operation.name": "image_generation",
|
|
219
|
+
};
|
|
220
|
+
if (externalCustomerId) {
|
|
221
|
+
attributes["external_customer_id"] = externalCustomerId;
|
|
222
|
+
}
|
|
223
|
+
if (token) {
|
|
224
|
+
attributes["token"] = token;
|
|
225
|
+
}
|
|
226
|
+
span.setAttributes(attributes);
|
|
227
|
+
try {
|
|
228
|
+
const response = yield this.openai.images.generate(params);
|
|
229
|
+
span.setAttributes({
|
|
230
|
+
"gen_ai.image.count": (_a = params.n) !== null && _a !== void 0 ? _a : 1,
|
|
231
|
+
"gen_ai.image.size": (_b = params.size) !== null && _b !== void 0 ? _b : "1024x1024",
|
|
232
|
+
"gen_ai.image.quality": (_c = params.quality) !== null && _c !== void 0 ? _c : "standard",
|
|
233
|
+
});
|
|
234
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
235
|
+
return response;
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
|
|
239
|
+
span.recordException(error);
|
|
240
|
+
throw error;
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
span.end();
|
|
244
|
+
}
|
|
245
|
+
}));
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
package/dist/esm/version.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "0.0.
|
|
1
|
+
export declare const SDK_VERSION = "0.0.8-alpha0";
|
package/dist/esm/version.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const SDK_VERSION = "0.0.
|
|
1
|
+
export const SDK_VERSION = "0.0.8-alpha0";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as core from "../core/index.mjs";
|
|
2
|
+
import { Usage as UsageClient } from "../api/resources/usage/client/Client";
|
|
3
|
+
import * as Paid from "../api/types/Signal.mjs";
|
|
4
|
+
export declare class Usage extends UsageClient {
|
|
5
|
+
private signals;
|
|
6
|
+
flush(requestOptions?: UsageClient.RequestOptions): core.HttpResponsePromise<unknown[]>;
|
|
7
|
+
record(signal?: Paid.Signal, requestOptions?: UsageClient.RequestOptions): core.HttpResponsePromise<unknown[]>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as core from "../core/index.mjs";
|
|
2
|
+
import { Usage as UsageClient } from "../api/resources/usage/client/Client";
|
|
3
|
+
export class Usage extends UsageClient {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
this.signals = [];
|
|
7
|
+
}
|
|
8
|
+
flush(requestOptions) {
|
|
9
|
+
return this.recordBulk({ signals: this.signals }, requestOptions);
|
|
10
|
+
}
|
|
11
|
+
record(signal = {}, requestOptions) {
|
|
12
|
+
if (!this.signals) {
|
|
13
|
+
this.signals = [];
|
|
14
|
+
}
|
|
15
|
+
this.signals.push(signal);
|
|
16
|
+
if (this.signals.length >= 100) {
|
|
17
|
+
const response = this.recordBulk({ signals: this.signals }, requestOptions);
|
|
18
|
+
this.signals = [];
|
|
19
|
+
return response;
|
|
20
|
+
}
|
|
21
|
+
return core.HttpResponsePromise.fromResult({ data: [], rawResponse: {} });
|
|
22
|
+
}
|
|
23
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paid-ai/paid-node",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8-alpha0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"repository": "https://github.com/AgentPaid/paid-node",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -36,30 +36,34 @@
|
|
|
36
36
|
"wire:test": "yarn test:wire"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"
|
|
39
|
+
"@opentelemetry/api": "^1.9.0",
|
|
40
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.202.0",
|
|
41
|
+
"@opentelemetry/sdk-node": "^0.202.0",
|
|
42
|
+
"openai": "^5.5.1",
|
|
40
43
|
"form-data": "^4.0.0",
|
|
41
44
|
"formdata-node": "^6.0.3",
|
|
45
|
+
"js-base64": "3.7.7",
|
|
42
46
|
"node-fetch": "^2.7.0",
|
|
43
47
|
"qs": "^6.13.1",
|
|
44
48
|
"readable-stream": "^4.5.2",
|
|
45
|
-
"
|
|
49
|
+
"url-join": "4.0.1"
|
|
46
50
|
},
|
|
47
51
|
"devDependencies": {
|
|
48
|
-
"@
|
|
49
|
-
"@types/
|
|
52
|
+
"@jest/globals": "^29.7.0",
|
|
53
|
+
"@types/jest": "^29.5.14",
|
|
54
|
+
"@types/node": "^18.19.70",
|
|
50
55
|
"@types/node-fetch": "^2.6.12",
|
|
56
|
+
"@types/qs": "^6.9.17",
|
|
51
57
|
"@types/readable-stream": "^4.0.18",
|
|
52
|
-
"
|
|
53
|
-
"ts-loader": "^9.5.1",
|
|
58
|
+
"@types/url-join": "4.0.1",
|
|
54
59
|
"jest": "^29.7.0",
|
|
55
|
-
"@jest/globals": "^29.7.0",
|
|
56
|
-
"@types/jest": "^29.5.14",
|
|
57
|
-
"ts-jest": "^29.3.4",
|
|
58
60
|
"jest-environment-jsdom": "^29.7.0",
|
|
59
61
|
"msw": "^2.8.4",
|
|
60
|
-
"@types/node": "^18.19.70",
|
|
61
62
|
"prettier": "^3.4.2",
|
|
62
|
-
"
|
|
63
|
+
"ts-jest": "^29.3.4",
|
|
64
|
+
"ts-loader": "^9.5.1",
|
|
65
|
+
"typescript": "~5.7.2",
|
|
66
|
+
"webpack": "^5.97.1"
|
|
63
67
|
},
|
|
64
68
|
"browser": {
|
|
65
69
|
"fs": false,
|