Python Client for Bing Chat, also known as Sydney.
Project description
Sydney.py
Python Client for Bing Chat, also known as Sydney.
Note This is an unofficial client.
Features
- Connect to Bing Chat, Microsoft's AI-powered personal assistant.
- Ask questions and have a conversation in various conversation styles.
- Compose content in various formats and tones.
- Stream response tokens for real-time communication.
- Retrieve citations and suggested user responses.
- Use asyncio for efficient and non-blocking I/O operations.
Requirements
- Python 3.9 or newer
- Microsoft account with access to Bing Chat
Installation
To install Sydney.py, run the following command:
pip install sydney-py
or, if you use poetry:
poetry add sydney-py
Note Make sure you're using the latest version of Sydney.py to ensure best compatibility with Bing Chat.
Usage
Prerequisites
To use Sydney.py you first need to extract the _U
cookie from Bing. The _U
cookie is used to authenticate your requests to the Bing Chat API.
To get the _U
cookie, follow these steps:
- Log in to Bing using your Microsoft account.
- Open the developer tools in your browser (usually by pressing
F12
or right-clicking and selectingInspect element
). - Select the
Storage
tab and click on theCookies
option to view all cookies associated with the website. - Look for the
_U
cookie and click on it to expand its details. - Copy the value of the
_U
cookie (it should look like a long string of letters and numbers).
Then, set it as an environment variable in your shell:
export BING_U_COOKIE=<your-cookie>
or, in your Python code:
os.environ["BING_U_COOKIE"] = "<your-cookie>"
It is also recommended to manually write a message to Bing Chat on the Bing page. This will result in a message box containing a Verifying
message, which will then switch to Success!
Without this step, it is possible that Sydney.py will fail with a CaptchaChallenge
error.
Example
You can use Sydney.py to easily create a CLI client for Bing Chat:
import asyncio
from sydney import SydneyClient
async def main() -> None:
async with SydneyClient() as sydney:
while True:
prompt = input("You: ")
if prompt == "!reset":
await sydney.reset_conversation()
continue
elif prompt == "!exit":
break
print("Sydney: ", end="", flush=True)
async for response in sydney.ask_stream(prompt):
print(response, end="", flush=True)
print("\n")
if __name__ == "__main__":
asyncio.run(main())
Sydney Client
You can create a Sydney Client and initialize a connection with Bing Chat which starts a conversation:
sydney = SydneyClient()
await sydney.start_conversation()
# Conversation
await sydney.end_conversation()
Alternatively, you can use the async with
statement to keep the code compact:
async with SydneyClient() as sydney:
# Conversation
Conversation Style
You can set the conversation style when creating a Sydney Client:
sydney = SydneyClient(style="creative")
The available options are creative
, balanced
and precise
.
Reset Conversation
You can reset the conversation in order to make the client forget the previous conversation. You can also change the conversation style without creating a new client:
async withSydneyClient() as sydney:
# Conversation
await sydney.reset_conversation(style="creative")
Ask
You can ask Bing Chat questions and (optionally) include citations in the results:
async with SydneyClient() as sydney:
response = await sydney.ask("When was Bing Chat released?", citations=True)
print(response)
You can also stream the response tokens:
async with SydneyClient() as sydney:
async for response in sydney.ask_stream("When was Bing Chat released?", citations=True):
print(response, end="", flush=True)
Both versions of the ask
method support the same parameters.
Compose
You can ask Bing Chat to compose different types of content, such emails, articles, ideas and more:
async with SydneyClient() as sydney:
response = sydney.compose("Why Python is a great language", format="ideas")
print(response)
You can also stream the response tokens:
async with SydneyClient() as sydney:
async for response in sydney.compose_stream("Why Python is a great language", format="ideas"):
print(response, end="", flush=True)
The available options for the tone
parameter are:
professional
casual
enthusiastic
informational
funny
The available options for the format
parameter are:
paragraph
email
blogpost
ideas
The available options for the length
parameter are:
short
medium
long
Both versions of the compose
method support the same parameters.
Suggested Responses
You can also receive the suggested user responses as generated by Bing Chat along with the text answer. Both ask
and ask_stream
support this feature:
async with SydneyClient() as sydney:
response, suggested_responses = await sydney.ask(prompt, suggestions=True)
if suggested_responses:
print("Suggestions:")
for suggestion in suggested_responses:
print(suggestion)
Note The suggested user responses are returned only if the suggestions parameter is true. Otherwise, the
ask
andask_stream
methods return only the response.
Note When using the
ask_stream
method with the suggestions parameter, only the suggested user responses returned lastly may contain a value. For all previous iterations, the suggested user responses will beNone
.
Raw Response
You can also receive the raw JSON response that comes from Bing Chat instead of a text answer. Both ask
and compose
support this feature:
async with SydneyClient() as sydney:
response = await sydney.ask("When was Bing Chat released?", raw=True)
print(response)
Conversations
You can also receive all existing conversations that were made with the current client:
async with SydneyClient() as sydney:
response = await sydney.get_conversations()
print(response)
For more detailed documentation and options, please refer to the code docstrings.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for sydney_py-0.15.2-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3d209e72ebcc7340eb3110cd5c5507f3bc3f1a854d5f8f1c5eb916dfce77715e |
|
MD5 | acf24f20ffba480a4ea2552e48f72898 |
|
BLAKE2b-256 | fcb9b855f6b59d8bced9f3731f8eb2fd5c1e8a0641cff91da5e3fceeabd9ed00 |