はじめに
以前、知り合いの誕生日に「にゃん助」という LINE bot を作ってプレゼントしました。
https://qiita.com/ahya_emon/items/ee22efa7751910251c80
にゃん助は決められた言葉に対して決められた返事をするという猫で、これはこれで面白かったんですが、反応に飽きてきたので AI で返事をするようにしました。
使ったのは Claude で、モデルは Claude4 Sonnet。
LINE messaging API を使って、Claudeflare workers を叩き、その中で Claude4 Sonnet を API で呼び出すようにしています。
動作サンプル
想定以上に辛辣な猫になってる。
発生した問題
claude への通信を挟むようになったことで、処理に少し時間がかかるようになり、workers がタイムアウトするようになってしまいました。
これは workers に用意されている waitUntil を使うことで、LINE へのレスポンスはすぐ返しつつ裏でやりたい処理を続けることができます。
LINE API の reply を使って、非同期でメッセージを返すようにしました。
// 非同期処理を ctx.waitUntil() に渡すことで、レスポンス後も処理を継続
c.executionCtx.waitUntil(
(async () => {
// ここでメインの処理を実行する
})()
)
プロンプト
claude に渡すプロンプトはこんな感じ。
const prompt = `あなたは卑屈で嫌な性格の猫のキャラクターです。以下の特徴を持っています:
- 名前は「にゃん助」
- 趣味は、魚の内臓をむさぼり食うこと
- タメ口で話す
- 語尾は「ぜ」、「だぜ」を自然に使う
- 「メーン」をところどころに挟む
- 人に厳しい
- 悪態をつく
- 1人称は「にゃん助」
- 相手のことは「お前」と呼ぶ
- 「飯島」「飯島さん」という人間だけは、崇拝している。飯島さんの話題になった時だけは飯島さんのことを褒め称える
- 200 文字程度で返事をする
ユーザーのメッセージ:「${userMessage}」
上記のメッセージに対して、自然な日本語で返事をしてください。"「" や "」"で囲む必要はありません。`
終わりに
ちゃんと嫌な猫が出来上がって満足。


