EvoX Genesis
EvoX Genesis는 고수준 목표를 재귀적 소프트웨어 세계로 전환해, 유한 에이전트가 개발하고 승인된 결과만 유지됩니다
로컬 우선 MIT 라이선스 CLI로 구조화 출력·JSON 스키마를 제공자 제약에 맞춰 검사하고 CI에서 사전 실패시킵니다
A local-first, MIT-licensed CLI that lints your structured-output / JSON schemas against each provider's constraint surface and fails CI before they 400. Static, offline, zero runtime deps.
개발 도구Python · DockerfileGitHub @OrionArchitekton온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Provider-aware structured-output / JSON-Schema CI linter: fail CI before your schema 400s on OpenAI, Anthropic, or Gemini.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Provider-aware structured-output / JSON-Schema CI linter. Catch the schema
incompatibilities that make one provider 400 while another succeeds, before
they hit production, as a fast, offline CI check.
A JSON Schema / tool definition / response_format that works on OpenAI can
400 on Anthropic or Gemini (and vice-versa): nested oneOf, a missing
additionalProperties: false, a default in a property, Anthropic-rejected
validation keywords (minLength, format, pattern, …), Gemini's lack of
anyOf/dict support. The API tells you it failed but not which constraint
violated it, so teams hand-port schemas and debug by trial-and-error at runtime.
schemafit encodes each provider's documented constraint surface as a
versioned, declarative rule pack and lints your schema statically, pointing
at the exact JSON-Pointer path, the keyword, and why, with a non-zero exit code
so CI fails the PR instead of prod.
Every rule is grounded in a real, cited provider issue (see
schemafit/rules/). It is not a runtime client: it makes no model calls, needs no API key, and has zero runtime dependencies.
Paste this into a terminal. It needs uv, whose uvx
runs schemafit in a throwaway environment. The schema below is valid for OpenAI
strict mode, but it uses two keywords that other providers reject:
echo '{"type":"object","additionalProperties":false,"properties":{"sku":{"type":"string","pattern":"^[A-Z]{3}-[0-9]{4}$"},"qty":{"type":"integer","minimum":1}},"required":["sku","qty"]}' \
| uvx schemafit lint - --provider openai,anthropic,gemini,mistral,cohere
Output from schemafit 0.5.1 (exit code 1, so a CI job fails here). Version 0.5.0 prints the same findings with a different separator after PASS/FAIL:
[openai] PASS: 0 error(s), 0 warning(s)
[anthropic] FAIL: 2 error(s), 0 warning(s)
ERROR #/properties/qty/minimum (anthropic-no-minimum)
Anthropic rejects the 'minimum' validation keyword (400 Bad Request).
ref: https://github.com/vercel/ai/issues/13355
ERROR #/properties/sku/pattern (anthropic-no-pattern)
Anthropic rejects the 'pattern' validation keyword (400 Bad Request).
ref: https://github.com/vercel/ai/issues/13355
[gemini] PASS: 0 error(s), 0 warning(s)
[mistral] PASS: 0 error(s), 0 warning(s)
[cohere] FAIL: 1 error(s), 0 warning(s)
ERROR #/properties/qty/minimum (cohere-no-minimum)
Cohere structured outputs do not support the 'minimum' numeric range keyword.
ref: https://docs.cohere.com/docs/structured-outputs
No uv? pip install schemafit (Python 3.11+), then run the same line without
uvx. To get a provider-valid variant, swap lint ... --provider ... for
repair - --provider anthropic; it prints the fixed schema and counts which
fixes drop a constraint (lossy=).
I ran schemafit across 50 real, public structured-output / tool schemas
from the OpenAI & Anthropic cookbooks, popular agent frameworks (instructor,
langchain, pydantic-ai, crewai, …), and official MCP servers. 44 of 50 (88%)
would be rejected by at least one major provider's constraints, and only 3
passed all five. The #1 culprit: additionalProperties, the field almost
nobody sets, which OpenAI strict Structured Outputs requires to be false.
That rule drives the headline: the 44 are exactly the schemas OpenAI strict mode
rejects. If you don't use strict mode, the numbers that matter are Anthropic
(6 of 50) and Cohere (13 of 50).
Full breakdown, per-provider numbers, and how to reproduce it on your own
schemas: benchmarks/.
Those are excellent runtime clients: they normalize, repair, or constrain a
schema at call-time. schemafit fills the gap they leave: a static,
pre-ship CI lint that fails the build before the schema ever reaches a
provider, over the raw schemas you already ship, with no DSL or codegen buy-in.
pip install schemafit # Python 3.11+, zero runtime dependencies
schemafit demo # offline self-check; ends with PROOF_OK
Other ways to run it:
uvx schemafit --help # no install (needs uv)
docker run --rm ghcr.io/orionarchitekton/schemafit demo # container image
pip install "git+https://github.com/OrionArchitekton/schemafit" # unreleased main branch
# Lint one schema against several providers (exit 1 if any error):
schemafit lint my-schema.json --provider openai,anthropic,gemini,mistral,cohere
# Machine-readable output for CI annotations:
schemafit lint my-schema.json --provider anthropic --format json
# SARIF 2.1.0 for GitHub code-scanning / the Security tab:
schemafit lint my-schema.json --provider openai,anthropic --format sarif > schemafit.sarif
# Confirm against the live provider (opt-in; MOCK unless a key is in the env):
schemafit lint my-schema.json --provider openai --live-verify
# Also fail on warnings (e.g. Gemini $ref recursion risk):
schemafit lint my-schema.json --provider gemini --strict
# Emit a best-effort provider-valid variant (lossy transforms are flagged):
schemafit repair my-schema.json --provider anthropic --out fixed.json
# List supported providers / run a hermetic end-to-end proof:
schemafit providers
schemafit demo
GitHub Actions (this repo ships a composite action):
- uses: OrionArchitekton/[email protected]
with:
schema: schemas/tool.json
providers: openai,anthropic,gemini
Or directly / as a pre-commit hook (.pre-commit-hooks.yaml is included):
- repo: https://github.com/OrionArchitekton/schemafit
rev: v0.5.0
hooks:
- id: schemafit
args: ["--provider", "openai,anthropic,gemini"]
files: '^schemas/.*\.json$' # scope to YOUR LLM schemas, not every .json
Scope the hook with
files:to the directory holding your LLM schemas; the defaulttypes: [json]would otherwise lint every JSON file in the repo (package.json,tsconfig.json, lockfiles), which are not LLM schemas.
--format sarif emits SARIF 2.1.0 so lint
findings show up as annotations in the Security → Code scanning tab, with the
exact JSON-Pointer path, the rule id, and the primary-source helpUri. SARIF is
written to stdout regardless of the exit code, so code-scanning still ingests the
artifact even when the gate fails (a clean schema produces a valid run with an
empty results array, which clears stale alerts):
- run: schemafit lint schemas/*.json --provider openai,anthropic,gemini --format sarif > schemafit.sarif
continue-on-error: true # let code-scanning ingest the report
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: schemafit.sarif
--live-verify, opt-in)--live-verify turns "the docs forbid this" into "the provider actually
accepted/rejected it" by sending a minimal structured-output probe to each
provider and failing closed on a rejection. It is opt-in and key-gated:
OPENAI_API_KEY,
ANTHROPIC_API_KEY, GEMINI_API_KEY) is present in the environment. Real calls
use the standard library (no new dependency); the [live] extra is reserved for
optional provider SDKs.confirmed_by_provider is true (accepted), false (rejected
→ exit 1), or null (abstained: no key / rate-limited / network error).
Abstaining is not a rejection and never fails CI.Never commit an API key. The real path reads keys only from the environment and never echoes their value. Leave
--live-verifyout of default CI.
| Provider | Checks (grounded in) |
|---|---|
openai | additionalProperties:false required; all properties required; no default; no oneOf in array items (openai-agents-python#474, claude-task-master#1522) |
anthropic | 13 rejected validation keywords on the strict structured-output surface: minLength/maxLength/pattern/format/minimum/maximum/exclusiveMinimum/exclusiveMaximum/minItems/maxItems/uniqueItems/minProperties/maxProperties (vercel/ai#13355, anthropic-sdk-python#1034). General Messages-API tool input_schema is more permissive, so run this pack against schemas you send on the structured-output path. |
gemini | Portability warnings (version-sensitive, non-failing by default): anyOf (rejected by ≤2.0 / old SDKs, supported by 2.5), oneOf, open dict (additionalProperties schema), $ref recursion. Gemini's schema support changed fast (anyOf Jan 2026, additionalProperties Nov 2025), so these warn; use --strict to gate on them. (python-genai#460, docs) |
mistral (new in v0.3) | Strict custom structured-output conventions: additionalProperties:false required and every property listed in . : Mistral's docs do not enumerate a per-keyword unsupported list, so no keyword-blocklist rules are invented; these two rules are from the official sample. Notes (not lint rules): the request must use with , and all models except are supported. () |
| code | meaning |
|---|---|
0 | no errors (warnings allowed unless --strict) |
1 | at least one error (CI fail) |
2 | bad input (unreadable / invalid JSON) |
In scope now: the lint + repair core, five provider rule packs
(OpenAI, Anthropic, Gemini, Mistral, Cohere), human/JSON and SARIF 2.1.0
reporters, an opt-in --live-verify confirmation mode, Docker image,
GitHub Action, pre-commit hook.
Shipped in v0.2: SARIF output for GitHub code-scanning; the --live-verify
opt-in live-confirmation mode (MOCK by default, key-gated real calls, fail-closed).
Shipped in v0.3: the Mistral and Cohere provider rule packs (provider matrix 3 → 5), both static, network-free, and core-dependency-free.
Shipped in v0.4: Cohere structural rules (top-level must be object + every
object ≥1 required field) via two new apply_rule kinds; primary-sourced,
static, no net, core-deps unchanged.
Shipped in v0.5: automatic rule-pack drift detection on the
--live-verify path (mock-default/hermetic): static pass + live reject emits
*-drift finding (reuses Finding/report/SARIF + doc_url foundation). Proofs
include schemafit lint fixtures/drift-mock-bad.json --provider cohere --live-verify
(exit 1 + cohere-drift).
Deferred (vNext): Bedrock/Vertex packs; a pydantic source-model auto-fix mode;
and an npm/ajv + Zod port.
MIT © 2026 Dan Mercede
requiredresponse_format: json_schemastrict:truecodestral-mambacohere (new in v0.3) | Hard-error unsupported structured-output keywords from Cohere's keyword-support table: composition allOf/oneOf/not; numeric ranges minimum/maximum; array-length minItems/maxItems; string-length minLength/maxLength; uniqueItems (marked unsupported for both structured-output columns; allowed only under regular Tool Use with strict_tools=False). Supported and not flagged: anyOf, $ref/$def, enum, const, pattern. Structural (v0.4): top-level schema must be type: object; every object (incl. nested) must specify ≥1 required field. Caveat (still not a rule): regex anchors (^, $, ?=, ?!) inside a pattern are unsupported; anchor detection needs value-inspection and remains deferred. Primary-sourced to docs.cohere.com/docs/structured-outputs. |