ChatMessage.from_openai_dict_format wraps list-of-parts content in TextContent, breaking msg.text contract
I maintainer di solito rispondono entro 1 giorno
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
Describe the bug
ChatMessage.from_openai_dict_format only handles content as a plain string for user, system, and developer messages. When content is a list of content parts (the standard OpenAI Chat Completions format for multimodal messages, and also valid for text-only messages), the whole list is passed verbatim into a single TextContent. Only the tool role branch handles list content.
As a result:
msg.textreturns alistinstead ofstr, violating thestr | Nonecontract ofChatMessage.text/TextContent.text.msg.to_dict()andmsg.to_openai_dict_format()emit invalid content (a list nested where a string is expected), so the message cannot be round-tripped or sent back to OpenAI.- Image/file parts are silently corrupted into "text" instead of
ImageContent/FileContent.
To Reproduce
from haystack.dataclasses import ChatMessage
b64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII="
msg = ChatMessage.from_openai_dict_format({
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
],
})
print(type(msg.text)) # <class 'list'> — should be str
print(msg.images) # [] — the image part is lost
print(msg.to_openai_dict_format())
# {'role': 'user', 'content': [{'type': 'text', 'text': 'What is in this image?'}, ...]}
# is what you'd expect, but instead 'content' is the raw list stringified inside a TextContent,
# producing an invalid OpenAI payload on re-serialization
Expected behavior
{"type": "text"}parts becomeTextContent,{"type": "image_url"}parts with base64 data URLs becomeImageContent,{"type": "file"}parts with inlinefile_databecomeFileContent(the exact inverse ofto_openai_dict_format, which already produces these part formats).msg.textreturns the first text part asstr.system/developermessages accept lists of text parts.- Unsupported parts (non-data image URLs,
file_idreferences, unknown types) raiseValueErrorinstead of silently corrupting the message.
Describe your environment (please complete the following information):
- OS: macOS
- Haystack version: current
main(d10abda, 3.2.0rc0); also reproducible on 2.x releases - Python version: 3.13
I have a fix ready and will open a PR shortly.
- Lingua principale
- Python
- Stelle
- 26.8k
- Fork
- 3.3k
- Merge medio
- 1g 3h
- PR unite (30g)
- 247
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di deepset-ai/haystack
-
CSVToDocument accepts an unsupported conversion_mode and silently converts in row modeForse già presa @Lesereingrape l’ha presa 26 giorni fa. ApertaP3
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
deepset-ai/haystack#13070 ·
I maintainer di solito rispondono entro 1 giorno
-
PPTXToDocument drops soft line breaks when link_format is markdown or plainForse già presa @bogdankostic l’ha presa 16 giorni fa. ApertaP3
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
deepset-ai/haystack#13043 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
InMemoryDocumentStore: count_unique_metadata_by_filter and get_metadata_field_unique_values disagree on int/float/bool valuesForse già presa @julian-risch l’ha presa 26 giorni fa. ApertaP3
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
deepset-ai/haystack#13040 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
AutoMergingRetriever raises ValueError when a matched document has no parent (for example the root document)Forse già presa @julian-risch l’ha presa 27 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
deepset-ai/haystack#13029 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
CSVToDocument row mode fails on CR-separated CSV inputForse già presa @julian-risch l’ha presa 26 giorni fa. ApertaP3
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
deepset-ai/haystack#13022 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di deepset-ai/haystack
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
521xueweihan/HelloGitHub#4150 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
aws-samples/sample-per-model-bedrock#595 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
bug connectors
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 67/100
pyinfra-dev/pyinfra#2036 ·
I maintainer di solito rispondono entro 9 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno