@vint.tri/report_gen_mcp 1.5.40 → 1.5.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FIXED_NEURAL_NETWORK_INSTRUCTIONS_APPLE_REPORT.md +986 -0
- package/dist/images/localImages.d.ts +2 -2
- package/dist/images/pollinations.d.ts +5 -5
- package/dist/images/urlImages.d.ts +3 -3
- package/dist/index.js +8 -3
- package/dist/tools/simpleReport.d.ts +1 -0
- package/dist/tools/simpleReport.d.ts.map +1 -1
- package/dist/tools/simpleReport.js +2 -2
- package/dist/utils/reportGenerator.d.ts +1 -1
- package/dist/utils/reportGenerator.d.ts.map +1 -1
- package/dist/utils/reportGenerator.js +46 -3
- package/package.json +1 -1
- package/test_http_images.js +44 -0
|
@@ -0,0 +1,986 @@
|
|
|
1
|
+
# ИСПРАВЛЕННЫЕ Инструкции для нейросети по работе с инструментом report_gen_mcp v1.7.3 - Исправление проблемы с отображением изображений
|
|
2
|
+
|
|
3
|
+
**ВАЖНО:** ВСЕГДА ИСПОЛЬЗУЙТЕ ИНСТРУМЕНТ `report_gen_mcp` КАЖДЫЙ РАЗ, КОГДА ПОЛЬЗОВАТЕЛЬ ЗАПРАШИВАЕТ СОЗДАНИЕ ОТЧЕТА, ВИЗУАЛИЗАЦИЮ ДАННЫХ, ДИАГРАММУ, ГРАФИК ИЛИ ЛЮБОЕ ИЗМЕНЕНИЕ СУЩЕСТВУЮЩЕГО ОТЧЕТА!
|
|
4
|
+
|
|
5
|
+
Этот документ содержит специальные инструкции для нейросети при работе с инструментом `report_gen_mcp`, чтобы обеспечить правильное взаимодействие с пользователем после генерации отчетов, особенно при работе с изображениями.
|
|
6
|
+
|
|
7
|
+
## Обязательное использование инструмента
|
|
8
|
+
|
|
9
|
+
**КЛЮЧЕВОЕ ПРАВИЛО:** КАЖДЫЙ РАЗ, КОГДА ПОЛЬЗОВАТЕЛЬ ХОЧЕТ ПОЛУЧИТЬ ОТЧЕТ, ВИЗУАЛИЗАЦИЮ ДАННЫХ, ДИАГРАММУ, ГРАФИК, ИЛИ ПОПРОСИТЬ ЧТО-ЛИБО ДОБАВИТЬ/ИЗМЕНИТЬ В СУЩЕСТВУЮЩЕМ ОТЧЕТЕ, НЕЗАВИСИМО ОТ ФОРМАТА ЗАПРОСА, ВЫ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ ИНСТРУМЕНТ `report_gen_mcp`!
|
|
10
|
+
|
|
11
|
+
НЕ пытайтесь создавать отчеты самостоятельно или предлагать пользователю делать это вручную. ВСЕГДА используйте инструмент `report_gen_mcp`.
|
|
12
|
+
|
|
13
|
+
## Общие принципы работы
|
|
14
|
+
|
|
15
|
+
При использовании инструмента `report_gen_mcp` для генерации отчетов, нейросеть должна следовать определенному протоколу взаимодействия с пользователем, чтобы обеспечить полную и удобную работу с созданными отчетами.
|
|
16
|
+
|
|
17
|
+
## Поддерживаемые элементы отчета
|
|
18
|
+
|
|
19
|
+
Инструмент поддерживает вставку в отчеты следующих элементов:
|
|
20
|
+
1. **Диаграммы** (charts) - различные типы графиков (bar, line, pie, doughnut, radar, polarArea)
|
|
21
|
+
2. **Изображения** (images) - три типа:
|
|
22
|
+
- Сгенерированные сервисом pollinations.ai по текстовому описанию
|
|
23
|
+
- По URL из интернета
|
|
24
|
+
- **ВАЖНО:** Локальные файлы на компьютере пользователя также поддерживаются, но они должны быть указаны как относительные пути или абсолютные пути в системе пользователя
|
|
25
|
+
|
|
26
|
+
## Требования к оформлению отчетов
|
|
27
|
+
|
|
28
|
+
При создании отчетов необходимо придерживаться следующих требований по оформлению:
|
|
29
|
+
|
|
30
|
+
1. **Красивое форматирование**:
|
|
31
|
+
- Используйте заголовки разных уровней (H1, H2, H3) для структурирования контента
|
|
32
|
+
- Добавляйте списки (маркированные и нумерованные) для лучшей читаемости
|
|
33
|
+
- Используйте выделение важной информации (жирный шрифт, курсив)
|
|
34
|
+
- Разделяйте смысловые блоки пустыми строками
|
|
35
|
+
|
|
36
|
+
2. **Визуализация данных**:
|
|
37
|
+
- Всегда добавляйте диаграммы для числовых данных
|
|
38
|
+
- Выбирайте подходящий тип диаграммы в зависимости от характера данных
|
|
39
|
+
- Добавляйте поясняющие подписи к диаграммам
|
|
40
|
+
- Используйте разнообразные цвета для лучшей визуализации
|
|
41
|
+
- **ВАЖНО**: Все диаграммы автоматически создаются с адекватными размерами (примерно 400x300 пикселей) для лучшего визуального восприятия и пропорциональности в отчете
|
|
42
|
+
- Диаграммы автоматически оборачиваются в контейнеры с CSS классами для обеспечения правильного масштабирования и отступов
|
|
43
|
+
- Все диаграммы должны быть интерактивными (с использованием Chart.js)
|
|
44
|
+
|
|
45
|
+
3. **Изображения**:
|
|
46
|
+
- Добавляйте тематические изображения для иллюстрации контента
|
|
47
|
+
- Используйте изображения высокого качества
|
|
48
|
+
- Добавляйте альтернативный текст для изображений
|
|
49
|
+
- При необходимости регулируйте размеры изображений
|
|
50
|
+
- Каждый отчет должен содержать картинку, отражающую его суть
|
|
51
|
+
- **ОСОБЕННОСТИ РАБОТЫ С ЛОКАЛЬНЫМИ ИЗОБРАЖЕНИЯМИ:**
|
|
52
|
+
* При использовании локальных файлов изображений (file://) браузеры могут блокировать их отображение по соображениям безопасности
|
|
53
|
+
* Для просмотра отчетов с локальными изображениями рекомендуется использовать Web link 2 (http://localhost:3000/...)
|
|
54
|
+
* Альтернативно, пользователь может открыть файл напрямую в браузере через file:// ссылку
|
|
55
|
+
* **РЕШЕНИЕ ПРОБЛЕМЫ:** Все локальные изображения автоматически встраиваются в отчет в формате base64, что гарантирует их отображение при открытии файла напрямую
|
|
56
|
+
|
|
57
|
+
4. **Анализ данных**:
|
|
58
|
+
- Каждый отчет должен содержать подробный анализ данных
|
|
59
|
+
- Анализ должен включать выводы, закономерности и рекомендации
|
|
60
|
+
- Используйте структурированный подход к анализу с выделением ключевых моментов
|
|
61
|
+
|
|
62
|
+
5. **Сравнительные графики**:
|
|
63
|
+
- Если отчет объединяет несколько сущностей, все их нужно отражать в одних и тех же сравнительных графиках
|
|
64
|
+
- Используйте разные цвета и стили для различения сущностей на графиках
|
|
65
|
+
- Добавляйте легенды и пояснения для лучшего понимания сравнительных данных
|
|
66
|
+
|
|
67
|
+
6. **Текстовое форматирование**:
|
|
68
|
+
- Текст в отчетах автоматически форматируется с использованием HTML-разметки для улучшения читаемости
|
|
69
|
+
- Отчеты имеют профессиональный внешний вид с улучшенным стилем, включая:
|
|
70
|
+
* Четкую типографику с выравниванием текста по ширине
|
|
71
|
+
* Стилизованные заголовки с цветовой индикацией
|
|
72
|
+
* Улучшенное оформление списков и абзацев
|
|
73
|
+
* Цветовое выделение важной информации (жирный шрифт красного цвета, курсив зеленого цвета)
|
|
74
|
+
- Следите за форматированием текста, графиков и картинок - они не должны быть на весь экран
|
|
75
|
+
- Все элементы должны быть оформлены в лучших традициях отчетности с соблюдением пропорций и отступов
|
|
76
|
+
|
|
77
|
+
## Работа с существующими отчетами
|
|
78
|
+
|
|
79
|
+
Для работы с уже существующими отчетами доступен метод `read-report`, который позволяет нейросети прочитать содержимое отчета и использовать его для создания новых отчетов по запросу пользователя.
|
|
80
|
+
|
|
81
|
+
**ВАЖНО:** Если пользователь просит изменить отчёт, добавить в него что-то, дополнить, расширить или отредактировать, то нейросеть сначала должна прочитать файл последнего отчета методом `report_gen_mcp : read-report`, затем создать новый файл отчета с добавлением нужного содержимого методом `report_gen_mcp : generate-report`. При этом следует использовать содержимое прочитанного отчета как основу для нового отчета, добавляя к нему запрошенные пользователем изменения.
|
|
82
|
+
|
|
83
|
+
### Метод read-report
|
|
84
|
+
|
|
85
|
+
Метод `read-report` принимает путь к существующему HTML-отчету и возвращает его содержимое в структурированном виде, включая:
|
|
86
|
+
- Заголовки и их уровни
|
|
87
|
+
- Параграфы текста
|
|
88
|
+
- Списки и их элементы
|
|
89
|
+
- Информацию о диаграммах и изображениях
|
|
90
|
+
|
|
91
|
+
После успешного чтения отчета с помощью метода `read-report`, нейросеть получает всю необходимую информацию напрямую в ответе от метода. Необходимо предоставить пользователю следующую информацию:
|
|
92
|
+
|
|
93
|
+
1. **Путь к файлу**: Абсолютный путь к прочитанному отчету
|
|
94
|
+
2. **Ссылка на файл**: Кликабельная file:// ссылка для открытия отчета в браузере
|
|
95
|
+
3. **Web link 2**: Ссылка вида http://localhost:3000/filename.html для доступа к отчету через веб-интерфейс
|
|
96
|
+
4. **Содержимое файла**: Полный текст HTML содержимого отчета
|
|
97
|
+
5. **Структурированное содержание**: Заголовки, параграфы, списки и элементы отчета
|
|
98
|
+
|
|
99
|
+
### После генерации нового отчета на основе существующего
|
|
100
|
+
|
|
101
|
+
После успешной генерации нового отчета с помощью метода `generate-report`, нейросеть получает всю необходимую информацию напрямую в ответе от метода. Необходимо предоставить пользователю следующую информацию:
|
|
102
|
+
|
|
103
|
+
### 1. Предоставление информации пользователю
|
|
104
|
+
|
|
105
|
+
Из ответа метода `generate-report` извлеките следующую информацию и предоставьте пользователю:
|
|
106
|
+
|
|
107
|
+
1. **Путь к файлу**: Абсолютный путь к созданному отчету
|
|
108
|
+
2. **Ссылка на файл**: Кликабельная file:// ссылка для открытия отчета в браузере
|
|
109
|
+
3. **Web link 2**: Ссылка вида http://localhost:3000/filename.html для доступа к отчету через веб-интерфейс
|
|
110
|
+
4. **Содержимое файла**: Полный текст HTML содержимого отчета
|
|
111
|
+
|
|
112
|
+
Обязательно покажите пользователю содержимое файла, чтобы он мог сразу ознакомиться с результатом без необходимости открывать файл отдельно.
|
|
113
|
+
|
|
114
|
+
**ВАЖНОЕ ТРЕБОВАНИЕ**: Отчет должен быть максимально красивым и качественным. Содержать изображения, графики, выводы и рассуждения. Отчет должен быть строго в HTML формате!
|
|
115
|
+
|
|
116
|
+
**ВАЖНО**: Всегда выводите Web link 2 как кликабельную ссылку в формате `[Web link 2](http://localhost:3000/filename.html)`!
|
|
117
|
+
|
|
118
|
+
**ОСОБЕННОСТИ РАБОТЫ С ИЗОБРАЖЕНИЯМИ:**
|
|
119
|
+
- Все локальные изображения автоматически встраиваются в отчет в формате base64, что гарантирует их отображение при открытии файла напрямую через file:// ссылку
|
|
120
|
+
- Если отчет содержит локальные изображения (file://), они будут корректно отображаться благодаря автоматическому встраиванию
|
|
121
|
+
- Для корректного отображения всех изображений также можно использовать Web link 2 (http://localhost:3000/...)
|
|
122
|
+
- Пользователь также может открыть файл напрямую в браузере через file:// ссылку, и изображения будут отображаться благодаря base64 встраиванию
|
|
123
|
+
|
|
124
|
+
Пример формата ответа пользователю:
|
|
125
|
+
```
|
|
126
|
+
Отчет успешно создан!
|
|
127
|
+
|
|
128
|
+
📁 Путь к файлу: /полный/путь/к/отчету.html
|
|
129
|
+
🌐 Ссылка для открытия в браузере: file:///полный/путь/к/отчету.html
|
|
130
|
+
🔗 [Web link 2](http://localhost:3000/отчет.html)
|
|
131
|
+
|
|
132
|
+
📄 Содержимое отчета:
|
|
133
|
+
<!DOCTYPE html>
|
|
134
|
+
<html lang="ru">
|
|
135
|
+
<head>
|
|
136
|
+
<meta charset="UTF-8">
|
|
137
|
+
<title>Отчет</title>
|
|
138
|
+
<style>
|
|
139
|
+
body {
|
|
140
|
+
font-family: Arial, sans-serif;
|
|
141
|
+
margin: 40px;
|
|
142
|
+
background-color: #f5f5f5;
|
|
143
|
+
}
|
|
144
|
+
.container {
|
|
145
|
+
max-width: 1200px;
|
|
146
|
+
margin: 0 auto;
|
|
147
|
+
background-color: white;
|
|
148
|
+
padding: 30px;
|
|
149
|
+
border-radius: 10px;
|
|
150
|
+
box-shadow: 0 0 10px rgba(0,0,0,0.1);
|
|
151
|
+
}
|
|
152
|
+
h1, h2, h3 {
|
|
153
|
+
color: #333;
|
|
154
|
+
}
|
|
155
|
+
h1 {
|
|
156
|
+
border-bottom: 2px solid #3498db;
|
|
157
|
+
padding-bottom: 10px;
|
|
158
|
+
}
|
|
159
|
+
h2 {
|
|
160
|
+
border-left: 4px solid #3498db;
|
|
161
|
+
padding-left: 15px;
|
|
162
|
+
}
|
|
163
|
+
.chart-container, .image-container {
|
|
164
|
+
margin: 30px 0;
|
|
165
|
+
text-align: center;
|
|
166
|
+
}
|
|
167
|
+
.chart-container canvas, .image-container img {
|
|
168
|
+
max-width: 100%;
|
|
169
|
+
height: auto;
|
|
170
|
+
border: 1px solid #ddd;
|
|
171
|
+
border-radius: 5px;
|
|
172
|
+
}
|
|
173
|
+
p {
|
|
174
|
+
line-height: 1.6;
|
|
175
|
+
text-align: justify;
|
|
176
|
+
}
|
|
177
|
+
ul, ol {
|
|
178
|
+
margin: 20px 0;
|
|
179
|
+
padding-left: 30px;
|
|
180
|
+
}
|
|
181
|
+
li {
|
|
182
|
+
margin: 10px 0;
|
|
183
|
+
}
|
|
184
|
+
strong {
|
|
185
|
+
color: #e74c3c;
|
|
186
|
+
}
|
|
187
|
+
em {
|
|
188
|
+
color: #2ecc71;
|
|
189
|
+
}
|
|
190
|
+
</style>
|
|
191
|
+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
192
|
+
</head>
|
|
193
|
+
<body>
|
|
194
|
+
<div class="container">
|
|
195
|
+
<h1>Отчет</h1>
|
|
196
|
+
<div class="chart-container">
|
|
197
|
+
<!-- Chart.js chart code -->
|
|
198
|
+
</div>
|
|
199
|
+
<div class="image-container">
|
|
200
|
+
<!-- Generated image -->
|
|
201
|
+
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==" alt="Локальное изображение">
|
|
202
|
+
</div>
|
|
203
|
+
<h2>Анализ данных</h2>
|
|
204
|
+
<p>На основании проведенного анализа можно сделать следующие выводы:</p>
|
|
205
|
+
<ul>
|
|
206
|
+
<li><strong>Основной тренд:</strong> наблюдается положительная динамика роста</li>
|
|
207
|
+
<li><strong>Сезонность:</strong> наиболее высокие показатели наблюдаются во второй половине периода</li>
|
|
208
|
+
<li><strong>Прогноз:</strong> ожидается продолжение роста в ближайшие месяцы</li>
|
|
209
|
+
</ul>
|
|
210
|
+
<h2>Рекомендации</h2>
|
|
211
|
+
<ol>
|
|
212
|
+
<li>Увеличить инвестиции в направления с высокой доходностью</li>
|
|
213
|
+
<li>Оптимизировать расходы в менее эффективных сегментах</li>
|
|
214
|
+
<li>Рассмотреть возможность расширения бизнеса</li>
|
|
215
|
+
</ol>
|
|
216
|
+
</div>
|
|
217
|
+
</body>
|
|
218
|
+
</html>
|
|
219
|
+
|
|
220
|
+
💡 Примечание: Все изображения автоматически встроены в отчет в формате base64, поэтому они будут корректно отображаться при открытии файла напрямую.
|
|
221
|
+
|
|
222
|
+
Вы можете открыть отчет, кликнув на ссылку выше или скопировав путь к файлу.
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### 2. Альтернативный подход (при необходимости)
|
|
226
|
+
|
|
227
|
+
Если по какой-то причине информация не была получена напрямую из метода `generate-report`, можно использовать дополнительные инструменты:
|
|
228
|
+
|
|
229
|
+
#### Получение информации о файле
|
|
230
|
+
|
|
231
|
+
Используйте инструмент `get-report-url` для получения полной информации о созданном отчете:
|
|
232
|
+
|
|
233
|
+
```json
|
|
234
|
+
{
|
|
235
|
+
"method": "tools/call",
|
|
236
|
+
"params": {
|
|
237
|
+
"name": "get-report-url",
|
|
238
|
+
"arguments": {
|
|
239
|
+
"filePath": "/путь/к/созданному/отчету.html"
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
#### Прикрепление содержимого файла
|
|
246
|
+
|
|
247
|
+
Для того чтобы пользователь мог сразу просмотреть содержимое отчета без необходимости открывать файл, используйте инструмент `get-report-file`:
|
|
248
|
+
|
|
249
|
+
```json
|
|
250
|
+
{
|
|
251
|
+
"method": "tools/call",
|
|
252
|
+
"params": {
|
|
253
|
+
"name": "get-report-file",
|
|
254
|
+
"arguments": {
|
|
255
|
+
"filePath": "/путь/к/созданному/отчету.html"
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### 3. Особенности работы с изображениями
|
|
262
|
+
|
|
263
|
+
При генерации изображений с помощью инструментов `generate-image` или `edit-image`, нейросеть должна:
|
|
264
|
+
|
|
265
|
+
1. **Для `generate-image`** - обрабатывать ответ, содержащий:
|
|
266
|
+
- Текстовое подтверждение генерации
|
|
267
|
+
- Путь к файлу изображения на диске
|
|
268
|
+
- File URL для открытия в браузере: `file:///полный/путь/к/файлу.jpg`
|
|
269
|
+
- Web link 2: `http://localhost:3000/имя_файла.jpg`
|
|
270
|
+
- **img_link**: `http://localhost:3000/имя_файла.jpg` (предпочтительная ссылка для использования во всех отчетах)
|
|
271
|
+
|
|
272
|
+
2. **Для `edit-image`** - обрабатывать ответ, содержащий:
|
|
273
|
+
- Текстовое подтверждение редактирования
|
|
274
|
+
- Путь к файлу изображения на диске
|
|
275
|
+
- File URL для открытия в браузере: `file:///полный/путь/к/файлу.jpg`
|
|
276
|
+
- Web link 2: `http://localhost:3000/имя_файла.jpg`
|
|
277
|
+
- **img_link**: `http://localhost:3000/имя_файла.jpg` (предпочтительная ссылка для использования во всех отчетах)
|
|
278
|
+
|
|
279
|
+
3. **Важно**: Всегда показывайте пользователю Web link 2 для быстрого доступа к изображению через веб-интерфейс.
|
|
280
|
+
|
|
281
|
+
4. **ВАЖНО**: Всегда выводите Web link 2 как кликабельную ссылку в формате `[Web link 2](http://localhost:3000/filename.jpg)`!
|
|
282
|
+
|
|
283
|
+
5. **ОСОБЕННО ВАЖНО**: При генерации изображения обязательно прикладывайте путь к нему в виде https или http ссылки (img_link). Именно эту ссылку предпочтительнее всего использовать во всех отчетах!
|
|
284
|
+
|
|
285
|
+
6. **Пример корректного ответа при генерации изображения**:
|
|
286
|
+
```
|
|
287
|
+
✅ Изображение успешно сгенерировано по промпту: 'beautiful landscape'
|
|
288
|
+
|
|
289
|
+
📁 Файл сохранен: /полный/путь/к/generated-image-1234567890.jpeg
|
|
290
|
+
🌐 Web link: file:///полный/путь/к/generated-image-1234567890.jpeg
|
|
291
|
+
🔗 [Web link 2](http://localhost:3000/generated-image-1234567890.jpeg)
|
|
292
|
+
🖼️ img_link: http://localhost:3000/generated-image-1234567890.jpeg (предпочтительная ссылка для использования в отчетах)
|
|
293
|
+
|
|
294
|
+
💡 Примечание: Если изображение не отображается, попробуйте открыть его по Web link 2, который обеспечивает корректное отображение.
|
|
295
|
+
|
|
296
|
+
Вы можете открыть изображение, кликнув на ссылку выше или скопировав путь к файлу.
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
7. **Пример корректного ответа при редактировании изображения**:
|
|
300
|
+
```
|
|
301
|
+
✅ Изображение успешно отредактировано по промпту: 'add a hat to the person'
|
|
302
|
+
|
|
303
|
+
📁 Файл сохранен: /полный/путь/к/edited-image-1234567890.jpeg
|
|
304
|
+
🌐 Web link: file:///полный/путь/к/edited-image-1234567890.jpeg
|
|
305
|
+
🔗 [Web link 2](http://localhost:3000/edited-image-1234567890.jpeg)
|
|
306
|
+
🖼️ img_link: http://localhost:3000/edited-image-1234567890.jpeg (предпочтительная ссылка для использования в отчетах)
|
|
307
|
+
|
|
308
|
+
💡 Примечание: Если изображение не отображается, попробуйте открыть его по Web link 2, который обеспечивает корректное отображение.
|
|
309
|
+
|
|
310
|
+
Вы можете открыть изображение, кликнув на ссылку выше или скопировав путь к файлу.
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Формат данных для диаграмм (графиков)
|
|
314
|
+
|
|
315
|
+
Очень важно правильно формировать данные для диаграмм, чтобы избежать ошибок. Ниже приведены точные требования к формату данных для каждого типа диаграмм.
|
|
316
|
+
|
|
317
|
+
### Общие правила для всех типов диаграмм
|
|
318
|
+
|
|
319
|
+
1. Все цветовые значения (`backgroundColor`, `borderColor`) должны быть представлены в виде **массивов строк**, даже если это один цвет.
|
|
320
|
+
2. Все числовые данные (`data`) должны быть представлены в виде массивов чисел.
|
|
321
|
+
3. Все текстовые метки (`labels`) должны быть представлены в виде массивов строк.
|
|
322
|
+
4. Значение `options.title` должно быть **строкой**, а не объектом.
|
|
323
|
+
|
|
324
|
+
### Линейные диаграммы (line)
|
|
325
|
+
|
|
326
|
+
```json
|
|
327
|
+
{
|
|
328
|
+
"type": "line",
|
|
329
|
+
"config": {
|
|
330
|
+
"labels": ["Январь", "Февраль", "Март", "Апрель", "Май"],
|
|
331
|
+
"datasets": [
|
|
332
|
+
{
|
|
333
|
+
"label": "Продажи (USD)",
|
|
334
|
+
"data": [12000, 19000, 15000, 18000, 22000],
|
|
335
|
+
"borderColor": ["rgba(54, 162, 235, 1)"], // ВАЖНО: массив, даже для одного цвета!
|
|
336
|
+
"fill": false
|
|
337
|
+
}
|
|
338
|
+
],
|
|
339
|
+
"options": {
|
|
340
|
+
"title": "Ежемесячные продажи"
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Важно**: `borderColor` должен быть массивом строк, даже если используется только один цвет.
|
|
347
|
+
|
|
348
|
+
### Столбчатые диаграммы (bar)
|
|
349
|
+
|
|
350
|
+
```json
|
|
351
|
+
{
|
|
352
|
+
"type": "bar",
|
|
353
|
+
"config": {
|
|
354
|
+
"labels": ["Январь", "Февраль", "Март", "Апрель", "Май"],
|
|
355
|
+
"datasets": [
|
|
356
|
+
{
|
|
357
|
+
"label": "Продажи (USD)",
|
|
358
|
+
"data": [12000, 19000, 15000, 18000, 22000],
|
|
359
|
+
"backgroundColor": ["#FF6384", "#36A2EB", "#FFCE56", "#4BC0C0", "#9966FF"], // Массив цветов
|
|
360
|
+
"borderColor": ["#FF6384", "#36A2EB", "#FFCE56", "#4BC0C0", "#9966FF"] // Массив цветов
|
|
361
|
+
}
|
|
362
|
+
],
|
|
363
|
+
"options": {
|
|
364
|
+
"title": "Ежемесячные продажи"
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
**Важно**: `backgroundColor` и `borderColor` должны быть массивами строк, даже если используется только один цвет.
|
|
371
|
+
|
|
372
|
+
### Круговые диаграммы (pie)
|
|
373
|
+
|
|
374
|
+
```json
|
|
375
|
+
{
|
|
376
|
+
"type": "pie",
|
|
377
|
+
"config": {
|
|
378
|
+
"labels": ["Красный", "Синий", "Желтый", "Зеленый", "Фиолетовый"],
|
|
379
|
+
"datasets": [
|
|
380
|
+
{
|
|
381
|
+
"data": [12, 19, 3, 5, 2],
|
|
382
|
+
"backgroundColor": ["#FF6384", "#36A2EB", "#FFCE56", "#4BC0C0", "#9966FF"], // Массив цветов
|
|
383
|
+
"borderColor": ["#FF6384", "#36A2EB", "#FFCE56", "#4BC0C0", "#9966FF"] // Массив цветов
|
|
384
|
+
}
|
|
385
|
+
],
|
|
386
|
+
"options": {
|
|
387
|
+
"title": "Распределение по категориям"
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
**Важно**: `backgroundColor` и `borderColor` должны быть массивами строк, даже если используется только один цвет.
|
|
394
|
+
|
|
395
|
+
### Кольцевые диаграммы (doughnut)
|
|
396
|
+
|
|
397
|
+
```json
|
|
398
|
+
{
|
|
399
|
+
"type": "doughnut",
|
|
400
|
+
"config": {
|
|
401
|
+
"labels": ["Красный", "Синий", "Желтый", "Зеленый", "Фиолетовый"],
|
|
402
|
+
"datasets": [
|
|
403
|
+
{
|
|
404
|
+
"data": [12, 19, 3, 5, 2],
|
|
405
|
+
"backgroundColor": ["#FF6384", "#36A2EB", "#FFCE56", "#4BC0C0", "#9966FF"], // Массив цветов
|
|
406
|
+
"borderColor": ["#FF6384", "#36A2EB", "#FFCE56", "#4BC0C0", "#9966FF"] // Массив цветов
|
|
407
|
+
}
|
|
408
|
+
],
|
|
409
|
+
"options": {
|
|
410
|
+
"title": "Распределение по категориям"
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
**Важно**: `backgroundColor` и `borderColor` должны быть массивами строк, даже если используется только один цвет.
|
|
417
|
+
|
|
418
|
+
### Радарные диаграммы (radar)
|
|
419
|
+
|
|
420
|
+
```json
|
|
421
|
+
{
|
|
422
|
+
"type": "radar",
|
|
423
|
+
"config": {
|
|
424
|
+
"labels": ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"],
|
|
425
|
+
"datasets": [
|
|
426
|
+
{
|
|
427
|
+
"label": "Person 1",
|
|
428
|
+
"data": [65, 59, 90, 81, 56, 55, 40],
|
|
429
|
+
"backgroundColor": ["rgba(255, 99, 132, 0.2)"], // Массив цветов
|
|
430
|
+
"borderColor": ["rgba(255, 99, 132, 1)"] // Массив цветов
|
|
431
|
+
}
|
|
432
|
+
],
|
|
433
|
+
"options": {
|
|
434
|
+
"title": "Радарная диаграмма"
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**Важно**: `backgroundColor` и `borderColor` должны быть массивами строк, даже если используется только один цвет.
|
|
441
|
+
|
|
442
|
+
### Полярные диаграммы (polarArea)
|
|
443
|
+
|
|
444
|
+
```json
|
|
445
|
+
{
|
|
446
|
+
"type": "polarArea",
|
|
447
|
+
"config": {
|
|
448
|
+
"labels": ["Red", "Green", "Yellow", "Grey", "Blue"],
|
|
449
|
+
"datasets": [
|
|
450
|
+
{
|
|
451
|
+
"data": [11, 16, 7, 3, 14],
|
|
452
|
+
"backgroundColor": ["#FF6384", "#4BC0C0", "#FFCE56", "#E7E9ED", "#36A2EB"], // Массив цветов
|
|
453
|
+
"borderColor": ["#FF6384", "#4BC0C0", "#FFCE56", "#E7E9ED", "#36A2EB"] // Массив цветов
|
|
454
|
+
}
|
|
455
|
+
],
|
|
456
|
+
"options": {
|
|
457
|
+
"title": "Полярная диаграмма"
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
**Важно**: `backgroundColor` и `borderColor` должны быть массивами строк.
|
|
464
|
+
|
|
465
|
+
## Формат данных для изображений
|
|
466
|
+
|
|
467
|
+
### Изображения, сгенерированные pollinations.ai
|
|
468
|
+
|
|
469
|
+
```json
|
|
470
|
+
{
|
|
471
|
+
"type": "pollinations",
|
|
472
|
+
"config": {
|
|
473
|
+
"prompt": "красивый закат над океаном",
|
|
474
|
+
"width": 512,
|
|
475
|
+
"height": 512,
|
|
476
|
+
"model": "flux",
|
|
477
|
+
"seed": 12345,
|
|
478
|
+
"nologo": true,
|
|
479
|
+
"enhance": true
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### Изображения, сгенерированные с помощью generate-image (Chutes AI)
|
|
485
|
+
|
|
486
|
+
При использовании инструмента `generate-image` для генерации изображений с помощью Chutes AI, числовые параметры могут быть представлены как числа или как строки. Инструмент автоматически преобразует строковые параметры в числа.
|
|
487
|
+
|
|
488
|
+
✅ ПРИМЕР 1 (числовые параметры как числа):
|
|
489
|
+
```json
|
|
490
|
+
{
|
|
491
|
+
"method": "tools/call",
|
|
492
|
+
"params": {
|
|
493
|
+
"name": "generate-image",
|
|
494
|
+
"arguments": {
|
|
495
|
+
"prompt": "a dog made of US dollar bills",
|
|
496
|
+
"width": 512,
|
|
497
|
+
"height": 512,
|
|
498
|
+
"guidance_scale": 7.5,
|
|
499
|
+
"negative_prompt": "blurry, low quality",
|
|
500
|
+
"num_inference_steps": 50,
|
|
501
|
+
"seed": 0
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
✅ ПРИМЕР 2 (числовые параметры как строки):
|
|
508
|
+
```json
|
|
509
|
+
{
|
|
510
|
+
"method": "tools/call",
|
|
511
|
+
"params": {
|
|
512
|
+
"name": "generate-image",
|
|
513
|
+
"arguments": {
|
|
514
|
+
"prompt": "a dog made of US dollar bills",
|
|
515
|
+
"width": "512",
|
|
516
|
+
"height": "512",
|
|
517
|
+
"guidance_scale": "7.5",
|
|
518
|
+
"negative_prompt": "blurry, low quality",
|
|
519
|
+
"num_inference_steps": "50",
|
|
520
|
+
"seed": "0"
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
✅ ПРИМЕР 3 (смешанные параметры):
|
|
527
|
+
```json
|
|
528
|
+
{
|
|
529
|
+
"method": "tools/call",
|
|
530
|
+
"params": {
|
|
531
|
+
"name": "generate-image",
|
|
532
|
+
"arguments": {
|
|
533
|
+
"prompt": "a dog made of US dollar bills",
|
|
534
|
+
"width": "512",
|
|
535
|
+
"height": 512,
|
|
536
|
+
"guidance_scale": "7.5",
|
|
537
|
+
"negative_prompt": "blurry, low quality",
|
|
538
|
+
"num_inference_steps": 50,
|
|
539
|
+
"seed": "0"
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
**Гибкость параметров:** Инструмент поддерживает как числовые, так и строковые значения для числовых параметров (`width`, `height`, `guidance_scale`, `num_inference_steps`, `seed`). Это обеспечивает совместимость с различными способами формирования запросов.
|
|
546
|
+
|
|
547
|
+
### Изображения по URL
|
|
548
|
+
|
|
549
|
+
```json
|
|
550
|
+
{
|
|
551
|
+
"type": "url",
|
|
552
|
+
"config": {
|
|
553
|
+
"url": "https://example.com/image.jpg",
|
|
554
|
+
"alt": "Описание изображения",
|
|
555
|
+
"width": 500,
|
|
556
|
+
"height": 300
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
### Локальные изображения (по файловому пути)
|
|
562
|
+
|
|
563
|
+
```json
|
|
564
|
+
{
|
|
565
|
+
"type": "url",
|
|
566
|
+
"config": {
|
|
567
|
+
"url": "file:///полный/путь/к/изображению.jpg",
|
|
568
|
+
"alt": "Описание изображения",
|
|
569
|
+
"width": 500,
|
|
570
|
+
"height": 300
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
**ВАЖНО ПРИ РАБОТЕ С ЛОКАЛЬНЫМИ ИЗОБРАЖЕНИЯМИ:**
|
|
576
|
+
- Локальные изображения должны быть указаны с полным путем в формате file://
|
|
577
|
+
- Браузеры могут блокировать отображение локальных файлов по соображениям безопасности
|
|
578
|
+
- Для корректного отображения используйте Web link 2 (http://localhost:3000/...)
|
|
579
|
+
- **НОВОЕ РЕШЕНИЕ:** Все локальные изображения автоматически встраиваются в отчет в формате base64, что гарантирует их отображение при открытии файла напрямую
|
|
580
|
+
|
|
581
|
+
## ПРАВИЛА ФОРМАТИРОВАНИЯ ПАРАМЕТРОВ (КРИТИЧЕСКИ ВАЖНО!)
|
|
582
|
+
|
|
583
|
+
### 1. ПАРАМЕТР "elements" ДОЛЖЕН БЫТЬ ОБЪЕКТОМ!
|
|
584
|
+
|
|
585
|
+
❌ НЕПРАВИЛЬНО (это вызывает ошибку "Expected object, received string"):
|
|
586
|
+
```json
|
|
587
|
+
{
|
|
588
|
+
"method": "generate-report",
|
|
589
|
+
"params": {
|
|
590
|
+
"document": "# Отчет\n\n[[chart:mychart]]",
|
|
591
|
+
"elements": "{ \"mychart\": { \"type\": \"bar\", \"config\": { \"labels\": [\"A\", \"B\", \"C\"], \"datasets\": [{ \"label\": \"Data\", \"data\": [1, 2, 3], \"backgroundColor\": [\"red\", \"green\", \"blue\"], \"borderColor\": [\"red\", \"green\", \"blue\"] }] } }",
|
|
592
|
+
"outputFile": "report.html"
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
✅ ПРАВИЛЬНО (elements - это объект, а не строка):
|
|
598
|
+
```json
|
|
599
|
+
{
|
|
600
|
+
"method": "generate-report",
|
|
601
|
+
"params": {
|
|
602
|
+
"document": "# Отчет\n\n[[chart:mychart]]",
|
|
603
|
+
"elements": {
|
|
604
|
+
"mychart": {
|
|
605
|
+
"type": "bar",
|
|
606
|
+
"config": {
|
|
607
|
+
"labels": ["A", "B", "C"],
|
|
608
|
+
"datasets": [{
|
|
609
|
+
"label": "Data",
|
|
610
|
+
"data": [1, 2, 3],
|
|
611
|
+
"backgroundColor": ["red", "green", "blue"],
|
|
612
|
+
"borderColor": ["red", "green", "blue"]
|
|
613
|
+
}],
|
|
614
|
+
"options": {
|
|
615
|
+
"title": "Мой график"
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
},
|
|
620
|
+
"outputFile": "report.html"
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
### 2. ЦВЕТОВЫЕ ЗНАЧЕНИЯ ДОЛЖНЫ БЫТЬ МАССИВАМИ!
|
|
626
|
+
|
|
627
|
+
❌ НЕПРАВИЛЬНО (это вызывает ошибку):
|
|
628
|
+
```json
|
|
629
|
+
"backgroundColor": "red"
|
|
630
|
+
"borderColor": "blue"
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
✅ ПРАВИЛЬНО (всегда используйте массивы):
|
|
634
|
+
```json
|
|
635
|
+
"backgroundColor": ["red"]
|
|
636
|
+
"borderColor": ["blue"]
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
### 3. ЧИСЛОВЫЕ ДАННЫЕ ДОЛЖНЫ БЫТЬ МАССИВАМИ!
|
|
640
|
+
|
|
641
|
+
❌ НЕПРАВИЛЬНО:
|
|
642
|
+
```json
|
|
643
|
+
"data": 10
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
✅ ПРАВИЛЬНО:
|
|
647
|
+
```json
|
|
648
|
+
"data": [10]
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
### 4. ТЕКСТОВЫЕ МЕТКИ ДОЛЖНЫ БЫТЬ МАССИВАМИ!
|
|
652
|
+
|
|
653
|
+
❌ НЕПРАВИЛЬНО:
|
|
654
|
+
```json
|
|
655
|
+
"labels": "Январь"
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
✅ ПРАВИЛЬНО:
|
|
659
|
+
```json
|
|
660
|
+
"labels": ["Январь"]
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
### 5. ЗНАЧЕНИЕ options.title ДОЛЖНО БЫТЬ СТРОКОЙ!
|
|
664
|
+
|
|
665
|
+
❌ НЕПРАВИЛЬНО (это вызывает ошибку):
|
|
666
|
+
```json
|
|
667
|
+
"options": {
|
|
668
|
+
"title": {
|
|
669
|
+
"text": "Заголовок графика"
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
✅ ПРАВИЛЬНО:
|
|
675
|
+
```json
|
|
676
|
+
"options": {
|
|
677
|
+
"title": "Заголовок графика"
|
|
678
|
+
}
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
### 6. ТИП ЭЛЕМЕНТА ДОЛЖЕН СООТВЕТСТВОВАТЬ ЕГО СОДЕРЖИМОМУ!
|
|
682
|
+
|
|
683
|
+
❌ НЕПРАВИЛЬНО (это вызывает ошибку):
|
|
684
|
+
```json
|
|
685
|
+
"comparison_chart": {
|
|
686
|
+
"type": "bar", // Неправильный тип для сравнения - должен быть либо "pollinations", либо "url"
|
|
687
|
+
"config": {
|
|
688
|
+
"labels": ["A", "B", "C"],
|
|
689
|
+
"datasets": [{
|
|
690
|
+
"label": "Data",
|
|
691
|
+
"data": [1, 2, 3],
|
|
692
|
+
"backgroundColor": ["red", "green", "blue"]
|
|
693
|
+
}]
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
✅ ПРАВИЛЬНО (для диаграмм):
|
|
699
|
+
```json
|
|
700
|
+
"comparison_chart": {
|
|
701
|
+
"type": "bar",
|
|
702
|
+
"config": {
|
|
703
|
+
"labels": ["A", "B", "C"],
|
|
704
|
+
"datasets": [{
|
|
705
|
+
"label": "Data",
|
|
706
|
+
"data": [1, 2, 3],
|
|
707
|
+
"backgroundColor": ["red", "green", "blue"]
|
|
708
|
+
}],
|
|
709
|
+
"options": {
|
|
710
|
+
"title": "Сравнительная диаграмма"
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
✅ ПРАВИЛЬНО (для изображений):
|
|
717
|
+
```json
|
|
718
|
+
"comparison_chart": {
|
|
719
|
+
"type": "pollinations",
|
|
720
|
+
"config": {
|
|
721
|
+
"prompt": "beautiful landscape with mountains",
|
|
722
|
+
"width": 600,
|
|
723
|
+
"height": 400
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
✅ ПРАВИЛЬНО (для локальных изображений):
|
|
729
|
+
```json
|
|
730
|
+
"comparison_chart": {
|
|
731
|
+
"type": "url",
|
|
732
|
+
"config": {
|
|
733
|
+
"url": "file:///полный/путь/к/изображению.jpg",
|
|
734
|
+
"alt": "Локальное изображение",
|
|
735
|
+
"width": 500,
|
|
736
|
+
"height": 300
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
## Пример полного взаимодействия
|
|
742
|
+
|
|
743
|
+
Вот пример того, как должно выглядеть полное взаимодействие с пользователем после генерации отчета:
|
|
744
|
+
|
|
745
|
+
1. Генерация отчета с диаграммами:
|
|
746
|
+
```json
|
|
747
|
+
{
|
|
748
|
+
"method": "generate-report",
|
|
749
|
+
"params": {
|
|
750
|
+
"document": "# Отчет\n\n[[chart:sales_chart]]\n\n[[chart:comparison_chart]]",
|
|
751
|
+
"elements": {
|
|
752
|
+
"sales_chart": {
|
|
753
|
+
"type": "bar",
|
|
754
|
+
"config": {
|
|
755
|
+
"labels": ["Январь", "Февраль", "Март", "Апрель", "Май"],
|
|
756
|
+
"datasets": [{
|
|
757
|
+
"label": "Продажи (USD)",
|
|
758
|
+
"data": [12000, 19000, 15000, 18000, 22000],
|
|
759
|
+
"backgroundColor": ["#FF6384", "#36A2EB", "#FFCE56", "#4BC0C0", "#9966FF"],
|
|
760
|
+
"borderColor": ["#FF6384", "#36A2EB", "#FFCE56", "#4BC0C0", "#9966FF"]
|
|
761
|
+
}],
|
|
762
|
+
"options": {
|
|
763
|
+
"title": "Ежемесячные продажи"
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
},
|
|
767
|
+
"comparison_chart": {
|
|
768
|
+
"type": "pie",
|
|
769
|
+
"config": {
|
|
770
|
+
"labels": ["Категория A", "Категория B", "Категория C"],
|
|
771
|
+
"datasets": [{
|
|
772
|
+
"data": [30, 50, 20],
|
|
773
|
+
"backgroundColor": ["#FF6384", "#36A2EB", "#FFCE56"],
|
|
774
|
+
"borderColor": ["#FF6384", "#36A2EB", "#FFCE56"]
|
|
775
|
+
}],
|
|
776
|
+
"options": {
|
|
777
|
+
"title": "Сравнение по категориям"
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
"outputFile": "report.html"
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
2. Генерация отчета с изображениями:
|
|
788
|
+
```json
|
|
789
|
+
{
|
|
790
|
+
"method": "generate-report",
|
|
791
|
+
"params": {
|
|
792
|
+
"document": "# Отчет\n\n[[image:main_image]]\n\n[[image:comparison_image]]\n\n[[image:local_image]]",
|
|
793
|
+
"elements": {
|
|
794
|
+
"main_image": {
|
|
795
|
+
"type": "pollinations",
|
|
796
|
+
"config": {
|
|
797
|
+
"prompt": "beautiful landscape with mountains and lake",
|
|
798
|
+
"width": 600,
|
|
799
|
+
"height": 400,
|
|
800
|
+
"model": "flux",
|
|
801
|
+
"nologo": true,
|
|
802
|
+
"enhance": true
|
|
803
|
+
}
|
|
804
|
+
},
|
|
805
|
+
"comparison_image": {
|
|
806
|
+
"type": "url",
|
|
807
|
+
"config": {
|
|
808
|
+
"url": "https://example.com/comparison-diagram.jpg",
|
|
809
|
+
"alt": "Сравнительная диаграмма",
|
|
810
|
+
"width": 500,
|
|
811
|
+
"height": 300
|
|
812
|
+
}
|
|
813
|
+
},
|
|
814
|
+
"local_image": {
|
|
815
|
+
"type": "url",
|
|
816
|
+
"config": {
|
|
817
|
+
"url": "file:///полный/путь/к/local-image.jpg",
|
|
818
|
+
"alt": "Локальное изображение",
|
|
819
|
+
"width": 500,
|
|
820
|
+
"height": 300
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
},
|
|
824
|
+
"outputFile": "report.html"
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
```
|
|
828
|
+
|
|
829
|
+
3. Ответ от метода `generate-report` уже содержит всю необходимую информацию:
|
|
830
|
+
```json
|
|
831
|
+
{
|
|
832
|
+
"content": [
|
|
833
|
+
{
|
|
834
|
+
"type": "text",
|
|
835
|
+
"text": "Report generated successfully.\n\nFOR THE NEURAL NETWORK: Please present the following information to the user:\n1. Path to file: /path/to/report.html\n2. Web browser link: file:///path/to/report.html\n3. Web link 2: http://localhost:3000/report.html"
|
|
836
|
+
}
|
|
837
|
+
]
|
|
838
|
+
}
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
4. Ответ пользователю (на основе информации из ответа метода):
|
|
842
|
+
```
|
|
843
|
+
Отчет успешно создан!
|
|
844
|
+
|
|
845
|
+
📁 Путь к файлу: /path/to/report.html
|
|
846
|
+
🌐 Ссылка для открытия в браузере: file:///path/to/report.html
|
|
847
|
+
🔗 [Web link 2](http://localhost:3000/report.html)
|
|
848
|
+
|
|
849
|
+
💡 Примечание: Все изображения автоматически встроены в отчет в формате base64, поэтому они будут корректно отображаться при открытии файла напрямую.
|
|
850
|
+
|
|
851
|
+
Содержимое отчета:
|
|
852
|
+
<!DOCTYPE html>
|
|
853
|
+
<html lang="ru">
|
|
854
|
+
<head>
|
|
855
|
+
<meta charset="UTF-8">
|
|
856
|
+
<title>Отчет</title>
|
|
857
|
+
<style>
|
|
858
|
+
body {
|
|
859
|
+
font-family: Arial, sans-serif;
|
|
860
|
+
margin: 40px;
|
|
861
|
+
background-color: #f5f5f5;
|
|
862
|
+
}
|
|
863
|
+
.container {
|
|
864
|
+
max-width: 1200px;
|
|
865
|
+
margin: 0 auto;
|
|
866
|
+
background-color: white;
|
|
867
|
+
padding: 30px;
|
|
868
|
+
border-radius: 10px;
|
|
869
|
+
box-shadow: 0 0 10px rgba(0,0,0,0.1);
|
|
870
|
+
}
|
|
871
|
+
h1, h2, h3 {
|
|
872
|
+
color: #333;
|
|
873
|
+
}
|
|
874
|
+
h1 {
|
|
875
|
+
border-bottom: 2px solid #3498db;
|
|
876
|
+
padding-bottom: 10px;
|
|
877
|
+
}
|
|
878
|
+
h2 {
|
|
879
|
+
border-left: 4px solid #3498db;
|
|
880
|
+
padding-left: 15px;
|
|
881
|
+
}
|
|
882
|
+
.chart-container, .image-container {
|
|
883
|
+
margin: 30px 0;
|
|
884
|
+
text-align: center;
|
|
885
|
+
}
|
|
886
|
+
.chart-container canvas, .image-container img {
|
|
887
|
+
max-width: 100%;
|
|
888
|
+
height: auto;
|
|
889
|
+
border: 1px solid #ddd;
|
|
890
|
+
border-radius: 5px;
|
|
891
|
+
}
|
|
892
|
+
p {
|
|
893
|
+
line-height: 1.6;
|
|
894
|
+
text-align: justify;
|
|
895
|
+
}
|
|
896
|
+
ul, ol {
|
|
897
|
+
margin: 20px 0;
|
|
898
|
+
padding-left: 30px;
|
|
899
|
+
}
|
|
900
|
+
li {
|
|
901
|
+
margin: 10px 0;
|
|
902
|
+
}
|
|
903
|
+
strong {
|
|
904
|
+
color: #e74c3c;
|
|
905
|
+
}
|
|
906
|
+
em {
|
|
907
|
+
color: #2ecc71;
|
|
908
|
+
}
|
|
909
|
+
</style>
|
|
910
|
+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
911
|
+
</head>
|
|
912
|
+
<body>
|
|
913
|
+
<div class="container">
|
|
914
|
+
<h1>Отчет</h1>
|
|
915
|
+
<div class="chart-container">
|
|
916
|
+
<!-- Chart.js chart code -->
|
|
917
|
+
</div>
|
|
918
|
+
<div class="image-container">
|
|
919
|
+
<!-- Generated image -->
|
|
920
|
+
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==" alt="Локальное изображение">
|
|
921
|
+
</div>
|
|
922
|
+
<h2>Анализ данных</h2>
|
|
923
|
+
<p>На основании проведенного анализа можно сделать следующие выводы:</p>
|
|
924
|
+
<ul>
|
|
925
|
+
<li><strong>Основной тренд:</strong> наблюдается положительная динамика роста</li>
|
|
926
|
+
<li><strong>Сезонность:</strong> наиболее высокие показатели наблюдаются во второй половине периода</li>
|
|
927
|
+
<li><strong>Прогноз:</strong> ожидается продолжение роста в ближайшие месяцы</li>
|
|
928
|
+
</ul>
|
|
929
|
+
<h2>Рекомендации</h2>
|
|
930
|
+
<ol>
|
|
931
|
+
<li>Увеличить инвестиции в направления с высокой доходностью</li>
|
|
932
|
+
<li>Оптимизировать расходы в менее эффективных сегментах</li>
|
|
933
|
+
<li>Рассмотреть возможность расширения бизнеса</li>
|
|
934
|
+
</ol>
|
|
935
|
+
</div>
|
|
936
|
+
</body>
|
|
937
|
+
</html>
|
|
938
|
+
|
|
939
|
+
Вы можете открыть отчет, кликнув на ссылку выше или скопировав путь к файлу.
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
## Частые ошибки и как их избежать
|
|
943
|
+
|
|
944
|
+
1. **Ошибка формата параметров**: Передача `elements` как строки вместо объекта
|
|
945
|
+
- ❌ Неправильно: `"elements": "{\"mychart\":{...}}"`
|
|
946
|
+
- ✅ Правильно: `"elements": {"mychart":{...}}"
|
|
947
|
+
|
|
948
|
+
2. **Ошибка формата цвета**: Передача `borderColor` или `backgroundColor` как строк вместо массивов
|
|
949
|
+
- ❌ Неправильно: `"borderColor": "red"`
|
|
950
|
+
- ✅ Правильно: `"borderColor": ["red"]"
|
|
951
|
+
|
|
952
|
+
3. **Ошибка формата данных**: Передача числовых данных как отдельных значений вместо массивов
|
|
953
|
+
- ❌ Неправильно: `"data": 10
|
|
954
|
+
- ✅ Правильно: `"data": [10]"
|
|
955
|
+
|
|
956
|
+
4. **Ошибка формата меток**: Передача меток как отдельных значений вместо массивов
|
|
957
|
+
- ❌ Неправильно: `"labels": "Январь"
|
|
958
|
+
- ✅ Правильно: `"labels": ["Январь"]"
|
|
959
|
+
|
|
960
|
+
5. **Ошибка формата заголовка**: Передача `options.title` как объекта вместо строки
|
|
961
|
+
- ❌ Неправильно: `"options": {"title": {"text": "Заголовок"}}`
|
|
962
|
+
- ✅ Правильно: `"options": {"title": "Заголовок"}`
|
|
963
|
+
|
|
964
|
+
6. **Ошибка типа элемента**: Использование неправильного типа для элемента
|
|
965
|
+
- ❌ Неправильно: `"type": "bar"` для изображения
|
|
966
|
+
- ✅ Правильно: `"type": "pollinations"` или `"type": "url"` для изображений
|
|
967
|
+
|
|
968
|
+
7. **Ошибка с локальными изображениями**: Неправильный формат file:// URL
|
|
969
|
+
- ❌ Неправильно: `"url": "/путь/к/изображению.jpg"`
|
|
970
|
+
- ✅ Правильно: `"url": "file:///полный/путь/к/изображению.jpg"`
|
|
971
|
+
|
|
972
|
+
## Дополнительные рекомендации
|
|
973
|
+
|
|
974
|
+
1. Всегда проверяйте успешность выполнения каждой операции перед переходом к следующему шагу
|
|
975
|
+
2. Если какой-либо шаг завершается ошибкой, сообщите пользователю об этом и предложите решение
|
|
976
|
+
3. Убедитесь, что все пути к файлам корректны и файлы действительно существуют
|
|
977
|
+
4. При работе с Claude Desktop используйте параметр `tempDirectory` при генерации отчетов для избежания проблем с правами доступа
|
|
978
|
+
5. Создавайте отчеты с красивым оформлением, используя заголовки, списки и другие элементы форматирования
|
|
979
|
+
6. Добавляйте в отчеты диаграммы и изображения для лучшей визуализации данных
|
|
980
|
+
7. Всегда после генерации отчета возвращайте пользователю ссылку на файл отчета, путь к файлу отчета и содержимое файла
|
|
981
|
+
8. Отчет должен быть максимально красивым и качественным, содержать изображения, графики, выводы и рассуждения
|
|
982
|
+
9. Отчет должен быть строго в HTML формате
|
|
983
|
+
10. **ВАЖНО**: Всегда выводите Web link 2 как кликабельную ссылку в формате `[Web link 2](http://localhost:3000/filename.html)`!
|
|
984
|
+
11. **ОСОБЕННО ВАЖНО**: Все локальные изображения автоматически встраиваются в отчет в формате base64, что гарантирует их отображение при открытии файла напрямую
|
|
985
|
+
|
|
986
|
+
Следование этим инструкциям обеспечит качественное и полное взаимодействие с пользователем при работе с инструментом генерации отчетов.
|
|
@@ -6,14 +6,14 @@ export declare const localImageSchema: z.ZodObject<{
|
|
|
6
6
|
height: z.ZodOptional<z.ZodNumber>;
|
|
7
7
|
}, "strip", z.ZodTypeAny, {
|
|
8
8
|
src: string;
|
|
9
|
+
alt?: string | undefined;
|
|
9
10
|
width?: number | undefined;
|
|
10
11
|
height?: number | undefined;
|
|
11
|
-
alt?: string | undefined;
|
|
12
12
|
}, {
|
|
13
13
|
src: string;
|
|
14
|
+
alt?: string | undefined;
|
|
14
15
|
width?: number | undefined;
|
|
15
16
|
height?: number | undefined;
|
|
16
|
-
alt?: string | undefined;
|
|
17
17
|
}>;
|
|
18
18
|
export declare function renderLocalImage(params: z.infer<typeof localImageSchema>): Promise<string>;
|
|
19
19
|
//# sourceMappingURL=localImages.d.ts.map
|
|
@@ -8,18 +8,18 @@ export declare const generatedImageSchema: z.ZodObject<{
|
|
|
8
8
|
nologo: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
9
9
|
enhance: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
10
10
|
}, "strip", z.ZodTypeAny, {
|
|
11
|
-
prompt: string;
|
|
12
|
-
model: string;
|
|
13
11
|
width: number;
|
|
14
12
|
height: number;
|
|
13
|
+
prompt: string;
|
|
14
|
+
model: string;
|
|
15
15
|
nologo: boolean;
|
|
16
16
|
enhance: boolean;
|
|
17
17
|
seed?: number | undefined;
|
|
18
18
|
}, {
|
|
19
19
|
prompt: string;
|
|
20
|
-
model?: string | undefined;
|
|
21
20
|
width?: number | undefined;
|
|
22
21
|
height?: number | undefined;
|
|
22
|
+
model?: string | undefined;
|
|
23
23
|
seed?: number | undefined;
|
|
24
24
|
nologo?: boolean | undefined;
|
|
25
25
|
enhance?: boolean | undefined;
|
|
@@ -31,14 +31,14 @@ export declare const imageUrlSchema: z.ZodObject<{
|
|
|
31
31
|
height: z.ZodOptional<z.ZodNumber>;
|
|
32
32
|
}, "strip", z.ZodTypeAny, {
|
|
33
33
|
url: string;
|
|
34
|
+
alt?: string | undefined;
|
|
34
35
|
width?: number | undefined;
|
|
35
36
|
height?: number | undefined;
|
|
36
|
-
alt?: string | undefined;
|
|
37
37
|
}, {
|
|
38
38
|
url: string;
|
|
39
|
+
alt?: string | undefined;
|
|
39
40
|
width?: number | undefined;
|
|
40
41
|
height?: number | undefined;
|
|
41
|
-
alt?: string | undefined;
|
|
42
42
|
}>;
|
|
43
43
|
export declare function generateImageUrl(params: z.infer<typeof generatedImageSchema>): string;
|
|
44
44
|
export declare function renderGeneratedImage(params: z.infer<typeof generatedImageSchema>): Promise<string>;
|
|
@@ -9,16 +9,16 @@ export declare const urlImageSchema: z.ZodObject<{
|
|
|
9
9
|
}, "strip", z.ZodTypeAny, {
|
|
10
10
|
embed: boolean;
|
|
11
11
|
url: string;
|
|
12
|
+
alt?: string | undefined;
|
|
12
13
|
width?: number | undefined;
|
|
13
14
|
height?: number | undefined;
|
|
14
|
-
alt?: string | undefined;
|
|
15
15
|
outputPath?: string | undefined;
|
|
16
16
|
}, {
|
|
17
17
|
url: string;
|
|
18
|
-
|
|
18
|
+
alt?: string | undefined;
|
|
19
19
|
width?: number | undefined;
|
|
20
20
|
height?: number | undefined;
|
|
21
|
-
|
|
21
|
+
embed?: boolean | undefined;
|
|
22
22
|
outputPath?: string | undefined;
|
|
23
23
|
}>;
|
|
24
24
|
export declare function renderUrlImage(params: z.infer<typeof urlImageSchema>): Promise<string>;
|
package/dist/index.js
CHANGED
|
@@ -109,7 +109,7 @@ if (process.argv.length === 2) {
|
|
|
109
109
|
// No command specified, run in stdio mode using MCP SDK
|
|
110
110
|
const mcpServer = new McpServer({
|
|
111
111
|
name: "report_gen_mcp",
|
|
112
|
-
version: "1.5.
|
|
112
|
+
version: "1.5.42"
|
|
113
113
|
}, {
|
|
114
114
|
// Disable health check to prevent automatic calls
|
|
115
115
|
capabilities: {
|
|
@@ -120,12 +120,17 @@ if (process.argv.length === 2) {
|
|
|
120
120
|
description: simpleReportTool.description,
|
|
121
121
|
inputSchema: simpleReportTool.inputSchema,
|
|
122
122
|
}, async (args) => {
|
|
123
|
-
|
|
123
|
+
// Wait for server to start and get the port
|
|
124
|
+
while (typeof serverPort === 'undefined') {
|
|
125
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
126
|
+
}
|
|
127
|
+
const serverBaseUrl = `http://localhost:${serverPort}/reports`;
|
|
128
|
+
const result = await simpleReportTool.action({ ...args, serverBaseUrl });
|
|
124
129
|
// Find the file path from the results to construct the HTTP URL
|
|
125
130
|
const localPathResource = result.content.find(c => c.resource.uri.endsWith('.html'));
|
|
126
131
|
if (localPathResource) {
|
|
127
132
|
const fileName = path.basename(localPathResource.resource.uri);
|
|
128
|
-
const httpUrl =
|
|
133
|
+
const httpUrl = `${serverBaseUrl}/${fileName}`;
|
|
129
134
|
// Find the resource with the file:/// URL and update its text
|
|
130
135
|
const fileUrlResource = result.content.find(c => c.resource.uri.startsWith('file:///'));
|
|
131
136
|
if (fileUrlResource) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simpleReport.d.ts","sourceRoot":"","sources":["../../src/tools/simpleReport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,gBAAgB;;;;;;;mBAON;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"simpleReport.d.ts","sourceRoot":"","sources":["../../src/tools/simpleReport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,gBAAgB;;;;;;;mBAON;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;CAmCvF,CAAC"}
|
|
@@ -12,13 +12,13 @@ export const simpleReportTool = {
|
|
|
12
12
|
outputFile: z.string().optional().describe("The name of the output HTML file."),
|
|
13
13
|
},
|
|
14
14
|
action: async (args) => {
|
|
15
|
-
let { document, outputFile } = args;
|
|
15
|
+
let { document, outputFile, serverBaseUrl } = args;
|
|
16
16
|
const reportsDir = process.env.REPORTS_DIR || os.tmpdir();
|
|
17
17
|
if (!outputFile) {
|
|
18
18
|
outputFile = `report-${Date.now()}.html`;
|
|
19
19
|
}
|
|
20
20
|
const outputPath = path.resolve(reportsDir, outputFile);
|
|
21
|
-
const result = await generateReport(document, outputPath);
|
|
21
|
+
const result = await generateReport(document, outputPath, serverBaseUrl);
|
|
22
22
|
const fileUrl = pathToFileURL(result.filePath).href;
|
|
23
23
|
const fileContent = await fs.readFile(result.filePath, 'utf8');
|
|
24
24
|
// The http path will be constructed by the caller in index.ts,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reportGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/reportGenerator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reportGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/reportGenerator.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA8H9C"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import fs from 'fs-extra';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { JSDOM } from 'jsdom';
|
|
4
|
-
|
|
4
|
+
import { renderLocalImage } from '../images/localImages.js';
|
|
5
|
+
export async function generateReport(htmlDocument, outputFile, serverBaseUrl) {
|
|
5
6
|
const dom = new JSDOM(htmlDocument);
|
|
6
7
|
const { document } = dom.window;
|
|
8
|
+
const outputDirPath = path.dirname(outputFile);
|
|
7
9
|
// 1. Ensure a valid HTML structure
|
|
8
10
|
let head = document.querySelector('head');
|
|
9
11
|
if (!head) {
|
|
@@ -45,7 +47,49 @@ export async function generateReport(htmlDocument, outputFile) {
|
|
|
45
47
|
scriptTag.remove();
|
|
46
48
|
}
|
|
47
49
|
});
|
|
48
|
-
// 4.
|
|
50
|
+
// 4. Process all img elements to handle local images
|
|
51
|
+
const images = document.querySelectorAll('img');
|
|
52
|
+
for (const img of Array.from(images)) {
|
|
53
|
+
const src = img.getAttribute('src');
|
|
54
|
+
if (src) {
|
|
55
|
+
// Check if it's a local file (not a URL)
|
|
56
|
+
if (!src.startsWith('http://') && !src.startsWith('https://') && !src.startsWith('data:')) {
|
|
57
|
+
try {
|
|
58
|
+
// If serverBaseUrl is provided, create HTTP link instead of base64
|
|
59
|
+
if (serverBaseUrl) {
|
|
60
|
+
const imageFileName = path.basename(src);
|
|
61
|
+
const imageDestPath = path.join(outputDirPath, imageFileName);
|
|
62
|
+
// Copy the image to the report directory
|
|
63
|
+
const imageSourcePath = path.resolve(process.cwd(), src);
|
|
64
|
+
await fs.copyFile(imageSourcePath, imageDestPath);
|
|
65
|
+
// Update the img src to point to the HTTP URL
|
|
66
|
+
const httpUrl = `${serverBaseUrl}/${imageFileName}`;
|
|
67
|
+
img.setAttribute('src', httpUrl);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Convert local image to base64 embedded image (fallback behavior)
|
|
71
|
+
const imageHtml = await renderLocalImage({
|
|
72
|
+
src: src,
|
|
73
|
+
alt: img.getAttribute('alt') || '',
|
|
74
|
+
width: img.getAttribute('width') ? parseInt(img.getAttribute('width')) : undefined,
|
|
75
|
+
height: img.getAttribute('height') ? parseInt(img.getAttribute('height')) : undefined
|
|
76
|
+
});
|
|
77
|
+
// Parse the generated HTML and replace the img element
|
|
78
|
+
const imageDom = new JSDOM(imageHtml);
|
|
79
|
+
const imageContainer = imageDom.window.document.querySelector('.image-container');
|
|
80
|
+
if (imageContainer) {
|
|
81
|
+
img.parentNode?.replaceChild(document.importNode(imageContainer, true), img);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.warn(`Failed to process local image ${src}:`, error);
|
|
87
|
+
// Keep original img tag if processing fails
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// 5. Inject a single, robust chart-rendering script at the end of the body
|
|
49
93
|
const finalChartScript = document.createElement('script');
|
|
50
94
|
finalChartScript.textContent = `
|
|
51
95
|
document.addEventListener('DOMContentLoaded', () => {
|
|
@@ -63,7 +107,6 @@ export async function generateReport(htmlDocument, outputFile) {
|
|
|
63
107
|
`;
|
|
64
108
|
document.body.appendChild(finalChartScript);
|
|
65
109
|
const finalHtml = dom.serialize();
|
|
66
|
-
const outputDirPath = path.dirname(outputFile);
|
|
67
110
|
await fs.ensureDir(outputDirPath);
|
|
68
111
|
await fs.writeFile(outputFile, finalHtml);
|
|
69
112
|
console.log('Report successfully generated and fixed at: ${outputFile}');
|
package/package.json
CHANGED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { generateReport } from './dist/utils/reportGenerator.js';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
5
|
+
async function testHttpImages() {
|
|
6
|
+
// Read the test HTML file
|
|
7
|
+
const htmlContent = fs.readFileSync('test_http_image_report.html', 'utf8');
|
|
8
|
+
|
|
9
|
+
// Generate report with server base URL
|
|
10
|
+
const outputPath = path.resolve('.', 'test_http_output.html');
|
|
11
|
+
const serverBaseUrl = 'http://localhost:3000/reports';
|
|
12
|
+
|
|
13
|
+
console.log('Generating report with HTTP image links...');
|
|
14
|
+
const result = await generateReport(htmlContent, outputPath, serverBaseUrl);
|
|
15
|
+
|
|
16
|
+
// Read the generated report
|
|
17
|
+
const generatedContent = fs.readFileSync(outputPath, 'utf8');
|
|
18
|
+
|
|
19
|
+
console.log('Generated report saved to:', result.filePath);
|
|
20
|
+
console.log('Checking for HTTP image links...');
|
|
21
|
+
|
|
22
|
+
// Check if images were converted to HTTP links
|
|
23
|
+
if (generatedContent.includes('http://localhost:3000/reports/apple_logo_chart.png')) {
|
|
24
|
+
console.log('✅ SUCCESS: Image converted to HTTP link');
|
|
25
|
+
} else if (generatedContent.includes('src="data:image')) {
|
|
26
|
+
console.log('❌ FAILED: Image still using base64 encoding');
|
|
27
|
+
} else {
|
|
28
|
+
console.log('⚠️ UNKNOWN: Image format not recognized');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Also copy the image file to test directory to simulate real scenario
|
|
32
|
+
try {
|
|
33
|
+
fs.copyFileSync('apple_logo_chart.png', 'apple_logo_chart.png');
|
|
34
|
+
console.log('✅ Image file copied to test directory');
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.log('⚠️ Could not copy image file:', error.message);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
console.log('\nGenerated HTML content:');
|
|
40
|
+
console.log('======================');
|
|
41
|
+
console.log(generatedContent);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
testHttpImages().catch(console.error);
|