chemgraph-loop / src /chemgraph /graphs /mock_agent.py
rockyaaos's picture
ChemGraph Loop: guarded real-agent API (EMT/TBLite single-point energy)
c509967 verified
Raw
History Blame Contribute Delete
3.06 kB
from langgraph.graph import StateGraph, START, END
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import MemorySaver
from chemgraph.tools.ase_tools import (
run_ase,
save_atomsdata_to_file,
file_to_atomsdata,
)
from chemgraph.tools.cheminformatics_tools import (
molecule_name_to_smiles,
smiles_to_atomsdata,
)
from chemgraph.tools.generic_tools import calculator
from chemgraph.prompt.single_agent_prompt import (
single_agent_prompt,
)
from chemgraph.utils.logging_config import setup_logger
from chemgraph.state.state import State
logger = setup_logger(__name__)
def ChemGraphAgent(state: State, llm: ChatOpenAI, system_prompt: str, tools=None):
"""LLM node that processes messages and decides next actions.
Parameters
----------
state : State
The current state containing messages and remaining steps
llm : ChatOpenAI
The language model to use for processing
system_prompt : str
The system prompt to guide the LLM's behavior
tools : list, optional
List of tools available to the agent, by default None
Returns
-------
dict
Updated state containing the LLM's response
"""
# Load default tools if no tool is specified.
if tools is None:
tools = [
file_to_atomsdata,
smiles_to_atomsdata,
run_ase,
molecule_name_to_smiles,
save_atomsdata_to_file,
calculator,
]
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"{state['messages']}"},
]
llm_with_tools = llm.bind_tools(tools=tools)
return {"messages": [llm_with_tools.invoke(messages)]}
def construct_mock_agent_graph(
llm: ChatOpenAI,
system_prompt: str = single_agent_prompt,
tools: list = None,
):
"""Construct a geometry optimization graph.
Parameters
----------
llm : ChatOpenAI
The language model to use for the graph
system_prompt : str, optional
The system prompt to guide the LLM's behavior, by default single_agent_prompt
tools: list, optional
The list of tools for the main agent, by default None
Returns
-------
StateGraph
The constructed single agent graph
"""
logger.info("Constructing mock agent graph")
checkpointer = MemorySaver()
if tools is None:
tools = [
file_to_atomsdata,
smiles_to_atomsdata,
run_ase,
molecule_name_to_smiles,
save_atomsdata_to_file,
calculator,
]
graph_builder = StateGraph(State)
graph_builder.add_node(
"ChemGraphAgent",
lambda state: ChemGraphAgent(state, llm, system_prompt=system_prompt, tools=tools),
)
graph_builder.add_edge(START, "ChemGraphAgent")
graph_builder.add_edge("ChemGraphAgent", END)
graph = graph_builder.compile(checkpointer=checkpointer)
logger.info("Mock agent graph construction completed")
return graph