0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BedrockでGrok4.6が使えるようになったので、コードを本気で酷評させるアプリを作った

0
Posted at

image-1787152621181.png

Amazon BedrockでxAIのGrok 4.6が使えるようになりました。
2026年8月18日ローンチ、AWSの公式ドキュメントにもうモデルカードが出ています。
しかも普通にAWS Community Builderのクレジットの範囲で遊べる値段感だったので、これは何かせずにはいられないなと思い、
コードやGitHubリポジトリをGrokに本気で酷評してもらうアプリ「Grok Roast」を作りました。

なぜ「酷評アプリ」なのか

Grokの特徴は他のBedrockモデルにはないものが2つあります。
ひとつはreasoning effortがlow/medium/high/xhighの4段階で細かく選べること。
もうひとつはxAI由来の、率直で皮肉屋なブランド性格です。
せっかく他社にない性格を持ったモデルが来たので、これを活かすなら「毒舌キャラに全力でコードを叩いてもらう」のが一番手っ取り早いだろうと考えました。

image.png

reasoning effortの4段階は「毒舌レベル」というダイヤルとしてそのままUIに出しています。低いと一言で終わるし、xhighにすると本当にコードを読み込んで、設計思想の甘さまで見抜いてくる。
ここは実際に触ってもらったほうが早いです。

bedrock-mantleにたどり着くまで

最初、素直にConverse APIで叩こうとしました。

aws bedrock-runtime converse \
  --region us-east-1 \
  --model-id "us.xai.grok-4.6" \
  --messages '[{"role":"user","content":[{"text":"自己紹介を一文で。"}]}]'

結果はこれです。

An error occurred (ValidationException) when calling the Converse operation: The provided model identifier is invalid.

list-foundation-models で確認しても、このアカウントにはxAIというプロバイダ自体が一件も出てこない。
Model accessが必要なのかと思って一瞬コンソールに誘導しようとしたのですが、そこで「Model accessって今はいらないんじゃ?」と指摘をもらい、確かに最近のBedrockはClaude Opus 5やGLM 5みたいな新しいモデルも普通にカタログに出てくるので、明示的な有効化は不要になっているはずだと調べ直しました。

原因は別のところにありました。
Grok 4.6はConverse APIやInvoke APIが動く従来の bedrock-runtime エンドポイントではなく、bedrock-mantle というOpenAI互換のResponses APIエンドポイントでしか提供されていなかったんです。
しかもreasoning effortを指定できるのもこちらだけ。

curl -sS -i -X POST "https://bedrock-mantle.us-west-2.api.aws/openai/v1/responses" \
  -H "Content-Type: application/json" \
  -d '{"model":"xai.grok-4.6","input":"hi"}'
HTTP/2 401
{"error":{"code":"invalid_api_key","message":"Missing 'authorization' or 'x-api-key' header","param":null,"type":"permission_denied_error"}}

401が返ってきた時点で「サービス自体は存在する、認証が足りないだけ」というのが分かりました。
AWS公式のサンプルコードだとBedrockコンソールで発行する長期APIキー(Bearer token)を使う手順しか載っていないのですが、試しに普通のIAMアクセスキーでSigV4署名をかけてみたら、あっさり200が返ってきました。

from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest

req = AWSRequest(method="POST", url=url, data=body, headers={"Content-Type": "application/json"})
SigV4Auth(creds, "bedrock", "us-west-2").add_auth(req)

署名対象のサービス名を "bedrock" にするのがポイントでした。
これでコンソールでの手作業なしに、いつものIAMアクセスキーだけでGrok 4.6を呼べます。

TypeScript側は @smithy/signature-v4 で同じことをやっています。

const signer = new SignatureV4({
  credentials: { accessKeyId, secretAccessKey },
  region: "us-west-2",
  service: "bedrock",
  sha256: Sha256,
});

デプロイしたら403で怒られた

ローカルでは動いたのでVercelにデプロイして本番URLで試したら、今度は違うエラーが出ました。

