Giter VIP home page Giter VIP logo

perplexity-ai's Introduction

Important Note 02/03/2024

EVERYONE, military service is mandatory in Turkey and im a Turk, so im going to go to military soon and this repository will not be updated anymore. I'm leaving this repository to community, andbody who wants to use it and capable to update or fix codes can open a pull request (as an update) and others can use these pull requests.




Perplexity.ai

This module is simply just an API Wrapper and account generator. It serves as an API wrapper with free copilots.

How It Works

This module uses emailnator to generate new accounts. As you know, when you create a new account, you will have 5 copilots. That's how it works! This module will generate you new gmails (using @googlemail.com right now) with emailnator and you will have UNLIMITED COPILOTS!

Requirements

Click to expand

Install requirements with:

pip3 install -r requirements.txt

or with single-line command:

pip3 install requests&&pip3 install websocket-client&&pip3 install requests-toolbelt

and aiohttp if you are going to use asynchronous version:

pip3 install aiohttp

How To Use

First thing first, Perplexity.ai is protected by cloudflare, and emailnator too. We need to open this pages manually and get the cookies. Do not forget these cookies are temporary, so you need to renew them continuously. Here how to get your cookies.

import perplexity

perplexity_headers = {
    <your headers here>
}

perplexity_cookies = { 
    <your cookies here>
}

emailnator_headers = { 
    <your headers here>
}

emailnator_cookies = { 
    <your cookies here>
}


# If you're going to use your own account, login to your account and copy headers/cookies (reload the page). Set "own" as True, and do not call "create_account" function. This will deactivate copilot and file upload limit controls
perplexity_cli = perplexity.Client(perplexity_headers, perplexity_cookies, own=False)
perplexity_cli.create_account(emailnator_headers, emailnator_cookies) # Creates a new gmail, so your 5 copilots will be renewed. You can pass this one if you are not going to use "copilot" mode


# takes a string as query, and returns a string as answer.
def my_text_prompt_solver(query):
    return input(f'{query}: ')

# takes a string as description and a dictionary as options. Dictionary consists of ids and values. Example: {1: "Orange", 2: "Banana"}
# returns a list of integers which are ids of selected options. Let's say you selected "Banana", function should return [2]
def my_checkbox_prompt_solver(description, options):
    print(description + '\n' + '\n'.join([str(x) + ' - ' + options[x] for x in options]))
    return [int(input('--> '))]


# modes = ['concise', 'copilot']
# focus = ['internet', 'scholar', 'writing', 'wolfram', 'youtube', 'reddit']
# files = file list, each element of list is tuple like this: (data, filetype) perplexity supports two file types, txt and pdf
# follow_up = last query info for follow-up queries, you can directly pass response json from a query, look at second example below.
# ai_model = ['default', 'experimental', 'gpt-4', 'claude-2.1', 'gemini pro'] only works for own=True clients (perplexity.Client(..., own=True))
# solvers, list of functions to answer questions of ai while using copilot, there are 2 type of solvers, text and checkbox. If you do not define function for a solver, questions in that solver type will be skipped
resp = perplexity_cli.search('Your query here', mode='copilot', focus='internet', files=[(open('myfile.txt', 'rb').read(), 'txt'), (open('myfile2.pdf', 'rb').read(), 'pdf')], ai_model='default', solvers={
    'text': my_text_prompt_solver,
    'checkbox': my_checkbox_prompt_solver
    })
print(resp)

# second example to show how to use follow-up queries
# you can't use file uploads on follow-up queries
# you can pass response json from a query directly like below
resp2 = perplexity_cli.search('Your query here', mode='copilot', focus='internet', follow_up=resp, solvers={
    'text': my_text_prompt_solver,
    'checkbox': my_checkbox_prompt_solver
    })
print(resp2)

# perplexity_cli.create_account(emailnator_headers, emailnator_cookies) # Call this function again when you run out of copilots

Labs

Open the Labs and copy headers/cookies as explained here (reload the page).

import perplexity

labs_headers = {
    <your headers here>
}

labs_cookies = { 
    <your cookies here>
}

labs_cli = perplexity.LabsClient(labs_headers, labs_cookies)

# model = ['pplx-7b-online', 'pplx-70b-online', 'pplx-7b-chat', 'pplx-70b-chat', 'mistral-7b-instruct', 'codellama-34b-instruct', 'codellama-70b-instruct', 'llama-2-70b-chat', 'llava-7b-chat', 'mixtral-8x7b-instruct', 'mistral-medium', 'related']
print(labs_cli.ask('hi', model='pplx-7b-online'))

# this function adds a custom message to conversation
# role = ['user', 'assistant']
labs_cli.add_custom_message('msg', role='assistant')

# this function resets the conversation
labs_cli.clear_history()

Pool

If you don't want to wait while creating account, then pool is what you're looking for. It will simply work on background and create accounts when your current copilot & file upload count is lower than the limit.

import perplexity

perplexity_headers = {
    <your headers here>
}

perplexity_cookies = { 
    <your cookies here>
}

emailnator_headers = { 
    <your headers here>
}

emailnator_cookies = { 
    <your cookies here>
}


def my_text_prompt_solver(query):
    return input(f'{query}: ')

def my_checkbox_prompt_solver(description, options):
    print(description + '\n' + '\n'.join([str(x) + ' - ' + options[x] for x in options]))
    return [int(input('--> '))]

# copilots = minimum needed copilot count, when current copilot count is lower than this, a new account will be created in the background
# file_uploads = minimum needed file upload count, when current file upload count is lower than this, a new account will be created in the background
# threads = how many accounts will be created in the background at the same time, if you're not going to use 50+ copilots in a minute, don't increase this
pool = perplexity.Pool(perplexity_headers, perplexity_cookies, emailnator_headers, emailnator_cookies, copilots=10, file_uploads=5, threads=1)

# everything is same
resp = pool.search('Your query here', mode='copilot', focus='internet', files=[(open('myfile.txt', 'rb').read(), 'txt'), (open('myfile2.pdf', 'rb').read(), 'pdf')], solvers={
    'text': my_text_prompt_solver,
    'checkbox': my_checkbox_prompt_solver
    })
print(resp)

Asynchronous Version

import perplexity_async
import asyncio

