FastAPI اور Streamlit کا استعمال کرتے ہوئے ملٹی یوزر AI ایجنٹس کی خدمت کیسے کریں۔

اس ٹیوٹوریل میں، میں آپ کو دکھاؤں گا کہ فاسٹ اے پی آئی کو ایک کثیر صارف مقامی AI ایجنٹ کو REST API کے طور پر فراہم کرنے کے لیے کیسے استعمال کیا جائے اور پھر اس کے اوپر ایک ہلکا پھلکا Streamlit UI شامل کریں۔

ٹرمینل کے ذریعے ایجنٹ کے ساتھ بات چیت کرنے کے بجائے، ہم اسے HTTP پر بے نقاب کرتے ہیں، جس سے متعدد صارفین کو چیٹ طرز کے فرنٹ اینڈ انٹرفیس کے ذریعے ایجنٹ تک رسائی حاصل ہوتی ہے۔ ہر سیشن اپنی گفتگو کی تاریخ اور سلسلہ بندی کے جوابات کو برقرار رکھتا ہے۔

مقامی AI ایجنٹوں کو LangChain v1، Ollama، Qwen، اور Python کے ساتھ بنایا گیا ہے تاکہ آپ کے اپنے سسٹمز پر چل سکیں اور فی کال ماڈل API کے اخراجات کے بغیر بڑی ایپلی کیشنز سے منسلک ہو سکتے ہیں۔

انڈیکس

پس منظر

بہت سے AI ایجنٹ سادہ Python اسکرپٹ کے طور پر شروع کرتے ہیں جو کمانڈ لائن ٹرمینل میں چلتے ہیں۔ آپ اپنا پیغام ٹائپ کرتے ہیں، ایجنٹ جواب دیتا ہے، اور یہ سب ایک ہی مقامی سیشن میں ہوتا ہے۔

یہ سیٹ اپ ترقی اور جانچ کے لیے موزوں ہے، لیکن جب آپ چاہتے ہیں کہ دوسرے لوگ یا ایپلیکیشنز ایجنٹ کے ساتھ تعامل کریں تو یہ محدود ہے۔

AI ایجنٹ کو حقیقی معنوں میں مفید بنانے کے لیے، آپ کو اسے ایک ایسے انٹرفیس کے ذریعے بے نقاب کرنے کی ضرورت ہے جس تک دوسرے صارفین رسائی حاصل کر سکیں۔ REST APIs ایسا کرنے کا ایک عملی طریقہ ہے۔

اس ٹیوٹوریل کی پیروی کرنے کے لیے آپ کو اپنے کمپیوٹر پر اولاما انسٹال کرنے کی ضرورت ہوگی۔ یہ ٹیوٹوریل macOS، Windows اور Linux پر کام کرتا ہے۔ میں 32GB RAM کے ساتھ MacBook Pro استعمال کر رہا ہوں، لیکن اگر آپ Ollama کے چھوٹے Qwen ماڈل کا انتخاب کرتے ہیں تو آپ اسے کم میموری سسٹم پر چلا سکتے ہیں۔

FastAPI کیا ہے؟

FastAPI APIs بنانے کے لیے ایک ازگر کا ویب فریم ورک ہے۔ یہ ٹیوٹوریل HTTP پر ایجنٹ کو بے نقاب کرنے کا ایک آسان طریقہ فراہم کرتا ہے تاکہ دیگر ایپس، اسکرپٹس یا سروسز اسے کال کرسکیں۔

FastAPI AI ایپس کے لیے مثالی ہے کیونکہ یہ سسٹم کے گرد واضح حدود فراہم کرتا ہے۔ جب آپ Python میں درخواست اور جوابی ماڈلز کی وضاحت کرتے ہیں، تو FastAPI خود بخود ان کی توثیق کرتا ہے اور HTTP درخواستوں کو Python آبجیکٹ اور Python آبجیکٹ کو JSON میں تبدیل کر دیتا ہے۔ یہ مفت میں انٹرایکٹو API دستاویزات بھی تیار کرتا ہے اور غیر مطابقت پذیر اختتامی پوائنٹس کو سپورٹ کرتا ہے، جس سے یہ AI کام کے بوجھ کے لیے مفید ہوتا ہے جن کا جواب دینے میں زیادہ وقت لگ سکتا ہے۔

سٹریملیٹ کیا ہے؟

