81 lines
3.4 KiB
Plaintext
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>
|