@autobe/utils 0.28.1 → 0.29.1

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 (33) hide show
  1. package/lib/ArrayUtil.d.ts +4 -0
  2. package/lib/ArrayUtil.js +38 -0
  3. package/lib/ArrayUtil.js.map +1 -0
  4. package/lib/aggregate/AutoBeFunctionCallingMetricFactory.d.ts +7 -0
  5. package/lib/aggregate/AutoBeFunctionCallingMetricFactory.js +35 -0
  6. package/lib/aggregate/AutoBeFunctionCallingMetricFactory.js.map +1 -0
  7. package/lib/aggregate/AutoBeProcessAggregateFactory.d.ts +13 -0
  8. package/lib/aggregate/AutoBeProcessAggregateFactory.js +111 -0
  9. package/lib/aggregate/AutoBeProcessAggregateFactory.js.map +1 -0
  10. package/lib/aggregate/TokenUsageComputer.d.ts +6 -0
  11. package/lib/aggregate/TokenUsageComputer.js +42 -0
  12. package/lib/aggregate/TokenUsageComputer.js.map +1 -0
  13. package/lib/aggregate/index.d.ts +3 -0
  14. package/lib/aggregate/index.js +20 -0
  15. package/lib/aggregate/index.js.map +1 -0
  16. package/lib/index.d.ts +3 -0
  17. package/lib/index.js +3 -0
  18. package/lib/index.js.map +1 -1
  19. package/lib/prisma/index.d.ts +1 -0
  20. package/lib/prisma/index.js +18 -0
  21. package/lib/prisma/index.js.map +1 -0
  22. package/lib/prisma/writePrismaApplication.d.ts +5 -0
  23. package/lib/prisma/writePrismaApplication.js +342 -0
  24. package/lib/prisma/writePrismaApplication.js.map +1 -0
  25. package/package.json +3 -2
  26. package/src/ArrayUtil.ts +21 -0
  27. package/src/aggregate/AutoBeFunctionCallingMetricFactory.ts +44 -0
  28. package/src/aggregate/AutoBeProcessAggregateFactory.ts +152 -0
  29. package/src/aggregate/TokenUsageComputer.ts +49 -0
  30. package/src/aggregate/index.ts +3 -0
  31. package/src/index.ts +4 -0
  32. package/src/prisma/index.ts +1 -0
  33. package/src/prisma/writePrismaApplication.ts +439 -0
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.writePrismaApplication = writePrismaApplication;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const ArrayUtil_1 = require("../ArrayUtil");
9
+ const MapUtil_1 = require("../MapUtil");
10
+ const StringUtil_1 = require("../StringUtil");
11
+ function writePrismaApplication(props) {
12
+ for (const file of props.application.files)
13
+ for (const model of file.models)
14
+ fillMappingName(model);
15
+ return Object.assign(Object.assign({}, Object.fromEntries(props.application.files
16
+ .filter((file) => file.filename !== "main.prisma")
17
+ .map((file) => [
18
+ file.filename,
19
+ writeFile(Object.assign(Object.assign({}, props), { file })),
20
+ ]))), { "main.prisma": props.dbms === "postgres" ? POSTGRES_MAIN_FILE : SQLITE_MAIN_FILE });
21
+ }
22
+ function writeFile(props) {
23
+ return props.file.models
24
+ .map((model) => writeModel(Object.assign(Object.assign({}, props), { model })))
25
+ .join("\n\n");
26
+ }
27
+ function writeModel(props) {
28
+ return [
29
+ writeComment([
30
+ props.model.description,
31
+ "",
32
+ ...(props.model.material ? [] : [`@namespace ${props.file.namespace}`]),
33
+ "@author AutoBE - https://github.com/wrtnlabs/autobe",
34
+ ].join("\n"), 80),
35
+ `model ${props.model.name} {`,
36
+ addIndent(ArrayUtil_1.ArrayUtil.paddle([writeColumns(props), writeRelations(props)]).join("\n")),
37
+ "}",
38
+ ].join("\n");
39
+ }
40
+ function fillMappingName(model) {
41
+ const group = new Map();
42
+ for (const ff of model.foreignFields) {
43
+ MapUtil_1.MapUtil.take(group, ff.relation.targetModel, () => []).push(ff);
44
+ if (ff.relation.targetModel == model.name)
45
+ ff.relation.mappingName = "recursive";
46
+ }
47
+ for (const array of group.values())
48
+ if (array.length !== 1)
49
+ for (const ff of array)
50
+ ff.relation.mappingName = shortName(`${model.name}_of_${ff.name}`);
51
+ }
52
+ /* -----------------------------------------------------------
53
+ COLUMNS
54
+ ----------------------------------------------------------- */
55
+ function writeColumns(props) {
56
+ return [
57
+ "//----",
58
+ "// COLUMNS",
59
+ "//----",
60
+ writePrimary({
61
+ dbms: props.dbms,
62
+ model: props.model,
63
+ field: props.model.primaryField,
64
+ }),
65
+ ...props.model.foreignFields
66
+ .map((x) => [
67
+ "",
68
+ writeField({
69
+ dbms: props.dbms,
70
+ field: x,
71
+ }),
72
+ ])
73
+ .flat(),
74
+ ...props.model.plainFields
75
+ .map((x) => [
76
+ "",
77
+ writeField({
78
+ dbms: props.dbms,
79
+ field: x,
80
+ }),
81
+ ])
82
+ .flat(),
83
+ ];
84
+ }
85
+ function writePrimary(props) {
86
+ const type = props.dbms === "postgres" ? POSTGRES_PHYSICAL_TYPES.uuid : undefined;
87
+ const pkeyName = `${props.model.name}__pkey`;
88
+ const signature = pkeyName.length <= MAX_IDENTIFIER_LENGTH
89
+ ? "@id"
90
+ : `@id(map: "${shortName(pkeyName)}")`;
91
+ return [
92
+ writeComment(props.field.description, 78),
93
+ `${props.field.name} String ${signature}${type ? ` ${type}` : ""}`,
94
+ ].join("\n");
95
+ }
96
+ function writeField(props) {
97
+ const logical = LOGICAL_TYPES[props.field.type];
98
+ const physical = props.dbms === "postgres"
99
+ ? POSTGRES_PHYSICAL_TYPES[props.field.type]
100
+ : undefined;
101
+ return [
102
+ writeComment(props.field.description, 78),
103
+ [
104
+ props.field.name,
105
+ `${logical}${props.field.nullable ? "?" : ""}`,
106
+ ...(physical ? [physical] : []),
107
+ ].join(" "),
108
+ ].join("\n");
109
+ }
110
+ /* -----------------------------------------------------------
111
+ RELATIONS
112
+ ----------------------------------------------------------- */
113
+ function writeRelations(props) {
114
+ const hasRelationships = props.application.files
115
+ .map((otherFile) => otherFile.models.map((otherModel) => otherModel.foreignFields
116
+ .filter((otherForeign) => otherForeign.relation.targetModel === props.model.name)
117
+ .map((otherForeign) => ({
118
+ modelName: otherModel.name,
119
+ unique: otherForeign.unique,
120
+ mappingName: otherForeign.relation.mappingName,
121
+ }))))
122
+ .flat(2);
123
+ const foreignIndexes = props.model.foreignFields.filter((f) => {
124
+ if (f.unique === true)
125
+ return props.model.uniqueIndexes.every((u) => u.fieldNames.length !== 1 || u.fieldNames[0] !== f.name);
126
+ return (props.model.uniqueIndexes.every((u) => u.fieldNames[0] !== f.name) &&
127
+ props.model.plainIndexes.every((p) => p.fieldNames[0] !== f.name));
128
+ });
129
+ const contents = [
130
+ props.model.foreignFields.map((foreign) => writeConstraint({
131
+ dbms: props.dbms,
132
+ model: props.model,
133
+ foreign,
134
+ })),
135
+ hasRelationships.map((r) => {
136
+ var _a;
137
+ return [
138
+ (_a = r.mappingName) !== null && _a !== void 0 ? _a : r.modelName,
139
+ `${r.modelName}${r.unique ? "?" : "[]"}`,
140
+ ...(r.mappingName ? [`@relation("${r.mappingName}")`] : []),
141
+ ].join(" ");
142
+ }),
143
+ foreignIndexes.map((field) => writeForeignIndex({
144
+ model: props.model,
145
+ field,
146
+ })),
147
+ [
148
+ ...props.model.uniqueIndexes.map((unique) => writeUniqueIndex({
149
+ model: props.model,
150
+ unique,
151
+ })),
152
+ ...props.model.plainIndexes.map((plain) => writePlainIndex({
153
+ model: props.model,
154
+ plain,
155
+ })),
156
+ ...(props.dbms === "postgres"
157
+ ? props.model.ginIndexes.map((gin) => writeGinIndex({
158
+ model: props.model,
159
+ gin,
160
+ }))
161
+ : []),
162
+ ],
163
+ ];
164
+ if (contents.every((c) => c.length === 0))
165
+ return [];
166
+ return [
167
+ "//----",
168
+ "// RELATIONS",
169
+ "//----",
170
+ // paddled content
171
+ ...ArrayUtil_1.ArrayUtil.paddle(contents),
172
+ ];
173
+ }
174
+ function writeConstraint(props) {
175
+ // spellchecker:ignore-next-line
176
+ const name = `${props.model.name}_${props.foreign.name}_rela`;
177
+ const tooMuchLong = props.dbms === "postgres" && name.length > MAX_IDENTIFIER_LENGTH;
178
+ const body = [
179
+ props.foreign.relation.name,
180
+ `${props.foreign.relation.targetModel}${props.foreign.nullable ? "?" : ""}`,
181
+ `@relation(${[
182
+ ...(props.foreign.relation.mappingName
183
+ ? [`"${props.foreign.relation.mappingName}"`]
184
+ : []),
185
+ `fields: [${props.foreign.name}]`,
186
+ `references: [id]`,
187
+ `onDelete: Cascade`,
188
+ ...(tooMuchLong ? [`map: "${shortName(name)}"`] : []),
189
+ ].join(", ")})`,
190
+ ].join(" ");
191
+ return tooMuchLong
192
+ ? StringUtil_1.StringUtil.trim `
193
+ // spellchecker: ignore-next-line
194
+ ${body}
195
+ `
196
+ : body;
197
+ }
198
+ function writeForeignIndex(props) {
199
+ const name = `${props.model.name}_${props.field.name}_fkey`;
200
+ const prefix = `@@${props.field.unique === true ? "unique" : "index"}([${props.field.name}]`;
201
+ if (name.length <= MAX_IDENTIFIER_LENGTH)
202
+ return `${prefix})`;
203
+ return StringUtil_1.StringUtil.trim `
204
+ // spellchecker: ignore-next-line
205
+ ${prefix}, map: "${shortName(name)}")
206
+ `;
207
+ }
208
+ function writeUniqueIndex(props) {
209
+ const name = `${props.model.name}_${props.unique.fieldNames.join("_")}_key`;
210
+ const prefix = `@@unique([${props.unique.fieldNames.join(", ")}]`;
211
+ if (name.length <= MAX_IDENTIFIER_LENGTH)
212
+ return `${prefix})`;
213
+ return StringUtil_1.StringUtil.trim `
214
+ // spellchecker: ignore-next-line
215
+ ${prefix}, map: "${shortName(name)}")
216
+ `;
217
+ }
218
+ function writePlainIndex(props) {
219
+ const name = `${props.model.name}_${props.plain.fieldNames.join("_")}_idx`;
220
+ const prefix = `@@index([${props.plain.fieldNames.join(", ")}]`;
221
+ if (name.length <= MAX_IDENTIFIER_LENGTH)
222
+ return `${prefix})`;
223
+ return StringUtil_1.StringUtil.trim `
224
+ // spellchecker: ignore-next-line
225
+ ${prefix}, map: "${shortName(name)}")
226
+ `;
227
+ }
228
+ function writeGinIndex(props) {
229
+ const name = `${props.model.name}_${props.gin.fieldName}_idx`;
230
+ const prefix = `@@index([${props.gin.fieldName}(ops: raw("gin_trgm_ops"))], type: Gin`;
231
+ if (name.length <= MAX_IDENTIFIER_LENGTH)
232
+ return `${prefix})`;
233
+ return StringUtil_1.StringUtil.trim `
234
+ // spellchecker: ignore-next-line
235
+ ${prefix}, map: "${shortName(name)}")
236
+ `;
237
+ }
238
+ /* -----------------------------------------------------------
239
+ BACKGROUND
240
+ ----------------------------------------------------------- */
241
+ function writeComment(content, length) {
242
+ return content
243
+ .split("\r\n")
244
+ .join("\n")
245
+ .split("\n")
246
+ .map((line) => line.trim())
247
+ .map((line) => {
248
+ // 77자에서 "/// " 4자를 뺀 73자가 실제 컨텐츠 최대 길이
249
+ if (line.length <= length - 4)
250
+ return [line];
251
+ const words = line.split(" ");
252
+ const result = [];
253
+ let currentLine = "";
254
+ for (const word of words) {
255
+ const potentialLine = currentLine ? `${currentLine} ${word}` : word;
256
+ if (potentialLine.length <= 73) {
257
+ currentLine = potentialLine;
258
+ }
259
+ else {
260
+ if (currentLine)
261
+ result.push(currentLine);
262
+ currentLine = word;
263
+ }
264
+ }
265
+ if (currentLine)
266
+ result.push(currentLine);
267
+ return result;
268
+ })
269
+ .flat()
270
+ .map((str) => `///${str.length ? ` ${str}` : ""}`)
271
+ .join("\n")
272
+ .trim();
273
+ }
274
+ function addIndent(content) {
275
+ return content
276
+ .split("\r\n")
277
+ .join("\n")
278
+ .split("\n")
279
+ .map((str) => ` ${str}`)
280
+ .join("\n");
281
+ }
282
+ function shortName(name) {
283
+ if (name.length <= MAX_IDENTIFIER_LENGTH)
284
+ return name;
285
+ const hash = crypto_1.default
286
+ .createHash("md5")
287
+ .update(name)
288
+ .digest("hex")
289
+ .substring(0, HASH_TRUNCATION_LENGTH);
290
+ return `${name.substring(0, MAX_IDENTIFIER_LENGTH - HASH_TRUNCATION_LENGTH - 1)}_${hash}`;
291
+ }
292
+ const LOGICAL_TYPES = {
293
+ // native types
294
+ boolean: "Boolean",
295
+ int: "Int",
296
+ double: "Float",
297
+ string: "String",
298
+ // formats
299
+ datetime: "DateTime",
300
+ uuid: "String",
301
+ uri: "String",
302
+ };
303
+ const POSTGRES_PHYSICAL_TYPES = {
304
+ int: "@db.Integer",
305
+ double: "@db.DoublePrecision",
306
+ uuid: "@db.Uuid",
307
+ datetime: "@db.Timestamptz",
308
+ uri: "@db.VarChar(80000)",
309
+ };
310
+ const POSTGRES_MAIN_FILE = StringUtil_1.StringUtil.trim `
311
+ generator client {
312
+ provider = "prisma-client-js"
313
+ engineType = "client"
314
+ previewFeatures = ["postgresqlExtensions", "views"]
315
+ }
316
+ datasource db {
317
+ provider = "postgresql"
318
+ url = env("DATABASE_URL")
319
+ extensions = [pg_trgm]
320
+ }
321
+ generator markdown {
322
+ provider = "prisma-markdown"
323
+ output = "../../docs/ERD.md"
324
+ }
325
+ `;
326
+ const SQLITE_MAIN_FILE = StringUtil_1.StringUtil.trim `
327
+ generator client {
328
+ provider = "prisma-client-js"
329
+ engineType = "client"
330
+ }
331
+ datasource db {
332
+ provider = "sqlite"
333
+ url = "file:../db.sqlite"
334
+ }
335
+ generator markdown {
336
+ provider = "prisma-markdown"
337
+ output = "../../docs/ERD.md"
338
+ }
339
+ `;
340
+ const MAX_IDENTIFIER_LENGTH = 63;
341
+ const HASH_TRUNCATION_LENGTH = 8;
342
+ //# sourceMappingURL=writePrismaApplication.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writePrismaApplication.js","sourceRoot":"","sources":["../../src/prisma/writePrismaApplication.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autobe/utils",
3
- "version": "0.28.1",
3
+ "version": "0.29.1",
4
4
  "description": "AI backend server code generator",
