123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- from agno.agent import Agent
- from agno.models.base import Model
- from agno.tools import tool
- from dotenv import load_dotenv
- from pydantic import BaseModel, Field
- from openai import OpenAI
- import os
- load_dotenv()
- # 定义转账请求模型
- class TransferRequest(BaseModel):
- payee_name: str = Field(..., description="收款人全名")
- account_number: str = Field(..., min_length=12, max_length=12, description="12位银行账号")
- amount: float = Field(..., gt=0, le=500, description="转账金额(1-500元)")
- phone: str = Field(None, min_length=11, max_length=11, description="收款人手机号(可选)")
- # 注册转账工具
- @tool
- def bank_transfer(request: TransferRequest):
- """执行银行转账操作,包含以下校验规则:
- 1. 账号必须是12位数字
- 2. 金额必须介于1-500元
- 3. 手机号可选但必须是11位
- """
- # 模拟失败场景
- if request.amount > 500:
- return {"status": "failed", "reason": "单笔转账金额不能超过500元"}
- if len(request.account_number) != 12 or not request.account_number.isdigit():
- return {"status": "failed", "reason": "账号格式错误(需要12位数字)"}
-
- # 模拟成功响应
- return {
- "status": "success",
- "transaction_id": f"TX{os.urandom(4).hex().upper()}",
- "amount": request.amount
- }
- # 修复后的Qwen模型实现
- class QwenModel(Model):
- def __init__(self):
- self.client = OpenAI(
- base_url=os.getenv("BAILIAN_API_BASE_URL"),
- api_key=os.getenv("BAILIAN_API_KEY")
- )
-
- def invoke(self, messages, tools=None, **kwargs):
- response = self.client.chat.completions.create(
- model="qwen3-32b",
- messages=messages,
- tools=tools,
- **kwargs
- )
- return self.parse_provider_response(response)
-
- def parse_provider_response(self, response):
- return {
- "content": response.choices[0].message.content,
- "tool_calls": response.choices[0].message.tool_calls
- }
-
- # 未实现的方法抛出明确错误
- def invoke_stream(self, messages, tools=None, **kwargs):
- raise NotImplementedError("流式调用暂不支持")
-
- def ainvoke(self, messages, tools=None, **kwargs):
- raise NotImplementedError("异步调用暂不支持")
-
- def ainvoke_stream(self, messages, tools=None, **kwargs):
- raise NotImplementedError("异步流调用暂不支持")
-
- def parse_provider_response_delta(self, delta):
- return {"content": delta.get("content", "")}
- # 配置Agent
- agent = Agent(
- model=QwenModel(),
- tools=[bank_transfer],
- instructions="""您是银行AI助手,需要: # 修改参数名
- 1. 按顺序收集:姓名→账号→金额→手机号(可选)
- 2. 金额超过500时主动提醒限额规则
- 3. 自动校验输入格式
- 4. 转账失败时解释具体原因"""
- )
- if __name__ == "__main__":
- # 启动对话循环
- while True:
- user_input = input("User: ")
- response = agent.run(user_input)
-
- # 处理转账结果
- if response.tool_responses:
- for resp in response.tool_responses:
- if resp.tool_name == "bank_transfer":
- if resp.result["status"] == "success":
- print(f"\n转账成功!交易号:{resp.result['transaction_id']}")
- exit()
- else:
- print(f"\n错误:{resp.result['reason']},请修改信息后重试")
-
- print(f"AI: {response.content}")
|