PageSourceSearch

https://xgm.guru/public/mjs/79df25d1/components/llm-chat.js

js xgm.guru collected 2026-09-24 10:34:06 UTC 2,813 bytes, 51 lines download raw bytes

1import {Modal} from '../ui/modal.js'
2import {firemsg} from '../ui/firemsg.js'
3import {globalProgress, L} from '../ui/utils.js'
4
5const error = {error: 'Неизвестная ошибка'}
6
7/**
8 * Opens LLM Chat modal.
9 * data-attributes:
10 *  data-modal-open="llm-chat-generate-resource" 
11 *  data-projectid - target project id or empty
12 *  data-list-url  - url to fetch list in json format
13 *  data-post-prompt - prompt to add after the list
14 */
15const llmChatGenerateResourceForm = document.getElementById('llm-chat-generate-resource')
16if (llmChatGenerateResourceForm instanceof HTMLFormElement) {
17    /** @type {HTMLFormElement|null} fromLoader */
18    const formLoader = llmChatGenerateResourceForm.querySelector('.as-loader')
19    document.body.addEventListener('ui.modal-open', e => {
20        if (e.detail.name !== 'llm-chat-generate-resource') return
21        Modal.open(async () => {
22            formLoader.style.display = 'block'
23            // noinspection JSUnresolvedVariable
24            if(e.target.dataset && e.target.dataset.projectid) {
25                llmChatGenerateResourceForm.elements.projectid.value = e.target.dataset.projectid
26            }
27            llmChatGenerateResourceForm.elements.prompt.focus()
28            llmChatGenerateResourceForm.elements.submit.disabled = true
29            globalProgress(true)
30            const response = await fetch(e.target.dataset.listUrl)
31            const list = await response.json().catch(() => error)
32            llmChatGenerateResourceForm.elements.submit.disabled = false
33            llmChatGenerateResourceForm.addEventListener('submit', () => {
34                llmChatGenerateResourceForm.elements.submit.disabled = true
35                formLoader.style.display = 'block'
36            })
37            globalProgress(false)
38            formLoader.style.display = 'none'
39            const fromProjectTitle = e.target.dataset.projectTitle ? ' для проекта "'+e.target.dataset.projectTitle+'" ' : '';
40            llmChatGenerateResourceForm.elements.prompt.value = "Ты - XGM Assistant и помогаешь XGM Team составлять полезные сводки. К нам на сайт поступили материалы"+fromProjectTitle+":\r\n```\r\n"
41                + JSON.stringify(list, null, ' ') 
42                + "\r\n```\r\n" 
43                + e.target.dataset.postPrompt
44                + "\r\nОтвечай сразу. Заголовок на первой строке. Можно использовать markdown. Обязательно вставляй url и изображения, где они есть";
45            return llmChatGenerateResourceForm
46        }, async () => {
47            formLoader.style.display = 'block'
48            llmChatGenerateResourceForm.elements.prompt.value = ''
49        })
50    })
51}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.