async fixes
Browse files- app.py +2 -2
- lib/llm_3_deepinfra.py +41 -42
app.py
CHANGED
|
@@ -56,10 +56,10 @@ def upload_file():
|
|
| 56 |
|
| 57 |
# Endpoint for uploading PDF and extracting text
|
| 58 |
@app.route('/analize', methods=['POST'])
|
| 59 |
-
def analize():
|
| 60 |
# Get the text data from the request
|
| 61 |
text_data = request.json.get('text')
|
| 62 |
-
app_info = llm.getApplicationInfo(text_data)
|
| 63 |
result = {
|
| 64 |
"application": app_info,
|
| 65 |
"debug": {}
|
|
|
|
| 56 |
|
| 57 |
# Endpoint for uploading PDF and extracting text
|
| 58 |
@app.route('/analize', methods=['POST'])
|
| 59 |
+
async def analize():
|
| 60 |
# Get the text data from the request
|
| 61 |
text_data = request.json.get('text')
|
| 62 |
+
app_info = await llm.getApplicationInfo(text_data)
|
| 63 |
result = {
|
| 64 |
"application": app_info,
|
| 65 |
"debug": {}
|
lib/llm_3_deepinfra.py
CHANGED
|
@@ -99,7 +99,7 @@ def create_headers():
|
|
| 99 |
headers["Authorization"] = os.getenv("DEEPINFRA_API_KEY", None)
|
| 100 |
return headers
|
| 101 |
|
| 102 |
-
def create_messages(
|
| 103 |
messages = []
|
| 104 |
|
| 105 |
if system_prompt is not None:
|
|
@@ -107,7 +107,7 @@ def create_messages(self, prompt, system_prompt = None):
|
|
| 107 |
messages.append({"role": "user", "content": prompt})
|
| 108 |
return messages
|
| 109 |
|
| 110 |
-
def create_request(
|
| 111 |
request = {
|
| 112 |
"stream": False,
|
| 113 |
"model": os.getenv("DEEPINFRA_MODEL", "meta-llama/Llama-3.3-70B-Instruct-Turbo"),
|
|
@@ -129,7 +129,7 @@ async def getResponse(prompt):
|
|
| 129 |
}
|
| 130 |
|
| 131 |
async with httpx.AsyncClient() as client:
|
| 132 |
-
request = create_request(prompt, system_prompt)
|
| 133 |
response = await client.post(f"https://api.deepinfra.com/v1/openai/chat/completions", headers=create_headers(), json=request, timeout=httpx.Timeout(connect=5.0, read=60.0, write=180, pool=10))
|
| 134 |
if response.status_code == 200:
|
| 135 |
return response.json()["choices"][0]["message"]["content"]
|
|
@@ -137,10 +137,10 @@ async def getResponse(prompt):
|
|
| 137 |
logging.error(f"Request failed: status code {response.status_code}")
|
| 138 |
logging.error(response.text)
|
| 139 |
|
| 140 |
-
def getCategoryFromLLM(prompt, categories) :
|
| 141 |
category = ''
|
| 142 |
for j in range(5) :
|
| 143 |
-
result = getResponse(prompt)
|
| 144 |
category = getCategory(result, categories)
|
| 145 |
if category != '' :
|
| 146 |
break
|
|
@@ -157,13 +157,13 @@ def getAccuracy(answers, trueanswers) :
|
|
| 157 |
|
| 158 |
return count / len(trueanswers)
|
| 159 |
|
| 160 |
-
def getAnswers(applications, prefix, categories, answers) :
|
| 161 |
# print(categories)
|
| 162 |
output = []
|
| 163 |
for i in range(len(applications)) :
|
| 164 |
text = applications[i]
|
| 165 |
prompt = prefix + text
|
| 166 |
-
category, response = getCategoryFromLLM(prompt, categories)
|
| 167 |
|
| 168 |
answer = ''
|
| 169 |
for j in range(len(categories)) :
|
|
@@ -182,7 +182,7 @@ def getAnswers(applications, prefix, categories, answers) :
|
|
| 182 |
|
| 183 |
return output
|
| 184 |
|
| 185 |
-
def getSector(application) :
|
| 186 |
|
| 187 |
sectortext = ''
|
| 188 |
for j in range(len(sectors)) :
|
|
@@ -210,14 +210,14 @@ def getSector(application) :
|
|
| 210 |
# Список категорий:
|
| 211 |
# ''' + sectortext + 'Заявление: ' + application + '/INST'
|
| 212 |
|
| 213 |
-
sector, response = getCategoryFromLLM(prompt, sectors)
|
| 214 |
|
| 215 |
if verbose :
|
| 216 |
print(i, ':', sector)
|
| 217 |
|
| 218 |
return sector
|
| 219 |
|
| 220 |
-
def getProduct(application, sector) :
|
| 221 |
product = ''
|
| 222 |
# sector = appsectors[i]
|
| 223 |
if sector != '' :
|
|
@@ -235,14 +235,14 @@ def getProduct(application, sector) :
|
|
| 235 |
Ты всегда используешь такой формат ответа: "название категории". \n\
|
| 236 |
Список категорий:\n' + producttext + '\nЗаявление: ' + application
|
| 237 |
|
| 238 |
-
product, response = getCategoryFromLLM(prompt, subproducts)
|
| 239 |
|
| 240 |
if verbose :
|
| 241 |
print(product)
|
| 242 |
|
| 243 |
return product
|
| 244 |
|
| 245 |
-
def getProblem(application, sector, product) :
|
| 246 |
problem = ''
|
| 247 |
if sector != '' and product != '':
|
| 248 |
subpproblems = problems[sector][product]
|
|
@@ -259,14 +259,14 @@ def getProblem(application, sector, product) :
|
|
| 259 |
Ты всегда используешь такой формат ответа: "название категории". \n\
|
| 260 |
Список категорий:\n' + problemtext + '\nЗаявление: ' + application
|
| 261 |
|
| 262 |
-
problem, response = getCategoryFromLLM(prompt, subpproblems)
|
| 263 |
|
| 264 |
if verbose :
|
| 265 |
print(problem)
|
| 266 |
|
| 267 |
return problem
|
| 268 |
|
| 269 |
-
def getAuthor(application) :
|
| 270 |
prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты не отвечаешь на вопросы, не комментируешь,
|
| 271 |
не выражаешь эмоций, не выражаешь соображений по теме обращения.
|
| 272 |
Ты извлекаешь информацию из заявления. Ты отвечаешь на МОЙ вопрос:
|
|
@@ -277,7 +277,7 @@ def getAuthor(application) :
|
|
| 277 |
|
| 278 |
prompt = prefix + application
|
| 279 |
# prompt = prefix + appdata.loc[i, 'Текст обращения обезличенный']
|
| 280 |
-
response = getResponse(prompt)
|
| 281 |
response = response.replace('.', '. ')
|
| 282 |
name = 'не указан'
|
| 283 |
if name not in response :
|
|
@@ -294,7 +294,7 @@ def getAuthor(application) :
|
|
| 294 |
|
| 295 |
return name
|
| 296 |
|
| 297 |
-
def checkContractNumber(application) :
|
| 298 |
categories = ['да', 'нет']
|
| 299 |
answers = ['да', 'нет']
|
| 300 |
|
|
@@ -306,11 +306,11 @@ def checkContractNumber(application) :
|
|
| 306 |
Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
|
| 307 |
Заявление: '''
|
| 308 |
|
| 309 |
-
ifcontract = getAnswers([application], prefix, categories, answers)
|
| 310 |
|
| 311 |
return ifcontract[0]
|
| 312 |
|
| 313 |
-
def checkIfIdentified(application) :
|
| 314 |
сategories = ['нельзя', 'можно']
|
| 315 |
answers = ['нет', 'да']
|
| 316 |
|
|
@@ -321,11 +321,11 @@ def checkIfIdentified(application) :
|
|
| 321 |
Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
|
| 322 |
Жалоба: '''
|
| 323 |
|
| 324 |
-
ifidentified = getAnswers([application], prefix, сategories, answers)
|
| 325 |
|
| 326 |
return ifidentified[0]
|
| 327 |
|
| 328 |
-
def checkIfPerson(application) :
|
| 329 |
categories = ['физическое лицо', 'юридическое лицо']
|
| 330 |
answers = ['Физ.лицо', 'Юр.лицо']
|
| 331 |
|
|
@@ -338,11 +338,11 @@ def checkIfPerson(application) :
|
|
| 338 |
Ты не комментируешь, не обясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
|
| 339 |
Заявление: '''
|
| 340 |
|
| 341 |
-
ifperson = getAnswers([application], prefix, categories, answers)
|
| 342 |
|
| 343 |
return ifperson[0]
|
| 344 |
|
| 345 |
-
def checkIfcomission(application) :
|
| 346 |
categories = ['не касается', 'касается']
|
| 347 |
answers = ['нет', 'да']
|
| 348 |
|
|
@@ -354,11 +354,11 @@ def checkIfcomission(application) :
|
|
| 354 |
Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
|
| 355 |
Заявление: '''
|
| 356 |
|
| 357 |
-
ifсomission = getAnswers([application], prefix, categories, answers)
|
| 358 |
|
| 359 |
return ifсomission[0]
|
| 360 |
|
| 361 |
-
def getContractData(application) :
|
| 362 |
prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты не отвечаешь на вопросы, не комментируешь,
|
| 363 |
не выражаешь эмоций, не выражаешь соображений по теме обращения.Ты выполняешь только эту задачу:
|
| 364 |
ты извлекаешь из заявления только *номер ДОГОВОРА* и "дата ДОГОВОРА".
|
|
@@ -373,7 +373,7 @@ def getContractData(application) :
|
|
| 373 |
Заявление: '''
|
| 374 |
|
| 375 |
prompt = prefix + application
|
| 376 |
-
response = getResponse(prompt)
|
| 377 |
response = response.replace(';', '\n')
|
| 378 |
response = response.replace('\\\\', '')
|
| 379 |
l = response.split('\n')
|
|
@@ -394,7 +394,7 @@ def getContractData(application) :
|
|
| 394 |
|
| 395 |
return result
|
| 396 |
|
| 397 |
-
def getPersons(application) :
|
| 398 |
# prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты сортируешь заявления клиентов. Ты не отвечаешь на вопросы, не комментируешь,
|
| 399 |
# не выражаешь эмоций, не выражаешь соображений по теме заявления. Ты извлекаешь ВСЕ персональные данные из заявлений. Ты не анализируешь.
|
| 400 |
# Ты выполняешь только эту задачу:
|
|
@@ -415,7 +415,7 @@ def getPersons(application) :
|
|
| 415 |
|
| 416 |
prompt = prefix + application
|
| 417 |
# prompt = prefix + appdata.loc[i, 'Текст обращения обезличенный']
|
| 418 |
-
response = getResponse(prompt)
|
| 419 |
response = response.replace('указаны.', 'указаны')
|
| 420 |
response = response.replace('.', '. ')
|
| 421 |
response = response.replace(';', '\n')
|
|
@@ -520,7 +520,7 @@ stoplist = ['микрофинансовые организации',
|
|
| 520 |
'Страховщик',
|
| 521 |
'Статьей 185']
|
| 522 |
|
| 523 |
-
def getCompanies(application) :
|
| 524 |
prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты извлекаешь информацию из заявления.
|
| 525 |
Ты не отвечаешь на вопросы, не комментируешь, не выражаешь эмоций, не выражаешь соображений по теме заявления.
|
| 526 |
Ты выполняешь только эту задачу: ты извлекаешь из заявления только *названия юридических ОРГАНИЗАЦИЙ*.
|
|
@@ -538,7 +538,7 @@ def getCompanies(application) :
|
|
| 538 |
Заявление: '''
|
| 539 |
|
| 540 |
prompt = prefix + application
|
| 541 |
-
response = getResponse(prompt)
|
| 542 |
l = response.split('Организация: ')
|
| 543 |
ll = []
|
| 544 |
for i in range(len(l)) :
|
|
@@ -575,19 +575,19 @@ def getCompanies(application) :
|
|
| 575 |
|
| 576 |
return result
|
| 577 |
|
| 578 |
-
def getApplicationInfo(application) :
|
| 579 |
-
author = getAuthor(application)
|
| 580 |
-
persons = getPersons(application)
|
| 581 |
-
companies = getCompanies(application)
|
| 582 |
-
contractdata = getContractData(application)
|
| 583 |
-
sector = getSector(application)
|
| 584 |
-
product = getProduct(application, sector)
|
| 585 |
-
problem = getProblem(application, sector, product)
|
| 586 |
|
| 587 |
-
ifcontract = checkContractNumber(application)
|
| 588 |
-
ifidentified = checkIfIdentified(application)
|
| 589 |
-
ifperson = checkIfPerson(application)
|
| 590 |
-
ifcomission = checkIfcomission(application)
|
| 591 |
|
| 592 |
app_info = {}
|
| 593 |
app_info['Заявитель'] = author
|
|
@@ -618,7 +618,6 @@ def getApplicationInfo(application) :
|
|
| 618 |
print('Проблема', problem)
|
| 619 |
|
| 620 |
return app_info
|
| 621 |
-
|
| 622 |
# application = '''Я, Кристенгоф Оксана Михайловна, заключила кредитный договор с ПАО Камабанк № 59875 и № 456835645645654
|
| 623 |
# и договор на выдачу кредитной карты с ПАО "БСТ-Банк" №4567652124534235 и №4561254153412.
|
| 624 |
# 12.08.2020 года направила в банки заявление на истребование кредитной документации заказным письмом с уведомлением,
|
|
|
|
| 99 |
headers["Authorization"] = os.getenv("DEEPINFRA_API_KEY", None)
|
| 100 |
return headers
|
| 101 |
|
| 102 |
+
def create_messages(prompt, system_prompt = None):
|
| 103 |
messages = []
|
| 104 |
|
| 105 |
if system_prompt is not None:
|
|
|
|
| 107 |
messages.append({"role": "user", "content": prompt})
|
| 108 |
return messages
|
| 109 |
|
| 110 |
+
def create_request(prompt, system_prompt = None):
|
| 111 |
request = {
|
| 112 |
"stream": False,
|
| 113 |
"model": os.getenv("DEEPINFRA_MODEL", "meta-llama/Llama-3.3-70B-Instruct-Turbo"),
|
|
|
|
| 129 |
}
|
| 130 |
|
| 131 |
async with httpx.AsyncClient() as client:
|
| 132 |
+
request = create_request(None, prompt, system_prompt=None)
|
| 133 |
response = await client.post(f"https://api.deepinfra.com/v1/openai/chat/completions", headers=create_headers(), json=request, timeout=httpx.Timeout(connect=5.0, read=60.0, write=180, pool=10))
|
| 134 |
if response.status_code == 200:
|
| 135 |
return response.json()["choices"][0]["message"]["content"]
|
|
|
|
| 137 |
logging.error(f"Request failed: status code {response.status_code}")
|
| 138 |
logging.error(response.text)
|
| 139 |
|
| 140 |
+
async def getCategoryFromLLM(prompt, categories) :
|
| 141 |
category = ''
|
| 142 |
for j in range(5) :
|
| 143 |
+
result = await getResponse(prompt)
|
| 144 |
category = getCategory(result, categories)
|
| 145 |
if category != '' :
|
| 146 |
break
|
|
|
|
| 157 |
|
| 158 |
return count / len(trueanswers)
|
| 159 |
|
| 160 |
+
async def getAnswers(applications, prefix, categories, answers) :
|
| 161 |
# print(categories)
|
| 162 |
output = []
|
| 163 |
for i in range(len(applications)) :
|
| 164 |
text = applications[i]
|
| 165 |
prompt = prefix + text
|
| 166 |
+
category, response = await getCategoryFromLLM(prompt, categories)
|
| 167 |
|
| 168 |
answer = ''
|
| 169 |
for j in range(len(categories)) :
|
|
|
|
| 182 |
|
| 183 |
return output
|
| 184 |
|
| 185 |
+
async def getSector(application) :
|
| 186 |
|
| 187 |
sectortext = ''
|
| 188 |
for j in range(len(sectors)) :
|
|
|
|
| 210 |
# Список категорий:
|
| 211 |
# ''' + sectortext + 'Заявление: ' + application + '/INST'
|
| 212 |
|
| 213 |
+
sector, response = await getCategoryFromLLM(prompt, sectors)
|
| 214 |
|
| 215 |
if verbose :
|
| 216 |
print(i, ':', sector)
|
| 217 |
|
| 218 |
return sector
|
| 219 |
|
| 220 |
+
async def getProduct(application, sector) :
|
| 221 |
product = ''
|
| 222 |
# sector = appsectors[i]
|
| 223 |
if sector != '' :
|
|
|
|
| 235 |
Ты всегда используешь такой формат ответа: "название категории". \n\
|
| 236 |
Список категорий:\n' + producttext + '\nЗаявление: ' + application
|
| 237 |
|
| 238 |
+
product, response = await getCategoryFromLLM(prompt, subproducts)
|
| 239 |
|
| 240 |
if verbose :
|
| 241 |
print(product)
|
| 242 |
|
| 243 |
return product
|
| 244 |
|
| 245 |
+
async def getProblem(application, sector, product) :
|
| 246 |
problem = ''
|
| 247 |
if sector != '' and product != '':
|
| 248 |
subpproblems = problems[sector][product]
|
|
|
|
| 259 |
Ты всегда используешь такой формат ответа: "название категории". \n\
|
| 260 |
Список категорий:\n' + problemtext + '\nЗаявление: ' + application
|
| 261 |
|
| 262 |
+
problem, response = await getCategoryFromLLM(prompt, subpproblems)
|
| 263 |
|
| 264 |
if verbose :
|
| 265 |
print(problem)
|
| 266 |
|
| 267 |
return problem
|
| 268 |
|
| 269 |
+
async def getAuthor(application) :
|
| 270 |
prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты не отвечаешь на вопросы, не комментируешь,
|
| 271 |
не выражаешь эмоций, не выражаешь соображений по теме обращения.
|
| 272 |
Ты извлекаешь информацию из заявления. Ты отвечаешь на МОЙ вопрос:
|
|
|
|
| 277 |
|
| 278 |
prompt = prefix + application
|
| 279 |
# prompt = prefix + appdata.loc[i, 'Текст обращения обезличенный']
|
| 280 |
+
response = await getResponse(prompt)
|
| 281 |
response = response.replace('.', '. ')
|
| 282 |
name = 'не указан'
|
| 283 |
if name not in response :
|
|
|
|
| 294 |
|
| 295 |
return name
|
| 296 |
|
| 297 |
+
async def checkContractNumber(application) :
|
| 298 |
categories = ['да', 'нет']
|
| 299 |
answers = ['да', 'нет']
|
| 300 |
|
|
|
|
| 306 |
Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
|
| 307 |
Заявление: '''
|
| 308 |
|
| 309 |
+
ifcontract = await getAnswers([application], prefix, categories, answers)
|
| 310 |
|
| 311 |
return ifcontract[0]
|
| 312 |
|
| 313 |
+
async def checkIfIdentified(application) :
|
| 314 |
сategories = ['нельзя', 'можно']
|
| 315 |
answers = ['нет', 'да']
|
| 316 |
|
|
|
|
| 321 |
Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
|
| 322 |
Жалоба: '''
|
| 323 |
|
| 324 |
+
ifidentified = await getAnswers([application], prefix, сategories, answers)
|
| 325 |
|
| 326 |
return ifidentified[0]
|
| 327 |
|
| 328 |
+
async def checkIfPerson(application) :
|
| 329 |
categories = ['физическое лицо', 'юридическое лицо']
|
| 330 |
answers = ['Физ.лицо', 'Юр.лицо']
|
| 331 |
|
|
|
|
| 338 |
Ты не комментируешь, не обясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
|
| 339 |
Заявление: '''
|
| 340 |
|
| 341 |
+
ifperson = await getAnswers([application], prefix, categories, answers)
|
| 342 |
|
| 343 |
return ifperson[0]
|
| 344 |
|
| 345 |
+
async def checkIfcomission(application) :
|
| 346 |
categories = ['не касается', 'касается']
|
| 347 |
answers = ['нет', 'да']
|
| 348 |
|
|
|
|
| 354 |
Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
|
| 355 |
Заявление: '''
|
| 356 |
|
| 357 |
+
ifсomission = await getAnswers([application], prefix, categories, answers)
|
| 358 |
|
| 359 |
return ifсomission[0]
|
| 360 |
|
| 361 |
+
async def getContractData(application) :
|
| 362 |
prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты не отвечаешь на вопросы, не комментируешь,
|
| 363 |
не выражаешь эмоций, не выражаешь соображений по теме обращения.Ты выполняешь только эту задачу:
|
| 364 |
ты извлекаешь из заявления только *номер ДОГОВОРА* и "дата ДОГОВОРА".
|
|
|
|
| 373 |
Заявление: '''
|
| 374 |
|
| 375 |
prompt = prefix + application
|
| 376 |
+
response = await getResponse(prompt)
|
| 377 |
response = response.replace(';', '\n')
|
| 378 |
response = response.replace('\\\\', '')
|
| 379 |
l = response.split('\n')
|
|
|
|
| 394 |
|
| 395 |
return result
|
| 396 |
|
| 397 |
+
async def getPersons(application) :
|
| 398 |
# prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты сортируешь заявления клиентов. Ты не отвечаешь на вопросы, не комментируешь,
|
| 399 |
# не выражаешь эмоций, не выражаешь соображений по теме заявления. Ты извлекаешь ВСЕ персональные данные из заявлений. Ты не анализируешь.
|
| 400 |
# Ты выполняешь только эту задачу:
|
|
|
|
| 415 |
|
| 416 |
prompt = prefix + application
|
| 417 |
# prompt = prefix + appdata.loc[i, 'Текст обращения обезличенный']
|
| 418 |
+
response = await getResponse(prompt)
|
| 419 |
response = response.replace('указаны.', 'указаны')
|
| 420 |
response = response.replace('.', '. ')
|
| 421 |
response = response.replace(';', '\n')
|
|
|
|
| 520 |
'Страховщик',
|
| 521 |
'Статьей 185']
|
| 522 |
|
| 523 |
+
async def getCompanies(application) :
|
| 524 |
prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты извлекаешь информацию из заявления.
|
| 525 |
Ты не отвечаешь на вопросы, не комментируешь, не выражаешь эмоций, не выражаешь соображений по теме заявления.
|
| 526 |
Ты выполняешь только эту задачу: ты извлекаешь из заявления только *названия юридических ОРГАНИЗАЦИЙ*.
|
|
|
|
| 538 |
Заявление: '''
|
| 539 |
|
| 540 |
prompt = prefix + application
|
| 541 |
+
response = await getResponse(prompt)
|
| 542 |
l = response.split('Организация: ')
|
| 543 |
ll = []
|
| 544 |
for i in range(len(l)) :
|
|
|
|
| 575 |
|
| 576 |
return result
|
| 577 |
|
| 578 |
+
async def getApplicationInfo(application) :
|
| 579 |
+
author = await getAuthor(application)
|
| 580 |
+
persons = await getPersons(application)
|
| 581 |
+
companies = await getCompanies(application)
|
| 582 |
+
contractdata = await getContractData(application)
|
| 583 |
+
sector = await getSector(application)
|
| 584 |
+
product = await getProduct(application, sector)
|
| 585 |
+
problem = await getProblem(application, sector, product)
|
| 586 |
|
| 587 |
+
ifcontract = await checkContractNumber(application)
|
| 588 |
+
ifidentified = await checkIfIdentified(application)
|
| 589 |
+
ifperson = await checkIfPerson(application)
|
| 590 |
+
ifcomission = await checkIfcomission(application)
|
| 591 |
|
| 592 |
app_info = {}
|
| 593 |
app_info['Заявитель'] = author
|
|
|
|
| 618 |
print('Проблема', problem)
|
| 619 |
|
| 620 |
return app_info
|
|
|
|
| 621 |
# application = '''Я, Кристенгоф Оксана Михайловна, заключила кредитный договор с ПАО Камабанк № 59875 и № 456835645645654
|
| 622 |
# и договор на выдачу кредитной карты с ПАО "БСТ-Банк" №4567652124534235 и №4561254153412.
|
| 623 |
# 12.08.2020 года направила в банки заявление на истребование кредитной документации заказным письмом с уведомлением,
|