Streamlit کم سے کم فرنٹ اینڈ کام کے ساتھ ہلکے وزن والے ویب انٹرفیس بنانے کے لیے ایک ازگر کا فریم ورک ہے۔ یہ آپ کو HTML، CSS اور JavaScript کے بجائے سادہ Python کوڈ کا استعمال کرتے ہوئے انٹرایکٹو براؤزر پر مبنی ایپس بنانے کی اجازت دیتا ہے۔

اس ٹیوٹوریل میں، Streamlit ایک پتلی کلائنٹ کے طور پر FastAPI بیک اینڈ کے اوپر بیٹھا ہے۔ FastAPI HTTP پر ایک AI ایجنٹ کو بے نقاب کرتا ہے، اور Streamlit اس API کو کال کرنے اور نتائج ظاہر کرنے کے لیے ایک سادہ UI فراہم کرتا ہے۔ یہ علیحدگی ایجنٹ کو براؤزر میں استعمال کرنا آسان بناتا ہے جبکہ بیک اینڈ کو دوبارہ قابل استعمال رکھتا ہے۔

ملٹی یوزر سپورٹ کیا ہے؟

ملٹی یوزر سپورٹ کا مطلب ہے کہ اے آئی ایجنٹ ہر صارف کے سیشن کو الگ رکھتے ہوئے ایک سے زیادہ صارفین کی درخواستوں کو سنبھال سکتا ہے۔

مثال کے طور پر، صارف 1 ایجنٹ سے ایک سوال پوچھتا ہے، اور صارف 2 دوسرا سوال پوچھتا ہے۔ ایجنٹ کو ہر صارف کے لیے صحیح سیاق و سباق کو آزادانہ طور پر یاد رکھنا چاہیے۔ ملٹی یوزر سپورٹ کے بغیر، تمام صارفین بات چیت کی ایک ہی حالت کا اشتراک کریں گے، جس سے ملے جلے ردعمل، غلط یادیں، یا اوور رائٹ سیاق و سباق مل سکتے ہیں۔

حوصلہ افزائی اور فن تعمیر

AI ایجنٹوں کو مقامی طور پر بنانے کے بعد انہیں APIs میں تبدیل کرنا ایک قدرتی اگلا مرحلہ ہے۔ Python اسکرپٹ تجربات کے لیے بہترین ہیں، لیکن API آپ کو ایجنٹوں کو دوبارہ استعمال کرنے کی اجازت دیتا ہے۔ ملٹی یوزر سپورٹ شامل کرنے سے آپ اپنے ایجنٹ کو دوسروں کے استعمال کے لیے بڑھا سکتے ہیں۔

چیزوں کو آسان بنانے کے لیے، ہم اولاما اور کیوین کے فراہم کردہ چھوٹے مقامی ایجنٹوں کا استعمال کریں گے۔ ایجنٹ کے پاس دو ٹولز ہوتے ہیں: ایک موجودہ وقت کو چیک کرنے کا ٹول اور دوسرا الفاظ گننے کا ٹول۔

FastAPI ایک اختتامی نقطہ کو بے نقاب کرکے ایک HTTP پرت فراہم کرتا ہے: /chat/stream. جب کوئی درخواست صارف کے پیغام کے ساتھ آتی ہے، Pydantic درخواست کی توثیق کرتا ہے، LangChain ایجنٹ لوپ اور ٹول کالز کو ہینڈل کرتا ہے، اور حتمی جواب ایک سلسلہ کے طور پر واپس کر دیا جاتا ہے۔ Streamlit اس API کے اوپر بیٹھتا ہے اور ایک فرنٹ اینڈ کے طور پر کام کرتا ہے جو API کو درخواستیں بھیجتا ہے اور نتائج دکھاتا ہے۔

مثال کی درخواست:

{ 
    "message": "How many words are in: LangChain makes tool calling easier",
    "user_id":"123e4567-e89b-12d3-a456-426614174000"
 }

مثال کے جواب:

{
  "answer": "There are **5** words in LangChain makes tool calling easier."
}

ماڈل اولاما کے ذریعے مقامی طور پر چلتے ہیں، لہذا فی کال ماڈل API چارجز نہیں ہیں۔

مرحلہ 1: اولاما انسٹال کریں اور ماڈلز درآمد کریں۔

