@flusys/nestjs-ai-assistant
v6.2.0
Published
FLUSYS-native AI assistant: JWT + IAM wired mcp-core chat, tools, pinned results, chat history
Maintainers
Readme
@flusys/nestjs-ai-assistant
Wires the external @flusys/ai-assistant-core MCP platform (chat sessions, tool registry, pluggable
AI providers) into FLUSYS's own JWT auth, IAM permissions, and POST-only RPC conventions.
This package never imports @flusys/nestjs-auth or @flusys/nestjs-iam directly — it depends only
on @flusys/nestjs-core and @flusys/nestjs-shared, same independence rule as every other FLUSYS
feature package. Auth/IAM integration happens through two provider-interface tokens defined in
@flusys/nestjs-shared/interfaces that the consuming app must supply.
Usage
import { AiAssistantModule } from '@flusys/nestjs-ai-assistant';
import { AI_ASSISTANT_AUTH_PROVIDER, AI_ASSISTANT_TOOL_PROVIDER } from '@flusys/nestjs-shared';
@Module({
imports: [
AiAssistantModule.forRootAsync({
bootstrapAppConfig,
useFactory: () => ({ defaultDatabaseConfig, tenantDefaultDatabaseConfig, tenants }),
}),
],
providers: [
{
provide: AI_ASSISTANT_AUTH_PROVIDER,
useFactory: (jwtService: JwtService, permissionService: PermissionService) => ({
resolveAuthContext: async (token: string | null) => {
if (!token) return { userId: 'guest', role: 'guest', permissions: [] };
const payload = jwtService.verify(token);
const perms = await permissionService.getMyPermissions(payload.sub, payload.branchId, payload.companyId);
return {
userId: payload.sub,
role: payload.role ?? 'user',
permissions: perms.actionCodes,
companyId: payload.companyId,
branchId: payload.branchId,
};
},
}),
inject: [JwtService, PermissionService],
},
// Merge tool arrays from any feature package here before providing them once.
{ provide: AI_ASSISTANT_TOOL_PROVIDER, useValue: [] },
],
})
export class AppModule {}Environment variables
Read by @flusys/ai-assistant-core/ai-providers' createProviderFromEnv():
| Var | Purpose | Default |
| --- | --- | --- |
| AI_PROVIDER | claude | openai | groq | gemini | groq |
| AI_MODEL | Overrides the provider's default model | provider-specific |
| ANTHROPIC_API_KEY / OPENAI_API_KEY / GROQ_API_KEY / GEMINI_API_KEY | Credential for the selected provider | — |
Endpoints (POST-only, @Controller('ai-assistant'))
POST ai-assistant/chat—{ message, conversationId }POST ai-assistant/pin— save a pinned chat replyPOST ai-assistant/pin/:id/sync— re-run the pin's source tool and append a live snapshotPOST ai-assistant/pinned/get-allPOST ai-assistant/history/get-all—{ allUsers? },allUsersrequiresai-assistant.view-all-historyPOST ai-assistant/run-tool—{ tool, args? }
All require ai-assistant.use, guarded by JwtAuthGuard + PermissionGuard.
Entities
AiPinnedResult / AiPinnedResultWithCompany, AiChatHistory / AiChatHistoryWithCompany —
selected via the same bootstrapAppConfig.enableCompanyFeature flag every other module uses.
