{"id":49050706,"url":"https://github.com/joe0731/modelsig","last_synced_at":"2026-04-19T20:01:11.562Z","repository":{"id":345101960,"uuid":"1184065364","full_name":"joe0731/modelsig","owner":"joe0731","description":"Compare LLM architectures without downloading weights — structural fingerprint \u0026 proxy-test advisor for vLLM, TensorRT-LLM, SGLang, ONNX Runtime","archived":false,"fork":false,"pushed_at":"2026-03-18T06:42:34.000Z","size":77,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-18T06:44:39.934Z","etag":null,"topics":["architecture","fingerprint","gqa","huggingface","inference","llama","llm","mistral","model-analysis","moe","onnx","onnxruntime","proxy-testing","qwen","safetensors","tensorrt-llm","vllm"],"latest_commit_sha":null,"homepage":"https://github.com/joe0731/modelsig","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joe0731.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-17T08:07:42.000Z","updated_at":"2026-03-18T06:42:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/joe0731/modelsig","commit_stats":null,"previous_names":["joe0731/modelsig"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/joe0731/modelsig","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joe0731%2Fmodelsig","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joe0731%2Fmodelsig/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joe0731%2Fmodelsig/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joe0731%2Fmodelsig/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joe0731","download_url":"https://codeload.github.com/joe0731/modelsig/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joe0731%2Fmodelsig/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32011023,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["architecture","fingerprint","gqa","huggingface","inference","llama","llm","mistral","model-analysis","moe","onnx","onnxruntime","proxy-testing","qwen","safetensors","tensorrt-llm","vllm"],"created_at":"2026-04-19T20:00:36.720Z","updated_at":"2026-04-19T20:01:11.549Z","avatar_url":"https://github.com/joe0731.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# modelsig\n\n**Compare LLM architectures without downloading weights.**\n\n`modelsig` extracts a multi-layer structural fingerprint from any HuggingFace model and tells you whether two models are architecturally equivalent — so the smaller one can act as a valid proxy for testing the larger one.\n\n[![Weekly Validation](https://github.com/joe0731/modelsig/actions/workflows/weekly-validation.yml/badge.svg)](https://github.com/joe0731/modelsig/actions/workflows/weekly-validation.yml)\n[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-green.svg)](LICENSE)\n\n---\n\n## What problem does it solve?\n\nTesting inference engines (vLLM, TensorRT-LLM, SGLang, llama.cpp, ONNX Runtime, etc.) against every large model is prohibitively expensive. `modelsig` answers:\n\n\u003e *\"Can I test Qwen3-72B correctness using Qwen3-7B instead?\"*\n\u003e *\"Is Nemotron-120B-FP4 architecturally equivalent to the BF16 variant?\"*\n\u003e *\"Does this ONNX export match the original safetensors model?\"*\n\nIt compares structural fingerprints — shape ratios, operator sets, KV cache patterns, layer topology — without ever downloading a single weight tensor.\n\n---\n\n## Key Features\n\n- **Zero weight download** — safetensors header via HTTP Range (~20 bytes), ONNX graph-only (no `.onnx_data`), or config-only fast mode\n- **5-layer fingerprint** — static weights, arch config, op types, KV cache pattern, layer-level I/O signatures\n- **3-phase isomorphism comparison** — key overlap, substructure, algebraic scaling\n- **Substitution verdicts** — `FULL_SUBSTITUTE / PARTIAL_SUBSTITUTE / NO_SUBSTITUTE`\n- **4-level multi-fidelity test plan** — maps models to test coverage levels L1–L4\n- **Wide model support** — dense decoder, GQA, MoE, vision-language, speech, ONNX classification\n- **Both HF and local models** — supports `local:/path/to/model`\n- **JSON / table / markdown output** — CI-friendly JSON, human-readable table, shareable markdown\n\n---\n\n## Installation\n\n### From PyPI (recommended)\n\n```bash\nuv add modelsig           # add to a uv project\n# or\nuv tool install modelsig  # install as a standalone CLI tool\n```\n\n### From source\n\n```bash\ngit clone https://github.com/joe0731/modelsig\ncd modelsig\nuv sync                   # install all deps + editable package\nuv run modelsig --help\n```\n\n### Still using pip?\n\n```bash\npip install modelsig\n```\n\n**Dependencies (all installed by default):**\n\n| Package | Purpose |\n|---------|---------|\n| `requests` | HTTP Range fetching for safetensors headers |\n| `huggingface_hub` | Model file listing, downloads, auth |\n| `onnx` | ONNX graph parsing (falls back to built-in protobuf if unavailable) |\n| `transformers` | AutoConfig normalization, layer signature capture |\n| `torch` | Meta-device forward pass for layer I/O shape collection |\n| `safetensors` | Local safetensors file parsing |\n\n---\n\n## Quick Start\n\n```bash\n# Analyze a single model (-m / --model flag)\nmodelsig -m Qwen/Qwen3-7B --output table\n\n# Compare two models (proxy-test decision)\nmodelsig -m Qwen/Qwen3-7B -m Qwen/Qwen3-72B --compare --output table\n\n# Fast mode for large models (config only, no download)\nmodelsig -m nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16 --fast --output table\n\n# ONNX model\nmodelsig -m onnx-community/Qwen3.5-0.8B-ONNX --output json\n\n# Skip layer-level I/O signature capture (faster, no torch needed)\nmodelsig -m Qwen/Qwen3-7B --no-layer-sig --output json\n\n# Private/gated model\nmodelsig -m org/private-model --token hf_xxx\n# or: export HF_TOKEN=hf_xxx\n```\n\n---\n\n## How It Works\n\n### Zero-Weight-Download\n\nFor **safetensors** models, only the file header is fetched via HTTP Range requests (~20 bytes per shard). No weights are transferred.\n\nFor **ONNX** models, only the `.onnx` graph file is downloaded (typically 1–5 MB). The paired `.onnx_data` weight file (which can be GBs) is never touched.\n\nFor **fast mode** (`--fast`), only `config.json` is fetched (a few KB). No tensors at all.\n\n### 5-Layer Signature System\n\n| Layer | What it captures | Source |\n|-------|-----------------|--------|\n| **L1** Static weight signature | Per-tensor `{abstract_key → shape, dtype, layer_type}` — layer indices normalized to `.N.` | safetensors header / ONNX initializers |\n| **L2** Architecture fingerprint | `hidden_size`, `num_hidden_layers`, `num_attention_heads`, `num_key_value_heads`, `intermediate_size`, `head_dim`, MoE config | `config.json` via AutoConfig |\n| **L3** Op type set | Canonical operator vocabulary: `aten/mm`, `attention`, `rms_norm`, `rope`, `silu`, `topk/router` … | tensor key patterns / ONNX opset |\n| **L4** KV cache shape pattern | `[batch, num_kv_heads, seq_len, head_dim]` | derived from L2 |\n| **L5** Layer I/O signatures | Per-module `{input: [{dtype, shape}], output: [{dtype, shape}]}` on meta device | torch forward hooks (`--no-layer-sig` to skip) |\n\n### 3-Phase Isomorphism Comparison\n\n```\nPhase 1 — Key coverage    : normalized key set overlap ≥ 80%\nPhase 2 — Substructure    : attention / FFN / norm submodules match\nPhase 3 — Algebraic scale : hidden_size / intermediate_size / head_dim ratios uniform within 20%\n```\n\nResult: `ISOMORPHIC` / `SCALE_ONLY` / `DIFFERENT_ARCH`\n\n### Substitution Verdict\n\n| Verdict | Meaning |\n|---------|---------|\n| `FULL_SUBSTITUTE` | All 3 phases pass + shape ratios uniform + layer_type_coverage ≥ 95% |\n| `PARTIAL_SUBSTITUTE` | Phase 1+2 pass or op coverage ≥ 80% |\n| `NO_SUBSTITUTE` | Different arch, MoE vs Dense mismatch, or key divergence |\n\n### Quantization Transferability Estimate\n\nWhen comparing two models, `modelsig` also computes a structural quantization transferability score:\n\n```\nstruct_sim_score   — 1.0 (ISOMORPHIC) / 0.80 (SCALE_ONLY) / 0.20 (DIFFERENT_ARCH)\nop_hist_sim        — cosine similarity of operator frequency vectors\nlayer_type_hist    — Jaccard similarity of layer type sets\nshape_uniform      — whether common weight shapes scale uniformly\nmoe_correction     — ~5% penalty for mixed MoE/Dense pairs\narch_risk_factors  — hidden_size ratio, GQA mismatch, FFN expansion, RoPE theta diff\n```\n\nOutput: `estimated_transferability` score (0–1) with `confidence` (HIGH/MEDIUM/LOW),\n`recommended_methods` (GPTQ/AWQ/mixed-precision/expert-aware), and `caveats`.\n\n\u003e This is a **structural pre-filter only**. SensCorr and RepAlign require actual calibration\n\u003e data and are the strongest transfer predictors. Use this score to decide whether to attempt\n\u003e transfer at all, not as a final guarantee.\n\n### Multi-Fidelity Test Plan (4 levels)\n\n```\nL1 Structure    — cheapest: model loading, tensor shapes, dtype validation\nL2 Numerical    — cosine similarity, perplexity on calibration set\nL3 Runtime      — prefill latency, decode throughput, KV cache eviction\nL4 Canary       — large/MoE model: peak memory, TP/PP correctness\n```\n\n---\n\n## Usage\n\n### Basic — analyze a single model\n\n```bash\nmodelsig -m Qwen/Qwen3-7B --output table\n```\n\n```\n==============================================================================\n  modelsig v2.0  |  2026-03-17T10:00:00Z\n==============================================================================\n\n   Model: Qwen/Qwen3-7B\n  type                   qwen3\n  hidden_size            3584\n  num_hidden_layers      28\n  num_attention_heads    28  (kv: 8)\n  intermediate_size      18944\n  head_dim               128\n  is_moe                 False\n  ffn_expansion          5.285714\n  gqa_ratio              3.5\n  kv_cache_pattern       [batch, 8, seq_len, 128]\n  op_types               aten/mm, attention, embedding, rms_norm, rope, silu, swiglu\n  layer_types            AttentionLayer, EmbeddingLayer, FFN_SwiGLU, LMHead, RMSNorm\n  abstract_keys          14\n  source                 safetensors\n```\n\n### Compare models (proxy-testing decision)\n\n```bash\nmodelsig -m Qwen/Qwen3-7B -m Qwen/Qwen3-72B --compare --output table\n```\n\n### Full analysis with multi-fidelity plan\n\n```bash\nmodelsig \\\n    -m Qwen/Qwen3-7B -m Qwen/Qwen3-30B-A3B -m Qwen/Qwen3-235B-A22B \\\n    --compare --multi-fidelity --output markdown --save report.md\n```\n\n### ONNX model\n\n```bash\nmodelsig -m onnx-community/Qwen3-4B-ONNX --output json\n```\n\n### Config-only fast mode (no safetensors/ONNX fetch, instantaneous)\n\n```bash\nmodelsig -m Qwen/Qwen3-235B-A22B --fast --output table\n```\n\n### Local model directory\n\n```bash\nmodelsig local:/path/to/model --output json\nmodelsig local:/path/to/7b local:/path/to/72b --compare\n```\n\n### Private / gated models\n\n```bash\nmodelsig -m org/private-model --token hf_xxx\n# or: export HF_TOKEN=hf_xxx\n```\n\n### Save report\n\n```bash\nmodelsig -m Qwen/Qwen3-7B -m Qwen/Qwen3-72B \\\n    --compare --output markdown --save report.md\n```\n\n### Models with custom code\n\n```bash\n# Only use --trust-remote-code for models you trust.\n# This allows execution of arbitrary Python code from the model repository.\nmodelsig -m org/custom-model --trust-remote-code\n```\n\n---\n\n## Scenario Examples\n\n### Scenario 1 — Inference Engine Regression Testing\n\n**Problem:** You want to validate a new vLLM kernel for Qwen3-72B but CI is limited to A10G GPUs (24 GB VRAM).\n\n```bash\nmodelsig -m Qwen/Qwen3-7B -m Qwen/Qwen3-72B --compare --output table\n```\n\n**Expected result:** `ISOMORPHIC / FULL_SUBSTITUTE` — same GQA pattern, same op set, uniform scaling. You can run full functional tests on 7B and gate the 72B behind a nightly canary run.\n\n---\n\n### Scenario 2 — MoE vs Dense Compatibility Check\n\n**Problem:** Does Qwen3-30B-A3B (MoE) behave like a drop-in proxy for Qwen3-235B-A22B?\n\n```bash\nmodelsig -m Qwen/Qwen3-30B-A3B -m Qwen/Qwen3-235B-A22B \\\n    --compare --multi-fidelity --output markdown\n```\n\nBoth are MoE models from the same family → `ISOMORPHIC`. The multi-fidelity plan shows:\n- L1: use 30B-A3B for structure/conversion tests\n- L2: numerical validation on 30B\n- L4: 235B-A22B as canary for routing correctness and peak memory\n\n---\n\n### Scenario 3 — Cross-Family Sanity Check\n\n**Problem:** Can Llama-3.1-8B proxy-test a Mistral-7B?\n\n```bash\nmodelsig -m meta-llama/Llama-3.1-8B-Instruct -m mistralai/Mistral-7B-v0.1 \\\n    --compare --output json\n```\n\nBoth are dense GQA decoders with the same op set → `ISOMORPHIC / FULL_SUBSTITUTE`. Despite different model_type labels, the structural fingerprint matches.\n\n---\n\n### Scenario 4 — ONNX Runtime Compatibility\n\n**Problem:** You converted GPT-2 to ONNX and want to verify the ONNX version matches the torch version structurally.\n\n```bash\nmodelsig -m openai-community/gpt2 -m onnx-community/gpt2 --compare --output table\n```\n\nThe ONNX version is parsed from the `.onnx` graph file. The safetensors version is parsed from the header. Both share the same abstract key set → `ISOMORPHIC`.\n\n---\n\n### Scenario 5 — Quantized Model Compatibility\n\n**Problem:** Will `nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4` (quantized to FP4) behave the same as the BF16 variant?\n\n```bash\nmodelsig \\\n    -m nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16 \\\n    -m nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4 \\\n    --compare --fast --output table\n```\n\nBoth share the same architecture (120B MoE). `--fast` uses config-only mode to avoid downloading large safetensors headers. Result: `ISOMORPHIC` — same layer topology, only dtype differs.\n\n---\n\n### Scenario 6 — Quantization Method Transfer\n\n**Problem:** You quantized Qwen3-7B with AWQ. Can that config transfer to Qwen3-72B?\n\n```bash\nmodelsig \\\n    -m Qwen/Qwen3-7B -m Qwen/Qwen3-72B \\\n    --compare --output json --save qwen3_quant_transfer.json\n```\n\nThe `quant_transfer` block in `coverage_matrix` gives:\n- `estimated_transferability` — composite score (0–1) based on structural similarity\n- `confidence` — HIGH/MEDIUM/LOW\n- `recommended_methods` — e.g. `GPTQ (W4A16)`, `AWQ (W4A16)`, `Mixed-precision`\n- `arch_risk_factors` — e.g. large hidden_size ratio, RoPE theta mismatch\n- `caveats` — whether activation-aware recalibration is needed\n\n---\n\n## CLI Reference\n\n```\nmodelsig [-m MODEL_ID ...] [MODEL_ID ...] [OPTIONS]\n\nArguments:\n  -m / --model MODEL_ID  HF model ID or local:PATH (repeatable, preferred)\n  MODEL_ID               positional alternative — same as -m\n\nOptions:\n  --output              json | table | markdown  (default: json)\n  --compare             Compute pairwise coverage for all model pairs\n  --save FILE           Save output to file\n  --fast                Config-only mode — no safetensors/ONNX download\n  --multi-fidelity      Include 4-level multi-fidelity test plan\n  --no-layer-sig        Skip per-module I/O dtype+shape capture (faster)\n  --token TOKEN         HF Hub token for private/gated models\n  --timeout SEC         HTTP timeout (default: 30)\n  --no-color            Disable ANSI colors in table output\n  --trust-remote-code   Allow trust_remote_code=True for custom model code\n                        ⚠ enables arbitrary code execution — use only for trusted models\n```\n\n---\n\n## Module Structure\n\n```\nmodelsig/\n├── analyze.py              CLI entry point (~190 lines)\n├── constants.py            Shared constants: TOOL_NAME, _OP_RULES, _LAYER_TYPE_RULES, …\n│\n├── hf/\n│   └── client.py           HF Hub client: token management, HTTP GET + backoff,\n│                           model_info().siblings, hf_hub_download\n│\n├── parsers/\n│   ├── safetensors.py      HTTP Range header fetch + local shard discovery\n│   └── config.py           AutoConfig.from_pretrained() + _flatten_config() aliases\n│\n├── onnx/\n│   ├── ops.py              _ONNX_DTYPE map, _ONNX_OP_MAP, canonical op mapping\n│   ├── parser.py           onnx.load(load_external_data=False) + protobuf fallback\n│   ├── selector.py         Primary .onnx file selection heuristics\n│   └── collector.py        Orchestrates HF download → parse pipeline\n│\n├── torch/\n│   └── layer_sig.py        L5: per-module input/output dtype+shape via forward hooks\n│\n├── signature/\n│   ├── static.py           L1: build_static_weight_signature, norm_key, norm_dtype\n│   ├── arch.py             L2: build_arch_fingerprint, KV cache pattern, dim ratios\n│   ├── template.py         Per-layer canonical submodule template (for phase-2)\n│   └── fingerprint.py      ModelFingerprint dataclass + build_fingerprint orchestrator\n│\n├── comparison/\n│   ├── phases.py           Phase 1/2/3 isomorphism tests\n│   ├── ratios.py           Shape ratio uniformity analysis\n│   ├── quant_transfer.py   Structural quantization transferability estimator\n│   ├── coverage.py         Unified compute_coverage + test strategy + quant_transfer\n│   └── multifidelity.py    4-level multi-fidelity test plan builder\n│\n└── output/\n    ├── colors.py           ANSI color helpers\n    ├── json_fmt.py         JSON formatter + fp_to_dict\n    ├── table_fmt.py        ANSI table formatter\n    └── markdown_fmt.py     Markdown report formatter\n```\n\n---\n\n## Security\n\n- **No arbitrary code execution by default.** `trust_remote_code` is `False` unless explicitly set via `--trust-remote-code`.\n- **Token safety.** The HF token is passed via HTTP headers only — never embedded in URLs or logged to stderr.\n- **No weight download.** Only metadata (safetensors header, ONNX graph, config.json) is fetched.\n\n---\n\n## Design Principles\n\n| Principle | Implementation |\n|-----------|---------------|\n| **Zero weight download** | HTTP Range (safetensors), graph-only .onnx, config-only fast path |\n| **Framework-driven parsing** | `AutoConfig.from_pretrained()` for config normalization; `onnx.load()` for graph parsing |\n| **Graceful degradation** | Every heavy dependency is optional — falls back to built-in parsers |\n| **Architecture-agnostic** | Works on dense decoders, GQA models, MoE, vision-language, speech, classification |\n| **Single CLI, composable API** | Import any module independently or use the unified CLI |\n| **Safe by default** | `trust_remote_code=False`; token in headers not URLs |\n\n---\n\n## Supported Model Families\n\nValidated weekly against **57 models** (29 safetensors + 28 ONNX):\n\n**Safetensors (full header fetch):**\nQwen3.5-{0.8B,4B,9B,27B,35B-A3B,397B-A17B}, Qwen2.5-7B-Instruct, Qwen3-Coder-Next,\nDeepSeek-V3.2, Kimi-K2.5, MiniMax-M2.5, GLM-5,\nNemotron-3-{Nano-4B, Super-120B}-{BF16,NVFP4,FP8},\nGranite-4.0-1b-speech, BitNet-b1.58-2B-4T, MiroThinker-{1.7,1.7-mini},\nSarvam-{30b,105b}, Reka-edge-2603, LocoTrainer-4B, OmniCoder-9B,\nNanbeige4.1-3B, Param2-17B-A2.4B, gpt-oss-20b, all-MiniLM-L6-v2\n\n**ONNX (graph-only, no weight download):**\nQwen3.5-{0.8B,2B,4B}-ONNX, Qwen3-{4B-VL,VL-2B,Reranker-0.6B}-ONNX,\nQwen2.5-{0.5B,VL-3B}-ONNX, LFM2-24B-A2B, Olmo-Hybrid-{SFT,DPO,Think}-7B,\nVoxtral-Mini-4B, Granite-4.0-1b-speech, Nemotron-Nano-4B,\nBERT-multilingual-NER, chinese-RoBERTa, multilingual-MiniLMv2, CodeT5,\nJan-code-4b, Josiefied-Qwen3.5-0.8B, IndoBERT-news-classification,\nai-image-detection × 4, vehicle-classification, tmr-text-detector\n\n---\n\n## Contributing\n\nAll logic is in the `modelsig/` package. Each subdirectory has a single responsibility. Tests live in `tests/` and cover 130+ unit + integration scenarios.\n\n```bash\ngit clone https://github.com/joe0731/modelsig\ncd modelsig\nuv sync --extra dev       # installs all deps + dev tools\nuv run pytest tests/ -v\n```\n\nWeekly validation against the full model zoo runs via GitHub Actions (`.github/workflows/weekly-validation.yml`).\n\n---\n\n## Related Projects\n\n- [huggingface_hub](https://github.com/huggingface/huggingface_hub) — HF Hub Python client\n- [safetensors](https://github.com/huggingface/safetensors) — safe, zero-copy tensor serialization\n- [vLLM](https://github.com/vllm-project/vllm) — high-throughput LLM inference\n- [ONNX Runtime](https://github.com/microsoft/onnxruntime) — cross-platform inference accelerator\n\n---\n\n## License\n\nApache 2.0 — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoe0731%2Fmodelsig","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoe0731%2Fmodelsig","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoe0731%2Fmodelsig/lists"}