شروع کرنے کے لیے، اپنے پلیٹ فارم کے لیے Ollama ایپلیکیشن انسٹال کریں۔

ہم Qwen کو اپنے چیٹ ماڈل کے طور پر استعمال کریں گے۔ میں استعمال کر رہا ہوں۔ qwen3.5:4b. اگر آپ کے کمپیوٹر میں کم RAM ہے، تو آپ استعمال کر سکتے ہیں: qwen3.5:0.8b اس کے بجائے.

ollama pull qwen3.5:4b

مرحلہ 2: ازگر پر انحصار انسٹال کریں۔

ایک ورچوئل ماحول بنائیں اور مطلوبہ پیکجز انسٹال کریں۔

python3 -m venv venv
source venv/bin/activate

pip install fastapi uvicorn streamlit requests langchain langchain-core langchain-ollama langgraph

اگر آپ کے ٹیوٹوریل کے لیے LangChain >= 1.0.0 درکار ہے۔

مرحلہ 3: FastAPI کا استعمال کرتے ہوئے بلڈنگ ایجنٹس اور API پرتیں۔

اس ایپلیکیشن کی تین اہم ذمہ داریاں ہیں: FastAPI ایک HTTP اینڈ پوائنٹ کو ظاہر کرتا ہے، Pydantic آنے والی درخواست کے ڈیٹا کی توثیق کرتا ہے، اور LangChain ایجنٹ چلاتا ہے جس میں ٹول کالز اور قلیل مدتی میموری شامل ہے۔

کہ user_id ہر درخواست کے ساتھ بھیجی گئی معلومات کو تھریڈ شناخت کنندہ کے طور پر استعمال کیا جاتا ہے، جس سے معائنہ کرنے والے کو ہر صارف کی گفتگو کی الگ تاریخ رکھنے کی اجازت ملتی ہے۔ یہ میموری فی سیشن ہے۔ اس لیے ہر نئے سیشن کی اپنی یادداشت ہوتی ہے۔

ایک اور اہم تفصیل یہ ہے کہ ایجنٹ صرف ایک بار بنائے جاتے ہیں، آغاز پر۔ agent = build_agent(). ایک ہی ایجنٹ مثال کو دوبارہ استعمال کرنے سے اوور ہیڈ کم ہو جاتا ہے اور ہر درخواست کے لیے ماڈلز اور ٹول لسٹس کو دوبارہ بنانے کی ضرورت کو ختم کر کے جوابی اوقات میں بہتری آتی ہے، جبکہ اب بھی آپ کو متعدد صارفین کی مدد کرنے کی اجازت ملتی ہے۔

اندرونی /chat/stream اینڈ پوائنٹ اور بیک اینڈ کا استعمال لینگ چین۔ stream_events(..., version="v3") ایک ساتھ تمام جوابات کا انتظار کرنے کے بجائے، یہ ایک سلسلہ کے طور پر جوابات تیار کرتا ہے۔ FastAPI پھر اس سلسلے کو بھیجتا ہے۔ StreamingResponseیہ فرنٹ اینڈ کو آہستہ آہستہ آؤٹ پٹ حاصل کرنے کی اجازت دیتا ہے جیسا کہ یہ پیدا ہوتا ہے۔ اس سے ایپ بہت زیادہ انٹرایکٹو محسوس کرتی ہے کیونکہ صارف جوابات کو فوری طور پر پڑھ سکتا ہے جب کہ بقیہ تیار کیا جا رہا ہے۔

ایک ساتھ لے کر، یہ ایک ہلکا پھلکا بیک اینڈ فراہم کرتا ہے جو ان پٹ کی توثیق کرتا ہے، ہر صارف کے لیے علیحدہ میموری کو برقرار رکھتا ہے، اور حقیقی وقت میں UI پر ردعمل کو سٹریم کرتا ہے۔

درج ذیل کوڈ کو بطور محفوظ کریں: app.py:

from datetime import datetime
from uuid import UUID

from fastapi import FastAPI, HTTPException
from fastapi.responses import StreamingResponse

from pydantic import BaseModel

from langchain.agents import create_agent
from langchain_core.tools import tool
from langchain_ollama import ChatOllama
from langgraph.checkpoint.memory import InMemorySaver

CHAT_MODEL = "qwen3.5:4b"

