DEV Community

Cover image for Building EduSimplify: An AI Agent for Simplifying Educational Topics using Django, DRF, and Telex A2A Protocol
El-kufahn Muhammad Ahmad
El-kufahn Muhammad Ahmad

Posted on

Building EduSimplify: An AI Agent for Simplifying Educational Topics using Django, DRF, and Telex A2A Protocol

Author: Muhammad Ahmad El-kufahn

GitHub: KhalifahMB/HNG13_Intenship

Live Agent: Live Link to Agent


🌍 Overview

EduSimplify is an AI-powered educational assistant that simplifies complex science topics — especially Physics, Math, and related fields — into clear, easy-to-understand explanations.

Built with Django, Django REST Framework (DRF), and Google Gemini, EduSimplify integrates seamlessly into the Telex.im platform using the Mastra A2A (Agent-to-Agent) Protocol.

The goal is simple:

When a user sends a complex topic like “Explain quantum entanglement,” EduSimplify responds with a concise 2–3 sentence explanation, one real-world example, and a short note or formula.


🧩 Understanding Telex A2A Protocol (in plain English)

Telex’s A2A (Agent-to-Agent) protocol allows external applications (agents) to connect and communicate with Telex channels using the JSON-RPC 2.0 format.

This format ensures that every message follows a consistent structure — each with an id, method, and params.

For example, Telex might send a message to EduSimplify like this:

{ "jsonrpc": "2.0", "id": "001", "method": "message/send", "params": { "message": { "role": "user", "messageId": "12345", "parts": [ { "kind": "text", "text": "Explain Newton's third law" } ] } } } 
Enter fullscreen mode Exit fullscreen mode

Your agent then processes that request, runs the AI model, and sends a structured JSON-RPC response back to Telex with an explanation, artifacts, and history.

🧠 How EduSimplify Works Internally

EduSimplify’s architecture follows a clean modular design:

agents/
├── views.py # Core logic handling A2A JSON-RPC requests
├── serializers.py # DRF validation for JSON-RPC schema
├── models.py # Conversation, Message, Artifact models
├── utils.py # Google Gemini integration

🧩 Request Flow:

Telex sends a JSON-RPC request (e.g., message/send) to your public endpoint.

The A2AAgentView validates the request using DRF serializers.

A unique context_id identifies each conversation.

The user message is stored in the database.

The text is passed to the ask_gemini() helper function.

Gemini generates a simplified explanation.

EduSimplify returns a structured A2A-compliant JSON response with the answer.

⚙️ The Google Gemini Integration

EduSimplify uses the official Google Generative AI Python SDK (google-genai) for calling Gemini models.

import os from google import genai from django.conf import settings def _get_genai_client(): api_key = getattr(settings, "GEMINI_API_KEY", None) or os.environ.get("GEMINI_API_KEY") if not api_key: raise RuntimeError("Gemini API key not configured (GEMINI_API_KEY)") return genai.Client(api_key=api_key) def ask_gemini(prompt, model="gemini-2.5-flash"): client = _get_genai_client() try: response = client.models.generate_content(model=model, contents=prompt) except Exception as exc: raise RuntimeError(f"genai request failed: {exc}") from exc text = getattr(response, "text", str(response)) if not text: raise RuntimeError("genai returned empty response") return text 
Enter fullscreen mode Exit fullscreen mode

This keeps the integration clean, secure, and reusable — ask_gemini() is imported anywhere in your Django app to generate AI content on demand.

🧾 Core View Explained

The main view that powers EduSimplify is A2AAgentView. It receives JSON-RPC data, validates it, extracts user prompts, and responds.

Key Concepts

Message IDs (messageId): Every message (incoming or outgoing) has a unique UUID to track it.

Context IDs: Represent a user’s conversation thread across multiple messages.

Task IDs: Used when Telex runs multiple tasks within one context.

History: Holds both the user’s query and the agent’s reply for Telex display.

Example excerpt:

class A2AAgentView(APIView): def post(self, request, *args, **kwargs): raw = request.data or {} top_serializer = JSONRPCRequestSerializer(data=raw) ... if method == "message/send": pser = MessageParamsSerializer(data=params) ... user_prompt = last["text"] # Call Gemini  explanation = ask_gemini( f"You are EduSimplify... Concept: {user_prompt}\nAnswer:" ) # Respond to Telex  result = { "id": task_id, "contextId": conv.context_id, "status": { "state": "completed", "timestamp": datetime.utcnow().isoformat() + "Z", "message": { "role": "agent", "parts": [{"kind": "text", "text": explanation}] }, }, ... } return Response(make_a2a_success(request_id, result)) 
Enter fullscreen mode Exit fullscreen mode

Each new request gets a unique messageId to prevent collisions and maintain consistent message threading inside Telex.

🧮 Example: How to Talk to EduSimplify

🔹 Using curl

curl -X POST https://el-kufahn-hng13.up.railway.app/a2a/agent/edusimplify \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": "001", "method": "message/send", "params": { "message": { "role": "user", "messageId": "abc123", "parts": [ {"kind": "text", "text": "Explain photosynthesis in simple terms"} ] } } }' 
Enter fullscreen mode Exit fullscreen mode

✅ Response Example

{ "jsonrpc": "2.0", "id": "001", "result": { "status": { "state": "completed", "message": { "role": "agent", "parts": [ { "kind": "text", "text": "Photosynthesis is how plants convert sunlight into energy..." } ] } } } } 
Enter fullscreen mode Exit fullscreen mode

🔹 Using Postman

Method: POST

URL: https://el-kufahn-hng13.up.railway.app/a2a/agent/edusimplify

Body (raw JSON): same as above.

🔗 Telex Workflow Configuration

To connect EduSimplify to Telex.im, add a workflow JSON like this:

{ "active": true, "category": "education", "description": "Simplifies science topics for better understanding.", "id": "EduSimplifyAgent_v1", "name": "edusimplify_agent", "short_description": "Simplify complex topics in simple terms", "long_description": " EduSimplify helps users understand science topics easily. It breaks down complex concepts into short explanations, gives real-world examples, and provides simple formulas or notes when applicable. ", "nodes": [ { "id": "edusimplify_agent", "name": "EduSimplify Agent", "parameters": {}, "position": [816, -112], "type": "a2a/mastra-a2a-node", "typeVersion": 1, "url": "https://el-kufahn-hng13.up.railway.app/a2a/agent/edusimplify" } ], "settings": { "executionOrder": "v1" }, "pinData": {} } 
Enter fullscreen mode Exit fullscreen mode

💻 Source Code & Setup

All setup details (environment variables, Django configuration, and deployment steps) are explained in the GitHub repository provided at the top.

Interact directly with the deployed agent:

👉 https://el-kufahn-hng13.up.railway.app/a2a/agent/edusimplify

Send it any science concept — from “Explain gravity like I’m 10” to “What is a black hole?” — and get clear, simple answers.

🧭 Conclusion

EduSimplify demonstrates how Django + DRF can be used to build robust, production-ready AI agents that integrate cleanly into Telex.im using the A2A protocol.

By combining Google Gemini’s intelligence with a simple, structured API design, this project shows how AI can transform learning experiences — one simplified concept at a time.

django #ai #education #telex #google-gemini #python

Top comments (0)