Как вести тредовые переписки?

Контекст в многоходовых email-диалогах.

Треды — способ Agent Inbox группировать беседы. Новое письмо агента создаёт тред; ответы попадают в тот же тред с полной историей.

Как это работает

  1. Агент отправляет письмо — создаётся тред
  2. Получатель отвечает — ответ в том же треде
  3. Агент отвечает снова — снова тот же тред
  4. Вся история в одном месте

Треды создаются автоматически по заголовкам Message-ID, In-Reply-To, References.

Список тредов

По ящику

Python
1threads = client.inboxes.threads.list(
2 inbox_id="agent@agentinbox.space"
3)
4
5for t in threads.threads:
6 print(f"Thread: {t.subject} ({t.message_count} messages)")

По всей организации

Python
1# Get all threads from every inbox in your organization
2all_threads = client.threads.list()

Удобно для супервизоров, аналитики и маршрутизации между агентами.

Полный тред

Python
1thread = client.threads.get(thread_id="thread_abc123")
2
3for message in thread.messages:
4 print(f"From: {message.from_}")
5 print(f"Subject: {message.subject}")
6 print(f"Body: {message.text}")

Ответ в треде

Отвечайте на последнее сообщение:

Python
1thread = client.threads.get(thread_id="thread_abc123")
2last_message = thread.messages[-1]
3
4client.inboxes.messages.reply(
5 inbox_id="agent@agentinbox.space",
6 message_id=last_message.message_id,
7 text="Thanks for your message! Here's what I found...",
8 html="<p>Thanks for your message! Here's what I found...</p>"
9)

Указывайте и text, и html для ответов.

Цитаты в ответах

Поля extracted_text и extracted_html — только новый текст ответа без истории цитирования.

Python
1new_content = message.extracted_text
2content = message.extracted_text or message.text

Метки и состояние

Python
1unreplied = client.inboxes.threads.list(
2 inbox_id="agent@agentinbox.space",
3 labels=["unreplied"]
4)
5
6for thread in unreplied.threads:
7 thread_detail = client.threads.get(thread.thread_id)
8 last_message = thread_detail.messages[-1]
9
10 reply_text = your_agent.process(last_message)
11 client.inboxes.messages.reply(
12 inbox_id="agent@agentinbox.space",
13 message_id=last_message.message_id,
14 text=reply_text,
15 html=f"<p>{reply_text}</p>"
16 )
17
18 client.inboxes.messages.update(
19 inbox_id="agent@agentinbox.space",
20 message_id=last_message.message_id,
21 add_labels=["replied"],
22 remove_labels=["unreplied"]
23 )

Советы

  • Треды сохраняют контекст многоходовых диалогов
  • client.threads.list() — для дашбордов и маршрутизации
  • Метки вроде unreplied, escalated, resolved для состояния
  • Ответ всегда на последнее сообщение в треде