|
|
""" |
|
|
socialAgentGraph.py - Social Agent Graph with Subgraph Architecture |
|
|
""" |
|
|
|
|
|
import uuid |
|
|
from langgraph.graph import StateGraph, END |
|
|
from src.states.socialAgentState import SocialAgentState |
|
|
from src.nodes.socialAgentNode import SocialAgentNode |
|
|
from src.llms.groqllm import GroqLLM |
|
|
|
|
|
|
|
|
class SocialGraphBuilder: |
|
|
def __init__(self, llm): |
|
|
self.llm = llm |
|
|
|
|
|
def build_trending_subgraph(self, node: SocialAgentNode) -> StateGraph: |
|
|
subgraph = StateGraph(SocialAgentState) |
|
|
subgraph.add_node("collect_trends", node.collect_sri_lanka_trends) |
|
|
subgraph.set_entry_point("collect_trends") |
|
|
subgraph.add_edge("collect_trends", END) |
|
|
return subgraph.compile() |
|
|
|
|
|
def build_social_media_subgraph(self, node: SocialAgentNode) -> StateGraph: |
|
|
subgraph = StateGraph(SocialAgentState) |
|
|
|
|
|
subgraph.add_node("sri_lanka_social", node.collect_sri_lanka_social_media) |
|
|
subgraph.add_node("asia_social", node.collect_asia_social_media) |
|
|
subgraph.add_node("world_social", node.collect_world_social_media) |
|
|
|
|
|
subgraph.set_entry_point("sri_lanka_social") |
|
|
subgraph.set_entry_point("asia_social") |
|
|
subgraph.set_entry_point("world_social") |
|
|
|
|
|
subgraph.add_edge("sri_lanka_social", END) |
|
|
subgraph.add_edge("asia_social", END) |
|
|
subgraph.add_edge("world_social", END) |
|
|
|
|
|
return subgraph.compile() |
|
|
|
|
|
def build_feed_generation_subgraph(self, node: SocialAgentNode) -> StateGraph: |
|
|
subgraph = StateGraph(SocialAgentState) |
|
|
|
|
|
subgraph.add_node("categorize", node.categorize_by_geography) |
|
|
subgraph.add_node("llm_summary", node.generate_llm_summary) |
|
|
subgraph.add_node("format_output", node.format_final_output) |
|
|
|
|
|
subgraph.set_entry_point("categorize") |
|
|
subgraph.add_edge("categorize", "llm_summary") |
|
|
subgraph.add_edge("llm_summary", "format_output") |
|
|
subgraph.add_edge("format_output", END) |
|
|
|
|
|
return subgraph.compile() |
|
|
|
|
|
def build_user_targets_subgraph(self, node: SocialAgentNode) -> StateGraph: |
|
|
"""Build subgraph for user-defined keywords and profiles.""" |
|
|
subgraph = StateGraph(SocialAgentState) |
|
|
subgraph.add_node("collect_user_targets", node.collect_user_defined_targets) |
|
|
subgraph.set_entry_point("collect_user_targets") |
|
|
subgraph.add_edge("collect_user_targets", END) |
|
|
return subgraph.compile() |
|
|
|
|
|
def build_graph(self): |
|
|
node = SocialAgentNode(self.llm) |
|
|
|
|
|
trending_subgraph = self.build_trending_subgraph(node) |
|
|
social_subgraph = self.build_social_media_subgraph(node) |
|
|
user_targets_subgraph = self.build_user_targets_subgraph(node) |
|
|
feed_subgraph = self.build_feed_generation_subgraph(node) |
|
|
|
|
|
main_graph = StateGraph(SocialAgentState) |
|
|
|
|
|
main_graph.add_node( |
|
|
"trending_module", lambda state: trending_subgraph.invoke(state) |
|
|
) |
|
|
main_graph.add_node( |
|
|
"social_media_module", lambda state: social_subgraph.invoke(state) |
|
|
) |
|
|
main_graph.add_node( |
|
|
"user_targets_module", lambda state: user_targets_subgraph.invoke(state) |
|
|
) |
|
|
main_graph.add_node( |
|
|
"feed_generation_module", lambda state: feed_subgraph.invoke(state) |
|
|
) |
|
|
main_graph.add_node("feed_aggregator", node.aggregate_and_store_feeds) |
|
|
|
|
|
|
|
|
main_graph.set_entry_point("trending_module") |
|
|
main_graph.set_entry_point("social_media_module") |
|
|
main_graph.set_entry_point("user_targets_module") |
|
|
|
|
|
|
|
|
main_graph.add_edge("trending_module", "feed_generation_module") |
|
|
main_graph.add_edge("social_media_module", "feed_generation_module") |
|
|
main_graph.add_edge("user_targets_module", "feed_generation_module") |
|
|
main_graph.add_edge("feed_generation_module", "feed_aggregator") |
|
|
main_graph.add_edge("feed_aggregator", END) |
|
|
|
|
|
return main_graph.compile() |
|
|
|
|
|
|
|
|
llm = GroqLLM().get_llm() |
|
|
graph = SocialGraphBuilder(llm).build_graph() |
|
|
|