我是大三学生,平时写 C++ 比较多,最近也在用 Cursor 写小项目。

Cursor 好用,但模型通道一卡,补全和对话都会「走神」。我想验证两件事:

  1. Cursor 能不能稳定接到蓝耘元生代 MaaS(OpenAI 兼容);
  2. 同一套 Key,能不能顺手做一个小工具

这次我做的小工具很简单:给本地 .cpp / .h / .py 文件批量生成函数注释(中文 docstring / 头注释)。模型推理全部走 蓝耘 MaaS

注册入口: 蓝耘元生代云注册
在这里插入图片描述


一、为什么 Cursor 侧选蓝耘 MaaS

我的标准很务实:

我要什么 蓝耘怎么接
Cursor 能自定义模型 OpenAI Compatible
一个 Key 切多个模型 统一 Base URL:https://maas-api.lanyun.net/v1
代码场景够用 模型广场里的 DeepSeek / GLM 等
账单能看清 控制台用量 / Token 统计

对学生党来说,最爽的是:Cursor 里写代码、终端里跑小工具,共用一把蓝耘 API Key,不用维护两套账号。

> 【截图】蓝耘控制台:API KEY 管理页(Key 打码)


二、Cursor 接入蓝耘(逐步)

不同 Cursor 版本菜单名称可能略有差异,以你界面为准。核心就是三项:Base URL、API Key、Model。

2.1 准备三个值

  1. 登录蓝耘 → API KEY 管理 → 创建 Key
    在这里插入图片描述

  2. 模型广场 → 选一个模型 → 复制完整调用名(不要手打)
    在这里插入图片描述

  3. 固定 Base URL:

https://maas-api.lanyun.net/v1

常用示例(以你控制台实时显示为准):

用途 模型调用名示例
写代码 / 补全向 /maas/deepseek-ai/DeepSeek-V3.2
中文说明 / 长一点的注释 /maas/zhipuai/GLM-5.1

2.2 在 Cursor 里填

打开 Cursor 模型设置,添加自定义 OpenAI Compatible / Override:

配置项 填写
Base URL https://maas-api.lanyun.net/v1
API Key 蓝耘 sk-...
Model 模型广场复制的完整路径
在这里插入图片描述

保存后,在 Chat / Composer 里选中该模型,发一句:

用三句话说明什么是 OpenAI 兼容接口,不要扩写。

能正常回,就说明 Cursor → 蓝耘链路通了。

2.3 我踩过的坑

  1. Model 名写短了:少了 /maas/... 前缀,直接 404 / model_not_found。一定从模型广场复制。
  2. Base URL 多写了 /chat/completions:Cursor 这类客户端一般只填到 /v1
  3. Key 前后有空格:粘贴时带上空格会鉴权失败。

三、小工具:本地代码注释生成器

Cursor 通了之后,我用同一套蓝耘接口写了个命令行小工具:docgen.py

功能:读入一个源文件 → 抽出函数签名附近代码 → 调蓝耘生成中文注释 → 打印或写回旁路文件。

3.1 依赖

pip install openai

3.2 核心代码(可直接跑)

把下面保存为 docgen.py,环境变量里放 Key:

# Windows PowerShell
$env:LANYUN_API_KEY="sk-你的密钥"
# docgen.py —— Cursor 同款蓝耘 Key,本地批量生成函数注释
import argparse
import os
import re
import time
from pathlib import Path

from openai import OpenAI

BASE_URL = "https://maas-api.lanyun.net/v1"
# 默认用代码向模型;可改成你模型广场里的完整路径
DEFAULT_MODEL = "/maas/deepseek-ai/DeepSeek-V3.2"

FUNC_PATTERNS = [
    # C / C++
    re.compile(
        r"(?m)^(?:[\w:\s\*&<>,]+)\s+(\w+)\s*\([^;]*\)\s*\{",
    ),
    # Python
    re.compile(r"(?m)^def\s+(\w+)\s*\(.*?\):"),
]


def extract_snippets(text: str, window: int = 12) -> list[tuple[str, str]]:
    """粗提取:函数名 + 附近若干行,够小工具演示即可。"""
    lines = text.splitlines()
    hits: list[tuple[str, str]] = []
    for pat in FUNC_PATTERNS:
        for m in pat.finditer(text):
            name = m.group(1)
            # 按字符偏移估一行号
            line_no = text[: m.start()].count("\n")
            chunk = "\n".join(lines[line_no : line_no + window])
            hits.append((name, chunk))
    # 去重保序
    seen = set()
    uniq = []
    for name, chunk in hits:
        if name in seen:
            continue
        seen.add(name)
        uniq.append((name, chunk))
    return uniq[:8]  # 单文件最多 8 个,控制成本


def gen_comment(client: OpenAI, model: str, lang: str, name: str, code: str) -> dict:
    prompt = f"""你是资深{lang}工程师。根据下面代码片段,为函数 `{name}` 写简洁中文注释。
要求:
1) 先写一行功能摘要;
2) 再列参数含义(若无参数写「无」);
3) 再写返回值含义(若无返回写「无」);
4) 不要编造代码里不存在的行为;
5) 输出纯文本,不要用 Markdown 代码块。

代码:
{code}
"""
    t0 = time.perf_counter()
    first = None
    parts: list[str] = []

    stream = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        stream=True,
        max_tokens=256,
        temperature=0.2,
    )
    for ev in stream:
        delta = ev.choices[0].delta.content or ""
        if delta and first is None:
            first = time.perf_counter()
        parts.append(delta)

    t1 = time.perf_counter()
    text = "".join(parts).strip()
    ttft = (first - t0) if first else None
    return {
        "name": name,
        "comment": text,
        "ttft": ttft,
        "total": t1 - t0,
        "chars": len(text),
    }


