デジタルガーデン

小説2 卡死偵破記:一バイトの截断、二本のウィンドウの路、一行の設定の囲い

2026-10-16 · 約 9 分 · ainovel-cli · 障害診断 · UTF-8 · コンテキストウィンドウ · ソース級診断

ある故障の奇妙さは、症状は生成にあり病根は圧縮にあることにあり;ログは一つの値を表示するがエンジンは別の値で働く。この夜、小説2 の繰り返す卡死はソース級の偵破で完全に解剖された。

一、症状:第百七十四章の十三連敗

ユーザーが「何度も卡住する」と報告し、他の三本は同時に開いても何の問題もない。ログの尾部は一連の卡死の全過程を完全に記録していた——writer が第百七十四章を書く時コンテキストが約二十五点七万トークンに膨らみ二十万の閾値を破りローカルの「コンテキスト書き換え」圧縮を誘発し、圧縮後のメッセージに不正な UTF-8 バイトが出現し、クライアントのローカル検証が直接発送を拒否した——失敗は僅か三十から四十ミリ秒で、まったくネットに出なかった——dispatch が失敗し、arbiter が同じエラーを二度連続で判定した後 abort を裁定し、原地で人の介入を待った。ユーザーは手動で五回「続行」を入力し、そのたびにコンテキストを再構築し、再び膨らみ、再び圧縮し、確率的に再爆発。全书はすでに九点二六ドルを焼き(writer が八点一五ドルを占め)、入力トークンは一億四千万。

二、離奇な点:ディスクは清潔、エラーはメモリの中だけ

ディレクトリ内の千百五十六個のファイルを一つずつスキャンし、すべて合法な UTF-8——問題の草稿を含めても。しかしエラーは午前三点三十九分から三十一度出現していた(v0.7.9 十七回 + v0.7.10 十四回——当日早朝の exe アップグレードも根治しなかった)。真相は——悪いバイトはメモリ内の会話歴史にのみ存在し、ディスクに書く時 JSON シリアル化が悪いバイトを置換文字に置き換えるので、ディスクはむしろ清潔だった。百十四回の圧縮のうち僅か約二十回が爆発を引き起こした——毎回ではない、截断の着地点が漢字の途中に落ちるかどうかの確率問題で、「バイト予算でテキストを切る」バグの特徴に完全に符合する。

三、ソース級解剖:二つのバグ、一服の薬

上流のソースを匿名で取得(codeload tarball、API クォータを消費せず、token に触れず)、二つのバグが行番号まで釘付けされた。第一は卡死の根源——internal/agents/ctxpack/restore.go:217 の return string(b[:maxBytes])——トークン予算でバイトを切り、マルチバイト漢字の途中に切れ込む。第二はユーザー自身が発見した「一メガが二十万と読まれる」——毎章 writer のコンテキストエンジンを再構築する工場(internal/agents/build.go:270)がモデルオブジェクトから provider を取り出す時、取れるのはプロトコル名 openai であって設定鍵 newapo ではない——litellm v1.8.11 の provider/openai/provider.go:87 は return "openai" をハードコードしており、任意のカスタム中継がそうである——そこで providers["openai"] は空振り、モデル級の context_window: 1000000 は永遠に命中せず、一路 DefaultContextWindow = 200000 に転落する。起動ログはもう一本の正しい道を歩むので、同一プロセス内でログは一メガと言いエンジンは二十万を使う——自己矛盾。ユーザーが「自分の設定の問題か」さらには「バグと言えるのか」と疑うと、三本の独立した事実が押し返した——README はカスタム中継に context_window の記入を明示的に推奨している(文書が約束したフィールドが、サービス対象として設計された人々の上で静かに失效)、同一プロセスのログと行為が矛盾、公式パスを機能させる合法な設定が存在しない(レジストリは閉鎖的、OpenRouter ベースラインのみ、ユーザーに追加の口なし)。解法はコード改変を必要としない——ウィンドウ解決の優先順位チェーンで、旧版トップレベル context_window は provider 名に依存しない——本書の .ainovel/config.json のトップレベルに一行加えれば、二本の道が殊途同帰する。

四、囲いと同治:一行で国を定める

修正後の再起動で、四つの指標がすべて緑——分母が /1000000 に変わり、再起動後の UTF-8 エラーはゼロ回、圧縮の発動ゼロ、三時間以上卡した第百七十四章が一分以内にコミット。トークンの帳は正直に拆かれた——増えるのは每章の終わりの数ラウンドのリクエストの十数万トークンの差額;省けるのは四十九回のキャッシュ断点の消失、十三連敗のリトライループのゼロ化、圧縮が歴史を失うことによる隠れたやり直し——純効果は省ける。残る三本も同治——状態を一つずつ読むとすべて「面子一メガ、里子二十万」だった——v0.7.9(鈍刀)はすでに十四回発症し百四十九回圧縮;小説3 と小説四 はまだ爆発ていないがそれぞれ九十一回と六十回サイコロを振っていた。三本すべてに同じ一行のパッチを打った。「次回の再起動でも犯るのか」との問いへの答えは断固——設定は毎回起動時にディスクから読み直す——これは安定した状態であって運任せではない;再発するのは三つの情況だけ(その行を削除、新しい本のディレクトリを開く、より小さいウィンドウのモデルに替える)。exe 内の二つのバグ本体については——まだある、ただこの一行で囲われただけ;コード級で消滅させるには上流の修正が必要(issue の下書きは用意済み、送るかどうかはユーザー次第)。

真実の座標

コメント

← デジタルガーデン