Update app.py
Browse files
app.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
from contextlib import asynccontextmanager
|
| 2 |
from datetime import datetime
|
| 3 |
from json import dumps, loads
|
| 4 |
-
from logging import Formatter, INFO,
|
| 5 |
from os import environ
|
| 6 |
from pathlib import Path
|
| 7 |
from random import randint
|
|
@@ -11,7 +11,7 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
|
| 11 |
from fastapi import Depends, FastAPI, HTTPException, Header, Request
|
| 12 |
from fastapi.responses import FileResponse, HTMLResponse, JSONResponse, StreamingResponse
|
| 13 |
from httpx import AsyncClient
|
| 14 |
-
from
|
| 15 |
from starlette.responses import Response
|
| 16 |
|
| 17 |
screenshot_path = Path(__file__).parent / 'screenshot.jpeg'
|
|
@@ -32,7 +32,7 @@ API_TOKEN = str(environ.get('API_TOKEN')).strip()
|
|
| 32 |
REKA_API_URL = 'https://chat.reka.ai/api/chat'
|
| 33 |
|
| 34 |
logger = getLogger('REKA_API')
|
| 35 |
-
logger.setLevel(
|
| 36 |
handler = StreamHandler()
|
| 37 |
handler.setLevel(INFO)
|
| 38 |
formatter = Formatter('%(asctime)s | %(levelname)s : %(message)s', datefmt='%d.%m.%Y %H:%M:%S')
|
|
@@ -51,10 +51,19 @@ async def make_screenshot(page: Page):
|
|
| 51 |
async def refresh_token():
|
| 52 |
max_timeout = BROWSER_TIMEOUT_SECONDS * 1000
|
| 53 |
json_data = {'accessToken': None}
|
|
|
|
|
|
|
| 54 |
async with async_playwright() as playwright:
|
| 55 |
logger.info('запуск браузера')
|
| 56 |
browser = await playwright.chromium.launch(headless=True, args=['--disable-blink-features=AutomationControlled'])
|
| 57 |
-
context = await browser.new_context(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
context.set_default_timeout(max_timeout)
|
| 59 |
context.set_default_navigation_timeout(max_timeout)
|
| 60 |
page = await context.new_page()
|
|
@@ -264,9 +273,8 @@ async def root():
|
|
| 264 |
return HTMLResponse('ну пролапс, ну и что', status_code=200)
|
| 265 |
|
| 266 |
|
| 267 |
-
@app.post('/v1/chat/completions')
|
| 268 |
@app.post('/chat/completions')
|
| 269 |
-
async def chat_completions(request: Request):
|
| 270 |
logger.debug('запрос `completions`')
|
| 271 |
data = await request.json()
|
| 272 |
messages = data.get('messages', [])
|
|
@@ -284,7 +292,11 @@ async def chat_completions(request: Request):
|
|
| 284 |
return StreamingResponse(fetch_reka_stream(reka_data), media_type='text/event-stream')
|
| 285 |
|
| 286 |
|
| 287 |
-
@app.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 288 |
@app.get('/models')
|
| 289 |
async def models():
|
| 290 |
logger.debug('запрос `models`')
|
|
@@ -294,15 +306,20 @@ async def models():
|
|
| 294 |
}, status_code=200, media_type='application/json')
|
| 295 |
|
| 296 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 297 |
@app.get('/update_token')
|
| 298 |
-
async def update_token():
|
| 299 |
logger.info('запрос `update_token`')
|
| 300 |
task = get_token()
|
| 301 |
return JSONResponse({'status': 'обновление токена запущено'}, status_code=200, media_type='application/json')
|
| 302 |
|
| 303 |
|
| 304 |
@app.get('/show_last_screen')
|
| 305 |
-
async def show_last_screen():
|
| 306 |
logger.info('запрос `show_last_screen`')
|
| 307 |
return FileResponse(screenshot_path.resolve().as_posix(), media_type='image/jpeg', status_code=200)
|
| 308 |
|
|
|
|
| 1 |
from contextlib import asynccontextmanager
|
| 2 |
from datetime import datetime
|
| 3 |
from json import dumps, loads
|
| 4 |
+
from logging import Formatter, INFO, StreamHandler, WARNING, getLogger
|
| 5 |
from os import environ
|
| 6 |
from pathlib import Path
|
| 7 |
from random import randint
|
|
|
|
| 11 |
from fastapi import Depends, FastAPI, HTTPException, Header, Request
|
| 12 |
from fastapi.responses import FileResponse, HTMLResponse, JSONResponse, StreamingResponse
|
| 13 |
from httpx import AsyncClient
|
| 14 |
+
from patchright.async_api import Page, async_playwright
|
| 15 |
from starlette.responses import Response
|
| 16 |
|
| 17 |
screenshot_path = Path(__file__).parent / 'screenshot.jpeg'
|
|
|
|
| 32 |
REKA_API_URL = 'https://chat.reka.ai/api/chat'
|
| 33 |
|
| 34 |
logger = getLogger('REKA_API')
|
| 35 |
+
logger.setLevel(INFO)
|
| 36 |
handler = StreamHandler()
|
| 37 |
handler.setLevel(INFO)
|
| 38 |
formatter = Formatter('%(asctime)s | %(levelname)s : %(message)s', datefmt='%d.%m.%Y %H:%M:%S')
|
|
|
|
| 51 |
async def refresh_token():
|
| 52 |
max_timeout = BROWSER_TIMEOUT_SECONDS * 1000
|
| 53 |
json_data = {'accessToken': None}
|
| 54 |
+
user_data_dir = Path(__file__).parent / 'user_data'
|
| 55 |
+
user_data_dir.mkdir(exist_ok=True, parents=True)
|
| 56 |
async with async_playwright() as playwright:
|
| 57 |
logger.info('запуск браузера')
|
| 58 |
browser = await playwright.chromium.launch(headless=True, args=['--disable-blink-features=AutomationControlled'])
|
| 59 |
+
context = await browser.new_context(
|
| 60 |
+
color_scheme='dark',
|
| 61 |
+
ignore_https_errors=True,
|
| 62 |
+
locale='en-US',
|
| 63 |
+
user_agent=UA,
|
| 64 |
+
no_viewport=True,
|
| 65 |
+
user_data_dir=user_data_dir.resolve().as_posix()
|
| 66 |
+
)
|
| 67 |
context.set_default_timeout(max_timeout)
|
| 68 |
context.set_default_navigation_timeout(max_timeout)
|
| 69 |
page = await context.new_page()
|
|
|
|
| 273 |
return HTMLResponse('ну пролапс, ну и что', status_code=200)
|
| 274 |
|
| 275 |
|
|
|
|
| 276 |
@app.post('/chat/completions')
|
| 277 |
+
async def chat_completions(request: Request, token: str = Depends(verify_token)):
|
| 278 |
logger.debug('запрос `completions`')
|
| 279 |
data = await request.json()
|
| 280 |
messages = data.get('messages', [])
|
|
|
|
| 292 |
return StreamingResponse(fetch_reka_stream(reka_data), media_type='text/event-stream')
|
| 293 |
|
| 294 |
|
| 295 |
+
@app.post('/v1/chat/completions')
|
| 296 |
+
async def chat_completions_v1(request: Request, token: str = Depends(verify_token)):
|
| 297 |
+
return await chat_completions(request)
|
| 298 |
+
|
| 299 |
+
|
| 300 |
@app.get('/models')
|
| 301 |
async def models():
|
| 302 |
logger.debug('запрос `models`')
|
|
|
|
| 306 |
}, status_code=200, media_type='application/json')
|
| 307 |
|
| 308 |
|
| 309 |
+
@app.get('/v1/models')
|
| 310 |
+
async def models_v1():
|
| 311 |
+
return await models()
|
| 312 |
+
|
| 313 |
+
|
| 314 |
@app.get('/update_token')
|
| 315 |
+
async def update_token(token: str = Depends(verify_token)):
|
| 316 |
logger.info('запрос `update_token`')
|
| 317 |
task = get_token()
|
| 318 |
return JSONResponse({'status': 'обновление токена запущено'}, status_code=200, media_type='application/json')
|
| 319 |
|
| 320 |
|
| 321 |
@app.get('/show_last_screen')
|
| 322 |
+
async def show_last_screen(token: str = Depends(verify_token)):
|
| 323 |
logger.info('запрос `show_last_screen`')
|
| 324 |
return FileResponse(screenshot_path.resolve().as_posix(), media_type='image/jpeg', status_code=200)
|
| 325 |
|