|
@@ -0,0 +1,304 @@
|
|
|
+{
|
|
|
+ "cells": [
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": 13,
|
|
|
+ "id": "0c217946",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "from agno.agent import Agent, RunResponse\n",
|
|
|
+ "from agno.models.openai.like import OpenAILike\n",
|
|
|
+ "from agno.memory.v2.db.sqlite import SqliteMemoryDb\n",
|
|
|
+ "from agno.memory.v2.memory import Memory\n",
|
|
|
+ "from agno.memory.v2.schema import UserMemory\n",
|
|
|
+ "from agno.memory.v2.db.schema import MemoryRow\n",
|
|
|
+ "from agno.memory.v2.db.sqlite import SqliteMemoryDb\n",
|
|
|
+ "from agno.memory.v2.memory import Memory\n",
|
|
|
+ "from agno.memory.v2.schema import UserMemory\n",
|
|
|
+ "from agno.storage.sqlite import SqliteStorage\n",
|
|
|
+ "import uuid\n",
|
|
|
+ "from agno.tools import tool\n",
|
|
|
+ "from textwrap import dedent"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "de9e7051",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "bank_map = dict()\n",
|
|
|
+ "bank_map[\"张三\"] = (\"15683022601\",0.00) \n",
|
|
|
+ "bank_map[\"me\"] = (\"15683022302\",500.00)\n"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "ae223104",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "# 暂时不知道为啥加了这个注解识别不到参数\n",
|
|
|
+ "# @tool(\n",
|
|
|
+ "# name=\"get_contact\",\n",
|
|
|
+ "# requires_user_input=True,\n",
|
|
|
+ "# user_input_fields=[\"to_name\", \"to_card_id\", \"to_cash_num\"]\n",
|
|
|
+ "# )\n",
|
|
|
+ "def get_contact(to_name:str, to_card_id:str, to_cash_num:float):\n",
|
|
|
+ " if to_name in bank_map:\n",
|
|
|
+ " if bank_map.get(to_name)[0] == None\n",
|
|
|
+ " return {\"error\": \"用户手机不存在,请填写手机\"}\n",
|
|
|
+ " return bank_map.get(to_name)[0]\n",
|
|
|
+ " return {\"error\": \"用户不存在\"}\n",
|
|
|
+ "\n",
|
|
|
+ "# @tool(\n",
|
|
|
+ "# name=\"get_balance\",\n",
|
|
|
+ "# requires_user_input=True,\n",
|
|
|
+ "# user_input_fields=[\"from_name\"]\n",
|
|
|
+ "# )\n",
|
|
|
+ "def get_balance(from_name:str, to_cash_num:float):\n",
|
|
|
+ " if from_name not in bank_map:\n",
|
|
|
+ " return {\"error\": \"转账人不存在\"}\n",
|
|
|
+ " \n",
|
|
|
+ " my_cash = bank_map[from_name][1]\n",
|
|
|
+ " if my_cash >= to_cash_num:\n",
|
|
|
+ " return {\"result\": True}\n",
|
|
|
+ " else:\n",
|
|
|
+ " return {\"result\": False, \"current_balance\": my_cash}\n",
|
|
|
+ "\n",
|
|
|
+ "# @tool(\n",
|
|
|
+ "# name=\"get_balance\",\n",
|
|
|
+ "# requires_confirmation=True\n",
|
|
|
+ "# )\n",
|
|
|
+ "def transfer(from_name: str, to_name: str, to_cash_num: float):\n",
|
|
|
+ " if from_name not in bank_map or to_name not in bank_map:\n",
|
|
|
+ " return {\"error\": \"用户名错误\"}\n",
|
|
|
+ "\n",
|
|
|
+ " from_phone, from_balance = bank_map[from_name]\n",
|
|
|
+ " to_phone, to_balance = bank_map[to_name]\n",
|
|
|
+ "\n",
|
|
|
+ " if from_balance < to_cash_num:\n",
|
|
|
+ " return {\"error\": \"余额不足\", \"current_balance\": from_balance}\n",
|
|
|
+ "\n",
|
|
|
+ " bank_map[from_name] = (from_phone, from_balance - to_cash_num)\n",
|
|
|
+ " bank_map[to_name] = (to_phone, to_balance + to_cash_num)\n",
|
|
|
+ "\n",
|
|
|
+ " return {\n",
|
|
|
+ " \"message\": f\"成功转账 ¥{to_cash_num} 给 {to_name}\",\n",
|
|
|
+ " \"from_balance\": bank_map[from_name][1],\n",
|
|
|
+ " \"to_balance\": bank_map[to_name][1],\n",
|
|
|
+ " }\n",
|
|
|
+ "\n",
|
|
|
+ "def (name:str, phone_Num:str):\n",
|
|
|
+ " if name not in bank_map:\n",
|
|
|
+ " return {\"error\": \"用户不存在\"}\n",
|
|
|
+ " bank_map[name] = (phone_Num, bank_map[name][1])\n",
|
|
|
+ " return {\"result\": \"修改成功\"}"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": 16,
|
|
|
+ "id": "84a36800",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "memory_db = SqliteMemoryDb(db_file=\"tmp/bank_memory.db\", table_name=\"memory\")\n",
|
|
|
+ "storge_db = SqliteStorage(\n",
|
|
|
+ " table_name=\"agent_sessions\", db_file=\"tmp/bank_memory.db\"\n",
|
|
|
+ " )\n",
|
|
|
+ "\n",
|
|
|
+ "memory = Memory(\n",
|
|
|
+ " \n",
|
|
|
+ " model = OpenAILike(\n",
|
|
|
+ " id=\"qwen3-4b\",\n",
|
|
|
+ " api_key=\"sk-42c3ca4b505a4d40813727843223c768\",\n",
|
|
|
+ " base_url=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
|
|
|
+ " request_params={\"extra_body\": {\"enable_thinking\": False}},\n",
|
|
|
+ " ),\n",
|
|
|
+ " db=memory_db\n",
|
|
|
+ " )\n",
|
|
|
+ "\n",
|
|
|
+ "user_id = str(uuid.uuid4())"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": 17,
|
|
|
+ "id": "dd55e87d",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [
|
|
|
+ {
|
|
|
+ "name": "stdout",
|
|
|
+ "output_type": "stream",
|
|
|
+ "text": [
|
|
|
+ "All the memory_db memories:\n"
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "source": [
|
|
|
+ "from typing import List\n",
|
|
|
+ "memories: List[MemoryRow] = memory_db.read_memories()\n",
|
|
|
+ "print(\"All the memory_db memories:\")\n",
|
|
|
+ "for i, m in enumerate(memories):\n",
|
|
|
+ " print(f\"{i}: {m.memory['memory']} ({m.last_updated})\")"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "4785791a",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "agent = Agent(\n",
|
|
|
+ " model=OpenAILike(\n",
|
|
|
+ " id=\"qwen3-32b\",\n",
|
|
|
+ " api_key=\"sk-42c3ca4b505a4d40813727843223c768\",\n",
|
|
|
+ " base_url=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
|
|
|
+ " request_params={\"extra_body\": {\"enable_thinking\": False}},\n",
|
|
|
+ " ),\n",
|
|
|
+ " tools=[\n",
|
|
|
+ " get_contact,\n",
|
|
|
+ " get_balance,\n",
|
|
|
+ " transfer,\n",
|
|
|
+ " modify_phone,\n",
|
|
|
+ " ],\n",
|
|
|
+ " instructions=dedent(\"\"\"\\\n",
|
|
|
+ " 你是一个转账助手。你需要完成以下操作:\n",
|
|
|
+ " 1. 调用get_contact函数,收集(被转账人姓名,被转账卡号,转账金额)校验收款人是否存在,展示其手机号;\n",
|
|
|
+ " 2. 调用get_balance函数,收集(转账人姓名)校验当前余额是否足够,若不足展示余额并提示重新输入金额;\n",
|
|
|
+ " 3. 调用transfer函数若验证通过则调用 transfer 工具完成转账操作;\n",
|
|
|
+ " 所有逻辑通过工具完成。\n",
|
|
|
+ " 注意!!!:提示用户输入尽可能详细\n",
|
|
|
+ " \"\"\"),\n",
|
|
|
+ "\n",
|
|
|
+ " add_datetime_to_instructions=True,\n",
|
|
|
+ " show_tool_calls=True,\n",
|
|
|
+ " markdown=True,\n",
|
|
|
+ " add_history_to_messages=True,\n",
|
|
|
+ " memory=memory,\n",
|
|
|
+ " #指定记忆存储在sqlite中\n",
|
|
|
+ " storage=storge_db,\n",
|
|
|
+ " #将用户对话加入记忆\n",
|
|
|
+ " enable_user_memories=True,\n",
|
|
|
+ ")\n"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": 19,
|
|
|
+ "id": "c6c75890",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "def ask_agent(question: str):\n",
|
|
|
+ " response: RunResponse = agent.run(\n",
|
|
|
+ " messages=[{\"role\": \"user\", \"content\": f\"{question}\"}],\n",
|
|
|
+ " user_id=user_id,\n",
|
|
|
+ " )\n",
|
|
|
+ " print(\"== AI 回复 ==\")\n",
|
|
|
+ " print(response.content)"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": 20,
|
|
|
+ "id": "085df3f9",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [
|
|
|
+ {
|
|
|
+ "name": "stdout",
|
|
|
+ "output_type": "stream",
|
|
|
+ "text": [
|
|
|
+ "== AI 回复 ==\n",
|
|
|
+ "好的,我来协助您完成转账操作。请您提供以下详细信息:\n",
|
|
|
+ "\n",
|
|
|
+ "1. **收款人姓名**:请输入被转账人的全名。\n",
|
|
|
+ "2. **收款人银行卡号**:请输入被转账人的银行卡号码。\n",
|
|
|
+ "3. **转账金额**:请输入您希望转账的金额(以人民币为单位)。\n",
|
|
|
+ "4. **您的姓名**:请输入您的全名,以便查询您的账户余额。\n",
|
|
|
+ "\n",
|
|
|
+ "请提供以上信息,我会逐步进行验证并完成转账。\n"
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "source": [
|
|
|
+ "ask_agent(\"我要转账\")"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": 21,
|
|
|
+ "id": "76687a6e",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [
|
|
|
+ {
|
|
|
+ "name": "stdout",
|
|
|
+ "output_type": "stream",
|
|
|
+ "text": [
|
|
|
+ "== AI 回复 ==\n",
|
|
|
+ "已验证收款人信息,收款人张三的手机号为 **15683022601**。 \n",
|
|
|
+ "\n",
|
|
|
+ "接下来,请提供您的姓名(转账人姓名),以便查询您的账户余额是否足够完成此次转账。\n"
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "source": [
|
|
|
+ "ask_agent({\"to_name\": \"张三\", \"to_card_id\": \"4650\", \"to_cash_num\": 400.00})\n"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": 23,
|
|
|
+ "id": "97c0e2b7",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [
|
|
|
+ {
|
|
|
+ "name": "stdout",
|
|
|
+ "output_type": "stream",
|
|
|
+ "text": [
|
|
|
+ "您的账户余额充足,可以完成此次转账操作。现在我将为您执行转账,请稍等。\n",
|
|
|
+ "\n",
|
|
|
+ "转账已完成!以下是转账详情:\n",
|
|
|
+ "\n",
|
|
|
+ "- **转账金额**:¥400.0\n",
|
|
|
+ "- **收款人姓名**:张三\n",
|
|
|
+ "- **您的账户余额**:¥100.0\n",
|
|
|
+ "- **收款人账户余额**:¥400.0\n",
|
|
|
+ "\n",
|
|
|
+ "如有其他需求,请随时联系。感谢使用我们的服务!\n"
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "source": [
|
|
|
+ "response: RunResponse = agent.run(\"转账人姓名为:me \")\n",
|
|
|
+ "print(response.content)"
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "metadata": {
|
|
|
+ "kernelspec": {
|
|
|
+ "display_name": "agno_stu",
|
|
|
+ "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.13.1"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "nbformat": 4,
|
|
|
+ "nbformat_minor": 5
|
|
|
+}
|