重要提示 02/03/2024
所有人,土耳其的兵役是强制性的,而我是一个土耳其人,所以我很快就要参军了,这个代码仓库将不再更新。我把这个仓库留给社区,任何想使用它并有能力更新或修复代码的人都可以提交一个拉取请求(作为更新),其他人可以使用这些拉取请求。
Perplexity.ai
这个模块只是一个API包装器和账户生成器。它作为一个带有免费副驾驶的API包装器。
工作原理
这个模块使用emailnator来生成新账户。正如你所知道的,当你创建一个新账户时,你将拥有5个副驾驶。就是这么运作的!这个模块将用emailnator生成新的Gmail账户(现在使用@googlemail.com),你将拥有无限的副驾驶!
要求
点击展开
- requests
- requests-toolbelt
- websocket-client
- aiohttp(如果你打算使用异步版本)
使用以下命令安装依赖:
pip3 install -r requirements.txt
或者用单行命令:
pip3 install requests&&pip3 install websocket-client&&pip3 install requests-toolbelt
如果你打算使用异步版本,还要安装aiohttp:
pip3 install aiohttp
使用方法
首先,Perplexity.ai受到cloudflare的保护,emailnator也是。我们需要手动打开这些页面并获取cookies。不要忘记这些cookies是临时的,所以你需要不断更新它们。这里教你如何获取cookies。
import perplexity
perplexity_headers = {
<你的请求头在这里>
}
perplexity_cookies = {
<你的cookies在这里>
}
emailnator_headers = {
<你的请求头在这里>
}
emailnator_cookies = {
<你的cookies在这里>
}
# 如果你要使用你自己的账户,登录你的账户并复制请求头/cookies(刷新页面)。将"own"设置为True,不要调用"create_account"函数。这将取消副驾驶和文件上传限制控制
perplexity_cli = perplexity.Client(perplexity_headers, perplexity_cookies, own=False)
perplexity_cli.create_account(emailnator_headers, emailnator_cookies) # 创建一个新的Gmail,这样你的5个副驾驶将被更新。如果你不打算使用"副驾驶"模式,可以跳过这个
# 接收一个字符串作为查询,返回一个字符串作为答案。
def my_text_prompt_solver(query):
return input(f'{query}: ')
# 接收一个字符串作为描述和一个字典作为选项。字典由ID和值组成。示例:{1: "橙子", 2: "香蕉"}
# 返回一个由选定选项ID组成的整数列表。假设你选择了"香蕉",函数应返回[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=文件列表,列表中的每个元素是一个这样的元组:(数据,文件类型),perplexity支持两种文件类型,txt和pdf
# follow_up=后续查询的前一个查询信息,你可以直接传入查询的响应json,看看下面的第二个示例。
# ai_model=['default', 'experimental', 'gpt-4', 'claude-2.1', 'gemini pro']仅适用于own=True的客户(perplexity.Client(..., own=True))
# solvers,回答AI在使用副驾驶时提出的问题的函数列表,有2种解答器,文本和复选框。如果你没有为某个解答器定义函数,该类型的问题将被跳过
resp = perplexity_cli.search('你的查询在这里', 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)
# 第二个示例显示如何使用后续查询
# 在后续查询中你不能使用文件上传
# 你可以像下面这样直接传递一个查询的响应json
resp2 = perplexity_cli.search('你的查询在这里', 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) # 当你的副驾驶用完时再次调用这个函数
实验室
打开实验室并按照此处的说明复制请求头/cookies(刷新页面)。
import perplexity
labs_headers = {
<你的请求头在这里>
}
labs_cookies = {
<你的cookies在这里>
}
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'))
# 此函数向对话添加自定义消息
# role=['user', 'assistant']
labs_cli.add_custom_message('msg', role='assistant')
# 此函数重置对话
labs_cli.clear_history()
池
如果你不想等到创建账户,那么池就是你需要的东西。它将在后台创建账户,当你当前的副驾驶和文件上传计数低于限制时,它会在后台创建新账户。
import perplexity
perplexity_headers = {
<你的请求头在这里>
}
perplexity_cookies = {
<你的cookies在这里>
}
emailnator_headers = {
<你的请求头在这里>
}
emailnator_cookies = {
<你的cookies在这里>
}
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=所需的最小副驾驶数量,当当前副驾驶计数低于此值时,将在后台创建一个新账户
# file_uploads=所需的最小文件上传数量,当当前文件上传计数低于此值时,将在后台创建一个新账户
# threads=同时在后台创建的账户数量,如果你不打算在一分钟内使用50+副驾驶,不要增加这个值
pool = perplexity.Pool(perplexity_headers, perplexity_cookies, emailnator_headers, emailnator_cookies, copilots=10, file_uploads=5, threads=1)
# 其他一切都一样
resp = pool.search('你的查询在这里', 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)
异步版本
import perplexity_async
import asyncio
perplexity_headers = {
<你的请求头在这里>
}
perplexity_cookies = {
<你的cookies在这里>
}
emailnator_headers = {
<你的请求头在这里>
}
emailnator_cookies = {
<你的cookies在这里>
}
# 接受一个字符串作为查询,并返回一个字符串作为答案。
async def my_text_prompt_solver(query):
return input(f'{query}: ')
# 接受一个字符串作为描述和一个字典作为选项。字典由id和值组成。例子: {1: "橙子", 2: "香蕉"}
# 返回一个整数列表,这些整数是所选选项的id。假设您选择了“香蕉”,函数应该返回[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():
# 如果你打算使用自己的账户,登录你的账户并复制headers/cookies(重新加载页面)。将"own"设置为True,并且不要调用"create_account"函数。这将停用copilot和文件上传限制控制
perplexity_cli = await perplexity_async.Client(perplexity_headers, perplexity_cookies, own=False)
await perplexity_cli.create_account(emailnator_headers, emailnator_cookies) # 创建一个新的gmail,这样你的5个副手将被更新。如果你不打算使用“copilot”模式,你可以跳过这一项
# modes = ['concise', 'copilot']
# focus = ['internet', 'scholar', 'writing', 'wolfram', 'youtube', 'reddit']
# files = 文件列表,列表中的每个元素是这样的元组: (data, filetype) perplexity支持两种文件类型,txt和pdf
# follow_up = 上一个查询的信息,用于跟进查询,你可以直接传递查询的响应json,请看下面的第二个例子。
# ai_model = ['default', 'experimental', 'gpt-4', 'claude-2.1', 'gemini pro'] 仅在own=True的客户端中工作(perplexity_async.Client(..., own=True))
# solvers, 使用copilot时回答AI问题的函数列表,有两种类型的solvers,文本和复选框。如果你没有定义一个求解器的函数,该类型的求解器中的问题将被跳过
resp = await perplexity_cli.search('你的查询', 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)
# 展示如何使用跟进查询的第二个例子
# 你不能在跟进查询中使用文件上传
# 你可以像下面这样直接传递查询的响应json
resp2 = await perplexity_cli.search('你的查询', 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) # 当你的copilots用完时再次调用这个函数
asyncio.run(test())
Asynchronous Labs
打开实验室并按如下说明复制headers/cookies(重新加载页面)。
import perplexity_async
labs_headers = {
<您的headers>
}
labs_cookies = {
<您的cookies>
}
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('你好', model='pplx-7b-online'))
# 此函数添加一个自定义消息到对话中
# role = ['user', 'assistant']
labs_cli.add_custom_message('消息', role='assistant')
# 此函数重置对话
labs_cli.clear_history()
asyncio.run(test())
如何获取Cookies
请记住这些cookies是临时的,所以你需要不断地更新它们。
- 打开emailnator网站。按F12或Ctrl+Shift+I打开检查器。转到检查器中的“Network”标签,勾选“Preserve log”按钮,点击网站上的“Go !”按钮,右键点击网络标签中的“message-list”,然后将鼠标悬停在“Copy”上,点击“Copy as cURL (bash)”。现在转到curlconverter,将代码粘贴在这里。头文件和cookies字典将出现,复制并在代码中使用它们。
- 打开Perplexity.ai网站。如果你已经登录,请退出。按F12或Ctrl+Shift+I打开检查器。转到检查器中的“Network”标签,勾选“Preserve log”按钮,点击网站上的“Sign Up”按钮,输入一个随机邮箱并点击“Continue with Email”按钮,右键点击网络标签中的“email”,然后将鼠标悬停在“Copy”上,点击“Copy as cURL (bash)”。现在转到curlconverter,将代码粘贴在那里。头文件和cookies字典将出现,复制并在代码中使用它们。
- 不要混淆emailnator和Perplexity.ai的headers和cookies,查看如何使用以了解如何使用它们。
感谢
- perplexityai by nathanrchn
- 感谢他们的贡献 dominicOT, Kerry1207 和 drimeF0