Files
prowler/ui/lib/lighthouse/workflow.ts
T
2025-08-21 12:40:49 +02:00

166 lines
4.0 KiB
TypeScript

import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { createSupervisor } from "@langchain/langgraph-supervisor";
import { ChatOpenAI } from "@langchain/openai";
import { getAIKey, getLighthouseConfig } from "@/actions/lighthouse/lighthouse";
import {
complianceAgentPrompt,
findingsAgentPrompt,
overviewAgentPrompt,
providerAgentPrompt,
resourcesAgentPrompt,
rolesAgentPrompt,
scansAgentPrompt,
supervisorPrompt,
userInfoAgentPrompt,
} from "@/lib/lighthouse/prompts";
import {
getProviderCheckDetailsTool,
getProviderChecksTool,
} from "@/lib/lighthouse/tools/checks";
import {
getComplianceFrameworksTool,
getComplianceOverviewTool,
getCompliancesOverviewTool,
} from "@/lib/lighthouse/tools/compliances";
import {
getFindingsTool,
getMetadataInfoTool,
} from "@/lib/lighthouse/tools/findings";
import {
getFindingsBySeverityTool,
getFindingsByStatusTool,
getProvidersOverviewTool,
} from "@/lib/lighthouse/tools/overview";
import {
getProvidersTool,
getProviderTool,
} from "@/lib/lighthouse/tools/providers";
import {
getLatestResourcesTool,
getResourcesTool,
getResourceTool,
} from "@/lib/lighthouse/tools/resources";
import { getRolesTool, getRoleTool } from "@/lib/lighthouse/tools/roles";
import { getScansTool, getScanTool } from "@/lib/lighthouse/tools/scans";
import {
getMyProfileInfoTool,
getUsersTool,
} from "@/lib/lighthouse/tools/users";
import { getModelParams } from "@/lib/lighthouse/utils";
export async function initLighthouseWorkflow() {
const apiKey = await getAIKey();
const lighthouseConfig = await getLighthouseConfig();
const modelParams = getModelParams(lighthouseConfig);
// Initialize models without API keys
const llm = new ChatOpenAI({
model: lighthouseConfig.model,
apiKey: apiKey,
tags: ["agent"],
...modelParams,
});
const supervisorllm = new ChatOpenAI({
model: lighthouseConfig.model,
apiKey: apiKey,
streaming: true,
tags: ["supervisor"],
...modelParams,
});
const providerAgent = createReactAgent({
llm: llm,
tools: [getProvidersTool, getProviderTool],
name: "provider_agent",
prompt: providerAgentPrompt,
});
const userInfoAgent = createReactAgent({
llm: llm,
tools: [getUsersTool, getMyProfileInfoTool],
name: "user_info_agent",
prompt: userInfoAgentPrompt,
});
const scansAgent = createReactAgent({
llm: llm,
tools: [getScansTool, getScanTool],
name: "scans_agent",
prompt: scansAgentPrompt,
});
const complianceAgent = createReactAgent({
llm: llm,
tools: [
getCompliancesOverviewTool,
getComplianceOverviewTool,
getComplianceFrameworksTool,
],
name: "compliance_agent",
prompt: complianceAgentPrompt,
});
const findingsAgent = createReactAgent({
llm: llm,
tools: [
getFindingsTool,
getMetadataInfoTool,
getProviderChecksTool,
getProviderCheckDetailsTool,
],
name: "findings_agent",
prompt: findingsAgentPrompt,
});
const overviewAgent = createReactAgent({
llm: llm,
tools: [
getProvidersOverviewTool,
getFindingsByStatusTool,
getFindingsBySeverityTool,
],
name: "overview_agent",
prompt: overviewAgentPrompt,
});
const rolesAgent = createReactAgent({
llm: llm,
tools: [getRolesTool, getRoleTool],
name: "roles_agent",
prompt: rolesAgentPrompt,
});
const resourcesAgent = createReactAgent({
llm: llm,
tools: [getResourceTool, getResourcesTool, getLatestResourcesTool],
name: "resources_agent",
prompt: resourcesAgentPrompt,
});
const agents = [
userInfoAgent,
providerAgent,
overviewAgent,
scansAgent,
complianceAgent,
findingsAgent,
rolesAgent,
resourcesAgent,
];
// Create supervisor workflow
const workflow = createSupervisor({
agents: agents,
llm: supervisorllm,
prompt: supervisorPrompt,
outputMode: "last_message",
});
// Compile and run
const app = workflow.compile();
return app;
}