وكلاء الصور + النصوص باستخدام 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- وكلاء الصور + النصوص باستخدام Claude Vision وGPT-4V
- سير عمل الوكلاء للصوت + النص
- فهم الفيديو لدى الوكلاء
- أنماط الاستدلال متعدد الوسائط