Spaces:
Sleeping
Sleeping
File size: 5,355 Bytes
9dd4b6c a9b39d2 cb60f6b ecf21a8 9dd4b6c ecf21a8 9dd4b6c a9b39d2 ecf21a8 a9b39d2 ecf21a8 9dd4b6c ecf21a8 a9b39d2 9dd4b6c 267da20 9dd4b6c a9b39d2 9dd4b6c a9b39d2 9dd4b6c ecf21a8 9dd4b6c ecf21a8 9dd4b6c ecf21a8 9dd4b6c ecf21a8 9dd4b6c ecf21a8 9dd4b6c ecf21a8 9dd4b6c ecf21a8 9dd4b6c a9b39d2 9dd4b6c cad0763 9dd4b6c cad0763 9dd4b6c cad0763 1af689b 9dd4b6c |
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 |
from fastapi import FastAPI, Request, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import json
import re
import os
from llm.common import LlmParams, LlmPredictParams
from llm.deepinfra_api import DeepInfraApi
from llm import prompts
from prompts import gettable
from dotenv import load_dotenv
import uvicorn
# Загрузка переменных окружения из файла .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)
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"]
)
class TextRequest(BaseModel):
text: str
projects: list[str] = []
@app.post("/extracttable")
async def extracttable_route(request: TextRequest):
prompt = gettable.USER_PROMPT.format(query=request.text)
response = await llm_api.predict(prompt[:150000], system_prompt=gettable.SYSTEM_PROMPT)
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()
except json.JSONDecodeError as e:
result["error"] = f"Ошибка декодирования JSON: {e}"
return result
@app.get("/health")
def health():
return {"status": "ok"}
async def generate_response(prompt):
return await llm_api.predict(prompt[:150000])
@app.post("/getsummary")
async def getsummary_route(request: TextRequest):
return {"result": await generate_response(prompts.GET_SUMMARY.format(text=request.text))}
@app.post("/cleantext")
async def cleantext_route(request: TextRequest):
return {"result": await generate_response(prompts.CLEAN_TEXT.format(text=request.text))}
@app.post("/getfollowup")
async def getfollowup_route(request: TextRequest):
return {"result": await generate_response(prompts.GET_FOLLOWUP.format(text=request.text))}
@app.post("/getagenda")
async def getagenda_route(request: TextRequest):
return {"result": await generate_response(prompts.GET_AGENDA.format(text=request.text))}
@app.post("/gethighlights")
async def gethighlights_route(request: TextRequest):
return {"result": await generate_response(prompts.GET_HIGHLIGHTS.format(text=request.text))}
@app.post("/getprojectinfo")
async def getprojectinfo_route(request: TextRequest):
prompts_list = [
prompts.GET_PROJECT_INFO_NAMES.format(text=request.text),
prompts.GET_PROJECT_INFO_AGENDA.format(text=request.text)
]
main_info = "\n\n".join([await generate_response(p) for p in prompts_list])
return {"result": main_info.strip().replace("Конец ответа", "").replace('</s>', '')}
@app.post("/getprojectlist")
async def getprojectlist_route(request: TextRequest):
list_of_projects = await generate_response(prompts.GET_PROJECT_LIST.format(text=request.text))
projects = [f"Проект {x}" for x in list_of_projects.split("Проект ") if x][1:]
projects = [p.replace("проект ", "").strip() for p in projects]
real_projects = await generate_response(prompts.GET_PROJECT_LIST_CHECK_PROJECT.format(text=request.text, projects=projects))
real_projects_list = re.findall(r'Да:\s*(.*?)\s*(?:\n\n|$)', real_projects)
return {"result": real_projects_list}
@app.post("/getprojectdetails")
async def getprojectdetails_route(request: TextRequest):
if not request.projects:
raise HTTPException(status_code=400, detail="Проекты не выбраны")
final = {}
for project in request.projects:
prompts_list = [
prompts.GET_PROJECT_DETAILS_AIM.format(text=request.text, project=project),
prompts.GET_PROJECT_DETAILS_VALUE.format(text=request.text, project=project),
prompts.GET_PROJECT_DETAILS_BUDGET.format(text=request.text, project=project),
prompts.GET_PROJECT_DETAILS_ECO_EFFECT.format(text=request.text, project=project),
prompts.GET_PROJECT_DETAILS_DEADLINE.format(text=request.text, project=project),
prompts.GET_PROJECT_DETAILS_NEW_PLAN.format(text=request.text, project=project),
prompts.GET_PROJECT_DETAILS_CONCLUSION.format(text=request.text, project=project),
]
final[project] = "\n\n".join([await generate_response(p) for p in prompts_list])
final[project] = final[project].replace("Конец ответа", "").replace('</s>', '').strip()
return {"result": final}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)
|