Sydney.py
Copilot(前称为 Bing Chat)的 Python 客户端,也被称为 Sydney。
[!注意] 这是一个非官方客户端。
功能
- 连接到微软的 AI 驱动个人助手 Copilot。
- 以多种对话风格提问并进行对话。
- 以各种格式和语调撰写内容。
- 流式传输响应令牌以实现实时通信。
- 检索引用和建议的用户响应。
- 通过图像增强提示以获得丰富的体验。
- 使用任何支持的角色定制您的体验。
- 使用 asyncio 进行高效、非阻塞的 I/O 操作。
要求
- Python 3.9 或更新版本
- 拥有访问 Copilot 的微软账户 (可选)
安装
要安装 Sydney.py,请运行以下命令:
pip install sydney-py
或者,如果您使用 poetry:
poetry add sydney-py
[!提示] 确保您使用的是最新版本的 Sydney.py,以确保与 Copilot 的最佳兼容性。
使用方法
前提条件
要使用 Sydney.py,您首先需要从 Copilot 网页中提取所有 cookies。 这些 cookies 用于验证您对 Copilot API 的请求。
获取 cookies,请在 Microsoft Edge 中执行以下步骤:
- 转到 Copilot 网页。
- 打开开发者工具(通常按
F12
或右键单击聊天对话框并选择Inspect
)。 - 选择
Network
选项卡以查看发送到 Copilot 的所有请求。 - 在网页上出现的聊天对话框中编写一条消息。
- 找到名为
create?bundleVersion=XYZ
的请求并点击它。 - 向下滚动到请求头部分并复制
Cookie:
字段后的整个值。
然后,在您的 shell 中将其设为环境变量:
export BING_COOKIES=<您的 cookies>
或在您的 Python 代码中:
os.environ["BING_COOKIES"] = "<您的 cookies>"
[!提示] 在某些地区,使用 cookies 是不需要的,此时可以跳过上述步骤。
[!提示] 还可以使用
Cookie-Editor
扩展,导出 cookies 为Header String
格式并以相同方式设置它们。
[!重要] 在需要 cookies 的地区,建议手动向 Copilot 编写消息,直到出现包含
Verifying
消息的框,然后应切换到Success!
消息。 否则,Sydney.py 可能会因CaptchaChallenge
错误而失败。
示例
您可以使用 Sydney.py 轻松创建一个 Copilot 的 CLI 客户端:
import asyncio
from sydney import SydneyClient
async def main() -> None:
async with SydneyClient() as sydney:
while True:
prompt = input("你:")
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 客户端
您可以创建一个 Sydney 客户端并与 Copilot 建立连接以开始对话:
sydney = SydneyClient()
await sydney.start_conversation()
# 对话
await sydney.close_conversation()
或者,您可以使用 async with
语句以使代码紧凑:
async with SydneyClient() as sydney:
# 对话
对话风格
您可以在创建 Sydney 客户端时设置对话风格:
sydney = SydneyClient(style="creative")
可用的选项有 creative
、balanced
和 precise
。
重置对话
您可以重置对话以使客户端忘记之前的对话。您还可以更改对话风格而不必创建一个新客户端:
async with SydneyClient() as sydney:
# 对话
await sydney.reset_conversation(style="creative")
提问
您可以向 Copilot 提问,并(可选)在结果中包含引用:
async with SydneyClient() as sydney:
response = await sydney.ask("Bing Chat 是何时发布的?", citations=True)
print(response)
您也可以流式传输响应令牌:
async with SydneyClient() as sydney:
async for response in sydney.ask_stream("Bing Chat 是何时发布的?", citations=True):
print(response, end="", flush=True)
这两个版本的 ask
方法支持相同的参数。
附件
也可以提供图像的 URL 或本地图像文件路径作为附件,附件将与提示一起作为输入:
async with SydneyClient() as sydney:
response = await sydney.ask("这张照片显示了什么?", attachment="<图像 URL 或路径>")
print(response)
网页上下文
您还可以提供网页的内容作为附加上下文,并将其与提示一起使用:
async with SydneyClient() as sydney:
response = await sydney.ask("描述这个网页", context="<网页源代码>")
print(response)
网络搜索
可以确定 Copilot 是否可以搜索网页以获取信息用于结果:
async with SydneyClient() as sydney:
response = await sydney.ask("Bing Chat 是何时发布的?", search=False)
print(response)
默认情况下启用网络搜索。
[!注意] 当响应以流方式传输时,无法禁用网络搜索。
人格
可以使用适合特定任务或对话的 Copilot 专用版本:
async with SydneyClient(persona="travel") as sydney:
response = await sydney.ask("悉尼的旅游景点")
print(response)
persona
参数的可用选项有:
copilot
travel
cooking
fitness
默认情况下,Sydney 将使用 copilot
人物角色。
撰写
您可以请求 Copilot 撰写不同类型的内容,例如邮件、文章、创意等:
async with SydneyClient() as sydney:
response = await sydney.compose("为什么 Python 是一个伟大的语言", format="ideas")
print(response)
您也可以流式传输响应令牌:
async with SydneyClient() as sydney:
async for response in sydney.compose_stream("为什么 Python 是一个伟大的语言", format="ideas"):
print(response, end="", flush=True)
tone
参数的默认可用选项有:
professional
casual
enthusiastic
informational
funny
tone
参数也可以提供任何其他值。
format
参数的可用选项有:
paragraph
email
blogpost
ideas
length
参数的可用选项有:
short
medium
long
这两个版本的 compose
方法支持相同的参数。
建议的响应
您还可以收到 Copilot 生成的建议用户响应以及文本答案。 ask
和 ask_stream
都支持此功能:
async with SydneyClient() as sydney:
response, suggested_responses = await sydney.ask("Bing Chat 是何时发布的?", suggestions=True)
if suggested_responses:
print("建议:")
for suggestion in suggested_responses:
print(suggestion)
同样的 compose
和 compose_stream
也支持:
async with SydneyClient() as sydney:
response, suggested_responses = await sydney.compose(
"为什么 Python 是一个伟大的语言", format="ideas", suggestions=True
)
if suggested_responses:
print("建议:")
for suggestion in suggested_responses:
print(suggestion)
[!注意] 只有 suggestions 参数为 true 时,才会返回建议用户响应。否则,所有
ask
和compose
方法只返回响应。
[!注意] 当使用带有 suggestions 参数的
ask_stream
或compose_stream
方法时,只有最后一次返回的建议用户响应可能包含值。之前的所有迭代中,建议用户响应将为None
。
使用建议撰写
您还可以使用建议的响应或任何其他提示来改进或更改 compose
的结果:
async with SydneyClient() as sydney:
response, suggested_responses = await sydney.compose(
prompt="为什么 Python 是一个伟大的语言", format="ideas", suggestions=True,
)
response, suggested_responses = await sydney.compose(
prompt=suggested_responses[0], format="ideas", suggestions=True
)
print(response)
原始响应
您还可以接收来自 Copilot 的原始 JSON 响应,而不是文本答案。 ask
和 compose
都支持此功能:
async with SydneyClient() as sydney:
response = await sydney.ask("Bing Chat 是何时发布的?", raw=True)
print(response)
对话
您还可以接收使用当前客户端进行的所有现有对话:
async with SydneyClient() as sydney:
response = await sydney.get_conversations()
print(response)
异常
当出现问题时,Sydney.py 可能会抛出以下异常之一:
异常 | 含义 | 解决方法 |
---|---|---|
NoConnectionException | 找不到 Copilot 连接 | 重试 |
ConnectionTimeoutException | 尝试连接到 Copilot 超时 | 重试 |
NoResponseException | Copilot 没有返回响应 | 重试或使用新 cookies |
ThrottledRequestException | 请求被限流 | 等待后重试 |
CaptchaChallengeException | 必须解决验证码挑战 | 使用新 cookies |
ConversationLimitException | 达到 N 条消息的对话限制 | 开始新对话 |
CreateConversationException | 创建对话失败 | 重试或使用新 cookies |
GetConversationsException | 获取对话失败 | 重试 |
有关更详细的文档和选项,请参阅代码文档字符串。
许可证
该项目根据 MIT 许可证授权 - 请参阅 LICENSE 文件以了解详情。