* * *
Ve vašem výpisu už nevidím skutečný text zprávy rozdělený do několika jazykově smíšených fragmentů, ale hromadný seznam objektů citací, který je součástí metadat. Podívejme se, jak to celé sedí:
-
Obsah zprávy (text uživatele nebo asistenta) je vždy v poli
message.content.parts
a to je pouze seznam řetězců (stringů), například
"parts": [ "Toto je celý text jedné odpovědi..." ]
nebo u multimédií seznam „asset“ objektů.
-
Separátně od
parts
bývají vmessage.metadata
různé další pole, například"citations": [ {...}, {...}, … ]
a v nich najdete objekty tvaru
{ "start_ix": 423, "end_ix": 435, "citation_format_type": "tether_v4", "metadata": { "type": "webpage", "title": "Mapování psychologických tendencí…", "url": "https://…", "text": "Uživatel TJV ve svých příspěvcích...", … } }
Tyto objekty nejsou částí pole
parts
, ale (message.metadata.citations
) – takže nejsou přímo součástí pořadí textu, jen k němu dodatečně odkazují (pomocístart_ix
/end_ix
) na úseky textu. -
Všechny zprávy i citace jsou zabaleny ve stromu
mapping
. Ten vám říká, kterámessage
(uzel) je rodič, které uzly jsou děti atd.
Shrnutí struktury jedné zprávy
"node_id": {
"id": "…",
"message": {
"id": "…",
"author": { "role": "user" },
"create_time": 1748…,
"content": {
"content_type": "text",
"parts": [
"Toto je normální text zprávy; tady je celý řetězec."
]
},
"status": "finished_successfully",
"metadata": {
// další meta, včetně:
"citations": [
{
"start_ix": 423,
"end_ix": 435,
"citation_format_type": "tether_v4",
"metadata": { "type": "webpage", "title": "…", "url": "…", "text": "…" }
},
…
]
}
},
"parent": "…",
"children": [ … ]
}
-
parts
obsahuje čistě text (nebo assety). -
metadata.citations
obsahuje objekty, které popisují, jaké citace nebo odkazy se v tom textu vyskytují (ale nejsou to přímé fragmentyparts
). -
Když chcete vypsat reálné vzkazy, projděte vždy
mapping → node["message"]["content"]["parts"]
a ignorujtemetadata.citations
, pokud se vám nechce ty citace detailně zpracovávat.
Takže ten kus, který jste ukázal:
{"start_ix": 423, "end_ix": 435, "citation_format_type": "tether_v4", "metadata": { … }},
{"start_ix": 5026, …}
je právě první a druhý objekt ve seznamu citací message.metadata.citations
, nikoli pokračování řetězce zprávy. Každý takový objekt má:
-
start_ix
/end_ix
– pozice v původním textu, kam se citace vztahuje -
citation_format_type
– formát (např. tether_v4) -
metadata
– podrobné údaje o dané citaci (URL, titul článku, výňatek textu…)
Doporučení pro parsování
-
Pro čistý text concatenujte všechny položky
parts
. -
Pokud vás citace zajímají, přečtěte si
message.metadata.citations
jako samostatné pole. -
Nemíchejte objekty z
citations
sparts
— jsou to dvě různé vrstvy informací.
* * *
V exportovaném JSONu je každá položka v poli jsonData
celé jedno „sezení“ (chat). Uvnitř každé položky najdeš:
-
Metainformace sezení
-
title
– název/chunk celé session -
create_time
/update_time
– kdy bylo sezení vytvořeno a naposledy změněno
-
-
mapping
– slovník všech uzlů (node), kde klíčem jeid
uzlu a hodnotou objekt:"mapping": { "<node-id>": { "id": "<node-id>", "message": { … } // nebo null pro kořen "parent": "<parent-node-id>" // nebo null "children": ["<child-id-1>", …] }, … }
-
Uzel s
message: null
(většinou"client-created-root"
) je virtuální kořen. -
Ostatní uzly mají v
message
skutečnou zprávu.
-
-
Struktura jedné zprávy (
message
)"message": { "id": "...", "author": { "role": "user" | "assistant" | "system", … }, "create_time": <float nebo null>, "content": { "content_type": "text" | "...", "parts": [ "<celý text té jedné zprávy jako jeden řetězec>" ] // u jiných typů obsahu tu mohou být asset ukazatele místo běžného textu }, "status": "...", "metadata": { "citations": [ { "start_ix":…, "end_ix":…, "metadata": { "url":…, "text":… } }, … ], // další meta jako request_id, parent_id atd. }, "recipient": "...", "channel": "..." }
-
content.parts
: ZÁKLADNÍ TEXT zprávy – list řetězců, typicky jednprvkový (parts[0]
je celý text). -
metadata.citations
: Samostatné bloky s informacemi o citacích v textu (např. zdroj URL, vypíchnutý text), ale nejsou částíparts
.
-
Jak na to:
-
Sezení (chat) = jedna položka v
jsonData
. -
Uzel = jeden záznam ve
mapping
.-
Pokud
message
≠ null → je to opravdová zpráva. -
message.content.parts
→ ZPRÁVA. -
message.metadata.citations
→ DODATEČNÉ INFO o tom, co v textu citujete (nejsou to další části textu).
-
Příklad průchodu:
for session in jsonData:
title = session["title"]
print("=== Sezení:", title)
for node_id, node in session["mapping"].items():
msg = node["message"]
if msg:
author = msg["author"]["role"]
text = msg["content"]["parts"][0]
print(f"- {author}: {text[:30]!r}…")
# pokud chcete i citace:
for c in msg["metadata"].get("citations", []):
print(" * citace:", c["metadata"]["text"][:30], "…")
Takhle jasně oddělíte:
-
Normální text (parts)
-
Citace (metadata.citations)
a získáte kompletní obraz struktury i obsahu.
Žádné komentáře:
Okomentovat