SYSTEM_PROMPT = (
    "You are a helpful assistant with access to tools for getting the current time "
    "and counting words in text. "
    "Use tools when needed. If the question does not need a tool, answer directly."
)

# -----------------------------
# Request model
# -----------------------------

class ChatRequest(BaseModel):
    user_id: UUID
    message: str

# -----------------------------
# Tools
# -----------------------------

@tool
def current_time() -> str:
    """Return the current local date and time."""
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")


@tool
def word_count(text: str) -> int:
    """Count the number of words in a piece of text."""
    return len(text.split())


# -----------------------------
# Agent + checkpoint memory
# -----------------------------

# Store conversation history in short term memory
checkpointer = InMemorySaver()

def build_agent():
    model = ChatOllama(model=CHAT_MODEL, temperature=0)
    return create_agent(
        model=model,
        tools=[current_time, word_count],
        system_prompt=SYSTEM_PROMPT,
        checkpointer=checkpointer,
    )


agent = build_agent()

# -----------------------------
# Streaming endpoint
# -----------------------------

app = FastAPI()

@app.post("/chat/stream")
def chat_stream(req: ChatRequest):
    def generate():
        run = agent.stream_events(
            {
                "messages": [{"role": "user", "content": req.message}],
            },
            config={
                "configurable": {
                    # Keep each user's short-term memory isolated
                    # by using their user_id as the thread ID.
                    "thread_id": str(req.user_id),
                }
            },
            version="v3",
        )

        for message in run.messages:
            for token in message.text:
                yield token

    return StreamingResponse(generate(), media_type="text/plain")

مرحلہ 4: ایک آسان UI بنانا

Streamlit کوڈ AI ایجنٹ کے لیے ایک سادہ چیٹ انٹرفیس بناتا ہے اور ہر براؤزر سیشن کو ایک منفرد user_id کے ساتھ منسلک کرتا ہے۔

جب ایپ پہلی بار لوڈ ہوتی ہے، تو یہ ایک UUID بناتی ہے اور اسے st.session_state میں اسٹور کرتی ہے۔ یہ UUID بعد میں بیک اینڈ پر بھیجا جاتا ہے تاکہ ایجنٹ اس صارف کی گفتگو کی تاریخ کو دوسرے صارفین سے الگ رکھ سکے۔ مزید برآں، Streamlit سیشن کی حالت میں ایک چیٹ_ہسٹری لسٹ بناتا ہے تاکہ جب بھی آپ اسکرپٹ کو دوبارہ چلاتے ہیں تو پرانے پیغامات اب بھی نظر آتے ہیں۔ اس کے بعد ایپ محفوظ شدہ تاریخ کو دیکھتی ہے اور ہر پیغام کو st.chat_message() کا استعمال کرتے ہوئے چیٹ طرز کی شکل میں دکھاتی ہے۔

جب صارف st.chat_input() کے ذریعے کوئی نیا پیغام داخل کرتا ہے، تو ایپ فوری طور پر اسے محفوظ کرتی ہے، اسے ڈسپلے کرتی ہے، اور پھر اسے POST کی درخواست کے ساتھ بیک اینڈ API کو بھیجتی ہے۔ http://127.0.0.1:8001/chat/stream سیشن کے user_id کے ساتھ۔

درخواستیں stream=True کے ساتھ کی جاتی ہیں، جو جوابات کو ایک ساتھ آنے کی بجائے آہستہ آہستہ آنے کی اجازت دیتا ہے۔ جیسا کہ متن کا ہر حصہ بیک اینڈ سے موصول ہوتا ہے، کوڈ اسے full_answer میں شامل کرتا ہے اور صفحہ پر پلیس ہولڈرز کو اپ ڈیٹ کرتا ہے، جس سے لائیو سٹریمنگ اثر پیدا ہوتا ہے۔ جواب مکمل ہونے کے بعد، حتمی ثانوی پیغام chat_history میں محفوظ ہو جاتا ہے، لہذا یہ صفحہ کی گفتگو کا حصہ رہتا ہے۔

مندرجہ ذیل کو محفوظ کریں: streamlit_app.py

import uuid
import requests
import streamlit as st

API_URL = "http://127.0.0.1:8001/chat/stream"

st.title("Local AI Agent")

if "user_id" not in st.session_state:
    st.session_state.user_id = str(uuid.uuid4())

if "chat_history" not in st.session_state:
    st.session_state.chat_history = []

