七牛云 1024 活动页把融合模型 Conatus Free 的窗口写在 2026 年 10 月 24 日 00:00 到 11 月 30 日 23:59,模型 ID 是 qiniu/conatus-free。当天早上拉公开模型列表,这条已经在里面,created 对应北京时间 2026-10-24 08:00。不带 Key 打 Completions 会回 auth_api_key_missing,带假 Key 会回 auth_api_key_invalid。

主源是活动页 Conatus Free 和模型页 qiniu/conatus-free。BaseURL 写的是 https://api.qnaigc.com/v1,兼容 Completions 和 Messages。条款和额度是 10 月 24 日早上对着这两页核的,接口侧对过 GET /v1/models 和 POST /v1/chat/completions。

窗口、额度和调用规则

活动页写明:已登录并完成实名认证的用户,每日免费额度是 1 亿 Token;任意一笔大于 100 元且已到账的充值(历史充值同样计入,多笔不累计)后,每日上限提升到 10 亿 Token。未认证不可调用。额度按账号发放,同一账号下所有 API Key 共享,每日 00:00(北京时间)重置,未使用额度不结转。

页上还写:本期仅支持消耗活动每日免费 Token 额度,不提供按量付费。免费额度不足时,请求该免费模型将被拒绝,不扣减账户余额、资源包、订阅额度或积分,也不自动切换模型。活动结束后停止调用,不会自动转为付费模型。模型页标注上下文 1000K、最大输出 128K,发布时间 2026.10.24。

当天公开模型列表里这条是:

{
  "id": "qiniu/conatus-free",
  "object": "model",
  "created": 1792800000,
  "owned_by": "system",
  "context_length": 1000000,
  "max_tokens": 128000
}

活动页给的 curl 示例是:

curl https://api.qnaigc.com/v1/chat/completions \
  -H "Authorization: Bearer $QINIU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qiniu/conatus-free",
    "messages": [
      { "role": "user", "content": "你好,介绍一下你自己" }
    ],
    "stream": true
  }'

用 Spring Boot 接 OpenAI 兼容接口

Spring Boot 4.1.1、Spring AI 2.0.1、JDK 21,依赖用 spring-boot-starter-web 和 spring-ai-starter-model-openai。配置里把 base-url 指到七牛,模型钉成 qiniu/conatus-free:

spring.ai.openai.api-key=${QINIU_API_KEY:placeholder}
spring.ai.openai.base-url=https://api.qnaigc.com/v1
spring.ai.openai.chat.model=qiniu/conatus-free
server.port=8080
@RestController
public class ChatController {

    private final ChatClient chatClient;

    public ChatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/chat")
    public ResponseEntity<?> chat(
            @RequestParam(defaultValue = "用一句话介绍你自己") String q) {
        try {
            return ResponseEntity.ok(chatClient.prompt().user(q).call().content());
        } catch (HttpStatusCodeException e) {
            return ResponseEntity.status(e.getStatusCode()).body(e.getResponseBodyAsString());
        } catch (Exception e) {
            Throwable c = e;
            while (c.getCause() != null && c.getCause() != c) {
                c = c.getCause();
            }
            if (c instanceof HttpStatusCodeException he) {
                return ResponseEntity.status(he.getStatusCode()).body(he.getResponseBodyAsString());
            }
            String msg = c.getMessage() == null ? e.toString() : c.getMessage();
            HttpStatus status = msg.contains("401") ? HttpStatus.UNAUTHORIZED : HttpStatus.INTERNAL_SERVER_ERROR;
            return ResponseEntity.status(status).body(msg);
        }
    }
}

Maven 打包日志里有 BUILD SUCCESS,结束时间是 2026-10-24T08:05:15+08:00。随后启动到 8080:

2026-10-24T08:05:20.448+08:00  INFO ... o.s.boot.tomcat.TomcatWebServer          : Tomcat started on port 8080 (http) with context path '/'
2026-10-24T08:05:20.463+08:00  INFO ... com.example.conatus.ConatusApplication   : Started ConatusApplication in 2.867 seconds (process running for 3.54)

这次没有可用的七牛 API Key,请求是真发到 api.qnaigc.com 的,但没有拿到模型正文。直接 curl 不带 Authorization:

{"error":{"message":"No valid authentication credentials were provided (request_id: chatcmpl-61c272e007e1493ebbf7757a80f5a99a)","type":"authentication_error","code":"auth_api_key_missing"}}
HTTP 401

带 Authorization: Bearer sk-fake-key-for-test-12345:

{"error":{"message":"Invalid API key","type":"authentication_error","code":"auth_api_key_invalid"}}
HTTP 401

同一假 Key 跑本地 /chat,Spring AI 透出来的是:

401: Invalid API key
HTTP 401
— 感谢阅读 —
广告

一起交流

分享你的思考,让讨论更进一步。