====== Расширенное руководство ======
Данное руководство нацелено на тех, кому не хватает встроенных представлений для отображения ветки сообщений. Для разработки собственных представлений необходимо иметь базовые знания языка [[https://www.python.org|Python]].
===== Разработка представления ветки сообщений =====
Представление выполняет преобразование исходных данных сообщений в требуемый текстовый формат. Для начала нужно познакомиться со структурой данных, с которыми предстоит работать. Представлению на вход подается список из экземпляров датакласса **DeepSeekMessage**.
Класс **DeepSeekMessage** это датакласс, который содержит в себе информацию о сообщении Deepseek. Он состоит из следующих полей:
* //model// - модель нейросети (константа типа **Model**)
* //inserted_datetime// - время добавления сообщения (объект класса **[[https://docs.python.org/3/library/datetime.html#datetime-objects|datetime]]**)
* //fragments// - фрагменты сообщения (список экземпляров класса **Fragment**)
Класс **Model**, вложенный в **DeepSeekMessage** представляет из себя класс-перечисление, кодирует модель нейросети, которая обрабатывала запрос, имеет следующие значения:
* ''UNKNOWN'' - неизвестная модель
* ''DEEPSEEK_CHAT'' - обычная разговорная модель
* ''DEEPSEEK_REASONER'' - модель с включенным рассуждением
Класс **Fragment**, вложенный в **DeepSeekMessage** представляет из себя датакласс, который содержит информацию о фрагменте сообщения, он имеет следующие поля:
* //type// - тип фрагмента (константа типа **Type**)
* //content// - текстовые данные сообщения
* //search_result// - список экземпляров класса **SearchResultItem** (содержит результаты поиска, если тип фрагмента ''TOOL_SEARCH'', иначе - пуст)
Класс **Type**, вложенный в **Fragment** представляет из себя класс-перечисление, который кодирует тип фрагмента, имеет значения:
* ''REQUEST'' - пользовательский запрос
* ''RESPONSE'' - ответ нейросети
* ''THINK'' - результат "размышления" нейросети
* ''TOOL_SEARCH'' - результаты поиска в интернете
Класс **SearchResultItem**, вложенный в **Fragment** представляет из себя датакласс, который содержит информацию о результате поиска в интернете, имеет следующие поля:
* //url// - url-адрес найденной страницы
* //title//- заголовок найденной страницы
{fragment.content} {fragment.content} {fragment.content}
from typing import Iterable
from DeepSeekExtractor.view.datatypes import DeepSeekMessage
from DeepSeekExtractor.view.chat_views import ChatViewBase
from DeepSeekExtractor.view import langconsts as lc
class MyView(ChatViewBase):
title = "My View"
type = ChatViewBase.Type.HTML5
@classmethod
def message_to_text(cls, message: DeepSeekMessage) -> str:
text = ""
dt_format = '%d.%m.%Y %H:%M:%S'
for fragment in message.fragments:
match fragment.type:
case DeepSeekMessage.Fragment.Type.REQUEST:
text += f""
text += f"
Представление это класс **MyView**, который наследуется от **ChatViewBase**, он имеет ряд обязательных атрибутов:
* //title// - это заголовок представления, он будет отображаться в списке, может быть строкой или [[products:pyrog:api:latest:types:lang_constant|языковой константой]]
* //type// - тип представления (константа типа **ChatViewBase.Type**)
**ChatViewBase.Type** - это класс-перечисление, определяет как будет отображаться текст представления, имеет следующие значения:
* ''PLAIN_TEXT'' - обычный текст, никак не форматируется при отображении, для отображения используется виджет [[https://doc.qt.io/qtforpython-6.8/PySide6/QtWidgets/QPlainTextEdit.html|QPlainTextEdit]]
* ''HTML4'' - язык гипертекста 4й версии, для отображения используется виджет [[https://doc.qt.io/qtforpython-6.8/PySide6/QtWidgets/QTextEdit.html|QTextEdit]]
* ''MARKDOWN'' - простой язык текстовой разметки Markdown, для отображения используется виджет [[https://doc.qt.io/qtforpython-6.8/PySide6/QtWidgets/QTextEdit.html|QTextEdit]]
* ''HTML5'' - язык гипертекста 5й версии, для отображения используется виджет [[https://doc.qt.io/qtforpython-6.8/PySide6/QtWebEngineWidgets/QWebEngineView.html|QWebEngineView]]
{lc.THINKING}
\
{lc.SEARCH}
\
"
for i in fragment.search_result:
text += f"