def main() -> None:
    parser = argparse.ArgumentParser(description="蓝耘 MaaS 代码注释小工具")
    parser.add_argument("file", help="源文件路径,如 main.cpp / utils.py")
    parser.add_argument("--model", default=DEFAULT_MODEL)
    parser.add_argument("--lang", default="C++", help="C++ / Python 等")
    args = parser.parse_args()

    api_key = os.environ.get("LANYUN_API_KEY")
    if not api_key:
        raise SystemExit("请先设置环境变量 LANYUN_API_KEY")

    path = Path(args.file)
    src = path.read_text(encoding="utf-8", errors="ignore")
    snippets = extract_snippets(src)
    if not snippets:
        raise SystemExit("没提取到函数,换个文件或放宽正则试试")

    client = OpenAI(api_key=api_key, base_url=BASE_URL)
    results = []
    for name, code in snippets:
        print(f"\n=== 生成中: {name} ===")
        r = gen_comment(client, args.model, args.lang, name, code)
        results.append(r)
        print(r["comment"])
        print(
            f"[metric] TTFT={r['ttft']:.3f}s total={r['total']:.3f}s chars={r['chars']}"
            if r["ttft"] is not None
            else f"[metric] total={r['total']:.3f}s"
        )

    # 写出旁路结果,避免直接改坏源码
    out = path.with_suffix(path.suffix + ".docgen.txt")
    with out.open("w", encoding="utf-8") as f:
        for r in results:
            f.write(f"## {r['name']}\n{r['comment']}\n\n")
    print(f"\n已写入: {out}")

    # 汇总,方便贴进博客
    ttfts = [r["ttft"] for r in results if r["ttft"] is not None]
    totals = [r["total"] for r in results]
    if ttfts:
        print(
            f"\n[summary] n={len(results)} "
            f"avg_TTFT={sum(ttfts)/len(ttfts):.3f}s "
            f"avg_total={sum(totals)/len(totals):.3f}s"
        )


if __name__ == "__main__":
    main()

3.3 运行示例

python docgen.py .\demo.cpp --lang C++
# 或
python docgen.py .\utils.py --lang Python --model /maas/zhipuai/GLM-5.1

在这里插入图片描述

运行结果:

在这里插入图片描述


五、这次接入蓝耘 MaaS 后的一些感受

其实一开始接入蓝耘,主要就是想解决一个比较实际的问题。

平时写 C++ 项目的时候,我经常会用 Cursor 辅助写代码,比如让它帮忙分析函数逻辑、补全代码或者解释一些报错。

但是有时候模型响应不稳定,或者想测试自己的小工具时,又需要单独找接口,感觉比较麻烦。

所以这次想试一下:

能不能让 Cursor 和自己写的小程序,都使用同一个模型接口。

实际配置下来,整个过程比我预想的简单一些。

Cursor 这边主要配置:

  • Base URL
  • API Key
  • Model名称

配置完成后,就可以直接调用蓝耘元生代 MaaS 中的模型。

后面写代码注释生成工具时,也是直接复用了同一个 Key。

整个流程:

Cursor
  |
  |
蓝耘 MaaS
  |
  |
GLM-5.1 / DeepSeek
  |
  |
代码辅助工具

这样做的好处是,自己不用再单独搭建模型环境。

对于学生来说,如果只是学习大模型应用开发,自己部署一个模型其实门槛比较高:

  • 需要 GPU 环境;
  • 需要配置模型运行环境;
  • 需要处理部署问题。

而通过 MaaS 接口,可以先把重点放在应用开发上。

比如这次的小工具,真正花时间的地方其实不是模型运行,而是:

  • 怎么提取代码中的函数;
  • 怎么设计提示词;
  • 怎么让生成的注释更符合代码习惯。

当然,这个小工具目前也比较简单。

例如 C++ 中复杂的模板代码、宏定义,还有一些特殊写法,简单正则并不能完全识别,需要后续继续优化。

不过通过这次实践,我感觉对于刚开始接触 AI 应用开发的人来说,先通过 MaaS 接口快速验证想法,比一开始研究模型部署更加适合。


六、总结

这次尝试主要完成了两件事情。

第一,把 Cursor 接入蓝耘元生代 MaaS。

以前 Cursor 只是一个代码辅助工具,这次通过 OpenAI Compatible 接口接入自己的模型服务,也让我了解了 AI 编程工具背后的调用方式。

第二,用同一个接口完成了一个小工具。

虽然代码注释生成器功能比较简单,但完整经历了:

选择模型
 ↓
配置接口
 ↓
调用模型
 ↓
处理返回结果
 ↓
形成实际功能

对于我这种平时主要写 C++ 的学生来说,这次最大的收获不是做出了一个多复杂的 AI 应用,而是第一次比较完整地体验了“大模型如何接入普通项目”。

以前感觉大模型距离开发比较远,总觉得需要很多复杂的环境。

但实际体验后发现,很多 AI 功能并不一定需要自己训练模型,更多时候是思考:

怎么把现有模型能力,结合到自己的项目里面。

这也是这次使用蓝耘元生代 MaaS 最大的收获。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