@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.
Files changed (76) hide show
  1. package/dist/common/guards/jwt.auth.admin.guard.d.ts +3 -2
  2. package/dist/common/guards/jwt.auth.admin.guard.d.ts.map +1 -1
  3. package/dist/common/guards/jwt.auth.admin.guard.js +19 -4
  4. package/dist/common/guards/jwt.auth.admin.guard.js.map +1 -1
  5. package/dist/common/tokens.d.ts +4 -0
  6. package/dist/common/tokens.d.ts.map +1 -1
  7. package/dist/config/base.config.d.ts.map +1 -1
  8. package/dist/config/base.config.js +8 -0
  9. package/dist/config/base.config.js.map +1 -1
  10. package/dist/config/interfaces/base.config.interface.d.ts +2 -0
  11. package/dist/config/interfaces/base.config.interface.d.ts.map +1 -1
  12. package/dist/config/interfaces/config.ai.interface.d.ts +8 -0
  13. package/dist/config/interfaces/config.ai.interface.d.ts.map +1 -1
  14. package/dist/config/interfaces/config.credits.interface.d.ts +24 -0
  15. package/dist/config/interfaces/config.credits.interface.d.ts.map +1 -0
  16. package/dist/config/interfaces/config.credits.interface.js +3 -0
  17. package/dist/config/interfaces/config.credits.interface.js.map +1 -0
  18. package/dist/config/interfaces/index.d.ts +1 -0
  19. package/dist/config/interfaces/index.d.ts.map +1 -1
  20. package/dist/config/interfaces/index.js +1 -0
  21. package/dist/config/interfaces/index.js.map +1 -1
  22. package/dist/core/llm/services/embedder.service.d.ts +36 -2
  23. package/dist/core/llm/services/embedder.service.d.ts.map +1 -1
  24. package/dist/core/llm/services/embedder.service.js +87 -7
  25. package/dist/core/llm/services/embedder.service.js.map +1 -1
  26. package/dist/foundations/company/dtos/company.post.dto.d.ts +3 -3
  27. package/dist/foundations/company/dtos/company.post.dto.d.ts.map +1 -1
  28. package/dist/foundations/company/dtos/company.post.dto.js +3 -3
  29. package/dist/foundations/company/dtos/company.post.dto.js.map +1 -1
  30. package/dist/foundations/company/dtos/company.put.dto.d.ts +3 -3
  31. package/dist/foundations/company/dtos/company.put.dto.d.ts.map +1 -1
  32. package/dist/foundations/company/dtos/company.put.dto.js +3 -3
  33. package/dist/foundations/company/dtos/company.put.dto.js.map +1 -1
  34. package/dist/foundations/company/entities/company.d.ts +3 -3
  35. package/dist/foundations/company/entities/company.d.ts.map +1 -1
  36. package/dist/foundations/company/entities/company.js +3 -3
  37. package/dist/foundations/company/entities/company.js.map +1 -1
  38. package/dist/foundations/company/repositories/company.repository.d.ts +31 -24
  39. package/dist/foundations/company/repositories/company.repository.d.ts.map +1 -1
  40. package/dist/foundations/company/repositories/company.repository.js +66 -77
  41. package/dist/foundations/company/repositories/company.repository.js.map +1 -1
  42. package/dist/foundations/company/services/company.service.d.ts +8 -9
  43. package/dist/foundations/company/services/company.service.d.ts.map +1 -1
  44. package/dist/foundations/company/services/company.service.js +29 -32
  45. package/dist/foundations/company/services/company.service.js.map +1 -1
  46. package/dist/foundations/referral/services/referral.service.js +4 -4
  47. package/dist/foundations/referral/services/referral.service.js.map +1 -1
  48. package/dist/foundations/stripe-subscription/services/token-allocation.service.d.ts +1 -1
  49. package/dist/foundations/stripe-subscription/services/token-allocation.service.js +10 -10
  50. package/dist/foundations/stripe-subscription/services/token-allocation.service.js.map +1 -1
  51. package/dist/foundations/stripe-trial/services/trial.service.js +2 -2
  52. package/dist/foundations/stripe-trial/services/trial.service.js.map +1 -1
  53. package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.js +2 -2
  54. package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.js.map +1 -1
  55. package/dist/foundations/tokenusage/entities/tokenusage.d.ts +1 -0
  56. package/dist/foundations/tokenusage/entities/tokenusage.d.ts.map +1 -1
  57. package/dist/foundations/tokenusage/entities/tokenusage.js +4 -0
  58. package/dist/foundations/tokenusage/entities/tokenusage.js.map +1 -1
  59. package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts +2 -1
  60. package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts.map +1 -1
  61. package/dist/foundations/tokenusage/enums/tokenusage.type.js +1 -0
  62. package/dist/foundations/tokenusage/enums/tokenusage.type.js.map +1 -1
  63. package/dist/foundations/tokenusage/events/tokenusage.events.d.ts +2 -0
  64. package/dist/foundations/tokenusage/events/tokenusage.events.d.ts.map +1 -1
  65. package/dist/foundations/tokenusage/index.d.ts +1 -1
  66. package/dist/foundations/tokenusage/index.d.ts.map +1 -1
  67. package/dist/foundations/tokenusage/index.js.map +1 -1
  68. package/dist/foundations/tokenusage/repositories/tokenusage.repository.d.ts +57 -0
  69. package/dist/foundations/tokenusage/repositories/tokenusage.repository.d.ts.map +1 -1
  70. package/dist/foundations/tokenusage/repositories/tokenusage.repository.js +125 -0
  71. package/dist/foundations/tokenusage/repositories/tokenusage.repository.js.map +1 -1
  72. package/dist/foundations/tokenusage/services/tokenusage.service.d.ts +37 -1
  73. package/dist/foundations/tokenusage/services/tokenusage.service.d.ts.map +1 -1
  74. package/dist/foundations/tokenusage/services/tokenusage.service.js +56 -5
  75. package/dist/foundations/tokenusage/services/tokenusage.service.js.map +1 -1
  76. 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;CAkClB"}
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;AACxC,2FAAuF;AACvF,8EAA0E;AAC1E,uFAAmF;AACnF,qEAAwF;AACxF,+EAA2E;AAE3E;;;;;;;;;;;;;;;GAeG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,wCAAyE;IAGjH,YAAY,KAAmB,EAAE,eAAgC,EAAE,UAAsB;QACvF,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QAHzB,eAAU,GAAG,iCAAoB,CAAC;IAIrD,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAC,MASZ;QACC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAErC,KAAK,CAAC,WAAW,GAAG;YAClB,GAAG,KAAK,CAAC,WAAW;YACpB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,CAAC;YAChD,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;SACvB,CAAC;QAEF,KAAK,CAAC,KAAK,IAAI;gBACH,gCAAc,CAAC,QAAQ,IAAI,gCAAc,CAAC,SAAS;;;;;;;;;;gBAUnD,gCAAc,CAAC,QAAQ;gBACvB,gCAAc,CAAC,QAAQ;aAC1B,gCAAc,CAAC,QAAQ;yBACX,MAAM,CAAC,gBAAgB;gBAChC,gCAAc,CAAC,QAAQ;KAClC,CAAC;QAEF,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AA5DY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAIQ,4BAAY,EAAmB,kCAAe,EAAc,uBAAU;GAH9E,oBAAoB,CA4DhC"}
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,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,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,EAAE,oBAAoB,EAAE,MAAM,qDAAqD,CAAC;AAC3F,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;IAY3G,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;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;CAiClB"}
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 = this.computeCost({
86
- tokens: params.tokens,
87
- useVisionCosts: params.useVisionCosts,
88
- modelWeight: params.modelWeight,
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":"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"}
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.116.0",
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",