# Tasks, Messages, Parts और Artifacts — MCP और Agent-to-Agent Protocols

Source: https://www.geekswithgeeks.com/hi/mcp-a2a/a-task

> मुख्य ऑब्जेक्ट्स और task जीवनचक्र सीखें।

## Task सौंपे गए काम की इकाई है

Client एक **message** भेजता है (user या agent की भूमिका और एक या अधिक **parts**: पाठ, files या संरचित डेटा)। Remote agent सीधा उत्तर दे सकता है, या id वाला **task** बना सकता है: stateful काम की इकाई जिसकी **status** **submitted → working → (input-required) → completed**, या **failed**, **canceled** या **rejected** जैसे जीवनचक्र से गुज़रती है (विनिर्देश auth-required जैसी कुछ और स्थितियाँ भी सूचीबद्ध करता है)। परिणाम **artifacts** (दस्तावेज़, files, संरचित आउटपुट) के रूप में लौटते हैं, जो parts से बने होते हैं, और बीच के **status अद्यतन** stream हो सकते हैं। **Context id** संबंधित tasks को एक बातचीत में समूहित करता है। Tasks ही कारण हैं कि A2A लंबे और संवादात्मक काम के लिए उपयुक्त है। अंतिम स्थितियाँ अंतिम हैं: पूरा हुआ task दोबारा नहीं खोला जा सकता, इसलिए अनुवर्ती काम उसी context में नया task शुरू करता है।

## State machine के रूप में task जीवनचक्र, चलाकर

मैंने यह सादे Python 3 (सिर्फ़ standard library) से चलाया। यह सीखने के लिए सरलीकृत मॉडल है, पूरी A2A state सूची नहीं। सामान्य task submitted, working, input-required (agent को और जानकारी चाहिए), फिर working और completed होता है। पूरे हुए task को वापस working करने की कोशिश अस्वीकृत है।

```python
ALLOWED = {
    "submitted": {"working", "rejected"},
    "working": {"input-required", "completed", "failed", "canceled"},
    "input-required": {"working", "canceled"},
    "completed": set(), "failed": set(), "canceled": set(), "rejected": set(),
}

class Task:
    def __init__(self):
        self.state, self.history = "submitted", ["submitted"]
    def move(self, new):
        if new not in ALLOWED[self.state]:
            raise ValueError(f"illegal transition {self.state} -> {new}")
        self.state = new; self.history.append(new)

t = Task()
for step in ("working", "input-required", "working", "completed"):
    t.move(step)
print(" -> ".join(t.history))
try:
    t.move("working")
except ValueError as e:
    print("blocked:", e)

```

Output:

```
submitted -> working -> input-required -> working -> completed
blocked: illegal transition completed -> working
```

## Message, task और artifact आकार (उदाहरण)

Field नाम सामान्य A2A संरचना का अनुसरण करते हैं; सटीक नामों के लिए मौजूदा विनिर्देश देखें। यहाँ चलाया नहीं गया।

```json
{
  "message": { "role": "user",
              "parts": [ { "kind": "text", "text": "Please propose a refund for invoice INV-204" } ] },
  "task": { "id": "t-91", "contextId": "c-7",
            "status": { "state": "input-required",
                        "message": { "role": "agent", "parts": [ { "kind": "text", "text": "Which order line is damaged?" } ] } } }
}
```

**Quiz:** input-required स्थिति का क्या अर्थ है?

- [x] Remote agent को client या user से और जानकारी चाहिए
- [ ] Task स्थायी रूप से विफल हुआ
- [ ] Task हटा दिया गया
- [ ] Card अमान्य है

*Answer:* Remote agent को client या user से और जानकारी चाहिए. अनुरोधित इनपुट आने तक task रुका रहता है।