perplexity_headers = { 
    <your headers here>
}

perplexity_cookies = { 
    <your cookies here> 
}

emailnator_headers = { 
    <your headers here>
}

emailnator_cookies = { 
    <your cookies here>
}


# takes a string as query, and returns a string as answer.
async def my_text_prompt_solver(query):
    return input(f'{query}: ')

# takes a string as description and a dictionary as options. Dictionary consists of ids and values. Example: {1: "Orange", 2: "Banana"}
# returns a list of integers which are ids of selected options. Let's say you selected "Banana", function should return [2]
async def my_checkbox_prompt_solver(description, options):
    print(description + '\n' + '\n'.join([str(x) + ' - ' + options[x] for x in options]))
    return [int(input('--> '))]


async def test():
    # If you're going to use your own account, login to your account and copy headers/cookies (reload the page). Set "own" as True, and do not call "create_account" function. This will deactivate copilot and file upload limit controls
    perplexity_cli = await perplexity_async.Client(perplexity_headers, perplexity_cookies, own=False)
    await perplexity_cli.create_account(emailnator_headers, emailnator_cookies) # Creates a new gmail, so your 5 copilots will be renewed. You can pass this one if you are not going to use "copilot" mode

    # modes = ['concise', 'copilot']
    # focus = ['internet', 'scholar', 'writing', 'wolfram', 'youtube', 'reddit']
    # files = file list, each element of list is tuple like this: (data, filetype) perplexity supports two file types, txt and pdf
    # follow_up = last query info for follow-up queries, you can directly pass response json from a query, look at second example below.
    # ai_model = ['default', 'experimental', 'gpt-4', 'claude-2.1', 'gemini pro'] only works for own=True clients (perplexity_async.Client(..., own=True))
    # solvers, list of functions to answer questions of ai while using copilot, there are 2 type of solvers, text and checkbox. If you do not define function for a solver, questions in that solver type will be skipped
    resp = await perplexity_cli.search('Your query here', mode='copilot', focus='internet', files=[(open('myfile.txt', 'rb').read(), 'txt'), (open('myfile2.pdf', 'rb').read(), 'pdf')], ai_model='default', solvers={
        'text': my_text_prompt_solver,
        'checkbox': my_checkbox_prompt_solver
    })
    print(resp)

    # second example to show how to use follow-up queries
    # you can't use file uploads on follow-up queries
    # you can pass response json from a query directly like below
    resp2 = await perplexity_cli.search('Your query here', mode='copilot', focus='internet', follow_up=resp, solvers={
        'text': my_text_prompt_solver,
        'checkbox': my_checkbox_prompt_solver
    })
    print(resp2)

    # await perplexity_cli.create_account(emailnator_headers, emailnator_cookies) # Call this function again when you're out of copilots

asyncio.run(test())

Asynchronous Labs

Open the Labs and copy headers/cookies as explained here (reload the page).

import perplexity_async

labs_headers = {
    <your headers here>
}

labs_cookies = { 
    <your cookies here>
}

async def test():
    labs_cli = await perplexity_async.LabsClient(labs_headers, labs_cookies)

    # model = ['pplx-7b-online', 'pplx-70b-online', 'pplx-7b-chat', 'pplx-70b-chat', 'mistral-7b-instruct', 'codellama-34b-instruct', 'codellama-70b-instruct', 'llama-2-70b-chat', 'llava-7b-chat', 'mixtral-8x7b-instruct', 'mistral-medium', 'related']
    print(await labs_cli.ask('hi', model='pplx-7b-online'))

    # this function adds a custom message to conversation
    # role = ['user', 'assistant']
    labs_cli.add_custom_message('msg', role='assistant')

    # this function resets the conversation
    labs_cli.clear_history()

asyncio.run(test())

How To Get The Cookies

Do not forget these cookies are temporary, so you need to renew them continuously.

  1. Open emailnator website. Click F12 or Ctrl+Shift+I to open inspector. Go to the "Network" tab in the inspector, check "Preserve log" button, click the "Go !" button in the website, right click the "message-list" in the Network Tab and hover on "Copy" and click to "Copy as cURL (bash)". Now go to the curlconverter, paste your code here. The header and cookies dictionary will appear, copy and use them in your codes.

  1. Open Perplexity.ai website. Sign out if you're signed in. Click F12 or Ctrl+Shift+I to open inspector. Go to the "Network" tab in the inspector, check "Preserve log" button, click the "Sign Up" button in the website, enter a random email and click "Continue with Email" button, right click the "email" in the Network Tab and hover on "Copy" and click to "Copy as cURL (bash)". Now go to the curlconverter, paste your code here. The header and cookies dictionary will appear, copy them and use in your codes.

  1. Don't confuse the headers and cookies for emailnator and Perplexity.ai, look at How To Use to learn how to use them.

Thanks To

perplexity-ai's People

Contributors

dominicot avatar drimef0 avatar helallao avatar kerry1207 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

perplexity-ai's Issues

Handshake status 400 Bad Request

Hii there I'm getting the following error

