Spaces:
Sleeping
Sleeping
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) | |
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) | |
def health(): | |
return jsonify({"status": "ok"}) | |
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}) | |
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}) | |
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}) | |
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}) | |
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}) | |
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}) | |
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}) | |
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) |