Files
prowler/ui/lib/lighthouse/workflow.ts
T
Chandrapal Badshah 031548ca7e feat: Update Lighthouse UI to support multi LLM (#8925)
Co-authored-by: Chandrapal Badshah <12944530+Chan9390@users.noreply.github.com>
Co-authored-by: Alan Buscaglia <gentlemanprogramming@gmail.com>
Co-authored-by: alejandrobailo <alejandrobailo94@gmail.com>
2025-11-14 11:46:38 +01:00

195 lines
4.9 KiB
TypeScript

import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { createSupervisor } from "@langchain/langgraph-supervisor";
import {
getProviderCredentials,
getTenantConfig,
} from "@/actions/lighthouse/lighthouse";
import type { ProviderType } from "@/lib/lighthouse/llm-factory";
import { createLLM } from "@/lib/lighthouse/llm-factory";
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 interface RuntimeConfig {
model?: string;
provider?: string;
}
export async function initLighthouseWorkflow(runtimeConfig?: RuntimeConfig) {
const tenantConfigResult = await getTenantConfig();
const tenantConfig = tenantConfigResult?.data?.attributes;
// Get the default provider and model
const defaultProvider = tenantConfig?.default_provider || "openai";
const defaultModels = tenantConfig?.default_models || {};
const defaultModel = defaultModels[defaultProvider] || "gpt-4o";
// Determine provider type and model ID from runtime config or defaults
const providerType = (runtimeConfig?.provider ||
defaultProvider) as ProviderType;
const modelId = runtimeConfig?.model || defaultModel;
// Get provider credentials and configuration
const providerConfig = await getProviderCredentials(providerType);
const { credentials, base_url: baseUrl } = providerConfig;
// Get model parameters
const modelParams = getModelParams({ model: modelId });
// Initialize models using the LLM factory
const llm = createLLM({
provider: providerType,
model: modelId,
credentials,
baseUrl,
streaming: true,
tags: ["agent"],
modelParams,
});
const supervisorllm = createLLM({
provider: providerType,
model: modelId,
credentials,
baseUrl,
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;
}