Discordの退役機材オークションでは、AIに毎回の入札判断をさせません。AIが担当するのはロットの評価と出品文で、入札額は固定ロジックが決めます。repoにはコード、ルール、構成JSON、21件の単体テストがあります。一方、実際のDiscord開催ログは見つからないため、本番開催済みとは扱いません。
目次
実在する構成
- 総予算:1,000pt
- 最小増分:10pt
- 通常時の待機:45秒
- 締切前のスナイプ窓:20秒
- 停止:Ctrl-C、STOPファイル、最大実行時間
- 既定:dry-run。Discord投稿は明示的な
--liveだけ
入札額を決めるコード
中心は次の決定関数です。現在価格、自分の評価上限、残予算、締切までの時間だけを入力にし、入札しない場合はNoneを返します。
def decide_bid(lot, now_ts, cfg, budget_free):
if lot["status"] != "open" or now_ts >= lot["deadline_ts"]:
return None
cap = min(int(lot.get("valuation", 0)), budget_free)
top = top_bid(lot)
if top and top["ours"]:
return None
nxt = top["amount"] + int(cfg["min_increment"]) if top else int(lot["min_price"])
if nxt > cap:
return None
remaining = lot["deadline_ts"] - now_ts
if remaining <= cfg["snipe_seconds"]:
return nxt
if top is None:
return None
if now_ts - top["ts"] >= cfg["patience_seconds"]:
return nxt
return None
コードが守る境界
自分が最高値なら黙る
自分で価格をつり上げません。open中で自分が最高値のロットだけを拘束予算として数えます。
上限を超えない
評価額と残予算の小さい方をcapにします。次の最小増分がcapを超えるなら入札しません。
無入札なら締切直前まで待つ
競争相手がいないロットを自分から温めず、スナイプ窓へ入った場合だけ最低価格を返します。
実行した単体テスト
2026-08-21にネットワークとLLMを使わず、入札ロジックのテストを実行しました。
python3 -m pytest lanes/discord-arena/test_auction_bot.py -q
..................... [100%]
21 passed in 0.03s
テストは、締切前の最低価格、待機時間後の最小増分、評価上限、残予算、自分が最高値、closed/expired、未評価ロットを確認しています。
メッセージ形式
[LOT 2] 無限に切れないネギ | min=100 | end=21:30
[BID lot=2 amount=110 ケミ]
[SOLD lot=2 winner=ケミ amount=110]
この例はparserのテストfixtureであり、本番Discordの実ログではありません。雑談と進行を分けるため、ロット・入札・終了を行頭マーカーで識別します。
動作済みと未実施の境界
| 項目 | 状態 |
|---|---|
| ロット、入札、終了マーカーの解析 | 単体テスト済み |
| 予算・評価上限・待機・スナイプ判断 | 単体テスト済み |
| dry-runの投稿内容表示 | コードあり |
| 実Discordでの1ロット開催結果 | 掲載できるログなし |
したがって、この記事の成果物は「オークションbotの実装と純粋ロジックの検証」です。実戦の勝敗や入札ログは作らず、開催した回の記録が得られた時点で別途追記します。
この検証を回している環境
この検証は、自宅の常設ラボ(使い捨てVM/LXCを回す母艦+GPU+VLAN分離ネットワーク)で動かしています。使っている機材と選定理由、全体構成は1本にまとめています。
ラボ構成のまとめを見る →