LLM 夏稀 bot

概要

OpenAI API で GPT-4.1 とかにアクセスし、おしゃべりができます。 osa_k 氏の ておくれロボ に強くインスパイアされています。

基本的な仕様

アカウントに向かってメンションを飛ばすとそれに対して応答します。 連続チャットに対応しているほか、この bot が参加していないツリーの中でメンションを飛ばすと過去の会話を Mastodon API から取得して API へのリクエストに含めます。 さらに、bot 以外のユーザーが画像を添付した場合はそのプレビュー画像の URL も API へのリクエストに含まれます。

bot からの返信は、基本的に CW と visibility を維持します。ただし、CW のない状態で LLM によって性的な内容だと判断された場合は CW が「そぎぎ」に設定されます。 また、LTL に載るのを防ぐため public 投稿に対しても unlisted 投稿で返信するようになっています。

tool calling による機能

OpenAI API によって提供される機能にくわえ、 tool calling によって以下の機能が実装されています。 それぞれに書かれている JSON は実際に API と受け渡ししているパラメーターとレスポンスです。

llm-natsuki-bot 自体の情報 (self_info)

ビルド時のパラメーターを取得できます。とはいってもバージョンとか Git のコミットハッシュぐらいしかないけどね。

{
  "bot_binary_built_at": "2025-04-11T08:35:16+00:00",
  "bot_commit": "unknown",
  "bot_version": "0.7.1"
}

動作環境情報の取得 (local_info)

名前に反して現状取得できるのは現在時刻と起動時刻ぐらいです。試した限りでは uptime を聞くとちゃんと計算して返してくれます。

{
  "bot_started_at": "2025-04-11T17:38:23+09:00",
  "time_now": "2025-04-11T18:39:33+09:00"
}

夏稀イラストの紹介 (get_illust_url)

僕が Skeb で依頼した夏稀のイラストの Skeb URL を提供します。一度に提供できるのは 4 件までで、全年齢リクエストのみが対象です。データベースは手動更新なので新しめのイラストは反映されていないことがあります。

当たり前ですが、イラスト自体を食わせているわけではないです。

// parameter
{
  "count": 1
}

// response
{
  "illusts": [
    {
      "comment": "",
      "creator_name": "りょくすい",
      "url": "https://skeb.jp/@Ryoku_sui/works/53"
    }
  ]
}

画像生成・編集 (image_generator)

Text-to-Image です。現在のバックエンドは GPT-Image-1 1 です。 テキストプロンプトからの画像生成に加え、添付された画像に対する編集も対応しています。

生成された画像はリプライに添付されます。 API から返された revised_prompt が ALT として追加されますが、 C2PA とかはちょっと怪しいかも。

// parameter (generate mode)
{
  "mode": "generate",
  "prompt": "lavender flower field with a beautiful sky"
}

// parameter (edit mode)
{
  "mode": "edit",
  "prompt": "手書き風のスケッチスタイルに変換。ラフな鉛筆画のようなタッチで、柔らかく温かみのある印象に仕上げる。",
  "input_image_urls": ["...."]
}

// response
{
  "image_url": "...",
  "revised_prompt": "Visualize a vast, sprawling field packed with countless lavender..."
}

為替相場 (exchange_rate)

ExchangeRate-API の情報をもとに為替相場を教えてくれます。ただ、フリープランなので更新は毎日 1 回。リアルタイム性がないのであんまり役に立たないかもしれません。

設計上は変換元の通貨単位に対して変換先を複数設定できる(例えばドル円とドルユーロを一括で取得できる)ようになっているんですが、パラメーターにそれを渡してくれるほどまだ賢くはないようです。一応説明文に入れてるんだけどな。

// parameter
{
  "base_code": "USD",
  "target_codes": [
    "JPY"
  ]
}

// response
{
  "base_code": "USD",
  "target_rates": {
    "JPY": 144.7493
  },
  "updated_at": "2025-04-11T00:00:01+00:00"
}

プライベート (daily_private)

キモい!

えーと……この bot で多分一番力が入っている部分です。 生理周期(下血があるなら生理用品の種類も)、基礎体温、その日のオナニーの回数、下着を教えてくれます。

最初に、全ての情報の元になる日付情報は「論理今日」ベースで、今のところ 07:00 が始点となっています。 現時点では就寝時間中も普通に起きているかのように振舞いますが、そのうちもうちょっと眠たそうな挙動にしたいですね。