User: arn:aws:iam::xxxxxxxxxxxx:user/grok-roast-vercel is not authorized to perform:
bedrock-mantle:CreateInference on resource: arn:aws:bedrock-mantle:us-west-2:xxxxxxxxxxxx:project/default
because no identity-based policy allows the bedrock-mantle:CreateInference action

bedrock:InvokeModel だけ許可したIAMポリシーを付けていたのですが、bedrock-mantleは bedrock-mantle:CreateInference という完全に別名前空間のアクションを要求してきます。
これはドキュメントを読んだだけでは絶対に気づけなかったもので、実際にデプロイして403を踏んで初めて分かりました。
ポリシーに1行足したら再デプロイ不要でそのまま通ったのは地味に助かりました。

{
  "Effect": "Allow",
  "Action": [
    "bedrock:InvokeModel",
    "bedrock:InvokeModelWithResponseStream",
    "bedrock-mantle:CreateInference"
  ],
  "Resource": "*"
}

実際に酷評させてみる

こういう雑なコードを貼ってみます。

function add(a,b){var x=a;var x=b;return x+x}

xhigh(極限の毒舌)で返ってきたのがこれです。

add と名乗っておいて中身は b + ba は引数として受け取った瞬間に人生を終えている。

これは「足し算」ではなく「後から来た値を二倍する関数」だ。var の再宣言が許されるJSの仕様をフル活用して、最初の代入を完全に無効化している。意図的なら天才、うっかりなら普通にバグ。

足し算関数のフリして、実質「bさんだけ倍プッシュ、aさんは空気扱い」——関数名詐欺の完成形。

var x=a; var x=b; の再宣言バグをちゃんと見抜いて、しかも煽ってくる。GitHubリポジトリを丸ごと渡すモードも作っていて、こちらは自分の過去の量子おみくじアプリ(quantum-omikuji)を渡したら、フェイクの乱数演出からLambda Function URLが認証なしで公開されている件まで、アーキテクチャレベルの問題を的確に指摘されました。reasoning effortを上げるほど、拾ってくる論点の解像度が明らかに上がるのが体感できます。

多言語にしたら、酷評結果もその言語で返ってくる

UIを日本語・英語・中国語・韓国語・スペイン語・フランス語・ドイツ語・ロシア語・ポルトガル語・アラビア語の10言語対応にしました。ここでこだわったのは、UIの文言だけでなく、Grokが書く酷評の本文そのものも選んだ言語で返ってくるようにしたことです。

スクリーンショット 2026-08-19 23.48.20.png

スクリーンショット 2026-08-19 23.48.53.png

スクリーンショット 2026-08-19 23.51.57.png

スクリーンショット 2026-08-19 23.53.05.png

スクリーンショット 2026-08-19 23.53.32.png

スクリーンショット 2026-08-19 23.54.22.png

やり方は単純で、システムプロンプト自体は英語で固定しつつ、末尾に一行だけ言語指定を足しています。

const system = `${SYSTEM_PROMPT}

Respond entirely in ${languageName}, using the tone and idiom a native speaker would actually use for savage-but-fair humor.`;

フランス語を選んで同じ量子おみくじリポジトリを酷評させたら、こういう文章が返ってきました。

On va pas se mentir : le README a le culot d'un prospectus IonQ, le dépôt a l'âme d'un np.random.choice(p=[0.17, 0.35, …]) habillé en pèlerinage shinto.

フランス語のジョークのノリまでちゃんと再現してくるのは正直びっくりしました。
翻訳ではなく、その言語のネイティブが書きそうな皮肉のトーンで最初から生成しているのが分かります。
アラビア語を選ぶとレイアウトもRTL(右から左)に自動で切り替わるようにしています。

スクリーンショット 2026-08-19 23.50.48.png

スクリーンショット 2026-08-19 23.51.28.png

おまけ

次はxhighの思考過程(reasoning summary)を画面に出して、Grokが「どう毒舌を組み立てているか」を見せる方向でも遊んでみたいと思っています。

最後まで読んでいただきありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?