From 33574872621a1b96e4a13034868fab2659a8fe00 Mon Sep 17 00:00:00 2001 From: yepeiwen01 Date: Wed, 12 Mar 2025 16:34:54 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=8A=8Aagent=5Fruntime=E6=8B=86=E5=88=86?= =?UTF-8?q?=E4=B8=BAflask=5Fruntime=E5=92=8Cchainlit=5Fruntime=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=BB=84=E4=BB=B6=E6=96=B0=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/python-package.yml | 3 +- README.md | 11 +- .../advanced_application/cloud_deploy.ipynb | 12 +- cookbooks/components/chainlit_runtime.ipynb | 297 ++++++++ cookbooks/components/flask_runtime.ipynb | 400 ++++++++++ ..._runtime_with_chainlit_component_debug.jpg | Bin 0 -> 489284 bytes .../components/rag_with_baidusearch.ipynb | 14 +- ...agent_runtime.ipynb => user_session.ipynb} | 470 +----------- .../2024_05_16/service_deploy.py | 3 +- docs/BasisModule/Deployment/AgentChainlit.md | 5 - .../{agentruntime.md => chainlit_deploy.md} | 65 +- docs/BasisModule/Deployment/cloud.md | 3 +- docs/BasisModule/Deployment/flask.md | 5 - docs/BasisModule/Deployment/flask_deploy.md | 101 +++ docs/BasisModule/Deployment/usersession.md | 6 +- .../HowToContributeCode/README.md | 2 +- .../README.md | 7 +- .../StartFirstAINativeApplication/README.md | 39 +- docs/README.md | 5 +- docs/README_en.md | 11 +- docs/README_ja.md | 11 +- mkdocs.yml | 5 +- python/__init__.py | 1 - python/core/agent.py | 639 ---------------- python/core/context.py | 4 +- python/core/user_session.py | 2 +- python/tests/component_tool_eval_cases.py | 3 +- python/tests/test_agent.py | 33 +- python/tests/test_appbuilder_client.py | 2 +- ...test_appbuilder_client_run_with_handler.py | 2 +- .../tests/test_appbuilder_client_toolcall.py | 2 +- ...ppbuilder_client_toolcall_event_handler.py | 2 +- ...der_client_toolcall_event_handler_error.py | 2 +- ...er_client_toolcall_event_handler_stream.py | 2 +- ...uilder_client_toolcall_event_handler_v2.py | 2 +- ...uilder_client_toolcall_event_handler_v3.py | 2 +- .../test_appbuilder_client_toolcall_stream.py | 2 +- .../test_appbuilder_client_toolcall_v2.py | 2 +- .../test_appbuilder_client_toolcall_v3.py | 2 +- .../test_async_appbuilder_client_toolcall.py | 2 +- python/tests/test_core_agent.py | 8 +- python/utils/chainlit.md | 5 +- python/utils/chainlit_deploy.py | 694 ++++++++++++++++++ python/utils/flask_deploy.py | 389 ++++++++++ reinstall.sh | 4 + setup.py | 1 + 46 files changed, 2038 insertions(+), 1244 deletions(-) create mode 100644 cookbooks/components/chainlit_runtime.ipynb create mode 100644 cookbooks/components/flask_runtime.ipynb create mode 100644 cookbooks/components/image/agent_runtime_with_chainlit_component_debug.jpg rename cookbooks/components/{agent_runtime.ipynb => user_session.ipynb} (59%) delete mode 100644 docs/BasisModule/Deployment/AgentChainlit.md rename docs/BasisModule/Deployment/{agentruntime.md => chainlit_deploy.md} (65%) delete mode 100644 docs/BasisModule/Deployment/flask.md create mode 100644 docs/BasisModule/Deployment/flask_deploy.md delete mode 100644 python/core/agent.py create mode 100644 python/utils/chainlit_deploy.py create mode 100644 python/utils/flask_deploy.py create mode 100644 reinstall.sh diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index bd850fb9d..fd70db57f 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -335,5 +335,4 @@ jobs: run: | echo "检测到Java文件被更改(根据环境变量APPBUILDER_JAVA_TESTS),准备启动Run Java tests with Jacoco部分..." cd cicd/app-builder/java - bash print_coverage.sh - + bash print_coverage.sh \ No newline at end of file diff --git a/README.md b/README.md index 1b2605f06..52c5818b6 100644 --- a/README.md +++ b/README.md @@ -26,12 +26,12 @@ - 调用AI原生应用,通过[AppBuilderClient](/docs/BasisModule/Platform/Application/appbuilder_client.md)可访问并管理在百度智能云千帆AppBuilder[网页端](https://console.bce.baidu.com/ai_apaas/app)发布的AI原生应用,并可注册本地函数联动端云组件 - **编排** - 配置知识库,通过[KnowledgeBase](/docs/BasisModule/Platform/KnowledgeBase/knowledgebase.md)管理知识库,进行文档及知识切片的增删改查,配合[网页端](https://console.bce.baidu.com/ai_apaas/app)开发产业级的`RAG`应用 - - 编排工作流,提供了`Message`、`Component`、`AgentRuntime`多级工作流抽象,实现工作流编排,并可与LangChain、OpenAI等业界生态能力打通 + - 编排工作流,提供了`Message`、`Component`、`FlaskRuntime`、`ChainlitRuntime`多级工作流抽象,实现工作流编排,并可与LangChain、OpenAI等业界生态能力打通 - **监控** - 提供了可视化Tracing、详细DebugLog等监控工具,助力开发者在生产环境应用 - **部署** - - `AgentRuntime`支持部署为基于`Flask`与`gunicorn`的API服务 - - `AgentRuntime`支持部署为基于`Chainlit`的对话框交互前端 + - `FlaskRuntime`支持部署为基于`Flask`与`gunicorn`的API服务 + - `ChainlitRuntime`支持部署为基于`Chainlit`的对话框交互前端 - 提供了`appbuilder_bce_deploy`工具,可快速部署程序到百度云,提供公网API服务,联动AppBuilder工作流 ### 使用 AppBuilder-SDK 可以构建什么应用? @@ -296,10 +296,9 @@ Hook: - [TRACE基础功能](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Trace/basic.md) - [TRACE拓展功能](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Trace/phoenix_method.md) - 部署: - - [交互式前端部署](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/AgentChainlit.md) + - [交互式前端部署](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/chainlit_deploy.md) - [公有云部署](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/cloud.md) - - [API 访问](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/flask.md) - - [AgentRuntime](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/agentruntime.md) + - [API 访问](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/flask_deploy.md) - [UserSession](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/usersession.md) - 平台: - 应用: diff --git a/cookbooks/advanced_application/cloud_deploy.ipynb b/cookbooks/advanced_application/cloud_deploy.ipynb index 8a55a5d03..e45a685de 100644 --- a/cookbooks/advanced_application/cloud_deploy.ipynb +++ b/cookbooks/advanced_application/cloud_deploy.ipynb @@ -93,9 +93,10 @@ "# 编写服务运行代码\n", "# sample/sample.py\n", "import appbuilder\n", + "from appbuilder.utils.flask_deploy import FlaskRuntime\n", "\n", "component = appbuilder.Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\")\n", - "agent = appbuilder.AgentRuntime(component=component)\n", + "agent = FlaskRuntime(component=component)\n", "agent.serve(port=8091)" ] }, @@ -142,9 +143,10 @@ "outputs": [], "source": [ "import appbuilder\n", + "from appbuilder.utils.flask_deploy import FlaskRuntime\n", "\n", "component = appbuilder.Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\")\n", - "agent = appbuilder.AgentRuntime(component=component)\n", + "agent = FlaskRuntime(component=component)\n", "agent.serve(port=8091)" ] }, @@ -207,12 +209,12 @@ "outputs": [], "source": [ "import appbuilder\n", - "\n", + "from appbuilder.utils.flask_deploy import FlaskRuntime\n", "\n", "component = appbuilder.Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\")\n", "\n", - "agent = appbuilder.AgentRuntime(component=component)\n", - "agent.chainlit_demo(port=8091)" + "agent = FlaskRuntime(component=component)\n", + "agent.chainlit_component(port=8091)" ] }, { diff --git a/cookbooks/components/chainlit_runtime.ipynb b/cookbooks/components/chainlit_runtime.ipynb new file mode 100644 index 000000000..ece31d389 --- /dev/null +++ b/cookbooks/components/chainlit_runtime.ipynb @@ -0,0 +1,297 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "f802e64d-4eaa-445d-a48a-1042a91bc394", + "metadata": { + "tags": [] + }, + "source": [ + "# 基于ChainlitRuntime服务化组件\n", + "\n", + "## 目标\n", + "使用 ChainlitRuntime 对组件进行服务化。\n", + "\n", + "ChainlitRuntime 是对组件(Component)和应用的服务化封装,具体有如下几个功能:\n", + "- 一键服务化组件: 使得组件能够以服务的形式运行,支持对话框交互。\n", + "- Session 数据管理: 提供 Session 数据的管理功能,允许跟踪和存储用户会话数据。\n", + "- 请求时鉴权: 支持在请求时进行认证,确保安全性。\n", + "\n", + "\n", + "## 准备工作\n", + "### 安装Python SDK\n", + "\n", + "appbuilder 支持使用 pip 安装(要求Python >= 3.8),并且 ChainlitRuntime 服务化组件依赖 `appbuilder-sdk[serve]`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2939356f-61c2-42e9-9e0c-fc6729c193f6", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "pip install appbuilder-sdk 'appbuilder-sdk[serve]'" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "aeb2fa55-075f-48df-a9fb-8b40d9900684", + "metadata": {}, + "source": [ + "## 基本用法\n", + "\n", + "### 1. 快速开始\n", + "\n", + "下面的示例会基于 Playground 组件,在 8091 端口部署 chainlit 服务: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41559341-fd7a-478c-a08b-1477d79e9d41", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-18T06:24:26.982459Z", + "start_time": "2023-12-18T06:23:53.771345Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "from appbuilder.utils.chainlit_deploy import ChainlitRuntime\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", + "\n", + "component = appbuilder.Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\"\n", + ")\n", + "\n", + "agent = ChainlitRuntime(component=component)\n", + "agent.chainlit_component(port=8091)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5fc5bc38-6bc5-4187-a8fd-f802d77d89fa", + "metadata": {}, + "source": [ + "### 2. ChainlitRuntime 参数说明" + ] + }, + { + "cell_type": "markdown", + "id": "c2364c35", + "metadata": {}, + "source": [ + "#### 2.1 类初始化参数说明\n", + "\n", + "ChainlitRuntime 初始化接受4个参数。\n", + "\n", + "| 参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |\n", + "|--|--|--|--|--|\n", + "| component | Component | 是 | 可运行的 Component, 该 Component 需要实现 run(message, stream, **args) 方法。 | Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\") |\n", + "| user_session_config | sqlalchemy.engine.URL\\|Str\\|None | 否 | 会话 Session 数据存储的数据库配置,遵循 sqlalchemy 后端定义,可参考[文档](https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls)。默认使用 sqlite:///user_session.db,即本地的 SQLite 存储 | \"sqlite:///user_session.db\" |\n", + "| user_session| UserSession | 否 | 用户会话管理器,如果不指定则自动生成一个默认的 UserSession | UserSession(user_session_config) |\n", + "| tool_choice| ToolChoice| 否 | 可用于Agent强制执行的组件工具 | |" + ] + }, + { + "cell_type": "markdown", + "id": "61923b00", + "metadata": {}, + "source": [ + "## 高级用法" + ] + }, + { + "cell_type": "markdown", + "id": "a2303c76", + "metadata": {}, + "source": [ + "### 1. 一键服务化组件 \n", + "ChainlitRuntime 可以快速组件以服务的形式运行,支持对话框交互。" + ] + }, + { + "cell_type": "markdown", + "id": "673c7565", + "metadata": {}, + "source": [ + "**1.1 对话框交互组件-文本格式**\n", + "\n", + "基于 chainlit 的对话框交互对被服务化的组件的 message 参数更加严格,要求能够接受 Str 的基础类型。\n", + "\n", + "执行下面的代码,会启动一个 chainlit 页面,页面地址:0.0.0.0:8091" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e485544f", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "from appbuilder.utils.chainlit_deploy import ChainlitRuntime\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", + "\n", + "component = appbuilder.Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\"\n", + ")\n", + "\n", + "agent = ChainlitRuntime(component=component)\n", + "agent.chainlit_component(port=8091)" + ] + }, + { + "cell_type": "markdown", + "id": "4d63bece", + "metadata": {}, + "source": [ + "Chainlit Demo页面示意图如下所示,\n", + "\n", + "![chainlit demo](image/agent_runtime_with_chainlit_demo.png)" + ] + }, + { + "cell_type": "markdown", + "id": "e6a93195", + "metadata": {}, + "source": [ + "**1.2 对话框交互组件-其他格式**\n", + "\n", + "对输出其他类型的组件,如图片、音频、代码等组件,提供渲染效果。\n", + "\n", + "注意:该接口目前只支持新协议组件,即appbuilder.core.component.v2实现下的组件。\n", + "\n", + "执行下面的代码,会启动一个 chainlit 页面,页面地址:0.0.0.0:8092" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "07348a19", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "from appbuilder.utils.chainlit_deploy import ChainlitRuntime\n", + "from appbuilder.core.components.v2 import SimilarQuestion\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", + "\n", + "component = SimilarQuestion()\n", + "agent = ChainlitRuntime(component=component)\n", + "agent.chainlit_component_debug(\n", + " port=8092, \n", + " tool_eval_args={},\n", + " query_name = \"query\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a92b9075", + "metadata": {}, + "source": [ + "Chainlit Demo页面示意图如下所示,\n", + "\n", + "![chainlit demo](image/agent_runtime_with_chainlit_component_debug.jpg)" + ] + }, + { + "cell_type": "markdown", + "id": "a074f367", + "metadata": {}, + "source": [ + "**1.2 对话框交互AppBuilderClient**\n", + "\n", + "基于 chainlit 的对话框交互AppBuilderClient,可实现对话交互。支持工作流Agent、自主规划Agent应用。\n", + "\n", + "执行下面的代码,会启动一个 chainlit 页面,页面地址:0.0.0.0:8091。可在页面上上传文档(可选)、执行对话。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a75e035", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "from appbuilder.utils.chainlit_deploy import ChainlitRuntime\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = \"...\"\n", + "# 使用之前,在官网个人空间获取应用ID,如下图\n", + "app_id= \"...\"\n", + "client = appbuilder.AppBuilderClient(app_id)\n", + "agent = ChainlitRuntime(client)\n", + "agent.chainlit_agent(port=8091)" + ] + }, + { + "cell_type": "markdown", + "id": "d5162e29", + "metadata": {}, + "source": [ + "在官网个人空间获取应用ID\n", + "![get app_id](../app_builder_resources/app_id.png)\n", + "\n", + "使用服务上传文件并对话示例图如下所示\n", + "![chainlit demo](./image/agent_runtime_with_chainlit_agent.png)\n", + "\n", + "使用工作流Agent应用对话示例如下图所示\n", + "![chainlit demo](./image/agent_runtime_with_chainlit_chatflow.png)" + ] + }, + { + "cell_type": "markdown", + "id": "2392f46d", + "metadata": {}, + "source": [ + "### 2. Session 数据管理\n", + "请参考:[user_session.ipynb](./user_session.ipynb)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/cookbooks/components/flask_runtime.ipynb b/cookbooks/components/flask_runtime.ipynb new file mode 100644 index 000000000..b901ee4bf --- /dev/null +++ b/cookbooks/components/flask_runtime.ipynb @@ -0,0 +1,400 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "f802e64d-4eaa-445d-a48a-1042a91bc394", + "metadata": { + "tags": [] + }, + "source": [ + "# 基于FlaskRuntime服务化组件\n", + "\n", + "## 目标\n", + "使用 FlaskRuntime 对组件进行服务化。\n", + "\n", + "FlaskRuntime 是对组件(Component)的服务化封装,具体有如下几个功能:\n", + "- 一键服务化组件: 使得组件能够以服务的形式运行,支持 API 调用。\n", + "- Session 数据管理: 提供 Session 数据的管理功能,允许跟踪和存储用户会话数据。\n", + "- 请求时鉴权: 支持在请求时进行认证,确保安全性。\n", + "\n", + "\n", + "## 准备工作\n", + "### 安装Python SDK\n", + "\n", + "appbuilder 支持使用 pip 安装(要求Python >= 3.8),并且 FlaskRuntime 服务化组件依赖 `appbuilder-sdk[serve]`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2939356f-61c2-42e9-9e0c-fc6729c193f6", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "pip install appbuilder-sdk 'appbuilder-sdk[serve]'" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "aeb2fa55-075f-48df-a9fb-8b40d9900684", + "metadata": {}, + "source": [ + "## 基本用法\n", + "\n", + "### 快速开始\n", + "\n", + "下面的示例会基于 Playground 组件,在 8091 端口部署 Web 服务: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41559341-fd7a-478c-a08b-1477d79e9d41", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-18T06:24:26.982459Z", + "start_time": "2023-12-18T06:23:53.771345Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "from appbuilder.utils.flask_deploy import FlaskRuntime\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", + "\n", + "component = appbuilder.Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\"\n", + ")\n", + "\n", + "agent = FlaskRuntime(component=component)\n", + "agent.serve(port=8091)" + ] + }, + { + "cell_type": "markdown", + "id": "b71e24eb", + "metadata": {}, + "source": [ + "通过 Shell 命令测试启动的服务, 请求 Body 为组件 run 方法的入参:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12c71fa5", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "curl --location 'http://0.0.0.0:8091/chat' \\\n", + "--header 'Content-Type: application/json' \\\n", + "--data '{\n", + " \"message\": \"海淀区的面积是多少\",\n", + " \"stream\": false\n", + "}'" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5fc5bc38-6bc5-4187-a8fd-f802d77d89fa", + "metadata": {}, + "source": [ + "## FlaskRuntime 参数说明" + ] + }, + { + "cell_type": "markdown", + "id": "c2364c35", + "metadata": {}, + "source": [ + "### 1. 类初始化参数说明\n", + "\n", + "FlaskRuntime 初始化接受两个参数。\n", + "\n", + "| 参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |\n", + "|--|--|--|--|--|\n", + "| component | Component | 是 | 可运行的 Component, 该 Component 需要实现 run(message, stream, **args) 方法。 | Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\") |\n", + "| user_session_config | sqlalchemy.engine.URL\\|Str\\|None | 否 | 会话 Session 数据存储的数据库配置,遵循 sqlalchemy 后端定义,可参考[文档](https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls)。默认使用 sqlite:///user_session.db,即本地的 SQLite 存储 | \"sqlite:///user_session.db\" |\n", + "| user_session| UserSession | 否 | 用户会话管理器,如果不指定则自动生成一个默认的 UserSession | UserSession(user_session_config) |" + ] + }, + { + "cell_type": "markdown", + "id": "62e1af06", + "metadata": {}, + "source": [ + "### 2. API 服务参数\n", + "\n", + "#### 2.1 请求参数\n", + "\n", + "**接口定义**\n", + "\n", + "| URL | Method |\n", + "|--|--|\n", + "| /chat | POST |\n", + "\n", + "**Header 参数**\n", + "\n", + "| 参数名称 | 是否必须 | 描述 | 示例值 |\n", + "|--|--|--|--|\n", + "| Content-Type | 是 | 必须设置为\"application/json\" | \"application/json\" |\n", + "| X-Appbuilder-Token | 否 | 开启请求时认证能力时需要带入 APPBUILDER_TOKEN 进行鉴权 | 前往千帆AppBuilder官网创建密钥,流程详见[文档](https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥) |\n", + "\n", + "**Body 参数**\n", + "\n", + "| 参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |\n", + "|--|--|--|--|--|\n", + "| message | Any | 是 | 透传到 component 的 run 方法的 message 参数 | \"海淀区的面积是多少\" |\n", + "| stream | Bool | 否 | 是否流式调用。透传到 component 的 run 方法的 stream 参数。默认为 false | false |\n", + "| session_id | Str | 否 | 用于标示同一个会话(Session)。如果不传该值,后端会自动生成 session_id,在响应参数中返回 | \"99680089-5acb-4298-9ade-a1a3f6c28102\" |\n", + "| 其他参数 | Any | 否 | 透传到 component 的 run 方法 | - |\n", + "\n", + "\n", + "#### 2.2 响应参数\n", + "分为非流式响应和流式响应。\n", + "\n", + "**非流式响应**\n", + "\n", + "| 参数名称 | 参数类型 | 描述 | 示例值 |\n", + "|--|--|--|--|\n", + "| code | Int | 错误码。值为0表示成功,否则为失败。非0错误详见错误码部分描述 | 0 |\n", + "| message | Str | 错误信息描述。 | \"Missing input variable query in message ['海淀区的面积是多少']\" |\n", + "| result | Object | 请求结果 | - |\n", + "| + answer_message | Object | 组件返回值,由返回的 Message 序列化得到 | {\"content\":\"海淀区是北京市的一个区,位于北京市主城区西部和西北部,东与西城区、朝阳区相邻,南与丰台区毗连,西与石景山区、门头沟区交界,北与昌平区接壤。海淀区的面积为**431平方千米**,约占北京市总面积的2.6%。\",\"extra\":{},\"id\":\"6b4e5019-a708-4bc5-a6ec-595fb4285677\",\"mtype\":\"dict\",\"name\":\"msg\"} |\n", + "| + session_id | Str | 用于标示同一个会话(Session) | \"99680089-5acb-4298-9ade-a1a3f6c28102\" |\n", + "\n", + "**流式响应**\n", + "\n", + "流式数据以追加的形式返回。流式和非流式的数据结构一致,不再描述。\n", + "\n", + "#### 2.3 响应示例\n", + "\n", + "分为非流式响应和流式响应。\n", + "\n", + "**非流式响应**\n", + "\n", + "```shell\n", + "{\n", + " \"code\": 0,\n", + " \"message\": \"\",\n", + " \"result\": {\n", + " \"answer_message\": {\n", + " \"content\": \"海淀区是北京市的一个区,位于北京市主城区西部和西北部,东与西城区、朝阳区相邻,南与丰台区毗连,西与石景山区、门头沟区交界,北与昌平区接壤。海淀区的面积为**431平方千米**,约占北京市总面积的2.6%。\",\n", + " \"extra\": {},\n", + " \"id\": \"6b4e5019-a708-4bc5-a6ec-595fb4285677\",\n", + " \"mtype\": \"dict\",\n", + " \"name\": \"msg\"\n", + " },\n", + " \"session_id\": \"99680089-5acb-4298-9ade-a1a3f6c28102\"\n", + " }\n", + "}\n", + "```\n", + "\n", + "**流式响应**\n", + "\n", + "```shell\n", + "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \"海淀区\", \"extra\": {}}}}\n", + "\n", + "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \",隶属于北京市,位于北京市主城区西部和西北部,东与西城区、朝阳区相邻,南与丰台区毗连,\", \"extra\": {}}}}\n", + "\n", + "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \"西与石景山区、门头沟区交界,北与昌平区接壤,总面积**431平方千米**。\", \"extra\": {}}}}\n", + "\n", + "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \"\", \"extra\": {}}}}\n", + "```\n", + "\n", + "#### 2.4 错误码\n", + "| 错误码 | 描述 |\n", + "|--|--|\n", + "| 400 | 客户端请求参数错误 |\n", + "| 1000 | 服务端执行错误 |" + ] + }, + { + "cell_type": "markdown", + "id": "61923b00", + "metadata": {}, + "source": [ + "## 高级用法" + ] + }, + { + "cell_type": "markdown", + "id": "a2303c76", + "metadata": {}, + "source": [ + "### 1. 一键服务化组件 \n", + "FlaskRuntime 可以快速组件以服务的形式运行,支持 API 调用和对话框交互。\n", + "\n", + "**1.1 API调用**\n", + "\n", + "API 调用的基础用法在快速开始小结已经给出,这里不再赘述。\n", + "\n", + "下面介绍使用 `gunicorn` 启动生产级 Web 服务的方法,`gunicorn` 是一个适用于 UNIX 的 Python WSGI HTTP 服务器,详见[项目链接](https://github.com/benoitc/gunicorn)。\n", + "\n", + "首先创建 `app.py` 文件,暴露 Flask App:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fde5cc94", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "from appbuilder.utils.flask_deploy import FlaskRuntime\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", + "\n", + "def get_flask_app():\n", + " component = appbuilder.Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\"\n", + " )\n", + " agent = FlaskRuntime(component=component)\n", + " return agent.create_flask_app()" + ] + }, + { + "cell_type": "markdown", + "id": "a41ef57b", + "metadata": {}, + "source": [ + "基于 `gunicorn` 启动生产级服务:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2077833f", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "# 服务工作进程数\n", + "SERVER_WORKER_AMOUNT=8\n", + "# 服务工作进程启动方式\n", + "SERVER_WORKER_CLASS=gevent\n", + "# 服务超时时间\n", + "GUNICORN_TIMEOUT=60\n", + "\n", + "gunicorn \\\n", + " --bind \"0.0.0.0:8091\" \\\n", + " --workers ${SERVER_WORKER_AMOUNT} \\\n", + " --worker-class ${SERVER_WORKER_CLASS} \\\n", + " --timeout ${GUNICORN_TIMEOUT} \\\n", + " \"app:get_flask_app()\"" + ] + }, + { + "cell_type": "markdown", + "id": "2392f46d", + "metadata": {}, + "source": [ + "### 2. Session 数据管理\n", + "请参考:[user_session.ipynb](./user_session.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "1c352077", + "metadata": {}, + "source": [ + "### 3. 请求时鉴权\n", + "FlaskRuntime 支持在请求时进行认证,确保安全性。\n", + "\n", + "使用该能力,在初始化组件时需要设置 lazy 鉴权:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d505a1c", + "metadata": {}, + "outputs": [], + "source": [ + "import appbuilder\n", + "from appbuilder.utils.flask_deploy import FlaskRuntime\n", + "\n", + "# 无需配置 APPBUILDER_TOKEN 环境变量\n", + "\n", + "component = appbuilder.Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\",\n", + " lazy_certification=True, # 设置 lazy 鉴权,在创建时不进行认证\n", + ")\n", + "\n", + "agent = FlaskRuntime(component=component)\n", + "agent.serve(port=8091)" + ] + }, + { + "cell_type": "markdown", + "id": "6a1add96", + "metadata": {}, + "source": [ + "当初始化组件时进行了 lazy 鉴权,请求时请求头必须带上 `X-Appbuilder-Token` (即Appbuilder密钥,获取流程详见[千帆AppBuilder官网创建密钥](https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥))进行鉴权:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53c5a1d2", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "curl --location 'http://0.0.0.0:8091/chat' \\\n", + " --header 'Content-Type: application/json' \\\n", + " --header 'X-Appbuilder-Token: ...' \\\n", + " --data '{\n", + " \"message\": \"海淀区的面积是多少\",\n", + " \"stream\": false\n", + " }'" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/cookbooks/components/image/agent_runtime_with_chainlit_component_debug.jpg b/cookbooks/components/image/agent_runtime_with_chainlit_component_debug.jpg new file mode 100644 index 0000000000000000000000000000000000000000..335e6f8493e10c4df4abf990be034d4a866e551e GIT binary patch literal 489284 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 z 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 z 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ÆgA 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 JZ^nU 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 z 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 A6951J literal 0 HcmV?d00001 diff --git a/cookbooks/components/rag_with_baidusearch.ipynb b/cookbooks/components/rag_with_baidusearch.ipynb index 0fafa836c..cbd99e8bf 100644 --- a/cookbooks/components/rag_with_baidusearch.ipynb +++ b/cookbooks/components/rag_with_baidusearch.ipynb @@ -99,7 +99,7 @@ "id": "5fc5bc38-6bc5-4187-a8fd-f802d77d89fa", "metadata": {}, "source": [ - "### (可选) 使用 AgentRuntime 启动 chainlit 页面调试\n", + "### (可选) 使用 ChainlitRuntime 启动 chainlit 页面调试\n", "这部分代码依赖 `appbuilder-sdk[serve]`,如果没有安装,可以执行下面的命令安装:" ] }, @@ -129,9 +129,11 @@ "metadata": {}, "outputs": [], "source": [ - "agent = appbuilder.AgentRuntime(component=component)\n", + "import appbuidler\n", + "from appbuilder.utils.chainlit_deploy import ChainlitRuntime\n", + "agent = ChainlitRuntime(component=component)\n", "# 启动 chainlit 服务\n", - "agent.chainlit_demo(port=8091)" + "agent.chainlit_component(port=8091)" ] }, { @@ -140,7 +142,7 @@ "id": "16a8aa38-7a33-4e27-bca4-00900cfe1641", "metadata": {}, "source": [ - "### (可选) 使用 AgentRuntime 启动 HTTP 服务\n", + "### (可选) 使用 FlaskRuntime 启动 HTTP 服务\n", "这部分代码依赖 `appbuilder-sdk[serve]`,如果没有安装,可以执行下面的命令安装:" ] }, @@ -170,6 +172,10 @@ "metadata": {}, "outputs": [], "source": [ + "import appbuilder\n", + "from appbuilder.utils.flask_deploy import FlaskRuntime\n", + "agent = FlaskRuntime(component=component)\n", + "# 启动 flask 服务\n", "agent.serve(port=8092)" ] }, diff --git a/cookbooks/components/agent_runtime.ipynb b/cookbooks/components/user_session.ipynb similarity index 59% rename from cookbooks/components/agent_runtime.ipynb rename to cookbooks/components/user_session.ipynb index bb73547e6..d1fd03e20 100644 --- a/cookbooks/components/agent_runtime.ipynb +++ b/cookbooks/components/user_session.ipynb @@ -1,406 +1,14 @@ { "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "id": "f802e64d-4eaa-445d-a48a-1042a91bc394", - "metadata": { - "tags": [] - }, - "source": [ - "# 基于AgentRuntime服务化组件\n", - "\n", - "## 目标\n", - "使用 AgentRuntime 对组件进行服务化。\n", - "\n", - "AgentRuntime 是对组件(Component)的服务化封装,具体有如下几个功能:\n", - "- 一键服务化组件: 使得组件能够以服务的形式运行,支持 API 调用和对话框交互。\n", - "- Session 数据管理: 提供 Session 数据的管理功能,允许跟踪和存储用户会话数据。\n", - "- 请求时鉴权: 支持在请求时进行认证,确保安全性。\n", - "\n", - "\n", - "## 准备工作\n", - "### 安装Python SDK\n", - "\n", - "appbuilder 支持使用 pip 安装(要求Python >= 3.8),并且 AgentRuntime 服务化组件依赖 `appbuilder-sdk[serve]`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2939356f-61c2-42e9-9e0c-fc6729c193f6", - "metadata": { - "vscode": { - "languageId": "shellscript" - } - }, - "outputs": [], - "source": [ - "pip install appbuilder-sdk 'appbuilder-sdk[serve]'" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "aeb2fa55-075f-48df-a9fb-8b40d9900684", - "metadata": {}, - "source": [ - "## 基本用法\n", - "\n", - "### 快速开始\n", - "\n", - "下面的示例会基于 Playground 组件,在 8091 端口部署 Web 服务: " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "41559341-fd7a-478c-a08b-1477d79e9d41", - "metadata": { - "ExecuteTime": { - "end_time": "2023-12-18T06:24:26.982459Z", - "start_time": "2023-12-18T06:23:53.771345Z" - } - }, - "outputs": [], - "source": [ - "import os\n", - "import appbuilder\n", - "\n", - "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", - "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", - "\n", - "component = appbuilder.Playground(\n", - " prompt_template=\"{query}\",\n", - " model=\"ERNIE-Bot\"\n", - ")\n", - "\n", - "agent = appbuilder.AgentRuntime(component=component)\n", - "agent.serve(port=8091)" - ] - }, - { - "cell_type": "markdown", - "id": "b71e24eb", - "metadata": {}, - "source": [ - "通过 Shell 命令测试启动的服务, 请求 Body 为组件 run 方法的入参:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "12c71fa5", - "metadata": { - "vscode": { - "languageId": "shellscript" - } - }, - "outputs": [], - "source": [ - "curl --location 'http://0.0.0.0:8091/chat' \\\n", - "--header 'Content-Type: application/json' \\\n", - "--data '{\n", - " \"message\": \"海淀区的面积是多少\",\n", - " \"stream\": false\n", - "}'" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "5fc5bc38-6bc5-4187-a8fd-f802d77d89fa", - "metadata": {}, - "source": [ - "## AgentRuntime 参数说明" - ] - }, - { - "cell_type": "markdown", - "id": "c2364c35", - "metadata": {}, - "source": [ - "### 1. 类初始化参数说明\n", - "\n", - "AgentRuntime 初始化接受两个参数。\n", - "\n", - "| 参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |\n", - "|--|--|--|--|--|\n", - "| component | Component | 是 | 可运行的 Component, 该 Component 需要实现 run(message, stream, **args) 方法。 | Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\") |\n", - "| user_session_config | sqlalchemy.engine.URL\\|Str\\|None | 否 | 会话 Session 数据存储的数据库配置,遵循 sqlalchemy 后端定义,可参考[文档](https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls)。默认使用 sqlite:///user_session.db,即本地的 SQLite 存储 | \"sqlite:///user_session.db\" |" - ] - }, - { - "cell_type": "markdown", - "id": "62e1af06", - "metadata": {}, - "source": [ - "### 2. API 服务参数\n", - "\n", - "#### 2.1 请求参数\n", - "\n", - "**接口定义**\n", - "\n", - "| URL | Method |\n", - "|--|--|\n", - "| /chat | POST |\n", - "\n", - "**Header 参数**\n", - "\n", - "| 参数名称 | 是否必须 | 描述 | 示例值 |\n", - "|--|--|--|--|\n", - "| Content-Type | 是 | 必须设置为\"application/json\" | \"application/json\" |\n", - "| X-Appbuilder-Token | 否 | 开启请求时认证能力时需要带入 APPBUILDER_TOKEN 进行鉴权 | 前往千帆AppBuilder官网创建密钥,流程详见[文档](https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥) |\n", - "\n", - "**Body 参数**\n", - "\n", - "| 参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |\n", - "|--|--|--|--|--|\n", - "| message | Any | 是 | 透传到 component 的 run 方法的 message 参数 | \"海淀区的面积是多少\" |\n", - "| stream | Bool | 否 | 是否流式调用。透传到 component 的 run 方法的 stream 参数。默认为 false | false |\n", - "| session_id | Str | 否 | 用于标示同一个会话(Session)。如果不传该值,后端会自动生成 session_id,在响应参数中返回 | \"99680089-5acb-4298-9ade-a1a3f6c28102\" |\n", - "| 其他参数 | Any | 否 | 透传到 component 的 run 方法 | - |\n", - "\n", - "\n", - "#### 2.2 响应参数\n", - "分为非流式响应和流式响应。\n", - "\n", - "**非流式响应**\n", - "\n", - "| 参数名称 | 参数类型 | 描述 | 示例值 |\n", - "|--|--|--|--|\n", - "| code | Int | 错误码。值为0表示成功,否则为失败。非0错误详见错误码部分描述 | 0 |\n", - "| message | Str | 错误信息描述。 | \"Missing input variable query in message ['海淀区的面积是多少']\" |\n", - "| result | Object | 请求结果 | - |\n", - "| + answer_message | Object | 组件返回值,由返回的 Message 序列化得到 | {\"content\":\"海淀区是北京市的一个区,位于北京市主城区西部和西北部,东与西城区、朝阳区相邻,南与丰台区毗连,西与石景山区、门头沟区交界,北与昌平区接壤。海淀区的面积为**431平方千米**,约占北京市总面积的2.6%。\",\"extra\":{},\"id\":\"6b4e5019-a708-4bc5-a6ec-595fb4285677\",\"mtype\":\"dict\",\"name\":\"msg\"} |\n", - "| + session_id | Str | 用于标示同一个会话(Session) | \"99680089-5acb-4298-9ade-a1a3f6c28102\" |\n", - "\n", - "**流式响应**\n", - "\n", - "流式数据以追加的形式返回。流式和非流式的数据结构一致,不再描述。\n", - "\n", - "#### 2.3 响应示例\n", - "\n", - "分为非流式响应和流式响应。\n", - "\n", - "**非流式响应**\n", - "\n", - "```shell\n", - "{\n", - " \"code\": 0,\n", - " \"message\": \"\",\n", - " \"result\": {\n", - " \"answer_message\": {\n", - " \"content\": \"海淀区是北京市的一个区,位于北京市主城区西部和西北部,东与西城区、朝阳区相邻,南与丰台区毗连,西与石景山区、门头沟区交界,北与昌平区接壤。海淀区的面积为**431平方千米**,约占北京市总面积的2.6%。\",\n", - " \"extra\": {},\n", - " \"id\": \"6b4e5019-a708-4bc5-a6ec-595fb4285677\",\n", - " \"mtype\": \"dict\",\n", - " \"name\": \"msg\"\n", - " },\n", - " \"session_id\": \"99680089-5acb-4298-9ade-a1a3f6c28102\"\n", - " }\n", - "}\n", - "```\n", - "\n", - "**流式响应**\n", - "\n", - "```shell\n", - "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \"海淀区\", \"extra\": {}}}}\n", - "\n", - "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \",隶属于北京市,位于北京市主城区西部和西北部,东与西城区、朝阳区相邻,南与丰台区毗连,\", \"extra\": {}}}}\n", - "\n", - "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \"西与石景山区、门头沟区交界,北与昌平区接壤,总面积**431平方千米**。\", \"extra\": {}}}}\n", - "\n", - "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \"\", \"extra\": {}}}}\n", - "```\n", - "\n", - "#### 2.4 错误码\n", - "| 错误码 | 描述 |\n", - "|--|--|\n", - "| 400 | 客户端请求参数错误 |\n", - "| 1000 | 服务端执行错误 |" - ] - }, - { - "cell_type": "markdown", - "id": "61923b00", - "metadata": {}, - "source": [ - "## 高级用法" - ] - }, - { - "cell_type": "markdown", - "id": "a2303c76", - "metadata": {}, - "source": [ - "### 1. 一键服务化组件 \n", - "AgentRuntime 可以快速组件以服务的形式运行,支持 API 调用和对话框交互。\n", - "\n", - "**1.1 API调用**\n", - "\n", - "API 调用的基础用法在快速开始小结已经给出,这里不再赘述。\n", - "\n", - "下面介绍使用 `gunicorn` 启动生产级 Web 服务的方法,`gunicorn` 是一个适用于 UNIX 的 Python WSGI HTTP 服务器,详见[项目链接](https://github.com/benoitc/gunicorn)。\n", - "\n", - "首先创建 `app.py` 文件,暴露 Flask App:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fde5cc94", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import appbuilder\n", - "\n", - "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", - "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", - "\n", - "def get_flask_app():\n", - " component = appbuilder.Playground(\n", - " prompt_template=\"{query}\",\n", - " model=\"ERNIE-Bot\"\n", - " )\n", - " agent = appbuilder.AgentRuntime(component=component)\n", - " return agent.create_flask_app()" - ] - }, - { - "cell_type": "markdown", - "id": "a41ef57b", - "metadata": {}, - "source": [ - "基于 `gunicorn` 启动生产级服务:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2077833f", - "metadata": { - "vscode": { - "languageId": "shellscript" - } - }, - "outputs": [], - "source": [ - "# 服务工作进程数\n", - "SERVER_WORKER_AMOUNT=8\n", - "# 服务工作进程启动方式\n", - "SERVER_WORKER_CLASS=gevent\n", - "# 服务超时时间\n", - "GUNICORN_TIMEOUT=60\n", - "\n", - "gunicorn \\\n", - " --bind \"0.0.0.0:8091\" \\\n", - " --workers ${SERVER_WORKER_AMOUNT} \\\n", - " --worker-class ${SERVER_WORKER_CLASS} \\\n", - " --timeout ${GUNICORN_TIMEOUT} \\\n", - " \"app:get_flask_app()\"" - ] - }, - { - "cell_type": "markdown", - "id": "673c7565", - "metadata": {}, - "source": [ - "**1.2 对话框交互**\n", - "\n", - "基于 chainlit 的对话框交互对被服务化的组件的 message 参数更加严格,要求能够接受 Str 的基础类型。\n", - "\n", - "执行下面的代码,会启动一个 chainlit 页面,页面地址:0.0.0.0:8091" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e485544f", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import appbuilder\n", - "\n", - "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", - "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", - "\n", - "component = appbuilder.Playground(\n", - " prompt_template=\"{query}\",\n", - " model=\"ERNIE-Bot\"\n", - ")\n", - "\n", - "agent = appbuilder.AgentRuntime(component=component)\n", - "agent.chainlit_demo(port=8091)" - ] - }, - { - "cell_type": "markdown", - "id": "4d63bece", - "metadata": {}, - "source": [ - "Chainlit Demo页面示意图如下所示,\n", - "\n", - "![chainlit demo](image/agent_runtime_with_chainlit_demo.png)" - ] - }, - { - "cell_type": "markdown", - "id": "a074f367", - "metadata": {}, - "source": [ - "**1.3 对话框交互AppBuilderClient**\n", - "\n", - "基于 chainlit 的对话框交互AppBuilderClient,可实现对话交互。支持工作流Agent、自主规划Agent应用。\n", - "\n", - "执行下面的代码,会启动一个 chainlit 页面,页面地址:0.0.0.0:8091。可在页面上上传文档(可选)、执行对话。" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0a75e035", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import appbuilder\n", - "\n", - "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", - "os.environ[\"APPBUILDER_TOKEN\"] = \"...\"\n", - "# 使用之前,在官网个人空间获取应用ID,如下图\n", - "app_id= \"...\"\n", - "client = appbuilder.AppBuilderClient(app_id)\n", - "agent = appbuilder.AgentRuntime(client)\n", - "agent.chainlit_agent(port=8091)" - ] - }, - { - "cell_type": "markdown", - "id": "d5162e29", - "metadata": {}, - "source": [ - "在官网个人空间获取应用ID\n", - "![get app_id](../app_builder_resources/app_id.png)\n", - "\n", - "使用服务上传文件并对话示例图如下所示\n", - "![chainlit demo](./image/agent_runtime_with_chainlit_agent.png)\n", - "\n", - "使用工作流Agent应用对话示例如下图所示\n", - "![chainlit demo](./image/agent_runtime_with_chainlit_chatflow.png)" - ] - }, { "cell_type": "markdown", "id": "2392f46d", "metadata": {}, "source": [ - "### 2. Session 数据管理\n", - "AgentRuntime 提供 Session 数据的管理功能,允许跟踪和存储用户会话数据。一般只有在二次开发的组件需要使用该能力。\n", + "## Session 数据管理\n", + "FlaskRuntime和ChainlitRuntime 提供 Session 数据的管理功能,允许跟踪和存储用户会话数据。一般只有在二次开发的组件需要使用该能力。\n", "\n", - "**2.1 二次开发组件**\n", + "**1、 二次开发组件**\n", "\n", "二次开发的组件需要重写组件的 run(message, stream, **args)方法,并且至少需要有 message 和 stream 两个参数。\n", "\n", @@ -420,7 +28,7 @@ "import logging\n", "from appbuilder.core.component import Component\n", "from appbuilder import (\n", - " AgentRuntime, UserSession, Message, QueryRewrite, Playground,\n", + " UserSession, Message, QueryRewrite, Playground,\n", ")\n", "\n", "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", @@ -471,9 +79,9 @@ "id": "480fd56d", "metadata": {}, "source": [ - "**2.2 会话数据存储数据库**\n", + "**2、 会话数据存储数据库**\n", "\n", - "使用 AgentRuntime 对 Component 服务化,会话数据会被存储于数据库。\n", + "使用 FlaskRuntime和ChainlitRuntime 对 Component 服务化,会话数据会被存储于数据库。\n", "下面的代码以 SQLite 为例展示该能力,更多数据库配置详见[文档](https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls)" ] }, @@ -484,79 +92,21 @@ "metadata": {}, "outputs": [], "source": [ + "import appbuilder\n", + "from appbuilder.utils.flask_deploy import FlaskRuntime\n", "user_session_config = \"sqlite:///foo.db\"\n", - "agent = appbuilder.AgentRuntime(\n", + "agent = FlaskRuntime(\n", " component=playground_with_history_component, \n", " user_session_config=user_session_config)\n", "agent.serve(port=8091)" ] }, - { - "cell_type": "markdown", - "id": "e7dc38ec", - "metadata": {}, - "source": [ - "### 3. 请求时鉴权\n", - "AgentRuntime 支持在请求时进行认证,确保安全性。\n", - "\n", - "使用该能力,在初始化组件时需要设置 lazy 鉴权:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2125bf4f", - "metadata": {}, - "outputs": [], - "source": [ - "import appbuilder\n", - "\n", - "# 无需配置 APPBUILDER_TOKEN 环境变量\n", - "\n", - "component = appbuilder.Playground(\n", - " prompt_template=\"{query}\",\n", - " model=\"ERNIE-Bot\",\n", - " lazy_certification=True, # 设置 lazy 鉴权,在创建时不进行认证\n", - ")\n", - "\n", - "agent = appbuilder.AgentRuntime(component=component)\n", - "agent.serve(port=8091)" - ] - }, - { - "cell_type": "markdown", - "id": "bbf35a0a", - "metadata": {}, - "source": [ - "当初始化组件时进行了 lazy 鉴权,请求时请求头必须带上 `X-Appbuilder-Token` (即Appbuilder密钥,获取流程详见[千帆AppBuilder官网创建密钥](https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥))进行鉴权:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "60dcfa37", - "metadata": { - "vscode": { - "languageId": "shellscript" - } - }, - "outputs": [], - "source": [ - "curl --location 'http://0.0.0.0:8091/chat' \\\n", - " --header 'Content-Type: application/json' \\\n", - " --header 'X-Appbuilder-Token: ...' \\\n", - " --data '{\n", - " \"message\": \"海淀区的面积是多少\",\n", - " \"stream\": false\n", - " }'" - ] - }, { "cell_type": "markdown", "id": "f8584416", "metadata": {}, "source": [ - "### 4. 查看user_session.db储存信息\n", + "**3、 查看user_session.db储存信息**\n", "\n", "\n", "使用该能力,查看用户对话信息。" diff --git a/cookbooks/live_broadcast_material/2024_05_16/service_deploy.py b/cookbooks/live_broadcast_material/2024_05_16/service_deploy.py index a6e506104..655e87fe9 100644 --- a/cookbooks/live_broadcast_material/2024_05_16/service_deploy.py +++ b/cookbooks/live_broadcast_material/2024_05_16/service_deploy.py @@ -14,6 +14,7 @@ import os import appbuilder +from appbuilder.utils.flask_deploy import FlaskRuntime os.environ["APPBUILDER_TOKEN"] = "密钥" component = appbuilder.Playground( @@ -21,5 +22,5 @@ model="ERNIE-Bot" ) -agent = appbuilder.AgentRuntime(component=component) +agent = FlaskRuntime(component=component) agent.serve(port=8091) diff --git a/docs/BasisModule/Deployment/AgentChainlit.md b/docs/BasisModule/Deployment/AgentChainlit.md deleted file mode 100644 index b42173fc8..000000000 --- a/docs/BasisModule/Deployment/AgentChainlit.md +++ /dev/null @@ -1,5 +0,0 @@ -# 交互式前端部署 - -## 基础组件基于Chainlit提供交互式前端页面 - -请参考 [组件服务化部署](https://github.com/baidubce/app-builder/blob/master/cookbooks/components/agent_runtime.ipynb) \ No newline at end of file diff --git a/docs/BasisModule/Deployment/agentruntime.md b/docs/BasisModule/Deployment/chainlit_deploy.md similarity index 65% rename from docs/BasisModule/Deployment/agentruntime.md rename to docs/BasisModule/Deployment/chainlit_deploy.md index decf02965..9c2286ce9 100644 --- a/docs/BasisModule/Deployment/agentruntime.md +++ b/docs/BasisModule/Deployment/chainlit_deploy.md @@ -1,13 +1,13 @@ -# `AgentRuntime`类 +# `ChainlitRuntime`类 ## 简介 -AgentRuntime 是对组件调用的服务化封装,开发者不是必须要用 AgentRuntime 才能运行自己的组件服务。但 AgentRuntime 可以快速帮助开发者服务化组件服务,并且提供API、对话框等部署方式。此外,结合 Component 和 Message 自带的运行和调试接口,可以方便开发者快速获得一个调试 Agent 的服务。 +ChainlitRuntime 是对组件和应用调用的服务化封装,开发者不是必须要用 ChainlitRuntime 才能运行自己的组件服务。但 ChainlitRuntime 可以快速帮助开发者服务化组件服务,并且提供API、对话框等部署方式。此外,结合 Component 和 Message 自带的运行和调试接口,可以方便开发者快速获得一个调试 Agent 的服务。 ## Python基本用法 -### 1、实例化`AgentRuntime() -> AgentRuntime` +### 1、实例化`ChainlitRuntime() -> ChainlitRuntime` #### 方法参数 @@ -15,6 +15,8 @@ AgentRuntime 是对组件调用的服务化封装,开发者不是必须要用 |--------|--------|------------|-----------| | component | Component | 可运行的 Component,需要实现 run(message, stream, **args) 方法 | "正确的component组件或client" | | user_session_config | sqlalchemy.engine.URL、str、None | Session 输出存储配置字符串。默认使用 sqlite:///user_session.db | "正确的存储配置字符串" | +| user_session| UserSession | 否 | 用户会话管理器,如果不指定则自动生成一个默认的 UserSession | UserSession(user_session_config) | +| tool_choice| ToolChoice| 否 | 可用于Agent强制执行的组件工具 | | #### 方法功能 @@ -25,15 +27,17 @@ AgentRuntime 是对组件调用的服务化封装,开发者不是必须要用 ```python import os import appbuilder +from appbuilder.utils.chainlit_deploy import ChainlitRuntime + os.environ["APPBUILDER_TOKEN"] = '...' component = appbuilder.Playground( prompt_template="{query}", model="eb-4" ) -agent = appbuilder.AgentRuntime(component=component) +agent = ChainlitRuntime(component=component) ``` -### 2、运行Agent服务`AgentRuntime.chat(message: Message, stream: bool = False, **args) -> Message` +### 2、运行Agent服务`ChainlitRuntime.chat(message: Message, stream: bool = False, **args) -> Message` #### 方法参数 @@ -51,49 +55,19 @@ agent = appbuilder.AgentRuntime(component=component) ```python import os import appbuilder +from appbuilder.utils.chainlit_deploy import ChainlitRuntime + os.environ["APPBUILDER_TOKEN"] = '...' component = appbuilder.Playground( prompt_template="{query}", model="eb-4" ) -agent = appbuilder.AgentRuntime(component=component) +agent = ChainlitRuntime(component=component) message = appbuilder.Message({"query": "你好"}) print(agent.chat(message, stream=False)) ``` -### 3、提供 Flask http API 接口`AgentRuntime.serve(self, host='0.0.0.0', debug=True, port=8092, url_rule="/chat"` - -#### 方法参数 - -| 参数名称 | 参数类型 | 描述 | 示例值 | -|--------|--------|------------|-----------| -| host | String | 服务主机地址,默认为 '0.0.0.0' | '0.0.0.0' | -| debug | bool | 是否是调试模式,默认为 True | False | -| port | int | 服务端口号,默认为 8092 | 8092 | -| url_rule | String | Flask 路由规则,默认为 '/chat' | '/chat' | - -#### 方法功能 - -将 component 服务化,提供 Flask http API 接口 - -#### 示例代码 - -```python -import os -import appbuilder -os.environ["APPBUILDER_TOKEN"] = '...' -component = appbuilder.Playground( - prompt_template="{query}", - model="eb-4" -) -user_session_config = "sqlite:///foo.db" -agent = appbuilder.AgentRuntime( - component=component, user_session_config=user_session_config) -agent.serve(debug=False, port=8091) -``` - - -### 4、提供 chainlit demo 页面`AgentRuntime.chainlit_demo(host='0.0.0.0', port=8091)` +### 3、提供 chainlit component 页面`ChainlitRuntime.chainlit_component(host='0.0.0.0', port=8091)` #### 方法参数 @@ -114,8 +88,10 @@ import os import logging from appbuilder.core.component import Component from appbuilder import ( - AgentRuntime, UserSession, Message, QueryRewrite, Playground, + UserSession, Message, QueryRewrite, Playground, ) +from appbuilder.utils.chainlit_deploy import ChainlitRuntime + os.environ["APPBUILDER_TOKEN"] = 'YOUR_APPBUILDER_TOKEN' class PlaygroundWithHistory(Component): def __init__(self): @@ -146,11 +122,11 @@ class PlaygroundWithHistory(Component): }) return answer -agent = AgentRuntime(component=PlaygroundWithHistory()) -agent.chainlit_demo(port=8091) +agent = ChainlitRuntime(component=PlaygroundWithHistory()) +agent.chainlit_component(port=8091) ``` -### 5、将 appbuilder client 服务化,提供 chainlit demo 页面`AgentRuntime.chainlit_agent(host='0.0.0.0', port=8091)` +### 5、将 appbuilder client 服务化,提供 chainlit demo 页面`ChainlitRuntime.chainlit_agent(host='0.0.0.0', port=8091)` 目前支持工作流Agent、自主规划Agent应用。 #### 方法参数 @@ -168,11 +144,12 @@ agent.chainlit_demo(port=8091) ```python import appbuilder +from appbuilder.utils.chainlit_deploy import ChainlitRuntime import os os.environ["APPBUILDER_TOKEN"] = '...' app_id = '...' # 已发布AppBuilder应用ID,可在console端查看 client = appbuilder.AppBuilderClient(app_id) -agent = appbuilder.AgentRuntime(component=client) +agent = ChainlitRuntime(component=client) agent.chainlit_agent(port=8091) ``` \ No newline at end of file diff --git a/docs/BasisModule/Deployment/cloud.md b/docs/BasisModule/Deployment/cloud.md index 40980f3ce..e16499cfa 100644 --- a/docs/BasisModule/Deployment/cloud.md +++ b/docs/BasisModule/Deployment/cloud.md @@ -55,9 +55,10 @@ touch sample/component_sample.py ```python # ./smaple目录下component_sample.py import appbuilder +from appbuilder.utils.flask_deploy import FlaskRuntime component = appbuilder.Playground(prompt_template="{query}", model="ERNIE-Bot") -agent = appbuilder.AgentRuntime(component=component) +agent = FlaskRuntime(component=component) agent.serve(port=8091) ``` diff --git a/docs/BasisModule/Deployment/flask.md b/docs/BasisModule/Deployment/flask.md deleted file mode 100644 index ef0e3c9ba..000000000 --- a/docs/BasisModule/Deployment/flask.md +++ /dev/null @@ -1,5 +0,0 @@ -# API 访问 - -## 基础组件基于Flask提供 API访问服务 - -请参考 [组件服务化部署](https://github.com/baidubce/app-builder/blob/master/cookbooks/components/agent_runtime.ipynb) \ No newline at end of file diff --git a/docs/BasisModule/Deployment/flask_deploy.md b/docs/BasisModule/Deployment/flask_deploy.md new file mode 100644 index 000000000..2b5f845ae --- /dev/null +++ b/docs/BasisModule/Deployment/flask_deploy.md @@ -0,0 +1,101 @@ +# `FlaskRuntime`类 + +## 简介 + +FlaskRuntime 是对组件调用的服务化封装,开发者不是必须要用 FlaskRuntime 才能运行自己的组件服务。但 FlaskRuntime 可以快速帮助开发者服务化组件服务,并且提供API、对话框等部署方式。此外,结合 Component 和 Message 自带的运行和调试接口,可以方便开发者快速获得一个调试 Agent 的服务。 + + +## Python基本用法 + +### 1、实例化`FlaskRuntime() -> FlaskRuntime` + +#### 方法参数 + +| 参数名称 | 参数类型 | 描述 | 示例值 | +|--------|--------|------------|-----------| +| component | Component | 可运行的 Component,需要实现 run(message, stream, **args) 方法 | "正确的component组件或client" | +| user_session_config | sqlalchemy.engine.URL、str、None | Session 输出存储配置字符串。默认使用 sqlite:///user_session.db | "正确的存储配置字符串" | +| user_session_config | sqlalchemy.engine.URL\|Str\|None | 否 | 会话 Session 数据存储的数据库配置,遵循 sqlalchemy 后端定义,可参考[文档](https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls)。默认使用 sqlite:///user_session.db,即本地的 SQLite 存储 | "sqlite:///user_session.db" | +|user_session| UserSession | 否 | 用户会话管理器,如果不指定则自动生成一个默认的 UserSession | UserSession(user_session_config) | + +#### 方法功能 + +返回一个调试 Agent 的服务 + +#### 示例代码 + +```python +import os +import appbuilder +from appbuilder.utils.flask_deploy import FlaskRuntime + +os.environ["APPBUILDER_TOKEN"] = '...' +component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" +) +agent = FlaskRuntime(component=component) +``` + +### 2、运行Agent服务`FlaskRuntime.chat(message: Message, stream: bool = False, **args) -> Message` + +#### 方法参数 + +| 参数名称 | 参数类型 | 描述 | 示例值 | +|--------|--------|------------|-----------| +| message | Message | 该次对话用户输入的 Message | "正确的Message" | +| stream | bool | 是否使用流式请求。默认为 False | False | + +#### 方法功能 + +运行一个 Agent 服务,执行一次对话 + +#### 示例代码 + +```python +import os +import appbuilder +from appbuilder.utils.flask_deploy import FlaskRuntime + +os.environ["APPBUILDER_TOKEN"] = '...' +component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" +) +agent = FlaskRuntime(component=component) +message = appbuilder.Message({"query": "你好"}) +print(agent.chat(message, stream=False)) +``` + +### 3、提供 Flask http API 接口`FlaskRuntime.serve(self, host='0.0.0.0', debug=True, port=8092, url_rule="/chat"` + +#### 方法参数 + +| 参数名称 | 参数类型 | 描述 | 示例值 | +|--------|--------|------------|-----------| +| host | String | 服务主机地址,默认为 '0.0.0.0' | '0.0.0.0' | +| debug | bool | 是否是调试模式,默认为 True | False | +| port | int | 服务端口号,默认为 8092 | 8092 | +| url_rule | String | Flask 路由规则,默认为 '/chat' | '/chat' | + +#### 方法功能 + +将 component 服务化,提供 Flask http API 接口 + +#### 示例代码 + +```python +import os +import appbuilder +from appbuilder.utils.flask_deploy import FlaskRuntime + +os.environ["APPBUILDER_TOKEN"] = '...' +component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" +) +user_session_config = "sqlite:///foo.db" +agent = FlaskRuntime( + component=component, user_session_config=user_session_config) +agent.serve(debug=False, port=8091) +``` \ No newline at end of file diff --git a/docs/BasisModule/Deployment/usersession.md b/docs/BasisModule/Deployment/usersession.md index e0af798d1..c22035087 100644 --- a/docs/BasisModule/Deployment/usersession.md +++ b/docs/BasisModule/Deployment/usersession.md @@ -6,7 +6,7 @@ ## 应用场景 -**必须**在 AgentRuntime 启动的服务中使用。 +**必须**在 FlaskRuntime和ChainlitRuntime 启动的服务中使用。 ## Python基本用法 @@ -82,9 +82,9 @@ user_session.append({ }) ``` -### 4、UserSession结合AgentRuntime使用以及user_session.db文件读取 +### 4、UserSession结合FlaskRuntime/ChainlitRuntime使用以及user_session.db文件读取 -- [UserSession结合AgentRuntime使用以及user_session.db文件读取](https://github.com/baidubce/app-builder/blob/master/cookbooks/components/agent_runtime.ipynb) +- [UserSession结合FlaskRuntime/ChainlitRuntime使用以及user_session.db文件读取](https://github.com/baidubce/app-builder/blob/master/cookbooks/components/user_session.ipynb) diff --git a/docs/DevelopGuide/HowToContributeCode/README.md b/docs/DevelopGuide/HowToContributeCode/README.md index 893046647..2b76f2e0a 100644 --- a/docs/DevelopGuide/HowToContributeCode/README.md +++ b/docs/DevelopGuide/HowToContributeCode/README.md @@ -289,7 +289,7 @@ class BaiduSearchWithModel(Component): #### Test文件目录 * test文件需要为『test_』开头 -* 测试类需要形如『class TestAgentRuntime(unittest.TestCase)::』的定义方式 +* 测试类需要形如『class TestFlaskRuntime(unittest.TestCase)::』的定义方式 * test文件需要置于appbuilder-sdk-ext/appbuilder_sdk_ext/tests路径下 #### UnitTest提供三种标签实现两种运行模式 diff --git a/docs/QuickStart/ExamplesOfIndustrialPracticeApplications/README.md b/docs/QuickStart/ExamplesOfIndustrialPracticeApplications/README.md index 6174398af..604f84930 100644 --- a/docs/QuickStart/ExamplesOfIndustrialPracticeApplications/README.md +++ b/docs/QuickStart/ExamplesOfIndustrialPracticeApplications/README.md @@ -110,6 +110,7 @@ pip install chainlit ```python import appbuilder +from appbuilder.utils.chainlit_deploy import ChainlitRuntime # 空模版组件 playground = appbuilder.Playground( @@ -117,9 +118,9 @@ playground = appbuilder.Playground( model="Qianfan-Agent-Speed-8K" ) -# 使用 AgentRuntime 来服务化playground组件 -agent = appbuilder.AgentRuntime(component=playground) +# 使用 ChainlitRuntime 来服务化playground组件 +agent = ChainlitRuntime(component=playground) # 启动chainlit demo,会自动在浏览器打开体验对话框页面 -agent.chainlit_demo(port=8091) +agent.chainlit_component(port=8091) ``` \ No newline at end of file diff --git a/docs/QuickStart/StartFirstAINativeApplication/README.md b/docs/QuickStart/StartFirstAINativeApplication/README.md index 7d75e55b5..6b6e0a955 100644 --- a/docs/QuickStart/StartFirstAINativeApplication/README.md +++ b/docs/QuickStart/StartFirstAINativeApplication/README.md @@ -111,9 +111,11 @@ AppBuilder-SDK提供对组件的服务化能力。通过定义Agent,开发者 pip install chainlit ``` 而后,使用AppBuilder的Agent服务化功能,即可快速部署服务 +对于实现了run方法,返回str类的组件,可使用以下方法进行部署: ```python import appbuilder +from appbuilder.utils.chainlit_deploy import ChainlitRuntime # 空模版组件 playground = appbuilder.Playground( @@ -121,22 +123,43 @@ playground = appbuilder.Playground( model="Qianfan-Agent-Speed-8K" ) -# 使用 AgentRuntime 来服务化playground组件 -agent = appbuilder.AgentRuntime(component=playground) +# 使用 ChainlitRuntime 来服务化playground组件 +agent = ChainlitRuntime(component=playground) # 启动chainlit demo,会自动在浏览器打开体验对话框页面 -agent.chainlit_demo(port=8091) +agent.chainlit_component(port=8091) ``` +对可能输出其他类型的组件,如图片、音频、代码等组件,可使用以下接口查看各种输出格式的渲染效果。 +注意:该接口目前只支持新协议组件,即appbuilder.core.component.v2实现下的组件。 + +```python +import os +import appbuilder +from appbuilder.utils.chainlit_deploy import ChainlitRuntime +from appbuilder.core.components.v2 import SimilarQuestion + +# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥 +os.environ["APPBUILDER_TOKEN"] = '...' + +component = SimilarQuestion() +agent = ChainlitRuntime(component=component) +agent.chainlit_component_debug( + port=8092, + tool_eval_args={}, + query_name = "query" +) +``` + + + 也可以对AppBuilderClient进行服务化,快速部署 ```python import os from appbuilder.core.component import Component -from appbuilder import ( - AgentRuntime, - AppBuilderClient, -) +from appbuilder.utils.chainlit_deploy import ChainlitRuntime +from appbuilder import AppBuilderClient if __name__ == "__main__": @@ -148,6 +171,6 @@ if __name__ == "__main__": # 网页已部署的应用链接为「地理小达人」:https://appbuilder.baidu.com/s/x1tSF app_id = "42eb211a-14b9-43d2-9fae-193c8760ef26" agent_builder = AppBuilderClient(app_id) - agent = AgentRuntime(component=agent_builder) + agent = ChainlitRuntime(component=agent_builder) agent.chainlit_agent(port=8091) ``` \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 2168c1a04..27e5103ac 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,10 +17,9 @@ - [TRACE基础功能](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Trace/basic.md) - [TRACE拓展功能](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Trace/phoenix_method.md) - 部署: - - [交互式前端部署](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/AgentChainlit.md) + - [交互式前端部署](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/chainlit_deploy.md) - [公有云部署](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/cloud.md) - - [API 访问](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/flask.md) - - [AgentRuntime](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/agentruntime.md) + - [API 访问](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/flask_deploy.md) - [UserSession](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/usersession.md) - 平台: - 应用: diff --git a/docs/README_en.md b/docs/README_en.md index eead7d289..b99b5a5bf 100644 --- a/docs/README_en.md +++ b/docs/README_en.md @@ -33,15 +33,15 @@ Baidu AI Cloud Qianfan AppBuilder-SDK offers the following essential features fo - Orchestrate and manage knowledge flows, managing knowledge bases through KnowledgeBase, performing create, read, update, and delete (CRUD) operations on documents and knowledge slices, and developing industry-grade RAG applications with Baidu AI Cloud Qianfan AppBuilder Platform. - - Orchestrate and automate workflows, providing multi-level workflow abstractions such as `Message`, `Component`, and `AgentRuntime` to achieve workflow orchestration and integration with industry ecosystem capabilities like LangChain and OpenAI. + - Orchestrate and automate workflows, providing multi-level workflow abstractions such as `Message`, `Component`, `FlaskRuntime`, and `ChainlitRuntime` to achieve workflow orchestration and integration with industry ecosystem capabilities like LangChain and OpenAI. 3. Monitoring - Providing monitoring tools such as visual Tracing and detailed DebugLog to assist developers in production environments. 4. Deployment - - AgentRuntime supports deployment as an API service based on Flask and Gunicorn. - - AgentRuntime supports deployment as a Chainlit-based dialog interaction front-end application. + - FlaskRuntime supports deployment as an API service based on Flask and Gunicorn. + - ChainlitRuntime supports deployment as a Chainlit-based dialog interaction front-end application. - Offering the appbuilder_bce_deploy tool for rapid deployment of programs to Baidu Cloud, providing public network API services, and enabling integration with AppBuilder's workflow functionalities. @@ -263,10 +263,9 @@ Hook: - [TRACE extended functions](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Trace/phoenix_method.md) - [Debug functionality](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Trace/Debug.md) - Deployment: - - [Interactive front-end deployment](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/AgentChainlit.md) + - [Interactive front-end deployment](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/chainlit_deploy.md) - [Public cloud deployment](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/cloud.md) - - [API access](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/flask.md) - - [AgentRuntime](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/agentruntime.md) + - [API access](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/flask_deploy.md) - [UserSession](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/usersession.md) - Platform: - Applications: diff --git a/docs/README_ja.md b/docs/README_ja.md index 5f00dddd8..760d2c9ec 100644 --- a/docs/README_ja.md +++ b/docs/README_ja.md @@ -30,15 +30,15 @@ Baidu AI Cloud Qianfan AppBuilder-SDKは、AIアプリケーション開発者 - 知識フローをオーケストレーションおよび管理し、KnowledgeBaseを通じて知識ベースを管理し、文書および知識スライスの作成、読み取り、更新、削除(CRUD)操作を実行し、Baidu AI Cloud Qianfan AppBuilderプラットフォームと共に業界グレードのRAGアプリケーションを開発します。 - - ワークフローをオーケストレーションおよび自動化し、`Message`、`Component`、`AgentRuntime`などの多層ワークフロー抽象を提供し、ワークフローのオーケストレーションを実現し、LangChainやOpenAIなどの業界エコシステム機能と統合します。 + - ワークフローをオーケストレーションおよび自動化し、`Message`、`Component`、`FlaskRuntime`、`ChainlitRuntime`などの多層ワークフロー抽象を提供し、ワークフローのオーケストレーションを実現し、LangChainやOpenAIなどの業界エコシステム機能と統合します。 3. 監視 - 開発者が生産環境で使用するための可視化トレースおよび詳細なデバッグログなどの監視ツールを提供します。 4. デプロイメント - - AgentRuntimeは、FlaskおよびGunicornに基づくAPIサービスとしてデプロイメントをサポートします。 - - AgentRuntimeは、Chainlitに基づく対話型フロントエンドアプリケーションとしてデプロイメントをサポートします。 + - FlaskRuntimeは、FlaskおよびGunicornに基づくAPIサービスとしてデプロイメントをサポートします。 + - ChainlitRuntimeは、Chainlitに基づく対話型フロントエンドアプリケーションとしてデプロイメントをサポートします。 - プログラムをBaidu Cloudに迅速にデプロイし、パブリックネットワークAPIサービスを提供し、AppBuilderのワークフロー機能と統合するためのappbuilder_bce_deployツールを提供します。 @@ -259,10 +259,9 @@ print(answer.content.answer) - [TRACE拡張機能](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Trace/phoenix_method.md) - [Debug機能](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Trace/Debug.md) - デプロイ: - - [インタラクティブなフロントエンドデプロイ](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/AgentChainlit.md) + - [インタラクティブなフロントエンドデプロイ](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/chainlit_deploy.md) - [パブリッククラウドデプロイ](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/cloud.md) - - [API アクセス](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/flask.md) - - [AgentRuntime](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/agentruntime.md) + - [API アクセス](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/flask_deploy.md) - [UserSession](https://github.com/baidubce/app-builder/blob/master/docs/BasisModule/Deployment/usersession.md) - プラットフォーム: - アプリケーション: diff --git a/mkdocs.yml b/mkdocs.yml index 7311aa4c1..a67b7cb85 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -68,10 +68,9 @@ nav: - TRACE拓展功能: BasisModule/Trace/phoenix_method.md - Debug功能: BasisModule/Trace/Debug.md - 部署: - - 交互式前端部署: BasisModule/Deployment/AgentChainlit.md + - 交互式前端部署: BasisModule/Deployment/chainlit_runtime.md - 公有云部署: BasisModule/Deployment/cloud.md - - API 访问: BasisModule/Deployment/flask.md - - AgentRuntime: BasisModule/Deployment/agentruntime.md + - API 访问: BasisModule/Deployment/flask_deploy.md - UserSession: BasisModule/Deployment/usersession.md - 平台: - 应用: diff --git a/python/__init__.py b/python/__init__.py index c3bc9f92a..48c850b91 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -167,7 +167,6 @@ def get_default_header(): ] # NOQA from appbuilder.core.message import Message -from appbuilder.core.agent import AgentRuntime from appbuilder.core.user_session import UserSession from appbuilder.utils.logger_util import logger diff --git a/python/core/agent.py b/python/core/agent.py deleted file mode 100644 index fbc0ad412..000000000 --- a/python/core/agent.py +++ /dev/null @@ -1,639 +0,0 @@ -# Copyright (c) 2023 Baidu, Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import sys -import copy -import os -import logging -import uuid -import json -import shutil -import inspect -from pydantic import BaseModel, model_validator, Extra -from typing import Optional, Dict, Any, Union -import appbuilder -from appbuilder.core.context import init_context -from appbuilder.core.component import Component -from appbuilder.core.message import Message -from appbuilder.utils.logger_util import logger -from appbuilder.core.console.appbuilder_client.data_class import ToolChoiceFunction, ToolChoice, Action - -# 流式场景首包超时时,最大重试次数 -MAX_RETRY_COUNT = 3 - - -class AgentRuntime(BaseModel): - r""" - AgentRuntime 是对组件调用的服务化封装,开发者不是必须要用 AgentRuntime 才能运行自己的组件服务。 - 但 AgentRuntime 可以快速帮助开发者服务化组件服务,并且提供API、对话框等部署方式。 - 此外,结合 Component 和 Message 自带的运行和调试接口,可以方便开发者快速获得一个调试 Agent 的服务。 - - Args: - component (Component): 可运行的 Component, 需要实现 run(message, stream, args) 方法 - user_session_config (sqlalchemy.engine.URL|str|None): Session 输出存储配置字符串。默认使用 sqlite:///user_session.db - 遵循 sqlalchemy 后端定义,参考文档:https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls - tool_choice (ToolChoice): 可用于Agent强制执行的组件工具 - - - Examples: - - .. code-block:: python - - import os - import sys - import appbuilder - os.environ["APPBUILDER_TOKEN"] = '...' - - component = appbuilder.Playground( - prompt_template="{query}", - model="eb-4" - ) - agent = appbuilder.AgentRuntime(component=component) - message = appbuilder.Message({"query": "你好"}) - print(agent.chat(message, stream=False)) - - .. code-block:: python - - import os - import sys - import appbuilder - os.environ["APPBUILDER_TOKEN"] = '...' - - component = appbuilder.Playground( - prompt_template="{query}", - model="eb-4" - ) - user_session_config = "sqlite:///foo.db" - agent = appbuilder.AgentRuntime( - component=component, user_session_config=user_session_config) - agent.serve(debug=False, port=8091) - - .. code-block:: python - - import os - import sys - import appbuilder - os.environ["APPBUILDER_TOKEN"] = '...' - - component = appbuilder.Playground( - prompt_template="{query}", - model="eb-4" - ) - agent = appbuilder.AgentRuntime(component=component) - agent.chainlit_demo(port=8091) - - Session 数据管理 : 除去上述简单应用外,还支持 Session 数据管理,下面是一个例子 - - .. code-block:: python - - import os - import sys - from appbuilder.core.component import Component - from appbuilder import ( - AgentRuntime, UserSession, Message, QueryRewrite, Playground, - ) - - os.environ["APPBUILDER_TOKEN"] = '...' - - class PlaygroundWithHistory(Component): - def __init__(self): - super().__init__() - self.query_rewrite = QueryRewrite(model="Qianfan-Agent-Speed-8K") - self.play = Playground( - prompt_template="{query}", - model="eb-4" - ) - - def run(self, message: Message, stream: bool=False): - user_session = UserSession() - # 获取 Session 历史数据 - history_queries = user_session.get_history("query", limit=1) - history_answers = user_session.get_history("answer", limit=1) - - if history_queries and history_answers: - history = [] - for query, answer in zip(history_queries, history_answers): - history.extend([query.content, answer.content]) - logging.info(f"history: {history}") - message = self.query_rewrite( - Message(history + [message.content]), rewrite_type="带机器人回复") - logging.info(f"message: {message}") - answer = self.play.run(message, stream) - # 保存本轮数据 - user_session.append({ - "query": message, - "answer": answer, - }) - return answer - - agent = AgentRuntime(component=PlaygroundWithHistory()) - agent.chainlit_demo(port=8091) - - 请求时认证 : component在创建时可以不进行认证,由AgentRuntime服务化后带入AppbuilderToken - - .. code-block:: python - - import appbuilder - - component = appbuilder.Playground( - prompt_template="{query}", - model="eb-4", - lazy_certification=True, # 在创建时不进行认证 - ) - agent = appbuilder.AgentRuntime(component=component) - agent.serve(debug=False, port=8091) - - .. code-block:: shell - - curl --location 'http://0.0.0.0:8091/chat' \ - --header 'Content-Type: application/json' \ - --header 'X-Appbuilder-Token: ...' \ - --data '{ - "message": "你是谁", - "stream": false - }' - - Session 信息查看 : 查看本地user_session.db数据库内部信息,下面是一个例子 - - .. code-block:: python - - import sqlite3 - import json - - # 连接到 SQLite 数据库 - # 如果文件不存在,会自动在当前目录创建: - user_session_path = 'your_user_session.db地址' - conn = sqlite3.connect(user_session_path) - cursor = conn.cursor() - - # 执行一条 SQL 语句,列出所有表 - cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") - print(cursor.fetchall()) - - # 查询appbuilder_session_messages表的列信息 - cursor.execute("PRAGMA table_info(appbuilder_session_messages);") - columns_info = cursor.fetchall() - - column_names = [info[1] for info in columns_info] # info[1]是列名的位置 - for column_name in column_names: - print(column_name) - - # 查询特定表中的数据 - cursor.execute("SELECT message_value FROM appbuilder_session_messages;") - for row in cursor.fetchall(): - print(json.loads(row[0])) - - # 关闭 Connection: - conn.close() - - """ - - component: Component - user_session_config: Optional[Union[Any, str]] = None - user_session: Optional[Any] = None - tool_choice: ToolChoice = None - - class Config: - """ - 检查配置 - - Attributes: - extra (Extra): 额外属性,默认为 Extra.forbid,即禁止添加任何额外的属性 - arbitrary_types_allowed (bool): 任意类型是否允许,默认为 True - """ - extra = Extra.forbid # 不能传入类定义中未声明的字段 - arbitrary_types_allowed = True # 此设置允许在模型中使用自定义类型的字段 - - @model_validator(mode='before') - @classmethod - def init(cls, values: Dict) -> Dict: - """ - 初始化 AgentRuntime,UserSession 会在这里被初始化 - - Args: - values (Dict): 初始化参数 - - Returns: - None - """ - # 初始化 UserSession - from appbuilder.core.user_session import UserSession - values.update({ - "user_session": UserSession(values.get("user_session_config")) - }) - return values - - def chat(self, message: Message, stream: bool = False, **args) -> Message: - """ - 执行一次对话 - - Args: - message (Message): 该次对话用户输入的 Message - stream (bool): 是否流式请求 - **args: 其他参数,会被透传到 component - - Returns: - Message(Message): 返回的 Message - """ - return self.component.run(message=message, stream=stream, **args) - - def create_flask_app(self, url_rule="/chat"): - """ - 创建 Flask 应用,主要用于 Gunicorn 这样的 WSGI 服务器来运行服务。 - - Args: - None - - Returns: - Flask - """ - # lazy import flask - try: - from flask import Flask, current_app, request, Response - from flask_restful import reqparse, Resource - from werkzeug.exceptions import BadRequest - from flask import stream_with_context - - except ImportError: - raise ImportError("Flask module is not installed. Please install it using 'pip install " - "flask~=2.3.2 flask-restful==0.3.9'.") - app = Flask(__name__) - app.json.ensure_ascii = False - - @app.errorhandler(BadRequest) - def handle_bad_request(e): - return {"code": 400, "message": f'{e}', "result": None}, 400 - - @app.errorhandler(Exception) - def handle_bad_request(e): - if hasattr(e, "code"): - return {"code": e.code, "message": str(e), "result": None}, 200 - else: - return {"code": 500, "message": "Internal Server Error", "result": None}, 200 - - def warp(): - """ - 根据component的lazy_certification属性处理请求。 - - Args: - 无参数。 - - Returns: - 如果stream为True,则返回流式响应(Content-Type为text/event-stream)。 - 如果stream为False,则返回包含处理结果的字典。 - - Raises: - BadRequest: 当请求头中缺少必要的X-Appbuilder-Authorization时抛出。 - BadRequest: 当请求体中缺少必要的message字段时抛出。 - BadRequest: 当请求体中session_id字段不是字符串类型时抛出。 - BadRequest: 当请求体中stream字段不是布尔类型时抛出。 - - """ - # 根据component是否lazy_certification,分成两种情况: - # 1. lazy_certification为True,初始化时未被认证,每次请求都需要带入AppbuilderToken - # 2. lazy_certification为False,初始化时已经认证,请求时不需要带入AppbuilderToken,并且带入也无效 - if self.component.lazy_certification: - app_builder_token = None - for key in ["X-Appbuilder-Token", "X-Appbuilder-Authorization"]: - if key in request.headers: - app_builder_token = request.headers[key] - break - if not app_builder_token: - raise BadRequest( - "X-Appbuilder-Authorization is required in Headers") - try: - self.component.set_secret_key_and_gateway( - secret_key=app_builder_token) - except appbuilder.core._exception.BaseRPCException as e: - logging.error(f"failed to verify. err={e}", exc_info=True) - raise BadRequest("X-Appbuilder-Authorization invalid") - except Exception as e: - logging.error(f"failed to verify. err={e}", exc_info=True) - raise e - else: - pass - - data = request.get_json() - if "message" not in data: - raise BadRequest("message is required") - message = Message(data.pop('message')) - if "session_id" not in data: - session_id = str(uuid.uuid4()) - else: - session_id = data.pop("session_id") - if not isinstance(session_id, str): - raise BadRequest("session_id must be str type") - if "stream" not in data: - stream = False - else: - stream = data.pop("stream") - if not isinstance(stream, bool): - raise BadRequest("stream must be bool type") - request_id = request.headers.get("X-Appbuilder-Request-Id", str(uuid.uuid4())) - user_id = request.headers.get("X-Appbuilder-User-Id", None) - - init_context(session_id=session_id, request_id=request_id, user_id=user_id) - logging.info( - f"request_id={request_id}, session_id={session_id}] message={message}," - f" stream={stream}, data={data}, start run...") - - def gen_sse_resp(): - with app.app_context(): - received_first_packet = False - retry_count = 0 - while retry_count < MAX_RETRY_COUNT: - try: - answer = self.chat(message, stream, **data) - except Exception as e: # 调用chat方法报错,直接返回 - code = 500 if not hasattr(e, "code") else e.code - err_resp = {"code": code, "message": "InternalServerError", "result": None} - logging.error( - f"request_id={request_id}, session_id={session_id}, err={e}, execute self.chat failed", exc_info=True) - yield "data: " + json.dumps(err_resp, ensure_ascii=False) + "\n\n" - return - else: # 调用chat方法成功,开始生成流式事件 - content_iterator = iter(answer.content) - answer.content = None - result = None - try: - for sub_content in content_iterator: - result = copy.deepcopy(answer) - result.content = sub_content - yield "data: " + json.dumps({ - "code": 0, "message": "", - "result": { - "session_id": session_id, - "is_completion": False, - "answer_message": json.loads(result.json(exclude_none=True)) - } - }, ensure_ascii=False) + "\n\n" - received_first_packet = True - except Exception as e: - retry_count += 1 - logging.error( - f"[request_id={request_id}, session_id={session_id}] err={e}, " - f"retry_count={retry_count}", exc_info=True) - # 如果未收到首包且重试次数小于最大重试次数,则尝试重新执行一次chat方法 - if not received_first_packet and retry_count < MAX_RETRY_COUNT: - continue - else: # 其它情况返回 - logging.error( - f"[request_id={request_id}, session_id={session_id}] err={e}, " - f"retry_count={retry_count}, received_first_packet={received_first_packet}" - , exc_info=True) - code = 500 if not hasattr(e, "code") else e.code - err_resp = {"code": code, "message": "InternalServerError", "result": None} - yield "data: " + json.dumps(err_resp, ensure_ascii=False) + "\n\n" - return - result.content = "" - yield "data: " + json.dumps({ - "code": 0, "message": "", - "result": { - "session_id": session_id, - "is_completion": True, - "answer_message": json.loads(result.json(exclude_none=True)) - } - }, ensure_ascii=False) + "\n\n" - logging.info( - f"request_id={request_id}, session_id={session_id}]" - f"retry_count={retry_count}, success response", exc_info=True) - self.user_session._post_append() - return # 正常返回 - - if stream: # 流式 - return Response(stream_with_context(gen_sse_resp()), 200, - {'Content-Type': 'text/event-stream; charset=utf-8'}) - if not stream: # 非流式 - try: - answer = self.chat(message, stream, **data) - blocking_result = json.loads(copy.deepcopy(answer).json(exclude_none=True)) - logging.debug(f"[request_id={request_id}, session_id={session_id}] blocking_result={blocking_result}") - self.user_session._post_append() - return { - "code": 0, "message": "", - "result": {"session_id": session_id, "answer_message": blocking_result} - } - except Exception as e: - logging.error( - f"[request_id={request_id}, session_id={session_id}] err={e}", exc_info=True) - code = 500 if not hasattr(e, "code") else e.code - return {"code": code, "message": "InternalServerError", "result": None} - - app.add_url_rule(url_rule, 'chat', warp, methods=['POST']) - return app - - def serve(self, host='0.0.0.0', debug=True, port=8092, url_rule="/chat"): - """ - 将 component 服务化,提供 Flask http API 接口 - - Args: - host (str): 服务运行的host地址,默认为'0.0.0.0' - debug (bool): 是否开启debug模式,默认为True - port (int): 服务运行的端口号,默认为8092 - url_rule (str): 服务的URL规则,默认为"/chat" - - Returns: - None - """ - app = self.create_flask_app(url_rule=url_rule) - app.run(host=host, debug=debug, port=port) - - def prepare_chainlit_readme(self): - """ - 准备 Chainlit 的 README 文件 - - Args: - 无 - - Returns: - 无 - - Raises: - 无 - - 说明: - 从 utils 文件夹中拷贝 chainlit.md 文件到当前工作目录下,如果当前工作目录下已存在 chainlit.md 文件,则不拷贝。 - - """ - try: - # 获取当前python命令执行的路径,而不是文件的位置 - cwd_path = os.getcwd() - # 获取当前文件的路径所在文件夹 - current_file_path = os.path.dirname( - os.path.dirname(os.path.abspath(__file__))) - chainlit_readme_path = os.path.join( - current_file_path, "utils", "chainlit.md") - - # 拷贝chainlit_readme到cwd_path - # 如果cwd_path下已经存在chainlit_readme,则不拷贝 - if not os.path.exists(os.path.join(cwd_path, "chainlit.md")): - shutil.copy(chainlit_readme_path, cwd_path) - except: - logger.error("Failed to copy chainlit.md to current directory") - - def chainlit_demo(self, host='0.0.0.0', port=8091): - """ - 将 component 服务化,提供 chainlit demo 页面 - - Args: - host (str): 服务 host - port (int): 服务 port - - Returns: - None - """ - # lazy import chainlit - try: - import chainlit as cl - import chainlit.cli - except ImportError: - raise ImportError("chainlit module is not installed. Please install it using 'pip install " - "chainlit~=1.0.200'.") - import click - from click.testing import CliRunner - - self.prepare_chainlit_readme() - - @cl.on_message # this function will be called every time a user inputs a message in the UI - async def main(message: cl.Message): - session_id = cl.user_session.get("id") - request_id = str(uuid.uuid4()) - init_context(session_id=session_id, request_id=request_id) - msg = cl.Message(content="") - await msg.send() - stream_message = self.chat(Message(message.content), stream=True) - - for part in stream_message.content: - if token := part or "": - await msg.stream_token(token) - await msg.update() - self.user_session._post_append() - - # start chainlit service - if os.getenv('APPBUILDER_RUN_CHAINLIT') == '1': - pass - else: - os.environ['APPBUILDER_RUN_CHAINLIT'] = '1' - target = sys.argv[0] - runner = CliRunner() - runner.invoke( - chainlit.cli.chainlit_run, [target, '--watch', "--port", port, "--host", host]) - - def chainlit_agent(self, host='0.0.0.0', port=8091): - """ - 将 appbuilder client 服务化,提供 chainlit demo 页面 - - Args: - host (str): 服务 host - port (int): 服务 port - - Returns: - None - """ - # lazy import chainlit - try: - import chainlit as cl - import chainlit.cli - except ImportError: - raise ImportError("chainlit module is not installed. Please install it using 'pip install " - "chainlit~=1.0.200'.") - import click - from click.testing import CliRunner - - if not isinstance(self.component, appbuilder.AppBuilderClient): - raise ValueError( - "chainlit_agent require component must be an instance of AppBuilderClient") - self.prepare_chainlit_readme() - - conversation_ids = [] - interrupt_dict = {} - - def _chat(message: cl.Message): - if len(conversation_ids) == 0: - raise ValueError("create new conversation failed!") - conversation_id = conversation_ids[-1] - file_ids = [] - if len(message.elements) > 0: - file_id = self.component.upload_local_file( - conversation_id, message.elements[0].path) - file_ids.append(file_id) - - interrupt_ids = interrupt_dict.get(conversation_id, []) - interrupt_event_id = interrupt_ids.pop() if len(interrupt_ids) > 0 else None - action = None - if interrupt_event_id is not None: - action = Action.create_resume_action(interrupt_event_id) - - tmp_message = self.component.run(conversation_id=conversation_id, query=message.content, file_ids=file_ids, - stream=True, tool_choice=self.tool_choice, action=action) - res_message=list(tmp_message.content) - - interrupt_event_id = None - for ans in res_message: - for event in ans.events: - if event.content_type == "chatflow_interrupt": - interrupt_event_id = event.detail.get("interrupt_event_id") - if event.content_type == "publish_message" and event.event_type == "chatflow": - answer = event.detail.get("message") - ans.answer += answer - - if interrupt_event_id is not None: - interrupt_ids.append(interrupt_event_id) - interrupt_dict[conversation_id] = interrupt_ids - tmp_message.content = res_message - return tmp_message - - @cl.on_chat_start - async def start(): - session_id = cl.user_session.get("id") - request_id = str(uuid.uuid4()) - init_context(session_id=session_id, request_id=request_id) - conversation_ids.append(self.component.create_conversation()) - interrupt_dict[conversation_ids[-1]] = [] - - @cl.on_message # this function will be called every time a user inputs a message in the UI - async def main(message: cl.Message): - msg = cl.Message(content="") - await msg.send() - await msg.update() - - stream_message = _chat(message) - detail_json_list = [] - for part in stream_message.content: - if token := part.answer or "": - await msg.stream_token(token) - for event in part.events: - detail = event.detail - detail_json = json.dumps( - detail, indent=4, ensure_ascii=False) - detail_json_list.append(detail_json) - await msg.update() - - @cl.step(name="详细信息") - def show_json(detail_json): - return "```json\n" + detail_json + "\n```" - for detail_json in detail_json_list: - if len(detail_json) > 2: - show_json(detail_json) - await msg.update() - self.user_session._post_append() - - # start chainlit service - if os.getenv('APPBUILDER_RUN_CHAINLIT') == '1': - pass - else: - os.environ['APPBUILDER_RUN_CHAINLIT'] = '1' - target = sys.argv[0] - runner = CliRunner() - runner.invoke( - chainlit.cli.chainlit_run, [target, '--watch', "--port", port, "--host", host]) diff --git a/python/core/context.py b/python/core/context.py index 15c97f9bc..ebb294d17 100644 --- a/python/core/context.py +++ b/python/core/context.py @@ -68,8 +68,8 @@ def get_context() -> SessionContext: session_id = _LOCAL_KEY + str(uuid.uuid4())[:-len(_LOCAL_KEY)] request_id = _LOCAL_KEY + str(uuid.uuid4())[:-len(_LOCAL_KEY)] logging.debug( - "Unable to find the AgentRuntime context. You need to use UserSession " - "in AgentRuntime.serve or AgentRuntime.chainlit_demo. " + "Unable to find the context. You need to use UserSession " + "in FlaskRuntime.serve or ChainlitRuntime.chainlit_component. " f"Generate session_id({session_id}) and request_id({request_id}) here for local debugging.") ctx = init_context(session_id=session_id, request_id=request_id) return ctx \ No newline at end of file diff --git a/python/core/user_session.py b/python/core/user_session.py index a8b938ada..5c06fdd9a 100644 --- a/python/core/user_session.py +++ b/python/core/user_session.py @@ -33,7 +33,7 @@ def lazy_import_sqlalchemy(): class UserSession(object): """ 会话数据管理工具,实例化后将是一个全局变量。 - 提供保存对话数据与获取历史数据的方法,**必须**在 AgentRuntime 启动的服务中使用。 + 提供保存对话数据与获取历史数据的方法,**必须**在 FlaskRuntime和ChainlitRuntime 启动的服务中使用。 """ _instance = None _initialized = False diff --git a/python/tests/component_tool_eval_cases.py b/python/tests/component_tool_eval_cases.py index ae7809d0e..92e529aa8 100644 --- a/python/tests/component_tool_eval_cases.py +++ b/python/tests/component_tool_eval_cases.py @@ -12,7 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. from appbuilder.core.component import Component -from appbuilder.tests.component_schemas import text_schema, url_schema, image_schema, code_schema, file_schema, oral_text_schema, references_schema, chart_schema, audio_schema, plan_schema, function_call_schema +from appbuilder.tests.component_schemas import text_schema, url_schema, image_schema, \ + code_schema, file_schema, oral_text_schema, references_schema, chart_schema, audio_schema, plan_schema, function_call_schema class Case(): def init_args(self): diff --git a/python/tests/test_agent.py b/python/tests/test_agent.py index b63e8ecc3..43176b33c 100644 --- a/python/tests/test_agent.py +++ b/python/tests/test_agent.py @@ -8,13 +8,14 @@ from appbuilder.core.component import Component from appbuilder.utils.sse_util import SSEClient from appbuilder import ( - AgentRuntime, Message, Playground, AppBuilderClient ) +from appbuilder.utils.flask_deploy import FlaskRuntime +from appbuilder.utils.chainlit_deploy import ChainlitRuntime -class TestAgentRuntime(unittest.TestCase): +class TestRuntime(unittest.TestCase): def setUp(self): """ 设置环境变量。 @@ -34,7 +35,7 @@ def test_no_token_http(self): model="ERNIE-3.5-8K", lazy_certification=True, ) - agent = appbuilder.AgentRuntime(component=component) + agent = FlaskRuntime(component=component) app = agent.create_flask_app(url_rule="/chat") app.config['TESTING'] = True client = app.test_client() @@ -49,12 +50,13 @@ def test_no_token_http(self): def test_err_http(self): """ 测试http """ + print(os.getenv("APPBUILDER_TOKEN", "")) component = appbuilder.Playground( prompt_template="{query}", model="ERNIE-3.5-8K", lazy_certification=True, ) - agent = appbuilder.AgentRuntime(component=component) + agent = FlaskRuntime(component=component) app = agent.create_flask_app(url_rule="/chat") app.config['TESTING'] = True client = app.test_client() @@ -77,7 +79,7 @@ def test_stream_http(self): model="ERNIE-3.5-8K", lazy_certification=True, ) - agent = appbuilder.AgentRuntime(component=component) + agent = FlaskRuntime(component=component) app = agent.create_flask_app(url_rule="/chat") app.config['TESTING'] = True client = app.test_client() @@ -105,7 +107,7 @@ def test_http(self): model="ERNIE-3.5-8K", lazy_certification=True, ) - agent = appbuilder.AgentRuntime(component=component) + agent = FlaskRuntime(component=component) app = agent.create_flask_app(url_rule="/chat") app.config['TESTING'] = True client = app.test_client() @@ -128,13 +130,8 @@ def test_init_with_valid_component(self): prompt_template="{query}", model="ERNIE-3.5-8K" ) - agent = AgentRuntime(component=component) - - def test_init_with_invalid_component(self): - """ 测试在component非法时运行 """ - component = "invalid_component" - with self.assertRaises(pydantic.ValidationError): - agent = AgentRuntime(component=component) + agent = FlaskRuntime(component=component) + agent = ChainlitRuntime(component=component) def test_chat_with_valid_message_and_blocking(self): """ 测试在消息有效时处理 """ @@ -142,18 +139,22 @@ def test_chat_with_valid_message_and_blocking(self): prompt_template="{query}", model="ERNIE-3.5-8K" ) - agent = appbuilder.AgentRuntime(component=component) + agent = FlaskRuntime(component=component) message = appbuilder.Message({"query": "你好"}) answer = agent.chat(message, stream=False) + agent2 = ChainlitRuntime(component=component) + message = appbuilder.Message({"query": "你好"}) + answer2 = agent2.chat(message, stream=False) self.assertIs(type(answer.content), str) - + self.assertIs(type(answer2.content), str) + def test_chat_with_valid_message_and_streaming(self): """ 测试在消息有效时处理 """ component = Playground( prompt_template="{query}", model="ERNIE-3.5-8K" ) - agent = AgentRuntime(component=component) + agent = FlaskRuntime(component=component) message = Message({"query": "你好"}) answer = agent.chat(message, stream=True) for it in answer.content: diff --git a/python/tests/test_appbuilder_client.py b/python/tests/test_appbuilder_client.py index ee616cf10..b010f0a23 100644 --- a/python/tests/test_appbuilder_client.py +++ b/python/tests/test_appbuilder_client.py @@ -7,7 +7,7 @@ @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_run_with_handler.py b/python/tests/test_appbuilder_client_run_with_handler.py index 00a213593..61070f521 100644 --- a/python/tests/test_appbuilder_client_run_with_handler.py +++ b/python/tests/test_appbuilder_client_run_with_handler.py @@ -56,7 +56,7 @@ def tool_calls(self, event): @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppbuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_toolcall.py b/python/tests/test_appbuilder_client_toolcall.py index 94c0c8924..7fb9dd30a 100644 --- a/python/tests/test_appbuilder_client_toolcall.py +++ b/python/tests/test_appbuilder_client_toolcall.py @@ -4,7 +4,7 @@ @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_toolcall_event_handler.py b/python/tests/test_appbuilder_client_toolcall_event_handler.py index 044a5418c..2b3d6750e 100644 --- a/python/tests/test_appbuilder_client_toolcall_event_handler.py +++ b/python/tests/test_appbuilder_client_toolcall_event_handler.py @@ -34,7 +34,7 @@ def success(self, run_context, run_response): @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_toolcall_event_handler_error.py b/python/tests/test_appbuilder_client_toolcall_event_handler_error.py index afce553be..bb33ffae4 100644 --- a/python/tests/test_appbuilder_client_toolcall_event_handler_error.py +++ b/python/tests/test_appbuilder_client_toolcall_event_handler_error.py @@ -22,7 +22,7 @@ def success(self, run_context, run_response): @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_toolcall_event_handler_stream.py b/python/tests/test_appbuilder_client_toolcall_event_handler_stream.py index 6d4114242..e882aa31e 100644 --- a/python/tests/test_appbuilder_client_toolcall_event_handler_stream.py +++ b/python/tests/test_appbuilder_client_toolcall_event_handler_stream.py @@ -33,7 +33,7 @@ def running(self, run_context, run_response): print("\n\033[1;31m","-> Agent 流式回答: \n", run_response.answer, "\033[0m") @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_toolcall_event_handler_v2.py b/python/tests/test_appbuilder_client_toolcall_event_handler_v2.py index edd454342..51c167b7c 100644 --- a/python/tests/test_appbuilder_client_toolcall_event_handler_v2.py +++ b/python/tests/test_appbuilder_client_toolcall_event_handler_v2.py @@ -34,7 +34,7 @@ def success(self, run_context, run_response): @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_toolcall_event_handler_v3.py b/python/tests/test_appbuilder_client_toolcall_event_handler_v3.py index 9a6e5abe5..3b7926882 100644 --- a/python/tests/test_appbuilder_client_toolcall_event_handler_v3.py +++ b/python/tests/test_appbuilder_client_toolcall_event_handler_v3.py @@ -34,7 +34,7 @@ def running(self, run_context, run_response): @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_toolcall_stream.py b/python/tests/test_appbuilder_client_toolcall_stream.py index f2971e4aa..468bb79a1 100644 --- a/python/tests/test_appbuilder_client_toolcall_stream.py +++ b/python/tests/test_appbuilder_client_toolcall_stream.py @@ -5,7 +5,7 @@ import os @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_toolcall_v2.py b/python/tests/test_appbuilder_client_toolcall_v2.py index 45bbcc460..a9351f453 100644 --- a/python/tests/test_appbuilder_client_toolcall_v2.py +++ b/python/tests/test_appbuilder_client_toolcall_v2.py @@ -5,7 +5,7 @@ import os @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_appbuilder_client_toolcall_v3.py b/python/tests/test_appbuilder_client_toolcall_v3.py index 9fdc73486..78eca25ad 100644 --- a/python/tests/test_appbuilder_client_toolcall_v3.py +++ b/python/tests/test_appbuilder_client_toolcall_v3.py @@ -5,7 +5,7 @@ import os @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL","") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_async_appbuilder_client_toolcall.py b/python/tests/test_async_appbuilder_client_toolcall.py index 1e03f834b..b4c85917d 100644 --- a/python/tests/test_async_appbuilder_client_toolcall.py +++ b/python/tests/test_async_appbuilder_client_toolcall.py @@ -47,7 +47,7 @@ async def success(self, run_context, run_response): @unittest.skipUnless(os.getenv("TEST_CASE", "UNKNOWN") == "CPU_SERIAL", "") -class TestAgentRuntime(unittest.TestCase): +class TestAppBuilderClient(unittest.TestCase): def setUp(self): """ 设置环境变量。 diff --git a/python/tests/test_core_agent.py b/python/tests/test_core_agent.py index 23de1a4a7..ea0caa56e 100644 --- a/python/tests/test_core_agent.py +++ b/python/tests/test_core_agent.py @@ -17,7 +17,7 @@ import random from appbuilder.core.components.llms.style_writing import StyleWriting -from appbuilder.core.agent import AgentRuntime +from appbuilder.utils.flask_deploy import FlaskRuntime from appbuilder.core.component import Component from appbuilder.core.message import Message from appbuilder.utils.sse_util import SSEClient @@ -69,8 +69,8 @@ def setUp(self): def test_core_agent_create_flask1(self): component = FakeComponent1() - # agent = AgentRuntime(component=StyleWriting(model="eb")) - agent = AgentRuntime(component=component) + # agent = FlaskRuntime(component=StyleWriting(model="eb")) + agent = FlaskRuntime(component=component) app = agent.create_flask_app() client = app.test_client() @@ -122,7 +122,7 @@ def test_core_agent_create_flask1(self): def test_core_agent_create_flask2(self): component = FakeComponent2() - agent = AgentRuntime(component=component) + agent = FlaskRuntime(component=component) app = agent.create_flask_app() client = app.test_client() payload = { diff --git a/python/utils/chainlit.md b/python/utils/chainlit.md index d9ebfc4d8..32b94f6ca 100644 --- a/python/utils/chainlit.md +++ b/python/utils/chainlit.md @@ -11,8 +11,9 @@ - 提供 `API调用` & `交互式窗口` 两种服务化部署方式,支持快速上云,平滑嵌入到你的产品中 ## 如何使用AppBuilder-SDK & Chainlit可视化功能💻 -当前SDK中的`AgentRuntime`模块基于Chainlit实现了基础的可视化功能,支持AppBuilderClient + 能力组件实现可视化交互。 -- `chainlit_demo`接口支持基础组件的简单交互 +当前SDK中的`ChainlitRuntime`模块基于Chainlit实现了基础的可视化功能,支持AppBuilderClient + 能力组件实现可视化交互。 +- `chainlit_component`接口支持基础组件的简单文本交互 +- `chainlit_component_debug`接口支持基础组件的tool_eval方法交互,支持新协议输出渲染 - `chainlit_agent`接口支持AppBuilderClient的进阶交互,提供新建会话和上传文件的功能 如果对于可视化有更多需求,可以参考AppBuilder SDK中的代码,基于Chainlit进行二次开发。 diff --git a/python/utils/chainlit_deploy.py b/python/utils/chainlit_deploy.py new file mode 100644 index 000000000..fc9b2efc0 --- /dev/null +++ b/python/utils/chainlit_deploy.py @@ -0,0 +1,694 @@ +"""chainlit deploy""" +import os, sys +import shutil +import json +from typing import Any, Optional, Union +from click.testing import CliRunner +import uuid +import logging + +import appbuilder +from appbuilder.core.component import Component, Content +from appbuilder.core.message import Message +from appbuilder.utils.logger_util import logger +from appbuilder.core.context import init_context +from appbuilder.core.user_session import UserSession +from appbuilder.core.console.appbuilder_client.data_class import ToolChoice, Action + + +class ChainlitRuntime(object): + """ChainlitRuntime 是对组件和应用调用的chainlit服务化封装,开发者不是必须要用 ChainlitRuntime 才能运行自己的组件服务。 + ChainlitRuntime 可以快速帮助开发者服务化组件服务,并且提供对话框部署功能。 + 此外,结合 Component 和 Message 自带的运行和调试接口,可以方便开发者快速获得一个调试 Agent 的服务。 + + Examples: + + .. code-block:: python + + import os + import sys + import appbuilder + from appbuilder.utils.chainlit_deploy import ChainlitRuntime + os.environ["APPBUILDER_TOKEN"] = '...' + + component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" + ) + agent = ChainlitRuntime(component=component) + message = appbuilder.Message({"query": "你好"}) + print(agent.chat(message, stream=False)) + + .. code-block:: python + + import os + import sys + import appbuilder + from appbuilder.utils.chainlit_deploy import ChainlitRuntime + from + os.environ["APPBUILDER_TOKEN"] = '...' + + component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" + ) + agent = ChainlitRuntime(component=component) + message = appbuilder.Message({"query": "你好"}) + print(agent.chat(message, stream=False)) + + .. code-block:: python + + import os + import sys + import appbuilder + from appbuilder.utils.chainlit_deploy import ChainlitRuntime + from appbuilder.core.components.v2 import SimilarQuestion + os.environ["APPBUILDER_TOKEN"] = '...' + component = SimilarQuestion() + agent = ChainlitRuntime(component=component) + agent.chainlit_component_debug( + port=8092, + tool_eval_args={}, + query_name = "query" + ) + + Session 数据管理 : 除去上述简单应用外,还支持 Session 数据管理,下面是一个例子 + + .. code-block:: python + + import os + import sys + from appbuilder.core.component import Component + from appbuilder import ( + ChainlitRuntime, UserSession, Message, QueryRewrite, Playground, + ) + + os.environ["APPBUILDER_TOKEN"] = '...' + + class PlaygroundWithHistory(Component): + def __init__(self): + super().__init__() + self.query_rewrite = QueryRewrite(model="Qianfan-Agent-Speed-8k") + self.play = Playground( + prompt_template="{query}", + model="eb-4" + ) + + def run(self, message: Message, stream: bool=False): + user_session = UserSession() + # 获取 Session 历史数据 + history_queries = user_session.get_history("query", limit=1) + history_answers = user_session.get_history("answer", limit=1) + + if history_queries and history_answers: + history = [] + for query, answer in zip(history_queries, history_answers): + history.extend([query.content, answer.content]) + logging.info(f"history: {history}") + message = self.query_rewrite( + Message(history + [message.content]), rewrite_type="带机器人回复") + logging.info(f"message: {message}") + answer = self.play.run(message, stream) + # 保存本轮数据 + user_session.append({ + "query": message, + "answer": answer, + }) + return answer + + agent = ChainlitRuntime(component=PlaygroundWithHistory()) + agent.chainlit_component(port=8091) + + Session 信息查看 : 查看本地user_session.db数据库内部信息,下面是一个例子 + + .. code-block:: python + + import sqlite3 + import json + + # 连接到 SQLite 数据库 + # 如果文件不存在,会自动在当前目录创建: + user_session_path = 'your_user_session.db地址' + conn = sqlite3.connect(user_session_path) + cursor = conn.cursor() + + # 执行一条 SQL 语句,列出所有表 + cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") + print(cursor.fetchall()) + + # 查询appbuilder_session_messages表的列信息 + cursor.execute("PRAGMA table_info(appbuilder_session_messages);") + columns_info = cursor.fetchall() + + column_names = [info[1] for info in columns_info] # info[1]是列名的位置 + for column_name in column_names: + print(column_name) + + # 查询特定表中的数据 + cursor.execute("SELECT message_value FROM appbuilder_session_messages;") + for row in cursor.fetchall(): + print(json.loads(row[0])) + + # 关闭 Connection: + conn.close() + + """ + def __init__(self, + component: Component, + user_session_config: Optional[Union[Any, str]] = None, + user_session: Optional[UserSession] = None, + tool_choice: ToolChoice = None + ): + """init + + Args: + component (Component): 需要服务化的组件实例 + user_session_config (sqlalchemy.engine.URL|str|None): Session 输出存储配置字符串。默认使用 sqlite:///user_session.db + 遵循 sqlalchemy 后端定义,参考文档:https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls + user_session (UserSession): 用户会话管理器,如果不指定则自动生成一个默认的 UserSession + tool_choice (ToolChoice): 可用于Agent强制执行的组件工具 + + """ + self.component = component + if user_session is None: + if user_session_config is None: + self.user_session = UserSession() + logger.info("init user_session with default UserSession") + else: + self.user_session = UserSession(user_session_config) + logger.info("init user_session with user_session_config") + else: + self.user_session = user_session + self.tool_choice = tool_choice + self._prepare_chainlit_readme() + + def chat(self, message: Message, stream: bool = False, **kwargs) -> Message: + """ + 执行一次对话 + + Args: + message (Message): 该次对话用户输入的 Message + stream (bool): 是否流式请求 + **args: 其他参数,会被透传到 component + + Returns: + Message(Message): 返回的 Message + """ + return self.component.run(message=message, stream=stream, **kwargs) + + def _prepare_chainlit_readme(self): + """ + 准备 Chainlit 的 README 文件 + 从 utils 文件夹中拷贝 chainlit.md 文件到当前工作目录下,如果当前工作目录下已存在 chainlit.md 文件,则不拷贝。 + + Args: + None + + Returns: + None + + Raises: + None + """ + try: + # 获取当前python命令执行的路径,而不是文件的位置 + cwd_path = os.getcwd() + # 获取当前文件的路径所在文件夹 + current_file_path = os.path.dirname( + os.path.dirname(os.path.abspath(__file__))) + chainlit_readme_path = os.path.join( + current_file_path, "utils/chainlit.md") + logger.debug(f"chainlit_readme_path:{chainlit_readme_path}") + if not os.path.exists(chainlit_readme_path): + raise FileNotFoundError(f"Chainlit readme file not found at {chainlit_readme_path}") + + # 拷贝chainlit_readme到cwd_path + # 如果cwd_path下已经存在chainlit_readme,则不拷贝 + if not os.path.exists(os.path.join(cwd_path, "chainlit.md")): + shutil.copy(chainlit_readme_path, cwd_path) + logger.info("chainlit readme file copied successfully") + except: + logger.error("Failed to copy chainlit.md to current directory") + + def chainlit_component(self, host='0.0.0.0', port=8091): + """ + 将 component 服务化,提供 chainlit demo 页面 + + Args: + host (str): 服务 host + port (int): 服务 port + + Returns: + None + """ + try: + import chainlit as cl + import chainlit.cli + except ImportError: + raise ImportError("chainlit module is not installed. Please install it using 'pip install " + "chainlit'.") + @cl.on_message # this function will be called every time a user inputs a message in the UI + async def main(message: cl.Message): + session_id = cl.user_session.get("id") + request_id = str(uuid.uuid4()) + init_context(session_id=session_id, request_id=request_id) + msg = cl.Message(content="") + await msg.send() + stream_message = self.chat(Message(message.content), stream=True) + + for part in stream_message.content: + if token := part or "": + await msg.stream_token(token) + await msg.update() + self.user_session._post_append() + + if os.getenv('APPBUILDER_RUN_CHAINLIT') == '1': + pass + else: + os.environ['APPBUILDER_RUN_CHAINLIT'] = '1' + target = sys.argv[0] + runner = CliRunner() + runner.invoke( + chainlit.cli.chainlit_run, [target, '--watch', "--port", port, "--host", host]) + + def chainlit_component_debug( + self, + host='0.0.0.0', + port=8092, + query_name: str = "query", + tool_eval_args: dict = {}): + """componnet tool_eval""" + """ + 将 appbuilder component 服务化,内部调用组件tool_eval方法,提供 chainlit demo 页面和各类型输出的渲染效果。 + 注意:目前只支持新协议组件 + + Args: + host (str): 服务 host + port (int): 服务 port + query_name(str): 组件tool_eval运行时接收自然语言输入的变量名 + tool_eval_args(dict): 组件tool_eval运行需要的其他参数 + + Returns: + None + """ + try: + import chainlit as cl + import chainlit.cli + except ImportError: + raise ImportError("chainlit module is not installed. Please install it using 'pip install " + "chainlit'.") + + def _chat(message: cl.Message): + query = message.content + tool_eval_args.update({query_name: query}) + tool_result = self.component.tool_eval(**tool_eval_args) + try: + message_result = _convert_componentoutput_to_msg(tool_result) + yield from message_result + except Exception as e: + text = "组件输出报错:" + str(e) + elements = [ + cl.Text( + name="error", + content=text + ) + ] + message_result = cl.Message( + content="组件输出报错", + elements=elements + ) + yield message_result + + def _echart_to_plotly(echarts_data): + """把echart图表数据转换为plotly.graph_objects.Figure图片""" + try: + import plotly.graph_objects as go + except ImportError: + raise ImportError("plotly module is not installed. Please install it using 'pip install plotly'") + + fig = go.Figure() + + # 处理不同的图表类型 + for series in echarts_data.get('series', []): + if "dataset" in echarts_data: + data = echarts_data['dataset'][0]["source"] + else: + data = series['data'] + + if series['type'] == 'bar': + fig.add_trace(go.Bar( + x=echarts_data['xAxis']['data'], + y=data, + name=series.get('name', '') + )) + elif series['type'] == 'line': + if 'xAxis' in echarts_data and 'data' in echarts_data['xAxis']: + x = echarts_data['xAxis']['data'] + y = data + else: + x = [point[0] for point in data] + y = [point[1] for point in data] + fig.add_trace(go.Scatter( + x=x, + y=y, + mode='lines+markers', + name=series.get('name', '') + )) + elif series['type'] == 'scatter': + fig.add_trace(go.Scatter( + x=[point[0] for point in data], + y=[point[1] for point in data], + mode='markers', + name=series.get('name', '') + )) + elif series['type'] == 'pie': + fig.add_trace(go.Pie( + labels=[item['name'] for item in data], + values=[item['value'] for item in data], + name=series.get('name', '') + )) + elif series['type'] in ['tree', 'treemap']: + data = data[0]['children'] + def process_data(data, parent=""): + labels = [] + parents = [] + for item in data: + labels.append(item['name']) + parents.append(parent) + if item['children']: + child_labels, child_parents = process_data(item['children'], item['name']) + labels.extend(child_labels) + parents.extend(child_parents) + return labels, parents + + labels, parents = process_data(data) + + # 创建Treemap图 + fig.add_trace(go.Treemap( + labels=labels, + parents=parents + )) + elif series['type'] == 'funnel': + fig.add_trace(go.Funnel( + y=[item['name'] for item in data], + x=[item['value'] for item in data] + )) + elif series['type'] == 'radar': + indicator_data = echarts_data["radar"]["indicator"] + series_data = data[0]["value"] + for indicator in indicator_data: + fig.add_trace(go.Scatterpolar( + r=series_data, + theta=[indicator["name"]] * len(series_data), + fill="toself", + name=indicator["name"], + subplot="polar" + )) + + # 更新布局 + layout_update = { + 'title': echarts_data.get('title', {}).get('text', ''), + 'legend': dict(orientation='h', yanchor='bottom', y=-0.2), + 'margin': dict(t=70, r=100, b=50, l=20) + } + + if 'radar' in echarts_data: + layout_update['polar'] = { + 'radialaxis': {'visible': True}, + 'angularaxis': {'visible': True} + } + else: + layout_update['xaxis_title'] = echarts_data.get('xAxis', {}).get('name', '') + if 'yAxis' in echarts_data: + yaxis = echarts_data['yAxis'] + if isinstance(yaxis, list): + yaxis = yaxis[0] + else: + yaxis = {} + layout_update['yaxis_title'] = yaxis.get('name', '') + + fig.update_layout(**layout_update) + return fig + + def _convert_code(name: str, code: str): + """把组件code输出转换为code格式的Text输出""" + from pygments.lexers import guess_lexer + try: + lexer = guess_lexer(code) + language = lexer.name + except: + language = "" + logging.info(f"langauge: {language}") + return cl.Text( + name=name, + content=code, + display="inline", + language=language + ) + + def _convert_text(text): + """解析组件Text输出,主要提取echart图表数据""" + elements = [] + import re + pattern = r'\n\n```echarts-option\n(.*?)\n```' + echarts_match = re.search(pattern, text.info, re.DOTALL) + if echarts_match: + echarts_data = echarts_match.group(1) + logging.info(f"chart data: {echarts_data}") + echarts_data_list = json.loads(echarts_data) + for echarts_data in echarts_data_list: + fig = _echart_to_plotly(echarts_data) + elements.append(cl.Plotly( + name="chart", + figure=fig, + display="inline" + )) + + rest = text.info[echarts_match.end():].strip() + if rest: + elements.append(cl.Text( + name="text", + content=rest, + display = "inline" + )) + if not echarts_match: + elements.append(cl.Text( + name="text", + content=text.info.strip(), + display = "inline" + )) + return elements + + def _convert_content_to_elements(content: Content) -> list: + """把AB ComponentOutput.Content转换为chainlit的elements""" + elements = [] + type = content.type + text = content.text + if type == "text" or type == "oral_text": + elements.extend(_convert_text(text)) + elif type == "image": + elements.append(cl.Image( + name="image", + display="inline", + size="large", + url=text.url, + )) + elif type == "files": + if text.url: + elements.append(cl.File( + name=text.filename, + url=text.url, + display="inline", + )) + elif type == "audio": + elements.append(cl.Audio( + name="audio", + display="inline", + size="medium", + url=text.url + )) + elif type == "chart": + json_data = json.loads(text.data) + fig = _echart_to_plotly(json_data) + elements.append(cl.Plotly( + name="chart", + figure=fig, + display="inline" + )) + elif type == "code": + elements.append(_convert_code( + "code", text.code + )) + elif type == "references": + json_data = text.model_dump_json(indent=4) + elements.append(cl.Text( + name="reference", + content=json_data, + display="inline", + language="json" + )) + elif type == "json": + data = json.loads(text.data) + data_str = json.dumps( + data, + ensure_ascii=False, + indent=4 + ) + elements.append(cl.Text( + name="json", + content=data_str, + display="inline", + )) + elif type == "urls": + elements.append(cl.Text( + name="url", + content="下载链接:"+text.url + )) + else: + logging.info(f"invalid type: {type}") + raise ValueError("invalid type") + + return elements + + def _convert_componentoutput_to_msg(result): + """把ComponentOutput转换为cl.Message""" + elements = [] + for iter in result: + content = iter.content[0] + elements = _convert_content_to_elements(content) + tool_name = component.manifests[0]["name"] + msg = cl.Message(content=tool_name, elements=elements) + yield msg + + @cl.on_message # this function will be called every time a user inputs a message in the UI + async def main(message: cl.Message): + logging.info(f"message: {message.content}") + stream_message = _chat(message) + for msg in stream_message: + logging.info(f"msg {msg}") + await msg.send() + + await msg.update() + + if os.getenv('APPBUILDER_RUN_CHAINLIT') == '1': + pass + else: + os.environ['APPBUILDER_RUN_CHAINLIT'] = '1' + target = sys.argv[0] + runner = CliRunner() + runner.invoke( + chainlit.cli.chainlit_run, [target, '--watch', "--port", port, "--host", host]) + + + def chainlit_agent(self, host='0.0.0.0', port=8091): + """ + 将 appbuilder client 服务化,提供 chainlit demo 页面 + + Args: + host (str): 服务 host + port (int): 服务 port + + Returns: + None + """ + try: + import chainlit as cl + import chainlit.cli + except ImportError: + raise ImportError("chainlit module is not installed. Please install it using 'pip install " + "chainlit'.") + if not isinstance(self.component, appbuilder.AppBuilderClient): + raise ValueError( + "chainlit_agent require component must be an instance of AppBuilderClient") + + conversation_ids = [] + interrupt_dict = {} + + def _chat(message: cl.Message): + if len(conversation_ids) == 0: + raise ValueError("create new conversation failed!") + conversation_id = conversation_ids[-1] + file_ids = [] + if len(message.elements) > 0: + file_id = self.component.upload_local_file( + conversation_id, message.elements[0].path) + file_ids.append(file_id) + + interrupt_ids = interrupt_dict.get(conversation_id, []) + interrupt_event_id = interrupt_ids.pop() if len(interrupt_ids) > 0 else None + action = None + if interrupt_event_id is not None: + action = Action.create_resume_action(interrupt_event_id) + + tmp_message = self.component.run(conversation_id=conversation_id, query=message.content, file_ids=file_ids, + stream=True, tool_choice=self.tool_choice, action=action) + res_message=list(tmp_message.content) + + interrupt_event_id = None + for ans in res_message: + for event in ans.events: + if event.content_type == "chatflow_interrupt": + interrupt_event_id = event.detail.get("interrupt_event_id") + if event.content_type == "publish_message" and event.event_type == "chatflow": + answer = event.detail.get("message") + ans.answer += answer + + if interrupt_event_id is not None: + interrupt_ids.append(interrupt_event_id) + interrupt_dict[conversation_id] = interrupt_ids + tmp_message.content = res_message + return tmp_message + + @cl.on_chat_start + async def start(): + session_id = cl.user_session.get("id") + request_id = str(uuid.uuid4()) + init_context(session_id=session_id, request_id=request_id) + conversation_ids.append(self.component.create_conversation()) + interrupt_dict[conversation_ids[-1]] = [] + + @cl.on_message # this function will be called every time a user inputs a message in the UI + async def main(message: cl.Message): + msg = cl.Message(content="") + await msg.send() + await msg.update() + + stream_message = _chat(message) + detail_json_list = [] + for part in stream_message.content: + if token := part.answer or "": + await msg.stream_token(token) + for event in part.events: + detail = event.detail + detail_json = json.dumps( + detail, indent=4, ensure_ascii=False) + detail_json_list.append(detail_json) + await msg.update() + + @cl.step(name="详细信息") + def show_json(detail_json): + return "```json\n" + detail_json + "\n```" + for detail_json in detail_json_list: + if len(detail_json) > 2: + show_json(detail_json) + await msg.update() + self.user_session._post_append() + + if os.getenv('APPBUILDER_RUN_CHAINLIT') == '1': + pass + else: + os.environ['APPBUILDER_RUN_CHAINLIT'] = '1' + target = sys.argv[0] + runner = CliRunner() + runner.invoke( + chainlit.cli.chainlit_run, [target, '--watch', "--port", port, "--host", host]) + + +if __name__ == "__main__": + from appbuilder.core.components.v2 import Text2Image + component = Text2Image() + agent = ChainlitRuntime( + component=component, + ) + agent.chainlit_component_debug(port=8092, tool_eval_args={}, + query_name = "query") diff --git a/python/utils/flask_deploy.py b/python/utils/flask_deploy.py new file mode 100644 index 000000000..f7c12cc65 --- /dev/null +++ b/python/utils/flask_deploy.py @@ -0,0 +1,389 @@ +import uuid +import json +import copy +from typing import Optional, Union, Any + +import appbuilder +from appbuilder.core.component import Component +from appbuilder.core.message import Message +from appbuilder.core.user_session import UserSession +from appbuilder.utils.logger_util import logger +from appbuilder.core.context import init_context + + +# 流式场景首包超时时,最大重试次数 +MAX_RETRY_COUNT = 3 + +class FlaskRuntime(object): + r""" + FlaskRuntime 是对应用调用的服务化封装, 开发者不是必须要用 FlaskRuntime 才能运行自己的组件服务。 + FlaskRuntime提供chat直接对话接口; 也支持使用 Gunicorn 这样的 WSGI 服务器来运行服务, 提供API部署方式。 + + + Examples: + # 直接调用chat接口进行对话 + .. code-block:: python + + import os + import sys + import appbuilder + from appbuilder.utils.flask_deploy import FlaskRuntime + os.environ["APPBUILDER_TOKEN"] = '...' + + component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" + ) + agent = FlaskRuntime(component=component) + message = appbuilder.Message({"query": "你好"}) + print(agent.chat(message, stream=False)) + + # 启动一个flask服务, 使用curl调用flask服务 + .. code-block:: python + + import os + import sys + import appbuilder + from appbuilder.utils.flask_deploy import FlaskRuntime + os.environ["APPBUILDER_TOKEN"] = '...' + + component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" + ) + user_session_config = "sqlite:///foo.db" + agent = FlaskRuntime( + component=component, user_session_config=user_session_config) + agent.serve(debug=False, port=8091) + + .. code-block:: shell + + curl --location 'http://0.0.0.0:8091/chat' \ + --header 'Content-Type: application/json' \ + --header 'X-Appbuilder-Token: ...' \ + --data '{ + "message": "你是谁", + "stream": false + }' + + Session 数据管理 : 除去上述简单应用外,还支持 Session 数据管理,下面是一个例子 + + .. code-block:: python + + import os + import sys + from appbuilder.core.component import Component + from appbuilder import ( + FlaskRuntime, UserSession, Message, QueryRewrite, Playground, + ) + + os.environ["APPBUILDER_TOKEN"] = '...' + + class PlaygroundWithHistory(Component): + def __init__(self): + super().__init__() + self.query_rewrite = QueryRewrite(model="Qianfan-Agent-Speed-8k") + self.play = Playground( + prompt_template="{query}", + model="eb-4" + ) + + def run(self, message: Message, stream: bool=False): + user_session = UserSession() + # 获取 Session 历史数据 + history_queries = user_session.get_history("query", limit=1) + history_answers = user_session.get_history("answer", limit=1) + + if history_queries and history_answers: + history = [] + for query, answer in zip(history_queries, history_answers): + history.extend([query.content, answer.content]) + logging.info(f"history: {history}") + message = self.query_rewrite( + Message(history + [message.content]), rewrite_type="带机器人回复") + logging.info(f"message: {message}") + answer = self.play.run(message, stream) + # 保存本轮数据 + user_session.append({ + "query": message, + "answer": answer, + }) + return answer + + agent = FlaskRuntime(component=PlaygroundWithHistory()) + agent.server() + + Session 信息查看 : 查看本地user_session.db数据库内部信息,下面是一个例子 + + .. code-block:: python + + import sqlite3 + import json + + # 连接到 SQLite 数据库 + # 如果文件不存在,会自动在当前目录创建: + user_session_path = 'your_user_session.db地址' + conn = sqlite3.connect(user_session_path) + cursor = conn.cursor() + + # 执行一条 SQL 语句,列出所有表 + cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") + print(cursor.fetchall()) + + # 查询appbuilder_session_messages表的列信息 + cursor.execute("PRAGMA table_info(appbuilder_session_messages);") + columns_info = cursor.fetchall() + + column_names = [info[1] for info in columns_info] # info[1]是列名的位置 + for column_name in column_names: + print(column_name) + + # 查询特定表中的数据 + cursor.execute("SELECT message_value FROM appbuilder_session_messages;") + for row in cursor.fetchall(): + print(json.loads(row[0])) + + # 关闭 Connection: + conn.close() + """ + def __init__(self, + component: Component, + user_session_config: Optional[Union[Any, str]] = None, + user_session: Optional[UserSession] = None + ): + """init + + Args: + component (Component): 可运行的 Component, 需要实现 run(message, stream, args) 方法 + user_session_config (sqlalchemy.engine.URL|str|None): Session 输出存储配置字符串。默认使用 sqlite:///user_session.db + 遵循 sqlalchemy 后端定义,参考文档:https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls + user_session (UserSession): 用户会话管理器,如果不指定则自动生成一个默认的 UserSession + """ + try: + from flask import Flask + + except ImportError: + raise ImportError("Flask module is not installed. Please install it using 'pip install " + "flask~=2.3.2 flask-restful==0.3.9'.") + self.app = Flask(__name__) + self.app.json.ensure_ascii = False + self.component = component + if user_session is None: + if user_session_config is None: + self.user_session = UserSession() + logger.info("init user_session with default UserSession") + else: + self.user_session = UserSession(user_session_config) + logger.info("init user_session with user_session_config") + else: + self.user_session = user_session + + def chat(self, message: Message, stream: bool = False, **args) -> Message: + """ + 执行一次对话 + + Args: + message (Message): 该次对话用户输入的 Message + stream (bool): 是否流式请求 + **args: 其他参数,会被透传到 component + + Returns: + Message(Message): 返回的 Message + """ + return self.component.run(message=message, stream=stream, **args) + + def create_flask_app(self, url_rule="/chat"): + """ + 创建 Flask 应用,主要用于 Gunicorn 这样的 WSGI 服务器来运行服务。 + + Args: + None + + Returns: + Flask + """ + try: + from flask import request, Response + from werkzeug.exceptions import BadRequest + from flask import stream_with_context + + except ImportError: + raise ImportError("Flask module is not installed. Please install it using 'pip install " + "flask~=2.3.2 flask-restful==0.3.9'.") + @self.app.errorhandler(BadRequest) + def handle_bad_request(e): + return {"code": 400, "message": f'{e}', "result": None}, 400 + + @self.app.errorhandler(Exception) + def handle_bad_request(e): + if hasattr(e, "code"): + return {"code": e.code, "message": str(e), "result": None}, 200 + else: + return {"code": 500, "message": "Internal Server Error", "result": None}, 200 + + def warp(): + """ + 根据component的lazy_certification属性处理请求。 + + Args: + 无参数。 + + Returns: + 如果stream为True,则返回流式响应(Content-Type为text/event-stream)。 + 如果stream为False,则返回包含处理结果的字典。 + + Raises: + BadRequest: 当请求头中缺少必要的X-Appbuilder-Authorization时抛出。 + BadRequest: 当请求体中缺少必要的message字段时抛出。 + BadRequest: 当请求体中session_id字段不是字符串类型时抛出。 + BadRequest: 当请求体中stream字段不是布尔类型时抛出。 + + """ + # 根据component是否lazy_certification,分成两种情况: + # 1. lazy_certification为True,初始化时未被认证,每次请求都需要带入AppbuilderToken + # 2. lazy_certification为False,初始化时已经认证,请求时不需要带入AppbuilderToken,并且带入也无效 + if self.component.lazy_certification: + app_builder_token = None + for key in ["X-Appbuilder-Token", "X-Appbuilder-Authorization"]: + if key in request.headers: + app_builder_token = request.headers[key] + break + if not app_builder_token: + raise BadRequest( + "X-Appbuilder-Authorization is required in Headers") + try: + self.component.set_secret_key_and_gateway( + secret_key=app_builder_token) + except appbuilder.core._exception.BaseRPCException as e: + logger.error(f"failed to verify. err={e}", exc_info=True) + raise BadRequest("X-Appbuilder-Authorization invalid") + except Exception as e: + logger.error(f"failed to verify. err={e}", exc_info=True) + raise e + else: + pass + + data = request.get_json() + if "message" not in data: + raise BadRequest("message is required") + message = Message(data.pop('message')) + if "session_id" not in data: + session_id = str(uuid.uuid4()) + else: + session_id = data.pop("session_id") + if not isinstance(session_id, str): + raise BadRequest("session_id must be str type") + if "stream" not in data: + stream = False + else: + stream = data.pop("stream") + if not isinstance(stream, bool): + raise BadRequest("stream must be bool type") + request_id = request.headers.get("X-Appbuilder-Request-Id", str(uuid.uuid4())) + user_id = request.headers.get("X-Appbuilder-User-Id", None) + + init_context(session_id=session_id, request_id=request_id, user_id=user_id) + logger.info( + f"request_id={request_id}, session_id={session_id}] message={message}," + f" stream={stream}, data={data}, start run...") + + def gen_sse_resp(): + with self.app.app_context(): + received_first_packet = False + retry_count = 0 + while retry_count < MAX_RETRY_COUNT: + try: + answer = self.chat(message, stream, **data) + except Exception as e: # 调用chat方法报错,直接返回 + code = 500 if not hasattr(e, "code") else e.code + err_resp = {"code": code, "message": "InternalServerError", "result": None} + logger.error( + f"request_id={request_id}, session_id={session_id}, err={e}, execute self.chat failed", exc_info=True) + yield "data: " + json.dumps(err_resp, ensure_ascii=False) + "\n\n" + return + else: # 调用chat方法成功,开始生成流式事件 + content_iterator = iter(answer.content) + answer.content = None + result = None + try: + for sub_content in content_iterator: + result = copy.deepcopy(answer) + result.content = sub_content + yield "data: " + json.dumps({ + "code": 0, "message": "", + "result": { + "session_id": session_id, + "is_completion": False, + "answer_message": json.loads(result.json(exclude_none=True)) + } + }, ensure_ascii=False) + "\n\n" + received_first_packet = True + except Exception as e: + retry_count += 1 + logger.error( + f"[request_id={request_id}, session_id={session_id}] err={e}, " + f"retry_count={retry_count}", exc_info=True) + # 如果未收到首包且重试次数小于最大重试次数,则尝试重新执行一次chat方法 + if not received_first_packet and retry_count < MAX_RETRY_COUNT: + continue + else: # 其它情况返回 + logger.error( + f"[request_id={request_id}, session_id={session_id}] err={e}, " + f"retry_count={retry_count}, received_first_packet={received_first_packet}" + , exc_info=True) + code = 500 if not hasattr(e, "code") else e.code + err_resp = {"code": code, "message": "InternalServerError", "result": None} + yield "data: " + json.dumps(err_resp, ensure_ascii=False) + "\n\n" + return + result.content = "" + yield "data: " + json.dumps({ + "code": 0, "message": "", + "result": { + "session_id": session_id, + "is_completion": True, + "answer_message": json.loads(result.json(exclude_none=True)) + } + }, ensure_ascii=False) + "\n\n" + logger.info( + f"request_id={request_id}, session_id={session_id}]" + f"retry_count={retry_count}, success response", exc_info=True) + self.user_session._post_append() + return # 正常返回 + + if stream: # 流式 + return Response(stream_with_context(gen_sse_resp()), 200, + {'Content-Type': 'text/event-stream; charset=utf-8'}) + if not stream: # 非流式 + try: + answer = self.chat(message, stream, **data) + blocking_result = json.loads(copy.deepcopy(answer).json(exclude_none=True)) + logger.debug(f"[request_id={request_id}, session_id={session_id}] blocking_result={blocking_result}") + self.user_session._post_append() + return { + "code": 0, "message": "", + "result": {"session_id": session_id, "answer_message": blocking_result} + } + except Exception as e: + logger.error( + f"[request_id={request_id}, session_id={session_id}] err={e}", exc_info=True) + code = 500 if not hasattr(e, "code") else e.code + return {"code": code, "message": "InternalServerError", "result": None} + + self.app.add_url_rule(url_rule, 'chat', warp, methods=['POST']) + return self.app + + def serve(self, host='0.0.0.0', debug=True, port=8092, url_rule="/chat"): + """ + 将 component 服务化,提供 Flask http API 接口 + + Args: + host (str): 服务运行的host地址,默认为'0.0.0.0' + debug (bool): 是否开启debug模式,默认为True + port (int): 服务运行的端口号,默认为8092 + url_rule (str): 服务的URL规则,默认为"/chat" + + Returns: + None + """ + self.app = self.create_flask_app(url_rule=url_rule) + self.app.run(host=host, debug=debug, port=port) \ No newline at end of file diff --git a/reinstall.sh b/reinstall.sh new file mode 100644 index 000000000..610d64509 --- /dev/null +++ b/reinstall.sh @@ -0,0 +1,4 @@ +#! /bin/bash +pip3 uninstall -y appbuilder-sdk +python3 setup.py bdist_wheel +pip3 install dist/appbuilder_sdk-1.0.3-py3-none-any.whl \ No newline at end of file diff --git a/setup.py b/setup.py index 2f9c04c10..3eea3e95f 100755 --- a/setup.py +++ b/setup.py @@ -25,6 +25,7 @@ import datetime from setuptools import setup, find_packages + with open('requirements.txt') as f: requirements = f.read().splitlines() From 5792baf95d4a6a935b7f057fc82b82cd767d64e3 Mon Sep 17 00:00:00 2001 From: yepeiwen01 Date: Wed, 12 Mar 2025 16:42:18 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/python-package.yml | 2 +- reinstall.sh | 4 ---- setup.py | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 reinstall.sh diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index fd70db57f..01fa08c6f 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -335,4 +335,4 @@ jobs: run: | echo "检测到Java文件被更改(根据环境变量APPBUILDER_JAVA_TESTS),准备启动Run Java tests with Jacoco部分..." cd cicd/app-builder/java - bash print_coverage.sh \ No newline at end of file + bash print_coverage.sh diff --git a/reinstall.sh b/reinstall.sh deleted file mode 100644 index 610d64509..000000000 --- a/reinstall.sh +++ /dev/null @@ -1,4 +0,0 @@ -#! /bin/bash -pip3 uninstall -y appbuilder-sdk -python3 setup.py bdist_wheel -pip3 install dist/appbuilder_sdk-1.0.3-py3-none-any.whl \ No newline at end of file diff --git a/setup.py b/setup.py index 3eea3e95f..2f9c04c10 100755 --- a/setup.py +++ b/setup.py @@ -25,7 +25,6 @@ import datetime from setuptools import setup, find_packages - with open('requirements.txt') as f: requirements = f.read().splitlines() From 6505310047a92c8a7f078ce90312367751acd644 Mon Sep 17 00:00:00 2001 From: yepeiwen01 Date: Thu, 13 Mar 2025 18:06:41 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=85=BC=E5=AE=B9AgentRuntime=E6=97=A7?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../advanced_application/cloud_deploy.ipynb | 12 +- cookbooks/components/agent_runtime.ipynb | 812 ++++++++++++++++++ .../components/rag_with_baidusearch.ipynb | 14 +- .../2024_05_16/service_deploy.py | 3 +- python/__init__.py | 3 + python/core/agent.py | 645 ++++++++++++++ 6 files changed, 1470 insertions(+), 19 deletions(-) create mode 100644 cookbooks/components/agent_runtime.ipynb create mode 100644 python/core/agent.py diff --git a/cookbooks/advanced_application/cloud_deploy.ipynb b/cookbooks/advanced_application/cloud_deploy.ipynb index e45a685de..8a55a5d03 100644 --- a/cookbooks/advanced_application/cloud_deploy.ipynb +++ b/cookbooks/advanced_application/cloud_deploy.ipynb @@ -93,10 +93,9 @@ "# 编写服务运行代码\n", "# sample/sample.py\n", "import appbuilder\n", - "from appbuilder.utils.flask_deploy import FlaskRuntime\n", "\n", "component = appbuilder.Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\")\n", - "agent = FlaskRuntime(component=component)\n", + "agent = appbuilder.AgentRuntime(component=component)\n", "agent.serve(port=8091)" ] }, @@ -143,10 +142,9 @@ "outputs": [], "source": [ "import appbuilder\n", - "from appbuilder.utils.flask_deploy import FlaskRuntime\n", "\n", "component = appbuilder.Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\")\n", - "agent = FlaskRuntime(component=component)\n", + "agent = appbuilder.AgentRuntime(component=component)\n", "agent.serve(port=8091)" ] }, @@ -209,12 +207,12 @@ "outputs": [], "source": [ "import appbuilder\n", - "from appbuilder.utils.flask_deploy import FlaskRuntime\n", + "\n", "\n", "component = appbuilder.Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\")\n", "\n", - "agent = FlaskRuntime(component=component)\n", - "agent.chainlit_component(port=8091)" + "agent = appbuilder.AgentRuntime(component=component)\n", + "agent.chainlit_demo(port=8091)" ] }, { diff --git a/cookbooks/components/agent_runtime.ipynb b/cookbooks/components/agent_runtime.ipynb new file mode 100644 index 000000000..bb73547e6 --- /dev/null +++ b/cookbooks/components/agent_runtime.ipynb @@ -0,0 +1,812 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "f802e64d-4eaa-445d-a48a-1042a91bc394", + "metadata": { + "tags": [] + }, + "source": [ + "# 基于AgentRuntime服务化组件\n", + "\n", + "## 目标\n", + "使用 AgentRuntime 对组件进行服务化。\n", + "\n", + "AgentRuntime 是对组件(Component)的服务化封装,具体有如下几个功能:\n", + "- 一键服务化组件: 使得组件能够以服务的形式运行,支持 API 调用和对话框交互。\n", + "- Session 数据管理: 提供 Session 数据的管理功能,允许跟踪和存储用户会话数据。\n", + "- 请求时鉴权: 支持在请求时进行认证,确保安全性。\n", + "\n", + "\n", + "## 准备工作\n", + "### 安装Python SDK\n", + "\n", + "appbuilder 支持使用 pip 安装(要求Python >= 3.8),并且 AgentRuntime 服务化组件依赖 `appbuilder-sdk[serve]`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2939356f-61c2-42e9-9e0c-fc6729c193f6", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "pip install appbuilder-sdk 'appbuilder-sdk[serve]'" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "aeb2fa55-075f-48df-a9fb-8b40d9900684", + "metadata": {}, + "source": [ + "## 基本用法\n", + "\n", + "### 快速开始\n", + "\n", + "下面的示例会基于 Playground 组件,在 8091 端口部署 Web 服务: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41559341-fd7a-478c-a08b-1477d79e9d41", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-18T06:24:26.982459Z", + "start_time": "2023-12-18T06:23:53.771345Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", + "\n", + "component = appbuilder.Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\"\n", + ")\n", + "\n", + "agent = appbuilder.AgentRuntime(component=component)\n", + "agent.serve(port=8091)" + ] + }, + { + "cell_type": "markdown", + "id": "b71e24eb", + "metadata": {}, + "source": [ + "通过 Shell 命令测试启动的服务, 请求 Body 为组件 run 方法的入参:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12c71fa5", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "curl --location 'http://0.0.0.0:8091/chat' \\\n", + "--header 'Content-Type: application/json' \\\n", + "--data '{\n", + " \"message\": \"海淀区的面积是多少\",\n", + " \"stream\": false\n", + "}'" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5fc5bc38-6bc5-4187-a8fd-f802d77d89fa", + "metadata": {}, + "source": [ + "## AgentRuntime 参数说明" + ] + }, + { + "cell_type": "markdown", + "id": "c2364c35", + "metadata": {}, + "source": [ + "### 1. 类初始化参数说明\n", + "\n", + "AgentRuntime 初始化接受两个参数。\n", + "\n", + "| 参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |\n", + "|--|--|--|--|--|\n", + "| component | Component | 是 | 可运行的 Component, 该 Component 需要实现 run(message, stream, **args) 方法。 | Playground(prompt_template=\"{query}\", model=\"ERNIE-Bot\") |\n", + "| user_session_config | sqlalchemy.engine.URL\\|Str\\|None | 否 | 会话 Session 数据存储的数据库配置,遵循 sqlalchemy 后端定义,可参考[文档](https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls)。默认使用 sqlite:///user_session.db,即本地的 SQLite 存储 | \"sqlite:///user_session.db\" |" + ] + }, + { + "cell_type": "markdown", + "id": "62e1af06", + "metadata": {}, + "source": [ + "### 2. API 服务参数\n", + "\n", + "#### 2.1 请求参数\n", + "\n", + "**接口定义**\n", + "\n", + "| URL | Method |\n", + "|--|--|\n", + "| /chat | POST |\n", + "\n", + "**Header 参数**\n", + "\n", + "| 参数名称 | 是否必须 | 描述 | 示例值 |\n", + "|--|--|--|--|\n", + "| Content-Type | 是 | 必须设置为\"application/json\" | \"application/json\" |\n", + "| X-Appbuilder-Token | 否 | 开启请求时认证能力时需要带入 APPBUILDER_TOKEN 进行鉴权 | 前往千帆AppBuilder官网创建密钥,流程详见[文档](https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥) |\n", + "\n", + "**Body 参数**\n", + "\n", + "| 参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |\n", + "|--|--|--|--|--|\n", + "| message | Any | 是 | 透传到 component 的 run 方法的 message 参数 | \"海淀区的面积是多少\" |\n", + "| stream | Bool | 否 | 是否流式调用。透传到 component 的 run 方法的 stream 参数。默认为 false | false |\n", + "| session_id | Str | 否 | 用于标示同一个会话(Session)。如果不传该值,后端会自动生成 session_id,在响应参数中返回 | \"99680089-5acb-4298-9ade-a1a3f6c28102\" |\n", + "| 其他参数 | Any | 否 | 透传到 component 的 run 方法 | - |\n", + "\n", + "\n", + "#### 2.2 响应参数\n", + "分为非流式响应和流式响应。\n", + "\n", + "**非流式响应**\n", + "\n", + "| 参数名称 | 参数类型 | 描述 | 示例值 |\n", + "|--|--|--|--|\n", + "| code | Int | 错误码。值为0表示成功,否则为失败。非0错误详见错误码部分描述 | 0 |\n", + "| message | Str | 错误信息描述。 | \"Missing input variable query in message ['海淀区的面积是多少']\" |\n", + "| result | Object | 请求结果 | - |\n", + "| + answer_message | Object | 组件返回值,由返回的 Message 序列化得到 | {\"content\":\"海淀区是北京市的一个区,位于北京市主城区西部和西北部,东与西城区、朝阳区相邻,南与丰台区毗连,西与石景山区、门头沟区交界,北与昌平区接壤。海淀区的面积为**431平方千米**,约占北京市总面积的2.6%。\",\"extra\":{},\"id\":\"6b4e5019-a708-4bc5-a6ec-595fb4285677\",\"mtype\":\"dict\",\"name\":\"msg\"} |\n", + "| + session_id | Str | 用于标示同一个会话(Session) | \"99680089-5acb-4298-9ade-a1a3f6c28102\" |\n", + "\n", + "**流式响应**\n", + "\n", + "流式数据以追加的形式返回。流式和非流式的数据结构一致,不再描述。\n", + "\n", + "#### 2.3 响应示例\n", + "\n", + "分为非流式响应和流式响应。\n", + "\n", + "**非流式响应**\n", + "\n", + "```shell\n", + "{\n", + " \"code\": 0,\n", + " \"message\": \"\",\n", + " \"result\": {\n", + " \"answer_message\": {\n", + " \"content\": \"海淀区是北京市的一个区,位于北京市主城区西部和西北部,东与西城区、朝阳区相邻,南与丰台区毗连,西与石景山区、门头沟区交界,北与昌平区接壤。海淀区的面积为**431平方千米**,约占北京市总面积的2.6%。\",\n", + " \"extra\": {},\n", + " \"id\": \"6b4e5019-a708-4bc5-a6ec-595fb4285677\",\n", + " \"mtype\": \"dict\",\n", + " \"name\": \"msg\"\n", + " },\n", + " \"session_id\": \"99680089-5acb-4298-9ade-a1a3f6c28102\"\n", + " }\n", + "}\n", + "```\n", + "\n", + "**流式响应**\n", + "\n", + "```shell\n", + "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \"海淀区\", \"extra\": {}}}}\n", + "\n", + "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \",隶属于北京市,位于北京市主城区西部和西北部,东与西城区、朝阳区相邻,南与丰台区毗连,\", \"extra\": {}}}}\n", + "\n", + "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \"西与石景山区、门头沟区交界,北与昌平区接壤,总面积**431平方千米**。\", \"extra\": {}}}}\n", + "\n", + "data: {\"code\": 0, \"message\": \"\", \"result\": {\"session_id\": \"663303a9-d83d-481f-a084-872ece87989c\", \"answer_message\": {\"content\": \"\", \"extra\": {}}}}\n", + "```\n", + "\n", + "#### 2.4 错误码\n", + "| 错误码 | 描述 |\n", + "|--|--|\n", + "| 400 | 客户端请求参数错误 |\n", + "| 1000 | 服务端执行错误 |" + ] + }, + { + "cell_type": "markdown", + "id": "61923b00", + "metadata": {}, + "source": [ + "## 高级用法" + ] + }, + { + "cell_type": "markdown", + "id": "a2303c76", + "metadata": {}, + "source": [ + "### 1. 一键服务化组件 \n", + "AgentRuntime 可以快速组件以服务的形式运行,支持 API 调用和对话框交互。\n", + "\n", + "**1.1 API调用**\n", + "\n", + "API 调用的基础用法在快速开始小结已经给出,这里不再赘述。\n", + "\n", + "下面介绍使用 `gunicorn` 启动生产级 Web 服务的方法,`gunicorn` 是一个适用于 UNIX 的 Python WSGI HTTP 服务器,详见[项目链接](https://github.com/benoitc/gunicorn)。\n", + "\n", + "首先创建 `app.py` 文件,暴露 Flask App:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fde5cc94", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", + "\n", + "def get_flask_app():\n", + " component = appbuilder.Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\"\n", + " )\n", + " agent = appbuilder.AgentRuntime(component=component)\n", + " return agent.create_flask_app()" + ] + }, + { + "cell_type": "markdown", + "id": "a41ef57b", + "metadata": {}, + "source": [ + "基于 `gunicorn` 启动生产级服务:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2077833f", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "# 服务工作进程数\n", + "SERVER_WORKER_AMOUNT=8\n", + "# 服务工作进程启动方式\n", + "SERVER_WORKER_CLASS=gevent\n", + "# 服务超时时间\n", + "GUNICORN_TIMEOUT=60\n", + "\n", + "gunicorn \\\n", + " --bind \"0.0.0.0:8091\" \\\n", + " --workers ${SERVER_WORKER_AMOUNT} \\\n", + " --worker-class ${SERVER_WORKER_CLASS} \\\n", + " --timeout ${GUNICORN_TIMEOUT} \\\n", + " \"app:get_flask_app()\"" + ] + }, + { + "cell_type": "markdown", + "id": "673c7565", + "metadata": {}, + "source": [ + "**1.2 对话框交互**\n", + "\n", + "基于 chainlit 的对话框交互对被服务化的组件的 message 参数更加严格,要求能够接受 Str 的基础类型。\n", + "\n", + "执行下面的代码,会启动一个 chainlit 页面,页面地址:0.0.0.0:8091" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e485544f", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", + "\n", + "component = appbuilder.Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\"\n", + ")\n", + "\n", + "agent = appbuilder.AgentRuntime(component=component)\n", + "agent.chainlit_demo(port=8091)" + ] + }, + { + "cell_type": "markdown", + "id": "4d63bece", + "metadata": {}, + "source": [ + "Chainlit Demo页面示意图如下所示,\n", + "\n", + "![chainlit demo](image/agent_runtime_with_chainlit_demo.png)" + ] + }, + { + "cell_type": "markdown", + "id": "a074f367", + "metadata": {}, + "source": [ + "**1.3 对话框交互AppBuilderClient**\n", + "\n", + "基于 chainlit 的对话框交互AppBuilderClient,可实现对话交互。支持工作流Agent、自主规划Agent应用。\n", + "\n", + "执行下面的代码,会启动一个 chainlit 页面,页面地址:0.0.0.0:8091。可在页面上上传文档(可选)、执行对话。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a75e035", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import appbuilder\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = \"...\"\n", + "# 使用之前,在官网个人空间获取应用ID,如下图\n", + "app_id= \"...\"\n", + "client = appbuilder.AppBuilderClient(app_id)\n", + "agent = appbuilder.AgentRuntime(client)\n", + "agent.chainlit_agent(port=8091)" + ] + }, + { + "cell_type": "markdown", + "id": "d5162e29", + "metadata": {}, + "source": [ + "在官网个人空间获取应用ID\n", + "![get app_id](../app_builder_resources/app_id.png)\n", + "\n", + "使用服务上传文件并对话示例图如下所示\n", + "![chainlit demo](./image/agent_runtime_with_chainlit_agent.png)\n", + "\n", + "使用工作流Agent应用对话示例如下图所示\n", + "![chainlit demo](./image/agent_runtime_with_chainlit_chatflow.png)" + ] + }, + { + "cell_type": "markdown", + "id": "2392f46d", + "metadata": {}, + "source": [ + "### 2. Session 数据管理\n", + "AgentRuntime 提供 Session 数据的管理功能,允许跟踪和存储用户会话数据。一般只有在二次开发的组件需要使用该能力。\n", + "\n", + "**2.1 二次开发组件**\n", + "\n", + "二次开发的组件需要重写组件的 run(message, stream, **args)方法,并且至少需要有 message 和 stream 两个参数。\n", + "\n", + "下面基于 QueryRewrite 和 Playground 两个组件,开发 PlaygroundWithHistory 组件,该组件需要对会话数据进行操作。\n", + "\n", + "当使用 Component 独立运行时,会话数据会被存储于内存。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "079048e3", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import logging\n", + "from appbuilder.core.component import Component\n", + "from appbuilder import (\n", + " AgentRuntime, UserSession, Message, QueryRewrite, Playground,\n", + ")\n", + "\n", + "# 使用组件之前,请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥\n", + "os.environ[\"APPBUILDER_TOKEN\"] = '...'\n", + "\n", + "class PlaygroundWithHistory(Component):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.query_rewrite = QueryRewrite(model=\"Qianfan-Agent-Speed-8K\")\n", + " self.playground = Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\"\n", + " )\n", + "\n", + " def run(self, message: Message, stream: bool=False):\n", + " user_session = UserSession()\n", + " # 获取 Session 历史数据\n", + " history_queries = user_session.get_history(\"query\", limit=1)\n", + " history_answers = user_session.get_history(\"answer\", limit=1)\n", + "\n", + " # query 改写\n", + " if history_queries and history_answers:\n", + " history = []\n", + " for query, answer in zip(history_queries, history_answers):\n", + " history.extend([query.content, answer.content])\n", + " logging.info(f\"history: {history}\")\n", + " message = self.query_rewrite(\n", + " Message(history + [message.content]), rewrite_type=\"带机器人回复\")\n", + " logging.info(f\"message: {message}\") \n", + "\n", + " # 执行 playground\n", + " answer = self.playground.run(message, stream)\n", + "\n", + " # 保存本轮数据\n", + " user_session.append({\n", + " \"query\": message,\n", + " \"answer\": answer,\n", + " }) \n", + " return answer\n", + "\n", + "# component 可以独立运行,session数据会被保存于内存\n", + "playground_with_history_component = PlaygroundWithHistory()\n", + "print(playground_with_history_component.run(Message(\"海淀区的面积是多少\"), stream=False))" + ] + }, + { + "cell_type": "markdown", + "id": "480fd56d", + "metadata": {}, + "source": [ + "**2.2 会话数据存储数据库**\n", + "\n", + "使用 AgentRuntime 对 Component 服务化,会话数据会被存储于数据库。\n", + "下面的代码以 SQLite 为例展示该能力,更多数据库配置详见[文档](https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "111b11de", + "metadata": {}, + "outputs": [], + "source": [ + "user_session_config = \"sqlite:///foo.db\"\n", + "agent = appbuilder.AgentRuntime(\n", + " component=playground_with_history_component, \n", + " user_session_config=user_session_config)\n", + "agent.serve(port=8091)" + ] + }, + { + "cell_type": "markdown", + "id": "e7dc38ec", + "metadata": {}, + "source": [ + "### 3. 请求时鉴权\n", + "AgentRuntime 支持在请求时进行认证,确保安全性。\n", + "\n", + "使用该能力,在初始化组件时需要设置 lazy 鉴权:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2125bf4f", + "metadata": {}, + "outputs": [], + "source": [ + "import appbuilder\n", + "\n", + "# 无需配置 APPBUILDER_TOKEN 环境变量\n", + "\n", + "component = appbuilder.Playground(\n", + " prompt_template=\"{query}\",\n", + " model=\"ERNIE-Bot\",\n", + " lazy_certification=True, # 设置 lazy 鉴权,在创建时不进行认证\n", + ")\n", + "\n", + "agent = appbuilder.AgentRuntime(component=component)\n", + "agent.serve(port=8091)" + ] + }, + { + "cell_type": "markdown", + "id": "bbf35a0a", + "metadata": {}, + "source": [ + "当初始化组件时进行了 lazy 鉴权,请求时请求头必须带上 `X-Appbuilder-Token` (即Appbuilder密钥,获取流程详见[千帆AppBuilder官网创建密钥](https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1、创建密钥))进行鉴权:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "60dcfa37", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "curl --location 'http://0.0.0.0:8091/chat' \\\n", + " --header 'Content-Type: application/json' \\\n", + " --header 'X-Appbuilder-Token: ...' \\\n", + " --data '{\n", + " \"message\": \"海淀区的面积是多少\",\n", + " \"stream\": false\n", + " }'" + ] + }, + { + "cell_type": "markdown", + "id": "f8584416", + "metadata": {}, + "source": [ + "### 4. 查看user_session.db储存信息\n", + "\n", + "\n", + "使用该能力,查看用户对话信息。" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "9bbeb156", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [], + "source": [ + "import sqlite3 \n", + " \n", + "# 连接到 SQLite 数据库 \n", + "# 如果文件不存在,会自动在当前目录创建: \n", + "user_session_path = '本地user_session.db地址' \n", + "conn = sqlite3.connect(user_session_path) \n", + "cursor = conn.cursor() " + ] + }, + { + "cell_type": "markdown", + "id": "54cce03b", + "metadata": {}, + "source": [ + "执行 SQL 语句,列出SQLite数据库中的所有表" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "f4ca2963", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('appbuilder_session_messages',)]\n" + ] + } + ], + "source": [ + "# 执行一条 SQL 语句,列出所有表 \n", + "cursor.execute(\"SELECT name FROM sqlite_master WHERE type='table';\") \n", + "print(cursor.fetchall()) " + ] + }, + { + "cell_type": "markdown", + "id": "e5b838f4", + "metadata": {}, + "source": [ + "查询appbuilder_session_messages表的列信息,appbuilder_session_messages表的列信息为:\n", + "- id\n", + "- session_id\n", + "- request_id\n", + "- message_key\n", + "- message_value\n", + "- created_at\n", + "- updated_at\n", + "- deleted" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "1ac388d7", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id\n", + "session_id\n", + "request_id\n", + "message_key\n", + "message_value\n", + "created_at\n", + "updated_at\n", + "deleted\n" + ] + } + ], + "source": [ + "cursor.execute(\"PRAGMA table_info(appbuilder_session_messages);\") \n", + "columns_info = cursor.fetchall() \n", + "\n", + "column_names = [info[1] for info in columns_info] # info[1]是列名的位置 \n", + "for column_name in column_names: \n", + " print(column_name) " + ] + }, + { + "cell_type": "markdown", + "id": "3965454f", + "metadata": {}, + "source": [ + "查询表中的特定数据【以message_value信息为例】\n", + "输出content、id、token_usage等信息" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "2e6d9e45", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'content': '你好', 'name': 'msg', 'mtype': 'str', 'id': '90c8d150-c7b9-44a4-ac77-50dd61ee329a'}\n", + "{'content': '你好,我是百度研发的知识增强大语言模型,中文名是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。', 'name': 'msg', 'mtype': 'dict', 'id': '0fc6c5f7-23bf-4f25-8555-69b4155908b7', 'extra': {}, 'token_usage': {'prompt_tokens': 2, 'completion_tokens': 42, 'total_tokens': 44}}\n", + "{'content': '请介绍一下你自己', 'name': 'msg', 'mtype': 'dict', 'id': '4f5cf6d1-976e-456e-a632-93c4b2550523', 'extra': {'search_db': [{'content': '带机器人回复:请你扮演一个智能搜索改写补全机器人,请根据User的搜索历史以及对应的搜索结果,对最后一句话先进行主语继承改写,然后进行上下文信息补全,注意:不要改变原文的意思,答案要尽可能简洁,不要直接回答该问题,不要输出多于的内容。\\\\n\\\\n例子:\\\\n搜索历史:\\\\nUser:今天上午你干嘛了\\\\nAssistant:去打篮球啦\\\\nUser:好玩吗?\\\\n答案:\\\\n打篮球好玩吗?', 'dataset_id': '1f777fa3-26db-4237-98d5-075abc07a84f', 'dataset_name': '多轮改写Prompt', 'document_id': '92e0f30d-1f30-46f0-8377-59ab0fb6eb93', 'document_name': '多轮改写prompt_带机器人回复.txt', 'id': '61657591-f610-44f0-84ec-67cedcb66447', 'mock_id': '1', 'position': 0, 'score': 0.511053, 'sentences': [{'content': '带机器人回复:请你扮演一个智能搜索改写补全机器人,请根据User的搜索历史以及对应的搜索结果,对最后一句话先进行主语继承改写,然后进行上下文信息补全,注意:不要改变原文的意思,答案要尽可能简洁,不要直接回答该问题,不要输出多于的内容。\\\\n\\\\n例子:\\\\n搜索历史:\\\\nUser:今天上午你干嘛了\\\\nAssistant:去打篮球啦\\\\nUser:好玩吗?', 'id': '1f777fa3-26db-4237-98d5-075abc07a84f-5992356ea8c0c05485388623218e134e-975ec17bbf8206762df7cfb24a5cd85e-97468bdaf0accef718118a2b742d5cc0', 'score': 0.628708, 'source': None}], 'title': '多轮改写prompt_带机器人回复.txt', 'tokens': 0, 'type': 'engine', 'word_count': 188}]}, 'token_usage': {'prompt_tokens': 321, 'completion_tokens': 3, 'total_tokens': 324}}\n", + "{'content': '您好,我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。', 'name': 'msg', 'mtype': 'dict', 'id': 'f769c850-f4e5-4d02-a62a-766fd8c8132e', 'extra': {}, 'token_usage': {'prompt_tokens': 4, 'completion_tokens': 33, 'total_tokens': 37}}\n", + "{'content': '介绍一下baidu公司', 'name': 'msg', 'mtype': 'dict', 'id': '0ff3b298-7f01-4036-927d-722e00afaf33', 'extra': {'search_db': [{'content': '带机器人回复:请你扮演一个智能搜索改写补全机器人,请根据User的搜索历史以及对应的搜索结果,对最后一句话先进行主语继承改写,然后进行上下文信息补全,注意:不要改变原文的意思,答案要尽可能简洁,不要直接回答该问题,不要输出多于的内容。\\\\n\\\\n例子:\\\\n搜索历史:\\\\nUser:今天上午你干嘛了\\\\nAssistant:去打篮球啦\\\\nUser:好玩吗?\\\\n答案:\\\\n打篮球好玩吗?', 'dataset_id': '1f777fa3-26db-4237-98d5-075abc07a84f', 'dataset_name': '多轮改写Prompt', 'document_id': '92e0f30d-1f30-46f0-8377-59ab0fb6eb93', 'document_name': '多轮改写prompt_带机器人回复.txt', 'id': '61657591-f610-44f0-84ec-67cedcb66447', 'mock_id': '1', 'position': 0, 'score': 0.511053, 'sentences': [{'content': '带机器人回复:请你扮演一个智能搜索改写补全机器人,请根据User的搜索历史以及对应的搜索结果,对最后一句话先进行主语继承改写,然后进行上下文信息补全,注意:不要改变原文的意思,答案要尽可能简洁,不要直接回答该问题,不要输出多于的内容。\\\\n\\\\n例子:\\\\n搜索历史:\\\\nUser:今天上午你干嘛了\\\\nAssistant:去打篮球啦\\\\nUser:好玩吗?', 'id': '1f777fa3-26db-4237-98d5-075abc07a84f-5992356ea8c0c05485388623218e134e-975ec17bbf8206762df7cfb24a5cd85e-97468bdaf0accef718118a2b742d5cc0', 'score': 0.628708, 'source': None}], 'title': '多轮改写prompt_带机器人回复.txt', 'tokens': 0, 'type': 'engine', 'word_count': 188}]}, 'token_usage': {'prompt_tokens': 910, 'completion_tokens': 3, 'total_tokens': 913}}\n", + "{'content': '百度公司是中国最大的互联网搜索引擎提供商之一,也是全球领先的AI公司。以下是对百度的详细介绍:\\n\\n一、公司概况\\n\\n百度(BIDU)是一家提供中文搜索引擎的公司,由李彦宏于2000年1月在北京中关村创立。经过多年的发展,百度已经从单一的搜索引擎服务商成功转型为内容生态与人工智能(AI)融合的互联网公司。百度的使命是“用科技让复杂的世界更简单”,其核心价值观包括“简单可依赖”。\\n\\n二、主要业务与产品\\n\\n1. 搜索业务:百度搜索是中国最大的中文搜索引擎,每天响应来自全球各地的搜索请求。除了传统的网页、图片、视频等搜索结果外,还提供了知识图谱、语音搜索等创新功能。\\n2. 移动生态业务:百度APP是百度移动生态的核心产品,围绕看、搜、听、问、购等核心场景为用户提供服务。此外,百度还拥有信息流、智能小程序、百度知道、百度文库等一系列移动生态产品。\\n3. 智能云业务:百度智能云是百度提供的云计算服务平台,为企业提供计算、存储、网络等基础设施服务以及人工智能、大数据等中间件服务。\\n4. 智能驾驶业务:百度在自动驾驶领域具有领先地位,其Apollo自动驾驶平台已经发展出多种商业模式,包括自动驾驶技术解决方案、百度造车以及共享无人车等。\\n\\n三、财务状况与业绩表现\\n\\n根据百度发布的财报显示,其业绩表现亮眼。例如,在2023年,百度总营收达到了显著的水平,其中百度核心收入同比增长。这主要得益于公司在广告市场的持续领先地位以及非在线营销收入的增长。同时,百度在研发投入方面也保持了较高水平,以推动其AI技术的持续创新和发展。\\n\\n四、AI技术与创新\\n\\n百度在AI技术方面取得了显著成果。其文心大模型已经升级到4.0版本,用户规模超过了1亿。这一技术使得百度具备了与全球领先的AI产品相媲美的能力。此外,百度还在文字生成视频等领域进行了战略投资,以进一步拓展其业务范围并加强在AI领域的领先地位。\\n\\n综上所述,百度公司作为中国最大的互联网搜索引擎提供商和全球领先的AI公司之一,凭借其强大的技术实力和创新能力,在搜索、移动生态、智能云和智能驾驶等领域取得了显著的成果。', 'name': 'msg', 'mtype': 'dict', 'id': 'c4f02188-1206-4c02-be8e-1c5481428003', 'extra': {}, 'token_usage': {'prompt_tokens': 4, 'completion_tokens': 456, 'total_tokens': 460}}\n" + ] + } + ], + "source": [ + "import json\n", + "cursor.execute(\"SELECT message_value FROM appbuilder_session_messages;\") \n", + "for row in cursor.fetchall(): \n", + " print(json.loads(row[0]))" + ] + }, + { + "cell_type": "markdown", + "id": "5ff82880", + "metadata": {}, + "source": [ + "以id查询相关的agent_runtime信息" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "e79e2554", + "metadata": { + "vscode": { + "languageId": "shellscript" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "16010b88-d766-4524-81ee-37f96ceadb4d\n", + "b2c9d058-4475-4258-ad90-4334f3d024d5\n", + "0bdafb3d-f7e3-4187-bc1d-63cf51fbda29\n", + "query\n", + "{'content': '你好', 'name': 'msg', 'mtype': 'str', 'id': '90c8d150-c7b9-44a4-ac77-50dd61ee329a'}\n", + "2024-07-30 15:01:10.949475\n", + "2024-07-30 15:01:10.949485\n", + "0\n", + "4bd85fd0-2e5c-4de1-a47e-ea122f7e928c\n", + "b2c9d058-4475-4258-ad90-4334f3d024d5\n", + "0bdafb3d-f7e3-4187-bc1d-63cf51fbda29\n", + "answer\n", + "{'content': '你好,我是百度研发的知识增强大语言模型,中文名是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。', 'name': 'msg', 'mtype': 'dict', 'id': '0fc6c5f7-23bf-4f25-8555-69b4155908b7', 'extra': {}, 'token_usage': {'prompt_tokens': 2, 'completion_tokens': 42, 'total_tokens': 44}}\n", + "2024-07-30 15:01:10.955875\n", + "2024-07-30 15:01:10.955884\n", + "0\n", + "d6e433fc-ef4d-4ade-9a63-fec600e95481\n", + "b2c9d058-4475-4258-ad90-4334f3d024d5\n", + "6300b76b-2307-4ed3-9f6d-e61dfc621ff8\n", + "query\n", + "{'content': '请介绍一下你自己', 'name': 'msg', 'mtype': 'dict', 'id': '4f5cf6d1-976e-456e-a632-93c4b2550523', 'extra': {'search_db': [{'content': '带机器人回复:请你扮演一个智能搜索改写补全机器人,请根据User的搜索历史以及对应的搜索结果,对最后一句话先进行主语继承改写,然后进行上下文信息补全,注意:不要改变原文的意思,答案要尽可能简洁,不要直接回答该问题,不要输出多于的内容。\\\\n\\\\n例子:\\\\n搜索历史:\\\\nUser:今天上午你干嘛了\\\\nAssistant:去打篮球啦\\\\nUser:好玩吗?\\\\n答案:\\\\n打篮球好玩吗?', 'dataset_id': '1f777fa3-26db-4237-98d5-075abc07a84f', 'dataset_name': '多轮改写Prompt', 'document_id': '92e0f30d-1f30-46f0-8377-59ab0fb6eb93', 'document_name': '多轮改写prompt_带机器人回复.txt', 'id': '61657591-f610-44f0-84ec-67cedcb66447', 'mock_id': '1', 'position': 0, 'score': 0.511053, 'sentences': [{'content': '带机器人回复:请你扮演一个智能搜索改写补全机器人,请根据User的搜索历史以及对应的搜索结果,对最后一句话先进行主语继承改写,然后进行上下文信息补全,注意:不要改变原文的意思,答案要尽可能简洁,不要直接回答该问题,不要输出多于的内容。\\\\n\\\\n例子:\\\\n搜索历史:\\\\nUser:今天上午你干嘛了\\\\nAssistant:去打篮球啦\\\\nUser:好玩吗?', 'id': '1f777fa3-26db-4237-98d5-075abc07a84f-5992356ea8c0c05485388623218e134e-975ec17bbf8206762df7cfb24a5cd85e-97468bdaf0accef718118a2b742d5cc0', 'score': 0.628708, 'source': None}], 'title': '多轮改写prompt_带机器人回复.txt', 'tokens': 0, 'type': 'engine', 'word_count': 188}]}, 'token_usage': {'prompt_tokens': 321, 'completion_tokens': 3, 'total_tokens': 324}}\n", + "2024-07-30 15:01:19.161269\n", + "2024-07-30 15:01:19.161272\n", + "0\n", + "f0d76f00-93be-4d7c-a6b3-a9583fd677ad\n", + "b2c9d058-4475-4258-ad90-4334f3d024d5\n", + "6300b76b-2307-4ed3-9f6d-e61dfc621ff8\n", + "answer\n", + "{'content': '您好,我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。', 'name': 'msg', 'mtype': 'dict', 'id': 'f769c850-f4e5-4d02-a62a-766fd8c8132e', 'extra': {}, 'token_usage': {'prompt_tokens': 4, 'completion_tokens': 33, 'total_tokens': 37}}\n", + "2024-07-30 15:01:19.163405\n", + "2024-07-30 15:01:19.163411\n", + "0\n", + "936c394a-a3fa-48fd-a72f-b1778ebc35e4\n", + "b2c9d058-4475-4258-ad90-4334f3d024d5\n", + "5eb09e91-6496-44d9-9303-a4790e97f61c\n", + "query\n", + "{'content': '介绍一下baidu公司', 'name': 'msg', 'mtype': 'dict', 'id': '0ff3b298-7f01-4036-927d-722e00afaf33', 'extra': {'search_db': [{'content': '带机器人回复:请你扮演一个智能搜索改写补全机器人,请根据User的搜索历史以及对应的搜索结果,对最后一句话先进行主语继承改写,然后进行上下文信息补全,注意:不要改变原文的意思,答案要尽可能简洁,不要直接回答该问题,不要输出多于的内容。\\\\n\\\\n例子:\\\\n搜索历史:\\\\nUser:今天上午你干嘛了\\\\nAssistant:去打篮球啦\\\\nUser:好玩吗?\\\\n答案:\\\\n打篮球好玩吗?', 'dataset_id': '1f777fa3-26db-4237-98d5-075abc07a84f', 'dataset_name': '多轮改写Prompt', 'document_id': '92e0f30d-1f30-46f0-8377-59ab0fb6eb93', 'document_name': '多轮改写prompt_带机器人回复.txt', 'id': '61657591-f610-44f0-84ec-67cedcb66447', 'mock_id': '1', 'position': 0, 'score': 0.511053, 'sentences': [{'content': '带机器人回复:请你扮演一个智能搜索改写补全机器人,请根据User的搜索历史以及对应的搜索结果,对最后一句话先进行主语继承改写,然后进行上下文信息补全,注意:不要改变原文的意思,答案要尽可能简洁,不要直接回答该问题,不要输出多于的内容。\\\\n\\\\n例子:\\\\n搜索历史:\\\\nUser:今天上午你干嘛了\\\\nAssistant:去打篮球啦\\\\nUser:好玩吗?', 'id': '1f777fa3-26db-4237-98d5-075abc07a84f-5992356ea8c0c05485388623218e134e-975ec17bbf8206762df7cfb24a5cd85e-97468bdaf0accef718118a2b742d5cc0', 'score': 0.628708, 'source': None}], 'title': '多轮改写prompt_带机器人回复.txt', 'tokens': 0, 'type': 'engine', 'word_count': 188}]}, 'token_usage': {'prompt_tokens': 910, 'completion_tokens': 3, 'total_tokens': 913}}\n", + "2024-07-30 15:02:21.551493\n", + "2024-07-30 15:02:21.551529\n", + "0\n", + "5cd9d7ef-e26f-48ca-bd55-de2861cd4e84\n", + "b2c9d058-4475-4258-ad90-4334f3d024d5\n", + "5eb09e91-6496-44d9-9303-a4790e97f61c\n", + "answer\n", + "{'content': '百度公司是中国最大的互联网搜索引擎提供商之一,也是全球领先的AI公司。以下是对百度的详细介绍:\\n\\n一、公司概况\\n\\n百度(BIDU)是一家提供中文搜索引擎的公司,由李彦宏于2000年1月在北京中关村创立。经过多年的发展,百度已经从单一的搜索引擎服务商成功转型为内容生态与人工智能(AI)融合的互联网公司。百度的使命是“用科技让复杂的世界更简单”,其核心价值观包括“简单可依赖”。\\n\\n二、主要业务与产品\\n\\n1. 搜索业务:百度搜索是中国最大的中文搜索引擎,每天响应来自全球各地的搜索请求。除了传统的网页、图片、视频等搜索结果外,还提供了知识图谱、语音搜索等创新功能。\\n2. 移动生态业务:百度APP是百度移动生态的核心产品,围绕看、搜、听、问、购等核心场景为用户提供服务。此外,百度还拥有信息流、智能小程序、百度知道、百度文库等一系列移动生态产品。\\n3. 智能云业务:百度智能云是百度提供的云计算服务平台,为企业提供计算、存储、网络等基础设施服务以及人工智能、大数据等中间件服务。\\n4. 智能驾驶业务:百度在自动驾驶领域具有领先地位,其Apollo自动驾驶平台已经发展出多种商业模式,包括自动驾驶技术解决方案、百度造车以及共享无人车等。\\n\\n三、财务状况与业绩表现\\n\\n根据百度发布的财报显示,其业绩表现亮眼。例如,在2023年,百度总营收达到了显著的水平,其中百度核心收入同比增长。这主要得益于公司在广告市场的持续领先地位以及非在线营销收入的增长。同时,百度在研发投入方面也保持了较高水平,以推动其AI技术的持续创新和发展。\\n\\n四、AI技术与创新\\n\\n百度在AI技术方面取得了显著成果。其文心大模型已经升级到4.0版本,用户规模超过了1亿。这一技术使得百度具备了与全球领先的AI产品相媲美的能力。此外,百度还在文字生成视频等领域进行了战略投资,以进一步拓展其业务范围并加强在AI领域的领先地位。\\n\\n综上所述,百度公司作为中国最大的互联网搜索引擎提供商和全球领先的AI公司之一,凭借其强大的技术实力和创新能力,在搜索、移动生态、智能云和智能驾驶等领域取得了显著的成果。', 'name': 'msg', 'mtype': 'dict', 'id': 'c4f02188-1206-4c02-be8e-1c5481428003', 'extra': {}, 'token_usage': {'prompt_tokens': 4, 'completion_tokens': 456, 'total_tokens': 460}}\n", + "2024-07-30 15:02:21.557667\n", + "2024-07-30 15:02:21.557671\n", + "0\n" + ] + } + ], + "source": [ + "cursor.execute(\"SELECT * FROM appbuilder_session_messages WHERE session_id = 'b2c9d058-4475-4258-ad90-4334f3d024d5';\") \n", + "for tuple in cursor.fetchall():\n", + " for message in tuple:\n", + " try: \n", + " message = json.loads(message)\n", + " print(message)\n", + " except:\n", + " print(message)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/cookbooks/components/rag_with_baidusearch.ipynb b/cookbooks/components/rag_with_baidusearch.ipynb index cbd99e8bf..0fafa836c 100644 --- a/cookbooks/components/rag_with_baidusearch.ipynb +++ b/cookbooks/components/rag_with_baidusearch.ipynb @@ -99,7 +99,7 @@ "id": "5fc5bc38-6bc5-4187-a8fd-f802d77d89fa", "metadata": {}, "source": [ - "### (可选) 使用 ChainlitRuntime 启动 chainlit 页面调试\n", + "### (可选) 使用 AgentRuntime 启动 chainlit 页面调试\n", "这部分代码依赖 `appbuilder-sdk[serve]`,如果没有安装,可以执行下面的命令安装:" ] }, @@ -129,11 +129,9 @@ "metadata": {}, "outputs": [], "source": [ - "import appbuidler\n", - "from appbuilder.utils.chainlit_deploy import ChainlitRuntime\n", - "agent = ChainlitRuntime(component=component)\n", + "agent = appbuilder.AgentRuntime(component=component)\n", "# 启动 chainlit 服务\n", - "agent.chainlit_component(port=8091)" + "agent.chainlit_demo(port=8091)" ] }, { @@ -142,7 +140,7 @@ "id": "16a8aa38-7a33-4e27-bca4-00900cfe1641", "metadata": {}, "source": [ - "### (可选) 使用 FlaskRuntime 启动 HTTP 服务\n", + "### (可选) 使用 AgentRuntime 启动 HTTP 服务\n", "这部分代码依赖 `appbuilder-sdk[serve]`,如果没有安装,可以执行下面的命令安装:" ] }, @@ -172,10 +170,6 @@ "metadata": {}, "outputs": [], "source": [ - "import appbuilder\n", - "from appbuilder.utils.flask_deploy import FlaskRuntime\n", - "agent = FlaskRuntime(component=component)\n", - "# 启动 flask 服务\n", "agent.serve(port=8092)" ] }, diff --git a/cookbooks/live_broadcast_material/2024_05_16/service_deploy.py b/cookbooks/live_broadcast_material/2024_05_16/service_deploy.py index 655e87fe9..a6e506104 100644 --- a/cookbooks/live_broadcast_material/2024_05_16/service_deploy.py +++ b/cookbooks/live_broadcast_material/2024_05_16/service_deploy.py @@ -14,7 +14,6 @@ import os import appbuilder -from appbuilder.utils.flask_deploy import FlaskRuntime os.environ["APPBUILDER_TOKEN"] = "密钥" component = appbuilder.Playground( @@ -22,5 +21,5 @@ model="ERNIE-Bot" ) -agent = FlaskRuntime(component=component) +agent = appbuilder.AgentRuntime(component=component) agent.serve(port=8091) diff --git a/python/__init__.py b/python/__init__.py index 48c850b91..00af065c3 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -167,9 +167,12 @@ def get_default_header(): ] # NOQA from appbuilder.core.message import Message +from appbuilder.core.agent import AgentRuntime from appbuilder.core.user_session import UserSession from appbuilder.utils.logger_util import logger +from appbuilder.utils.flask_deploy import FlaskRuntime +from appbuilder.utils.chainlit_deploy import ChainlitRuntime from appbuilder.core.manifest.manifest_decorator import manifest, manifest_parameter from appbuilder.core.manifest.models import Manifest diff --git a/python/core/agent.py b/python/core/agent.py new file mode 100644 index 000000000..fea0d9497 --- /dev/null +++ b/python/core/agent.py @@ -0,0 +1,645 @@ +# Copyright (c) 2023 Baidu, Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import sys +import copy +import os +import logging +import uuid +import json +import shutil +import inspect +from deprecated import deprecated +from pydantic import BaseModel, model_validator, Extra +from typing import Optional, Dict, Any, Union +import appbuilder +from appbuilder.core.context import init_context +from appbuilder.core.component import Component +from appbuilder.core.message import Message +from appbuilder.utils.logger_util import logger +from appbuilder.core.console.appbuilder_client.data_class import ToolChoiceFunction, ToolChoice, Action + +# 流式场景首包超时时,最大重试次数 +MAX_RETRY_COUNT = 3 + +@deprecated(reason="deplecated. Use FlaskRuntime or ChainlitRuntime instead") +class AgentRuntime(BaseModel): + r""" + AgentRuntime 是对组件调用的服务化封装,开发者不是必须要用 AgentRuntime 才能运行自己的组件服务。 + 但 AgentRuntime 可以快速帮助开发者服务化组件服务,并且提供API、对话框等部署方式。 + 此外,结合 Component 和 Message 自带的运行和调试接口,可以方便开发者快速获得一个调试 Agent 的服务。 + + Args: + component (Component): 可运行的 Component, 需要实现 run(message, stream, args) 方法 + user_session_config (sqlalchemy.engine.URL|str|None): Session 输出存储配置字符串。默认使用 sqlite:///user_session.db + 遵循 sqlalchemy 后端定义,参考文档:https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls + tool_choice (ToolChoice): 可用于Agent强制执行的组件工具 + + + Examples: + + .. code-block:: python + + import os + import sys + import appbuilder + os.environ["APPBUILDER_TOKEN"] = '...' + + component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" + ) + agent = appbuilder.AgentRuntime(component=component) + message = appbuilder.Message({"query": "你好"}) + print(agent.chat(message, stream=False)) + + .. code-block:: python + + import os + import sys + import appbuilder + os.environ["APPBUILDER_TOKEN"] = '...' + + component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" + ) + user_session_config = "sqlite:///foo.db" + agent = appbuilder.AgentRuntime( + component=component, user_session_config=user_session_config) + agent.serve(debug=False, port=8091) + + .. code-block:: python + + import os + import sys + import appbuilder + os.environ["APPBUILDER_TOKEN"] = '...' + + component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4" + ) + agent = appbuilder.AgentRuntime(component=component) + agent.chainlit_demo(port=8091) + + Session 数据管理 : 除去上述简单应用外,还支持 Session 数据管理,下面是一个例子 + + .. code-block:: python + + import os + import sys + from appbuilder.core.component import Component + from appbuilder import ( + AgentRuntime, UserSession, Message, QueryRewrite, Playground, + ) + + os.environ["APPBUILDER_TOKEN"] = '...' + + class PlaygroundWithHistory(Component): + def __init__(self): + super().__init__() + self.query_rewrite = QueryRewrite(model="Qianfan-Agent-Speed-8K") + self.play = Playground( + prompt_template="{query}", + model="eb-4" + ) + + def run(self, message: Message, stream: bool=False): + user_session = UserSession() + # 获取 Session 历史数据 + history_queries = user_session.get_history("query", limit=1) + history_answers = user_session.get_history("answer", limit=1) + + if history_queries and history_answers: + history = [] + for query, answer in zip(history_queries, history_answers): + history.extend([query.content, answer.content]) + logging.info(f"history: {history}") + message = self.query_rewrite( + Message(history + [message.content]), rewrite_type="带机器人回复") + logging.info(f"message: {message}") + answer = self.play.run(message, stream) + # 保存本轮数据 + user_session.append({ + "query": message, + "answer": answer, + }) + return answer + + agent = AgentRuntime(component=PlaygroundWithHistory()) + agent.chainlit_demo(port=8091) + + 请求时认证 : component在创建时可以不进行认证,由AgentRuntime服务化后带入AppbuilderToken + + .. code-block:: python + + import appbuilder + + component = appbuilder.Playground( + prompt_template="{query}", + model="eb-4", + lazy_certification=True, # 在创建时不进行认证 + ) + agent = appbuilder.AgentRuntime(component=component) + agent.serve(debug=False, port=8091) + + .. code-block:: shell + + curl --location 'http://0.0.0.0:8091/chat' \ + --header 'Content-Type: application/json' \ + --header 'X-Appbuilder-Token: ...' \ + --data '{ + "message": "你是谁", + "stream": false + }' + + Session 信息查看 : 查看本地user_session.db数据库内部信息,下面是一个例子 + + .. code-block:: python + + import sqlite3 + import json + + # 连接到 SQLite 数据库 + # 如果文件不存在,会自动在当前目录创建: + user_session_path = 'your_user_session.db地址' + conn = sqlite3.connect(user_session_path) + cursor = conn.cursor() + + # 执行一条 SQL 语句,列出所有表 + cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") + print(cursor.fetchall()) + + # 查询appbuilder_session_messages表的列信息 + cursor.execute("PRAGMA table_info(appbuilder_session_messages);") + columns_info = cursor.fetchall() + + column_names = [info[1] for info in columns_info] # info[1]是列名的位置 + for column_name in column_names: + print(column_name) + + # 查询特定表中的数据 + cursor.execute("SELECT message_value FROM appbuilder_session_messages;") + for row in cursor.fetchall(): + print(json.loads(row[0])) + + # 关闭 Connection: + conn.close() + + """ + + component: Component + user_session_config: Optional[Union[Any, str]] = None + user_session: Optional[Any] = None + tool_choice: ToolChoice = None + + class Config: + """ + 检查配置 + + Attributes: + extra (Extra): 额外属性,默认为 Extra.forbid,即禁止添加任何额外的属性 + arbitrary_types_allowed (bool): 任意类型是否允许,默认为 True + """ + extra = Extra.forbid # 不能传入类定义中未声明的字段 + arbitrary_types_allowed = True # 此设置允许在模型中使用自定义类型的字段 + + @model_validator(mode='before') + @classmethod + def init(cls, values: Dict) -> Dict: + """ + 初始化 AgentRuntime,UserSession 会在这里被初始化 + + Args: + values (Dict): 初始化参数 + + Returns: + None + """ + # 初始化 UserSession + from appbuilder.core.user_session import UserSession + values.update({ + "user_session": UserSession(values.get("user_session_config")) + }) + return values + + @deprecated(reason="deplecated. Use FlaskRuntime.chat or ChainlitRuntime.chat() instead") + def chat(self, message: Message, stream: bool = False, **args) -> Message: + """ + 执行一次对话 + + Args: + message (Message): 该次对话用户输入的 Message + stream (bool): 是否流式请求 + **args: 其他参数,会被透传到 component + + Returns: + Message(Message): 返回的 Message + """ + return self.component.run(message=message, stream=stream, **args) + + @deprecated(reason="deplecated. Use FlaskRuntime.create_flask_app() instead") + def create_flask_app(self, url_rule="/chat"): + """ + 创建 Flask 应用,主要用于 Gunicorn 这样的 WSGI 服务器来运行服务。 + + Args: + None + + Returns: + Flask + """ + # lazy import flask + try: + from flask import Flask, current_app, request, Response + from flask_restful import reqparse, Resource + from werkzeug.exceptions import BadRequest + from flask import stream_with_context + + except ImportError: + raise ImportError("Flask module is not installed. Please install it using 'pip install " + "flask~=2.3.2 flask-restful==0.3.9'.") + app = Flask(__name__) + app.json.ensure_ascii = False + + @app.errorhandler(BadRequest) + def handle_bad_request(e): + return {"code": 400, "message": f'{e}', "result": None}, 400 + + @app.errorhandler(Exception) + def handle_bad_request(e): + if hasattr(e, "code"): + return {"code": e.code, "message": str(e), "result": None}, 200 + else: + return {"code": 500, "message": "Internal Server Error", "result": None}, 200 + + def warp(): + """ + 根据component的lazy_certification属性处理请求。 + + Args: + 无参数。 + + Returns: + 如果stream为True,则返回流式响应(Content-Type为text/event-stream)。 + 如果stream为False,则返回包含处理结果的字典。 + + Raises: + BadRequest: 当请求头中缺少必要的X-Appbuilder-Authorization时抛出。 + BadRequest: 当请求体中缺少必要的message字段时抛出。 + BadRequest: 当请求体中session_id字段不是字符串类型时抛出。 + BadRequest: 当请求体中stream字段不是布尔类型时抛出。 + + """ + # 根据component是否lazy_certification,分成两种情况: + # 1. lazy_certification为True,初始化时未被认证,每次请求都需要带入AppbuilderToken + # 2. lazy_certification为False,初始化时已经认证,请求时不需要带入AppbuilderToken,并且带入也无效 + if self.component.lazy_certification: + app_builder_token = None + for key in ["X-Appbuilder-Token", "X-Appbuilder-Authorization"]: + if key in request.headers: + app_builder_token = request.headers[key] + break + if not app_builder_token: + raise BadRequest( + "X-Appbuilder-Authorization is required in Headers") + try: + self.component.set_secret_key_and_gateway( + secret_key=app_builder_token) + except appbuilder.core._exception.BaseRPCException as e: + logging.error(f"failed to verify. err={e}", exc_info=True) + raise BadRequest("X-Appbuilder-Authorization invalid") + except Exception as e: + logging.error(f"failed to verify. err={e}", exc_info=True) + raise e + else: + pass + + data = request.get_json() + if "message" not in data: + raise BadRequest("message is required") + message = Message(data.pop('message')) + if "session_id" not in data: + session_id = str(uuid.uuid4()) + else: + session_id = data.pop("session_id") + if not isinstance(session_id, str): + raise BadRequest("session_id must be str type") + if "stream" not in data: + stream = False + else: + stream = data.pop("stream") + if not isinstance(stream, bool): + raise BadRequest("stream must be bool type") + request_id = request.headers.get("X-Appbuilder-Request-Id", str(uuid.uuid4())) + user_id = request.headers.get("X-Appbuilder-User-Id", None) + + init_context(session_id=session_id, request_id=request_id, user_id=user_id) + logging.info( + f"request_id={request_id}, session_id={session_id}] message={message}," + f" stream={stream}, data={data}, start run...") + + def gen_sse_resp(): + with app.app_context(): + received_first_packet = False + retry_count = 0 + while retry_count < MAX_RETRY_COUNT: + try: + answer = self.chat(message, stream, **data) + except Exception as e: # 调用chat方法报错,直接返回 + code = 500 if not hasattr(e, "code") else e.code + err_resp = {"code": code, "message": "InternalServerError", "result": None} + logging.error( + f"request_id={request_id}, session_id={session_id}, err={e}, execute self.chat failed", exc_info=True) + yield "data: " + json.dumps(err_resp, ensure_ascii=False) + "\n\n" + return + else: # 调用chat方法成功,开始生成流式事件 + content_iterator = iter(answer.content) + answer.content = None + result = None + try: + for sub_content in content_iterator: + result = copy.deepcopy(answer) + result.content = sub_content + yield "data: " + json.dumps({ + "code": 0, "message": "", + "result": { + "session_id": session_id, + "is_completion": False, + "answer_message": json.loads(result.json(exclude_none=True)) + } + }, ensure_ascii=False) + "\n\n" + received_first_packet = True + except Exception as e: + retry_count += 1 + logging.error( + f"[request_id={request_id}, session_id={session_id}] err={e}, " + f"retry_count={retry_count}", exc_info=True) + # 如果未收到首包且重试次数小于最大重试次数,则尝试重新执行一次chat方法 + if not received_first_packet and retry_count < MAX_RETRY_COUNT: + continue + else: # 其它情况返回 + logging.error( + f"[request_id={request_id}, session_id={session_id}] err={e}, " + f"retry_count={retry_count}, received_first_packet={received_first_packet}" + , exc_info=True) + code = 500 if not hasattr(e, "code") else e.code + err_resp = {"code": code, "message": "InternalServerError", "result": None} + yield "data: " + json.dumps(err_resp, ensure_ascii=False) + "\n\n" + return + result.content = "" + yield "data: " + json.dumps({ + "code": 0, "message": "", + "result": { + "session_id": session_id, + "is_completion": True, + "answer_message": json.loads(result.json(exclude_none=True)) + } + }, ensure_ascii=False) + "\n\n" + logging.info( + f"request_id={request_id}, session_id={session_id}]" + f"retry_count={retry_count}, success response", exc_info=True) + self.user_session._post_append() + return # 正常返回 + + if stream: # 流式 + return Response(stream_with_context(gen_sse_resp()), 200, + {'Content-Type': 'text/event-stream; charset=utf-8'}) + if not stream: # 非流式 + try: + answer = self.chat(message, stream, **data) + blocking_result = json.loads(copy.deepcopy(answer).json(exclude_none=True)) + logging.debug(f"[request_id={request_id}, session_id={session_id}] blocking_result={blocking_result}") + self.user_session._post_append() + return { + "code": 0, "message": "", + "result": {"session_id": session_id, "answer_message": blocking_result} + } + except Exception as e: + logging.error( + f"[request_id={request_id}, session_id={session_id}] err={e}", exc_info=True) + code = 500 if not hasattr(e, "code") else e.code + return {"code": code, "message": "InternalServerError", "result": None} + + app.add_url_rule(url_rule, 'chat', warp, methods=['POST']) + return app + + @deprecated(reason="deplecated. Use FlaskRuntime.serve() instead") + def serve(self, host='0.0.0.0', debug=True, port=8092, url_rule="/chat"): + """ + 将 component 服务化,提供 Flask http API 接口 + + Args: + host (str): 服务运行的host地址,默认为'0.0.0.0' + debug (bool): 是否开启debug模式,默认为True + port (int): 服务运行的端口号,默认为8092 + url_rule (str): 服务的URL规则,默认为"/chat" + + Returns: + None + """ + app = self.create_flask_app(url_rule=url_rule) + app.run(host=host, debug=debug, port=port) + + def prepare_chainlit_readme(self): + """ + 准备 Chainlit 的 README 文件 + + Args: + 无 + + Returns: + 无 + + Raises: + 无 + + 说明: + 从 utils 文件夹中拷贝 chainlit.md 文件到当前工作目录下,如果当前工作目录下已存在 chainlit.md 文件,则不拷贝。 + + """ + try: + # 获取当前python命令执行的路径,而不是文件的位置 + cwd_path = os.getcwd() + # 获取当前文件的路径所在文件夹 + current_file_path = os.path.dirname( + os.path.dirname(os.path.abspath(__file__))) + chainlit_readme_path = os.path.join( + current_file_path, "utils", "chainlit.md") + + # 拷贝chainlit_readme到cwd_path + # 如果cwd_path下已经存在chainlit_readme,则不拷贝 + if not os.path.exists(os.path.join(cwd_path, "chainlit.md")): + shutil.copy(chainlit_readme_path, cwd_path) + except: + logger.error("Failed to copy chainlit.md to current directory") + + @deprecated(reason="deplecated. Use ChainlitRuntime.chainlit_component() instead") + def chainlit_demo(self, host='0.0.0.0', port=8091): + """ + 将 component 服务化,提供 chainlit demo 页面 + + Args: + host (str): 服务 host + port (int): 服务 port + + Returns: + None + """ + # lazy import chainlit + try: + import chainlit as cl + import chainlit.cli + except ImportError: + raise ImportError("chainlit module is not installed. Please install it using 'pip install " + "chainlit~=1.0.200'.") + import click + from click.testing import CliRunner + + self.prepare_chainlit_readme() + + @cl.on_message # this function will be called every time a user inputs a message in the UI + async def main(message: cl.Message): + session_id = cl.user_session.get("id") + request_id = str(uuid.uuid4()) + init_context(session_id=session_id, request_id=request_id) + msg = cl.Message(content="") + await msg.send() + stream_message = self.chat(Message(message.content), stream=True) + + for part in stream_message.content: + if token := part or "": + await msg.stream_token(token) + await msg.update() + self.user_session._post_append() + + # start chainlit service + if os.getenv('APPBUILDER_RUN_CHAINLIT') == '1': + pass + else: + os.environ['APPBUILDER_RUN_CHAINLIT'] = '1' + target = sys.argv[0] + runner = CliRunner() + runner.invoke( + chainlit.cli.chainlit_run, [target, '--watch', "--port", port, "--host", host]) + + @deprecated(reason="deplecated. Use ChainlitRuntime.chainlit_agent() instead") + def chainlit_agent(self, host='0.0.0.0', port=8091): + """ + 将 appbuilder client 服务化,提供 chainlit demo 页面 + + Args: + host (str): 服务 host + port (int): 服务 port + + Returns: + None + """ + # lazy import chainlit + try: + import chainlit as cl + import chainlit.cli + except ImportError: + raise ImportError("chainlit module is not installed. Please install it using 'pip install " + "chainlit~=1.0.200'.") + import click + from click.testing import CliRunner + + if not isinstance(self.component, appbuilder.AppBuilderClient): + raise ValueError( + "chainlit_agent require component must be an instance of AppBuilderClient") + self.prepare_chainlit_readme() + + conversation_ids = [] + interrupt_dict = {} + + def _chat(message: cl.Message): + if len(conversation_ids) == 0: + raise ValueError("create new conversation failed!") + conversation_id = conversation_ids[-1] + file_ids = [] + if len(message.elements) > 0: + file_id = self.component.upload_local_file( + conversation_id, message.elements[0].path) + file_ids.append(file_id) + + interrupt_ids = interrupt_dict.get(conversation_id, []) + interrupt_event_id = interrupt_ids.pop() if len(interrupt_ids) > 0 else None + action = None + if interrupt_event_id is not None: + action = Action.create_resume_action(interrupt_event_id) + + tmp_message = self.component.run(conversation_id=conversation_id, query=message.content, file_ids=file_ids, + stream=True, tool_choice=self.tool_choice, action=action) + res_message=list(tmp_message.content) + + interrupt_event_id = None + for ans in res_message: + for event in ans.events: + if event.content_type == "chatflow_interrupt": + interrupt_event_id = event.detail.get("interrupt_event_id") + if event.content_type == "publish_message" and event.event_type == "chatflow": + answer = event.detail.get("message") + ans.answer += answer + + if interrupt_event_id is not None: + interrupt_ids.append(interrupt_event_id) + interrupt_dict[conversation_id] = interrupt_ids + tmp_message.content = res_message + return tmp_message + + @cl.on_chat_start + async def start(): + session_id = cl.user_session.get("id") + request_id = str(uuid.uuid4()) + init_context(session_id=session_id, request_id=request_id) + conversation_ids.append(self.component.create_conversation()) + interrupt_dict[conversation_ids[-1]] = [] + + @cl.on_message # this function will be called every time a user inputs a message in the UI + async def main(message: cl.Message): + msg = cl.Message(content="") + await msg.send() + await msg.update() + + stream_message = _chat(message) + detail_json_list = [] + for part in stream_message.content: + if token := part.answer or "": + await msg.stream_token(token) + for event in part.events: + detail = event.detail + detail_json = json.dumps( + detail, indent=4, ensure_ascii=False) + detail_json_list.append(detail_json) + await msg.update() + + @cl.step(name="详细信息") + def show_json(detail_json): + return "```json\n" + detail_json + "\n```" + for detail_json in detail_json_list: + if len(detail_json) > 2: + show_json(detail_json) + await msg.update() + self.user_session._post_append() + + # start chainlit service + if os.getenv('APPBUILDER_RUN_CHAINLIT') == '1': + pass + else: + os.environ['APPBUILDER_RUN_CHAINLIT'] = '1' + target = sys.argv[0] + runner = CliRunner() + runner.invoke( + chainlit.cli.chainlit_run, [target, '--watch', "--port", port, "--host", host]) From 01c1073e56c2e49a0fc6119841e4c86f358e3713 Mon Sep 17 00:00:00 2001 From: yepeiwen01 Date: Thu, 13 Mar 2025 19:41:22 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=85=BC=E5=AE=B9AgentRuntime=E6=97=A7?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/core/agent.py | 324 +++---------------------------------------- 1 file changed, 20 insertions(+), 304 deletions(-) diff --git a/python/core/agent.py b/python/core/agent.py index fea0d9497..78bce12e4 100644 --- a/python/core/agent.py +++ b/python/core/agent.py @@ -260,179 +260,12 @@ def create_flask_app(self, url_rule="/chat"): Returns: Flask """ - # lazy import flask - try: - from flask import Flask, current_app, request, Response - from flask_restful import reqparse, Resource - from werkzeug.exceptions import BadRequest - from flask import stream_with_context - - except ImportError: - raise ImportError("Flask module is not installed. Please install it using 'pip install " - "flask~=2.3.2 flask-restful==0.3.9'.") - app = Flask(__name__) - app.json.ensure_ascii = False - - @app.errorhandler(BadRequest) - def handle_bad_request(e): - return {"code": 400, "message": f'{e}', "result": None}, 400 - - @app.errorhandler(Exception) - def handle_bad_request(e): - if hasattr(e, "code"): - return {"code": e.code, "message": str(e), "result": None}, 200 - else: - return {"code": 500, "message": "Internal Server Error", "result": None}, 200 - - def warp(): - """ - 根据component的lazy_certification属性处理请求。 - - Args: - 无参数。 - - Returns: - 如果stream为True,则返回流式响应(Content-Type为text/event-stream)。 - 如果stream为False,则返回包含处理结果的字典。 - - Raises: - BadRequest: 当请求头中缺少必要的X-Appbuilder-Authorization时抛出。 - BadRequest: 当请求体中缺少必要的message字段时抛出。 - BadRequest: 当请求体中session_id字段不是字符串类型时抛出。 - BadRequest: 当请求体中stream字段不是布尔类型时抛出。 - - """ - # 根据component是否lazy_certification,分成两种情况: - # 1. lazy_certification为True,初始化时未被认证,每次请求都需要带入AppbuilderToken - # 2. lazy_certification为False,初始化时已经认证,请求时不需要带入AppbuilderToken,并且带入也无效 - if self.component.lazy_certification: - app_builder_token = None - for key in ["X-Appbuilder-Token", "X-Appbuilder-Authorization"]: - if key in request.headers: - app_builder_token = request.headers[key] - break - if not app_builder_token: - raise BadRequest( - "X-Appbuilder-Authorization is required in Headers") - try: - self.component.set_secret_key_and_gateway( - secret_key=app_builder_token) - except appbuilder.core._exception.BaseRPCException as e: - logging.error(f"failed to verify. err={e}", exc_info=True) - raise BadRequest("X-Appbuilder-Authorization invalid") - except Exception as e: - logging.error(f"failed to verify. err={e}", exc_info=True) - raise e - else: - pass - - data = request.get_json() - if "message" not in data: - raise BadRequest("message is required") - message = Message(data.pop('message')) - if "session_id" not in data: - session_id = str(uuid.uuid4()) - else: - session_id = data.pop("session_id") - if not isinstance(session_id, str): - raise BadRequest("session_id must be str type") - if "stream" not in data: - stream = False - else: - stream = data.pop("stream") - if not isinstance(stream, bool): - raise BadRequest("stream must be bool type") - request_id = request.headers.get("X-Appbuilder-Request-Id", str(uuid.uuid4())) - user_id = request.headers.get("X-Appbuilder-User-Id", None) - - init_context(session_id=session_id, request_id=request_id, user_id=user_id) - logging.info( - f"request_id={request_id}, session_id={session_id}] message={message}," - f" stream={stream}, data={data}, start run...") - - def gen_sse_resp(): - with app.app_context(): - received_first_packet = False - retry_count = 0 - while retry_count < MAX_RETRY_COUNT: - try: - answer = self.chat(message, stream, **data) - except Exception as e: # 调用chat方法报错,直接返回 - code = 500 if not hasattr(e, "code") else e.code - err_resp = {"code": code, "message": "InternalServerError", "result": None} - logging.error( - f"request_id={request_id}, session_id={session_id}, err={e}, execute self.chat failed", exc_info=True) - yield "data: " + json.dumps(err_resp, ensure_ascii=False) + "\n\n" - return - else: # 调用chat方法成功,开始生成流式事件 - content_iterator = iter(answer.content) - answer.content = None - result = None - try: - for sub_content in content_iterator: - result = copy.deepcopy(answer) - result.content = sub_content - yield "data: " + json.dumps({ - "code": 0, "message": "", - "result": { - "session_id": session_id, - "is_completion": False, - "answer_message": json.loads(result.json(exclude_none=True)) - } - }, ensure_ascii=False) + "\n\n" - received_first_packet = True - except Exception as e: - retry_count += 1 - logging.error( - f"[request_id={request_id}, session_id={session_id}] err={e}, " - f"retry_count={retry_count}", exc_info=True) - # 如果未收到首包且重试次数小于最大重试次数,则尝试重新执行一次chat方法 - if not received_first_packet and retry_count < MAX_RETRY_COUNT: - continue - else: # 其它情况返回 - logging.error( - f"[request_id={request_id}, session_id={session_id}] err={e}, " - f"retry_count={retry_count}, received_first_packet={received_first_packet}" - , exc_info=True) - code = 500 if not hasattr(e, "code") else e.code - err_resp = {"code": code, "message": "InternalServerError", "result": None} - yield "data: " + json.dumps(err_resp, ensure_ascii=False) + "\n\n" - return - result.content = "" - yield "data: " + json.dumps({ - "code": 0, "message": "", - "result": { - "session_id": session_id, - "is_completion": True, - "answer_message": json.loads(result.json(exclude_none=True)) - } - }, ensure_ascii=False) + "\n\n" - logging.info( - f"request_id={request_id}, session_id={session_id}]" - f"retry_count={retry_count}, success response", exc_info=True) - self.user_session._post_append() - return # 正常返回 - - if stream: # 流式 - return Response(stream_with_context(gen_sse_resp()), 200, - {'Content-Type': 'text/event-stream; charset=utf-8'}) - if not stream: # 非流式 - try: - answer = self.chat(message, stream, **data) - blocking_result = json.loads(copy.deepcopy(answer).json(exclude_none=True)) - logging.debug(f"[request_id={request_id}, session_id={session_id}] blocking_result={blocking_result}") - self.user_session._post_append() - return { - "code": 0, "message": "", - "result": {"session_id": session_id, "answer_message": blocking_result} - } - except Exception as e: - logging.error( - f"[request_id={request_id}, session_id={session_id}] err={e}", exc_info=True) - code = 500 if not hasattr(e, "code") else e.code - return {"code": code, "message": "InternalServerError", "result": None} - - app.add_url_rule(url_rule, 'chat', warp, methods=['POST']) + flask_deploy = appbuilder.FlaskRuntime( + component=self.component, + user_session_config=self.user_session_config, + user_session=self.user_session + ) + app = flask_deploy.create_flask_app(url_rule=url_rule) return app @deprecated(reason="deplecated. Use FlaskRuntime.serve() instead") @@ -498,41 +331,13 @@ def chainlit_demo(self, host='0.0.0.0', port=8091): None """ # lazy import chainlit - try: - import chainlit as cl - import chainlit.cli - except ImportError: - raise ImportError("chainlit module is not installed. Please install it using 'pip install " - "chainlit~=1.0.200'.") - import click - from click.testing import CliRunner - - self.prepare_chainlit_readme() - - @cl.on_message # this function will be called every time a user inputs a message in the UI - async def main(message: cl.Message): - session_id = cl.user_session.get("id") - request_id = str(uuid.uuid4()) - init_context(session_id=session_id, request_id=request_id) - msg = cl.Message(content="") - await msg.send() - stream_message = self.chat(Message(message.content), stream=True) - - for part in stream_message.content: - if token := part or "": - await msg.stream_token(token) - await msg.update() - self.user_session._post_append() - - # start chainlit service - if os.getenv('APPBUILDER_RUN_CHAINLIT') == '1': - pass - else: - os.environ['APPBUILDER_RUN_CHAINLIT'] = '1' - target = sys.argv[0] - runner = CliRunner() - runner.invoke( - chainlit.cli.chainlit_run, [target, '--watch', "--port", port, "--host", host]) + chainlit_deploy = appbuilder.ChainlitRuntime( + component=self.component, + user_session_config=self.user_session_config, + user_session=self.user_session, + tool_choice=self.tool_choice + ) + chainlit_deploy.chainlit_component(host=host, port=port) @deprecated(reason="deplecated. Use ChainlitRuntime.chainlit_agent() instead") def chainlit_agent(self, host='0.0.0.0', port=8091): @@ -547,99 +352,10 @@ def chainlit_agent(self, host='0.0.0.0', port=8091): None """ # lazy import chainlit - try: - import chainlit as cl - import chainlit.cli - except ImportError: - raise ImportError("chainlit module is not installed. Please install it using 'pip install " - "chainlit~=1.0.200'.") - import click - from click.testing import CliRunner - - if not isinstance(self.component, appbuilder.AppBuilderClient): - raise ValueError( - "chainlit_agent require component must be an instance of AppBuilderClient") - self.prepare_chainlit_readme() - - conversation_ids = [] - interrupt_dict = {} - - def _chat(message: cl.Message): - if len(conversation_ids) == 0: - raise ValueError("create new conversation failed!") - conversation_id = conversation_ids[-1] - file_ids = [] - if len(message.elements) > 0: - file_id = self.component.upload_local_file( - conversation_id, message.elements[0].path) - file_ids.append(file_id) - - interrupt_ids = interrupt_dict.get(conversation_id, []) - interrupt_event_id = interrupt_ids.pop() if len(interrupt_ids) > 0 else None - action = None - if interrupt_event_id is not None: - action = Action.create_resume_action(interrupt_event_id) - - tmp_message = self.component.run(conversation_id=conversation_id, query=message.content, file_ids=file_ids, - stream=True, tool_choice=self.tool_choice, action=action) - res_message=list(tmp_message.content) - - interrupt_event_id = None - for ans in res_message: - for event in ans.events: - if event.content_type == "chatflow_interrupt": - interrupt_event_id = event.detail.get("interrupt_event_id") - if event.content_type == "publish_message" and event.event_type == "chatflow": - answer = event.detail.get("message") - ans.answer += answer - - if interrupt_event_id is not None: - interrupt_ids.append(interrupt_event_id) - interrupt_dict[conversation_id] = interrupt_ids - tmp_message.content = res_message - return tmp_message - - @cl.on_chat_start - async def start(): - session_id = cl.user_session.get("id") - request_id = str(uuid.uuid4()) - init_context(session_id=session_id, request_id=request_id) - conversation_ids.append(self.component.create_conversation()) - interrupt_dict[conversation_ids[-1]] = [] - - @cl.on_message # this function will be called every time a user inputs a message in the UI - async def main(message: cl.Message): - msg = cl.Message(content="") - await msg.send() - await msg.update() - - stream_message = _chat(message) - detail_json_list = [] - for part in stream_message.content: - if token := part.answer or "": - await msg.stream_token(token) - for event in part.events: - detail = event.detail - detail_json = json.dumps( - detail, indent=4, ensure_ascii=False) - detail_json_list.append(detail_json) - await msg.update() - - @cl.step(name="详细信息") - def show_json(detail_json): - return "```json\n" + detail_json + "\n```" - for detail_json in detail_json_list: - if len(detail_json) > 2: - show_json(detail_json) - await msg.update() - self.user_session._post_append() - - # start chainlit service - if os.getenv('APPBUILDER_RUN_CHAINLIT') == '1': - pass - else: - os.environ['APPBUILDER_RUN_CHAINLIT'] = '1' - target = sys.argv[0] - runner = CliRunner() - runner.invoke( - chainlit.cli.chainlit_run, [target, '--watch', "--port", port, "--host", host]) + chainlit_deploy = appbuilder.ChainlitRuntime( + component=self.component, + user_session_config=self.user_session_config, + user_session=self.user_session, + tool_choice=self.tool_choice + ) + chainlit_deploy.chainlit_component(host=host, port=port) \ No newline at end of file From 4876111d4be94da553ade32fbf2cd80f4cc32bad Mon Sep 17 00:00:00 2001 From: yepeiwen01 Date: Thu, 13 Mar 2025 19:53:22 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=85=BC=E5=AE=B9AgentRuntime=E6=97=A7?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/core/agent.py | 77 +++++++++++++------------------------------- 1 file changed, 22 insertions(+), 55 deletions(-) diff --git a/python/core/agent.py b/python/core/agent.py index 78bce12e4..dcd46fa5c 100644 --- a/python/core/agent.py +++ b/python/core/agent.py @@ -27,6 +27,8 @@ from appbuilder.core.component import Component from appbuilder.core.message import Message from appbuilder.utils.logger_util import logger +from appbuilder.utils.flask_deploy import FlaskRuntime +from appbuilder.utils.chainlit_deploy import ChainlitRuntime from appbuilder.core.console.appbuilder_client.data_class import ToolChoiceFunction, ToolChoice, Action # 流式场景首包超时时,最大重试次数 @@ -203,6 +205,8 @@ def run(self, message: Message, stream: bool=False): user_session_config: Optional[Union[Any, str]] = None user_session: Optional[Any] = None tool_choice: ToolChoice = None + flask_deploy: FlaskRuntime = None + chainlit_deploy: ChainlitRuntime = None class Config: """ @@ -232,6 +236,21 @@ def init(cls, values: Dict) -> Dict: values.update({ "user_session": UserSession(values.get("user_session_config")) }) + flask_deploy = appbuilder.FlaskRuntime( + component=values.get("component"), + user_session_config=values.get("user_session_config"), + user_session=values.get("user_session") + ) + chainlit_deploy = appbuilder.ChainlitRuntime( + component=values.get("component"), + user_session_config=values.get("user_session_config"), + user_session=values.get("user_session"), + tool_choice=values.get("tool_choice") + ) + values.update({ + "flask_deploy": flask_deploy, + "chainlit_deploy": chainlit_deploy + }) return values @deprecated(reason="deplecated. Use FlaskRuntime.chat or ChainlitRuntime.chat() instead") @@ -260,12 +279,7 @@ def create_flask_app(self, url_rule="/chat"): Returns: Flask """ - flask_deploy = appbuilder.FlaskRuntime( - component=self.component, - user_session_config=self.user_session_config, - user_session=self.user_session - ) - app = flask_deploy.create_flask_app(url_rule=url_rule) + app = self.flask_deploy.create_flask_app(url_rule=url_rule) return app @deprecated(reason="deplecated. Use FlaskRuntime.serve() instead") @@ -285,39 +299,6 @@ def serve(self, host='0.0.0.0', debug=True, port=8092, url_rule="/chat"): app = self.create_flask_app(url_rule=url_rule) app.run(host=host, debug=debug, port=port) - def prepare_chainlit_readme(self): - """ - 准备 Chainlit 的 README 文件 - - Args: - 无 - - Returns: - 无 - - Raises: - 无 - - 说明: - 从 utils 文件夹中拷贝 chainlit.md 文件到当前工作目录下,如果当前工作目录下已存在 chainlit.md 文件,则不拷贝。 - - """ - try: - # 获取当前python命令执行的路径,而不是文件的位置 - cwd_path = os.getcwd() - # 获取当前文件的路径所在文件夹 - current_file_path = os.path.dirname( - os.path.dirname(os.path.abspath(__file__))) - chainlit_readme_path = os.path.join( - current_file_path, "utils", "chainlit.md") - - # 拷贝chainlit_readme到cwd_path - # 如果cwd_path下已经存在chainlit_readme,则不拷贝 - if not os.path.exists(os.path.join(cwd_path, "chainlit.md")): - shutil.copy(chainlit_readme_path, cwd_path) - except: - logger.error("Failed to copy chainlit.md to current directory") - @deprecated(reason="deplecated. Use ChainlitRuntime.chainlit_component() instead") def chainlit_demo(self, host='0.0.0.0', port=8091): """ @@ -330,14 +311,7 @@ def chainlit_demo(self, host='0.0.0.0', port=8091): Returns: None """ - # lazy import chainlit - chainlit_deploy = appbuilder.ChainlitRuntime( - component=self.component, - user_session_config=self.user_session_config, - user_session=self.user_session, - tool_choice=self.tool_choice - ) - chainlit_deploy.chainlit_component(host=host, port=port) + self.chainlit_deploy.chainlit_component(host=host, port=port) @deprecated(reason="deplecated. Use ChainlitRuntime.chainlit_agent() instead") def chainlit_agent(self, host='0.0.0.0', port=8091): @@ -351,11 +325,4 @@ def chainlit_agent(self, host='0.0.0.0', port=8091): Returns: None """ - # lazy import chainlit - chainlit_deploy = appbuilder.ChainlitRuntime( - component=self.component, - user_session_config=self.user_session_config, - user_session=self.user_session, - tool_choice=self.tool_choice - ) - chainlit_deploy.chainlit_component(host=host, port=port) \ No newline at end of file + self.chainlit_deploy.chainlit_component(host=host, port=port) \ No newline at end of file