diff --git a/index.cfm b/index.cfm
index 252efd5..95adb9e 100644
--- a/index.cfm
+++ b/index.cfm
@@ -75,7 +75,7 @@

-
Сверка договоров — LLM AI-driven Event Sourcing v1.0.109 — Lucee
+
Сверка договоров — LLM AI-driven Event Sourcing v1.0.110 — Lucee
@@ -101,12 +101,10 @@
- ⚙ Промпт LLM
-
-
-
-
-
+
⚙ Промпты LLM
+
+
+
@@ -146,6 +144,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
История версий
+
+
+
+
+
diff --git a/prompt.cfm b/prompt.cfm
index b2a2a8d..1aeddb3 100644
--- a/prompt.cfm
+++ b/prompt.cfm
@@ -6,48 +6,254 @@
+
+ DROP TABLE IF EXISTS prompts CASCADE
+
CREATE TABLE IF NOT EXISTS prompts (
- contract_id UUID PRIMARY KEY REFERENCES contracts(id),
- prompt_text TEXT NOT NULL
+ 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 =
+
+
+
+
+
+
+
+
+
-
-
-
- DELETE FROM prompts WHERE contract_id =
-
-
-
- INSERT INTO prompts (contract_id, prompt_text) VALUES (
- ,
-
- )
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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 =
+
+
+
+
+
-
-
- SELECT prompt_text FROM prompts
- WHERE contract_id =
-
-
+
+