太疯狂了,大家都在为tokens发愁的时候,Agnes AI竟然把自己的模型全量免费。
注册即可使用
用邮箱注册即可,支持open AI协议,获取后直接配置到自己的Agent工具中,太香了
网址:https://agnes-ai.com/

下面详细说明该如何申请API-KEY和配置
API_key获取
1、首先登录官网,使用邮箱进行注册
2、登录,进入设置页面,在里面会看到API密钥页面,点击创建

不用管这个充值按钮,真的不用充值就能用

这里要注意,生成的密钥记得保存,因为当你点击确定后api将不会再完整显示,所以如果你忘了,那么就要再重新创建
API_key配置使用
我这里使用cherry studio来作为演示,其他工具方法相同
1)API地址
https://apihub.agnes-ai.com/v1
2)API_KEY

3)点击“获取模型列表”按钮,在里面选择
本次Agnes不止免费提供文本模型,还有多模态模型,包括文生图、文生视频

使用案例
怕大家使用过程中仍有疑惑,所以特意从官方文档里找出了说明。是真的免费

代码能力
先来一个简单的,生成一个贪吃蛇

贪吃蛇太简单
为了测试免费的模型能力,所以来一个难度大的应用,让它仿照我的世界生成一个游戏
1 2 3 4 5 6 7 8 9 10
开发一款3D像素方块网页应用
1. 搭建项目基本框架,引入Three.js及相关依赖库,创建游戏画布和基础场景。
2. 实现3D立方体角色(第一人称视角)。
3. 开发随机生成的方块世界,包含至少3种不同类型的方块。
4. 在世界中心沙质平地上,用方块像素文字墙拼出"BenBen",位于玩家出生点正对立墙。
5. 添加视角控制功能,网页端通过鼠标移动控制角色视角旋转,移动端通过手指控制。
6. 实现方块交互系统,支持左键放置方块和右键破坏方块。
7. 整合物理系统,包括重力模拟和基本碰撞检测。
8. 优化性能,实现区块加载机制和渲染距离限制。
9. 实现移动端适配、确保响应式设计,适配不同屏幕尺寸并添加适当注释优化代码结构。
第一次生成的效果不是太好,生成一半就断开了,第二次生成效果还是不行,不可玩,同样的提示词GLM-5.1一次成功。
文生图
写代码,写文章这些没有什么看头,来试试免费的画图功能。
提供了两个模型一个是agnes-image-2.0-flash一个是2.1版本。
不是太稳定会出现调用失败的情况



如果你使用Agent工具调用的时候发现一直报错,可以使用下面代码来进行测试
1 2 3 4 5 6 7 8
curl https://apihub.agnes-ai.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "agnes-image-2.1-flash",
"prompt": "A luminous floating city above a misty canyon at sunrise, cinematic realism",
"size": "1024x768"
}'
重头戏,视频生成
免费的,功能一定不会太多吧
错了,虽然是免费模型,但是这个模型支持文生视频、图生视频、已经现在很火的多参考图方式
视频生成和视频结果的查询是分开的,生成完成后会提供一个ID,用于进行生成进度的查询
文生视频
调用样例如下:
1 2 3 4 5 6 7 8 9 10 11
curl-X POST https://apihub.agnes-ai.com/v1/videos \
-H"Authorization: Bearer YOUR_API_KEY" \
-H"Content-Type: application/json" \
-d'{
"model": "agnes-video-v2.0",
"prompt": "A cinematic shot of a cat walking on the beach at sunset, soft ocean waves, warm golden lighting, realistic motion",
"height": 768,
"width": 1152,
"num_frames": 121,
"frame_rate": 24
}'
直接发送给你的Agent工具,它就知道怎么做了。我这里使用最原始的方式来演示
视频生成结果的获取方式
1
https://apihub.agnes-ai.com/v1/videos/{task_id}
这里的task_id就是刚才返回结果里输出的那一串内容
我这里写了一个完整的python,在文末,将两个步骤合二为一,替换为自己的key即可。按需自取
图生视频
我从网上随便找了一张图片,做一个简单的测试
这里要注意,目前测试发现不支持使用本地图片作为参考图

