Spaces:
Sleeping
Sleeping
File size: 9,411 Bytes
a9b39d2 cb60f6b ecf21a8 a9b39d2 ecf21a8 a9b39d2 ecf21a8 a9b39d2 267da20 a9b39d2 ecf21a8 a9b39d2 ecf21a8 a9b39d2 ecf21a8 a9b39d2 ecf21a8 a9b39d2 ecf21a8 27403e1 a9b39d2 ecf21a8 a9b39d2 ecf21a8 27403e1 a9b39d2 ecf21a8 a9b39d2 ecf21a8 35a0577 ecf21a8 35a0577 ecf21a8 27403e1 a9b39d2 cb60f6b ecf21a8 cb60f6b ecf21a8 cb60f6b ecf21a8 dc13bfb 324b21e cb60f6b 3b87440 cb60f6b 407a000 cb60f6b cad0763 ecf21a8 cad0763 ecf21a8 cad0763 ecf21a8 cad0763 ecf21a8 cad0763 ecf21a8 cad0763 ecf21a8 cad0763 ecf21a8 cad0763 ecf21a8 cad0763 ecf21a8 cad0763 ecf21a8 cad0763 ffa3a23 cad0763 81b0f6b cad0763 6074d5a ecf21a8 f87da75 f294956 ecf21a8 f87da75 f294956 cad0763 1af689b ffa3a23 cad0763 ecf21a8 cad0763 a6ca347 ffa3a23 cad0763 a9b39d2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 |
from flask import Flask, request, Response, jsonify
from flask_cors import CORS
import json
import re
import os
from llm.common import LlmParams, LlmPredictParams
from llm.deepinfra_api import DeepInfraApi
from llm import prompts
from dotenv import load_dotenv
# Загрузка переменных окружения из файла .env
load_dotenv()
LLM_API_URL = os.getenv("LLM_API_URL", "https://api.deepinfra.com")
LLM_API_KEY = os.getenv("DEEPINFRA_API_KEY", "")
LLM_NAME = os.getenv("LLM_NAME", "meta-llama/Llama-3.3-70B-Instruct-Turbo")
default_llm_params = LlmParams(url=LLM_API_URL,api_key=LLM_API_KEY, model=LLM_NAME, predict_params=LlmPredictParams(temperature=0.15, top_p=0.95, min_p=0.05, seed=42, repetition_penalty=1.2, presence_penalty=1.1, max_tokens=6000))
llm_api = DeepInfraApi(default_llm_params)
def format_prompt(message, history):
prompt = "<s>"
for user_prompt, bot_response in history:
prompt += f"[INST] {user_prompt} [/INST]"
prompt += f" {bot_response}</s> "
prompt += f"[INST] {message} [/INST]"
return prompt
def split_text(text):
max_chars = 3500
sentences = text.split('.')
lines = []
for sentence in sentences:
lines.extend(sentence.split('\n'))
result = []
current_chunk = ''
for line in lines:
if len(current_chunk) + len(line) < max_chars:
current_chunk += line + '.'
else:
result.append(current_chunk.strip())
current_chunk = line + '.'
if current_chunk:
result.append(current_chunk.strip())
return result
app = Flask(__name__)
CORS(app)
@app.route('/extracttable', methods=['POST'])
async def extracttable_route():
data = request.get_json()
text = data.get('text', '')
prompt = prompts.LLM_PROMPT_EXTRACT_TABLE.format(query = text)
response = await llm_api.predict(prompt[:150000])
result = {"response": None, "error": None, "raw": response} # По умолчанию сохраняем всю строку
if "JSON: " not in response:
result["error"] = "Строка не содержит 'JSON: '"
return result
prefix, json_str = response.split("JSON: ", 1)
json_str = json_str.strip()
if not json_str:
result["error"] = "После 'JSON: ' отсутствует JSON"
return result
try:
result["response"] = json.loads(json_str)
result["raw"] = prefix.strip() # Остаток перед "JSON: "
except json.JSONDecodeError as e:
result["error"] = f"Ошибка декодирования JSON: {e}"
return jsonify(result)
@app.route('/health', methods=['GET'])
def health():
return jsonify({"status": "ok"})
@app.route('/getsummary', methods=['POST'])
async def getsummary_route():
data = request.get_json()
text = data.get('text', '')
prompt = prompts.GET_SUMMARY.format(text=text)
response = await llm_api.predict(prompt[:150000])
return jsonify({'result': response})
@app.route('/cleantext', methods=['POST'])
async def cleantext_route():
data = request.get_json()
text = data.get('text', '')
prompt = prompts.CLEAN_TEXT.format(text=text)
response = await llm_api.predict(prompt[:150000])
return jsonify({'result': response})
@app.route('/getfollowup', methods=['POST'])
async def getfollowup_route():
data = request.get_json()
text = data.get('text', '')
prompt = prompts.GET_FOLLOWUP.format(text=text)
response = await llm_api.predict(prompt[:150000])
return jsonify({'result': response})
@app.route('/getagenda', methods=['POST'])
async def getagenda_route():
data = request.get_json()
text = data.get('text', '')
prompt = prompts.GET_AGENDA.format(text=text)
response = await llm_api.predict(prompt[:150000])
return jsonify({'result': response})
@app.route('/gethighlights', methods=['POST'])
async def gethighlights_route():
data = request.get_json()
text = data.get('text', '')
prompt = prompts.GET_HIGHLIGHTS.format(text=text)
response = await llm_api.predict(prompt[:150000])
return jsonify({'result': response})
@app.route('/getprojectinfo', methods=['POST'])
async def getprojectinfo_route():
data = request.get_json()
text = data.get('text', '')
main_prompts = []
main_prompts.append(prompts.GET_PROJECT_INFO_NAMES.format(text=text))
main_prompts.append(prompts.GET_PROJECT_INFO_AGENDA.format(text=text))
main_info =''
for i in main_prompts:
result = await llm_api.predict(i[:150000])
if result is None:
return jsonify({'error': 'Сервер LLM временно недоступен. Попробуйте повторить запрос через несколько минут.'})
main_info += '\n\n'+result+'\n\n'
final = main_info
final = final.replace("Конец ответа", "")
final = final.replace('</s>', '')
final = final.strip()
return jsonify({'result': final})
@app.route('/getprojectlist', methods=['POST'])
async def getprojectlist_route():
data = request.get_json()
text = data.get('text', '')
main_prompts = []
main_prompts.append(prompts.GET_PROJECT_INFO_NAMES.format(text=text))
main_prompts.append(prompts.GET_PROJECT_INFO_AGENDA.format(text=text))
main_info =''
for i in main_prompts:
result = await llm_api.predict(i[:150000])
if result is None:
return jsonify({'error': 'Сервер LLM временно недоступен. Попробуйте повторить запрос через несколько минут.'})
main_info += '\n\n'+result+'\n\n'
proj_prompt = []
proj_prompt.append(prompts.GET_PROJECT_LIST.format(text=text))
list_of_projects =''
for i in proj_prompt:
result = await llm_api.predict(i[:150000])
if result is None:
return jsonify({'error': 'Сервер LLM временно недоступен. Попробуйте повторить запрос через несколько минут.'})
list_of_projects += result
delimiter = 'Проект '
proj = [delimiter+x for x in list_of_projects.split(delimiter) if x]
proj = proj[1:]
projects = []
for i in proj:
a = i.replace("Проект №", "")
a = a.replace("Конец ответа", "")
a = a.replace("данный проект", "") ###убираю слово "проект", чтобы модель не опиралась на него,
a = a.replace("проект ", "") # при ответе на вопрос, проект это или нет
a = a.replace('\n', ' ')
a = a.replace('</s>', ' ')
a = a.strip()
projects.append(a)
check_prompts = []
checking = prompts.GET_PROJECT_LIST_CHECK_PROJECT.format(text=text, projects=projects)
check_prompts.append(checking)
real_projects = ''
for i in check_prompts:
result = await llm_api.predict(i[:150000])
if result is None:
return jsonify({'error': 'Сервер LLM временно недоступен. Попробуйте повторить запрос через несколько минут.'})
real_projects += result
real_projects_list = re.findall(r'Да:\s*(.*?)\s*(?:\n\n|$)', real_projects)
return jsonify({'result': real_projects_list})
@app.route('/getprojectdetails', methods=['POST'])
async def getinfobyproject_route():
data = request.get_json()
text = data.get('text', '')
real_projects_list = data.get('projects', {})
project_prompts = {}
if real_projects_list:
for i in real_projects_list:
if not i or i.strip() == "":
continue
prompt_aim = prompts.GET_PROJECT_DETAILS_AIM.format(text=text, project=i)
gk = prompts.GET_PROJECT_DETAILS_VALUE.format(text=text, project=i)
budget = prompts.GET_PROJECT_DETAILS_BUDGET.format(text=text, project=i)
ec_ef = prompts.GET_PROJECT_DETAILS_ECO_EFFECT.format(text=text, project=i)
deadline = prompts.GET_PROJECT_DETAILS_DEADLINE.format(text=text, project=i)
new_plan = prompts.GET_PROJECT_DETAILS_NEW_PLAN.format(text=text, project=i)
conclusion = prompts.GET_PROJECT_DETAILS_CONCLUSION.format(text=text, project=i)
p = [prompt_aim, gk, budget, ec_ef, deadline, new_plan, conclusion]
project_prompts[i] = {}
project_prompts[i]['prompts'] = p
elif not real_projects_list:
return jsonify({'error': 'Проекты не выбраны'})
final = {}
for project_name, project in project_prompts.items():
for prompt in project['prompts']:
result = await llm_api.predict(prompt[:150000])
if result is not None:
final[project_name] = final.get(project_name, '') + '\n\n'+result + '\n\n'
final[project_name] = final[project_name].replace("Конец ответа", "")
final[project_name] = final[project_name].replace('</s>', '')
final[project_name] = final[project_name].strip()
return jsonify({'result': final})
if __name__ == '__main__':
app.run(debug=False, host='0.0.0.0', port=7860) |