# Send से Fan-Out (Map-Reduce) — LangGraph Agents और Multi-Agent Systems

Source: https://www.geekswithgeeks.com/hi/langgraph-agents/f-send

> कई items पर एक ही node समानांतर चलाएँ और परिणाम मिलाएँ।

## प्रति item एक कार्य

जब समानांतर कार्यों की संख्या सिर्फ़ run समय पर पता हो (N दस्तावेज़ों में से हर एक का सार, N दावों में से हर एक की जाँच), तब conditional edge **`Send(node, payload)` ऑब्जेक्ट्स की सूची** लौटा सकती है। हर `Send` उस node को अपने निजी इनपुट के साथ समानांतर शुरू करता है, और परिणाम **reducer** (आम तौर पर list-append) से साझा state में बहते हैं। फिर बाद का node उन्हें घटाता है (मिलाना, rank करना, उत्तर देना)। यह **map-reduce** पैटर्न हाथ से loops लिखने से बचाता है और स्वतंत्र कार्य समवर्ती चलाता है, पर rate limits और लागत याद रखें: N items का मतलब N मॉडल calls।

## तीन दस्तावेज़ समानांतर सार, चलाकर

मैंने यह Python virtual environment में langgraph 1.2.12 और langchain-core 1.6.6 के साथ ऑफ़लाइन चलाया। किसी API key या मॉडल की ज़रूरत नहीं क्योंकि मॉडल की जगह सादे Python functions हैं, इसलिए आउटपुट दोहराने योग्य है। तीन `Send` कार्य `summarise` node चलाते हैं, प्रति दस्तावेज़ एक। परिणाम list-append reducer से जुटाए जाते हैं; छापने से पहले sort किए गए हैं क्योंकि समानांतर कार्य किसी भी क्रम में पूरे हो सकते हैं।

```python
import operator
from typing import Annotated, TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.types import Send

class State(TypedDict):
    docs: list
    summaries: Annotated[list, operator.add]

def fan_out(state):
    return [Send("summarise", {"doc": d}) for d in state["docs"]]     # one parallel task per document

def summarise(payload):
    doc = payload["doc"]
    return {"summaries": [f"{doc.split()[0]}...({len(doc.split())} words)"]}

g = StateGraph(State)
g.add_node("summarise", summarise)
g.add_conditional_edges(START, fan_out, ["summarise"])
g.add_edge("summarise", END)
out = g.compile().invoke({"docs": ["Leave policy has 24 days", "Travel policy caps hotels", "Security policy requires 2FA now"], "summaries": []})
print(sorted(out["summaries"]))

```

Output:

```
['Leave...(5 words)', 'Security...(5 words)', 'Travel...(4 words)']
```

## समानांतर क्रम पर निर्भर न रहें

समानांतर शाखाओं के परिणाम किसी भी क्रम में आ सकते हैं। क्रम मायने रखे तो sort करें या key दें।

**Quiz:** Send सबसे ज़्यादा कब उपयोगी है?

- [ ] Reducers बंद करने के लिए
- [ ] निश्चित दो-चरण chain के लिए
- [x] जब समानांतर कार्यों की संख्या सिर्फ़ run समय पर पता हो
- [ ] Graph compile करने के लिए

*Answer:* जब समानांतर कार्यों की संख्या सिर्फ़ run समय पर पता हो. Send प्रति item गतिशील रूप से एक कार्य बनाता है।
