123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- from __future__ import annotations
- import os, requests, time, json
- from ..typing import CreateResult, Messages, ImageType
- from .base_provider import AbstractProvider
- from ..cookies import get_cookies
- from ..image import to_bytes
- class Reka(AbstractProvider):
- url = "https://chat.reka.ai/"
- working = True
- needs_auth = True
- supports_stream = True
- default_vision_model = "reka"
- cookies = {}
- @classmethod
- def create_completion(
- cls,
- model: str,
- messages: Messages,
- stream: bool,
- proxy: str = None,
- api_key: str = None,
- image: ImageType = None,
- **kwargs
- ) -> CreateResult:
- cls.proxy = proxy
- if not api_key:
- cls.cookies = get_cookies("chat.reka.ai")
- if not cls.cookies:
- raise ValueError("No cookies found for chat.reka.ai")
- elif "appSession" not in cls.cookies:
- raise ValueError("No appSession found in cookies for chat.reka.ai, log in or provide bearer_auth")
- api_key = cls.get_access_token(cls)
- conversation = []
- for message in messages:
- conversation.append({
- "type": "human",
- "text": message["content"],
- })
- if image:
- image_url = cls.upload_image(cls, api_key, image)
- conversation[-1]["image_url"] = image_url
- conversation[-1]["media_type"] = "image"
- headers = {
- 'accept': '*/*',
- 'accept-language': 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3',
- 'authorization': f'Bearer {api_key}',
- 'cache-control': 'no-cache',
- 'content-type': 'application/json',
- 'origin': 'https://chat.reka.ai',
- 'pragma': 'no-cache',
- 'priority': 'u=1, i',
- 'sec-ch-ua': '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
- 'sec-ch-ua-mobile': '?0',
- 'sec-ch-ua-platform': '"macOS"',
- 'sec-fetch-dest': 'empty',
- 'sec-fetch-mode': 'cors',
- 'sec-fetch-site': 'same-origin',
- 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
- }
- json_data = {
- 'conversation_history': conversation,
- 'stream': True,
- 'use_search_engine': False,
- 'use_code_interpreter': False,
- 'model_name': 'reka-core',
- 'random_seed': int(time.time() * 1000),
- }
- tokens = ''
- response = requests.post('https://chat.reka.ai/api/chat',
- cookies=cls.cookies, headers=headers, json=json_data, proxies=cls.proxy, stream=True)
- for completion in response.iter_lines():
- if b'data' in completion:
- token_data = json.loads(completion.decode('utf-8')[5:])['text']
- yield (token_data.replace(tokens, ''))
- tokens = token_data
- def upload_image(cls, access_token, image: ImageType) -> str:
- boundary_token = os.urandom(8).hex()
- headers = {
- 'accept': '*/*',
- 'accept-language': 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3',
- 'cache-control': 'no-cache',
- 'authorization': f'Bearer {access_token}',
- 'content-type': f'multipart/form-data; boundary=----WebKitFormBoundary{boundary_token}',
- 'origin': 'https://chat.reka.ai',
- 'pragma': 'no-cache',
- 'priority': 'u=1, i',
- 'referer': 'https://chat.reka.ai/chat/hPReZExtDOPvUfF8vCPC',
- 'sec-ch-ua': '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
- 'sec-ch-ua-mobile': '?0',
- 'sec-ch-ua-platform': '"macOS"',
- 'sec-fetch-dest': 'empty',
- 'sec-fetch-mode': 'cors',
- 'sec-fetch-site': 'same-origin',
- 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
- }
- image_data = to_bytes(image)
- boundary = f'----WebKitFormBoundary{boundary_token}'
- data = f'--{boundary}\r\nContent-Disposition: form-data; name="image"; filename="image.png"\r\nContent-Type: image/png\r\n\r\n'
- data += image_data.decode('latin-1')
- data += f'\r\n--{boundary}--\r\n'
- response = requests.post('https://chat.reka.ai/api/upload-image',
- cookies=cls.cookies, headers=headers, proxies=cls.proxy, data=data.encode('latin-1'))
- return response.json()['media_url']
- def get_access_token(cls):
- headers = {
- 'accept': '*/*',
- 'accept-language': 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3',
- 'cache-control': 'no-cache',
- 'pragma': 'no-cache',
- 'priority': 'u=1, i',
- 'referer': 'https://chat.reka.ai/chat',
- 'sec-ch-ua': '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
- 'sec-ch-ua-mobile': '?0',
- 'sec-ch-ua-platform': '"macOS"',
- 'sec-fetch-dest': 'empty',
- 'sec-fetch-mode': 'cors',
- 'sec-fetch-site': 'same-origin',
- 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
- }
- try:
- response = requests.get('https://chat.reka.ai/bff/auth/access_token',
- cookies=cls.cookies, headers=headers, proxies=cls.proxy)
- return response.json()['accessToken']
- except Exception as e:
- raise ValueError(f"Failed to get access token: {e}, refresh your cookies / log in into chat.reka.ai")
|