jurnalku-api / api /agent /multi_agent.py.bak
Fikri Bintang
feat: Deploy Jurnalku Python API to HF Spaces
ec99d5d
Raw
History Blame Contribute Delete
3.77 kB
from typing import TypedDict, Annotated, Sequence
import operator
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage, SystemMessage
from langgraph.graph import StateGraph, END
from api.agent.super_agent import get_llm
from api.agent.tools import AVAILABLE_TOOLS
from langgraph.prebuilt import ToolExecutor, ToolInvocation
import json
# Definisikan state untuk Graph
class AgentState(TypedDict):
messages: Annotated[Sequence[BaseMessage], operator.add]
next_node: str
tool_executor = ToolExecutor(AVAILABLE_TOOLS)
def researcher_node(state):
"""Agen Peneliti: Bertugas mencari data dan memanggil tools (seperti web_search atau crossref)."""
messages = state["messages"]
llm = get_llm()
# Beri tahu LLM bahwa dia adalah Peneliti
prompt = "Anda adalah Peneliti Akademik. Cari informasi yang relevan menggunakan tools yang ada. Jawab langsung jika Anda tahu."
response = llm.invoke([SystemMessage(content=prompt)] + messages)
# Cek apakah dia mau memanggil tool
if getattr(response, "tool_calls", None):
return {"messages": [response], "next_node": "tools"}
return {"messages": [response], "next_node": "reviewer"}
def tools_node(state):
"""Menjalankan tools (seperti pencarian internet atau konversi Word)."""
messages = state["messages"]
last_message = messages[-1]
tool_invocations = []
for tool_call in getattr(last_message, "tool_calls", []):
action = ToolInvocation(
tool=tool_call["name"],
tool_input=tool_call["args"],
)
tool_invocations.append(action)
responses = tool_executor.batch(tool_invocations, return_exceptions=True)
tool_messages = []
for tc, response in zip(getattr(last_message, "tool_calls", []), responses):
tool_messages.append(AIMessage(content=str(response), name=tc["name"]))
return {"messages": tool_messages, "next_node": "researcher"}
def reviewer_node(state):
"""Agen Kritikus: Memeriksa dan merevisi teks agar sesuai standar akademik tinggi."""
messages = state["messages"]
llm = get_llm()
prompt = "Anda adalah Kritikus Jurnal Senior. Perbaiki draf sebelumnya menjadi bahasa akademik yang sangat profesional dan EYD yang benar."
response = llm.invoke([SystemMessage(content=prompt)] + messages)
return {"messages": [response], "next_node": "editor"}
def editor_node(state):
"""Agen Editor: Memberikan finalisasi dan menyajikannya ke user."""
messages = state["messages"]
llm = get_llm()
prompt = "Anda adalah Editor Utama. Rangkum dan finalisasi hasil kerja Peneliti dan Kritikus agar siap disajikan ke pengguna dengan ramah."
response = llm.invoke([SystemMessage(content=prompt)] + messages)
return {"messages": [response], "next_node": "end"}
# Build the Graph
workflow = StateGraph(AgentState)
workflow.add_node("researcher", researcher_node)
workflow.add_node("tools", tools_node)
workflow.add_node("reviewer", reviewer_node)
workflow.add_node("editor", editor_node)
workflow.set_entry_point("researcher")
# Routing
workflow.add_conditional_edges(
"researcher",
lambda x: x["next_node"],
{
"tools": "tools",
"reviewer": "reviewer"
}
)
workflow.add_edge("tools", "researcher")
workflow.add_edge("reviewer", "editor")
workflow.add_edge("editor", END)
multi_agent_executor = workflow.compile()
def process_multi_agent_chat(message: str):
"""Fungsi utama untuk memanggil sistem Multi-Agent."""
try:
inputs = {"messages": [HumanMessage(content=message)]}
result = multi_agent_executor.invoke(inputs)
return result["messages"][-1].content
except Exception as e:
return f"Error di Multi-Agent System: {str(e)}"