Error: Handshake status 400 Bad Request
Traceback (most recent call last):
File "e:*\perplexity-ai-main\test.py", line 73, in
print(perplexity_cli.search('Tell me somthing about life', mode='copilot', focus='internet', file=(open('myfile.txt', 'rb').read(), 'txt')))
File "e:*
\perplexity-ai-main\perplexity.py", line 143, in search
self.ws.send(f'{420 + self.n}' + json.dumps([
File "C:*************\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket_app.py", line 183, in send
raise WebSocketConnectionClosedException(
websocket._exceptions.WebSocketConnectionClosedException: Connection is already closed.

Process not exiting

Hi There,
Thanks for the wonderful contribution for this wrapper. I am not python person and don't know the process handeling much, Currently the program works perfectly when I run my code as $python3 mycode.py , it prints the output but doesn't exit. I am looking to run this as shell script and pipe the response to a file or to another script (non python). How do I achieve that?

I want the program to run and exit with unix process success code so the next thing in the pipe can take over.

What are my options?

static t token in websocket requests causing issues?

I'm trying to use my own account, however I am not able to get past the first websocket request. I am very sure I have copied the cookies/headers correctly with this #4

I'm starting to suspect it could be the t parameter in the url.

In perplexity.py line 87 - self.t = format(random.getrandbits(32), '08x'), we're creating the t token as a random string of characters and we are using the same values for every websocket request we make.

This is not consistent the dynamic t tokens being generated as we observe the network packages back and forth on Chrome

Screen Shot 2024-01-23 at 7 23 09 pm

File upload in concise mode

Exception: File upload cannot be used in concise mode

Do you plan to enable file uploads in concise mode?

Invalid cookie

This method with copy cookie still work?
Cuz i got fail from today

Unable to initialize Client class

Even with the latest headers the code raises the following stack trace:

File "~/PerplexityAI/_perplexity.py", line 72, in init
self.sid = json.loads(self.session.get(f'https://www.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}').text[1:])['sid']
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/init.py", line 346, in loads
return _default_decoder.decode(s)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

suggestions on how to parse answers

hello!
do you have any suggestions on how to parse perplexity's answers into readable view?
I already tried many ways, but it's not a json answer, also it has problems with converting into a dictionary
so, how do you parse it's answers?

Cookies not working

Cookies are not working since today.

I tried the updated code but still get 403.

Wasn't able to run both versions 'File upload error' & asyncio.run() cannot be called from a running event loop (Solved) New issue : Expecting value: line 1 column 1 (char 0)

Hi, thanks for this amazing code,
Unfortunately, I couldn't run the code
The first version gives this error, the first error was not finding "myfile.txt" I had to create empty myfile.txt file to get this new error:

image

For the Asynchronous Version, I get this error:

image

I'm not a professional in coding, a simple explanation would be much appreciated.
Thanks

Error while hosting

I wanted to send a bot with this api to the server, but it gives an error:
HTTPSConnectionPool(host='www.perplexity.ai', port=443): Max retries exceeded with url: /search/dc2e0bc5-4518-49a4-9a9c-2af9a1e10523 (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 403 Forbidden')))

can you tell me how to fix it please?

Handshake status 403 Forbidden

Error: Handshake status 403 Forbidden -+-+- {'date': 'Fri, 08 Sep 2023 13:15:23 GMT', 'content-type': 'text/html; 
charset=UTF-8', 'transfer-encoding': 'chunked', 'connection': 'close', 'cross-origin-embedder-policy': 'require-corp',
 'cross-origin-opener-policy': 'same-origin', 'cross-origin-resource-policy': 'same-origin', 'origin-agent-cluster': '?1',
 'permissions-policy': 'accelerometer=(),autoplay=(),camera=(),clipboard-read=(),clipboard-write=(),geolocation=
(),gyroscope=(),hid=(),interest-cohort=(),magnetometer=(),microphone=(),payment=(),publickey-credentials-get=
(),screen-wake-lock=(),serial=(),sync-xhr=(),usb=()', 'referrer-policy': 'same-origin', 'x-frame-options': 'SAMEORIGIN', 
'cf-mitigated': 'challenge', 'cache-control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-
check=0', 'expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'server': 'cloudflare', 'cf-ray': '803775c15c4af429-BOM'} -+-+- None

Can't seems to contact with Perplexity

Environment:

Python 3.11

Package Version
aiohttp 3.8.6
aiosignal 1.3.1
async-timeout 4.0.3
attrs 23.1.0
beautifulsoup4 4.12.2
bs4 0.0.1
certifi 2023.7.22
charset-normalizer 3.3.1
frozenlist 1.4.0
idna 3.4
lxml 4.9.3
lxml-stubs 0.4.0
multidict 6.0.4
pip 23.3.1
requests 2.31.0
requests-toolbelt 1.0.0
setuptools 68.2.2
soupsieve 2.5
urllib3 2.0.7
websocket-client 1.6.4
wheel 0.41.2
yarl 1.9.2

Problem

I've encountered an issue while using both the async and normal methods. Despite my efforts, I'm not receiving any return. I've ensured that the cookie is correctly obtained and placed, and I've followed the methods outlined in the READ.me and in Issue #4.
Upon further investigation, I've found that the email is successfully created and a registration confirmation is received. However, the code seems to hang at while not self._last_file_upload_info: pass, failing to get the upload URL for the file. If no file is attached, the code gets stuck at while True: while not self._last_answer: pass.
I'm seeking insight into why this might be happening. Can you replicate this issue on your end? I appreciate your assistance.

Follow-up query

Is it possible to run a follow-up query after response from search method?

AssertionError at line 99 in file perplexity.py

Hi there!
I'm using your module with my own credentials (I got PRO account) and since today I'm getting AssertionError upon client initialization at this point .

Looks like this happens because of CloudFlare. Any ideas?

Not terminating?

Hi, thanks for the great work.
I was just trying the example, but I´m having the problem, that the program is not terminating, only by pressing ctrl-c. Are there any resources still opened?

Code:

resp = perplexity_cli.search('Your query here', mode='copilot', focus='internet', solvers={
    'text': my_text_prompt_solver,
    'checkbox': my_checkbox_prompt_solver
    })
print(resp["text"]["answer"])
(not more)
I'm sorry, but your question is unclear. Please provide a specific query or topic for me to search. Based on the search results, I found information on how to write a query letter to literary agents[4], how to perform a query in a database[3], and the meaning of the word "query"[5]. If you have a specific question related to any of these topics, I would be happy to help you.
(NOT TERMINATING)
^CException ignored in: <module 'threading' from '/usr/lib/python3.10/threading.py'>
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1567, in _shutdown
    lock.acquire()

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

I tried to use my own account to access (refer to #4), and I got this issue.

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
Cell In[2], line 1
----> 1 perplexity_cli = perplexity.Client(perplexity_headers, perplexity_cookies)

File ~/workspace/perplexity-ai-v2/perplexity.py:78, in Client.__init__(self, headers, cookies)
     76 self.t = format(random.getrandbits(32), '08x')
     77 print(self.session.get(f'[https://www.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}').text[1](https://www.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}%27).text[1):])
---> 78 self.sid = json.loads(self.session.get(f'[https://www.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}').text[1:])['sid](https://www.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}%27).text[1:])[%27sid)']
     79 self.frontend_uuid = str(uuid4())
     80 self.frontend_session_id = str(uuid4())

File ~/anaconda3/lib/python3.10/json/__init__.py:346, in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    341     s = s.decode(detect_encoding(s), 'surrogatepass')
    343 if (cls is None and object_hook is None and
    344         parse_int is None and parse_float is None and
    345         parse_constant is None and object_pairs_hook is None and not kw):
--> 346     return _default_decoder.decode(s)
    347 if cls is None:
    348     cls = JSONDecoder

File ~/anaconda3/lib/python3.10/json/decoder.py:337, in JSONDecoder.decode(self, s, _w)
    332 def decode(self, s, _w=WHITESPACE.match):
    333     """Return the Python representation of ``s`` (a ``str`` instance
    334     containing a JSON document).
    335 
    336     """
--> 337     obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338     end = _w(s, end).end()
    339     if end != len(s):

File ~/anaconda3/lib/python3.10/json/decoder.py:355, in JSONDecoder.raw_decode(self, s, idx)
    353     obj, end = self.scan_once(s, idx)
    354 except StopIteration as err:
--> 355     raise JSONDecodeError("Expecting value", s, err.value) from None
    356 return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

I checked the content of self.session.get(f'[https://www.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}').text[1:]:

!DOCTYPE html><html lang="en-US"><head><title>Just a moment...</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta name="robots" content="noindex,nofollow"><meta name="viewport" content="width=device-width,initial-scale=1"><link href="/cdn-cgi/styles/challenges.css" rel="stylesheet"></head><body class="no-js"><div class="main-wrapper" role="main"><div class="main-content"><noscript><div id="challenge-error-title"><div class="h2"><span class="icon-wrapper"><div class="heading-icon warning-icon"></div></span><span id="challenge-error-text">Enable JavaScript and cookies to continue</span></div></div></noscript></div></div><script>(function(){window._cf_chl_opt={cvId: '2',cZone: "[www.perplexity.ai](https://www.perplexity.ai/)",cType: 'managed',cNounce: '24664',cRay: '806b2f80ac3c2889',cHash: '267f20784df18fd',cUPMDTk: "\/socket.io\/?EIO=4&transport=polling&t=d8480b84&__cf_chl_tk=FI0YS7VSAqP6oipLvZ1On93V3.LFqlPN2c2U1BFjGlU-1694721305-0-gaNycGzNEdA",cFPWv: 'g',cTTimeMs: '1000',cMTimeMs: '0',cTplV: 5,cTplB: 'cf',cK: "visitor-time",fa: "\/socket.io\/?EIO=4&transport=polling&t=d8480b84&__cf_chl_f_tk=FI0YS7VSAqP6oipLvZ1On93V3.LFqlPN2c2U1BFjGlU-1694721305-0-gaNycGzNEdA",md: "msAU53hXn7ryEHJxDyqesgjprGXtYFGG5.MgO93uvT8-1694721305-0-Adl8ShJfFON5NRFT3-yr5p6EBXXTBKC52YImQaqZPz_1UXJLs2boOzubpzvuGw3qic8ZeM-0VBJYwrwlpj7q1vSp6j4pIFlkoZW1YC71fcsv-Tuyuve9ZgHiGc97C5x_KdgNljRW-ywxln9E1Ol0eSRq7OQp4v2hxaCemAiwyb5NRnkMQRIVKiIDcZDKSpJV7-D6kRmZm1MiOtQ2mC21_jszvbrRD2ZilNN7Uy1ocz6jSY3Ef1Xwz6yDM4JaYaRRzVqyWtuzsFNuloe7DUP0Gi66kT4jR7W2b6Rk3UpQ_BiUwcWfhFToib4dEjBLKZGmuRFy5dvZ-V-eTF812XPgpmzYoocVjWOz5rh7YEpHody3wlbXxLrGW7Ba-jeaourf-fUc7kv4dc7XhHW6nFkCrRuZtJhUbGMxDryQLWJuGYiyd8ubU8OIYVFOs198S-ZGuqnNLQuR2iXUTa6LeHPeZa2DK9-iWrSgXdh1T8GoOE_3p2BUnK-7_trgzCNuhuGt-aT5z_shTc1i3gIkwIwzhX-PEnMcKngiBdkZErPN8u5SXV_krvAm6dqfsUfidBiDIb6eH72Y0ouHvMOQl5gOUL-PUELb0oCckrIxwWVKJO19xCVXUERNfKRCa3mCNArKeHa-QO3bslJcpVk6vBccFhdK6QDr4BtJBII0g5qULmC2Y7liPjqaQWEthDMUDdgxRbR9v1a8W-sJrpPIDzK9JIZa2jSJ5f4BgN2__161ExSq_e12zfmql_hZ3unMWSSdzKt1SDhFuqQvp_ycr0cDjR6JgMKeHnqkWWFD3OaZffCJoaK4Bvzk_O4ilABi6ZHbSfEuzm0uvg9e6_X0Gu68WcJJuyzU9KSvYCKTiB9p7n4EYgFov85_iXQEnR3GGx4DdMzF5judz4aqjS1qPgGq0YJBEaU34y8pd6WU4xfNhEaH5pYIUBALb2znmzUVjvYXqL0-T4PX5Sg_Rne5Rd8fUnek3orygkLJx9YpXcc7Kao676MkwNMemcDLdrVKnJQbL3pLYQD8g04WkjPYS5NJrbZY_XM-jQn0dprz0lqMQQkSR594Tww6uBXargQHtYie_LjHQ4kTErk6u5S-AxzxBnTMfB7fFEoiqsG80JqZ8qZhZcOFnIhFSvw71CoytTJgNY9iu50HPxL68JF287e1DiztS2-ezAXStgF-iUqVnmONH7OJ-L7Zz4Ev_hl-hro-mkBtnFFDfkxwB4-u0cC9muRg5m1s3Z8q2kWZA6a6Q2Qn128Oq36aYtonMLdOtVfBKGJUQEw6YbvOzu211_zOJy9rFOQsNwPTC_aSyc1BjjjH3tGaLTgnBe1kLFeHsgcr4w6sXYKhE6eceat42gMZiXeZRSRmgLjVAUVuCgosw0tfaauaLV4t8JTowozsBgGWIhtxIiAs6uheFW_YADPe6GZSv8-gk9sAbmCNzcgyDBKBaKIde1kZQGHIn_xmQi6ZYoCCON7SGORRmDpB0le9LRjq7NzsOu56wMtszal3yfkjik9lvyqC4tesIXWZ9EXRw9fVsqa3ySYT3nNCSAzoX3cM9YQ4bK_JdPKl-zHf36ELmWDMSRgtaQ_4nK5Dw-MG7bdnaqA6fOq_MLj41whfow57-yXMkeLNNdcU5p-72maPcL9tyvYJoXLsSzggZILqAFUmeGBUhV3MtNsPvHPOcUUT-cxAYLWBpU_gKBnq4aw8IudK69ovBQe_fLM0a1gouKz_p3fKLeOoNLVHnx0f5670ZnR_IYmopo5YfKtAkkviA5MrnMvwtcApOSpYcw1RhewD0MYDrHzPMfMngsS6nONG-B1H1mShmvGlqYGsEGiqYarpWe1luJdtm0AVfeosyyDn2kXHwkc29KUoJqJQBcmryI8upaviqH-bQhQEYLQOZ0VJU50StLgBMWgJcSTegTKByJ3r4uD8ZMUTMRBzpFj9G5eG9Gxm0cXX5ilFGegOFLG4Diq32TNE4Mcwe9C8kW02fRffoyK-oYF46paewTKtRyzrWcJ5mdSgBwctkDktjegKLO4QkIMQbIMQs_hNDqwhrxcMcIDQ72hvusZu4KCn1qxhCmWWjtpQIy1V2r8xwc0a9ICHVfDcPlA91BWhx4DsBWy9xF-h6zVzAKC9ePP1gGmzWzJPjvMLyEbcv9RhUfu6ehDS7CfGNEC3jfQxSLHjcyQ-4nnjupa6pEWwOtmJoER1OO5T89m5OYWYuwcVxLy07fTAnC30Odl8VL9yd-XNGxo2x1K_uRfjURVvnAm1OOwZgvhIyqATO8qCfEQ4sZlePRWhgeAKm1_c5MW_dBrqX4TFXzkXh6vvmcHifpO9uuzXdokJfYRPb0wOiN9lpZzb7xO-3LCb6-XnzQqrwHWweQUzsbR0-y-8bu9qVVWLbz8AjtROul_9agzgssc6qy_xY0AiFfP5EbSi1kUMKPqmahYI9Y5f_ShA1laSsuOhXZI60ZCd-qn7PMwJo_i90jQQ8pAkjnD1TXI4fyc-1HpUk5QvMvKFkTqIVWVRwrFRtfM7taTOsmWdT90-Y_dGZV9sNz36bfSPIphxwCfhyzteGHqOpT--CGWYlV38CIWQebLRrCMSgLnkYRV4WWGaBUvB4TymLfbuLUNVoi4-L4sofrUVYI3y3kJ_jIPx3cIRyfEaboL2YqB8iHwNCVU_wWpm2TWF3h8jnvEV18T1zAqn1IkOxJ_g_WmCOTuPw8jd-I14Q_psiuE95mj4ov8iFsH3ekGNJ1kdyBe72XFDr4MVL1X-S5o2ldTjVlodbQ5U7DNfVU8kdkO-2-KUDGdbpAnPR3MnUAVNiJiHU2L5YLtX4euzbE21jYDcKu7d80admfpR87kZ9efH8jYN8A3PxFO9AWHpFGjwp_EEXDjQie0PiT1_XbIzHNkgidW54f6Z6TWQ3Pt9vE4KgcD0ad-1dQNi7ldrcHWtFq8ADN7tBwDzY3sfUfssZcWqtJjJ7aXzZ8gD3THfyuAAn7SYshjmUp4XPzqXYW22nqeeyMvpXyBRgS-v4ebBPvXem8tpz4rL_nINCaZB40enOSEANSgTJu8nLpPOFyDD-JAUV4k0T94tJsyUIOToumSVO7IAoCWfUfjPcLYHJVINvjlbC6tTiURvm5DxQ_EYN4tMYYMDXvPSTyH05q6U9VYIIbjpEpXzU0IiVSitYmmxP_Nyt6HIx58CXi-Gv0sD3P01EZYQQeG328orxMyjwla3KaGtB7uDlTyo4S9cMDzkXrevlevU8rGodR2jY-pB57gZMFOPoEbBDSLTd57CfydDjnASPWMwommcA85xcZg9Nub5U5jl6Z-kQ29VxYhM5a4UqDQOhJQoTqJkG7npz_nlksd-ye8es85HVfnk71gArZrEezk4k80n4yH_Jrr27ETazhefHCbFiBm814iP4keXnoU3qYnAPgrp_PkNtUhc7x23NePzbtAPTEVHFkQEMdxQTfx7qITYhfLCrJtf0X9vgqKtTTgnpeVoavs4gpgw28xR_or-4L6j75dI1HryZ4vqWBoIsbqlmIGEgP9qRVBE5-wOPnD0XHM0OTWHakJIbow9zsUxvCmT5K_c_8O9-oCA2KFGXr8z4zr-tdWChDp0gNqman44fOLSM3pw8cgOeW6TtFLY1W1p6iNPYdvd9_jAW7SK_VRAlWdKhJN_k7iFaowYJIy72fQd9F5R7ALaK-mYkd_JDhp_8FqP-MIiISJ5kSX9kSdMBpiRywgBs60SHeIVmUhAmrRUBPUKLg8wjz7IOdpgHd30Y_5PCiwb55D9R_Wt8RM1HBEK2vPn-6_HLQQ6QuYYf_f1LEWydqI4HrSiyUeaTIvEWA8EsnuUIF9BndmEeKfx_B_yYEyqzVzC0PYkv8qtcO-4TmbM_Ee7i4Xs7IQSP2ddvRAlerFIClM4p7J5A5fpRf965Ya-5FDdHNaZNFhShgBxaEmJBTY_75jzUt8sL7HHZpncy9oSVTJuhOWKwyhvA7Gk8paWOF1POk4Y997I_elDuedoj2IxPYJib3fk9yfc8YVLJPi44Vq7MB8m3TP3Ny00UOiKFrDgMT_1YjEW5N64UWthscdTm0XZ7_8faOqDPYhFH90JrHU462kVqynllXX0zY8xiw26pr59qYtEHquTrbwTX7ixKCzXhjxYTFop11iLPgV3qZEJFQ-mK_IeJ44s_LsalBgsvjyPOrQ_AlLs5Qr144pVuYguHhJuolnm0D4OgWQoK0KMywOsRon2p9lZBvawrjYNyvJ83sJE4dQ3lylkUfffnSBfyaSfr5TaVDnWVb7RhFVOFVSSdQTgusSm1yHb70N2mQgfHmuuq3_rnmjCAHUJyuzELvdNppRb0heGmciC8XhUaZQESNXap0xsUl6yNuI3FrGqBxIKXi4lQ_wrOiME43NrrfAAR5ovpN_maos5zisCyVbCJWj1cDxvfFkC1s6q7Txj9l-ePXsoQlbASGLrELJ8HzdeviNdCjonQiGYQRxxyiX5lTARSxj7c0Du8vX0iXZEPxE",cRq: {ru: 'aHR0cHM6Ly93d3cucGVycGxleGl0eS5haS9zb2NrZXQuaW8vP0VJTz00JnRyYW5zcG9ydD1wb2xsaW5nJnQ9ZDg0ODBiODQ=',ra: 'TW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNy4wLjAuMCBTYWZhcmkvNTM3LjM2',rm: 'R0VU',d: 'Bv3LbKVcjrkuznaM49f8JoHYTAzqf2j9+0wqH3bJVGrG75fw5X0D2XOaft5kTEeWKqpG2chi6MBbUXNUTT4FGmu/K1r5YTf+4LyH46hKdovCp8g0xJkOCp+ul1unGnVEjANBEP05arcez7zhA0GXxE4UboN2UsHjbkqBPpgujuDRBSDczkNyW+B/miM2WsBGSzh7ZkGb0YOXvmHdPgM4QC4u8+KSN8m90KTwndN1bTDe7KjLl8zGoY7y3u/G0l+C7i+gbatdlFndi0rfgIuZUtdrunFZX6FJuEIDyVXp5C0478l02eVz6qgdIyq8s1k59bh+DGs5w4z/dHD+9ZbuSaySOqDmKh4gw7m50oWJ0jISSYqNKgeXhZe/b0B4b43exVu94bnyWmDH9tlKWDbVbY1MNaQSBqboeDuYhNref+2IXmbwHV3OjrTUfIBIdrYkzezYvp9sRcRIt+cdp6KMLruTZ0gWXH1Gc3W+Pn1BXjr0sdDWWksiul5Gdk9zeTpHYx89H90Riwo5OSIjODu5o2AnkTng9WdR0O2A8eVU76Lz2ZRbsx8IJWzI6jiy4+Dd',t: 'MTY5NDcyMTMwNS43MTgwMDA=',cT: Math.floor(Date.now() / 1000),m: 'FmdXWG+swhpuYNTAOifF+9naCD9KkyjhhSeay4IuBeo=',i1: 'jJX8TaNIoKjG3dkh5woZ/w==',i2: 'h69uOJUSvrdYjOS3VgQtHQ==',zh: 'NU8ixJjbvuzjjI0VYVlScfuo4FsYASw7wpJI5etvkPw=',uh: 'tZzwk0UXBB6aZMwUSrybzD1mMJwGI/1CIIfoh4RzeeI=',hh: 'Y4wbTy2+H//SzqXCr/ut8Fn8eNgcrMRWkXlJV1vMwRU=',}};var cpo = document.createElement('script');cpo.src = '/cdn-cgi/challenge-platform/h/g/orchestrate/chl_page/v1?ray=806b2f80ac3c2889';window._cf_chl_opt.cOgUHash = location.hash === '' && location.href.indexOf('#') !== -1 ? '#' : location.hash;window._cf_chl_opt.cOgUQuery = location.search === '' && location.href.slice(0, location.href.length - window._cf_chl_opt.cOgUHash.length).indexOf('?') !== -1 ? '?' : location.search;if (window.history && window.history.replaceState) {var ogU = location.pathname + window._cf_chl_opt.cOgUQuery + window._cf_chl_opt.cOgUHash;history.replaceState(null, null, "\/socket.io\/?EIO=4&transport=polling&t=d8480b84&__cf_chl_rt_tk=FI0YS7VSAqP6oipLvZ1On93V3.LFqlPN2c2U1BFjGlU-1694721305-0-gaNycGzNEdA" + window._cf_chl_opt.cOgUHash);cpo.onload = function() {history.replaceState(null, null, ogU);}}document.getElementsByTagName('head')[0].appendChild(cpo);}());</script><script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8b253dfea2ab4077af8c6f58422dfbfd1689876627854" integrity="sha512-bjgnUKX4azu3dLTVtie9u6TKqgx29RBwfj3QXYt5EKfWM/9hPSAI/4qcV5NACjwAo8UtTeWefx6Zq5PHcMm7Tg==" data-cf-beacon='{"rayId":"806b2f80ac3c2889","version":"2023.8.0","b":1,"token":"92730c73a9e747fbb6a25e1d6657122d","si":100}' crossorigin="anonymous"></script>

It seems I cannot bypass cloudflare. This is the first time I use this script so I do not think it is because I sent too many requests. Could you please check if this also happens at your side? Would this be because they updated their firewall policy? Thanks.

WebSocketConnectionClosedException: Connection is already closed.

I edited the source code of perplexity class to be compatible with python 3.7, never tried it in >=3.8 and got this error. I have already tried to get new headers and cookies through following the steps provided but still got the same error.

Error: Handshake status 403 Forbidden

WebSocketConnectionClosedException Traceback (most recent call last)
/var/folders/sm/rngfstvd2t3b49qbz92lcgmw0000gn/T/ipykernel_2130/3636085025.py in
5 # focus = ['internet', 'scholar', 'writing', 'wolfram', 'youtube', 'reddit', 'wikipedia']
6 # file = (data, filetype) perplexity supports two file types, txt and pdf
----> 7 print(perplexity_cli.search('india’s facets.cloud raises $4m for self-serve devops', mode='concise', focus='internet'))
8
9 # perplexity_cli.create_account(emailnator_headers, emailnator_cookies) # Call this function when you're out of copilots

/var/folders/sm/rngfstvd2t3b49qbz92lcgmw0000gn/T/ipykernel_2130/839763154.py in search(self, query, mode, focus, file)
223 'frontend_uuid': self.frontend_uuid,
224 'gpt4': False,
--> 225 'language': 'en-US',
226 }
227 ]))

~/opt/anaconda3/envs/py37/lib/python3.7/site-packages/websocket/_app.py in send(self, data, opcode)
180 if not self.sock or self.sock.send(data, opcode) == 0:
181 raise WebSocketConnectionClosedException(
--> 182 "Connection is already closed.")
183
184 def close(self, **kwargs):

WebSocketConnectionClosedException: Connection is already closed.

Stuck on search

I run it with below code:

import json
import time
import requests
import random
from bs4 import BeautifulSoup
from websocket import WebSocketApp
from uuid import uuid4
from threading import Thread


cookies = {
    'cf_clearance': 'LH02k9dzyA4wEdXW0m5WANalfq.sx6VDjhgkiGXkHag-1690102887-0-160.0.0',
    '_ga': 'GA1.1.415630709.1690102894',
    'g_state': '{"i_l":0}',
    .............
}

headers = {
    'authority': 'www.perplexity.ai',
    'accept': '*/*',
    'accept-language': 'en-US,en;q=0.9,vi;q=0.8',
    'content-type': 'application/json',
    ..........
}

def souper(x):
    return BeautifulSoup(x, 'lxml')


class Emailnator:
    def __init__(self, headers, cookies, domain=False, plus=True, dot=True, google_mail=False):
        self.inbox = []
        self.inbox_ads = []

        self.s = requests.Session()
        self.s.headers.update(headers)
        self.s.cookies.update(cookies)

        data = {'email': []}

        if domain:
            data['email'].append('domain')
        if plus:
            data['email'].append('plusGmail')
        if dot:
            data['email'].append('dotGmail')
        if google_mail:
            data['email'].append('googleMail')

        response = self.s.post('https://www.emailnator.com/generate-email', json=data).json()
        self.email = response['email'][0]

        for ads in self.s.post('https://www.emailnator.com/message-list', json={'email': self.email}).json()['messageData']:
            self.inbox_ads.append(ads['messageID'])

    def reload(self, wait=False, retry_timeout=5):
        self.new_msgs = []

        while True:
            for msg in self.s.post('https://www.emailnator.com/message-list', json={'email': self.email}).json()['messageData']:
                if msg['messageID'] not in self.inbox_ads and msg not in self.inbox:
                    self.new_msgs.append(msg)

            if wait and not self.new_msgs:
                time.sleep(retry_timeout)
            else:
                break

        self.inbox += self.new_msgs
        return self.new_msgs

    def open(self, msg_id):
        return self.s.post('https://www.emailnator.com/message-list', json={'email': self.email, 'messageID': msg_id}).text


class Client:
    def __init__(self, headers, cookies):
        self.session = requests.Session()
        self.session.headers.update(headers)
        self.session.cookies.update(cookies)
        self.session.get(f'https://www.perplexity.ai/search/{str(uuid4())}')

        self.t = format(random.getrandbits(32), '08x')
        self.sid = json.loads(self.session.get(f'https://www.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}').text[1:])['sid']
        self.frontend_uuid = str(uuid4())
        self.frontend_session_id = str(uuid4())
        self._last_answer = None
        self.copilot = 0
        self.n = 1

        assert self.session.post(f'https://www.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}&sid={self.sid}', data='40{"jwt":"anonymous-ask-user"}').text == 'OK'

        self.ws = WebSocketApp(
            url=f'wss://www.perplexity.ai/socket.io/?EIO=4&transport=websocket&sid={self.sid}',
            cookie='; '.join([f'{x}={y}' for x, y in self.session.cookies.get_dict().items()]),
            on_open=lambda ws: ws.send('2probe'),
            on_message=self.on_message,
            on_error=lambda ws, err: print(f'Error: {err}'),
        )

        Thread(target=self.ws.run_forever).start()
        time.sleep(1)

    def create_account(self, headers, cookies):
        emailnator_cli = Emailnator(headers, cookies, dot=False, google_mail=True)
        resp = self.session.post('https://www.perplexity.ai/api/auth/signin/email', data={
            'email': emailnator_cli.email,
            'csrfToken': self.session.cookies.get_dict()['next-auth.csrf-token'].split('%')[0],
            'callbackUrl': 'https://www.perplexity.ai/',
            'json': 'true',
        })

        if resp.ok:
            new_msgs = emailnator_cli.reload(wait=True)
            new_account_link = souper(emailnator_cli.open(new_msgs[0]['messageID'])).select('a')[1].get('href')

            self.session.get(new_account_link)
            self.session.get('https://www.perplexity.ai/')

            self.copilot = 5

            return True

    def on_message(self, ws, message):
        if message == '2':
            ws.send('3')
        elif message == '3probe':
            ws.send('5')

        if message.startswith(str(430 + self.n)):
            response = json.loads(message[3:])[0]
            response['text'] = json.loads(response['text'])
            self._last_answer = response

    def search(self, query, mode='concise', focus='internet'):
        assert mode in ['concise', 'copilot'], 'Search modes --> ["concise", "copilot"]'
        assert focus in ['internet', 'scholar', 'writing', 'wolfram', 'youtube', 'reddit', 'wikipedia'], 'Search focus modes --> ["internet", "scholar", "writing", "wolfram", "youtube", "reddit", "wikipedia"]'
        assert self.copilot > 0 if mode == 'copilot' else True, 'You have used all of your copilots'

        self.copilot = self.copilot - 1 if mode == 'copilot' else self.copilot
        self.n += 1
        self._last_answer = None

        self.ws.send(f'{420 + self.n}' + json.dumps([
            'perplexity_ask',
            query,
            {
                'source': 'default',
                'mode': mode,
                'last_backend_uuid': None,
                'read_write_token': '',
                'conversational_enabled': True,
                'frontend_session_id': self.frontend_session_id,
                'search_focus': focus,
                'frontend_uuid': self.frontend_uuid,
                'gpt4': False,
                'language': 'en-US',
            }
        ]))

        while not self._last_answer:
            pass

        return self._last_answer

print('__init__')
perplexity_cli = Client(headers, cookies)
print('__search__')
print(perplexity_cli.search('What is iso 9001?'))

Output:
init
search

ModuleNotFoundError: No module named 'perplexity'

Hi, I'm getting this error while running my script ModuleNotFoundError: No module named 'perplexity' Can anyone help me with this? I used the code example in the readme file and followed every step of it, i ran this command "pip3 install requests&&pip3 install beautifulsoup4&&pip3 install lxml&&pip3 install websocket-client&&pip3 install requests-toolbelt"

and pip3 install perplexity is just not working

"json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)" when running labs_cli.ask

code:

import perplexity

labs_cli = perplexity.LabsClient()

# model = ['pplx-7b-online', 'pplx-70b-online', 'pplx-7b-chat', 'pplx-70b-chat', 'mistral-7b-instruct', 'codellama-34b-instruct', 'llama-2-70b-chat', 'llava-7b-chat', 'mixtral-8x7b-instruct', 'mistral-medium']
print(labs_cli.ask('hi', model='mixtral-8x7b-instruct'))

error:

Traceback (most recent call last):
  File "c:/Users/drime/Documents/drimef0_projects/koboldai_characters/samplers/sampler_perplexity.py", line 3, in <module>
    labs_cli = perplexity.LabsClient()
  File "c:\Users\drime\Documents\drimef0_projects\characters_bot\samplers\perplexity.py", line 409, 
in __init__
    self.sid = json.loads(self.session.get(f'https://labs-api.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}').text[1:])['sid']
  File "C:\Users\drime\.pyenv\pyenv-win\versions\3.8.9\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "C:\Users\drime\.pyenv\pyenv-win\versions\3.8.9\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())     
  File "C:\Users\drime\.pyenv\pyenv-win\versions\3.8.9\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

self.session.get(f'https://labs-api.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}').text[1:] returns this:

!DOCTYPE html><html lang="en-US"><head><title>Just a moment...</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta name="robots" content="noindex,nofollow"><meta name="viewport" content="width=device-width,initial-scale=1"><link href="/cdn-cgi/styles/challenges.css" 
rel="stylesheet"><meta http-equiv="refresh" content="375"></head><body class="no-js"><div class="main-wrapper" role="main"><div class="main-content"><noscript><div id="challenge-error-title"><div class="h2"><span class="icon-wrapper"><div class="heading-icon warning-icon"></div></span><span id="challenge-error-text">Enable JavaScript and cookies 
to continue</span></div></div></noscript></div></div><script>....................................................................

The request seems to be blocked

Perplexity account creating error: <Response [400]>

Good Day!
Thank you for the script it does work wonderfully, Yesterday I had the script working well on copilot mode and also it was creating new accounts using emailnator, but somehow today it stopped working keeps getting the error Perplexity account creating error: <Response [400]> , 1st I thought cloudfare is blocking me but I am able to query prompts on concise mode and also can access the website via Google Chrome, I have double checked all my headers and cookies for both Emailnator and Perplexity there seem to be in order, Is there something I am missing.
Your help is greatly appreciated?

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Hi, I already followed the steps provided but getting this error JSONDecodeError: Expecting value: line 1 column 1 (char 0) from running this code perplexity_cli = Client(perplexity_headers, perplexity_cookies)

Here is the traceback of the error:

JSONDecodeError Traceback (most recent call last)
in <cell line: 1>()
----> 1 perplexity_cli = Client(perplexity_headers, perplexity_cookies)
2 #perplexity_cli.create_account(emailnator_headers, emailnator_cookies) # Creates a new gmail, so your 5 copilots will be renewed. You can pass this one if you are not going to use "copilot" mode
3
4 # modes = ['concise', 'copilot']
5 # focus = ['internet', 'scholar', 'writing', 'wolfram', 'youtube', 'reddit', 'wikipedia']

3 frames
in init(self, headers, cookies)
68
69 self.t = format(random.getrandbits(32), '08x')
---> 70 self.sid = json.loads(self.session.get(f'https://www.perplexity.ai/socket.io/?EIO=4&transport=polling&t={self.t}').text[1:])['sid']
71 self.frontend_uuid = str(uuid4())
72 self.frontend_session_id = str(uuid4())

/usr/lib/python3.10/json/init.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
344 parse_int is None and parse_float is None and
345 parse_constant is None and object_pairs_hook is None and not kw):
--> 346 return _default_decoder.decode(s)
347 if cls is None:
348 cls = JSONDecoder

/usr/lib/python3.10/json/decoder.py in decode(self, s, _w)
335
336 """
--> 337 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
338 end = _w(s, end).end()
339 if end != len(s):

/usr/lib/python3.10/json/decoder.py in raw_decode(self, s, idx)
353 obj, end = self.scan_once(s, idx)
354 except StopIteration as err:
--> 355 raise JSONDecodeError("Expecting value", s, err.value) from None
356 return obj, end

Followup after file upload losing context

I'm running the task on perplexity webpage with the file :

  1. Question on perplexity.ai :
    www_question

  2. Followup has the same file as a source:
    www_followup

Next, I'm running the code with streamlit and asking the same question and followup on the same file:

backend_uuid = None
first_query = st.session_state.last_perplexity_response is None
if not first_query: 
    backend_uuid = st.session_state.last_perplexity_response['backend_uuid']
if first_query:
    my_file = (open('apple_cake.txt', 'rb').read(), 'txt')
    perplexity_response = st.session_state.perplexity_cli.search(prompt, mode='concise', file = my_file)
else: 
    perplexity_response = st.session_state.perplexity_cli.search(prompt, mode='concise', follow_up = backend_uuid)
bot_response = perplexity_response['text']['answer']
st.session_state.last_perplexity_response = perplexity_response
  1. Question on perplexity.ai:
    wrapper_question

  2. Followup on perplexity.ai is not using the file as a source:
    wrapper_followup

How to use claude2/gpt4

Hi Mate,
How can I use only Claude2/GPT4 in all my queries?
Is there a way to turn the Copilot function on or off?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.