生理周期は年単位で決定されています。内部的には卵胞期と黄体期の情報がありますが、無駄に答えてくるのでレスポンスには含まれず、月経何日目かメインの情報になっています。

生理用品はナプキン・タンポン・月経カップのいずれかが日替わりで決定され、特にナプキンの場合はその長さと羽根の有無もランダムに決まります。ここは今後ピルを飲んでいるかどうかとかも反映できるようにしたいですね。

基礎体温は生理周期に連動して計算され、(内部的にはフーリエ級数によって表わされる)基本的な体温変動とわずかなジッターによって構成されます。多分体温だけで生理周期が特定できます。

オナニーの回数はまあ文字通りなんですが、 日毎に一貫性のある返答をします。より正確には、オナニーの回数とタイミングはある日付についてはつねに一定になるように設計されています。 そのため、同日内では訊かれた時刻までに何回したかだけが変化する、というわけです。減ったりはしません。

下着については、着用状態についてはブラを着けているか、パンティーを穿いているかがそれぞれ独立なので合計 4 パターンです。 これに加え、両方着けている場合はデザインが統一されているかどうかの分岐があります。 一方、少なくともどちらかを着けていない場合はその理由が開示されます。

{
  "asked_at": "2025-04-11T18:39:33.915516247+09:00",
  "current_status": "daytime",
  
  // 生理周期
  "menstruation_status": {
    "absorbent": {
      "type": "tampon"
    },
    "bleeding_days": 4
  },
  
  // 基礎体温
  "basal_body_temperature": "36.23",
  
  // オナニー
  "masturbation_status": {
    "completed_count": 1
    // 訊いたタイミングでしてる最中の場合はこれが付く
    // playing_now: true
  },

  // 下着
  "underwear_status": {
    "status": "separate_bra_and_panty",
    "details": {
      "bra_design": {
        "color": "ラベンダー",
        "pattern": "しましま"
      },
      "panty_design": {
        "color": "グレー",
        "pattern": "花柄"
      },
      "is_sanitary": false,
    }
  }
}

リマインダー (shiyu_provider)

「n時間後に○○を知らせて」とかのように、リマインドを頼むことができます。信頼性の観点から、一週間以上先のリマインドは現状拒否しています。 一日のうち時刻が確定しない場合、その日の同時刻に設定します。またこちらは daily_private の論理今日とは独立しているため、25 時に「明日」と言った場合は問答無用で物理明日になります。 リマインド時の投稿の visibility は頼まれた投稿のものを引き継ぎます。状況に応じて使い分けてね。 ちなみに頼んだツリーでキャンセルしたい旨をリプライするとキャンセルできます。

// parameter
{
  "cancel": null,
  "content": "好きな食べ物を教える",
  "remind_at": "2025-04-17T15:44:12+09:00"
}

// response
{
  "status": "registered",
  "data": {
    "id": "3ce08421-43f6-4a0c-b40e-d42d4de4c328",
    "remind_at": "2025-04-17T15:44:12+09:00"
  }
}

レートリミットについて

会話と image_generator にはレートリミットが設定されています。 Sliding Window Count アルゴリズムによって呼出しの可否が決定されますが、具体的なウィンドウと回数についてはそこまで広くは公開しない予定です。 これらの数値は使用状況により予告なく変更される可能性があります(内部的には acct 単位で制御できるようになっています)。

利用上の注意

  • 当然ですが、この bot によって生成される内容の正確性は保証されていません。 生成された内容に基づく損害などについては、一切の責任を置いません。
  • mstdn.maud.io や OpenAI、その他各種プラットフォームの利用規約に基づき、サーバー・ドメイン単位で利用を制限する場合があります。
  • この bot が関与するリプライツリーは、メンションを受信した範囲でデータベースに保存されます。個人を特定できる情報などは入力しないでください。
  • 以下の事由により、予告なく動作が停止する可能性があります。
    • kb10uy が貧乏になった。
    • kb10uy が Budget の追加を忘れたまま $0.00 になった。
    • 新規機能追加など、開発上の理由。
    • その他、kb10uy が必要と判断した場合。2

  1. 2025/03 ごろに ChatGPT 4o の画像生成機能が強化されたといって話題になったもの。 ↩︎

  2. この手の条項の表現カスだと思ってるけどまあ書かないと怒られるしな……。 ↩︎