1
20import { Module } from "@nestjs/common";
21import { m } from "@factory/observability";
22import { NotificationsModule } from "../notifications/notifications.module.js";
23import { AiChatService } from "./ai-chat.service.js";
24import { AiController } from "./ai.controller.js";
25import { AiService } from "./ai.service.js";
26import { AI_GATEWAY, buildAiGateway } from "./gateway-provider.js";
27import { AiLedgerService, AI_LEDGER } from "./ledger.service.js";
28import { AiBudgetGuardService } from "./budget-guard.service.js";
29import { AiRateLimitService } from "./ai-rate-limit.js";
30import { AiWritingService } from "./ai-writing.service.js";
31import { AiWritingController } from "./ai-writing.controller.js";
32import { DatabaseAiService } from "./database-ai.service.js";
33import { DatabaseAiController } from "./database-ai.controller.js";
34import { BlocksModule } from "../blocks/blocks.module.js";
35import { DatabasesModule } from "../databases/databases.module.js";
36import { PagesModule } from "../pages/pages.module.js";
37import { SearchModule } from "../search/search.module.js";
38import { TasksModule } from "../tasks/tasks.module.js";
39import { RagService } from "./rag.service.js";
40import { RagController } from "./rag.controller.js";
41import { AiGenerateService } from "./generator/generate.service.js";
42import { AiGenerateController } from "./generator/generate.controller.js";
43import { AssistantService } from "./assistant/assistant.service.js";
44import { AssistantController } from "./assistant/assistant.controller.js";
45
46@Module({
47
48
49
50 imports: [NotificationsModule, BlocksModule, DatabasesModule, PagesModule, SearchModule, TasksModule],
51 controllers: [AiController, AiWritingController, DatabaseAiController, RagController, AiGenerateController, AssistantController],
52 providers: [
53 { provide: AI_LEDGER, useClass: AiLedgerService },
54 AiBudgetGuardService,
55 {
56 provide: AI_GATEWAY,
57
58
59
60
61 inject: [AI_LEDGER],
62 useFactory: (ledger: AiLedgerService) =>
63 buildAiGateway({
64 onBudgetExceeded: () => {
65
66
67
68
69 },
70
71
72
73
74
75
76
77
78
79
80 ledgerSink: (record) => {
81 m.ai.tokens({ direction: "in", model: record.model }, record.tokensIn);
82 m.ai.tokens({ direction: "out", model: record.model }, record.tokensOut);
83 m.ai.request({ model: record.model }, record.latencyMs / 1000);
84 return ledger.record(record);
85 }
86 })
87 },
88 AiService,
89 AiChatService,
90 AiRateLimitService,
91 AiWritingService,
92 DatabaseAiService,
93 RagService,
94 AiGenerateService,
95 AssistantService
96 ],
97 exports: [AiService, AI_GATEWAY, AiBudgetGuardService, AiChatService, AiRateLimitService, AiWritingService, DatabaseAiService, RagService, AiGenerateService, AssistantService]
98})
99export class AiModule {}
100