0Pricing
AI Agents · درس

وكلاء الصور + النصوص باستخدام Claude Vision وGPT-4V

إرسال الصور في استدعاءات API، والإسناد البصري، واستخدام الأدوات المدرك للصور.

وكلاء الصور + النصوص باستخدام Claude Vision وGPT-4V درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.

الوكلاء متعددو الوسائط: الصور + النص

يمكن للوكيل متعدد الوسائط أن يرى بالإضافة إلى القراءة. ومن خلال إرسال الصور إلى جانب النص في استدعاء API نفسه، يستطيع الوكيل الإجابة عن أسئلة حول الصور، وتحليل المخططات، وقراءة لقطات الشاشة، ووصف الرسوم التخطيطية — وكل ذلك ضمن حلقة المحادثة نفسها.

إرسال الصور باستخدام OpenAI API

تقبل نماذج الرؤية من OpenAI ‏(GPT-4o وGPT-4V) مصفوفة content بدلًا من سلسلة نصية عادية. ويكون كل عنصر إما كائن text أو كائن image_url. ويمكن أن تكون الصورة عنوان URL عامًا أو عنوان URL لبيانات مشفّرة بترميز base64.

from openai import OpenAI

client = OpenAI(api_key='YOUR_OPENAI_API_KEY')

# Using a public URL
response = client.chat.completions.create(
    model='gpt-4o',
    messages=[
        {
            'role': 'user',
            'content': [
                {
                    'type': 'image_url',
                    'image_url': {
                        'url': 'https://example.com/chart.png'
                    }
                },
                {
                    'type': 'text',
                    'text': 'What trend does this chart show?'
                }
            ]
        }
    ],
    max_tokens=512
)
print(response.choices[0].message.content)

ترميز الصور باستخدام Base64

بالنسبة إلى الصور غير المتاحة للعامة (الملفات المحلية، ولقطات الشاشة، وعمليات رفع المستخدمين)، شفّرها بترميز base64 وضمّنها مباشرةً في استدعاء API باستخدام مخطط عنوان URL ‏data:image/jpeg;base64,....

import base64
from pathlib import Path

Path('screenshot.png').write_bytes(b'\x89PNG\r\n\x1a\n' + bytes(range(40)))

def encode_image_to_base64(image_path: str) -> str:
    with open(image_path, 'rb') as f:
        return base64.b64encode(f.read()).decode('utf-8')

def build_image_message(image_path: str, question: str, mime: str = 'jpeg') -> dict:
    b64 = encode_image_to_base64(image_path)
    data_url = f'data:image/{mime};base64,{b64}'
    return {
        'role': 'user',
        'content': [
            {'type': 'image_url', 'image_url': {'url': data_url}},
            {'type': 'text', 'text': question}
        ]
    }

message = build_image_message('screenshot.png', 'What error is shown?', mime='png')
print('Message built, image size:', len(message['content'][0]['image_url']['url']))

Claude Vision API

تدعم نماذج Claude من Anthropic الرؤية أيضًا. وتستخدم كتلة المحتوى حقل source مع type: base64 وmedia_type. وتختلف البنية قليلًا عن بنية OpenAI، لكنها تتمتع بالقوة نفسها.

import anthropic
import base64

client = anthropic.Anthropic(api_key='YOUR_ANTHROPIC_API_KEY')

with open('diagram.png', 'rb') as f:
    image_data = base64.standard_b64encode(f.read()).decode('utf-8')

response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=512,
    messages=[
        {
            'role': 'user',
            'content': [
                {
                    'type': 'image',
                    'source': {
                        'type': 'base64',
                        'media_type': 'image/png',
                        'data': image_data
                    }
                },
                {
                    'type': 'text',
                    'text': 'Describe the architecture shown in this diagram.'
                }
            ]
        }
    ]
)
print(response.content[0].text)

اكتشاف نوع MIME من امتداد الملف

تستخدم تنسيقات الصور المختلفة (JPEG وPNG وGIF وWebP) أنواع MIME مختلفة. اكتشف نوع MIME تلقائيًا من امتداد الملف حتى لا تضطر إلى تضمينه ثابتًا في كود الوكيل.

import os
import base64

with open('photo.jpg', 'wb') as f:
    f.write(b'\xff\xd8\xff' + bytes(range(30)))

MIME_MAP = {
    '.jpg': 'image/jpeg',
    '.jpeg': 'image/jpeg',
    '.png': 'image/png',
    '.gif': 'image/gif',
    '.webp': 'image/webp'
}

def get_mime_type(image_path: str) -> str:
    ext = os.path.splitext(image_path)[1].lower()
    mime = MIME_MAP.get(ext)
    if not mime:
        raise ValueError(f'Unsupported image format: {ext}')
    return mime

