Latest Version: 0.3.6
This is a guide on how to use the async-poe-Client
library. Before getting started, make sure you have installed this
library.
pip install async-poe-client
Question: What is url_botname? -> When using a specific bot in Poe, the bot's name in the URL ("https://poe.com/ChatGPT" where 'ChatGPT' is the url_botname) is referred to as url_botname. The relationship between url_botname and other names can be understood as follows:
Question: What is chat_code? -> A bot can have multiple chat windows, and chat_code is the unique identifier for each chat window. The method to retrieve it is similar to url_botname. For example, in "https://poe.com/chat/1234567890", the chat_code is 1234567890.
Question: How to obtain p_b and formkey? ->
Now the formkey must be filled in to use the library. Currently, no solution has been found for the "document is not defined" error. ~~If you do not pass the formkey, you need to install Node.js to use the formkey generation feature. Here is the download link: node.js~~
Before using any functionality of the Poe_Client
library, you need to import the library and create a Poe_Client
object. You need to pass the p_b token
and formkey
to the constructor of Poe_Client
, and then call the create
method to initialize it. Here is an example:
from async_poe_client import Poe_Client
# If the creation process takes a long time, you can try setting preload to False
poe_client = await Poe_Client("your p_b token", "your form key").create()
# You can also set a proxy
poe_client = await Poe_Client("your p_b token", "your form key", proxy="socks5://127.0.0.1:7890").create()
In the above code, "your p_b token"
and "your form key"
should be replaced with your actual p_b token and formkey.
Once you have created Poe_Client
, you can perform various operations with it.
You can directly access the attribute value.
print(poe_client.subscription)
It returns a dictionary containing the subscription information.
Function: create_bot()
Parameters:
handle: str
- The name of the new bot. It must be a string and must be unique throughout poe.com. It cannot have the
same name as another bot.prompt: str = ""
- The preset personality of the new bot. It is an optional string parameter and defaults to an
empty string.display_name: Optional[str] =
None`` - The display name of the new bot. It is an optional string parameter and
defaults to None
. If not passed, the handle will be displayed.base_model: str = "chinchilla"
- The model used by the new bot. It is an optional string parameter. The options
are: "chinchilla" (ChatGPT) or "a2" (Claude). If subscribed, you can use "beaver" (ChatGPT4) or "a2_2" (
Claude-2-100k).description: str = ""
- The description of the new bot. It is an optional string parameter and defaults to an empty
string.intro_message: str = ""
- The introduction message of the new bot. It is an optional string parameter. If it is an
empty string, the bot will have no introduction message.prompt_public: bool = True
- Whether the preset personality should be publicly visible. It is an optional boolean
parameter and defaults to True.profile_picture_url: Optional[str] =
None`` - The URL of the profile picture for the bot. It is an optional string
parameter and defaults to None
. The library does not support uploading custom images.linkification: bool = False
- Whether the bot should convert certain text in responses into clickable links. It is
an optional boolean parameter and defaults to False.markdown_rendering: bool = True
- Whether the bot's responses should enable markdown rendering. It is an optional
boolean parameter and defaults to True.suggested_replies: bool = True
- Whether the bot should suggest possible replies after each response. It is an
optional boolean parameter and defaults to False.private: bool = False
- Whether the bot should be private. It is an optional boolean parameter and defaults to
False.temperature: Optional[float] =
None`` - The temperature of the new bot. It is an optional float parameter and
defaults to None
.If you want the new bot to use your own API (you can find the official Poe API integration tutorial here), use the following parameters:
api_bot = False
- Whether the bot is your own API bot.api_key =
None`` - The API key for the new bot.api_url =
None`` - The API URL for the new bot.Return value: None
The simplest usage is as follows, where you only need to pass the handle and prompt to create a bot:
await poe_client.create_bot(handle="testbotcx1", prompt="a ai assistant", p)
Function: edit_bot()
Parameters:\
Note that url_botname
is the original name of the bot, and the other parameters are the values to be modified. If a
parameter is not passed, its value will remain unchanged.
url_botname: str
- The url_botname
of the bot to be modified, must be a string.handle: Optional[str]
- The name of the bot, must be a string and must be unique across the entire poe.com. It
cannot be the same as any other bot.prompt: Optional[str] = ""
- The preset personality of the bot, optional string, defaults to an empty string.display_name: Optional[str] =
None`` - The display name of the bot, optional string, defaults to None
. If not
passed, the handle will be displayed.base_model: Optional[str] = "chinchilla"
- The model used by the bot, optional string. Options include: "
chinchilla" (ChatGPT) or "a2" (Claude). If subscribed, you can use "beaver" (ChatGPT4) or "a2_2" (Claude-2-100k).description: Optional[str] = ""
- The description of the bot, optional string, defaults to an empty string.intro_message: Optional[str] = ""
- The introduction message of the bot, optional string. If it is an empty string,
the bot will have no introduction message.prompt_public: Optional[bool] = True
- Whether the preset personality should be publicly visible, optional boolean,
defaults to True.profile_picture_url: Optional[str] =
None`` - The URL of the profile picture of the bot, optional string, defaults
to None
. With this library, it is not possible to upload custom images.linkification: Optional[bool] = False
- Whether the bot should convert certain text in the response into clickable
links, optional boolean, defaults to False.markdown_rendering: Optional[bool] = True
- Whether the bot's response should enable markdown rendering, optional
boolean, defaults to True.suggested_replies: Optional[bool] = False
- Whether the bot should suggest possible replies after each response,
optional boolean, defaults to False.private: Optional[bool] = False
- Whether the bot should be private, optional boolean, defaults to False.temperature: Optional[float] =
None`` - The temperature of the bot, optional float, defaults to None
.If you want the new bot to use your own API (you can get the official Poe API integration tutorial here), use the following parameters:
api_bot = False
- Whether the bot is your own API bot.api_key =
None`` - The API key for the new bot.api_url =
None`` - The API URL for the new bot.await poe_client.edit_bot(url_botname="test27gs", handle="test27gs2", prompt="a computer programmer")
Note: This operation is irreversible!
Function: delete_bot()
Parameters:
url_botname: str
- The URL name of the bot.Returns: None
await poe_client.delete_bot(url_botname="test27gs2")
(1). Function that returns pure text format:
Function: ask_stream() Parameters:
url_botname: str
- The URL name of the bot.chat_code: Optional[str]
- The unique identifier for a specific chat window of the bot.question: str
- The content of the inquiry.suggest_able: Optional[bool]
- Whether to display suggested replies (requires bot support for suggested replies to
be output).with_chatb_reak: Optional[bool]
- Whether to clear the bot's memory after the conversation (i.e., maintain a single
dialogue).Return value: AsyncGenerator of str
# The get_available_bots() function can be found in item 8 with usage instructions.
# If chat_code is not provided, a new chat window will be automatically created, and its chat_code can be obtained from the poe_client's property.
async for message in poe_client.ask_stream(url_botname='ChatGPT', question="introduce async and await"):
print(message, end="")
# The bot_code_dict attribute can be accessed to get a dictionary with url_botname as the key and List[chat_code] as the value. The order is from newest to oldest, and the first one is the chat_code that was just automatically created.
chat_code = poe_client.bot_code_dict['ChatGPT'][0]
# Continue the conversation using the chat_code obtained earlier
async for message in poe_client.ask_stream(url_botname='ChatGPT', chat_code=chat_code,
question="introduce async and await"):
print(message, end="")
# If suggested replies are used and you want a list of suggested replies, they can be extracted from the bots attribute, which records the last suggested reply of a bot in a specific chat.
print(poe_client.bots['ChatGPT']['chats'][chat_code]['Suggestion'])
(2). Function that returns corresponding information format:
Function: ask_stream_raw() Parameters:
url_botname: str
- The URL name of the bot.chat_code: Optional[str]
- The unique identifier for a specific chat window of the bot.question: str
- The content of the inquiry.suggest_able: Optional[bool]
- Whether to display suggested replies (requires bot support for suggested replies to
be output).with_chatb_reak: Optional[bool]
- Whether to clear the bot's memory after the conversation (i.e., maintain a single
dialogue).Return value: AsyncGenerator of Text, SuggestRely, ChatCodeUpdate, ChatTiTleUpdate
from async_poe_client import Text, SuggestRely, ChatTiTleUpdate, ChatCodeUpdate
suggest_replys = []
chat_title = None
async for data in poe_client.ask_stream_raw(url_botname="ChatGPT", question="介绍一下微软",
suggest_able=True):
# You can use the content attribute to get the specific content of the corresponding type, or use str() directly.
if isinstance(data, Text):
"""Text response"""
print(str(data), end="")
elif isinstance(data, SuggestRely):
"""Suggested reply"""
suggest_replys.append(str(data))
if len(suggest_replys) == 1:
print("\nSuggest Replys:\n")
print(f"{len(suggest_replys)}: {data}")
elif isinstance(data, ChatTiTleUpdate):
"""Chat window title update"""
chat_title = data
elif isinstance(data, ChatCodeUpdate):
"""New chat_code"""
print("\nNew ChatCode: " + str(data))
if chat_title:
print(f"\nNew Chat Title: {chat_title}")
Function:stop_chat() Parameters:
chat_code:str
- The unique identifier of the conversation to be stoped.Returns: None
await poe_client.stop_chat(chatcode)
Function: send_chat_break()
Parameters:
url_botname: str
- The URL name of the bot whose memory is to be cleared.chat_code: str
- The unique identifier of the conversation to be cleared.Returns: None
await poe_client.send_chat_break(url_botname="Assistant", chat_code="chat_code")
Note that the order of retrieval is based on the order in the left sidebar of poe.com, from top to bottom.
Function: get_available_bots()
Parameters:
count: Optional[str] = 25
- The number of bots to retrieve.get_all: Optional[bool] = False
- Whether to retrieve all available bots.Returns: List[dict]
- A list containing dictionaries of bot information. The handle
of both system bots and
user-created bots will always be the same as the url_botname
.
# By default, when creating the client, the information of all bots is automatically loaded and stored in the `bots` attribute. The process of creating and deleting bots (excluding automatically added sent and received messages in chat windows) will also be reflected in the `bots` attribute of the client.
poe_client = await Poe_Client("your p_b token", "formkey").create()
print(poe_client.bots)
# You can also actively retrieve available bots
bots = await poe_client.get_available_bots(get_all=True)
print(bots)
Note that the deletion order is based on the order in the left sidebar of poe.com, and if a system bot is encountered, it will be skipped. However, it is counted in the quantity.
Note: This operation is irreversible!
Function: delete_available_bots()
Parameters:
count: Optional[int] = 2
- The number of bots to delete (Note that this does not include system bots, so the actual
number of deletions may be different).del_all: Optional[bool] = False
- Whether to delete all available bots (Note that deleting all bots may take a long
time depending on the number of bots you have).Returns: None
await poe_client.delete_available_bots(count=2)
await poe_client.delete_available_bots(del_all=True)
Function: get_bot()
Parameters:
url_botname: str
- The URL name of the bot.Returns: A dictionary containing some chat messages and partial information of the bot.
data = await poe_client.get_botdata(url_botname="578feb1716fe43f")
print(data)
Function: get_bot_setting()
Parameters:
url_botname: str
- The URL name of the bot.Returns:\ A dictionary containing all information of the bot, such as prompt and persona, which are the parameters used when creating or editing the bot.
info = await poe_client.get_bot_info(url_botname="578feb1716fe43f")
print(info)
Note: This operation is irreversible!
Function: delete_chat_by_chat_code()
Parameters:
chat_code: str
- The chat code of the conversation window to delete.Returns: None
await poe_client.delete_chat_by_chat_code(chat_code="chat_code")
Function: delete_chat_by_count()
url_botname: str
count: int
- The number of chat windows to delete (from top to bottom).del_all: bool
- Whether to delete all chat windows.Returns: None
# Delete 20 chat windows
await poe_client.delete_chat_by_count(url_botname="ChatGPT", count=20)
# Delete all chat windows
await poe_client.delete_chat_by_count(url_botname="ChatGPT", del_all=True)
Note that the retrieval order is from top to bottom, based on the order on poe.com.
Function: explore_bots()
Parameters:
count: Optional[str] = 25
- The number of bots to retrieve.get_all: Optional[bool] = False
- Whether to retrieve all available bots.Returns: List[dict]
- A list containing dictionaries of bot information. The handle
of both system bots and
user-created bots will always be the same as the url_botname
.
bots = await poe_client.explore_bots(count=100)
print(bots)
bots = await poe_client.explore_bots(explore_all=True)
print(bots)
Function: get_chat_list()
Parameters:
url_botname: str
- The URL name of the bot.count: int = 25
- The count of messages to getget_all: bool = False
- Whether to get all the chats
Returns:
A list of dictionary containing some or all chats of the bot.history = await poe_client.get_chat_list("ChatGPT", get_all=True)
print(history)
Function: get_chat_history()
Parameters:
url_botname: str
- The URL name of the bot.chat_code: str
- The chat to getcount: int = 25
- The count of messages to getget_all: bool = False
- Whether to get all the chat messages
Returns:
A list of dictionary containing some chat messages of the chat.history = await poe_client.get_chat_history("ChatGPT", "chat_code", get_all=True)
print(history)