{ "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 }