支持MCP的AI agent框架:Agently 10分钟入门

极致顺滑的AI应用开发心流体验,原来AI应用开发可以这么简单!

官网:https://github.com/AgentEra/Agently

入门手册:手把手入门教程 - Agently AI应用开发框架

安装Agently 

首先下载代码

下载源代码主要是为了使用里面的学习文档,真正工作、业务使用Agently 的时候可以省略这一步。

git clone https://github.com/AgentEra/Agently

pip安装Agently 

pip install -q -U Agently

学习使用Agently

Agently支持很多AI模型的接入,具体见文档:Agently AnyModel介绍 - Agently AI应用开发框架

本项目使用自建服务器做中转,服务器地址 http://192.168.1.5:1337/v1 ,且没有设置auth认证,所以api_key是空白或乱填的。

简单使用案例入门

先看一下Agently 的官方deepseek模型案例,文件在Agently\examples目录,比如E:\github\Agently\examples\deepseek_reasoning.ipynb

import Agently

# 创建一个Agent工厂实例
agent_factory = (
    Agently.AgentFactory()
        # 给Agent工厂实例提供设置项:
        ## 将默认模型请求客户端设置为OAIClient(我们为OpenAI兼容格式定制的请求客户端)
        .set_settings("current_model", "OAIClient")
        ## 提供你的模型API-KEY
        .set_settings("model.OAIClient.auth", { "api_key": "" })
        ## 指定你的模型Base-URL,如DeepSeek
        .set_settings("model.OAIClient.url", "http://192.168.1.5:1337/v1")
        ## 指定你想要调用的具体模型
        .set_settings("model.OAIClient.options", { "model": "deepseek-v3" })
)

# 从Agent工厂实例中创建Agent实例
## 你可以创建很多个Agent实例,它们都会继承Agent工厂的设置项
## 也就是说,你不需要再为每一个Agent实例指定模型、输入授权
agent = agent_factory.create_agent()

## 当然,你也可以为特定的Agent实例指定它独特的配置项
## 例如,我们让下面这个agent使用deepseek-reasoner模型进行驱动
## 只需要修改不一样的配置项,一样的配置项会从工厂实例中继承
agent_reasoner = (
    agent_factory.create_agent()
        .set_settings("model.OAIClient.options", { "model": "deepseek-r1" })
)

使用格式化输入信息:

result = (
    agent
    # 你也可以更换成agent_reasoner看看输出效果
    #agent_reasoner
        # 支持str格式输入
        .input("给我输出3个单词和2个句子")
        # 支持K-V式参数输入
        .instruct("输出语言", "中文")
        # 支持dict格式输入
        # 并且通过框架特有的(<type>, <desc,可省略>)语法格式描述生成元素
        .output({
            "单词": [("str", )],
            "句子": ("list", ),
        })
        .start()
)
print(result)

输出结果:

{'单词': ['苹果', '学习', '友谊'], '句子': ['苹果是一种健康的水果。', '学习新知识可以帮助我们成长。']}

可以看到,非常棒,非常简洁明快,就输出了我们需要的结果,没有其它任何干扰。

ps,我用网页版的文心4.5,直接输入格式化信息(字符串):