# Show previous messages
for item in st.session_state.chat_history:
    with st.chat_message(item["role"]):
        st.markdown(item["content"])

message = st.chat_input("Enter a message")

if message:
    # Save and show user message
    st.session_state.chat_history.append({"role": "user", "content": message})
    with st.chat_message("user"):
        st.markdown(message)

    # Stream assistant response
    full_answer = ""
    with st.chat_message("assistant"):
        placeholder = st.empty()

        # Send the reqeust to backend API via POST request
        with requests.post(
            API_URL,
            json={
                "message": message,
                "user_id": st.session_state.user_id,
            },
            stream=True,
        ) as response:
            response.raise_for_status()

            for chunk in response.iter_content(chunk_size=None, decode_unicode=True):
                if chunk:
                    full_answer += chunk
                    placeholder.markdown(full_answer)

    # Save final assistant response
    st.session_state.chat_history.append(
        {"role": "assistant", "content": full_answer}
    )

مرحلہ 5: بیک اینڈ ایپ چلائیں۔

Uvicorn کے ساتھ سرور شروع کریں۔

uvicorn app:app --reload --port 8001

درخواست شروع ہونے کے بعد، کھولیں:

کہ /docs اینڈ پوائنٹس خود بخود فاسٹ اے پی آئی کے ذریعے Pydantic ماڈل کا استعمال کرتے ہوئے بنائے جاتے ہیں۔ کلائنٹ کوڈ لکھے بغیر آپ کے API کو جانچنے کے لیے ایک انٹرایکٹو انٹرفیس فراہم کرتا ہے۔

FastAPI کے ذریعہ تیار کردہ API دستاویزات۔ اس میں /chat/stream اینڈ پوائنٹ اور اسکیما شامل ہے۔

آپ اپنی درخواست براہ راست یہاں بھیج سکتے ہیں: curl. اپنے AI ایجنٹ کے لیے API کو کال کرنے اور آؤٹ پٹ چیک کرنے کے لیے اپنے ٹرمینل میں درج ذیل کمانڈ کو چلائیں۔

$ curl -X POST http://127.0.0.1:8001/chat/stream 
  -H "Content-Type: application/json" 
  -d '{"message":"What time is it?","user_id":"123e4567-e89b-12d3-a456-426614174000"}'

$ curl -X POST http://127.0.0.1:8001/chat/stream 
  -H "Content-Type: application/json" 
  -d '{"message":"How many words are in: LangChain makes tool calling easier","user_id":"123e4567-e89b-12d3-a456-426614174000"}'

$ curl -X POST "http://127.0.0.1:8001/chat/stream" 
-H "Content-Type: application/json" 
-d '{"message":"What is the capital of France?","user_id":"123e4567-e89b-12d3-a456-426614174000"}'

سرور کو روکنے کے لیے، ٹرمینل میں Ctrl+C دبائیں۔

مرحلہ 6: فرنٹ اینڈ ایپ چلائیں۔

دوسرے ٹرمینل میں، اپنی پروجیکٹ ڈائرکٹری پر جائیں۔

source venv/bin/activate
streamlit run streamlit_app.py

اس سے آپ کے براؤزر میں فرنٹ اینڈ کھل جائے گا۔ http://localhost:8501/. مثال کے طور پر اشارے استعمال کریں جیسے "فرانس کا دارالحکومت کیا ہے؟” آپ جوابات کو چیٹ طرز کے انٹرفیس میں دیکھ سکتے ہیں۔

Streamlit UI مقامی AI ایجنٹوں کے لیے ایک سادہ چیٹ فرنٹ اینڈ فراہم کرتا ہے۔

UI فاسٹ اے پی آئی اینڈ پوائنٹ کو کال کرتا ہے اور AI ایجنٹ کو کال کرتا ہے۔ اب آپ کے پاس ایک اینڈ ٹو اینڈ ایپلی کیشن ہے جو مقامی AI ایجنٹوں کے خلاف کام کرتی ہے جن کے ساتھ آپ کھیل سکتے ہیں۔

سرور کو روکنے کے لیے، ٹرمینل میں Ctrl+C دبائیں۔

نمونہ پیداوار

