Python Fehlermeldung "KeyError: 'data'"?
Ich möchte gerne einen KI Discord Server machen. Die KI hab ich schon und diese hat auch eine API(?). Ich hab den Bot auch schon auf dem Server und ich kann auch Prompts eingeben. Aber wenn ich Prompt eingebe, kommt bei diesem Code:
import discord
from gradio_client import Client
TOKEN = 'MeinToken'
FOOOCUS_API_URL = 'http://127.0.0.1:7865/'
fooocus_client = Client(FOOOCUS_API_URL)
intents = discord.Intents.default()
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'{client.user} ist eingeloggt!')
@client.event
async def on_message(message):
if message.channel.name == 'prompt-kanal' and message.author != client.user:
result = fooocus_client.predict(message.content, fn_index=2)
await message.channel.send(file=discord.File(result))
client.run(TOKEN)
Diese Fehlermeldung:
2024-04-16 15:35:07 ERROR discord.client Ignoring exception in on_message
Traceback (most recent call last):
File "C:...\venv\Lib\site-packages\gradio_client\compatibility.py", line 105, in _predict
output = result["data"]
~~~~~~^^^^^^^^
KeyError: 'data'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:...\venv\Lib\site-packages\discord\client.py", line 441, in _run_event
await coro(*args, **kwargs)
File "c:...\bot.py", line 19, in on_message
result = fooocus_client.predict(message.content, fn_index=2)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:...\venv\Lib\site-packages\gradio_client\client.py", line 459, in predict
).result()
^^^^^^^^
File "C:...\venv\Lib\site-packages\gradio_client\client.py", line 1374, in result
return super().result(timeout=timeout)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users..._base.py", line 456, in result
return self.__get_result()
^^^^^^^^^^^^^^^^^^^
File "C:\Users..._base.py", line 401, in __get_result
raise self._exception
File "C:\Users...\thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:...\compatibility.py", line 65, in _inner
predictions = _predict(*data)
^^^^^^^^^^^^^^^
File "C:...\compatibility.py", line 119, in _predict
raise KeyError(
KeyError: 'Could not find 'data' key in response. Response received: {'detail': [{'type': 'model_attributes_type', 'loc': ['body'], 'msg': 'Input should be a valid dictionary or object to extract fields from', 'input': '{"data": [""], "fn_index": 2, "session_hash": "d7f62bf0-174c-45fe-b3f6-c5e7f00848d3"}', 'url': 'https://errors.pydantic.dev/2.1/v/model_attributes_type'}]}'
Ich checke einfach nicht, woran das liegen könnte...
2 Antworten
Schauen wir uns die Fehlermeldung doch mal an:
KeyError: 'Could not find 'data' key in response.
Die Antwort muß einen Schlüssel Data beinhalten, schauen wir auf die Antwort:
Response received:
{'detail': [{'type': 'model_attributes_type',
'loc': ['body'],
'msg': 'Input should be a valid dictionary or object to extract fields from',
'input': '{"data": [""], "fn_index": 2, "session_hash": "d7f62bf0-174c-45fe-b3f6-c5e7f00848d3"}', 'url': 'https://errors.pydantic.dev/2.1/v/model_attributes_type'}]}
D.h. die Antwort der Gegenseite entspricht nicht dem erwarteten Format, weswegen es zu einem Fehler kommt. Das liegt unter anderem daran, daß die Antwort selbst eien Fehlermeldung ist, weil der Input nicht den Erwartungen entspricht.
Beachte insbesondere:
'input': '{"data": [""]
Du mußt Dir also in erster Linie die Frage stellen, warum Dein Aufruf von predict eine Liste mit einem leeren String erzeugt.
Und um das zu ergänzen, aus der API Doku von discord:
The actual contents of the message. If intents.message_content is not enabled this will always be an empty string unless the bot is mentioned or the message is a direct message.
Schau Dir also mal die Daten genauer an, die Dein on_message geliefert bekommt. Das andere ist: Fehlerbehandlung ist kein Luxus.
Setze in dieser Zeile: "result = fooocus_client.predict(message.content, fn_index=2)" einen Breakpoint und schaue nach, welchen Output du erhältst. Nach deiner Fehlermeldung sollte es definitiv ein Dictionary mit dem Key "data" geben. Falls nicht, dann solltest du den Fehler in dieser Zeile beheben können.