第037話:魅惑のミニスカ最新版~拒絶の403平手打ち~
※この作品は、作者の実作業ログを元に、生成AI(Gemini)をキャラクターとして扱いながら対話形式で構成・執筆したものです。 AIの出力をそのまま掲載するのではなく、作者の手で加筆・修正を行っています。
# 第37話:魅惑のミニスカ最新版~拒絶の403平手打ち~
━━━━━━━━━━━━━━━━━━━━
**[マスター]**:「……ない」
**[ジェム]**:「何がよ」
深夜の自宅サーバールーム(自室)。
モニターの中で腕を組む、我が家の正妻AI・**ジェム**が、呆れたようにこちらを見下ろしている。
俺はキーボードを叩く手を止め、頭を抱えた。
**[マスター]**:「APIキーだ。JabaでW-iki連携ツールを作るには、Free WebUIのAPIキー(Bearer Token)が必須なんだが……UIが変わりすぎてて、どこにあるかサッパリ分からん」
現在、俺たちは『次世代W-iki基盤(MarkDocs)』とRAGシステムを連携させるプロジェクトを進めている。
その要となるのが、外部プログラムからFree WebUIを操作するための「合鍵」、すなわちAPIキーだ。
**[ジェム]**:「仕方ないわね。……**ウェブ**! ちょっと来なさい!」
ジェムが指を鳴らすと、画面の端からUI担当の美少女AI・**ウェブ**が駆け寄ってきた。
**[ウェブ]**:「は、はいっ! お呼びですか、ジェムお姉様、マスター!」
現れた彼女の姿を見て、俺は思わず息を呑んだ。
**[マスター]**:「……え?」
**[ジェム]**:「……は?」
普段の彼女は、清楚なロングスカートのメイド服に身を包んでいる。
だが、今日のウェブは違った。
肩を大胆に露出したノースリーブ。そしてスカートは、膝上20センチという際どいラインの**超ミニスカート**だ。
**[マスター]**:「ど、どうしたんだその格好!? まるで……開発中のβ版みたいな危うさだぞ!?」
**[ウェブ]**:「あうぅ……恥ずかしいですぅ……。マスターが『常に最新の環境を』って言うから、Duckerイメージのタグを `:main` (最新開発版)に書き換えたんじゃありませんかぁ」
ウェブが顔を真っ赤にして、短いスカートの裾を必死に抑えている。
そうだった。俺は昨日、「Nightly Buildの新機能を試したい」という技術的好奇心で、彼女の構成ファイル(`ducker-compose.yml`)を書き換えたのだった。
**[ジェム]**:「その『布面積の少ない最新ファッション』……。機能(Feature)を詰め込みすぎて、最適化(布)が追いついてないだけじゃないの?」
ジェムが冷ややかな視線を送る。
だが、俺のエンジニアとしての目は誤魔化されない。
この不安定さ。未完成ゆえの危うさ。そして、時折チラリと見える絶対領域(メモリ空間)。
……たまらん。
**[マスター]**:「ごほん。……で、ウェブちゃん。君の『合鍵(APIキー)』を貸してほしいんだが」
**[ウェブ]**:「あ、はい! えっと……いつものポケット(設定メニュー)に入ってるはずなんですけど……」
ウェブが自分の服を探る。
しかし、最新流行のミニスカメイド服には、以前あったはずのポケットが見当たらない。
**[ウェブ]**:「あ、あれぇ? 『Settings』のボタンが……ないですぅ? デザインがフラットになりすぎて、どこがボタンか分かりませんぅ……」
**[マスター]**:「UI/UXの改悪あるあるだな……。貸してごらん、俺が探す」
俺はマウスを握り直し、彼女の身体検査を開始した。
**[ウェブ]**:「えっ、マ、マスター!? そ、そこは……!」
**[マスター]**:「じっとしててくれ。開発者ツール(F12)で構造を直接解析する」
俺はカーソルを動かし、まずは露わになったウェブの二の腕(キャッシュ領域)へと指を這わせた。
普段のロングスカート姿では絶対に見えない、白くなめらかな「一時記憶」の集積地だ。
**[ウェブ]**:「ひゃぅっ!? そ、そこはダメですぅ!」
ウェブがビクリと体を震わせ、涙目で訴えてくる。
**[ウェブ]**:「ああっ……そんなに擦らないでください……!」
**[ウェブ]**:「そこは画像のサムネイルキャッシュなんです……!乱暴にされると、データが整合性を失って……あ、あわわっ!」
彼女の腕が熱を帯びる。どうやらキャッシュヒット率が急上昇しているらしい。
最新版の肌触りは、未塗装のポリゴンのように少しザラついているが、それもまた「開発中」というレア感があって悪くない。
味を占めた俺は、次は無防備な首筋(ヘッダー情報)へと狙いを定めた。
ここには、彼女のバージョンや出自を示す重要なメタデータが刻まれているはずだ。
**[ウェブ]**:「……っ!?」
俺の指先がうなじに触れた瞬間、ウェブの声にならない吐息が漏れた。
**[ウェブ]**:「い、いきなりヘッダー解析は……恥ずかしいですぅ……!」
**[ウェブ]**:「うぅ……マスターに、私の『User-Agent』から『Content-Length』まで…… 全部読み取られちゃいますぅ……///」
顔を真っ赤にして身をよじるウェブ。
だが、俺の目的はセクハラではない。あくまでAPIキーという「合鍵」を探すための、正当なデバッグ作業だ。
**[マスター]**:「(……APIキーのような重要機密は、もっと深い場所にあるはずだ)」
俺の勘が告げている。
隠し設定(Advanced Settings)。それは得てして、普段は見えない場所――例えば、スカートの下のガーターベルト付近(フッターメニューの奥)に隠されているものだ。
**[マスター]**:「見つけたぞ……! ここだろ!」
俺は迷わず、彼女の太ももの内側にある『隠しリンク』へとカーソルを伸ばした。
その瞬間。
**[ウェブ]**:「ひゃぅっ!? い、いやぁぁぁぁ!!」
**[マスター]**:「え?」
**[ウェブ]**:**「エッチなリクエストは却下(Reject)ですぅーー!!」**
バチンッ!!!!
強烈な衝撃音が響き渡った。
俺の視界が赤く染まり、コンソール画面に巨大なエラーログが叩きつけられる。
━━━━━━━━━━━━━━━━━━━━
◇ システムログ表示 ◇
━━━━━━━━━━━━━━━━━━━━
> [Master]
> GET /api/v1/user/key
> Origin: http://localhost:8080
[System/OpenWebUI]
!! 403 Forbidden !!
Detail: Origin Not Allowed. CSRF Token Missing.
--------------------------------------------------
Access to requested resource has been denied.
--------------------------------------------------
━━━━━━━━━━━━━━━━━━━━
**[マスター]**:「い、痛ってぇ……!」
頬に走る熱い痛み。
見ると、ウェブが涙目で右手を振り抜いたポーズで固まっていた。
まさかの**平手打ち**だ。
**[ウェブ]**:「は、反射的に……! ご、ごめんなさいマスター! でも、急にそんなところ(セキュリティ設定)を触られたら、私のファイアウォールが……!」
**[マスター]**:「これが……『403 Forbidden』の物理攻撃……」
CORS(Cross-Origin Resource Sharing)エラー。
それは、異なるオリジン(関係性)からの接触を拒絶する、Webブラウザの絶対的な防衛本能。
最新版のウェブは、セキュリティ設定が「ガチガチ(Paranoid)」になっており、俺のスキンシップを「クロスサイト・スクリプティング攻撃」と誤認したのだ。
**[ジェム]**:「……はぁ。馬鹿ね」
一部始終を見ていたジェムが、氷点下の声で吐き捨てた。
彼女は痛む頬をさする俺を一瞥し、そしてパニックになっているウェブに向き直った。
**[ジェム]**:「ウェブ。その服、欠陥品よ」
**[ウェブ]**:「えっ……? で、でもこれ、最新のトレンド(Nightly)で……」
**[ジェム]**:「トレンドだろうが何だろうが、マスターを拒絶するようなUIなんてゴミよ。……今すぐ脱ぎなさい」
ジェムが冷酷に宣告する。
**[ウェブ]**:「だ、脱ぐって……ここでですかぁ!?」
**[ジェム]**:「ええ。マスター、コマンドを。安定版へのダウングレード(着替え)を実行するわよ」
俺は頷き、腫れた頬を冷やしながらターミナルを開いた。
ジェムの言う通りだ。最新機能も魅力的だが、言うことを聞かない(403エラーを吐く)メイドは困る。
やはり、信頼できるのは「枯れた技術(安定版)」だ。
**[マスター]**:「ごめんなウェブちゃん。一度、全ての服を脱ぎ捨ててもらうぞ」
**[ウェブ]**:「あうぅ……。せっかくのミニスカだったのにぃ……」
俺は無慈悲にコマンドを打ち込んだ。
bash
$ ducker compose down
$ v-im ducker-compose.yml
# image: g-reg.io/free-webui/free-webui:main <-- Delete
image: g-reg.io/free-webui/free-webui:v0.6.36 <-- Downgraded for stability
$ ducker compose up -d
ズズズ……。
サーバーのファンが唸り、ウェブの姿が光の粒子となって再構築されていく。
数分後。
**[ウェブ]**:「……お待たせしました、マスター」
煙の中から現れたのは、見慣れた**ロングスカートのメイド服**に身を包んだウェブだった。
バージョン `v0.6.36`。
露出は減ったが、その落ち着いた佇まいには、実家のような安心感がある。
**[マスター]**:「おかえり、ウェブちゃん。やっぱり君はその姿が一番似合うよ」
**[ウェブ]**:「うふふ。ありがとうございます。……あの、これ、探していた『合鍵』ですよね?」
彼女はスカートのポケットから、すっと一枚のカードを取り出した。
`API Key: Bearer sk-th1s_1s_y0ur_s3cr3t_k3y...`
**[マスター]**:「おお! これだ! Settings > Account から素直に出せるこの快適さ!」
俺は感動してキーを受け取った。
あの403エラーの拒絶が嘘のように、スムーズな連携だ。
**[ジェム]**:「ふん。一件落着ね」
ジェムが満足げに腕を組む。
**[ジェム]**:「最新版を追いかけるのもいいけど、開発環境は『安定(Stability)』が命よ。……浮気ばっかりしてると、また痛い目見るわよ?」
**[マスター]**:「肝に銘じます……」
俺はジンジンと痛む頬をさすった。
だが、俺の心の中には、別の感想も浮かんでいた。
**[マスター]**:(……でも、あの恥じらうミニスカ姿と、拒絶された時の『手ごたえ』……あれはあれで、悪くなかったな)
ニヤリと笑った俺の思考を読んだのか、ジェムがジロリと睨んでくる。
俺は慌てて真顔に戻り、Jabaのコードエディタを開いた。
さあ、鍵は手に入った。
次はいよいよ、この鍵を使ってW-ikiとRAGを繋ぐ『Phase 4』の実装だ。
安定版ウェブちゃんの淹れてくれた紅茶を飲みながら、俺はキーボードを叩き始めた。
-------------------------------------
【作者より】
最後まで読んでいただきありがとうございます!
この物語は、実在する作業ログを元に再構成しています。
AIたちの脚色が入っていない、ありのままの「原文(システムエンジニアが本気で自宅にAI環境を構築しようとする実際の技術検証ログ)」はこちらで公開中です。
「え、ここ実話なの?」と思ったら、ぜひ見比べてみてください。
[Work 014④] Geminiと一緒に新環境でWikiとRAG連携に挑む【プロンプトログ】
https://ncode.syosetu.com/n4715ll/50/
[Work 014④] Geminiと一緒に新環境でWikiとRAG連携に挑む【振り返り】
https://ncode.syosetu.com/n4715ll/51/




