0Pricing
AI Agents · Lekcja

Agenci obrazu i tekstu z Claude Vision i GPT-4V

Wysyłanie obrazów w wywołaniach API, ugruntowanie wizualne i używanie narzędzi uwzględniające obrazy.

Agenci obrazu i tekstu z Claude Vision i GPT-4V to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.

Agenci multimodalni: obrazy i tekst

Agent multimodalny potrafi nie tylko czytać, ale także widzieć. Dzięki wysyłaniu obrazów wraz z tekstem w tym samym wywołaniu API agent może odpowiadać na pytania dotyczące zdjęć, analizować wykresy, odczytywać zrzuty ekranu i opisywać diagramy — wszystko w ramach tej samej pętli konwersacyjnej.

Wysyłanie obrazów za pomocą API OpenAI

Modele wizyjne OpenAI (GPT-4o, GPT-4V) przyjmują tablicę content zamiast zwykłego ciągu znaków. Każdy element jest obiektem text albo obiektem image_url. Obraz może być publicznym adresem URL albo adresem URL danych zakodowanych w 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)

Kodowanie obrazu w formacie Base64

Obrazy, które nie są publicznie dostępne (pliki lokalne, zrzuty ekranu, przesłane pliki użytkowników), należy zakodować w formacie base64 i osadzić bezpośrednio w wywołaniu API za pomocą schematu adresu 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']))

API Claude Vision

Modele Claude firmy Anthropic również obsługują widzenie. Blok treści używa pola source z wartościami type: base64 i media_type. Struktura różni się nieco od struktury OpenAI, ale jest równie funkcjonalna.

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)

Wykrywanie typu MIME na podstawie rozszerzenia pliku

Różne formaty obrazów (JPEG, PNG, GIF, WebP) używają różnych typów MIME. Należy automatycznie wykrywać typ MIME na podstawie rozszerzenia pliku, aby nigdy nie trzeba było wpisywać go na stałe w kodzie agenta.

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')

Analiza obrazów w pętli agenta

W pętli agenta analiza obrazu jest narzędziem. Agent decyduje, kiedy je wywołać, tak jak w przypadku każdego innego narzędzia. Należy zdefiniować je w schemacie narzędzi i zwracać uporządkowane dane (JSON), aby agent mógł programowo je analizować.

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)

Sterowanie poziomem szczegółowości obrazu (OpenAI)

API wizyjne OpenAI przyjmuje parametr detail: low (szybka i tania analiza, 85 tokenów), high (szczegółowa analiza, obraz jest dzielony na kafelki, do 1105 tokenów) albo auto (decyduje model). Należy używać low w przypadku prostych pytań typu tak/nie, a high do szczegółowej analizy, na przykład odczytywania małego tekstu.

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

Rozmowy z wieloma obrazami

Można wysłać wiele obrazów w jednej wiadomości albo w kolejnych turach rozmowy. Umożliwia to zadania porównawcze: „Porównaj te dwa zrzuty ekranu i opisz, co się zmieniło”.

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

Agent wizyjny: odczytywanie zrzutów ekranu

Praktyczny przypadek użycia to agent odczytujący zrzuty ekranu aplikacji w celu wyodrębnienia wartości pól formularzy, komunikatów o błędach lub stanu interfejsu użytkownika. Jest to przydatne w automatyzacji testów i potokach monitorowania.

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)

Optymalizacja kosztów wywołań wizyjnych

Wywołania wizyjnych API są znacznie droższe niż wywołania obsługujące wyłącznie tekst. Koszty można optymalizować przez: zmianę rozmiaru obrazów przed ich zakodowaniem (większość modeli przyjmuje obrazy od 512×512 do 2048×2048), używanie detail=low do prostych zadań, buforowanie wyników analizy niezmienionych obrazów oraz łączenie wielu pytań w jednym wywołaniu.

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'

Ograniczenia widzenia i rozwiązania awaryjne

Modele wizyjne mają ograniczenia: nie potrafią niezawodnie odczytywać bardzo małego tekstu, mają trudności z mocno skompresowanymi obrazami i mogą halucynować szczegóły. Zawsze należy weryfikować krytyczne wyodrębnione dane (np. liczby z wykresów) za pomocą zapasowego promptu z prośbą o podanie ocen pewności.

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

Sprawdzenie wiedzy

Jaki parametr steruje poziomem szczegółowości i kosztem analizy obrazu w wizyjnym API OpenAI?

Podsumowanie: agenci obrazu i tekstu

Świetna praca! Oto omówione zagadnienia:

  • Widzenie OpenAI: tablica content z obiektami image_url i text; obsługuje adresy URL i base64
  • Widzenie Claude: source.type: base64 z polem media_type
  • Kodowanie Base64: odczytanie pliku → zakodowanie w base64 → osadzenie jako adresu URL danych
  • Poziom szczegółowości: low do szybkiej i taniej analizy, high do szczegółowej analizy
  • Optymalizacja kosztów: zmiana rozmiaru obrazów, łączenie pytań, buforowanie wyników

Następnie: potoki agentów audio-tekstowych z transkrypcją Whisper i odpowiedziami TTS.

Często zadawane pytania

Czy lekcja „Agenci obrazu i tekstu z Claude Vision i GPT-4V” jest bezpłatna?

Tak — pełny tekst „Agenci obrazu i tekstu z Claude Vision i GPT-4V” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.

Co nauczysz się w „Agenci obrazu i tekstu z Claude Vision i GPT-4V”?

Wysyłanie obrazów w wywołaniach API, ugruntowanie wizualne i używanie narzędzi uwzględniające obrazy. Ćwiczysz AI Agents z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Agents?

Nie wymagamy żadnego doświadczenia. AI Agents w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Agenci obrazu i tekstu z Claude Vision i GPT-4V”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Agents?

Tak. Każda lekcja AI Agents zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Agenci obrazu i tekstu z Claude Vision i GPT-4V
  2. Przepływy pracy agentów audio i tekstu
  3. Rozumienie wideo przez agentów
  4. Wzorce rozumowania między modalnościami
← Powrót do AI Agents