fix: убрать хардкод API-ключа (chat.cfm), verify=True (llm.py), отвязать llm_prompt от Lucee
This commit is contained in:
@@ -15,14 +15,12 @@
|
|||||||
<cfelseif NOT len(form.question)>
|
<cfelseif NOT len(form.question)>
|
||||||
<cfset result.error = "question required (POST field)">
|
<cfset result.error = "question required (POST field)">
|
||||||
<cfelse>
|
<cfelse>
|
||||||
<!--- Собрать все spec_rows --->
|
<!--- Собрать строки текущей спецификации --->
|
||||||
<cfquery name="rowsData" datasource="baza">
|
<cfquery name="rowsData" datasource="baza">
|
||||||
SELECT d.filename, sr.row_num, sr.name, sr.price, sr.qty, sr.sum, sr.date_start
|
SELECT name, price, qty, sum, date_start
|
||||||
FROM spec_rows sr
|
FROM spec_current
|
||||||
JOIN supplements s ON sr.supplement_id = s.id
|
WHERE contract_id = <cfqueryparam value="#url.contract_id#" cfsqltype="cf_sql_varchar">
|
||||||
JOIN documents d ON s.document_id = d.id
|
ORDER BY name
|
||||||
WHERE s.contract_id = <cfqueryparam value="#url.contract_id#" cfsqltype="cf_sql_varchar">
|
|
||||||
ORDER BY s.created_at, sr.row_num
|
|
||||||
</cfquery>
|
</cfquery>
|
||||||
|
|
||||||
<cfif rowsData.recordCount EQ 0>
|
<cfif rowsData.recordCount EQ 0>
|
||||||
@@ -32,7 +30,7 @@
|
|||||||
<cfset contextLines = []>
|
<cfset contextLines = []>
|
||||||
<cfloop query="rowsData">
|
<cfloop query="rowsData">
|
||||||
<cfset arrayAppend(contextLines,
|
<cfset arrayAppend(contextLines,
|
||||||
"[" & rowsData.filename & "] строка " & rowsData.row_num & ": " & rowsData.name &
|
rowsData.name &
|
||||||
" | цена=" & rowsData.price & " | объём=" & rowsData.qty &
|
" | цена=" & rowsData.price & " | объём=" & rowsData.qty &
|
||||||
" | сумма=" & rowsData.sum & " | начало=" & rowsData.date_start
|
" | сумма=" & rowsData.sum & " | начало=" & rowsData.date_start
|
||||||
)>
|
)>
|
||||||
@@ -50,7 +48,7 @@
|
|||||||
Ответь кратко и по делу, опираясь ТОЛЬКО на данные выше. Если данных недостаточно — скажи об этом.">
|
Ответь кратко и по делу, опираясь ТОЛЬКО на данные выше. Если данных недостаточно — скажи об этом.">
|
||||||
|
|
||||||
<!--- Вызов LLM --->
|
<!--- Вызов LLM --->
|
||||||
<cfset apiKey = "sk-ucI5YvOticoOQ9Kuj5K9mQ">
|
<cfset apiKey = createObject("java", "java.lang.System").getenv("LLM_KEY")>
|
||||||
<cfset llmPayload = {
|
<cfset llmPayload = {
|
||||||
"model": "gpt-oss-120b",
|
"model": "gpt-oss-120b",
|
||||||
"messages": [{"role": "user", "content": prompt}],
|
"messages": [{"role": "user", "content": prompt}],
|
||||||
|
|||||||
+6
-16
@@ -1,10 +1,8 @@
|
|||||||
"""llm_prompt.py — Формирование промпта для LLM-анализа ДС.
|
"""llm_prompt.py — Формирование промпта для LLM-анализа ДС.
|
||||||
Читает активный промпт из БД (через Lucee API). При ошибке — fallback на хардкод."""
|
Читает активный промпт из БД напрямую (db.prompts). При ошибке — fallback на хардкод."""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import httpx
|
from db import prompts as db_prompts
|
||||||
|
|
||||||
LUCEE_URL = os.environ.get("LUCEE_URL", "https://contractor.luceek8s.dev.nubes.ru")
|
|
||||||
|
|
||||||
# ── Fallback-промпты (если БД недоступна) ──────────────────────
|
# ── Fallback-промпты (если БД недоступна) ──────────────────────
|
||||||
|
|
||||||
@@ -178,19 +176,11 @@ EDGE-CASES:
|
|||||||
|
|
||||||
|
|
||||||
def _fetch_prompt(role: str) -> dict | None:
|
def _fetch_prompt(role: str) -> dict | None:
|
||||||
"""Получить активный промпт из БД. Возвращает {id, body} или None."""
|
"""Получить активный промпт из БД напрямую (а не через Lucee HTTP)."""
|
||||||
try:
|
try:
|
||||||
with httpx.Client(http2=True, timeout=10) as client:
|
row = db_prompts.get_active(role)
|
||||||
resp = client.get(
|
if row and row.get("body"):
|
||||||
f"{LUCEE_URL}/prompt.cfm",
|
return {"id": row.get("id", ""), "body": row["body"]}
|
||||||
params={"action": "get_active", "role": role},
|
|
||||||
)
|
|
||||||
resp.raise_for_status()
|
|
||||||
data = resp.json()
|
|
||||||
# Lucee serializeJSON → UPPERCASE keys, normalize to lowercase
|
|
||||||
data = {k.lower(): v for k, v in data.items()}
|
|
||||||
if data.get("ok") and data.get("body"):
|
|
||||||
return {"id": data.get("id", ""), "body": data["body"]}
|
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ def call_llm(current_spec, doc_text, build_prompt_fn):
|
|||||||
"max_tokens": 8000,
|
"max_tokens": 8000,
|
||||||
"temperature": 0.1,
|
"temperature": 0.1,
|
||||||
}
|
}
|
||||||
with httpx.Client(http2=True, timeout=120, verify=False) as client:
|
with httpx.Client(http2=True, timeout=120, verify=True) as client:
|
||||||
resp = client.post(
|
resp = client.post(
|
||||||
LLM_URL,
|
LLM_URL,
|
||||||
json=payload,
|
json=payload,
|
||||||
|
|||||||
Reference in New Issue
Block a user