@carlonicora/nestjs-neo4jsonapi 1.116.0 → 1.117.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/guards/jwt.auth.admin.guard.d.ts +3 -2
- package/dist/common/guards/jwt.auth.admin.guard.d.ts.map +1 -1
- package/dist/common/guards/jwt.auth.admin.guard.js +19 -4
- package/dist/common/guards/jwt.auth.admin.guard.js.map +1 -1
- package/dist/common/tokens.d.ts +4 -0
- package/dist/common/tokens.d.ts.map +1 -1
- package/dist/config/base.config.d.ts.map +1 -1
- package/dist/config/base.config.js +8 -0
- package/dist/config/base.config.js.map +1 -1
- package/dist/config/interfaces/base.config.interface.d.ts +2 -0
- package/dist/config/interfaces/base.config.interface.d.ts.map +1 -1
- package/dist/config/interfaces/config.ai.interface.d.ts +8 -0
- package/dist/config/interfaces/config.ai.interface.d.ts.map +1 -1
- package/dist/config/interfaces/config.credits.interface.d.ts +24 -0
- package/dist/config/interfaces/config.credits.interface.d.ts.map +1 -0
- package/dist/config/interfaces/config.credits.interface.js +3 -0
- package/dist/config/interfaces/config.credits.interface.js.map +1 -0
- package/dist/config/interfaces/index.d.ts +1 -0
- package/dist/config/interfaces/index.d.ts.map +1 -1
- package/dist/config/interfaces/index.js +1 -0
- package/dist/config/interfaces/index.js.map +1 -1
- package/dist/core/llm/services/embedder.service.d.ts +36 -2
- package/dist/core/llm/services/embedder.service.d.ts.map +1 -1
- package/dist/core/llm/services/embedder.service.js +87 -7
- package/dist/core/llm/services/embedder.service.js.map +1 -1
- package/dist/foundations/company/dtos/company.post.dto.d.ts +3 -3
- package/dist/foundations/company/dtos/company.post.dto.d.ts.map +1 -1
- package/dist/foundations/company/dtos/company.post.dto.js +3 -3
- package/dist/foundations/company/dtos/company.post.dto.js.map +1 -1
- package/dist/foundations/company/dtos/company.put.dto.d.ts +3 -3
- package/dist/foundations/company/dtos/company.put.dto.d.ts.map +1 -1
- package/dist/foundations/company/dtos/company.put.dto.js +3 -3
- package/dist/foundations/company/dtos/company.put.dto.js.map +1 -1
- package/dist/foundations/company/entities/company.d.ts +3 -3
- package/dist/foundations/company/entities/company.d.ts.map +1 -1
- package/dist/foundations/company/entities/company.js +3 -3
- package/dist/foundations/company/entities/company.js.map +1 -1
- package/dist/foundations/company/repositories/company.repository.d.ts +31 -24
- package/dist/foundations/company/repositories/company.repository.d.ts.map +1 -1
- package/dist/foundations/company/repositories/company.repository.js +66 -77
- package/dist/foundations/company/repositories/company.repository.js.map +1 -1
- package/dist/foundations/company/services/company.service.d.ts +8 -9
- package/dist/foundations/company/services/company.service.d.ts.map +1 -1
- package/dist/foundations/company/services/company.service.js +29 -32
- package/dist/foundations/company/services/company.service.js.map +1 -1
- package/dist/foundations/referral/services/referral.service.js +4 -4
- package/dist/foundations/referral/services/referral.service.js.map +1 -1
- package/dist/foundations/stripe-subscription/services/token-allocation.service.d.ts +1 -1
- package/dist/foundations/stripe-subscription/services/token-allocation.service.js +10 -10
- package/dist/foundations/stripe-subscription/services/token-allocation.service.js.map +1 -1
- package/dist/foundations/stripe-trial/services/trial.service.js +2 -2
- package/dist/foundations/stripe-trial/services/trial.service.js.map +1 -1
- package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.js +2 -2
- package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.js.map +1 -1
- package/dist/foundations/tokenusage/entities/tokenusage.d.ts +1 -0
- package/dist/foundations/tokenusage/entities/tokenusage.d.ts.map +1 -1
- package/dist/foundations/tokenusage/entities/tokenusage.js +4 -0
- package/dist/foundations/tokenusage/entities/tokenusage.js.map +1 -1
- package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts +2 -1
- package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts.map +1 -1
- package/dist/foundations/tokenusage/enums/tokenusage.type.js +1 -0
- package/dist/foundations/tokenusage/enums/tokenusage.type.js.map +1 -1
- package/dist/foundations/tokenusage/events/tokenusage.events.d.ts +2 -0
- package/dist/foundations/tokenusage/events/tokenusage.events.d.ts.map +1 -1
- package/dist/foundations/tokenusage/index.d.ts +1 -1
- package/dist/foundations/tokenusage/index.d.ts.map +1 -1
- package/dist/foundations/tokenusage/index.js.map +1 -1
- package/dist/foundations/tokenusage/repositories/tokenusage.repository.d.ts +57 -0
- package/dist/foundations/tokenusage/repositories/tokenusage.repository.d.ts.map +1 -1
- package/dist/foundations/tokenusage/repositories/tokenusage.repository.js +125 -0
- package/dist/foundations/tokenusage/repositories/tokenusage.repository.js.map +1 -1
- package/dist/foundations/tokenusage/services/tokenusage.service.d.ts +37 -1
- package/dist/foundations/tokenusage/services/tokenusage.service.d.ts.map +1 -1
- package/dist/foundations/tokenusage/services/tokenusage.service.js +56 -5
- package/dist/foundations/tokenusage/services/tokenusage.service.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,8 +1,36 @@
|
|
|
1
1
|
import { ClsService } from "nestjs-cls";
|
|
2
|
+
import { JsonApiCursorInterface } from "../../../core/jsonapi/interfaces/jsonapi.cursor.interface";
|
|
2
3
|
import { AbstractRepository } from "../../../core/neo4j/abstracts/abstract.repository";
|
|
3
4
|
import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
|
|
4
5
|
import { SecurityService } from "../../../core/security/services/security.service";
|
|
5
6
|
import { TokenUsage, TokenUsageDescriptor } from "../../tokenusage/entities/tokenusage";
|
|
7
|
+
/**
|
|
8
|
+
* A single row of the date + operation-type usage aggregation.
|
|
9
|
+
*
|
|
10
|
+
* Not an entity shape: the aggregation returns grouped scalars, so it
|
|
11
|
+
* deliberately bypasses the serialiser (`readMany`) — there is nothing to map
|
|
12
|
+
* onto `TokenUsage`.
|
|
13
|
+
*/
|
|
14
|
+
export interface TokenUsageAggregated {
|
|
15
|
+
date: string;
|
|
16
|
+
tokenUsageType: string;
|
|
17
|
+
totalCredits: number;
|
|
18
|
+
totalInputTokens: number;
|
|
19
|
+
totalOutputTokens: number;
|
|
20
|
+
totalCost: number;
|
|
21
|
+
count: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The single-row totals of the usage summary. Same non-entity rationale as
|
|
25
|
+
* `TokenUsageAggregated`.
|
|
26
|
+
*/
|
|
27
|
+
export interface TokenUsageSummary {
|
|
28
|
+
totalCredits: number;
|
|
29
|
+
totalInputTokens: number;
|
|
30
|
+
totalOutputTokens: number;
|
|
31
|
+
totalCost: number;
|
|
32
|
+
count: number;
|
|
33
|
+
}
|
|
6
34
|
/**
|
|
7
35
|
* TokenUsage repository.
|
|
8
36
|
*
|
|
@@ -39,8 +67,37 @@ export declare class TokenUsageRepository extends AbstractRepository<TokenUsage,
|
|
|
39
67
|
outputTokens: number;
|
|
40
68
|
cachedInputTokens?: number;
|
|
41
69
|
cost?: number;
|
|
70
|
+
credits?: number;
|
|
42
71
|
relationshipId: string;
|
|
43
72
|
relationshipType: string;
|
|
44
73
|
}): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Custom list (KEPT — date-range + tokenUsageType filtering is not expressible via the
|
|
76
|
+
* inherited descriptor-driven find()). Reuses buildDefaultMatch()/buildReturnStatement()
|
|
77
|
+
* for company scoping and security consistency.
|
|
78
|
+
*/
|
|
79
|
+
findByCompany(params: {
|
|
80
|
+
startDate?: string;
|
|
81
|
+
endDate?: string;
|
|
82
|
+
tokenUsageType?: string;
|
|
83
|
+
cursor?: JsonApiCursorInterface;
|
|
84
|
+
}): Promise<TokenUsage[]>;
|
|
85
|
+
/**
|
|
86
|
+
* Aggregation query (KEPT — "aggregations" rule): returns grouped totals, not
|
|
87
|
+
* TokenUsage entities, so it intentionally bypasses readMany()/the serialiser — there
|
|
88
|
+
* is nothing to map onto the entity type.
|
|
89
|
+
*/
|
|
90
|
+
findAggregatedByDateAndType(params: {
|
|
91
|
+
startDate?: string;
|
|
92
|
+
endDate?: string;
|
|
93
|
+
}): Promise<TokenUsageAggregated[]>;
|
|
94
|
+
/**
|
|
95
|
+
* Aggregation query (KEPT — see findAggregatedByDateAndType above), single-row totals.
|
|
96
|
+
*/
|
|
97
|
+
findUsageSummary(params: {
|
|
98
|
+
startDate?: string;
|
|
99
|
+
endDate?: string;
|
|
100
|
+
}): Promise<TokenUsageSummary>;
|
|
101
|
+
private toNumber;
|
|
45
102
|
}
|
|
46
103
|
//# sourceMappingURL=tokenusage.repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenusage.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/repositories/tokenusage.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAGxF;;;;;;;;;;;;;;;GAeG;AACH,qBACa,oBAAqB,SAAQ,kBAAkB,CAAC,UAAU,EAAE,OAAO,oBAAoB,CAAC,aAAa,CAAC;IACjH,SAAS,CAAC,QAAQ,CAAC,UAAU,sDAAwB;gBAEzC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;;;;;;;;OASG;IACG,MAAM,CAAC,MAAM,EAAE;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"tokenusage.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/repositories/tokenusage.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AACnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAGxF;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBACa,oBAAqB,SAAQ,kBAAkB,CAAC,UAAU,EAAE,OAAO,oBAAoB,CAAC,aAAa,CAAC;IACjH,SAAS,CAAC,QAAQ,CAAC,UAAU,sDAAwB;gBAEzC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;;;;;;;;OASG;IACG,MAAM,CAAC,MAAM,EAAE;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCjB;;;;OAIG;IACG,aAAa,CAAC,MAAM,EAAE;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,MAAM,CAAC,EAAE,sBAAsB,CAAC;KACjC,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA6BzB;;;;OAIG;IACG,2BAA2B,CAAC,MAAM,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA2CpH;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4CpG,OAAO,CAAC,QAAQ;CAMjB"}
|
|
@@ -59,6 +59,7 @@ let TokenUsageRepository = class TokenUsageRepository extends abstract_repositor
|
|
|
59
59
|
cachedInputTokens: params.cachedInputTokens ?? 0,
|
|
60
60
|
relationshipId: params.relationshipId,
|
|
61
61
|
cost: params.cost ?? 0,
|
|
62
|
+
credits: params.credits ?? 0,
|
|
62
63
|
};
|
|
63
64
|
query.query += `
|
|
64
65
|
CREATE (${tokenusage_meta_1.tokenUsageMeta.nodeName}:${tokenusage_meta_1.tokenUsageMeta.labelName} {
|
|
@@ -68,6 +69,7 @@ let TokenUsageRepository = class TokenUsageRepository extends abstract_repositor
|
|
|
68
69
|
outputTokens: $outputTokens,
|
|
69
70
|
cachedInputTokens: $cachedInputTokens,
|
|
70
71
|
cost: $cost,
|
|
72
|
+
credits: $credits,
|
|
71
73
|
createdAt: datetime(),
|
|
72
74
|
updatedAt: datetime()
|
|
73
75
|
})
|
|
@@ -79,6 +81,129 @@ let TokenUsageRepository = class TokenUsageRepository extends abstract_repositor
|
|
|
79
81
|
`;
|
|
80
82
|
await this.neo4j.writeOne(query);
|
|
81
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Custom list (KEPT — date-range + tokenUsageType filtering is not expressible via the
|
|
86
|
+
* inherited descriptor-driven find()). Reuses buildDefaultMatch()/buildReturnStatement()
|
|
87
|
+
* for company scoping and security consistency.
|
|
88
|
+
*/
|
|
89
|
+
async findByCompany(params) {
|
|
90
|
+
const query = this.neo4j.initQuery({ serialiser: tokenusage_1.TokenUsageDescriptor.model, cursor: params.cursor });
|
|
91
|
+
if (params.startDate) {
|
|
92
|
+
query.queryParams = { ...query.queryParams, startDate: params.startDate };
|
|
93
|
+
}
|
|
94
|
+
if (params.endDate) {
|
|
95
|
+
query.queryParams = { ...query.queryParams, endDate: params.endDate };
|
|
96
|
+
}
|
|
97
|
+
if (params.tokenUsageType) {
|
|
98
|
+
query.queryParams = { ...query.queryParams, tokenUsageType: params.tokenUsageType };
|
|
99
|
+
}
|
|
100
|
+
query.query += `
|
|
101
|
+
${this.buildDefaultMatch()}
|
|
102
|
+
${this.securityService.userHasAccess({ validator: () => this.buildUserHasAccess() })}
|
|
103
|
+
${params.startDate ? `WHERE ${tokenusage_meta_1.tokenUsageMeta.nodeName}.createdAt >= datetime($startDate)` : ""}
|
|
104
|
+
${params.endDate ? `${params.startDate ? "AND" : "WHERE"} ${tokenusage_meta_1.tokenUsageMeta.nodeName}.createdAt <= datetime($endDate)` : ""}
|
|
105
|
+
${params.tokenUsageType ? `${params.startDate || params.endDate ? "AND" : "WHERE"} ${tokenusage_meta_1.tokenUsageMeta.nodeName}.tokenUsageType = $tokenUsageType` : ""}
|
|
106
|
+
|
|
107
|
+
ORDER BY ${tokenusage_meta_1.tokenUsageMeta.nodeName}.createdAt DESC
|
|
108
|
+
{CURSOR}
|
|
109
|
+
|
|
110
|
+
${this.buildReturnStatement()}
|
|
111
|
+
`;
|
|
112
|
+
return this.neo4j.readMany(query);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Aggregation query (KEPT — "aggregations" rule): returns grouped totals, not
|
|
116
|
+
* TokenUsage entities, so it intentionally bypasses readMany()/the serialiser — there
|
|
117
|
+
* is nothing to map onto the entity type.
|
|
118
|
+
*/
|
|
119
|
+
async findAggregatedByDateAndType(params) {
|
|
120
|
+
const query = this.neo4j.initQuery();
|
|
121
|
+
if (params.startDate) {
|
|
122
|
+
query.queryParams = { ...query.queryParams, startDate: params.startDate };
|
|
123
|
+
}
|
|
124
|
+
if (params.endDate) {
|
|
125
|
+
query.queryParams = { ...query.queryParams, endDate: params.endDate };
|
|
126
|
+
}
|
|
127
|
+
query.query += `
|
|
128
|
+
${this.buildDefaultMatch()}
|
|
129
|
+
${params.startDate ? `WHERE ${tokenusage_meta_1.tokenUsageMeta.nodeName}.createdAt >= datetime($startDate)` : ""}
|
|
130
|
+
${params.endDate ? `${params.startDate ? "AND" : "WHERE"} ${tokenusage_meta_1.tokenUsageMeta.nodeName}.createdAt <= datetime($endDate)` : ""}
|
|
131
|
+
|
|
132
|
+
WITH date(${tokenusage_meta_1.tokenUsageMeta.nodeName}.createdAt) as usageDate,
|
|
133
|
+
${tokenusage_meta_1.tokenUsageMeta.nodeName}.tokenUsageType as usageType,
|
|
134
|
+
${tokenusage_meta_1.tokenUsageMeta.nodeName}
|
|
135
|
+
|
|
136
|
+
RETURN toString(usageDate) as date,
|
|
137
|
+
usageType as tokenUsageType,
|
|
138
|
+
round(sum(toFloat(${tokenusage_meta_1.tokenUsageMeta.nodeName}.credits)), 2) as totalCredits,
|
|
139
|
+
sum(toInteger(${tokenusage_meta_1.tokenUsageMeta.nodeName}.inputTokens)) as totalInputTokens,
|
|
140
|
+
sum(toInteger(${tokenusage_meta_1.tokenUsageMeta.nodeName}.outputTokens)) as totalOutputTokens,
|
|
141
|
+
sum(toFloat(${tokenusage_meta_1.tokenUsageMeta.nodeName}.cost)) as totalCost,
|
|
142
|
+
count(${tokenusage_meta_1.tokenUsageMeta.nodeName}) as count
|
|
143
|
+
ORDER BY date DESC, tokenUsageType
|
|
144
|
+
`;
|
|
145
|
+
const result = await this.neo4j.read(query.query, query.queryParams); // nja-lint-ignore: buildDefaultMatch()-scoped scalar aggregation — non-entity shape
|
|
146
|
+
return result.records.map((record) => ({
|
|
147
|
+
// nja-lint-ignore: aggregation rows, not entity nodes
|
|
148
|
+
date: record.get("date"),
|
|
149
|
+
tokenUsageType: record.get("tokenUsageType"),
|
|
150
|
+
totalCredits: this.toNumber(record.get("totalCredits")),
|
|
151
|
+
totalInputTokens: this.toNumber(record.get("totalInputTokens")),
|
|
152
|
+
totalOutputTokens: this.toNumber(record.get("totalOutputTokens")),
|
|
153
|
+
totalCost: this.toNumber(record.get("totalCost")),
|
|
154
|
+
count: this.toNumber(record.get("count")),
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Aggregation query (KEPT — see findAggregatedByDateAndType above), single-row totals.
|
|
159
|
+
*/
|
|
160
|
+
async findUsageSummary(params) {
|
|
161
|
+
const query = this.neo4j.initQuery();
|
|
162
|
+
if (params.startDate) {
|
|
163
|
+
query.queryParams = { ...query.queryParams, startDate: params.startDate };
|
|
164
|
+
}
|
|
165
|
+
if (params.endDate) {
|
|
166
|
+
query.queryParams = { ...query.queryParams, endDate: params.endDate };
|
|
167
|
+
}
|
|
168
|
+
query.query += `
|
|
169
|
+
${this.buildDefaultMatch()}
|
|
170
|
+
${params.startDate ? `WHERE ${tokenusage_meta_1.tokenUsageMeta.nodeName}.createdAt >= datetime($startDate)` : ""}
|
|
171
|
+
${params.endDate ? `${params.startDate ? "AND" : "WHERE"} ${tokenusage_meta_1.tokenUsageMeta.nodeName}.createdAt <= datetime($endDate)` : ""}
|
|
172
|
+
|
|
173
|
+
RETURN round(sum(toFloat(${tokenusage_meta_1.tokenUsageMeta.nodeName}.credits)), 2) as totalCredits,
|
|
174
|
+
sum(toInteger(${tokenusage_meta_1.tokenUsageMeta.nodeName}.inputTokens)) as totalInputTokens,
|
|
175
|
+
sum(toInteger(${tokenusage_meta_1.tokenUsageMeta.nodeName}.outputTokens)) as totalOutputTokens,
|
|
176
|
+
sum(toFloat(${tokenusage_meta_1.tokenUsageMeta.nodeName}.cost)) as totalCost,
|
|
177
|
+
count(${tokenusage_meta_1.tokenUsageMeta.nodeName}) as count
|
|
178
|
+
`;
|
|
179
|
+
const result = await this.neo4j.read(query.query, query.queryParams); // nja-lint-ignore: buildDefaultMatch()-scoped scalar aggregation — non-entity shape
|
|
180
|
+
if (result.records.length === 0) {
|
|
181
|
+
return {
|
|
182
|
+
totalCredits: 0,
|
|
183
|
+
totalInputTokens: 0,
|
|
184
|
+
totalOutputTokens: 0,
|
|
185
|
+
totalCost: 0,
|
|
186
|
+
count: 0,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const record = result.records[0];
|
|
190
|
+
return {
|
|
191
|
+
totalCredits: this.toNumber(record.get("totalCredits")),
|
|
192
|
+
totalInputTokens: this.toNumber(record.get("totalInputTokens")),
|
|
193
|
+
totalOutputTokens: this.toNumber(record.get("totalOutputTokens")),
|
|
194
|
+
totalCost: this.toNumber(record.get("totalCost")),
|
|
195
|
+
count: this.toNumber(record.get("count")),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
toNumber(value) {
|
|
199
|
+
if (value === null || value === undefined)
|
|
200
|
+
return 0;
|
|
201
|
+
if (typeof value === "number")
|
|
202
|
+
return value;
|
|
203
|
+
if (typeof value.toNumber === "function")
|
|
204
|
+
return value.toNumber();
|
|
205
|
+
return Number(value) || 0;
|
|
206
|
+
}
|
|
82
207
|
};
|
|
83
208
|
exports.TokenUsageRepository = TokenUsageRepository;
|
|
84
209
|
exports.TokenUsageRepository = TokenUsageRepository = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenusage.repository.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/repositories/tokenusage.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAAwC;
|
|
1
|
+
{"version":3,"file":"tokenusage.repository.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/repositories/tokenusage.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { TokenUsageInterface } from "../../../common/interfaces/token.usage.inte
|
|
|
7
7
|
import { JsonApiService } from "../../../core/jsonapi/services/jsonapi.service";
|
|
8
8
|
import { AbstractService } from "../../../core/neo4j/abstracts/abstract.service";
|
|
9
9
|
import { TokenUsage, TokenUsageDescriptor } from "../../tokenusage/entities/tokenusage";
|
|
10
|
-
import { TokenUsageRepository } from "../../tokenusage/repositories/tokenusage.repository";
|
|
10
|
+
import { TokenUsageAggregated, TokenUsageRepository, TokenUsageSummary } from "../../tokenusage/repositories/tokenusage.repository";
|
|
11
11
|
import { ModelWeight } from "../../../core/llm/enums/model.weight";
|
|
12
12
|
/**
|
|
13
13
|
* TokenUsage service.
|
|
@@ -49,6 +49,12 @@ export declare class TokenUsageService extends AbstractService<TokenUsage, typeo
|
|
|
49
49
|
useVisionCosts?: boolean;
|
|
50
50
|
modelWeight?: ModelWeight;
|
|
51
51
|
}): number;
|
|
52
|
+
/**
|
|
53
|
+
* Persists one usage record and converts its monetary cost into billing
|
|
54
|
+
* credits: `credits = max(minCreditsPerRecord, round2(cost / creditCost))`.
|
|
55
|
+
* `creditCost` absent or 0 disables credits entirely (records store 0 and no
|
|
56
|
+
* balance is deducted), so consumers without a `credits` config are unaffected.
|
|
57
|
+
*/
|
|
52
58
|
recordTokenUsage(params: {
|
|
53
59
|
tokens: TokenUsageInterface;
|
|
54
60
|
type: string;
|
|
@@ -56,6 +62,36 @@ export declare class TokenUsageService extends AbstractService<TokenUsage, typeo
|
|
|
56
62
|
relationshipType: string;
|
|
57
63
|
useVisionCosts?: boolean;
|
|
58
64
|
modelWeight?: ModelWeight;
|
|
65
|
+
/** When false the per-record credits floor (`minCreditsPerRecord`) is skipped — sub-cent calls (embeddings) must not be floored. Defaults to true. */
|
|
66
|
+
applyMinimum?: boolean;
|
|
67
|
+
/** Pre-computed cost in euros; when provided `computeCost` is skipped (embeddings: estimated tokens × the embedder rate). */
|
|
68
|
+
costOverride?: number;
|
|
59
69
|
}): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* KEPT (custom filtering not covered by inherited find()): date-range + tokenUsageType
|
|
72
|
+
* filtering. Backs GET /tokenusages in consuming apps.
|
|
73
|
+
*/
|
|
74
|
+
findByCompany(params: {
|
|
75
|
+
query: any;
|
|
76
|
+
startDate?: string;
|
|
77
|
+
endDate?: string;
|
|
78
|
+
tokenUsageType?: string;
|
|
79
|
+
}): Promise<any>;
|
|
80
|
+
/**
|
|
81
|
+
* KEPT (raw aggregation, not JSON:API entities — inherited find()/findById() can't
|
|
82
|
+
* produce this shape). Backs GET /tokenusages/aggregated in consuming apps.
|
|
83
|
+
*/
|
|
84
|
+
getUsageByDateAndType(params: {
|
|
85
|
+
startDate?: string;
|
|
86
|
+
endDate?: string;
|
|
87
|
+
}): Promise<TokenUsageAggregated[]>;
|
|
88
|
+
/**
|
|
89
|
+
* KEPT (raw aggregation — see getUsageByDateAndType above). Backs GET
|
|
90
|
+
* /tokenusages/summary in consuming apps.
|
|
91
|
+
*/
|
|
92
|
+
getUsageSummary(params: {
|
|
93
|
+
startDate?: string;
|
|
94
|
+
endDate?: string;
|
|
95
|
+
}): Promise<TokenUsageSummary>;
|
|
60
96
|
}
|
|
61
97
|
//# sourceMappingURL=tokenusage.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenusage.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/services/tokenusage.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"tokenusage.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/services/tokenusage.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAA0B,MAAM,4BAA4B,CAAC;AAC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAEvF,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACxF,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAGnE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBACa,iBAAkB,SAAQ,eAAe,CAAC,UAAU,EAAE,OAAO,oBAAoB,CAAC,aAAa,CAAC;IAOzG,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IAE7D,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,mBAAmB,CAAC;IACpE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa;IAThD,SAAS,CAAC,QAAQ,CAAC,UAAU,sDAAwB;IAErD,SAAS,CAAC,QAAQ,CAAC,MAAM,SAAsC;gBAG7D,cAAc,EAAE,cAAc,EACX,oBAAoB,EAAE,oBAAoB,EAC7D,UAAU,EAAE,UAAU,EACH,aAAa,EAAE,aAAa,CAAC,mBAAmB,CAAC,EACjD,YAAY,EAAE,aAAa;IAKhD,SAAS,KAAK,QAAQ,IAAI,iBAAiB,CAE1C;IAED,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW;IAW9C;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,mBAAmB,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,MAAM;IAYjH;;;;;OAKG;IACG,gBAAgB,CAAC,MAAM,EAAE;QAC7B,MAAM,EAAE,mBAAmB,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,sJAAsJ;QACtJ,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,6HAA6H;QAC7H,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CjB;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE;IAezG;;;OAGG;IACG,qBAAqB,CAAC,MAAM,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAO9G;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAMpG"}
|
|
@@ -16,6 +16,7 @@ const config_1 = require("@nestjs/config");
|
|
|
16
16
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
17
17
|
const crypto_1 = require("crypto");
|
|
18
18
|
const nestjs_cls_1 = require("nestjs-cls");
|
|
19
|
+
const jsonapi_paginator_1 = require("../../../core/jsonapi/serialisers/jsonapi.paginator");
|
|
19
20
|
const jsonapi_service_1 = require("../../../core/jsonapi/services/jsonapi.service");
|
|
20
21
|
const abstract_service_1 = require("../../../core/neo4j/abstracts/abstract.service");
|
|
21
22
|
const tokenusage_1 = require("../../tokenusage/entities/tokenusage");
|
|
@@ -81,12 +82,26 @@ let TokenUsageService = TokenUsageService_1 = class TokenUsageService extends ab
|
|
|
81
82
|
const cost = uncachedInput * inputRate + cached * cachedRate + params.tokens.output * outputRate;
|
|
82
83
|
return cost / 1_000_000;
|
|
83
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Persists one usage record and converts its monetary cost into billing
|
|
87
|
+
* credits: `credits = max(minCreditsPerRecord, round2(cost / creditCost))`.
|
|
88
|
+
* `creditCost` absent or 0 disables credits entirely (records store 0 and no
|
|
89
|
+
* balance is deducted), so consumers without a `credits` config are unaffected.
|
|
90
|
+
*/
|
|
84
91
|
async recordTokenUsage(params) {
|
|
85
|
-
const cost =
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
92
|
+
const cost = params.costOverride ??
|
|
93
|
+
this.computeCost({
|
|
94
|
+
tokens: params.tokens,
|
|
95
|
+
useVisionCosts: params.useVisionCosts,
|
|
96
|
+
modelWeight: params.modelWeight,
|
|
97
|
+
});
|
|
98
|
+
const creditsConfig = this.configService.get("credits");
|
|
99
|
+
let credits = 0;
|
|
100
|
+
if (creditsConfig && creditsConfig.creditCost > 0) {
|
|
101
|
+
credits = Math.round((cost / creditsConfig.creditCost) * 100) / 100;
|
|
102
|
+
if (params.applyMinimum !== false)
|
|
103
|
+
credits = Math.max(creditsConfig.minCreditsPerRecord, credits);
|
|
104
|
+
}
|
|
90
105
|
await this.tokenUsageRepository.create({
|
|
91
106
|
id: (0, crypto_1.randomUUID)(),
|
|
92
107
|
tokenUsageType: params.type,
|
|
@@ -94,6 +109,7 @@ let TokenUsageService = TokenUsageService_1 = class TokenUsageService extends ab
|
|
|
94
109
|
outputTokens: params.tokens.output,
|
|
95
110
|
cachedInputTokens: params.tokens.cached ?? 0,
|
|
96
111
|
cost: cost,
|
|
112
|
+
credits: credits,
|
|
97
113
|
relationshipId: params.relationshipId,
|
|
98
114
|
relationshipType: params.relationshipType,
|
|
99
115
|
});
|
|
@@ -104,6 +120,8 @@ let TokenUsageService = TokenUsageService_1 = class TokenUsageService extends ab
|
|
|
104
120
|
const payload = {
|
|
105
121
|
input: params.tokens.input,
|
|
106
122
|
output: params.tokens.output,
|
|
123
|
+
cost: cost,
|
|
124
|
+
credits: credits,
|
|
107
125
|
};
|
|
108
126
|
this.eventEmitter.emit(tokenusage_events_1.TOKEN_USAGE_RECORDED_EVENT, payload);
|
|
109
127
|
}
|
|
@@ -111,6 +129,39 @@ let TokenUsageService = TokenUsageService_1 = class TokenUsageService extends ab
|
|
|
111
129
|
this.logger.warn(`Failed to emit ${tokenusage_events_1.TOKEN_USAGE_RECORDED_EVENT}: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
130
|
}
|
|
113
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* KEPT (custom filtering not covered by inherited find()): date-range + tokenUsageType
|
|
134
|
+
* filtering. Backs GET /tokenusages in consuming apps.
|
|
135
|
+
*/
|
|
136
|
+
async findByCompany(params) {
|
|
137
|
+
const paginator = new jsonapi_paginator_1.JsonApiPaginator(params.query);
|
|
138
|
+
return this.jsonApiService.buildList(tokenusage_1.TokenUsageDescriptor.model, await this.tokenUsageRepository.findByCompany({
|
|
139
|
+
startDate: params.startDate,
|
|
140
|
+
endDate: params.endDate,
|
|
141
|
+
tokenUsageType: params.tokenUsageType,
|
|
142
|
+
cursor: paginator.generateCursor(),
|
|
143
|
+
}), paginator);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* KEPT (raw aggregation, not JSON:API entities — inherited find()/findById() can't
|
|
147
|
+
* produce this shape). Backs GET /tokenusages/aggregated in consuming apps.
|
|
148
|
+
*/
|
|
149
|
+
async getUsageByDateAndType(params) {
|
|
150
|
+
return this.tokenUsageRepository.findAggregatedByDateAndType({
|
|
151
|
+
startDate: params.startDate,
|
|
152
|
+
endDate: params.endDate,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* KEPT (raw aggregation — see getUsageByDateAndType above). Backs GET
|
|
157
|
+
* /tokenusages/summary in consuming apps.
|
|
158
|
+
*/
|
|
159
|
+
async getUsageSummary(params) {
|
|
160
|
+
return this.tokenUsageRepository.findUsageSummary({
|
|
161
|
+
startDate: params.startDate,
|
|
162
|
+
endDate: params.endDate,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
114
165
|
};
|
|
115
166
|
exports.TokenUsageService = TokenUsageService;
|
|
116
167
|
exports.TokenUsageService = TokenUsageService = TokenUsageService_1 = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenusage.service.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/services/tokenusage.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2CAA+C;AAC/C,yDAAsD;AACtD,mCAAoC;AACpC,2CAAwC;AAGxC,oFAAgF;AAChF,qFAAiF;AACjF,qEAAwF;AACxF,+
|
|
1
|
+
{"version":3,"file":"tokenusage.service.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/services/tokenusage.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@carlonicora/nestjs-neo4jsonapi",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.117.0",
|
|
4
4
|
"description": "NestJS foundation package with JSON:API, Neo4j, Redis, LangChain agents, and common utilities",
|
|
5
5
|
"author": "Carlo Nicora",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|
|
@@ -107,6 +107,7 @@
|
|
|
107
107
|
"gray-matter": "^4.0.3",
|
|
108
108
|
"handlebars": "^4.7.9",
|
|
109
109
|
"ioredis": "^5.11.1",
|
|
110
|
+
"js-tiktoken": "^1.0.21",
|
|
110
111
|
"js-yaml": "^5.2.2",
|
|
111
112
|
"jszip": "^3.10.1",
|
|
112
113
|
"langsmith": "^0.8.8",
|