乐于分享
好东西不私藏

把Agnes AI的4个免费模型全测了一遍:能用,但没那么神

把Agnes AI的4个免费模型全测了一遍:能用,但没那么神

太疯狂了,大家都在为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版本。

不是太稳定会出现调用失败的情况

实测下来,对于提示词的理解程度还是很不错的,中文的支持程度也不错。
对于文生图模型,如果你看惯了GPT-image 2.0生成的图片,那么觉得它的效果就不是那么惊艳了。
毕竟免费不能既要又要,对吧

如果你使用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 Key        prompt:     视频描述提示词        image_url:  参考图片的 URL        num_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 (200201):        result = response.json()        print("✅ 任务提交成功!\n")        print(json.dumps(result, indent=2, ensure_ascii=False))        return result    else:        print(f"❌ 请求失败  HTTP {response.status_code}")        print(f"   响应: {response.text}")        return Nonedef query_task(api_key, task_id):    """    查询单个任务的状态。    Args:        api_key: API Key        task_id: 任务 ID    Returns:        服务器返回的 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 Key        task_id:  任务 ID        interval: 轮询间隔(秒)        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)            continue        status = 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 result        if status in ("failed""error"):            print("\n💥 视频生成失败!")            print(json.dumps(result, indent=2, ensure_ascii=False))            return result        time.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"), dictelse None,        result.get("result", {}).get("video_url"if isinstance(result.get("result"), dictelse None,        result.get("data", {}).get("video_url"if isinstance(result.get("data"), dictelse None,    ]    for url in candidates:        if url:            return url    return 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))