def load_image_as_base64(image_path: str) -> tuple:
    """Returns (base64_string, mime_type)"""
    mime = get_mime_type(image_path)
    with open(image_path, 'rb') as f:
        b64 = base64.b64encode(f.read()).decode('utf-8')
    return b64, mime

b64, mime = load_image_as_base64('photo.jpg')
print(f'MIME: {mime}, Size: {len(b64)} bytes base64')

تحليل الصور في حلقة الوكيل

يُعد تحليل الصور في حلقة الوكيل أداةً. ويقرر الوكيل متى يستدعيها، تمامًا كما يفعل مع أي أداة أخرى. عرّفها في مخطط الأدوات وأعدّ بيانات منظمة (JSON) حتى يتمكن الوكيل من تحليلها برمجيًا.

def analyze_image_tool(image_path: str, query: str) -> dict:
    """
    Agent tool: analyse an image and return structured findings.
    """
    import anthropic, base64
    client = anthropic.Anthropic(api_key='YOUR_API_KEY')
    b64, mime = load_image_as_base64(image_path)

    structured_query = (
        query + '\n\nRespond with JSON only: '
        '{"description": str, "objects": [str], "text_found": str, "confidence": float}'
    )
    response = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=512,
        messages=[{
            'role': 'user',
            'content': [
                {'type': 'image', 'source': {'type': 'base64',
                  'media_type': mime, 'data': b64}},
                {'type': 'text', 'text': structured_query}
            ]
        }]
    )
    import json
    return json.loads(response.content[0].text)

التحكم في مستوى تفاصيل الصورة (OpenAI)

تقبل Vision API من OpenAI معلمة detail: القيمة low (سريعة ورخيصة، 85 رمزًا)، أو high (مفصلة، تقسّم الصورة إلى مربعات، حتى 1105 رموز)، أو auto (يقرر النموذج). استخدم low لأسئلة نعم/لا البسيطة، وhigh للتحليل الدقيق، مثل قراءة النصوص الصغيرة.

def query_image_openai(
    image_path: str,
    question: str,
    detail: str = 'auto'  # 'low', 'high', or 'auto'
) -> str:
    import base64
    from openai import OpenAI
    client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
    b64, mime = load_image_as_base64(image_path)
    data_url = f'data:{mime};base64,{b64}'

    response = client.chat.completions.create(
        model='gpt-4o',
        max_tokens=512,
        messages=[{
            'role': 'user',
            'content': [
                {
                    'type': 'image_url',
                    'image_url': {'url': data_url, 'detail': detail}
                },
                {'type': 'text', 'text': question}
            ]
        }]
    )
    return response.choices[0].message.content

المحادثات متعددة الصور

يمكنك إرسال صور متعددة في رسالة واحدة أو عبر أدوار متعددة في محادثة. ويتيح ذلك تنفيذ مهام المقارنة: «قارن لقطتي الشاشة هاتين، وصِف ما تغيّر.»

def compare_two_images(
    image_path_1: str,
    image_path_2: str,
    comparison_question: str
) -> str:
    import anthropic, base64
    client = anthropic.Anthropic(api_key='YOUR_API_KEY')
    b64_1, mime_1 = load_image_as_base64(image_path_1)
    b64_2, mime_2 = load_image_as_base64(image_path_2)

    response = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=512,
        messages=[{
            'role': 'user',
            'content': [
                {'type': 'image', 'source': {'type': 'base64',
                  'media_type': mime_1, 'data': b64_1}},
                {'type': 'image', 'source': {'type': 'base64',
                  'media_type': mime_2, 'data': b64_2}},
                {'type': 'text', 'text': comparison_question}
            ]
        }]
    )
    return response.content[0].text

وكيل الصور: قارئ لقطات الشاشة

من حالات الاستخدام العملية وكيل يقرأ لقطات شاشة التطبيقات لاستخراج قيم حقول النماذج، أو رسائل الخطأ، أو حالة واجهة المستخدم. وهذا مفيد لأتمتة الاختبار ومسارات المراقبة.

SCREENSHOT_READER_PROMPT = (
    'You are a UI analyser. Given this application screenshot, extract:\n'
    '1. The current page/screen name\n'
    '2. Any error messages\n'
    '3. Key UI elements visible (buttons, form fields, text)\n'
    '4. The overall app state\n\n'
    'Return JSON: {"screen": str, "errors": [str], '
    '"elements": [str], "state": str}'
)

def read_screenshot(screenshot_path: str) -> dict:
    import anthropic, base64, json
    client = anthropic.Anthropic(api_key='YOUR_API_KEY')
    b64, mime = load_image_as_base64(screenshot_path)
    response = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=512,
        messages=[{
            'role': 'user',
            'content': [
                {'type': 'image', 'source': {'type': 'base64',
                  'media_type': mime, 'data': b64}},
                {'type': 'text', 'text': SCREENSHOT_READER_PROMPT}
            ]
        }]
    )
    return json.loads(response.content[0].text)