5
5
  "main": "lib/index.js",
6
6
  "keywords": [],
@@ -27,9 +27,10 @@
27
27
  "@samchon/openapi": "^5.0.1",
28
28
  "tstl": "^3.0.0",
29
29
  "typia": "^10.0.2",
30
- "@autobe/interface": "^0.28.1"
30
+ "@autobe/interface": "^0.29.1"
31
31
  },
32
32
  "devDependencies": {
33
+ "@types/node": "^24.10.1",
33
34
  "rimraf": "^6.0.1",
34
35
  "ts-patch": "^3.3.0",
35
36
  "typescript": "~5.9.3"
@@ -0,0 +1,21 @@
1
+ export namespace ArrayUtil {
2
+ export async function asyncMap<T, U>(
3
+ array: T[],
4
+ callback: (value: T, index: number, array: T[]) => Promise<U>,
5
+ ): Promise<U[]> {
6
+ const result: U[] = new Array(array.length);
7
+ for (let i = 0; i < array.length; i++)
8
+ result[i] = await callback(array[i], i, array);
9
+ return result;
10
+ }
11
+
12
+ export function paddle(contents: string[][]): string[] {
13
+ const output: string[] = [];
14
+ contents.forEach((c) => {
15
+ if (c.length === 0) return;
16
+ else if (output.length === 0) output.push(...c);
17
+ else output.push("", ...c);
18
+ });
19
+ return output;
20
+ }
21
+ }
@@ -0,0 +1,44 @@
1
+ import { AutoBeFunctionCallingMetric } from "@autobe/interface";
2
+
3
+ export namespace AutoBeFunctionCallingMetricFactory {
4
+ export const create = (): AutoBeFunctionCallingMetric => ({
5
+ attempt: 0,
6
+ success: 0,
7
+ consent: 0,
8
+ validationFailure: 0,
9
+ invalidJson: 0,
10
+ });
11
+
12
+ export const increment = (
13
+ x: AutoBeFunctionCallingMetric,
14
+ y: AutoBeFunctionCallingMetric,
15
+ ): void => {
16
+ x.attempt += y.attempt;
17
+ x.success += y.success;
18
+ x.consent += y.consent;
19
+ x.validationFailure += y.validationFailure;
20
+ x.invalidJson += y.invalidJson;
21
+ };
22
+
23
+ export const plus = (
24
+ x: AutoBeFunctionCallingMetric,
25
+ y: AutoBeFunctionCallingMetric,
26
+ ): AutoBeFunctionCallingMetric => ({
27
+ attempt: x.attempt + y.attempt,
28
+ success: x.success + y.success,
29
+ consent: x.consent + y.consent,
30
+ validationFailure: x.validationFailure + y.validationFailure,
31
+ invalidJson: x.invalidJson + y.invalidJson,
32
+ });
33
+
34
+ export const minus = (
35
+ x: AutoBeFunctionCallingMetric,
36
+ y: AutoBeFunctionCallingMetric,
37
+ ): AutoBeFunctionCallingMetric => ({
38
+ attempt: x.attempt - y.attempt,
39
+ success: x.success - y.success,
40
+ consent: x.consent - y.consent,
41
+ validationFailure: x.validationFailure - y.validationFailure,
42
+ invalidJson: x.invalidJson - y.invalidJson,
43
+ });
44
+ }
@@ -0,0 +1,152 @@
1
+ import {
2
+ AutoBeAggregateEventBase,
3
+ AutoBePhase,
4
+ AutoBeProcessAggregate,
5
+ AutoBeProcessAggregateCollection,
6
+ } from "@autobe/interface";
7
+
8
+ import { AutoBeFunctionCallingMetricFactory } from "./AutoBeFunctionCallingMetricFactory";
9
+ import { TokenUsageComputer } from "./TokenUsageComputer";
10
+
11
+ export namespace AutoBeProcessAggregateFactory {
12
+ export const createAggregate = (): AutoBeProcessAggregate => ({
13
+ metric: AutoBeFunctionCallingMetricFactory.create(),
14
+ tokenUsage: {
15
+ total: 0,
16
+ input: {
17
+ total: 0,
18
+ cached: 0,
19
+ },
20
+ output: {
21
+ total: 0,
22
+ reasoning: 0,
23
+ accepted_prediction: 0,
24
+ rejected_prediction: 0,
25
+ },
26
+ },
27
+ });
28
+
29
+ export const createCollection = <
30
+ Phase extends AutoBePhase | "all",
31
+ >(): AutoBeProcessAggregateCollection<Phase> =>
32
+ ({
33
+ total: createAggregate(),
34
+ }) satisfies AutoBeProcessAggregateCollection as AutoBeProcessAggregateCollection<Phase>;
35
+
36
+ export const computeTotal = <Phase extends AutoBePhase | "all">(
37
+ collection: AutoBeProcessAggregateCollection<Phase>,
38
+ ): AutoBeProcessAggregate => {
39
+ const total: AutoBeProcessAggregate = createAggregate();
40
+ for (const [key, value] of Object.entries(collection)) {
41
+ if (key === "total") continue;
42
+ AutoBeFunctionCallingMetricFactory.increment(total.metric, value.metric);
43
+ TokenUsageComputer.increment(total.tokenUsage, value.tokenUsage);
44
+ }
45
+ return total;
46
+ };
47
+
48
+ export const emplaceEvent = <
49
+ Event extends AutoBeAggregateEventBase & {
50
+ type: string;
51
+ },
52
+ >(
53
+ collection: AutoBeProcessAggregateCollection,
54
+ event: Event,
55
+ ): void => {
56
+ (collection as any)[event.type] ??= createAggregate();
57
+ collection.total ??= computeTotal(collection);
58
+
59
+ const local: AutoBeProcessAggregate = (collection as any)[
60
+ event.type
61
+ ] as AutoBeProcessAggregate;
62
+ const total: AutoBeProcessAggregate = collection.total;
63
+
64
+ AutoBeFunctionCallingMetricFactory.increment(local.metric, event.metric);
65
+ AutoBeFunctionCallingMetricFactory.increment(total.metric, event.metric);
66
+ TokenUsageComputer.increment(local.tokenUsage, event.tokenUsage);
67
+ TokenUsageComputer.increment(total.tokenUsage, event.tokenUsage);
68
+ };
69
+
70
+ export const filterPhase = <Phase extends AutoBePhase>(
71
+ collection: AutoBeProcessAggregateCollection,
72
+ phase: Phase,
73
+ ): AutoBeProcessAggregateCollection<Phase> => {
74
+ const result: AutoBeProcessAggregateCollection<Phase> = createCollection();
75
+ for (const [key, value] of Object.entries(collection)) {
76
+ if (key === "total") continue;
77
+ else if (key.startsWith(phase) === false) continue;
78
+
79
+ (result as any)[key] = value;
80
+ AutoBeFunctionCallingMetricFactory.increment(
81
+ result.total.metric,
82
+ value.metric,
83
+ );
84
+ TokenUsageComputer.increment(result.total.tokenUsage, value.tokenUsage);
85
+ }
86
+ return result;
87
+ };
88
+
89
+ export const reduce = (
90
+ collections: AutoBeProcessAggregateCollection[],
91
+ ): AutoBeProcessAggregateCollection => {
92
+ const result: AutoBeProcessAggregateCollection = createCollection();
93
+ for (const collection of collections) {
94
+ for (const [key, value] of Object.entries(collection)) {
95
+ if (key === "total") continue;
96
+ (result as any)[key] ??= createAggregate();
97
+ const local: AutoBeProcessAggregate = (result as any)[
98
+ key
99
+ ] as AutoBeProcessAggregate;
100
+ AutoBeFunctionCallingMetricFactory.increment(
101
+ local.metric,
102
+ value.metric,
103
+ );
104
+ TokenUsageComputer.increment(local.tokenUsage, value.tokenUsage);
105
+ AutoBeFunctionCallingMetricFactory.increment(
106
+ result.total.metric,
107
+ value.metric,
108
+ );
109
+ TokenUsageComputer.increment(result.total.tokenUsage, value.tokenUsage);
110
+ }
111
+ }
112
+ result.total ??= createAggregate();
113
+ Object.assign(result.total, computeTotal(result));
114
+ return result;
115
+ };
116
+
117
+ export const increment = (
118
+ x: AutoBeProcessAggregateCollection,
119
+ y: AutoBeProcessAggregateCollection,
120
+ ): void => {
121
+ for (const [key, value] of Object.entries(y)) {
122
+ if (key === "total") continue;
123
+ (x as any)[key] ??= createAggregate();
124
+ const local: AutoBeProcessAggregate = (x as any)[
125
+ key
126
+ ] as AutoBeProcessAggregate;
127
+ AutoBeFunctionCallingMetricFactory.increment(local.metric, value.metric);
128
+ }
129
+ x.total ??= createAggregate();
130
+ Object.assign(x.total, computeTotal(x));
131
+ };
132
+
133
+ export const minus = (
134
+ x: AutoBeProcessAggregateCollection,
135
+ y: AutoBeProcessAggregateCollection,
136
+ ): AutoBeProcessAggregateCollection => {
137
+ const result = JSON.parse(
138
+ JSON.stringify(x),
139
+ ) as AutoBeProcessAggregateCollection;
140
+ for (const [key, value] of Object.entries(y)) {
141
+ if (key === "total") continue;
142
+ (result as any)[key] ??= createAggregate();
143
+ const local: AutoBeProcessAggregate = (result as any)[
144
+ key
145
+ ] as AutoBeProcessAggregate;
146
+ AutoBeFunctionCallingMetricFactory.minus(local.metric, value.metric);
147
+ }
148
+ result.total ??= createAggregate();
149
+ Object.assign(result.total, computeTotal(result));
150
+ return result;
151
+ };
152
+ }
@@ -0,0 +1,49 @@
1
+ import { IAutoBeTokenUsageJson } from "@autobe/interface";
2
+
3
+ export namespace TokenUsageComputer {
4
+ export const zero = (): IAutoBeTokenUsageJson.IComponent => ({
5
+ total: 0,
6
+ input: {
7
+ total: 0,
8
+ cached: 0,
9
+ },
10
+ output: {
11
+ total: 0,
12
+ reasoning: 0,
13
+ accepted_prediction: 0,
14
+ rejected_prediction: 0,
15
+ },
16
+ });
17
+
18
+ export const plus = (
19
+ x: IAutoBeTokenUsageJson.IComponent,
20
+ y: IAutoBeTokenUsageJson.IComponent,
21
+ ): IAutoBeTokenUsageJson.IComponent => ({
22
+ total: x.total + y.total,
23
+ input: {
24
+ total: x.input.total + y.input.total,
25
+ cached: x.input.cached + y.input.cached,
26
+ },
27
+ output: {
28
+ total: x.output.total + y.output.total,
29
+ reasoning: x.output.reasoning + y.output.reasoning,
30
+ accepted_prediction:
31
+ x.output.accepted_prediction + y.output.accepted_prediction,
32
+ rejected_prediction:
33
+ x.output.rejected_prediction + y.output.rejected_prediction,
34
+ },
35
+ });
36
+
37
+ export const increment = (
38
+ x: IAutoBeTokenUsageJson.IComponent,
39
+ y: IAutoBeTokenUsageJson.IComponent,
40
+ ): void => {
41
+ x.total += y.total;
42
+ x.input.total += y.input.total;
43
+ x.input.cached += y.input.cached;
44
+ x.output.total += y.output.total;
45
+ x.output.reasoning += y.output.reasoning;
46
+ x.output.accepted_prediction += y.output.accepted_prediction;
47
+ x.output.rejected_prediction += y.output.rejected_prediction;
48
+ };
49
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./AutoBeFunctionCallingMetricFactory";
2
+ export * from "./AutoBeProcessAggregateFactory";
3
+ export * from "./TokenUsageComputer";
package/src/index.ts CHANGED
@@ -1,5 +1,9 @@
1
+ export * from "./aggregate";
2
+
3
+ export * from "./prisma";
1
4
  export * from "./interface";
2
5
  export * from "./test";
3
6
 
7
+ export * from "./ArrayUtil";
4
8
  export * from "./MapUtil";
5
9
  export * from "./StringUtil";
@@ -0,0 +1 @@
1
+ export * from "./writePrismaApplication";