官方接口使用说明:
https://agnes-ai.com/doc/agnes-video-v20#heading-1-text-to-video-request
剩下的多图和关键帧使用方法和图生视频相同
不再赘述
总的来说,Agnes AI提供的4个模型效果并没有因为免费而质量有所打折,除了会有请求失败的情况外,其他都是不错的。
这类实测类的文章我每周都会发,关注笨笨聊AI
import requestsimport jsonimport timeimport sys# ========================= 配置区 =========================API_KEY = "YOUR_API_KEY" # ← 替换为你的真实 API KeyPROMPT = ("The woman slowly turns around and looks back at the camera, ""natural facial expression, cinematic camera movement")IMAGE_URL = "https://example.com/image.png" # ← 替换为你的图片 URLMODEL = "agnes-video-v2.0"NUM_FRAMES = 121FRAME_RATE = 24BASE_URL = "https://apihub.agnes-ai.com/v1/videos"# 轮询配置POLL_INTERVAL = 10 # 秒TIMEOUT = 600 # 秒# ========================= 核心函数 =========================def create_video(api_key, prompt, image_url, num_frames=121, frame_rate=24, model="agnes-video-v2.0"):"""提交图生视频任务。Args:api_key: API Keyprompt: 视频描述提示词image_url: 参考图片的 URLnum_frames: 总帧数frame_rate: 帧率 (fps)model: 模型名称Returns:服务器返回的 JSON(dict)或 None"""headers = {"Authorization": f"Bearer {api_key}","Content-Type": "application/json",}payload = {"model": model,"prompt": prompt,"image": image_url,"num_frames": num_frames,"frame_rate": frame_rate,}print("=" * 60)print("🚀 提交图生视频任务")print(f" 模型: {model}")print(f" 提示词: {prompt}")print(f" 参考图: {image_url}")print(f" 帧数: {num_frames} 帧率: {frame_rate} fps")print("=" * 60)response = requests.post(BASE_URL, headers=headers, json=payload)if response.status_code in (200, 201):result = response.json()print("✅ 任务提交成功!\n")print(json.dumps(result, indent=2, ensure_ascii=False))return resultelse:print(f"❌ 请求失败 HTTP {response.status_code}")print(f" 响应: {response.text}")return Nonedef query_task(api_key, task_id):"""查询单个任务的状态。Args:api_key: API Keytask_id: 任务 IDReturns:服务器返回的 JSON(dict)或 None"""url = f"{BASE_URL}/{task_id}"headers = {"Authorization": f"Bearer {api_key}","Content-Type": "application/json",}response = requests.get(url, headers=headers)if response.status_code == 200:return response.json()else:print(f"❌ 查询失败 HTTP {response.status_code}")print(f" 响应: {response.text}")return Nonedef wait_until_done(api_key, task_id, interval=POLL_INTERVAL, timeout=TIMEOUT):"""轮询等待任务完成。Args:api_key: API Keytask_id: 任务 IDinterval: 轮询间隔(秒)timeout: 超时时间(秒)Returns:最终任务状态 JSON(dict)或 None"""print(f"\n⏳ 等待视频生成 (任务ID: {task_id}) ...\n")start = time.time()while time.time() - start < timeout:result = query_task(api_key, task_id)if result is None:time.sleep(interval)continuestatus = result.get("status", "unknown")elapsed = int(time.time() - start)print(f" [{elapsed:>4d}s] 状态: {status}")# ---- 终态判断 ----if status in ("succeeded", "completed", "done", "success"):print("\n🎉 视频生成完成!")print(json.dumps(result, indent=2, ensure_ascii=False))return resultif status in ("failed", "error"):print("\n💥 视频生成失败!")print(json.dumps(result, indent=2, ensure_ascii=False))return resulttime.sleep(interval)print("\n⏰ 等待超时!")return Nonedef extract_video_url(result):"""从返回结果中尽可能兼容地提取视频下载链接。"""# 常见字段名逐一尝试candidates = [result.get("video_url"),result.get("output", {}).get("video_url") if isinstance(result.get("output"), dict) else None,result.get("result", {}).get("video_url") if isinstance(result.get("result"), dict) else None,result.get("data", {}).get("video_url") if isinstance(result.get("data"), dict) else None,]for url in candidates:if url:return urlreturn Nonedef download_video(video_url, save_path="output_video.mp4"):"""将视频下载保存到本地。Args:video_url: 视频下载链接save_path: 本地保存路径"""print(f"\n⬇️ 正在下载视频到 {save_path} ...")resp = requests.get(video_url, stream=True)if resp.status_code == 200:with open(save_path, "wb") as f:for chunk in resp.iter_content(chunk_size=8192):f.write(chunk)print(f"✅ 下载完成: {save_path}")else:print(f"❌ 下载失败 HTTP {resp.status_code}")# ========================= 主流程 =========================if __name__ == "__main__":# 1️⃣ 提交任务result = create_video(api_key=API_KEY,prompt=PROMPT,image_url=IMAGE_URL,num_frames=NUM_FRAMES,frame_rate=FRAME_RATE,model=MODEL,)if result is None:sys.exit(1)# 2️⃣ 提取任务 ID(字段名按实际 API 文档调整)task_id = result.get("id") or result.get("task_id") or result.get("request_id")if not task_id:print("⚠️ 无法从返回结果中获取任务 ID,请手动查询。")sys.exit(1)# 3️⃣ 等待完成final = wait_until_done(API_KEY, task_id)# 4️⃣ 获取视频链接并下载if final:video_url = extract_video_url(final)if video_url:print(f"\n🎬 视频链接: {video_url}")download_video(video_url)else:print("\n⚠️ 未找到视频下载链接,完整返回结果如下:")print(json.dumps(final, indent=2, ensure_ascii=False))
夜雨聆风