Raycast.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from __future__ import annotations
  2. import json
  3. import requests
  4. from ...typing import CreateResult, Messages
  5. from ..base_provider import BaseProvider
  6. class Raycast(BaseProvider):
  7. url = "https://raycast.com"
  8. supports_gpt_35_turbo = True
  9. supports_gpt_4 = True
  10. supports_stream = True
  11. needs_auth = True
  12. working = True
  13. @staticmethod
  14. def create_completion(
  15. model: str,
  16. messages: Messages,
  17. stream: bool,
  18. proxy: str = None,
  19. **kwargs,
  20. ) -> CreateResult:
  21. auth = kwargs.get('auth')
  22. headers = {
  23. 'Accept': 'application/json',
  24. 'Accept-Language': 'en-US,en;q=0.9',
  25. 'Authorization': f'Bearer {auth}',
  26. 'Content-Type': 'application/json',
  27. 'User-Agent': 'Raycast/0 CFNetwork/1410.0.3 Darwin/22.6.0',
  28. }
  29. parsed_messages = [
  30. {'author': message['role'], 'content': {'text': message['content']}}
  31. for message in messages
  32. ]
  33. data = {
  34. "debug": False,
  35. "locale": "en-CN",
  36. "messages": parsed_messages,
  37. "model": model,
  38. "provider": "openai",
  39. "source": "ai_chat",
  40. "system_instruction": "markdown",
  41. "temperature": 0.5
  42. }
  43. response = requests.post(
  44. "https://backend.raycast.com/api/v1/ai/chat_completions",
  45. headers=headers,
  46. json=data,
  47. stream=True,
  48. proxies={"https": proxy}
  49. )
  50. for token in response.iter_lines():
  51. if b'data: ' not in token:
  52. continue
  53. completion_chunk = json.loads(token.decode().replace('data: ', ''))
  54. token = completion_chunk['text']
  55. if token != None:
  56. yield token