OK DROP TABLE IF EXISTS prompts CASCADE CREATE TABLE IF NOT EXISTS prompts ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), role VARCHAR(20) NOT NULL, name VARCHAR(100) NOT NULL, body TEXT NOT NULL, parent_id UUID REFERENCES prompts(id), is_active BOOLEAN DEFAULT false, created_at TIMESTAMPTZ DEFAULT now(), created_by VARCHAR(50) DEFAULT 'system', notes TEXT ) SELECT COUNT(*) as cnt FROM prompts INSERT INTO prompts (role, name, body, is_active, notes) VALUES ( 'extract', 'default-v1', 'Ты — анализатор договоров облачного провайдера. Ниже текст спецификации услуг из ПЕРВОГО документа (базовый договор). Извлеки ВСЕ строки спецификации в JSON-массив. Верни СТРОГО JSON без пояснений. Не используй markdown-блоки. ФОРМАТ: { "mode": "partial", "ops": [ {"action": "ADD", "new_row": {"name": "полное наименование", "price": число, "qty": число, "sum": число, "date_start": "YYYY-MM-DD"}, "comment": ""} ] } ПРАВИЛА: 1. Извлеки КАЖДУЮ строку таблицы спецификации как отдельную ADD-операцию. 2. Пропускай итоговые строки ("Итого...") и строки с подписями. 3. Если ячейка пустая — ставь null (не пиши 0). 4. price, qty, sum — ЧИСЛА, не строки. ТЕКСТ ДОКУМЕНТА: --- {doc_text} ---', true, 'Авто-создан из llm_prompt.py _build_initial' ) INSERT INTO prompts (role, name, body, is_active, notes) VALUES ( 'diff', 'default-v1', 'Ты — анализатор допсоглашений к договорам облачного провайдера. У тебя есть текущая спецификация услуг и текст нового допсоглашения (ДС). Твоя задача — определить, какие изменения вносит ДС в текущую спецификацию. Верни СТРОГО JSON без пояснений. Не используй markdown-блоки. ФОРМАТ: { "mode": "partial" | "full_replace", "ops": [ {"action": "ADD", "new_row": {"name": "...", "price": число, "qty": число, "sum": число, "date_start": "YYYY-MM-DD"}, "comment": "..."}, {"action": "UPDATE", "target_id": "rN", "new_values": {"price": число}, "comment": "..."}, {"action": "DELETE", "target_id": "rN", "comment": "..."}, {"action": "UNRESOLVED", "new_values": {"name": "...", "price": число, ...}, "reason": "почему не смог сопоставить"} ] } ПРАВИЛА: 1. mode = "full_replace" — если в тексте есть фразы: «в следующей редакции», «заменить приложение», «излагается в следующей редакции». При full_replace — опиши ВСЕ новые строки как ADD. 2. mode = "partial" — если ДС меняет только отдельные строки. 3. Для UPDATE/DELETE — укажи target_id (r1, r2...) из списка текущей спецификации. НЕ придумывай новые id. 4. new_values в UPDATE — только ИЗМЕНЁННЫЕ поля (не все). 5. Если не можешь однозначно сопоставить строку — action: UNRESOLVED с reason. 6. Пропускай итоговые строки и подписи. 7. price, qty, sum — ЧИСЛА (не строки). ТЕКУЩАЯ СПЕЦИФИКАЦИЯ: {spec_current} ТЕКСТ ДОПСОГЛАШЕНИЯ: --- {doc_text} ---', true, 'Авто-создан из llm_prompt.py _build_diff' ) SELECT id, name, body, created_at, notes FROM prompts WHERE role = AND is_active = true ORDER BY created_at DESC LIMIT 1 SELECT id, name, is_active, created_at, created_by, notes FROM prompts WHERE role = ORDER BY created_at DESC SELECT id, role, name, body, parent_id, is_active, created_at, created_by, notes FROM prompts WHERE id = UPDATE prompts SET is_active = false WHERE role = INSERT INTO prompts (role, name, body, parent_id, is_active, created_by, notes) VALUES ( , , , NULL, , , NULL ) SELECT role FROM prompts WHERE id = UPDATE prompts SET is_active = false WHERE role = UPDATE prompts SET is_active = true WHERE id = SELECT is_active FROM prompts WHERE id = DELETE FROM prompts WHERE id = #serializeJSON(result)#