Gpt vision телеграм бот

пишу телеграмм бота который совместно с ghat gpt и наткнулся на проблему когда начал внедрять gpt vision, т.е. бот должен принимать картинку и отправлять в текстовом формате описание картинки

вот сама функция

async def encode_image(image_path):
    async with aiofiles.open(image_path, "rb") as image_file:
        return base64.b64encode(await image_file.read()).decode('utf-8')


async def gpt_vision(req, model, file):
    base64_image = await encode_image(file)
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {AITOKEN}"
    }
    payload = { 
        "model": model,
        "messages": [
            {
                "role": "user",
                "content": req  # Передаем только текст в "content"
            },
            {
                "role": "user",
                "content": f"data:image/jpeg;base64,{base64_image}"  # Изображение передаем отдельно
            }
        ],
        "max_tokens": 300
    }

    async with aiohttp.ClientSession() as session:
        async with session.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload) as response:
            completion = await response.json()

    return {
        'response': completion['choices'][0]['message']['content'],
        'usage': completion['usage']['total_tokens']
    }

вот обработчик

    #GPT Vision
@user.message(Chat.text, F.photo)
async def chat_response(message: Message, state: FSMContext):
    user = await get_user(message.from_user.id)
    if Decimal(user.balance)>0:
        await state.set_state(Chat.wait)
        file = await message.bot.get_file(message.photo[-1].file_id)
        file_path = file.file_path
        file_name = uuid.uuid4()
        await message.bot.download_file(file_path, f'{file_name}.jpeg')
        response = await gpt_vision(message.text, 'gpt-4o', f'{file_name}.jpeg')
        await calculate(message.from_user.id, response['usage'], 'gpt-4o', user)
        await message.answer(response['response'])
        os.remove(f'{file_name}.jpeg')
    else:
        await message.answer('Недостаточно средств на балансе.')

а вот ошибка в терминале

    Cause exception while process update id=962171664 by bot id=7505301851
BadRequestError: Error code: 400 - {'error': {'message': "Invalid value for 'content': expected a string, got null.", 'type': 'invalid_request_error', 'param': 'messages.[0].content', 'code': None}}
Traceback (most recent call last):
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 309, in _process_update
    response = await self.feed_update(bot, update, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 158, in feed_update  
    response = await self.update.wrap_outer_middleware(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\middlewares\error.py", line 25, in __call__
    return await handler(event, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\middlewares\user_context.py", line 56, in __call__
    return await handler(event, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\fsm\middleware.py", line 42, in __call__
    return await handler(event, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\event\telegram.py", line 121, in trigger  
    return await wrapped_inner(event, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\event\handler.py", line 43, in call       
    return await wrapped()
           ^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 276, in _listen_update
    return await self.propagate_event(update_type=update_type, event=event, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\router.py", line 146, in propagate_event  
    return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\router.py", line 141, in _wrapped
    return await self._propagate_event(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\router.py", line 174, in _propagate_event 
    response = await router.propagate_event(update_type=update_type, event=event, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\router.py", line 146, in propagate_event  
    return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\router.py", line 141, in _wrapped
    return await self._propagate_event(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\router.py", line 166, in _propagate_event 
    response = await observer.trigger(event, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\event\telegram.py", line 121, in trigger  
    return await wrapped_inner(event, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\aiogram\dispatcher\event\handler.py", line 43, in call       
    return await wrapped()
           ^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\app\user.py", line 36, in chat_response
    response = await gpt_text(message.text, 'gpt-4o')
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\app\generators.py", line 11, in gpt_text
    completion = await client.chat.completions.create(
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\openai\resources\chat\completions.py", line 1633, in create  
    return await self._post(
           ^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\openai\_base_client.py", line 1838, in post
    return await self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\openai\_base_client.py", line 1532, in request
    return await self._request(
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\Desktop\project\Sudo tech\AiBot\.venv\Lib\site-packages\openai\_base_client.py", line 1633, in _request
    raise self._make_status_error_from_response(err.response) from None
openai.BadRequestError: Error code: 400 - {'error': {'message': "Invalid value for 'content': expected a string, got null.", 'type': 'invalid_request_error', 'param': 'messages.[0].content', 'code': None}}

Ответы (0 шт):