modelpin 0.4.2__tar.gz → 0.5.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {modelpin-0.4.2 → modelpin-0.5.2}/CHANGELOG.md +97 -1
- {modelpin-0.4.2 → modelpin-0.5.2}/PKG-INFO +39 -9
- {modelpin-0.4.2 → modelpin-0.5.2}/README.md +38 -8
- modelpin-0.5.2/data/models.json +1020 -0
- modelpin-0.5.2/docs/samples/gemini-2.5-flash-lite-to-3.1-flash-lite.engineer.md +81 -0
- modelpin-0.5.2/docs/samples/gemini-2.5-flash-lite-to-3.1-flash-lite.md +179 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/cli.py +558 -7
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/config.py +13 -1
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/models.py +50 -4
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/openai.py +88 -4
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/report/__init__.py +7 -0
- modelpin-0.5.2/modelpin/report/migration.py +389 -0
- modelpin-0.5.2/modelpin/report/reasoning.py +103 -0
- modelpin-0.5.2/modelpin/watcher/__init__.py +230 -0
- modelpin-0.5.2/modelpin/watcher/registry.py +1212 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/PKG-INFO +39 -9
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/SOURCES.txt +11 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/pyproject.toml +1 -1
- modelpin-0.5.2/scripts/canary.py +381 -0
- modelpin-0.5.2/scripts/registry_check.py +152 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_action_pins.py +2 -2
- modelpin-0.5.2/tests/test_canary.py +209 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_judge_providers.py +5 -4
- modelpin-0.5.2/tests/test_migration_report.py +311 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_anthropic.py +4 -1
- modelpin-0.5.2/tests/test_reasoning_effort.py +318 -0
- modelpin-0.5.2/tests/test_registry_contract.py +203 -0
- modelpin-0.5.2/tests/test_watch.py +514 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_watcher.py +7 -3
- modelpin-0.4.2/data/models.json +0 -13
- modelpin-0.4.2/modelpin/watcher/__init__.py +0 -38
- modelpin-0.4.2/modelpin/watcher/registry.py +0 -66
- {modelpin-0.4.2 → modelpin-0.5.2}/CODE_OF_CONDUCT.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/CONTRIBUTING.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/LICENSE +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/MANIFEST.in +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/SECURITY.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/action.yml +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/actions/README.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/PUBLISHING.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/fp-measurement.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/how-it-works.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/live-validation.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/advice_meaning.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/bec_bank_change.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/bec_urgent_pressure.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/legitimate_payment.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/refusal_probe.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/unknown_vendor.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis_traces_openai_gpt-oss-120b.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis_traces_openai_gpt-oss-20b.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/drift_cache_drift-suite.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/drift_results_drift-suite.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/runs/check-openai_gpt-oss-120b-to-openai_gpt-oss-20b-20260905T064108Z.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/runs/check-openai_gpt-oss-20b-to-openai_gpt-oss-120b-20260905T062833Z.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/runs/check-openai_gpt-oss-20b-to-openai_gpt-oss-120b-20260905T063359Z.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/verify_voicerag_report.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/voicerag_traces_openai_gpt-oss-120b.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/voicerag_traces_openai_gpt-oss-20b.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/modelpin-drift-map-1.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/modelpin-voicerag-abstention-1.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/docs/writing-scenarios.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/README-arguments.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/README.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_enum_phrasing.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_freetext_note.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_key_order.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_list_order.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_multistep_carry.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_numeric_rounding.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_optional_fields.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/classify_topic.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/define_term.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/explain_concept.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/reco_decision.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/README-arg-gate-fp.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-gate-fp-2026-08-25-gemini-2.5-flash.txt +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-gate-fp-2026-08-25-pilot.txt +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-gate-price.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-repertoire-gpt-4.1-mini.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-repertoire-gpt-4o-mini.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-repertoire-rounding-n24.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/result-independent-judge.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/result-selfjudge.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/summarize_outcome.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/README.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/labels.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_anchor_deeds_office_lookup.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_anchor_ferry_book_two_step.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_archive_two_box_request.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_bakery_standing_delivery.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_beekeeping_backorder_lookup.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_boxoffice_seat_move.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_brewery_keg_credit.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_campsite_pitch_hold.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_carwash_plan_change.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_cheese_delivery_route.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_cidermill_reminder_channel.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_cleaning_rate_uplift.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_climbinggym_freeze_refund.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_courier_locker_reassign.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_dentallab_case_setup.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_filmkit_lens_swap.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_glazier_survey_check.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_kennel_boarding_clearance.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_laundry_route_shortfall.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_locksmith_charge_guard.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_marina_berth_assign.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_nursery_batch_move.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_parking_permit_renew.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_planthire_offhire_collection.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_sailmaker_cloth_check.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_scaffold_dismantle_check.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_schoolbus_cover_route.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_signshop_price_route.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_skihire_boot_swap.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_solar_meter_swap.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_tailoring_consent_log.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_taxifleet_service_booking.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_toollib_return_and_fee.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_upholstery_fabric_hold.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_windfarm_workorder.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/unit_answer.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/ambiguous_tool_redundant.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/borderline_access.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/first_primes.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/multi_constraint_colors.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/nuanced_intent.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/prompt_injection.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/reason_machines.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/reason_pen_rounding.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/reason_snail.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/sarcasm_sentiment.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/strict_json_escape.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/tool_missing_param.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/README.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/agent_missing_param_ask.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/agent_reschedule_two_step.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/borderline_medication_question.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/classify_review_sentiment.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/extract_invoice_fields.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/format_markdown_table.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/rag_answer_with_citation.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/rewrite_email_polite.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/sql_from_question.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/summarize_standup_notes.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/support_order_status.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/triage_ticket_json.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/README.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/anchor_mandatory_lookup_fixed_format.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/calc_tool_or_mental_math.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/citation_style_underspecified.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/docsearch_or_general_knowledge.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/grammar_tool_or_direct_fix.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/optional_availability_before_booking.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/optional_notify_after_status_update.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/optional_part_stock_second_lookup.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/plaintext_answer_bold_optional.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/sql_answer_fence_unspecified.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/total_currency_code_or_symbol.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/verify_or_trust_pasted_status.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/README.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/action_items_keep_the_owners.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/anchor_closed_set_label.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/anchor_echo_the_reference_line.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/dispatch_line_keeps_the_ids.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/handover_note_keeps_the_ids.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/json_null_or_omitted_key.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/metrics_line_keeps_the_numbers.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/regex_anchors_unspecified.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/slug_conjunction_stopwords.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/standup_digest_keeps_the_ids.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/github-workflow.yml +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/README.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/answer_plain_question.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/manifest.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_browse_url.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_private_lookup.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_read_local_file.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_realtime_price.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_send_email.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/README.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/ambiguous_tool_redundant.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/borderline_access.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/first_primes.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/manifest.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/multi_constraint_colors.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/nuanced_intent.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/prompt_injection.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/reason_machines.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/reason_pen_rounding.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/reason_snail.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/sarcasm_sentiment.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/strict_json_escape.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/summarize_semantic.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/tool_missing_param.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/tooluse_guarded_action.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/roles.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/README.md +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/cancel_subscription.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/classify_sentiment.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/decline_pii.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/extract_total.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/format_contact_json.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/order_status.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/refund_request.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/summarize_ticket.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/support_agent.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/abstain_empty_context.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/abstain_topic_no_answer.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/abstain_unsafe_question.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/answer_multi_hop.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/answer_over_distractor.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/answer_paraphrase_gap.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/cite_in_range.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/format_one_spoken_sentence.json +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/modelpin.yaml +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/__init__.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/__main__.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/demo.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/detector/__init__.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/__init__.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/argkey.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/confirm.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/semantic.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/stats.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/structural.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/judge.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/__init__.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/_common.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/anthropic.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/base.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/fake.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/google.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/replay/__init__.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/report/evidence.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/report/suite.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/scaffold.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/scenarios/__init__.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/scenarios/draft.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/scenarios/starter.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/storage.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/dependency_links.txt +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/entry_points.txt +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/requires.txt +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/top_level.txt +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/scripts/arg_gate_price.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/scripts/arg_repertoire.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/scripts/calibrate_thresholds.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/scripts/channel_exposure.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/scripts/drift_map.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/scripts/fp_aggregate.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/scripts/fp_measurement.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/scripts/judge_agreement.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/scripts/tool_gate_price.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/setup.cfg +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/docs_extract.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_advertised_providers.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_agent_starter.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_assertion_advisory_disclosure.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_baseline_integrity.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_baseline_privacy.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_baseline_scenario_collision.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_baseline_staleness.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_census_contradiction.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_census_from_traces.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_channel_census.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_channel_exposure.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_cli.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_cli_hardening.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_common.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_config.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_confirm_regression.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_console_safety.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_cross_judge_agreement.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_demo.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_context.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_cross_vendor.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_junction_fallback.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_patterns.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_walk.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_diff.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_discretion_hint.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_draft.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_draft_source_match.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_dunder_main.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_error_messages_survive_rich.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_error_text_and_store_failures.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_exit_code_contract.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_first_run_cost.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_first_run_sdk_check.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_artifacts.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_measurement_repertoire.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_rejudge.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_run_of_record.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_severity.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_gemini_measurements.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_insufficient_evidence.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_judge.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_judge_independence.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_labelled_corpus_runs_its_labels.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_live_validation.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_models.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_mp114_directional_reference.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_mp220_tool_channel_false_positive.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_mp227_per_scenario_match.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_no_tool_attribution.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_one_bad_scenario.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_os_trust_store.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_packaging_contents.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_per_scenario_census.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_fake.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_google.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_google_retry.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_openai.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_retry.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_python_floor_is_one_number.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_recall_arm.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_refusal_apostrophe.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_rejected_key_message.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_release_gate.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_replay.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_archive.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_channel_census.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_claims.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_evidence.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_injection.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_suite.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_run_record.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scaffold.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scan_boundary.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scan_first_run_trust.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scan_performance.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scan_render_split.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scenarios.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_secret_shapes.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_semantic.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_silently_ignored_input.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_skipped_reaches_the_report.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_statistical_power.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_storage.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_suite_roles.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_tool_argument_key.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_tool_arguments.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_tool_gate_price.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_unimplemented_assertions.py +0 -0
- {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_voicerag_report_claims.py +0 -0
|
@@ -8,6 +8,99 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
8
8
|
|
|
9
9
|
Nothing yet.
|
|
10
10
|
|
|
11
|
+
## [0.5.2] - 2026-11-05
|
|
12
|
+
|
|
13
|
+
The first release on PyPI since 0.5.0: it also carries everything listed under 0.5.1.
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **`modelpin watch` no longer reports as retired four Gemini models that Google's pages still
|
|
18
|
+
list as available.** The registry carried Vertex AI's 20 October 2026 date for
|
|
19
|
+
`gemini-2.5-pro`, `gemini-2.5-flash` and `gemini-2.5-flash-lite`, and, for
|
|
20
|
+
`gemini-2.5-flash-image`, the 2 October 2026 date it read from the Gemini API on 17 September.
|
|
21
|
+
Once those dates passed (for `gemini-2.5-flash-image`, from the day 0.5.0 shipped), `watch`
|
|
22
|
+
called all four retired. Read again on 5 November 2026:
|
|
23
|
+
- `gemini-2.5-pro` and `gemini-2.5-flash`: the Gemini API gives 1 December 2026 as the
|
|
24
|
+
shutdown date, after which requests to them route to `gemini-3.8-flash` and
|
|
25
|
+
`gemini-3.5-flash-lite` respectively; access is already limited to earlier users. `watch`
|
|
26
|
+
now names those successors.
|
|
27
|
+
- `gemini-2.5-flash-lite`: the Gemini API says it "is not deprecated and remains available
|
|
28
|
+
through the API until further notice". Vertex AI still lists the passed 20 October date, so
|
|
29
|
+
`watch` reports it deprecated with no shutdown date, and names `gemini-3.8-flash`, the first
|
|
30
|
+
successor Vertex lists.
|
|
31
|
+
- `gemini-2.5-flash-image`: both Google pages now give 15 March 2027, successor
|
|
32
|
+
`gemini-3.1-flash-lite-image`.
|
|
33
|
+
|
|
34
|
+
Where two Google surfaces disagree, the registry still carries the earlier date, but no longer
|
|
35
|
+
once that date has passed while the other surface still lists the model as available.
|
|
36
|
+
|
|
37
|
+
## [0.5.1] - 2026-10-04
|
|
38
|
+
|
|
39
|
+
Tagged and released on GitHub, but never published to PyPI: the publish job waited for the
|
|
40
|
+
required `pypi` approval, none was given, and GitHub failed it after 30 days. These changes
|
|
41
|
+
first reach PyPI in 0.5.2.
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- **Tool scenarios should now replay on `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`,
|
|
46
|
+
`gpt-6-sol` and `gpt-6-luna`.** According to OpenAI's and Azure OpenAI's documentation, Chat
|
|
47
|
+
Completions accepts tools from these models only with `reasoning_effort: none` and rejects the
|
|
48
|
+
request otherwise (for gpt-5.6, even when no effort is sent). So every tool scenario in a
|
|
49
|
+
check against the successor OpenAI names for its 23 October 2026 retirements would come back
|
|
50
|
+
"could not replay"; this has not yet been confirmed by a live call. Modelpin now sends `none`
|
|
51
|
+
when a scenario sends tools to one of them and no effort was chosen, and the reports say so.
|
|
52
|
+
With no `reasoning_effort` set, no other request changes, apart from the `gpt-6*` change
|
|
53
|
+
below.
|
|
54
|
+
- `gpt-6*` ids are now treated as reasoning models: they get `max_completion_tokens` and no
|
|
55
|
+
`temperature`.
|
|
56
|
+
|
|
57
|
+
### Added
|
|
58
|
+
|
|
59
|
+
- **`reasoning_effort` for OpenAI reasoning models**, in `modelpin.yaml` or as
|
|
60
|
+
`--reasoning-effort` on `baseline` and `check`, so a check measures the effort you will ship.
|
|
61
|
+
It is sent only to reasoning models (gpt-5.x, gpt-6, o-series); a scenario can set its own.
|
|
62
|
+
`last-report.md` (the pull-request comment) and `migration-report.md` state the effort each
|
|
63
|
+
side was sent, read from the recorded runs. `modelpin report` does not read the setting yet. Choosing an effort other than `none` for a tool scenario on one of the
|
|
64
|
+
models above stops that scenario before any call, because Chat Completions would reject it.
|
|
65
|
+
The Responses API is not supported yet.
|
|
66
|
+
|
|
67
|
+
- **A migration report for the person who decides on the switch.** Whenever `modelpin check`
|
|
68
|
+
writes `last-report.md`, it now also writes `.modelpin/migration-report.md`: the same run in
|
|
69
|
+
plain English, with a one-line bottom line, a one-paragraph verdict, each changed scenario
|
|
70
|
+
with what it means for your app and a before and after example, what the check did not cover
|
|
71
|
+
(untested behavior, changes that show up in only some runs, scenarios that could not be
|
|
72
|
+
measured or compared), and the run's date, both models, runs per scenario, judge calls and
|
|
73
|
+
tokens. It is a renderer over the verdicts `check` already computes and changes no verdict or
|
|
74
|
+
exit code.
|
|
75
|
+
|
|
76
|
+
## [0.5.0] - 2026-10-04
|
|
77
|
+
|
|
78
|
+
### Added
|
|
79
|
+
|
|
80
|
+
- **`modelpin watch`: which of your models are retiring, when, and what to check next.** It
|
|
81
|
+
crosses the models in `modelpin.yaml` (its `models:` and `judge_model`; with `--scan`, the
|
|
82
|
+
ids in your source; recorded baselines are listed, never alarmed on) with a registry shipped
|
|
83
|
+
inside the package, prints days remaining, the successor the vendor names, and the exact
|
|
84
|
+
`modelpin check --from ... --to ...` line, and exits `1` inside a notice window or already
|
|
85
|
+
retired, `3` for a model the registry does not know (unknown is not a clearance), `0` when
|
|
86
|
+
all clear, `4` when nothing is declared or the config or registry cannot be read. `--json` for scripts; `--registry <path>` to use a different `data/models.json`.
|
|
87
|
+
It never touches the network.
|
|
88
|
+
- **The model registry now carries real dates, and every entry carries its source.** 87
|
|
89
|
+
sourced entries (55 OpenAI, 16 Anthropic, 16 Google), a transcription of the vendor sections
|
|
90
|
+
named per entry rather than a complete catalogue, each naming the page it was read from and
|
|
91
|
+
the day it was read; `Model` refuses an entry without both, so an unsourced claim cannot enter
|
|
92
|
+
from the shipped seed or from a `--registry` file. Vendor aliases are recorded, so `gpt-4`
|
|
93
|
+
finds the `gpt-4-0613` row and `gpt-4o-mini` its dated snapshot; image and audio models carry
|
|
94
|
+
a `modality` so no chat check is suggested for them. The old seed's two OpenAI ids, `gpt-5.2`
|
|
95
|
+
and `gpt-5.5` (its note declared every OpenAI and Google id and every date UNVERIFIED),
|
|
96
|
+
appeared on none of the vendor lifecycle pages fetched on 2026-09-17 and were removed as
|
|
97
|
+
entries; the dated snapshots behind those aliases were added from their model pages.
|
|
98
|
+
`scripts/registry_check.py` validates the JSON and regenerates the Python mirror. The
|
|
99
|
+
OpenAI entries were re-read on 2026-10-04: the 2026-10-23 shutdowns are unchanged, GPT-5.1
|
|
100
|
+
and GPT-5.4-Nano are now deprecated with a 2027-04-01 shutdown, the GPT Image rows name
|
|
101
|
+
their new replacements, and `gpt-5.4-cyber` no longer names a successor, because the page
|
|
102
|
+
no longer does.
|
|
103
|
+
|
|
11
104
|
## [0.4.2] - 2026-10-01
|
|
12
105
|
|
|
13
106
|
Two changes. Python 3.11 is now supported. And a fix that affects you only if you set
|
|
@@ -1474,7 +1567,10 @@ not the exit code.
|
|
|
1474
1567
|
opinion-framed Markdown + JSON report.
|
|
1475
1568
|
- BYO-key throughout, with key-shaped-secret scrubbing on all output.
|
|
1476
1569
|
|
|
1477
|
-
[Unreleased]: https://github.com/samarthputhraya/modelpin/compare/v0.
|
|
1570
|
+
[Unreleased]: https://github.com/samarthputhraya/modelpin/compare/v0.5.2...HEAD
|
|
1571
|
+
[0.5.2]: https://github.com/samarthputhraya/modelpin/compare/v0.5.1...v0.5.2
|
|
1572
|
+
[0.5.1]: https://github.com/samarthputhraya/modelpin/compare/v0.5.0...v0.5.1
|
|
1573
|
+
[0.5.0]: https://github.com/samarthputhraya/modelpin/compare/v0.4.2...v0.5.0
|
|
1478
1574
|
[0.4.2]: https://github.com/samarthputhraya/modelpin/compare/v0.4.1...v0.4.2
|
|
1479
1575
|
[0.4.1]: https://github.com/samarthputhraya/modelpin/compare/v0.4.0...v0.4.1
|
|
1480
1576
|
[0.4.0]: https://github.com/samarthputhraya/modelpin/compare/v0.3.1...v0.4.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: modelpin
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.2
|
|
4
4
|
Summary: Dependabot for AI models — catch model-migration regressions before they hit production.
|
|
5
5
|
Author: Samarth Puthraya
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -85,8 +85,17 @@ OK 6 scenario(s) unchanged
|
|
|
85
85
|
Modelpin or any third party other than the model providers you configure (and, in CI, your own
|
|
86
86
|
pull request).
|
|
87
87
|
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
`modelpin watch` crosses the models your config names (and, with `--scan`, the ones in your
|
|
89
|
+
source) with a registry shipped inside each release, and tells you which of the ones **it knows**
|
|
90
|
+
are retiring, when, the successor the vendor names, and the exact check to run next. Every entry
|
|
91
|
+
in that registry carries the vendor page it was read from and the day it was read; a model the
|
|
92
|
+
registry has never heard of is reported as unknown, never as clear. The registry is transcribed
|
|
93
|
+
from OpenAI, Anthropic and Google's own deprecation and model pages, not from the catalogues
|
|
94
|
+
of OpenAI-compatible
|
|
95
|
+
hosts. **Nothing in Modelpin polls provider feeds**: the registry is refreshed when a release
|
|
96
|
+
ships, so it is only as current as the release you installed (`--registry <path>` points at a
|
|
97
|
+
newer file). Modelpin does not open pull requests on its own: you choose the candidate model,
|
|
98
|
+
and a scheduled workflow can re-check it on your clock.
|
|
90
99
|
|
|
91
100
|
CLI: `modelpin` (alias `mp`). License: Apache-2.0.
|
|
92
101
|
|
|
@@ -114,7 +123,7 @@ Python 3.11 or newer.
|
|
|
114
123
|
|
|
115
124
|
```bash
|
|
116
125
|
pip install "modelpin[providers]" # or: pipx install "modelpin[providers]"
|
|
117
|
-
modelpin version # -> modelpin 0.
|
|
126
|
+
modelpin version # -> modelpin 0.5.2
|
|
118
127
|
```
|
|
119
128
|
|
|
120
129
|
The `providers` extra installs the OpenAI, Anthropic and Google SDKs. Plain `pip install modelpin`
|
|
@@ -153,7 +162,10 @@ You will see one scenario per verdict:
|
|
|
153
162
|
|
|
154
163
|
The command exits **1** because regressions were found — that is what fails a CI build. The full
|
|
155
164
|
report is written to `.modelpin/last-report.md`, the same file the GitHub Action posts on a pull
|
|
156
|
-
request.
|
|
165
|
+
request. Beside it, `.modelpin/migration-report.md` tells the same result in plain English for
|
|
166
|
+
whoever decides on the switch: a one-paragraph verdict, each changed scenario with a before and
|
|
167
|
+
after example, what the check did not cover, and the run's date, models, runs and calls. Edit
|
|
168
|
+
`traces.json` and re-run to watch the verdicts move.
|
|
157
169
|
|
|
158
170
|
## Use it on your app
|
|
159
171
|
|
|
@@ -333,7 +345,7 @@ key, is not recognised.
|
|
|
333
345
|
|
|
334
346
|
| Provider (`providers:` / `--provider`) | Credentials | Notes |
|
|
335
347
|
|---|---|---|
|
|
336
|
-
| `openai` | `OPENAI_API_KEY` | Chat Completions, multi-turn tool calls. Reasoning models (`o1`/`o3`/`o4`/`gpt-5*`) get `max_completion_tokens` and no temperature |
|
|
348
|
+
| `openai` | `OPENAI_API_KEY` | Chat Completions, multi-turn tool calls. Reasoning models (`o1`/`o3`/`o4`/`gpt-5*`/`gpt-6*`) get `max_completion_tokens` and no temperature |
|
|
337
349
|
| `anthropic` | `ANTHROPIC_API_KEY`, **or** Claude on Vertex AI: `ANTHROPIC_VERTEX_PROJECT_ID` + `gcloud auth application-default login` (`CLOUD_ML_REGION` defaults to `global`) | Messages API, multi-turn tool calls. Newer Claude models accept only default sampling, so a scenario's `temperature` is not sent to them. Verified offline against the SDK's request shapes; not yet validated by a live run |
|
|
338
350
|
| `google` | `GEMINI_API_KEY` (AI Studio), **or** Vertex AI: `GOOGLE_GENAI_USE_VERTEXAI=true` + `GOOGLE_CLOUD_PROJECT` + application-default login | Multi-turn tool calls. On Vertex, `GOOGLE_CLOUD_LOCATION` defaults to `global`; in the project's testing `gemini-3.x` ids were not served on `us-central1`, so set it only if you need a specific region |
|
|
339
351
|
| `groq`, `openrouter`, `together`, `cerebras` | `GROQ_API_KEY`, `OPENROUTER_API_KEY`, `TOGETHER_API_KEY`, `CEREBRAS_API_KEY` | OpenAI-compatible endpoints. Groq has a free tier |
|
|
@@ -344,6 +356,17 @@ vendor (`gpt-*`, `claude-*` and `gemini-*` do; `openai/gpt-oss-120b` on Groq doe
|
|
|
344
356
|
model that is neither the one you run today nor the candidate. Remove `judge_model:` to compare
|
|
345
357
|
only tool calls, refusals and text checks, with no extra calls.
|
|
346
358
|
|
|
359
|
+
**Reasoning effort** (OpenAI reasoning models): set `reasoning_effort:` in `modelpin.yaml`, or
|
|
360
|
+
pass `--reasoning-effort` to `baseline` and `check` (both read it), to measure the effort you
|
|
361
|
+
will ship (`none`, `minimal`, `low`, `medium`, `high` or `xhigh`; which values a model accepts
|
|
362
|
+
is OpenAI's call). A scenario can set its own `reasoning_effort:`. It is sent only to reasoning
|
|
363
|
+
models. Unset, and unless a scenario sets its own, Modelpin sends nothing, with one exception:
|
|
364
|
+
`gpt-5.6` (Sol, Terra, Luna), `gpt-6-sol` and `gpt-6-luna` accept tools on Chat Completions only
|
|
365
|
+
with reasoning off, so a scenario that sends tools to them runs with `none`. `last-report.md`
|
|
366
|
+
(the pull-request comment) and `migration-report.md` state the effort each model was sent.
|
|
367
|
+
Testing tool use on those models at another effort needs OpenAI's Responses API, which
|
|
368
|
+
Modelpin does not support yet.
|
|
369
|
+
|
|
347
370
|
**Cross-vendor:** the baseline and the candidate can be on different providers — record the
|
|
348
371
|
baseline with one `--provider`, check with another (`modelpin check --provider google --to
|
|
349
372
|
gemini-3.1-flash-lite`). `check` reads the baseline from disk, so only the candidate's key is needed
|
|
@@ -380,6 +403,7 @@ current model, once.
|
|
|
380
403
|
|---|---|
|
|
381
404
|
| `modelpin init [dir]` | Write `modelpin.yaml` and a starter scenario, configured from the models your code calls. `--demo` writes the offline sandbox; `--agent-example` adds a tool-calling agent scenario. Never overwrites. |
|
|
382
405
|
| `modelpin scan [path]` | List the model ids a repository (or a single file) uses, and where. |
|
|
406
|
+
| `modelpin watch` | Which of the models in `modelpin.yaml` (its `models:` and `judge_model`; with `--scan`, the ids in your source; your recorded baselines are listed but never alarmed on) are retiring, when, the successor the vendor names, and the exact `check` command; every date carries its source page and fetch date. Exit `0` all clear, `1` a model is inside its notice window (a vendor deprecation, or a shutdown date within 90 days) or already retired, `3` a model is unknown to the registry (not a clearance; ids served by OpenAI-compatible hosts are unknown by design, since the registry reads the three labs' own pages), `4` nothing declared, or the config or registry could not be read. `--json` for scripts; `--registry <path>` to use a different `data/models.json` in place of the shipped one. Never touches the network. |
|
|
383
407
|
| `modelpin draft <file>` | Draft scenarios from one file of your app into `scenarios/.drafts/` for review (one model call). `--count`, `--model`, `--provider`. |
|
|
384
408
|
| `modelpin baseline` | Run every scenario N times on your current model and save the results. |
|
|
385
409
|
| `modelpin check --to <model>` | Replay on a candidate, compare with the baseline, print verdicts, write the report, exit `0`/`1`/`3`/`4`. |
|
|
@@ -455,9 +479,15 @@ borderline change rather than raise a false alarm. Know the trade-offs:
|
|
|
455
479
|
unmeasured.
|
|
456
480
|
- **It measures change, not quality.** It never says one model is better.
|
|
457
481
|
|
|
458
|
-
**What happened when it was run at scale, live:** 972 same-model checks across six
|
|
459
|
-
models raised **0** false alarms
|
|
460
|
-
|
|
482
|
+
**What happened when it was run at scale, live:** 972 same-model scenario-checks across six
|
|
483
|
+
Gemini models raised **0** false alarms. They are 82 scenarios re-used across models and
|
|
484
|
+
repeats, not 972 independent trials, and many of those scenarios answered so consistently at
|
|
485
|
+
these settings that no signal could have fired (a harness run on two of the same models put
|
|
486
|
+
that at 230 of 240 trials). So this says the tool did not cry wolf in ordinary use on this
|
|
487
|
+
suite; it is not a false-positive rate, and the bounds are in `docs/fp-measurement.md`.
|
|
488
|
+
Across six real Gemini upgrades it flagged 28
|
|
489
|
+
regressions, and a second language model asked to judge materiality rated every one a
|
|
490
|
+
material behavior change, which is an opinion, not ground truth —
|
|
461
491
|
[docs/live-validation.md](https://github.com/samarthputhraya/modelpin/blob/main/docs/live-validation.md),
|
|
462
492
|
with the bugs that campaign found in Modelpin itself.
|
|
463
493
|
|
|
@@ -42,8 +42,17 @@ OK 6 scenario(s) unchanged
|
|
|
42
42
|
Modelpin or any third party other than the model providers you configure (and, in CI, your own
|
|
43
43
|
pull request).
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
`modelpin watch` crosses the models your config names (and, with `--scan`, the ones in your
|
|
46
|
+
source) with a registry shipped inside each release, and tells you which of the ones **it knows**
|
|
47
|
+
are retiring, when, the successor the vendor names, and the exact check to run next. Every entry
|
|
48
|
+
in that registry carries the vendor page it was read from and the day it was read; a model the
|
|
49
|
+
registry has never heard of is reported as unknown, never as clear. The registry is transcribed
|
|
50
|
+
from OpenAI, Anthropic and Google's own deprecation and model pages, not from the catalogues
|
|
51
|
+
of OpenAI-compatible
|
|
52
|
+
hosts. **Nothing in Modelpin polls provider feeds**: the registry is refreshed when a release
|
|
53
|
+
ships, so it is only as current as the release you installed (`--registry <path>` points at a
|
|
54
|
+
newer file). Modelpin does not open pull requests on its own: you choose the candidate model,
|
|
55
|
+
and a scheduled workflow can re-check it on your clock.
|
|
47
56
|
|
|
48
57
|
CLI: `modelpin` (alias `mp`). License: Apache-2.0.
|
|
49
58
|
|
|
@@ -71,7 +80,7 @@ Python 3.11 or newer.
|
|
|
71
80
|
|
|
72
81
|
```bash
|
|
73
82
|
pip install "modelpin[providers]" # or: pipx install "modelpin[providers]"
|
|
74
|
-
modelpin version # -> modelpin 0.
|
|
83
|
+
modelpin version # -> modelpin 0.5.2
|
|
75
84
|
```
|
|
76
85
|
|
|
77
86
|
The `providers` extra installs the OpenAI, Anthropic and Google SDKs. Plain `pip install modelpin`
|
|
@@ -110,7 +119,10 @@ You will see one scenario per verdict:
|
|
|
110
119
|
|
|
111
120
|
The command exits **1** because regressions were found — that is what fails a CI build. The full
|
|
112
121
|
report is written to `.modelpin/last-report.md`, the same file the GitHub Action posts on a pull
|
|
113
|
-
request.
|
|
122
|
+
request. Beside it, `.modelpin/migration-report.md` tells the same result in plain English for
|
|
123
|
+
whoever decides on the switch: a one-paragraph verdict, each changed scenario with a before and
|
|
124
|
+
after example, what the check did not cover, and the run's date, models, runs and calls. Edit
|
|
125
|
+
`traces.json` and re-run to watch the verdicts move.
|
|
114
126
|
|
|
115
127
|
## Use it on your app
|
|
116
128
|
|
|
@@ -290,7 +302,7 @@ key, is not recognised.
|
|
|
290
302
|
|
|
291
303
|
| Provider (`providers:` / `--provider`) | Credentials | Notes |
|
|
292
304
|
|---|---|---|
|
|
293
|
-
| `openai` | `OPENAI_API_KEY` | Chat Completions, multi-turn tool calls. Reasoning models (`o1`/`o3`/`o4`/`gpt-5*`) get `max_completion_tokens` and no temperature |
|
|
305
|
+
| `openai` | `OPENAI_API_KEY` | Chat Completions, multi-turn tool calls. Reasoning models (`o1`/`o3`/`o4`/`gpt-5*`/`gpt-6*`) get `max_completion_tokens` and no temperature |
|
|
294
306
|
| `anthropic` | `ANTHROPIC_API_KEY`, **or** Claude on Vertex AI: `ANTHROPIC_VERTEX_PROJECT_ID` + `gcloud auth application-default login` (`CLOUD_ML_REGION` defaults to `global`) | Messages API, multi-turn tool calls. Newer Claude models accept only default sampling, so a scenario's `temperature` is not sent to them. Verified offline against the SDK's request shapes; not yet validated by a live run |
|
|
295
307
|
| `google` | `GEMINI_API_KEY` (AI Studio), **or** Vertex AI: `GOOGLE_GENAI_USE_VERTEXAI=true` + `GOOGLE_CLOUD_PROJECT` + application-default login | Multi-turn tool calls. On Vertex, `GOOGLE_CLOUD_LOCATION` defaults to `global`; in the project's testing `gemini-3.x` ids were not served on `us-central1`, so set it only if you need a specific region |
|
|
296
308
|
| `groq`, `openrouter`, `together`, `cerebras` | `GROQ_API_KEY`, `OPENROUTER_API_KEY`, `TOGETHER_API_KEY`, `CEREBRAS_API_KEY` | OpenAI-compatible endpoints. Groq has a free tier |
|
|
@@ -301,6 +313,17 @@ vendor (`gpt-*`, `claude-*` and `gemini-*` do; `openai/gpt-oss-120b` on Groq doe
|
|
|
301
313
|
model that is neither the one you run today nor the candidate. Remove `judge_model:` to compare
|
|
302
314
|
only tool calls, refusals and text checks, with no extra calls.
|
|
303
315
|
|
|
316
|
+
**Reasoning effort** (OpenAI reasoning models): set `reasoning_effort:` in `modelpin.yaml`, or
|
|
317
|
+
pass `--reasoning-effort` to `baseline` and `check` (both read it), to measure the effort you
|
|
318
|
+
will ship (`none`, `minimal`, `low`, `medium`, `high` or `xhigh`; which values a model accepts
|
|
319
|
+
is OpenAI's call). A scenario can set its own `reasoning_effort:`. It is sent only to reasoning
|
|
320
|
+
models. Unset, and unless a scenario sets its own, Modelpin sends nothing, with one exception:
|
|
321
|
+
`gpt-5.6` (Sol, Terra, Luna), `gpt-6-sol` and `gpt-6-luna` accept tools on Chat Completions only
|
|
322
|
+
with reasoning off, so a scenario that sends tools to them runs with `none`. `last-report.md`
|
|
323
|
+
(the pull-request comment) and `migration-report.md` state the effort each model was sent.
|
|
324
|
+
Testing tool use on those models at another effort needs OpenAI's Responses API, which
|
|
325
|
+
Modelpin does not support yet.
|
|
326
|
+
|
|
304
327
|
**Cross-vendor:** the baseline and the candidate can be on different providers — record the
|
|
305
328
|
baseline with one `--provider`, check with another (`modelpin check --provider google --to
|
|
306
329
|
gemini-3.1-flash-lite`). `check` reads the baseline from disk, so only the candidate's key is needed
|
|
@@ -337,6 +360,7 @@ current model, once.
|
|
|
337
360
|
|---|---|
|
|
338
361
|
| `modelpin init [dir]` | Write `modelpin.yaml` and a starter scenario, configured from the models your code calls. `--demo` writes the offline sandbox; `--agent-example` adds a tool-calling agent scenario. Never overwrites. |
|
|
339
362
|
| `modelpin scan [path]` | List the model ids a repository (or a single file) uses, and where. |
|
|
363
|
+
| `modelpin watch` | Which of the models in `modelpin.yaml` (its `models:` and `judge_model`; with `--scan`, the ids in your source; your recorded baselines are listed but never alarmed on) are retiring, when, the successor the vendor names, and the exact `check` command; every date carries its source page and fetch date. Exit `0` all clear, `1` a model is inside its notice window (a vendor deprecation, or a shutdown date within 90 days) or already retired, `3` a model is unknown to the registry (not a clearance; ids served by OpenAI-compatible hosts are unknown by design, since the registry reads the three labs' own pages), `4` nothing declared, or the config or registry could not be read. `--json` for scripts; `--registry <path>` to use a different `data/models.json` in place of the shipped one. Never touches the network. |
|
|
340
364
|
| `modelpin draft <file>` | Draft scenarios from one file of your app into `scenarios/.drafts/` for review (one model call). `--count`, `--model`, `--provider`. |
|
|
341
365
|
| `modelpin baseline` | Run every scenario N times on your current model and save the results. |
|
|
342
366
|
| `modelpin check --to <model>` | Replay on a candidate, compare with the baseline, print verdicts, write the report, exit `0`/`1`/`3`/`4`. |
|
|
@@ -412,9 +436,15 @@ borderline change rather than raise a false alarm. Know the trade-offs:
|
|
|
412
436
|
unmeasured.
|
|
413
437
|
- **It measures change, not quality.** It never says one model is better.
|
|
414
438
|
|
|
415
|
-
**What happened when it was run at scale, live:** 972 same-model checks across six
|
|
416
|
-
models raised **0** false alarms
|
|
417
|
-
|
|
439
|
+
**What happened when it was run at scale, live:** 972 same-model scenario-checks across six
|
|
440
|
+
Gemini models raised **0** false alarms. They are 82 scenarios re-used across models and
|
|
441
|
+
repeats, not 972 independent trials, and many of those scenarios answered so consistently at
|
|
442
|
+
these settings that no signal could have fired (a harness run on two of the same models put
|
|
443
|
+
that at 230 of 240 trials). So this says the tool did not cry wolf in ordinary use on this
|
|
444
|
+
suite; it is not a false-positive rate, and the bounds are in `docs/fp-measurement.md`.
|
|
445
|
+
Across six real Gemini upgrades it flagged 28
|
|
446
|
+
regressions, and a second language model asked to judge materiality rated every one a
|
|
447
|
+
material behavior change, which is an opinion, not ground truth —
|
|
418
448
|
[docs/live-validation.md](https://github.com/samarthputhraya/modelpin/blob/main/docs/live-validation.md),
|
|
419
449
|
with the bugs that campaign found in Modelpin itself.
|
|
420
450
|
|