Files

81 lines
3.4 KiB
Plaintext

<cfsetting showdebugoutput="no" enablecfoutputonly="true">
<cfheader name="Content-Type" value="application/json; charset=utf-8">
<cfheader name="Access-Control-Allow-Origin" value="*">
<cfif cgi.request_method EQ "OPTIONS"><cfoutput>OK</cfoutput><cfabort></cfif>
<cfparam name="url.contract_id" default="">
<cfparam name="form.question" default="">
<cfset result = {ok: false, error: ""}>
<cftry>
<cfif NOT len(url.contract_id)>
<cfset result.error = "contract_id required">
<cfelseif NOT len(form.question)>
<cfset result.error = "question required (POST field)">
<cfelse>
<!--- Собрать строки текущей спецификации --->
<cfquery name="rowsData" datasource="baza">
SELECT name, price, qty, sum, date_start
FROM spec_current
WHERE contract_id = <cfqueryparam value="#url.contract_id#" cfsqltype="cf_sql_varchar">
ORDER BY name
</cfquery>
<cfif rowsData.recordCount EQ 0>
<cfset result = {ok: true, answer: "Нет извлечённых данных. Сначала запустите сравнение."}>
<cfelse>
<!--- Форматируем контекст --->
<cfset contextLines = []>
<cfloop query="rowsData">
<cfset arrayAppend(contextLines,
rowsData.name &
" | цена=" & rowsData.price & " | объём=" & rowsData.qty &
" | сумма=" & rowsData.sum & " | начало=" & rowsData.date_start
)>
</cfloop>
<cfset context = arrayToList(contextLines, chr(10))>
<cfset prompt = "Ты — анализатор договоров облачного провайдера. У тебя есть извлечённые строки спецификации услуг.
ДАННЫЕ:
#context#
ВОПРОС ПОЛЬЗОВАТЕЛЯ:
#form.question#
Ответь кратко и по делу, опираясь ТОЛЬКО на данные выше. Если данных недостаточно — скажи об этом.">
<!--- Вызов LLM --->
<cfset apiKey = createObject("java", "java.lang.System").getenv("LLM_KEY")>
<cfset llmPayload = {
"model": "gpt-oss-120b",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 1000,
"temperature": 0.1
}>
<cfhttp url="https://api.aillm.ru/v1/chat/completions" method="POST" timeout="120">
<cfhttpparam type="header" name="Authorization" value="Bearer #apiKey#">
<cfhttpparam type="header" name="Content-Type" value="application/json">
<cfhttpparam type="body" value="#serializeJSON(llmPayload)#">
</cfhttp>
<cfif cfhttp.statusCode EQ 200 OR left(cfhttp.statusCode, 3) EQ "200">
<cfset llmResp = deserializeJSON(cfhttp.fileContent)>
<cfset answer = llmResp.choices[1].message.content>
<cfset result = {ok: true, answer: answer}>
<cfelse>
<cfset result = {ok: false, error: "LLM HTTP #cfhttp.statusCode#: #left(cfhttp.fileContent, 300)#"}>
</cfif>
</cfif>
</cfif>
<cfcatch>
<cfset result = {ok: false, error: cfcatch.message}>
</cfcatch>
</cftry>
<cfoutput>#serializeJSON(result)#</cfoutput>