极致顺滑的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应用前进了!