快速搭建
若您是初次接触服务器机器人,建议您先阅读快速启动指南。以下指南提供了如何使用 fastapi_poe 实现特定功能的示例。
- 示例假定您已安装最新版本的 fastapi_poe(可通过 pip 命令
pip install fastapi_poe
安装)。 - 完整的代码示例还假定您的机器人托管在 Modal 上。虽然我们推荐 Modal 因其简单易用,但您应能够在任何云提供商上部署您的服务器机器人。要了解如何设置 Modal,请按照快速启动中的第1步和第2步操作。如果您已经设置好 Modal,只需将完整代码示例复制到名为
main.py
的文件中,然后运行modal deploy main.py
。Modal 将把您的机器人服务器部署到云端,并提供服务器网址。在 Poe 上创建服务器机器人时使用该网址。
使用 OpenAI 功能调用
Poe API 允许您在访问 OpenAI 模型时使用 OpenAI 功能调用。要使用此功能,您只需提供一个包含描述您的功能的对象的工具列表和一个包含与工具列表对应的函数的可执行列表。以下是一个例子。
复制def get_current_weather(location, unit="fahrenheit"): """获取指定位置的当前天气""" if "东京" in location.lower(): return json.dumps({"location": "东京", "temperature": "11", "unit": unit}) elif "旧金山" in location.lower(): return json.dumps( {"location": "旧金山", "temperature": "72", "unit": unit} ) elif "巴黎" in location.lower(): return json.dumps({"location": "巴黎", "temperature": "22", "unit": unit}) else: return json.dumps({"location": location, "temperature": "未知"}) tools_executables = [get_current_weather] tools_dict_list = [ { "type": "function", "function": { "name": "get_current_weather", "description": "获取指定位置的当前天气", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市和州,例如:旧金山,CA", }, "unit": {"type": "string", "enum": ["摄氏度", "华氏度"]}, }, "required": ["location"], }, }, } ] tools = [fp.ToolDefinition(**tools_dict) for tools_dict in tools_dict_list]
def get_current_weather(location, unit=”fahrenheit”): “””获取指定位置的当前天气””” if “东京” in location.lower(): return json.dumps({“location”: “东京”, “temperature”: “11”, “unit”: unit}) elif “旧金山” in location.lower(): return json.dumps( {“location”: “旧金山”, “temperature”: “72”, “unit”: unit} ) elif “巴黎” in location.lower(): return json.dumps({“location”: “巴黎”, “temperature”: “22”, “unit”: unit}) else: return json.dumps({“location”: location, “temperature”: “未知”}) tools_executables = [get_current_weather] tools_dict_list = [ { “type”: “function”, “function”: { “name”: “get_current_weather”, “description”: “获取指定位置的当前天气”, “parameters”: { “type”: “object”, “properties”: { “location”: { “type”: “string”, “description”: “城市和州,例如:旧金山,CA”, }, “unit”: {“type”: “string”, “enum”: [“摄氏度”, “华氏度”]}, }, “required”: [“location”], }, }, } ] tools = [fp.ToolDefinition(**tools_dict) for tools_dict in tools_dict_list]
在这里,您需要定义对您选择的 OpenAI 模型(本例中为 GPT-3.5-Turbo)的两次调用依赖。您需要两次调用依赖,因为在 OpenAI 功能调用流程中,您需要调用 OpenAI 两次。如果您希望在计算响应时进行多次功能调用请求,可以调整此依赖限制。
最终代码(包括您需要在 Modal 上托管此代码的设置代码)如下所示:
复制# 导入必要的模块和库 from __future__ import annotations import json from typing import AsyncIterable import fastapi_poe as fp from modal import Image, Stub, asgi_app # 定义获取当前天气的功能 def get_current_weather(location, unit="fahrenheit"): """获取指定位置的当前天气""" if "东京" in location.lower(): return json.dumps({"location": "东京", "temperature": "11", "unit": unit}) elif "旧金山" in location.lower(): return json.dumps( {"location": "旧金山", "temperature": "72", "unit": unit} ) elif "巴黎" in location.lower(): return json.dumps({"location": "巴黎", "temperature": "22", "unit": unit}) else: return json.dumps({"location": location, "temperature": "未知"}) # 实现 PoeBot 类 class GPT35FunctionCallingBot(fp.PoeBot): async def get_response( self, request: fp.QueryRequest ) -> AsyncIterable[fp.PartialResponse]: async for msg in fp.stream_request( request, "GPT-3.5-Turbo", request.access_key, tools=tools, tool_executables=tools_executables, ): yield msg async def get_settings(self, setting: fp.SettingsRequest) -> fp.SettingsResponse: return fp.SettingsResponse(server_bot_dependencies={"GPT-3.5-Turbo": 2}) # 设置服务器部署的要求 REQUIREMENTS = ["fastapi-poe==0.0.36"] image = Image.debian_slim().pip_install(*REQUIREMENTS) stub = Stub("function-calling-poe") # 配置 ASGI 应用 @stub.function(image=image) @asgi_app() def fastapi_app(): bot = GPT35FunctionCallingBot() app = fp.make_app(bot, allow_without_key=True) return app
# 导入必要的模块和库 from __future__ import annotations import json from typing import AsyncIterable import fastapi_poe as fp from modal import Image, Stub, asgi_app # 定义获取当前天气的功能 def get_current_weather(location, unit=”fahrenheit”): “””获取指定位置的当前天气””” if “东京” in location.lower(): return json.dumps({“location”: “东京”, “temperature”: “11”, “unit”: unit}) elif “旧金山” in location.lower(): return json.dumps( {“location”: “旧金山”, “temperature”: “72”, “unit”: unit} ) elif “巴黎” in location.lower(): return json.dumps({“location”: “巴黎”, “temperature”: “22”, “unit”: unit}) else: return json.dumps({“location”: location, “temperature”: “未知”}) # 实现 PoeBot 类 class GPT35FunctionCallingBot(fp.PoeBot): async def get_response( self, request: fp.QueryRequest ) -> AsyncIterable[fp.PartialResponse]: async for msg in fp.stream_request( request, “GPT-3.5-Turbo”, request.access_key, tools=tools, tool_executables=tools_executables, ): yield msg async def get_settings(self, setting: fp.SettingsRequest) -> fp.SettingsResponse: return fp.SettingsResponse(server_bot_dependencies={“GPT-3.5-Turbo”: 2}) # 设置服务器部署的要求 REQUIREMENTS = [“fastapi-poe==0.0.36”] image = Image.debian_slim().pip_install(*REQUIREMENTS) stub = Stub(“function-calling-poe”) # 配置 ASGI 应用 @stub.function(image=image) @asgi_app() def fastapi_app(): bot = GPT35FunctionCallingBot() app = fp.make_app(bot, allow_without_key=True) return app
配置完成后,您的机器人就可以使用了。
更新机器人的设置(在您覆盖
get_settings
后只需一次)方法请参考下面的更新服务器机器人设置。更新服务器机器人设置
Poe 的设置端点提供了一个途径,允许您选择加入或退出 Poe 的功能,使您能够自定义机器人的行为。本文将描述如何让 Poe 获取您机器人的最新设置。
1. 设置您的端点
如果您使用的是 fastapi_poe 库,那么您只需要在 PoeBot 类中实现
get_settings
方法。以下是一个示例:复制async def get_settings(self, setting: fp.SettingsRequest) -> fp.SettingsResponse: return fp.SettingsResponse(allow_attachments=True)
async def get_settings(self, setting: fp.SettingsRequest) -> fp.SettingsResponse: return fp.SettingsResponse(allow_attachments=True)
此方法应返回一个
SettingsResponse
对象,您可以在其中指定各种设置,如是否允许附件、是否启用多机器人对话等。2. 获取您的访问密钥
您可以通过访问您的机器人页面并点击齿轮图标来找到这个密钥。此密钥用于认证和保证更新设置请求的安全。
3. 发送 POST 请求以重新获取设置
您需要向 Poe 的设置重新获取端点发送 POST 请求,包括您的机器人名称和访问密钥。在 Windows 上,您可以使用
Invoke-RestMethod
命令。在 MacBook 或 Linux 机器上,您可以使用以下 curl 命令:复制curl -X POST https://api.poe.com/bot/fetch_settings/<botname>/<access_key>
curl -X POST https://api.poe.com/bot/fetch_settings/<botname>/<access_key>
请将
<botname>
和<access_key>
替换为您的机器人名称和实际的访问密钥。阅读全文
温馨提示: