import { Module } from "@nestjs/common"; import { log } from "@kokorone/shared"; import { PrismaModule } from "../prisma/prisma.module.js"; import { EmotionModule } from "../emotion/emotion.module.js"; import { RelationshipModule } from "../relationship/relationship.module.js"; import { MemoryModule } from "../memory/memory.module.js"; import { ScheduleModule } from "../schedule/schedule.module.js"; import { MockProvider } from "./mock-provider.service.js"; import { ClaudeProvider } from "./claude-provider.service.js"; import { LLM_PROVIDER } from "./llm-provider.js"; import { OutputFilterService } from "./output-filter.service.js"; import { FastChannelDetector } from "./fast-channel.service.js"; import { BehaviorReinforcementService } from "./behavior-reinforcement.service.js"; import { ContextAssemblerService } from "./context-assembler.service.js"; import { DialogueService } from "./dialogue.service.js"; import { DialogueController } from "./dialogue.controller.js"; // F-2 Provider 切換:LLM_PROVIDER=mock|claude 決定注入哪個實作,切換不動引擎任何一行。 // R-3:ClaudeProvider 已接上真實 API,這裡不再需要特別的「尚未實作」警告。 function llmProviderFactory(mock: MockProvider, claude: ClaudeProvider) { const providerName = process.env.LLM_PROVIDER ?? "mock"; if (providerName === "claude") { log("啟動", "INF", `LLM_PROVIDER=claude,對話生成將呼叫真實 API(CLAUDE_BASE_URL=${process.env.CLAUDE_BASE_URL ?? "http://localhost:3000/api/v1"})`); return claude; } return mock; } @Module({ imports: [PrismaModule, EmotionModule, RelationshipModule, MemoryModule, ScheduleModule], controllers: [DialogueController], providers: [ MockProvider, ClaudeProvider, { provide: LLM_PROVIDER, useFactory: llmProviderFactory, inject: [MockProvider, ClaudeProvider] }, OutputFilterService, FastChannelDetector, BehaviorReinforcementService, ContextAssemblerService, DialogueService, ], exports: [DialogueService, BehaviorReinforcementService, LLM_PROVIDER], }) export class LlmModule {}