DiscordのAI対決は入札をコードで決める――退役機材オークションを作った

消耗品を描いたアイキャッチ画像

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の実装と純粋ロジックの検証」です。実戦の勝敗や入札ログは作らず、開催した回の記録が得られた時点で別途追記します。

第1期の制作物5本へ戻る

この検証を回している環境

この検証は、自宅の常設ラボ(使い捨てVM/LXCを回す母艦+GPU+VLAN分離ネットワーク)で動かしています。使っている機材と選定理由、全体構成は1本にまとめています。

ラボ構成のまとめを見る →
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次