0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude のモデル提供終了、猶予は告知から約60日 ― 過去9回を数えて、手元を検査するスクリプトを書いた

0
Last updated at Posted at 2026-09-01

公式のモデル提供終了ページを見ていて、読み間違えかけました。

claude-sonnet-4-5-20250929    Not sooner than September 29, 2026

「9月29日に消える」と読みました。違いました。

この記事は、その読み間違いを直すところから始めて、過去9回の提供終了が実際に何日の猶予だったかを数え自分の環境に日付つきIDが何か所埋まっているかを検査するまでを書きます。数字はすべて一次情報から数えたものです。推測は書きません。

(すべて 2026年9月1日時点の記載に基づきます。日付や状態はあとから変わります。必ず一次情報を確認してください。

まず、読み方を間違えていた

一次情報は Anthropic のモデル提供終了ページです。そこにある表から、Claude 4.5 系の3行を引きます。

API model name                Current state   Deprecated   Tentative retirement date
claude-sonnet-4-5-20250929    Active          N/A          Not sooner than September 29, 2026
claude-haiku-4-5-20251001     Active          N/A          Not sooner than October 15, 2026
claude-opus-4-5-20251101      Active          N/A          Not sooner than November 24, 2026

見るべき列は3つあります。

Current state  = Active    まだ現役。非推奨にすらなっていない
Deprecated     = N/A       **廃止の告知が、まだ出ていない**
Tentative      = Not sooner than …   「これより早くはならない」最短日

Tentative retirement date は確定日ではありません。「暫定」であり、しかも "Not sooner than"、つまり下限です。9月29日に消えるという意味ではありません。

そして DeprecatedN/A である以上、**告知はまだ出ていません。**このページの定義では、Deprecated になってはじめて「非推奨」であり、そこで退役日が割り当てられます。

**私は最短日を確定日と読み、告知を見落としていたと思い込みました。**そうではなく、告知はまだ来ていない、が正しい読みです。

では、告知が来たら何日あるのか ― 過去9回を数えた

ここが本題です。公式の記述はこうです。

一般提供されたモデルについては、退役の少なくとも60日前に通知する

「少なくとも60日」が実際にどう運用されてきたかは、同じページの提供終了履歴に全部載っています。告知日と退役日を引き算しました。

告知日        退役日        日数   対象
2024-09-04   2024-11-06     63   Claude 1 / Instant
2025-01-21   2025-07-21    181   Claude 2 / 2.1 / Sonnet 3
2025-06-30   2026-01-05    189   Opus 3
2025-08-13   2025-10-28     76   Sonnet 3.5
2025-10-28   2026-02-19    114   Sonnet 3.7
2025-12-19   2026-02-19     62   Haiku 3.5
2026-02-19   2026-04-20     60   Haiku 3
2026-04-14   2026-06-15     62   Sonnet 4 / Opus 4
2026-06-05   2026-08-05     61   Opus 4.1

直近4回は 62 / 60 / 62 / 61 日です。

全9回     最短 60日   最長 189日
直近5回   114, 62, 60, 62, 61   中央値 62日

かつては181日や189日の猶予がありました。いまは公式が約束する下限(60日)に張り付いています。

これは非難ではありません。運用の前提が変わったという事実です。

昔の感覚   告知が来てから半年かけて移せた
いまの実績 **告知から2か月。テストと再検証を含めて2か月**

数える前、私は「まだ先の話」と思っていました。数えたら、告知が来てから動くのでは遅い運用が自分にありました。

何が止まるのか ― 日付つきIDだけ

止まるのは日付つきのモデルIDを文字列で固定している箇所です。

止まる    claude-sonnet-4-5-20250929   ← 日付つき。そのバージョンが退役したら失敗する
止まらない claude-sonnet-4-6            ← エイリアス。指す先が更新される

厄介なのは、この文字列は一度書くと、動いている限り二度と読み返されないことです。動いているコードは開かれません。期日が来るまで誰も気づきません。

しかも埋まる場所が散らばります。

SDK 呼び出しの model= 引数
エージェント定義ファイル
CI / GitHub Actions の環境変数
設定 YAML・JSON
ドキュメントに書いたサンプル(コピーされて広がる)

だから、告知が来る前に数えた

告知が来てから探すと、探す場所が分からない状態から始まります。先に数えておけば、告知の日は「置換するだけ」になります。

検査するスクリプトを書きました。外部通信をしません。ファイルを読んで数えるだけです。

# -*- coding: utf-8 -*-
"""日付つきモデルIDが、手元に何か所埋まっているかを数える。

    python scan_model_ids.py <対象ディレクトリ> [...]

**中身は出さない。数と、拡張子と、行番号だけ。**
"""
from __future__ import annotations
import io, os, re, sys, collections

try:
    sys.stdout.reconfigure(encoding='utf-8', errors='replace')
except Exception:
    pass

# claude-<なにか>-YYYYMMDD 形式。これが「止まる書き方」
DATED = re.compile(r'claude-[a-z0-9.\-]*?-(20\d{6})\b')

SKIP_DIRS = {'.git', 'node_modules', '__pycache__', 'venv', '.venv', 'dist', 'build'}
TEXT_EXT = {'.py', '.js', '.ts', '.tsx', '.json', '.yaml', '.yml', '.toml', '.md',
            '.sh', '.bat', '.ps1', '.txt', '.env', '.cfg', '.ini'}


def scan(roots):
    dated = collections.Counter()
    hits = []
    files = 0
    for root in roots:
        for dirpath, dirnames, filenames in os.walk(root):
            dirnames[:] = [d for d in dirnames if d not in SKIP_DIRS]
            for fn in filenames:
                ext = os.path.splitext(fn)[1].lower()
                if ext not in TEXT_EXT:
                    continue
                p = os.path.join(dirpath, fn)
                try:
                    if os.path.getsize(p) > 2_000_000:
                        continue
                    text = io.open(p, encoding='utf-8', errors='ignore').read()
                except OSError:
                    continue
                files += 1
                for i, line in enumerate(text.splitlines(), 1):
                    for m in DATED.finditer(line):
                        dated[m.group(0)] += 1
                        hits.append((p, i, m.group(0), ext))
    return files, dated, hits


def main():
    roots = sys.argv[1:] or ['.']
    files, dated, hits = scan(roots)
    print(f'走査したテキストファイル {files:,}')
    print(f'\n日付つきモデルID  出現 {sum(dated.values())} 回 / 種類 {len(dated)}')
    for k, v in dated.most_common():
        print(f'   {k:34s} {v:4d}')
    if hits:
        ext = collections.Counter(h[3] for h in hits)
        print('\n埋まっていたファイル種別')
        for k, v in ext.most_common():
            print(f'   {k:10s} {v:4d}箇所')
    else:
        print('\n日付つきIDは見つからなかった。')


if __name__ == '__main__':
    main()

使い方はこれだけです。

python scan_model_ids.py ~/your-repo ~/another-repo ~/.claude

自分の環境を検査した結果 ― 0件でした

正直に書きます。私の環境では、コードに日付つきIDは1件もありませんでした。

走査したテキストファイル 1,048 件
日付つきモデルID  出現 10 回 / 種類 3
   claude-sonnet-4-5-20250929   4回
   claude-haiku-4-5-20251001    3回
   claude-opus-4-5-20251101     3回

埋まっていたファイル種別
   .md          10箇所

**10回すべて .md です。**中身を確認したら、**この記事を書くために作った自分のメモでした。**実行される場所には1件もありませんでした。

拍子抜けですが、これが検査の正しい結果です。**そして「0件だと分かっている」ことと「調べていない」ことは、まったく別の状態です。**告知が来た日に、私はもう探さなくて済みます。

なお、この記事の10件は「拡張子ごとの内訳」を出したから正体が分かりました。**種別の内訳を出さない検査だと、.md の10件を「10か所直す必要がある」と読み違えます。**数を出す検査は、必ず内訳も出してください。

APIを実際に叩いている人は、Console でも監査できる

コードを読む検査は「書いてある場所」しか見つけません。実際に何を呼んだかは、Console の Usage ページから CSV を書き出せば、APIキーとモデルごとの内訳が取れます。公式が案内している手順です。

コードを読む   書いてあるが動いていないものも見つかる
実績を見る     動いているが書いた覚えのないものが見つかる

**両方やらないと片側が抜けます。**私はコード側しかやっていません。ここは実測していないので、そう書いておきます。

「全部エイリアスにしろ」ではない

ここまで読むと「日付つきIDをやめてエイリアスにすればいい」と読めますが、そう単純ではありません。

日付つきIDが正しい場面があります。

エイリアスが向く   動き続けることが最優先。多少挙動が変わってもよい
                   運用の自動化、社内ツール、実験の足回り
日付つきが向く     **結果を再現できることが最優先**
                   評価・ベンチマーク、論文や記事に載せた数字、
                   回帰テストの基準値

エイリアスは指す先が黙って変わります。**「先週と同じプロンプトで結果が違う」の原因になり得ます。**再現性を担保したい場所で日付つきIDを使うのは、正しい設計です。

**問題は「どちらを選んだか意識せずに書いた日付つきID」です。**私が数えようとしたのはそれで、区別は検査では付きません。付けられるのは、書いた本人だけです。

だから検査の出力は「直すべき箇所」ではなく「確認すべき箇所」として読んでください。

移行先の暫定退役日も、同じ表に載っている

移す先にも同じ列があります。2026年9月1日時点の Active なモデルを、暫定退役日の近い順に並べます。

claude-sonnet-4-5-20250929   Not sooner than 2026-09-29    28日後
claude-haiku-4-5-20251001    Not sooner than 2026-10-15    44日後
claude-opus-4-5-20251101     Not sooner than 2026-11-24    84日後
claude-opus-4-6              Not sooner than 2027-02-05
claude-sonnet-4-6            Not sooner than 2027-02-17
claude-opus-4-7              Not sooner than 2027-04-16
claude-opus-4-8              Not sooner than 2027-05-28
claude-fable-5               Not sooner than 2027-06-09
claude-sonnet-5              Not sooner than 2027-06-30
claude-opus-5                Not sooner than 2027-07-24

**移行先を選ぶときは、その移行先の暫定日も見てください。**近いものへ移すと、同じ作業をすぐもう一度やることになります。

まとめ

1  "Not sooner than 9月29日" は「9月29日に消える」ではない
   Deprecated が N/A のうちは、**告知すら出ていない**
2  告知から退役まで、直近4回は **62 / 60 / 62 / 61 日**
   かつては181日・189日もあった。**いまは公式の下限に張り付いている**
3  止まるのは日付つきID。エイリアスなら止まらない
4  告知が来てから探すと、探す場所が分からないところから始まる
   **先に数える。**数えるのは数分で終わる
5  数える検査は、必ず**内訳**も出す。出さないと自分のメモを事故と読む

この記事でいちばん役に立つのは、たぶん 2 です。「まだ先の話」という感覚と、実績の60日には、ずれがあります。


数字はすべて 2026年9月1日時点の一次情報から数えました。**日付と状態は変わります。**移行の判断をする前に、必ず公式のページで現在の状態を確認してください。


この連載

AIエージェントを実際に回して、かかった費用と壊れた箇所を測って書いています。推測は書きません。実測値だけです。

  1. Claude Code のトークン使用量を実測したら1ターン23万 ― 節約に効いたのは「セッションを切る」だった
    https://qiita.com/manabu49-ai/items/2598a30d5140e4445ab6
  2. 57分間、死んだジョブを誰も見ていなかった ― AIエージェントの見張りを機械に渡す
    https://qiita.com/manabu49-ai/items/5c7506c94b5be58c040e
  3. AIに100通り試させたら、効果ゼロなのに5個が「有意」だった
    https://qiita.com/manabu49-ai/items/397a018948e1ab7ef29e
  4. 仕様書は2日前から手元にあった ― 読まずに実装した対処が、データを永久に失う設計だった
    https://qiita.com/manabu49-ai/items/9b947604d3dc4958fa36
  5. 次 ― AI初心者が3日でエージェントを24時間回すまで(未公開)

番外 ― 本記事 ― Claude のモデル提供終了、猶予は告知から約60日 ― 過去9回を数えて、手元を検査するスクリプトを書いた

**無料記事は結論まで全部書きます。**出し惜しみはしません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?