تحسين تكلفة استدعاءات الرؤية

تُعد استدعاءات Vision API أعلى تكلفة بكثير من الاستدعاءات النصية فقط. حسّن التكاليف من خلال: تغيير حجم الصور قبل ترميزها (تقبل معظم النماذج أحجامًا تتراوح بين 512×512 و2048×2048)، واستخدام detail=low للمهام البسيطة، وتخزين نتائج التحليل مؤقتًا للصور التي لم تتغير، وتجميع أسئلة متعددة في استدعاء واحد.

from PIL import Image
import io, base64

def resize_and_encode(
    image_path: str,
    max_dim: int = 1024
) -> tuple:
    img = Image.open(image_path)
    # Resize maintaining aspect ratio
    ratio = min(max_dim / img.width, max_dim / img.height)
    if ratio < 1.0:
        new_w = int(img.width * ratio)
        new_h = int(img.height * ratio)
        img = img.resize((new_w, new_h), Image.LANCZOS)
        print(f'Resized to {new_w}x{new_h} (from {img.width}x{img.height})')

    # Convert to JPEG for smaller size
    buf = io.BytesIO()
    img.save(buf, format='JPEG', quality=85)
    b64 = base64.b64encode(buf.getvalue()).decode('utf-8')
    return b64, 'image/jpeg'

قيود الرؤية والبدائل الاحتياطية

تفرض نماذج الرؤية بعض القيود: فهي لا تستطيع قراءة النصوص الصغيرة جدًا بشكل موثوق، وتواجه صعوبة مع الصور شديدة الضغط، وقد تختلق تفاصيل. تحقّق دائمًا من البيانات المستخرجة المهمة (مثل الأرقام من المخططات) باستخدام prompt احتياطي يطلب درجات الثقة.

def analyze_with_confidence(
    image_path: str,
    question: str,
    confidence_threshold: float = 0.7
) -> dict:
    import anthropic, json
    client = anthropic.Anthropic(api_key='YOUR_API_KEY')
    b64, mime = load_image_as_base64(image_path)

    prompt = (
        question + '\n\nAlso rate your confidence (0.0-1.0) in the answer.\n'
        'Return JSON: {"answer": str, "confidence": float, '
        '"uncertainty_reason": str}'
    )
    response = client.messages.create(
        model='claude-opus-4-5', max_tokens=256,
        messages=[{'role': 'user', 'content': [
            {'type': 'image', 'source': {'type': 'base64',
              'media_type': mime, 'data': b64}},
            {'type': 'text', 'text': prompt}
        ]}]
    )
    result = json.loads(response.content[0].text)
    if result['confidence'] < confidence_threshold:
        result['action'] = 'human_review_needed'
    return result

اختبار المعرفة

ما المعلمة التي تتحكم في مستوى تفاصيل تحليل الصور وتكلفته في OpenAI Vision API؟

مراجعة: وكلاء الصور والنصوص

عمل رائع! إليك ما تعلّمته:

  • الرؤية في OpenAI: مصفوفة content تحتوي على كائنات image_url وtext؛ وتدعم URL وbase64
  • الرؤية في Claude: source.type: base64 مع media_type
  • ترميز Base64: قراءة الملف ← ترميزه بترميز base64 ← تضمينه كعنوان URL للبيانات
  • مستوى التفاصيل: استخدم low للمهام السريعة والرخيصة، وhigh للتحليل الدقيق
  • تحسين التكلفة: غيّر حجم الصور، واجمع الأسئلة، وخزّن النتائج مؤقتًا

التالي: مسارات عمل وكلاء الصوت والنص مع نسخ الكلام باستخدام Whisper واستجابات TTS.

الأسئلة الشائعة

هل درس «وكلاء الصور + النصوص باستخدام Claude Vision وGPT-4V» مجاني؟

نعم — نص درس «وكلاء الصور + النصوص باستخدام Claude Vision وGPT-4V» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «وكلاء الصور + النصوص باستخدام Claude Vision وGPT-4V»؟

إرسال الصور في استدعاءات API، والإسناد البصري، واستخدام الأدوات المدرك للصور. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «وكلاء الصور + النصوص باستخدام Claude Vision وGPT-4V»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. وكلاء الصور + النصوص باستخدام Claude Vision وGPT-4V
  2. سير عمل الوكلاء للصوت + النص
  3. فهم الفيديو لدى الوكلاء
  4. أنماط الاستدلال متعدد الوسائط
← العودة إلى AI Agents