نیچے دی گئی تصویر میں ایپ کے دو براؤزر سیشن دکھائے گئے ہیں جو ایک ہی اینڈ پوائنٹ پر ساتھ ساتھ چل رہے ہیں۔ ہر سیشن کو ایک منفرد ID تفویض کیا جاتا ہے، جس سے پسدید ہر صارف کے لیے الگ گفتگو کی سرگزشت برقرار رکھ سکتا ہے۔

یہاں تک کہ اگر دو صارفین دونوں ایک ہی سوال پوچھیں، "میں کون ہوں؟”، ہر سیشن میں جوابات مختلف ہوں گے کیونکہ جوابات اس سیشن میں پچھلے پیغامات پر مبنی ہوتے ہیں۔

بات چیت کی سرگزشت کی بنیاد پر مختلف جوابات دینے والی ایک تصویر جس میں ایجنٹ کے ساتھ دو سیشن ہوتے ہیں۔

پیداوار سے پہلے بہتر کرنے کی چیزیں

ایپلیکیشن مکمل طور پر فعال ہے لیکن پھر بھی جان بوجھ کر کم سے کم ہے۔ یہ پہلے سے ہی دوبارہ استعمال کے قابل FastAPI بیک اینڈ، Streamlit چیٹ انٹرفیس، صارف کے لیے مخصوص گفتگو کی ریکارڈنگ، اور سٹریمنگ ردعمل کو سپورٹ کرتا ہے۔

اگر آپ مزید جانا چاہتے ہیں تو، اگلے مرحلے میں تصدیق، مستقل اسٹوریج، ساختی لاگنگ، نگرانی، اور زیادہ مضبوط تعیناتی ترتیبات شامل کرنا ہیں۔

یہ بات بھی قابل توجہ ہے کہ اگر آپ کا مقصد صرف ایک پالش سیلف ہوسٹڈ چیٹ UI کو تیزی سے بنانا اور چلانا ہے، تو ہو سکتا ہے کہ آپ کو خود فرنٹ اینڈ بنانے کی ضرورت نہ ہو۔ LibreChat اور Open WebUI جیسے پروجیکٹس پہلے سے ہی بہتر انٹرفیس اور وسیع تر فعالیت فراہم کر رہے ہیں۔

یہ ٹیوٹوریل ایک مختلف طریقہ اختیار کرتا ہے۔ ایک پورے پلیٹ فارم کو اپنانے کے بجائے، ہم آپ کو دکھاتے ہیں کہ فن تعمیر کو بہتر طور پر سمجھنے کے لیے اپنا ہلکا پھلکا کسٹم اسٹیک کیسے بنایا جائے اور آپ کے ایجنٹوں کے سامنے آنے کے طریقے پر زیادہ کنٹرول حاصل کریں۔

نتیجہ

اس ٹیوٹوریل میں، ہم نے ایک مقامی AI ایجنٹ کو FastAPI ایپ میں لپیٹ کر اس کے اوپر Streamlit UI استعمال کیا۔

یہ AI ایجنٹوں کو اسٹینڈ اسکرپٹس سے دوبارہ قابل استعمال خدمات میں تبدیل کرتا ہے۔ ٹرمینل میں مکمل طور پر کام کرنے کے بجائے، اب آپ اسے ایک سادہ HTTP اینڈ پوائنٹ کے ذریعے دیگر ایپس، اسکرپٹس، یا اندرونی ٹولز کے ذریعے حاصل کر سکتے ہیں۔

ہر سیشن کے لیے ایک منفرد ID تفویض کرنے سے، سروس متعدد صارفین کے لیے الگ الگ گفتگو کے ریکارڈ کو برقرار رکھ سکتی ہے، جس سے یہ فی سیشن الگ تھلگ میموری کے ساتھ چیٹ طرز کے انٹرفیس کو سپورٹ کر سکتی ہے۔

وہاں سے، آپ تصدیق یا پروڈکشن کے لیے تیار خصوصیات شامل کرکے اسی سروس کو بڑھانا جاری رکھ سکتے ہیں۔ مبارک ہو ٹنکرنگ!

اگر آپ کو یہ سبق پسند آیا ہے، تو آپ میرے بلاگ پر میری مزید تحریریں (حالیہ پوسٹس میں سسٹمز ڈیزائن پیپرز سیریز شامل ہیں)، میری ذاتی ویب سائٹ پر میرا کام، اور LinkedIn پر اپ ڈیٹس حاصل کر سکتے ہیں۔

اوپر تک سکرول کریں۔