weopqrst/mooncassette/core does not have a README file

    CassetteError

    pub(all) suberror CassetteError {
    Malformed(String)
    SchemaViolation(String)
    UnsupportedVersion(Int)
    FingerprintCollision(String)
    IntegrityViolation(String)
    NoMatch(String)
    Exhausted(String)
    MissingTransport(String)
    TransportFailure(String)
    }

    mooncassette 统一错误类型。

    所有错误都携带足以定位问题的上下文:出错路径、指纹或记录序号。

    Cassette

    pub(all) struct Cassette {
    version : Int
    meta : CassetteMeta
    interactions : Array[Interaction]
    } derive(Eq)

    一个 cassette:一组按录制顺序排列的交互。

    Cassette::length

    fn Cassette::length(self : Cassette) -> Int

    记录条数。

    Cassette::new

    fn Cassette::new(name : String, recorded_at? : String, interactions? : Array[Interaction]) -> Cassette

    构造一个空 cassette,version 自动填为当前格式版本。

    Cassette::push

    fn Cassette::push(self : Cassette, interaction : Interaction) -> Unit

    追加一条记录(录制时使用)。

    Cassette::total_input_tokens

    fn Cassette::total_input_tokens(self : Cassette) -> Int

    输入 token 合计(忽略未上报用量的记录)。

    Cassette::total_output_tokens

    fn Cassette::total_output_tokens(self : Cassette) -> Int

    输出 token 合计(忽略未上报用量的记录)。

    CassetteMeta

    pub(all) struct CassetteMeta {
    name : String
    generator : String
    recorded_at : String?
    } derive(Eq)

    cassette 元信息。

    Interaction 相反,本类型允许包含非确定性字段。 重新录制时这些字段出现 diff 属预期行为,不影响回放。

    CassetteMeta::new

    fn CassetteMeta::new(name : String, recorded_at? : String) -> CassetteMeta

    构造元信息,generator 自动填为当前 generator_id

    Interaction

    pub(all) struct Interaction {
    request : Request
    response : Response
    } derive(Eq)

    一条被录制的交互。

    不变量:本类型必须完全确定。任何不确定字段一经混入, 「确定性回放」这一核心承诺即被破坏,因此这里刻意不提供时间戳字段。

    Interaction::new

    fn Interaction::new(request : Request, response : Response) -> Interaction

    构造一条交互记录。

    Interaction::to_json

    fn Interaction::to_json(self : Interaction) -> Json

    交互记录的 JSON 视图(请求 + 响应)。

    Request

    pub(all) struct Request {
    provider : String
    model : String
    body : Json
    } derive(Eq)

    一次 LLM 请求。

    不变量:
    • body对象键顺序不参与语义,由 @canon 的规范文本统一归一;
    • 生成指纹前必须先调用 Request::normalize 剔除易变字段, 否则同一语义的请求每次都会得到不同指纹,回放将永远无法命中。

    Request::new

    fn Request::new(provider : String, model : String, body : Json) -> Request

    构造一个请求。

    Request::normalize

    fn Request::normalize(self : Request, drop_keys? : ArrayView[String]) -> Request

    规范化一个请求:剔除易变字段。

    未显式传入 drop_keys 时使用 default_drop_keys

    Request::to_json

    fn Request::to_json(self : Request) -> Json

    请求的 JSON 视图。

    Response

    pub(all) struct Response {
    status : Int
    body : Json
    usage : Usage?
    } derive(Eq)

    一次 LLM 响应。

    status 沿用 HTTP 语义;非 HTTP 传输(例如本地 mock)使用 0。

    Response::new

    fn Response::new(status : Int, body : Json, usage? : Usage) -> Response

    构造响应。

    Response::ok

    fn Response::ok(body : Json, usage? : Usage) -> Response

    构造一个 200 响应。

    直接构造结构体而不转发给 Response::new:可选参数在函数体内 已经是 Usage?,直接落入字段可以避免一次无意义的拆装。

    Response::to_json

    fn Response::to_json(self : Response) -> Json

    响应的 JSON 视图。未上报用量时省略 usage 字段。

    Usage

    pub(all) struct Usage {
    input_tokens : Int
    output_tokens : Int
    } derive(Eq)

    供应方返回的 token 用量。

    Usage::new

    fn Usage::new(input_tokens : Int, output_tokens : Int) -> Usage

    构造用量信息。

    Usage::to_json

    fn Usage::to_json(self : Usage) -> Json

    用量的 JSON 视图。

    Usage::total

    fn Usage::total(self : Usage) -> Int

    输入与输出 token 数之和。

    cassette_format_version

    let cassette_format_version : Int

    cassette 格式版本号。

    写入时使用当前版本;读取时严格校验。这样未来若改变语义, 旧版本的 reader 会明确报错,而不是把新格式「读歪」。

    default_drop_keys

    let default_drop_keys : Array[String]

    默认剔除的易变字段名。

    这些字段在真实 API 请求中经常变化,却不影响语义; 若它们参与指纹,回放将永远无法命中。

    generator_id

    let generator_id : String

    生成器标识。写入每个 cassette,便于追溯产出来源与排查兼容性问题。

    必须与 moon.mod 里的 version 保持一致:CI 会比对这两处,不一致 直接失败。之所以要靠校验而不是共享常量,是因为 MoonBit 无法在编译期 读取模块元信息,而这个标识一旦漂移,cassette 就会谎报产出版本。

    prune_json

    fn prune_json(value : Json, drop_keys : ArrayView[String]) -> Json

    递归剔除对象中的指定键。

    数组元素会被逐项处理;标量原样返回。

    request_json

    fn request_json(provider : String, model : String, body : Json) -> Json

    由三要素拼出请求的 JSON 形状。

    独立暴露该函数是为了让「子集匹配」也能基于同一形状投影, 而不是各自拼一遍、日后产生分歧。