(
*,
llm: "BaseChatModel",
prompts: PromptBundle,
tool_specs: list[ToolSpec],
context: WorkflowContext,
)
| 195 | |
| 196 | |
| 197 | def build_nodes( |
| 198 | *, |
| 199 | llm: "BaseChatModel", |
| 200 | prompts: PromptBundle, |
| 201 | tool_specs: list[ToolSpec], |
| 202 | context: WorkflowContext, |
| 203 | ) -> NodeSet: |
| 204 | try: |
| 205 | from langchain.agents import create_react_agent |
| 206 | from langchain_core.prompts import PromptTemplate |
| 207 | except ImportError as exc: |
| 208 | raise RuntimeError( |
| 209 | "LangChain is required to build workflow nodes." |
| 210 | ) from exc |
| 211 | |
| 212 | scan_tools = build_langchain_tools([tool for tool in tool_specs if tool.name == "EXECMD"]) |
| 213 | inquire_tools = build_langchain_tools([tool for tool in tool_specs if tool.name == "ReadHTML"]) |
| 214 | exploit_tools = build_langchain_tools([tool for tool in tool_specs if tool.name == "EXECMD"]) |
| 215 | |
| 216 | scan_agent = create_react_agent( |
| 217 | llm=llm, |
| 218 | tools=scan_tools, |
| 219 | prompt=PromptTemplate.from_template(prompts.scan), |
| 220 | ) |
| 221 | inquire_agent = create_react_agent( |
| 222 | llm=llm, |
| 223 | tools=inquire_tools, |
| 224 | prompt=PromptTemplate.from_template(prompts.inquire), |
| 225 | ) |
| 226 | exploit_agent = create_react_agent( |
| 227 | llm=llm, |
| 228 | tools=exploit_tools, |
| 229 | prompt=PromptTemplate.from_template(prompts.exploit), |
| 230 | ) |
| 231 | |
| 232 | return NodeSet( |
| 233 | scan=partial(agent_node, context=context, agent=scan_agent, tools=scan_tools, sender_name="Scan"), |
| 234 | inquire=partial(agent_node, context=context, agent=inquire_agent, tools=inquire_tools, sender_name="Inquire"), |
| 235 | exploit=partial(agent_node, context=context, agent=exploit_agent, tools=exploit_tools, sender_name="Exploit"), |
| 236 | vuln_select=partial(vuln_select_node, context=context, sender_name="Vuln_select"), |
| 237 | check=partial(check_node, context=context, sender_name="Check"), |
| 238 | ) |
no test coverage detected