@carlonicora/nestjs-neo4jsonapi 2.7.2 → 2.8.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/config/base.config.d.ts.map +1 -1
- package/dist/config/base.config.js +4 -0
- package/dist/config/base.config.js.map +1 -1
- package/dist/config/interfaces/config.ai.interface.d.ts +5 -0
- package/dist/config/interfaces/config.ai.interface.d.ts.map +1 -1
- package/dist/core/llm/index.d.ts +2 -0
- package/dist/core/llm/index.d.ts.map +1 -1
- package/dist/core/llm/index.js +2 -0
- package/dist/core/llm/index.js.map +1 -1
- package/dist/core/llm/interfaces/ai-candidate.interface.d.ts +32 -0
- package/dist/core/llm/interfaces/ai-candidate.interface.d.ts.map +1 -0
- package/dist/core/llm/interfaces/ai-candidate.interface.js +15 -0
- package/dist/core/llm/interfaces/ai-candidate.interface.js.map +1 -0
- package/dist/core/llm/llm.module.d.ts.map +1 -1
- package/dist/core/llm/llm.module.js +6 -1
- package/dist/core/llm/llm.module.js.map +1 -1
- package/dist/core/llm/services/ai-connection-resolver.service.d.ts +107 -0
- package/dist/core/llm/services/ai-connection-resolver.service.d.ts.map +1 -0
- package/dist/core/llm/services/ai-connection-resolver.service.js +329 -0
- package/dist/core/llm/services/ai-connection-resolver.service.js.map +1 -0
- package/dist/core/llm/services/embedder.service.d.ts +21 -0
- package/dist/core/llm/services/embedder.service.d.ts.map +1 -1
- package/dist/core/llm/services/embedder.service.js +52 -3
- package/dist/core/llm/services/embedder.service.js.map +1 -1
- package/dist/core/llm/services/llm.service.d.ts +65 -18
- package/dist/core/llm/services/llm.service.d.ts.map +1 -1
- package/dist/core/llm/services/llm.service.js +214 -70
- package/dist/core/llm/services/llm.service.js.map +1 -1
- package/dist/core/llm/services/model.service.d.ts +79 -2
- package/dist/core/llm/services/model.service.d.ts.map +1 -1
- package/dist/core/llm/services/model.service.js +289 -31
- package/dist/core/llm/services/model.service.js.map +1 -1
- package/dist/core/llm/services/vision.llm.service.d.ts +25 -1
- package/dist/core/llm/services/vision.llm.service.d.ts.map +1 -1
- package/dist/core/llm/services/vision.llm.service.js +74 -33
- package/dist/core/llm/services/vision.llm.service.js.map +1 -1
- package/dist/foundations/ai-connection/ai-connection.module.d.ts +5 -0
- package/dist/foundations/ai-connection/ai-connection.module.d.ts.map +1 -0
- package/dist/foundations/ai-connection/ai-connection.module.js +37 -0
- package/dist/foundations/ai-connection/ai-connection.module.js.map +1 -0
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.d.ts +32 -0
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.d.ts.map +1 -0
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.js +162 -0
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.js.map +1 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.post.dto.d.ts +41 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.post.dto.d.ts.map +1 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.post.dto.js +189 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.post.dto.js.map +1 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.put.dto.d.ts +42 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.put.dto.d.ts.map +1 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.put.dto.js +179 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.put.dto.js.map +1 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.reorder.dto.d.ts +8 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.reorder.dto.d.ts.map +1 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.reorder.dto.js +38 -0
- package/dist/foundations/ai-connection/dtos/ai-connection.reorder.dto.js.map +1 -0
- package/dist/foundations/ai-connection/entities/ai-connection.d.ts +57 -0
- package/dist/foundations/ai-connection/entities/ai-connection.d.ts.map +1 -0
- package/dist/foundations/ai-connection/entities/ai-connection.js +73 -0
- package/dist/foundations/ai-connection/entities/ai-connection.js.map +1 -0
- package/dist/foundations/ai-connection/entities/ai-connection.meta.d.ts +3 -0
- package/dist/foundations/ai-connection/entities/ai-connection.meta.d.ts.map +1 -0
- package/dist/foundations/ai-connection/entities/ai-connection.meta.js +10 -0
- package/dist/foundations/ai-connection/entities/ai-connection.meta.js.map +1 -0
- package/dist/foundations/ai-connection/index.d.ts +12 -0
- package/dist/foundations/ai-connection/index.d.ts.map +1 -0
- package/dist/foundations/ai-connection/index.js +35 -0
- package/dist/foundations/ai-connection/index.js.map +1 -0
- package/dist/foundations/ai-connection/registry/ai-provider.registry.d.ts +54 -0
- package/dist/foundations/ai-connection/registry/ai-provider.registry.d.ts.map +1 -0
- package/dist/foundations/ai-connection/registry/ai-provider.registry.js +255 -0
- package/dist/foundations/ai-connection/registry/ai-provider.registry.js.map +1 -0
- package/dist/foundations/ai-connection/repositories/ai-connection.repository.d.ts +52 -0
- package/dist/foundations/ai-connection/repositories/ai-connection.repository.d.ts.map +1 -0
- package/dist/foundations/ai-connection/repositories/ai-connection.repository.js +85 -0
- package/dist/foundations/ai-connection/repositories/ai-connection.repository.js.map +1 -0
- package/dist/foundations/ai-connection/services/ai-connection-encryption.service.d.ts +52 -0
- package/dist/foundations/ai-connection/services/ai-connection-encryption.service.d.ts.map +1 -0
- package/dist/foundations/ai-connection/services/ai-connection-encryption.service.js +148 -0
- package/dist/foundations/ai-connection/services/ai-connection-encryption.service.js.map +1 -0
- package/dist/foundations/ai-connection/services/ai-connection.service.d.ts +79 -0
- package/dist/foundations/ai-connection/services/ai-connection.service.d.ts.map +1 -0
- package/dist/foundations/ai-connection/services/ai-connection.service.js +184 -0
- package/dist/foundations/ai-connection/services/ai-connection.service.js.map +1 -0
- package/dist/foundations/foundations.modules.d.ts.map +1 -1
- package/dist/foundations/foundations.modules.js +2 -0
- package/dist/foundations/foundations.modules.js.map +1 -1
- package/dist/foundations/index.d.ts +1 -0
- package/dist/foundations/index.d.ts.map +1 -1
- package/dist/foundations/index.js +1 -0
- package/dist/foundations/index.js.map +1 -1
- package/dist/foundations/tokenusage/services/tokenusage.service.d.ts +29 -0
- package/dist/foundations/tokenusage/services/tokenusage.service.d.ts.map +1 -1
- package/dist/foundations/tokenusage/services/tokenusage.service.js +15 -3
- package/dist/foundations/tokenusage/services/tokenusage.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,148 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.AiConnectionEncryptionService = void 0;
|
|
43
|
+
const common_1 = require("@nestjs/common");
|
|
44
|
+
const crypto = __importStar(require("crypto"));
|
|
45
|
+
const base_config_1 = require("../../../config/base.config");
|
|
46
|
+
/**
|
|
47
|
+
* AI Connection Encryption Service
|
|
48
|
+
*
|
|
49
|
+
* Provides AES-256-GCM encryption/decryption for AI connection secrets
|
|
50
|
+
* (`apiKey`, `googleCredentialsBase64`). Secrets are encrypted before storage in
|
|
51
|
+
* Neo4j and decrypted only when the resolver builds a candidate — they are never
|
|
52
|
+
* serialised back over the API.
|
|
53
|
+
*
|
|
54
|
+
* Mirrors {@link TotpEncryptionService} (the in-package AES-256-GCM canonical),
|
|
55
|
+
* keyed from `encryption.key` (ENCRYPTION_KEY) instead of the TOTP key.
|
|
56
|
+
*
|
|
57
|
+
* Format: IV (12 bytes) + AuthTag (16 bytes) + Ciphertext (base64 encoded)
|
|
58
|
+
*/
|
|
59
|
+
let AiConnectionEncryptionService = class AiConnectionEncryptionService {
|
|
60
|
+
constructor() {
|
|
61
|
+
this.algorithm = "aes-256-gcm";
|
|
62
|
+
this.ivLength = 12; // 96 bits for GCM
|
|
63
|
+
this.authTagLength = 16; // 128 bits
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Whether a key is configured at all. Writing a secret without one must fail
|
|
67
|
+
* loudly at the admin API (fail-closed on write, fail-open on read).
|
|
68
|
+
*/
|
|
69
|
+
isConfigured() {
|
|
70
|
+
return !!base_config_1.baseConfig.encryption.key;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get the encryption key from config.
|
|
74
|
+
* The key must be exactly 32 bytes (256 bits) for AES-256.
|
|
75
|
+
*/
|
|
76
|
+
getKey() {
|
|
77
|
+
const keyString = base_config_1.baseConfig.encryption.key;
|
|
78
|
+
if (!keyString) {
|
|
79
|
+
throw new Error("ENCRYPTION_KEY is not configured — cannot store AI connection secrets");
|
|
80
|
+
}
|
|
81
|
+
// If the key is hex-encoded (64 chars = 32 bytes), decode it
|
|
82
|
+
if (keyString.length === 64 && /^[0-9a-fA-F]+$/.test(keyString)) {
|
|
83
|
+
return Buffer.from(keyString, "hex");
|
|
84
|
+
}
|
|
85
|
+
// If the key is base64-encoded
|
|
86
|
+
if (keyString.length === 44 && keyString.endsWith("=")) {
|
|
87
|
+
const decoded = Buffer.from(keyString, "base64");
|
|
88
|
+
if (decoded.length === 32) {
|
|
89
|
+
return decoded;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Otherwise, derive a 32-byte key using SHA-256
|
|
93
|
+
return crypto.createHash("sha256").update(keyString).digest();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Encrypt an AI connection secret using AES-256-GCM.
|
|
97
|
+
*
|
|
98
|
+
* @param plaintext - The secret to encrypt (API key or base64 GCP credentials)
|
|
99
|
+
* @returns The encrypted secret as a base64-encoded string containing IV, auth tag, and ciphertext
|
|
100
|
+
*/
|
|
101
|
+
encrypt(plaintext) {
|
|
102
|
+
const key = this.getKey();
|
|
103
|
+
const iv = crypto.randomBytes(this.ivLength);
|
|
104
|
+
const cipher = crypto.createCipheriv(this.algorithm, key, iv);
|
|
105
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
|
|
106
|
+
const authTag = cipher.getAuthTag();
|
|
107
|
+
// Combine IV + AuthTag + Ciphertext
|
|
108
|
+
const combined = Buffer.concat([iv, authTag, encrypted]);
|
|
109
|
+
return combined.toString("base64");
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Decrypt an AI connection secret encrypted with AES-256-GCM.
|
|
113
|
+
*
|
|
114
|
+
* @param ciphertext - The base64-encoded encrypted secret (IV + AuthTag + Ciphertext)
|
|
115
|
+
* @returns The decrypted secret
|
|
116
|
+
* @throws Error if decryption fails (invalid key, corrupted data, or tampered data)
|
|
117
|
+
*/
|
|
118
|
+
decrypt(ciphertext) {
|
|
119
|
+
const key = this.getKey();
|
|
120
|
+
const combined = Buffer.from(ciphertext, "base64");
|
|
121
|
+
// Extract IV, AuthTag, and encrypted data
|
|
122
|
+
const iv = combined.subarray(0, this.ivLength);
|
|
123
|
+
const authTag = combined.subarray(this.ivLength, this.ivLength + this.authTagLength);
|
|
124
|
+
const encrypted = combined.subarray(this.ivLength + this.authTagLength);
|
|
125
|
+
const decipher = crypto.createDecipheriv(this.algorithm, key, iv);
|
|
126
|
+
decipher.setAuthTag(authTag);
|
|
127
|
+
const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
|
|
128
|
+
return decrypted.toString("utf8");
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Verify that the encryption system is properly configured.
|
|
132
|
+
* Performs a round-trip encryption/decryption test.
|
|
133
|
+
*
|
|
134
|
+
* @returns true if encryption is working correctly
|
|
135
|
+
* @throws Error if encryption is not properly configured
|
|
136
|
+
*/
|
|
137
|
+
verify() {
|
|
138
|
+
const testData = "test-secret-" + crypto.randomBytes(8).toString("hex");
|
|
139
|
+
const encrypted = this.encrypt(testData);
|
|
140
|
+
const decrypted = this.decrypt(encrypted);
|
|
141
|
+
return decrypted === testData;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
exports.AiConnectionEncryptionService = AiConnectionEncryptionService;
|
|
145
|
+
exports.AiConnectionEncryptionService = AiConnectionEncryptionService = __decorate([
|
|
146
|
+
(0, common_1.Injectable)()
|
|
147
|
+
], AiConnectionEncryptionService);
|
|
148
|
+
//# sourceMappingURL=ai-connection-encryption.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-connection-encryption.service.js","sourceRoot":"","sources":["../../../../src/foundations/ai-connection/services/ai-connection-encryption.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ConfigService } from "@nestjs/config";
|
|
2
|
+
import { EventEmitter2 } from "@nestjs/event-emitter";
|
|
3
|
+
import { ClsService } from "nestjs-cls";
|
|
4
|
+
import { BaseConfigInterface } from "../../../config/interfaces/base.config.interface";
|
|
5
|
+
import { JsonApiService } from "../../../core/jsonapi/services/jsonapi.service";
|
|
6
|
+
import { AbstractService } from "../../../core/neo4j/abstracts/abstract.service";
|
|
7
|
+
import { AiConnection, AiConnectionDescriptor } from "../entities/ai-connection";
|
|
8
|
+
import { AiConnectionRepository } from "../repositories/ai-connection.repository";
|
|
9
|
+
import { AiConnectionEncryptionService } from "./ai-connection-encryption.service";
|
|
10
|
+
export declare class AiConnectionService extends AbstractService<AiConnection, typeof AiConnectionDescriptor.relationships> {
|
|
11
|
+
private readonly aiConnectionRepository;
|
|
12
|
+
private readonly encryption;
|
|
13
|
+
private readonly eventEmitter;
|
|
14
|
+
private readonly configService;
|
|
15
|
+
protected readonly descriptor: import("../../..").EntityDescriptor<AiConnection, {
|
|
16
|
+
company: {
|
|
17
|
+
model: import("../../..").DataMeta;
|
|
18
|
+
direction: "out";
|
|
19
|
+
relationship: string;
|
|
20
|
+
cardinality: "one";
|
|
21
|
+
required: false;
|
|
22
|
+
dtoKey: string;
|
|
23
|
+
immutable: true;
|
|
24
|
+
};
|
|
25
|
+
}>;
|
|
26
|
+
constructor(jsonApiService: JsonApiService, aiConnectionRepository: AiConnectionRepository, clsService: ClsService, encryption: AiConnectionEncryptionService, eventEmitter: EventEmitter2, configService: ConfigService<BaseConfigInterface>);
|
|
27
|
+
/**
|
|
28
|
+
* List with the editor's meta: the provider field registry and the .env
|
|
29
|
+
* defaults per connection type (never secrets) — spec § 3.
|
|
30
|
+
*/
|
|
31
|
+
findAllWithMeta(params: {
|
|
32
|
+
query: any;
|
|
33
|
+
}): Promise<any>;
|
|
34
|
+
/**
|
|
35
|
+
* Create from a JSON:API body: validate against the provider registry,
|
|
36
|
+
* encrypt secrets, persist, then refresh every resolver snapshot.
|
|
37
|
+
*
|
|
38
|
+
* This name shadows `AbstractService.create()`, which `createFromDTO()` calls
|
|
39
|
+
* back into with *mapped repository params* (`{ id, ...fields }`) — routing
|
|
40
|
+
* those through the body path would recurse forever. The shape guard below
|
|
41
|
+
* keeps both entry points working: a JSON:API body always carries `data`,
|
|
42
|
+
* mapped repository params never do.
|
|
43
|
+
*/
|
|
44
|
+
create(body: any, included?: unknown[]): Promise<any>;
|
|
45
|
+
update(body: {
|
|
46
|
+
data: {
|
|
47
|
+
id: string;
|
|
48
|
+
attributes: Record<string, any>;
|
|
49
|
+
[k: string]: any;
|
|
50
|
+
};
|
|
51
|
+
}): Promise<any>;
|
|
52
|
+
reorder(params: {
|
|
53
|
+
ids: string[];
|
|
54
|
+
}): Promise<void>;
|
|
55
|
+
deleteConnection(params: {
|
|
56
|
+
id: string;
|
|
57
|
+
}): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* The inherited `AbstractService.delete()` enforces company ownership
|
|
60
|
+
* (`clsService.companyId === entity.company?.id`). That check is meaningless
|
|
61
|
+
* here and would reject every delete: this entity is `isCompanyScoped: false`
|
|
62
|
+
* and its `company` edge is the CONFIGURES *target* (the company a chain is
|
|
63
|
+
* scoped TO), not an owner — a global connection has no company at all, so
|
|
64
|
+
* `"" !== undefined` would always throw ForbiddenException.
|
|
65
|
+
*
|
|
66
|
+
* Authorisation is enforced at the controller (`AdminJwtAuthGuard` +
|
|
67
|
+
* `@Roles(RoleId.Administrator)`), matching every other admin-only foundation.
|
|
68
|
+
*/
|
|
69
|
+
delete(params: {
|
|
70
|
+
id: string;
|
|
71
|
+
}): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Registry validation + secret encryption. `onlyEncrypt` limits encryption to
|
|
74
|
+
* the secrets this request actually supplied (update path: kept secrets are
|
|
75
|
+
* already ciphertext).
|
|
76
|
+
*/
|
|
77
|
+
private validateAndEncrypt;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=ai-connection.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-connection.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/ai-connection/services/ai-connection.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAEvF,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAMhF,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAInF,qBACa,mBAAoB,SAAQ,eAAe,CAAC,YAAY,EAAE,OAAO,sBAAsB,CAAC,aAAa,CAAC;IAK/G,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAEvC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IARhC,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;OAA0B;gBAGrD,cAAc,EAAE,cAAc,EACb,sBAAsB,EAAE,sBAAsB,EAC/D,UAAU,EAAE,UAAU,EACL,UAAU,EAAE,6BAA6B,EACzC,YAAY,EAAE,aAAa,EAC3B,aAAa,EAAE,aAAa,CAAC,mBAAmB,CAAC;IAKpE;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAiC3D;;;;;;;;;OASG;IACG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IASrD,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAAC,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IA6BvG,OAAO,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD,gBAAgB,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7D;;;;;;;;;;OAUG;IACG,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CAiB3B"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AiConnectionService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const config_1 = require("@nestjs/config");
|
|
15
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
16
|
+
const nestjs_cls_1 = require("nestjs-cls");
|
|
17
|
+
const jsonapi_service_1 = require("../../../core/jsonapi/services/jsonapi.service");
|
|
18
|
+
const ai_candidate_interface_1 = require("../../../core/llm/interfaces/ai-candidate.interface");
|
|
19
|
+
const abstract_service_1 = require("../../../core/neo4j/abstracts/abstract.service");
|
|
20
|
+
const ai_connection_1 = require("../entities/ai-connection");
|
|
21
|
+
const ai_provider_registry_1 = require("../registry/ai-provider.registry");
|
|
22
|
+
const ai_connection_repository_1 = require("../repositories/ai-connection.repository");
|
|
23
|
+
const ai_connection_encryption_service_1 = require("./ai-connection-encryption.service");
|
|
24
|
+
const SECRET_FIELDS = ["apiKey", "googleCredentialsBase64"];
|
|
25
|
+
let AiConnectionService = class AiConnectionService extends abstract_service_1.AbstractService {
|
|
26
|
+
constructor(jsonApiService, aiConnectionRepository, clsService, encryption, eventEmitter, configService) {
|
|
27
|
+
super(jsonApiService, aiConnectionRepository, clsService, ai_connection_1.AiConnectionDescriptor.model);
|
|
28
|
+
this.aiConnectionRepository = aiConnectionRepository;
|
|
29
|
+
this.encryption = encryption;
|
|
30
|
+
this.eventEmitter = eventEmitter;
|
|
31
|
+
this.configService = configService;
|
|
32
|
+
this.descriptor = ai_connection_1.AiConnectionDescriptor;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* List with the editor's meta: the provider field registry and the .env
|
|
36
|
+
* defaults per connection type (never secrets) — spec § 3.
|
|
37
|
+
*/
|
|
38
|
+
async findAllWithMeta(params) {
|
|
39
|
+
const response = await this.find({ query: params.query, fetchAll: true });
|
|
40
|
+
const ai = this.configService.get("ai");
|
|
41
|
+
const envBlockFor = (type) => {
|
|
42
|
+
switch (type) {
|
|
43
|
+
case "aiLite":
|
|
44
|
+
return ai?.aiLite;
|
|
45
|
+
case "aiLarge":
|
|
46
|
+
return ai?.aiLarge;
|
|
47
|
+
case "vision":
|
|
48
|
+
return ai?.vision;
|
|
49
|
+
case "audio":
|
|
50
|
+
return ai?.audio;
|
|
51
|
+
case "embedder":
|
|
52
|
+
return ai?.embedder;
|
|
53
|
+
case "transcriber":
|
|
54
|
+
return ai?.transcriber;
|
|
55
|
+
case "documentAi":
|
|
56
|
+
return ai?.documentAi;
|
|
57
|
+
default:
|
|
58
|
+
return ai?.ai;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const envDefaults = Object.fromEntries(ai_candidate_interface_1.AI_CONNECTION_TYPES.map((type) => {
|
|
62
|
+
const block = envBlockFor(type);
|
|
63
|
+
return [type, { provider: block?.provider, model: block?.model, url: block?.url }];
|
|
64
|
+
}));
|
|
65
|
+
response.meta = { ...(response.meta ?? {}), providerRegistry: ai_provider_registry_1.AI_PROVIDER_REGISTRY, envDefaults };
|
|
66
|
+
return response;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create from a JSON:API body: validate against the provider registry,
|
|
70
|
+
* encrypt secrets, persist, then refresh every resolver snapshot.
|
|
71
|
+
*
|
|
72
|
+
* This name shadows `AbstractService.create()`, which `createFromDTO()` calls
|
|
73
|
+
* back into with *mapped repository params* (`{ id, ...fields }`) — routing
|
|
74
|
+
* those through the body path would recurse forever. The shape guard below
|
|
75
|
+
* keeps both entry points working: a JSON:API body always carries `data`,
|
|
76
|
+
* mapped repository params never do.
|
|
77
|
+
*/
|
|
78
|
+
async create(body, included) {
|
|
79
|
+
if (!body?.data)
|
|
80
|
+
return super.create(body, included);
|
|
81
|
+
this.validateAndEncrypt(body.data.attributes);
|
|
82
|
+
const response = await this.createFromDTO({ data: body.data });
|
|
83
|
+
this.eventEmitter.emit(ai_candidate_interface_1.AI_CONNECTIONS_CHANGED_EVENT);
|
|
84
|
+
return response;
|
|
85
|
+
}
|
|
86
|
+
async update(body) {
|
|
87
|
+
const existing = await this.aiConnectionRepository.findById({ id: body.data.id });
|
|
88
|
+
// Blank/omitted secret = keep the stored (already encrypted) value; a
|
|
89
|
+
// supplied one is validated + re-encrypted (spec § Decisions "Secrets").
|
|
90
|
+
const attributes = body.data.attributes;
|
|
91
|
+
const suppliedSecrets = new Set();
|
|
92
|
+
for (const field of SECRET_FIELDS) {
|
|
93
|
+
const value = attributes[field];
|
|
94
|
+
if (value === undefined || value === null || value === "") {
|
|
95
|
+
const stored = existing?.[field];
|
|
96
|
+
if (stored === undefined || stored === null) {
|
|
97
|
+
// No stored value either: the key must be ABSENT, not undefined — the
|
|
98
|
+
// PUT query builder emits a SET term for every present key while the
|
|
99
|
+
// param mapper strips undefined values, so an undefined key produces
|
|
100
|
+
// "Neo4jError: Expected parameter(s): <field>".
|
|
101
|
+
delete attributes[field];
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
attributes[field] = stored;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
suppliedSecrets.add(field);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
this.validateAndEncrypt(attributes, suppliedSecrets);
|
|
112
|
+
const response = await this.putFromDTO({ data: body.data });
|
|
113
|
+
this.eventEmitter.emit(ai_candidate_interface_1.AI_CONNECTIONS_CHANGED_EVENT);
|
|
114
|
+
return response;
|
|
115
|
+
}
|
|
116
|
+
async reorder(params) {
|
|
117
|
+
// A reorder is defined over exactly one chain (connectionType + scope) —
|
|
118
|
+
// a malformed request mixing chains would scramble positions across them.
|
|
119
|
+
const connections = await this.aiConnectionRepository.findByIds({ ids: params.ids });
|
|
120
|
+
if (connections.length !== params.ids.length) {
|
|
121
|
+
throw new common_1.BadRequestException("One or more connections in the reorder request do not exist");
|
|
122
|
+
}
|
|
123
|
+
const chains = new Set(connections.map((c) => `${c.connectionType}|${c.companyId ?? "global"}`));
|
|
124
|
+
if (chains.size > 1) {
|
|
125
|
+
throw new common_1.BadRequestException("Reorder must target a single chain (one connection type and scope)");
|
|
126
|
+
}
|
|
127
|
+
await this.aiConnectionRepository.updatePositions({ ids: params.ids });
|
|
128
|
+
this.eventEmitter.emit(ai_candidate_interface_1.AI_CONNECTIONS_CHANGED_EVENT);
|
|
129
|
+
}
|
|
130
|
+
async deleteConnection(params) {
|
|
131
|
+
await this.delete({ id: params.id });
|
|
132
|
+
this.eventEmitter.emit(ai_candidate_interface_1.AI_CONNECTIONS_CHANGED_EVENT);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The inherited `AbstractService.delete()` enforces company ownership
|
|
136
|
+
* (`clsService.companyId === entity.company?.id`). That check is meaningless
|
|
137
|
+
* here and would reject every delete: this entity is `isCompanyScoped: false`
|
|
138
|
+
* and its `company` edge is the CONFIGURES *target* (the company a chain is
|
|
139
|
+
* scoped TO), not an owner — a global connection has no company at all, so
|
|
140
|
+
* `"" !== undefined` would always throw ForbiddenException.
|
|
141
|
+
*
|
|
142
|
+
* Authorisation is enforced at the controller (`AdminJwtAuthGuard` +
|
|
143
|
+
* `@Roles(RoleId.Administrator)`), matching every other admin-only foundation.
|
|
144
|
+
*/
|
|
145
|
+
async delete(params) {
|
|
146
|
+
const entity = await this.aiConnectionRepository.findById({ id: params.id });
|
|
147
|
+
if (!entity)
|
|
148
|
+
throw new common_1.NotFoundException();
|
|
149
|
+
await this.aiConnectionRepository.delete({ id: params.id });
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Registry validation + secret encryption. `onlyEncrypt` limits encryption to
|
|
153
|
+
* the secrets this request actually supplied (update path: kept secrets are
|
|
154
|
+
* already ciphertext).
|
|
155
|
+
*/
|
|
156
|
+
validateAndEncrypt(attributes, onlyEncrypt) {
|
|
157
|
+
(0, ai_provider_registry_1.validateAiConnectionAttributes)({
|
|
158
|
+
connectionType: attributes.connectionType,
|
|
159
|
+
provider: attributes.provider,
|
|
160
|
+
attributes,
|
|
161
|
+
});
|
|
162
|
+
for (const field of SECRET_FIELDS) {
|
|
163
|
+
const value = attributes[field];
|
|
164
|
+
const mustEncrypt = value !== undefined && value !== null && value !== "" && (!onlyEncrypt || onlyEncrypt.has(field));
|
|
165
|
+
if (!mustEncrypt)
|
|
166
|
+
continue;
|
|
167
|
+
if (!this.encryption.isConfigured()) {
|
|
168
|
+
throw new common_1.BadRequestException("ENCRYPTION_KEY is not configured — cannot store AI connection secrets");
|
|
169
|
+
}
|
|
170
|
+
attributes[field] = this.encryption.encrypt(String(value));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
exports.AiConnectionService = AiConnectionService;
|
|
175
|
+
exports.AiConnectionService = AiConnectionService = __decorate([
|
|
176
|
+
(0, common_1.Injectable)(),
|
|
177
|
+
__metadata("design:paramtypes", [jsonapi_service_1.JsonApiService,
|
|
178
|
+
ai_connection_repository_1.AiConnectionRepository,
|
|
179
|
+
nestjs_cls_1.ClsService,
|
|
180
|
+
ai_connection_encryption_service_1.AiConnectionEncryptionService,
|
|
181
|
+
event_emitter_1.EventEmitter2,
|
|
182
|
+
config_1.ConfigService])
|
|
183
|
+
], AiConnectionService);
|
|
184
|
+
//# sourceMappingURL=ai-connection.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-connection.service.js","sourceRoot":"","sources":["../../../../src/foundations/ai-connection/services/ai-connection.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foundations.modules.d.ts","sourceRoot":"","sources":["../../src/foundations/foundations.modules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAU,IAAI,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"foundations.modules.d.ts","sourceRoot":"","sources":["../../src/foundations/foundations.modules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAU,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAU7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAE1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AA2BvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,2DAA2D,CAAC;AAGrG;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kEAAkE;IAClE,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;CACvB;AAmDD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBACa,iBAAiB;IAC5B;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,uBAAuB,GAAG,aAAa;CAoBhE"}
|
|
@@ -9,6 +9,7 @@ var FoundationsModule_1;
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.FoundationsModule = void 0;
|
|
11
11
|
const common_1 = require("@nestjs/common");
|
|
12
|
+
const ai_connection_module_1 = require("./ai-connection/ai-connection.module");
|
|
12
13
|
const assistant_module_1 = require("./assistant/assistant.module");
|
|
13
14
|
const atomicfact_module_1 = require("./atomicfact/atomicfact.module");
|
|
14
15
|
const audit_module_1 = require("./audit/audit.module");
|
|
@@ -51,6 +52,7 @@ const waitlist_module_1 = require("./waitlist/waitlist.module");
|
|
|
51
52
|
* Queue registration is handled centrally by QueueModule (via baseConfig.chunkQueues).
|
|
52
53
|
*/
|
|
53
54
|
const STATIC_FOUNDATION_MODULES = [
|
|
55
|
+
ai_connection_module_1.AiConnectionModule,
|
|
54
56
|
assistant_module_1.AssistantModule,
|
|
55
57
|
atomicfact_module_1.AtomicFactModule,
|
|
56
58
|
audit_module_1.AuditModule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foundations.modules.js","sourceRoot":"","sources":["../../src/foundations/foundations.modules.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"foundations.modules.js","sourceRoot":"","sources":["../../src/foundations/foundations.modules.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/foundations/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,uBAAuB,CAAC;AAGtC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,MAAM,CAAC;AACrB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/foundations/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,uBAAuB,CAAC;AAGtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,MAAM,CAAC;AACrB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC"}
|
|
@@ -20,6 +20,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
20
20
|
// Centralized FoundationsModule - import all foundation modules with single forRoot()
|
|
21
21
|
__exportStar(require("./foundations.modules"), exports);
|
|
22
22
|
// Individual foundation modules with entities, metas, repositories, and services
|
|
23
|
+
__exportStar(require("./ai-connection"), exports);
|
|
23
24
|
__exportStar(require("./assistant"), exports);
|
|
24
25
|
__exportStar(require("./assistant-action"), exports);
|
|
25
26
|
__exportStar(require("./assistant-message"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/foundations/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,sFAAsF;AACtF,wDAAsC;AAEtC,iFAAiF;AACjF,8CAA4B;AAC5B,qDAAmC;AACnC,sDAAoC;AACpC,+CAA6B;AAC7B,0CAAwB;AACxB,yCAAuB;AACvB,0CAAwB;AACxB,4CAA0B;AAC1B,4CAA0B;AAC1B,8CAA4B;AAC5B,4CAA0B;AAC1B,4CAA0B;AAC1B,iDAA+B;AAC/B,4CAA0B;AAC1B,gDAA8B;AAC9B,2CAAyB;AACzB,+CAA6B;AAC7B,+CAA6B;AAC7B,2CAAyB;AACzB,iDAA+B;AAC/B,0CAAwB;AACxB,yCAAuB;AACvB,6CAA2B;AAC3B,8CAA4B;AAC5B,yCAAuB;AACvB,uCAAqB;AACrB,2CAAyB;AACzB,+CAA6B;AAC7B,+CAA6B;AAC7B,yCAAuB;AACvB,kDAAgC;AAChC,6CAA2B;AAC3B,yCAAuB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/foundations/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,sFAAsF;AACtF,wDAAsC;AAEtC,iFAAiF;AACjF,kDAAgC;AAChC,8CAA4B;AAC5B,qDAAmC;AACnC,sDAAoC;AACpC,+CAA6B;AAC7B,0CAAwB;AACxB,yCAAuB;AACvB,0CAAwB;AACxB,4CAA0B;AAC1B,4CAA0B;AAC1B,8CAA4B;AAC5B,4CAA0B;AAC1B,4CAA0B;AAC1B,iDAA+B;AAC/B,4CAA0B;AAC1B,gDAA8B;AAC9B,2CAAyB;AACzB,+CAA6B;AAC7B,+CAA6B;AAC7B,2CAAyB;AACzB,iDAA+B;AAC/B,0CAAwB;AACxB,yCAAuB;AACvB,6CAA2B;AAC3B,8CAA4B;AAC5B,yCAAuB;AACvB,uCAAqB;AACrB,2CAAyB;AACzB,+CAA6B;AAC7B,+CAA6B;AAC7B,yCAAuB;AACvB,kDAAgC;AAChC,6CAA2B;AAC3B,yCAAuB"}
|
|
@@ -9,6 +9,21 @@ import { AbstractService } from "../../../core/neo4j/abstracts/abstract.service"
|
|
|
9
9
|
import { TokenUsage, TokenUsageDescriptor } from "../../tokenusage/entities/tokenusage";
|
|
10
10
|
import { TokenUsageAggregated, TokenUsageRepository, TokenUsageSummary } from "../../tokenusage/repositories/tokenusage.repository";
|
|
11
11
|
import { ModelWeight } from "../../../core/llm/enums/model.weight";
|
|
12
|
+
/**
|
|
13
|
+
* Per-call cost rates, in euros per 1M tokens, belonging to the AI connection
|
|
14
|
+
* that ACTUALLY served a call.
|
|
15
|
+
*
|
|
16
|
+
* Exists because a call may be served by any link of a DB-backed fallback chain
|
|
17
|
+
* (`AiConnection`), and each link carries its own prices — so the config block
|
|
18
|
+
* for the tier is no longer necessarily the right rate card. Supplied ONLY for
|
|
19
|
+
* candidates whose `source` is `"db"`; an `.env`-sourced candidate passes
|
|
20
|
+
* nothing and keeps the config-block path exactly as before.
|
|
21
|
+
*/
|
|
22
|
+
export interface TokenUsageRatesInterface {
|
|
23
|
+
inputCostPer1MTokens?: number;
|
|
24
|
+
outputCostPer1MTokens?: number;
|
|
25
|
+
cachedInputCostPer1MTokens?: number;
|
|
26
|
+
}
|
|
12
27
|
/**
|
|
13
28
|
* TokenUsage service.
|
|
14
29
|
*
|
|
@@ -43,11 +58,23 @@ export declare class TokenUsageService extends AbstractService<TokenUsage, typeo
|
|
|
43
58
|
* Computes the monetary cost of a call from the per-tier rates in config
|
|
44
59
|
* (`inputCostPer1MTokens` / `outputCostPer1MTokens`). Single source of truth —
|
|
45
60
|
* used both for persistence and for surfacing cost in ephemeral telemetry.
|
|
61
|
+
*
|
|
62
|
+
* `rates` overrides those config rates with the ones belonging to the AI
|
|
63
|
+
* connection that actually served the call (see
|
|
64
|
+
* {@link TokenUsageRatesInterface}). It is passed ONLY for DB-backed
|
|
65
|
+
* connections, so a caller that never configures any keeps the config-block
|
|
66
|
+
* path bit-for-bit. Each rate falls back to the config block individually, so
|
|
67
|
+
* a connection that prices only some fields still bills the rest at the tier
|
|
68
|
+
* rate — EXCEPT the cached rate, which falls back to the EFFECTIVE input rate
|
|
69
|
+
* rather than the config's cached rate: mixing one connection's input price
|
|
70
|
+
* with another's cache discount would price cached tokens above uncached ones.
|
|
46
71
|
*/
|
|
47
72
|
computeCost(params: {
|
|
48
73
|
tokens: TokenUsageInterface;
|
|
49
74
|
useVisionCosts?: boolean;
|
|
50
75
|
modelWeight?: ModelWeight;
|
|
76
|
+
/** Rates of the connection that served the call; overrides the config block. */
|
|
77
|
+
rates?: TokenUsageRatesInterface;
|
|
51
78
|
}): number;
|
|
52
79
|
/**
|
|
53
80
|
* Persists one usage record and converts its monetary cost into billing
|
|
@@ -71,6 +98,8 @@ export declare class TokenUsageService extends AbstractService<TokenUsage, typeo
|
|
|
71
98
|
applyMinimum?: boolean;
|
|
72
99
|
/** Pre-computed cost in euros; when provided `computeCost` is skipped (embeddings: estimated tokens × the embedder rate). */
|
|
73
100
|
costOverride?: number;
|
|
101
|
+
/** Rates of the AI connection that served the call; forwarded to `computeCost`. */
|
|
102
|
+
rates?: TokenUsageRatesInterface;
|
|
74
103
|
}): Promise<void>;
|
|
75
104
|
/**
|
|
76
105
|
* KEPT (custom filtering not covered by inherited find()): date-range + tokenUsageType
|
|
@@ -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,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
|
|
1
|
+
{"version":3,"file":"tokenusage.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/services/tokenusage.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,13 +70,24 @@ let TokenUsageService = TokenUsageService_1 = class TokenUsageService extends ab
|
|
|
70
70
|
* Computes the monetary cost of a call from the per-tier rates in config
|
|
71
71
|
* (`inputCostPer1MTokens` / `outputCostPer1MTokens`). Single source of truth —
|
|
72
72
|
* used both for persistence and for surfacing cost in ephemeral telemetry.
|
|
73
|
+
*
|
|
74
|
+
* `rates` overrides those config rates with the ones belonging to the AI
|
|
75
|
+
* connection that actually served the call (see
|
|
76
|
+
* {@link TokenUsageRatesInterface}). It is passed ONLY for DB-backed
|
|
77
|
+
* connections, so a caller that never configures any keeps the config-block
|
|
78
|
+
* path bit-for-bit. Each rate falls back to the config block individually, so
|
|
79
|
+
* a connection that prices only some fields still bills the rest at the tier
|
|
80
|
+
* rate — EXCEPT the cached rate, which falls back to the EFFECTIVE input rate
|
|
81
|
+
* rather than the config's cached rate: mixing one connection's input price
|
|
82
|
+
* with another's cache discount would price cached tokens above uncached ones.
|
|
73
83
|
*/
|
|
74
84
|
computeCost(params) {
|
|
75
85
|
const costConfig = params.useVisionCosts ? this.aiConfig.vision : this.configForWeight(params.modelWeight);
|
|
76
|
-
const inputRate = costConfig.inputCostPer1MTokens ?? 0;
|
|
77
|
-
const outputRate = costConfig.outputCostPer1MTokens ?? 0;
|
|
86
|
+
const inputRate = params.rates?.inputCostPer1MTokens ?? costConfig.inputCostPer1MTokens ?? 0;
|
|
87
|
+
const outputRate = params.rates?.outputCostPer1MTokens ?? costConfig.outputCostPer1MTokens ?? 0;
|
|
78
88
|
// vision/audio configs have no cached rate → falls back to the full input rate (no discount).
|
|
79
|
-
const
|
|
89
|
+
const configCachedRate = costConfig.cachedInputCostPer1MTokens;
|
|
90
|
+
const cachedRate = params.rates?.cachedInputCostPer1MTokens ?? (params.rates ? inputRate : (configCachedRate ?? inputRate));
|
|
80
91
|
const cached = Math.min(params.tokens.cached ?? 0, params.tokens.input);
|
|
81
92
|
const uncachedInput = params.tokens.input - cached;
|
|
82
93
|
const cost = uncachedInput * inputRate + cached * cachedRate + params.tokens.output * outputRate;
|
|
@@ -99,6 +110,7 @@ let TokenUsageService = TokenUsageService_1 = class TokenUsageService extends ab
|
|
|
99
110
|
tokens: params.tokens,
|
|
100
111
|
useVisionCosts: params.useVisionCosts,
|
|
101
112
|
modelWeight: params.modelWeight,
|
|
113
|
+
rates: params.rates,
|
|
102
114
|
});
|
|
103
115
|
const creditsConfig = this.configService.get("credits");
|
|
104
116
|
let credits = 0;
|
|
@@ -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,2FAAuF;AACvF,oFAAgF;AAChF,qFAAiF;AACjF,qEAAwF;AACxF,+FAI6D;AAC7D,uEAAmE;AACnE,mEAAoG;
|
|
1
|
+
{"version":3,"file":"tokenusage.service.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/services/tokenusage.service.ts"],"names":[],"mappings":"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"}
|