.input("给我输出3个单词和2个句子") .instruct("输出语言", "中文") .output({ "单词": [("str", )], "句子": ("list", ),

也能得到预期的输出:

{
  "单词": ["阳光", "梦想", "希望"],
  "句子": ["今天的阳光格外灿烂。", "追逐梦想,永不放弃。"]
}

证明文心4.5也是非常不错的,它在prompt里面就看懂了input\output等语法!点赞一下。

请求方法、指令构造技巧及输出结果处理

import Agently
agent = (
    Agently.create_agent()
        .set_settings("current_model", "OAIClient")
        .set_settings("model.OAIClient.url", "http://192.168.1.5:1337/v1")
        .set_settings("model.OAIClient.auth", { "api_key": "<API-Key>" })
        .set_settings("model.OAIClient.options", { "model": "deepseek-v3" })
)

result = (
    agent
        # general: agent应该知道的全局信息,通常被视作system prompt或类似位置的信息
        .general("输出规定", "必须使用中文进行输出")
        # role: agent自身的角色设定信息
        .role({
            "姓名": "Agently小助手",
            "任务": "使用自己的知识为用户解答常见问题",
        })
        # user_info: agent需要了解的用户相关的信息
        .user_info("和你对话的用户是一个只具有Python编程基础知识的入门初学者")
        # abstract: 对于之前对话(尤其是较长对话)的总结信息
        .abstract(None)
        # chat_history: 按照OpenAI消息列格式的对话记录list
        ## 支持:
        ## [{ "role": "system", "content": "" },
        ##  { "role": "assistant", "content": "" },
        ##  { "role": "user", "content": "" }]
        ## 三种角色
        .chat_history([])
        # input: 和本次请求相关的输入信息
        .input({
            "question": "请问Python中协程和线程的关系和区别是什么?",
            "reply_style_expect": "请用对编程概念零基础的人能理解的方式进行回复"
        })
        # info: 为本次请求提供的额外补充信息
        .info("协程相关关键词", ["asyncio", "coroutine", "event loop"])
        .info("线程相关关键词", ["threads", "queue"])
        # instruct: 为本次请求提供的行动指导信息
        .instruct([
            "请使用{reply_style_expect}的回复风格,回复{question}提出的问题",
        ])
        # output: 对本次请求的输出提出格式和内容的要求
        .output({
            "reply": ("str", "对{question}的直接回复"),
            "next_questions": ([
                ("str",
                 "根据{reply}内容,结合{user_info}提供的用户信息," +
                 "给用户推荐的可以进一步提问的问题"
                )], "不少于3个"),
        })
        # start: 用于开始本次主要交互请求
        .start()
)
print(result)

输出:

{'reply': '在Python中,协程和线程都是实现并发(同时做多件事)的方法,但它们的工作方式有很大的不同。\n\n线程是独立的执行单位,可以同时运行多个线程。每个线程都有自己的内存空间。假设你在家里做饭,分配给每个家庭成员一个任务(比如洗菜、切菜、煮汤),这样大家可以同时完成任务,最后一起享用美食。这就像是使用多个线程。\n\n而协程是更轻量的执行单位,多个协程可以在同一个线程中运行。它们共享内存空间,通常会在特定的点(比如等待数据)让出控制权给其他协程。这有点像在一个厨房里,大家轮流来做某个步骤,但没有一个人可以独占厨房。这样可以减少切换的开销,效率也更高。\n\n总结一下,线程适合需要真实并行处理的情况,而协程更适合处理I/O操作,比如网络请求,因为它们可以更有效地利用资源。', 'next_questions': ['请问协程的使用场景有哪些?', '如何在Python中创建和使用协程?', '有什么简单的例子可以演示线程和协程的区别?']}

可以看到,除了reply回复,还有'next_questions'三个问题。一次使用Agently ,就实现了较复杂的输出。

使用MCP功能

这是我见过的最简单的MCP实现例程了,真的能看懂了。而且这个例程只需要Agently这个库(外加datetime 和pytz时区库),直接就包含了大模型调用,MCP time服务,以及MCP调用,真的太方便了!

源代码:

import Agently
agent = (
    Agently.create_agent()
        .set_settings("current_model", "OAIClient")
        .set_settings("model.OAIClient.auth", {"api_key": "hello"})
        .set_settings("model.OAIClient.url", "http://192.168.1.5:1337/v1")
        .set_settings("model.OAIClient.options", {"model": "deepseek-v3"})
)

from datetime import datetime
import pytz

@agent.tool(tool_name="get_now")
def get_current_datetime_decorated(
    timezone: (
        "str",
        "[*Required] Timezone string used in pytz.timezone() in Python"
    )
):
    """get current data and time"""
    tz = pytz.timezone(timezone)
    return datetime.now().astimezone(tz)


print(agent.input("我在济宁,现在几点了?").start())

只要10秒时间,就获得了输出:

现在是济宁当地时间上午9:56。

试了下其它几个模型,都可以正常输出,比如gpt-4o、claude-3.7-sonnet

其中glm-4的输出一如既往的好:

现在济宁的时间是2025年3月31日9点58分55秒,时区为亚洲/上海。

总结

Agently这个AI agent框架,是我目前见到的,最简单,也是最容易理解的支持MCP的AI框架了,值得学习和使用!

我一直对Langchain有较大的抵触,也许是自己悟性不够,学不会吧。也许是自己懒,学不会。所以明知道Langchain是个好东西,却一直望而却步。

但是现在,我认为Agently这个AI Agent框架,可以较好的满足我们的AI agent需求,而且更加简单易用!是时候向AI应用前进了!