Pi Agent: 扩展入门

最后更新:2026-08-31

扩展让 Pi Agent 从"够用"变成"好用"——别人写的扩展拿来用,自己写的扩展发出去。


1. 什么是扩展

扩展(Extension)是 Pi Agent 的插件机制,可以:

TEXT 📖 仅展示
扩展结构
├── manifest.yaml    → 元数据(名称、版本、依赖)
├── tools/          → 工具定义
├── skills/         → 技能定义
├── providers/      → 提供商适配器
├── hooks/          → 钩子函数
└── templates/      → 提示词模板

2. 安装扩展

(1) 从官方仓库安装

BASH
pi-agent ext install github-tools
pi-agent ext install database-query

(2) 从 Git 仓库安装

BASH
pi-agent ext install git+https://github.com/user/pi-ext-custom.git

(3) 从本地目录安装

BASH
pi-agent ext install ./my_extension

(4) 管理已安装的扩展

BASH
pi-agent ext list                # 列出已安装扩展
pi-agent ext update github-tools # 更新扩展
pi-agent ext remove github-tools # 卸载扩展

3. 创建扩展

(1) 脚手架

BASH
pi-agent ext create my_extension

生成目录结构:

TEXT 📖 仅展示
my_extension/
├── manifest.yaml
├── tools/
│   └── example.py
├── skills/
│   └── example.yaml
└── README.md

(2) manifest.yaml

YAML
name: my_extension
version: "1.0.0"
description: "我的自定义扩展"
author: "Alice"
min_pi_agent_version: "0.8.0"

dependencies:
  - requests>=2.28.0

tools:
  - tools/my_tool.py

skills:
  - skills/my_skill.yaml

entry_point: hooks.py

(3) 定义工具

PYTHON
# tools/my_tool.py
from pi_agent import tool

@tool(
    name="weather_query",
    description="查询指定城市的天气信息",
    parameters={
        "city": {"type": "string", "description": "城市名称"},
        "unit": {"type": "string", "enum": ["celsius", "fahrenheit"], "default": "celsius"}
    }
)
def weather_query(city: str, unit: str = "celsius") -> dict:
    import requests
    resp = requests.get(f"https://wttr.in/{city}?format=j1")
    data = resp.json()
    temp = data["current_condition"][0]["temp_C"]
    if unit == "fahrenheit":
        temp = int(temp) * 9 // 5 + 32
    return {"city": city, "temperature": temp, "unit": unit}

(4) 定义技能

YAML
# skills/my_skill.yaml
name: weather_advisor
description: "天气顾问,根据天气给出建议"
system_prompt: |
  你是天气顾问,根据天气数据给出穿衣建议和出行提醒。
tools:
  - weather_query
parameters:
  temperature: 0.5

4. 扩展生命周期

(1) 钩子函数

PYTHON
# hooks.py
from pi_agent import ExtensionHook

class MyExtension(ExtensionHook):
    def on_load(self, agent):
        """扩展加载时调用"""
        print(f"✅ {agent.name} 已加载 my_extension")

    def on_tool_call(self, agent, tool_name, params):
        """工具调用前调用"""
        print(f"🔧 调用工具: {tool_name}")

    def on_tool_result(self, agent, tool_name, result):
        """工具调用后调用"""
        print(f"✅ 工具结果: {tool_name} → {result}")

    def on_error(self, agent, error):
        """错误时调用"""
        print(f"❌ 错误: {error}")

    def on_unload(self, agent):
        """扩展卸载时调用"""
        print(f"👋 my_extension 已卸载")

5. 发布扩展

(1) 打包

BASH
pi-agent ext package my_extension
# 生成 my_extension-1.0.0.tar.gz

(2) 发布到官方仓库

BASH
pi-agent ext publish my_extension

(3) 发布到 PyPI

BASH
cd my_extension
python -m build
twine upload dist/*

❓ 常见问题

Q 扩展和技能有什么区别?
A 技能是单个能力单元(一个提示词+工具组合),扩展是完整的插件包(可以包含多个工具、技能、提供商适配器、钩子等)。
Q 扩展之间的依赖怎么处理?
A 在 manifest.yaml 的 dependencies 中声明,Pi Agent 会自动解析和安装依赖。
Q 扩展有安全审查吗?
A 官方仓库的扩展经过审查。第三方扩展需要自行评估风险,建议在沙箱中先测试。

📖 小节


📝 作业

  1. 基础题(难度⭐):安装一个官方扩展并使用其提供的工具。
  2. 进阶题(难度⭐⭐):创建一个简单的天气查询扩展,包含工具和技能。
  3. 挑战题(难度⭐⭐⭐):创建一个完整的扩展,包含工具、技能、钩子函数和单元测试。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