物理模式侦探(Phy Schema Sleuth)
v2从杂乱的样本数据中推断出干净、可用于生产的模式。粘贴1-5个任意数据格式的示例 —— JSON、CSV、API响应、纯文本、LLM输出 —— 并获得Pydantic模型、Zod模式、TypeScript接口、JSON Schema和/或Go结构体,包含从样本中推断出的正确类型、可为空性、可选字段和验证规则。还可以检测日期、UUID、电子邮件、URL、枚举和嵌套对象。无需外部API —— 纯粹推断。触发关键词包括"infer schema"、"generate schema"、"generate types"、"pydantic from json"、"zod from json"、"typescript interface from"、"what's the schema for"、"/schema-sleuth"。
运行时依赖
安装命令
点击复制技能文档
Schema Sleuth 将原始样本数据(任意格式、任意混乱度)粘贴进来,获取生产就绪的模式(schema),支持所有语言。无需手动输入,无需猜测可空性(nullability),无需忘记嵌套对象。支持:Pydantic v2、Zod、TypeScript 接口、JSON Schema Draft 7、Go 结构体。零配置。
触发短语 “infer schema”、“generate schema”、“generate types”、“what's the schema for this”、“pydantic from json”、“zod from json”、“zod from this”、“typescript interface from”、“generate pydantic model”、“generate zod schema”、“type this response”、“model this data”、“schema from sample”、“parse this data format”、"/schema-sleuth"
输入方式 # 选项 1:粘贴原始 JSON(一个示例)/schema-sleuth {"id": 42, "name": "Alice", "email": "alice@example.com", "role": null} # 选项 2:多个示例以获得更好的推断/schema-sleuth 示例 1:{"id": 1, "status": "active", "score": 98.5} 示例 2:{"id": 2, "status": "inactive", "score": null} 示例 3:{"id": 3, "status": "pending", "score": 72.0} # 选项 3:CSV 数据/schema-sleuth user_id,name,email,created_at,is_premium 1,Alice,alice@ex.com,2024-01-15,true 2,Bob,,2024-02-01,false 3,Carol,carol@ex.com,,true # 选项 4:指定输出格式/schema-sleuth --output pydantic,zod {"id": "uuid-here", "payload": {"action": "click", "timestamp": 1710000000}} # 选项 5:命名模式/schema-sleuth --name UserEvent {"user_id": 123, "event": "purchase", "amount": 49.99}
步骤 1:规范化输入 在推断类型之前,标准化输入: 检测格式:是 JSON、JSON 数组、NDJSON、CSV、TSV、YAML 还是普通的键值对文本? 解析所有样本:如果提供了多个样本,则分别解析每一个 构建字段库存:对于所有样本中看到的每个字段,跟踪每个观察到的值 字段:“score” 观察到的值:98.5、null、72.0 → 类型:float | null(可空浮点数)→ 不总是存在:检查所有样本是否都有它 字段:“status” 观察到的值:“active”、“inactive”、“pending” → 类型:string —— 但所有值都来自一个固定集合 → 候选枚举(ENUM)→ 枚举候选项:active | inactive | pending
步骤 2:使用模式检测推断类型 对于每个字段,确定最具体的类型: 原始类型规则 观察到的值 推断类型 备注 true / false bool 42、100(所有整数) int 3.14、98.5(任何浮点数) float 提升如果混合 int+float “hello”(通用字符串) str / string null 出现在任何地方 标记字段为可选 / 可空 字段在某些样本中缺失 标记为可选 同时 null 和缺失 可选且默认为 None 语义模式检测(查看字符串值) 检测到的模式 类型 验证 “2024-01-15” 日期 ISO 8601 日期 “2024-01-15T10:30:00Z” 日期时间 ISO 8601 日期时间 1710000000(10 位整数) unix_timestamp 注意:可能是 POSIX 时间戳 “alice@example.com” 电子邮件 应用 EmailStr / z.string().email() “https://...” / “http://...” URL 应用 AnyUrl / z.string().url() “550e8400-e29b-41d4-...” uuid UUID v4 格式 重复值,≤ 8 个不同的值在 5+ 样本中 枚举 列出所有值作为字面量 “#FF5733” hex_color 字符串具有模式 所有值为正整数 考虑 PositiveInt 嵌套对象检测 {"user": {"id": 1, "name": "Alice"}, "timestamp": "2024-01-01T00:00:00Z"} → user 字段是一个嵌套对象 → 创建一个子模型 User / z.object() 数组检测 {"tags": ["python", "api", "backend"], "scores": [98.5, 72.0]} → tags:list[str] / z.array(z.string()) → scores:list[float] / z.array(z.number())
步骤 3:生成模式 生成所有请求的输出格式。默认:Pydantic + Zod + TypeScript 接口。 Pydantic v2(Python) from pydantic import BaseModel, EmailStr, AnyUrl from typing import Optional from datetime import datetime from enum import Enum from uuid import UUID
class StatusEnum(str, Enum): active = "active" inactive = "inactive" pending = "pending"
class UserEvent(BaseModel): id: int name: str email: Optional[EmailStr] = None status: StatusEnum score: Optional[float] = None created_at: datetime is_premium: bool
model_config = {"str_strip_whitespace": True}
Pydantic 规则: 使用 Optional[T] = None 来表示可空或缺失的字段 使用 EmailStr 来表示电子邮件字符串(需要 pydantic[email]) 使用 AnyUrl 来表示 URL 字符串 使用 str(Enum) 来表示字符串枚举 添加 model_config 块以包含常见的默认值
Zod(TypeScript/JavaScript) import { z } from "zod";
const StatusEnum = z.enum(["active", "inactive", "pending"]);
export const UserEventSchema = z.object({ id: z.number().int(), name: z.string(), email: z.string().email().nullable().optional(), status: StatusEnum, score: z.number().nullable().optional(), created_at: z.string().datetime(), is_premium: z.boolean(), });
export type UserEvent = z.infer;
Zod 规则: 当观察到 null 时,链式调用 .nullable(),当字段缺失时,链式调用 .optional() 使用 .int() 来表示整数字段 使用 .datetime() 来表示 ISO 日期时间字符串 始终导出推断类型与模式 导出两个模式