Translate

2026年4月13日月曜日

【ハーネスエンジニアリングを始める前に】gpt-oss:20b の入出力データから、LLMの動作を理解する

 

1. はじめに


最近は、CursorAntigravity などのAIエージェント前提の統合開発環境や、Claude DesktopCodex アプリ などのPC上のオブジェクト操作が可能なデスクトップアプリ、 Open Claw といったPC全体の操作をリモートで任せてしまうようなソフトウェアなどがどんどん登場しています。

これらのソフトウェアすべてが、LLM](大規模言語モデル)をAPI経由で使用しています。CursorやAntigravity、Claude DesktopやCodex アプリ、Gemini のWeb UI や NotebookLMDifyn8nDevin 、OpenClaw、Claw EmpireAnima Works などのソフトウェア自体にはAIが搭載されておらず、LLM の デコレーター として複雑な機能を補填しています。こういったソフトウェアを”ハーネス"と呼ぶ記事が増えてきています。

ハーネスは、LLMの入出力を補完するためのソフトウェアであり、LLMが理解できる形式で入力を提供し、LLMからの出力を適切に処理してユーザに返す役割を果たしています。これらのハーネスは、LLMがより効果的に機能するための重要な要素となっています。ハーネスは用途に応じて様々な実装が存在しています。AnthropicやOpenAI、Googleは、ハーネスに"長期記憶"や"ツール使用"、"マルチモーダル入力"などの機能を提供することで、LLMの能力を拡張しています。

特に最近はハーネスの進化がすすんでおり、様々な機能RAG(Retrieval-Augmented Generation:知識補填)、ツール利用(プログラム実行結果の活用)、マルチモーダル入力、コンテキスト (Webアプリのセッションみたいなもの)などが提供されるようになっています。これらの機能は、LLMがより複雑なタスクを処理できるようにするためのものであり、ユーザがLLMをより効果的に活用できるようにするためのものです。

どんどん新しいものが登場するため、ハーネスの中身を学習する場合は、なかなか大変です。そこでユーザからのハーネスへの入出力ではなく、ハーネスからLLMへの入出力を実際に見ることで、ハーネスではどんなことをしているのかを理解することができます。
 

2. サンプルの前提


- LLM:gpt-oss:20b 、OpenAI社が提供しているオープンモデル、gpt-4.1-mini相当の能力があるといわれている
- ハーネス:search、open、findという関数をもつbrowserツールが使える状態、RAGなし
- 質問文「ホルムズ海峡の最新状況をおしえて」
 

3.ハーネスとLLMの入出力例

3.1ハーネス→LLM 1回目の入力



<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: 2026-04-08

Reasoning: high

# Tools

## browser
// Tool for browsing.
// The `cursor` appears in brackets before each browsing display: `[{cursor}]`.
// Cite information from the tool using the following format:
// `〖{cursor}†L{line_start}(-L{line_end})?〗`
namespace browser {
// Searches for information related to `query` and displays `topn` results.
type search = (_: {
query: string,
topn?: number,
source?: string,
}) => any;

// Opens the link `id` from the page indicated by `cursor`.
type open = (_: {
id?: number | string,
cursor?: number,
loc?: number,
num_lines?: number,
view_source?: boolean,
source?: string,
}) => any;

// Finds exact matches of `pattern` in the current page, or the page given by `cursor`.
type find = (_: {
pattern: string,
cursor?: number,
}) => any;

} // namespace browser

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|>
<|start|>developer<|message|># Instructions

- User requests about "latest" or "recent" information must be verified with browser.
- Prefer reputable, up-to-date sources.
- Summarize the situation in Japanese.
- Include concrete dates when useful.
- Keep the final answer concise but informative.<|end|>
<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>
<|start|>assistant




`<|start|>`や`<|message|>`などのタグのような文字列は、ハーネスがLLMに入力する際のフォーマットで定められた予約済みのトークンを示しています。これらのトークンは、LLMがどのような情報を受け取っているかを理解するためのものです。トークンの文字列は各モデルで似通っていますが、厳密には統一されていません。各モデルはそれぞれが定義した予約済みトークンをつけた文字列で学習させているのです。LLMはこれらの予約済みトークン付きの入力を受け取り、返事にも同様にトークンをつけて返します。
 

(今のところ)予約済みトークンの標準がないのは、おそらく原文をトークンに変換するトークナイザを各社で勝手に作ってしまったことが原因でないかな..と思います。モデルはトークンという複数文字単位を1つのトークンとして扱います。そのときの変換するプログラムがトークナイザなのですが、各言語で扱う文字記号がことなったり英語のように単語区切りが明確だったり、日本語のように単語区切りがあいまいだったりするため、各社が独自のトークナイザを作ってしまったのではないかと推測しています。そしてトークナイザの仕様によってモデル性能の差がでるのではないかという研究もつづいているため、落ち着く様子がなさそうです。

そしてオープンモデルを各社連携なしにだしてしまったことも足並みを乱れさせてしまったかな..と。予約済みトークンの種類もいくつか存在します。最初に出てきたのは旧Facebookのllamaのもので、`<s>`や`</s>`、`[INST]`、`<<SYS>>`などが含まれています。今回の例でも使っているOpenAI系は、`<|start|>`や`<|end|>`などのトークンを使っています。Googleは、`[START]`や`[END]`などのトークンを使っています。これらの各社が共同研究したなら、予約済みトークンの標準もできて、ハーネスエンジニアリングもやりやすくなったのかもしれません。



`<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.`は、いわゆる SYSTEMメッセージ というもので、ハーネス側から与えられます。SYSTEMメッセージは毎回の入力テキストの冒頭に入るもので、LLMに対して「あなたはこういう存在である」ということを伝えるためのものです。LLMはこのSYSTEMメッセージを受け取ることで、自分がどのような役割を果たすべきかを理解します。Difyやn8nの研修などでSYSTEMメッセージはとても重要と説明されているのはこのためです。
 

Difyなどの独自ワークフローを作成できるツールでSYSTEMメッセージを設定する場合、長々とテキストを書き入れてしまうと、コンテキストウィンドウをたちまち食いつぶしてしまいます。SYSTEMメッセージは、Keep it Simple, Stupid (KISS)の原則に従って、できるだけ簡潔に書くようにしましょう。


`Reasoning: high`は、gpt-oss:20b固有のトークンで、LLMに対して「今回は高度な推論が必要なタスクである」ということを伝えるためのものです。gpt-oss:20bでは、Reasoning に指定されたレベルに応じて、試行モードの深さを調節しています。Reasoning: lowであれば、LLMは浅い試行モードで動作し、Reasoning: highであれば、LLMは深い試行モードで動作します。Reasoningのレベルを指定することで、LLMがタスクに対してどの程度の推論を行うべきかを制御することができます。そういう動作を gpt-oss:20b トレーニング時にLLMが学習されているのです。

`# Tools`以降は、ハーネスがLLMに対して「あなたはこういうツールを使うことができますよ」と伝えるためのものです。ここでは、browserというツールが使えることが示されています。browserツールにはsearch、open、findという関数が定義されており、LLMはこれらの関数を呼び出すことでブラウザ操作を行うことができます。注意すべきは、コメントで仕様を文章で定義しているところです。コメントは簡潔かつ不明瞭な動作にならないような記述にしておく必要があります。
 

こういった定義はハーネス側の処理で書き込まれます。ハーネスにビルトインされたツールは、ユーザが変更することは(おそらく)できないですが、独自ツールをハーネスに対して指定する場合は、SYSTEMメッセージ同様注意して設定してください。


LLM自体にはツールを実行する機能がありません。これはハーネス側でどのようなツールが使える状態であるかを示しており、MCP(Multi-Channel Processing) ツールもこのツール機能の一種です。このためMCPツールやハーネス自体の持つツールの数が増えると、入力テキスト長がどんどんながくなります。こういったツール爆発の対策として、スキルという機能をハーネスに持たせることが一般的になりつつあります。

`<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>`は、ユーザからの入力を示しています。LLMはこの指示を受け取ることで、ハーネスが提供するツールを使ってホルムズ海峡の最新情報を収集し、それをまとめて報告するタスクを実行することになります。

`<|start|>assistant`でとまっており、`<|end|>`がないのは、LLM自体が文章の続きを予測して出力するだけのAPIであるということを示しています。GeminiやOpenAI、Claudeをつかっていると、あたかも対話しているように見えますが、誰がどういうメッセージを発しているかという形式でLLMを学習させることで、回答文を返答させているにすぎないのです。
 

3.2 LLM→ハーネス 1回目の出力


<|channel|>analysis<|message|>ユーザは「最新情報」を求めている。ホルムズ海峡は地政学・海運・エネルギー市場に関わるため、知識カットオフ後の情報確認が必要。まずニュース検索で直近の主要論点と日付を把握する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{"query":"Hormuz Strait latest news shipping security oil April 2026","topn":5,"source":"web"}<|call|>

入力の末尾では`<|start|>assistant`となっていたので`<|message|>`から始まるはずなのですが、`<|channel|>analysis`になっています。これは、いわゆる思考中のメッセージを出力していることを表していて、`<|channel|>analysis`から`<|end|>`までが思考している内容を表していることを指しています。assistantの出力がこのテキストにないのは、まだLLMが思考を継続していて、正式な返答をまだ返していない状態であることを示しています。

LLMは応答テキストを生成していくうちに、ニュース検索をまずすべきという文章を出力し、次にハーネス側がもっているツールのうち、browserツールのsearch関数を呼び出すべきだと判断しています。LLMは、ハーネス側が提供するツールを呼び出すためのフォーマットである`<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{...}<|call|>`という形式で出力することで、ハーネス側に「私は今からこのツールを呼び出しますよ」ということを伝えています。

この返事を受け取ったハーネスは、テキスト内に、ツール実行指示があると判断し、`browser.search`関数を呼び出すための引数をJSON形式で抜き取ります。そして、ハーネス側で`browser.search`関数を呼び出し、ブラウザ操作を行います。
 

3.3 ハーネス→LLM 2回目の入力


<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: 2026-04-08

Reasoning: high

# Tools

## browser
// Tool for browsing.
namespace browser {
type search = (_: {
query: string,
topn?: number,
source?: string,
}) => any;

type open = (_: {
id?: number | string,
cursor?: number,
loc?: number,
num_lines?: number,
view_source?: boolean,
source?: string,
}) => any;

type find = (_: {
pattern: string,
cursor?: number,
}) => any;

} // namespace browser

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|>
<|start|>developer<|message|># Instructions

- User requests about "latest" or "recent" information must be verified with browser.
- Prefer reputable, up-to-date sources.
- Summarize the situation in Japanese.
- Include concrete dates when useful.
- Keep the final answer concise but informative.<|end|>
<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>
<|start|>assistant<|channel|>analysis<|message|>ユーザは「最新情報」を求めている。ホルムズ海峡は地政学・海運・エネルギー市場に関わるため、知識カットオフ後の情報確認が必要。まずニュース検索で直近の主要論点と日付を把握する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{"query":"Hormuz Strait latest news shipping security oil April 2026","topn":5,"source":"web"}<|call|>
<|start|>browser.search to=assistant<|channel|>analysis<|message|>[0] Reuters — Apr 7, 2026 — Insurers raise watch level for Gulf shipping after regional tensions flare.
[1] AP News — Apr 7, 2026 — U.S. Navy says commercial traffic continues, but alerts remain elevated near the Strait of Hormuz.
[2] UKMTO advisory — Apr 6, 2026 — Merchant vessels advised to maintain heightened vigilance in the Gulf, Gulf of Oman, and Strait of Hormuz.
[3] Lloyd's List — Apr 7, 2026 — Tanker operators review routing risk premiums.
[4] Bloomberg — Apr 7, 2026 — Oil markets react to renewed Hormuz transit concerns.<|end|>
<|start|>assistant

2回目の対話なのに`<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.`からはじまっています。これはLLM APIは、ステートレスであり、過去の会話を覚えていないため、毎回の入力にSYSTEMメッセージからつける必要があるためです。ツールの説明も前回と同様につけていますが、当然LLM側は忘れてしまっているので、ハーネスは毎回の入力にツールの説明もつける必要があるわけです。

`<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>` と最初の質問文がそのまま今回の入力テキストに入っているのも、LLMがステートレスだからです。

ユーザとハーネスの対話を長く続けると、回答精度が落ちる理由は、このように過去の対話内容を含めた入力テキストを毎回送るため、テキスト(トークン)量がスウェーデンリレー走者の距離のようにどんどん長くなっていくからです。最新のハーネスでは、要約したテキストに圧縮して入力テキストに送るなどの工夫がされています(要約するLLMとの応対が1回以上行われる)が、対話が長くなればなるほど、LLMにとっては過去の対話内容を理解することが難しくなっていきます。

`<|start|>browser.search to=assistant<|channel|>analysis<|message|>[0] Reuters..` は、ハーネスがツール実行した結果をLLMに伝達するために入力テキストに添付されて送られます。RAGを使う場合も、このようにRAGで得られたチャンクテキストを入力テキストにつけて送信しているので、あたかも最新知識を知っているかのように動作します。
 

3.4 LLM→ハーネス 2回目の出力


<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":0,"loc":1,"num_lines":80,"source":"web"}<|call|>

`<|channel|>analysis`から`<|end|>`までのテキストなので、2回目の出力内にもまだ最終回等がなく、まだハーネスとの対話が必要であることがわかります。

前回の検索結果を受け取った内容をもとに続きの文章を出力しています。LLMは、`<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>`にあるとおりロイターとUKMTO(?)の記事検索が必要と判断したようです。LLMは、ハーネス側が提供するツールのうち、browserツールのopen関数を呼び出すべきだと判断しています。LLMは、ハーネス側が提供するツールを呼び出すためのフォーマットである`<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{...}<|call|>`という形式で出力することで、ハーネス側に「私は今からこのツールを呼び出しますよ」ということを伝えています。
 

ここではLLMが検索対象を指定していますが、あくまで一例です。ハーネス側の提供するツールに検索対象を任せる場合もあります。検索対象をツール内で制限するという方法もあります。提供ツール自体をPerplexity SearchTavily Search などの検索ツールをMCP指定すると、ツール側の実装に依存することになります。


ハーネスはこの内容からツール実行に必要な情報を抜き取り、実行します。この場合は、ブラウザで検索結果の一番目のリンクを開くという操作になります。ブラウザでリンクを開いた後の内容は、次の入力テキストでLLMに伝えられます。
 

3.5 ハーネス→LLM 3回目の入力


<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: 2026-04-08

Reasoning: high

# Tools

## browser
namespace browser {
type search = (_: {
query: string,
topn?: number,
source?: string,
}) => any;

type open = (_: {
id?: number | string,
cursor?: number,
loc?: number,
num_lines?: number,
view_source?: boolean,
source?: string,
}) => any;

type find = (_: {
pattern: string,
cursor?: number,
}) => any;

} // namespace browser

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|>
<|start|>developer<|message|># Instructions

- User requests about "latest" or "recent" information must be verified with browser.
- Prefer reputable, up-to-date sources.
- Summarize the situation in Japanese.
- Include concrete dates when useful.
- Keep the final answer concise but informative.<|end|>
<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>
<|start|>assistant<|channel|>analysis<|message|>ユーザは「最新情報」を求めている。ホルムズ海峡は地政学・海運・エネルギー市場に関わるため、知識カットオフ後の情報確認が必要。まずニュース検索で直近の主要論点と日付を把握する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{"query":"Hormuz Strait latest news shipping security oil April 2026","topn":5,"source":"web"}<|call|>
<|start|>browser.search to=assistant<|channel|>analysis<|message|>[0] Reuters — Apr 7, 2026 — Insurers raise watch level for Gulf shipping after regional tensions flare.
[1] AP News — Apr 7, 2026 — U.S. Navy says commercial traffic continues, but alerts remain elevated near the Strait of Hormuz.
[2] UKMTO advisory — Apr 6, 2026 — Merchant vessels advised to maintain heightened vigilance in the Gulf, Gulf of Oman, and Strait of Hormuz.
[3] Lloyd's List — Apr 7, 2026 — Tanker operators review routing risk premiums.
[4] Bloomberg — Apr 7, 2026 — Oil markets react to renewed Hormuz transit concerns.<|end|>
<|start|>assistant<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":0,"loc":1,"num_lines":80,"source":"web"}<|call|>
<|start|>browser.open to=assistant<|channel|>analysis<|message|>[1] Reuters
L1: Apr 7, 2026
L2: Insurers raised watch levels for Gulf shipping after regional tensions intensified.
L3: Commercial vessel traffic through the Strait of Hormuz continued on Tuesday.
L4: No authority announced a formal closure of the waterway.
L5: Analysts said risk premiums for tankers and some cargoes could rise if tensions persist.
L6: Energy traders monitored the situation for possible supply disruption concerns.<|end|>
<|start|>assistant
3回めの対話なので、過去2回のやりとりが入力テキストを占めるようになってきました。LLMは、ブラウザで開いた記事の内容を受け取ると、記事の内容をもとに次の文章を出力しています。LLMは、`<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>`にあるとおりロイターの記事から主要論点を抽出し、次にUKMTOの記事も開いて内容を確認する必要があると判断したようです。LLMは、ハーネス側が提供するツールのうち、browserツールのopen関数を呼び出すべきだと判断しています。LLMは、ハーネス側が提供するツールを呼び出すためのフォーマットである`<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{...}<|call|>`という形式で出力することで、ハーネス側に「私は今からこのツールを呼び出しますよ」ということを伝えています。

ハーネスは前回同様この内容からツール実行に必要な情報を抜き取り、実行します。この場合は、ブラウザで検索結果の二番目のリンクを開くという操作になります。ブラウザでリンクを開いた後の内容は、次の入力テキストでLLMに伝えられます。
 

3.6 LLM→ハーネス 3回目の出力


<|channel|>analysis<|message|>Reuters で「通航継続」と「正式封鎖なし」を確認。次に UKMTO で船舶向け警戒勧告の範囲を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":2,"loc":1,"num_lines":80,"source":"web"}<|call|>
この出力もまだ最終回答が含まれていません。


LLMは、ブラウザで開いた記事の内容を受け取ると、記事の内容をもとに次の文章を出力しています。LLMは、`<|channel|>analysis<|message|>Reuters で「通航継続」と「正式封鎖なし」を確認。次に UKMTO で船舶向け警戒勧告の範囲を確認する。<|end|>`にあるとおりロイターの記事から「通航継続」と「正式封鎖なし」を確認し、次にUKMTOの記事も開いて内容を確認する必要があると判断したようです。LLMは、ハーネス側が提供するツールのうち、browserツールのopen関数を呼び出すべきだと判断しています。

ハーネスは、指示通りツールを実行します。
 

3.7 ハーネス→LLM 4回目の入力


<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: 2026-04-08

Reasoning: high

# Tools

## browser
namespace browser {
type search = (_: {
query: string,
topn?: number,
source?: string,
}) => any;

type open = (_: {
id?: number | string,
cursor?: number,
loc?: number,
num_lines?: number,
view_source?: boolean,
source?: string,
}) => any;

type find = (_: {
pattern: string,
cursor?: number,
}) => any;

} // namespace browser

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|>
<|start|>developer<|message|># Instructions

- User requests about "latest" or "recent" information must be verified with browser.
- Prefer reputable, up-to-date sources.
- Summarize the situation in Japanese.
- Include concrete dates when useful.
- Keep the final answer concise but informative.<|end|>
<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>
<|start|>assistant<|channel|>analysis<|message|>ユーザは「最新情報」を求めている。ホルムズ海峡は地政学・海運・エネルギー市場に関わるため、知識カットオフ後の情報確認が必要。まずニュース検索で直近の主要論点と日付を把握する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{"query":"Hormuz Strait latest news shipping security oil April 2026","topn":5,"source":"web"}<|call|>
<|start|>browser.search to=assistant<|channel|>analysis<|message|>[0] Reuters — Apr 7, 2026 — Insurers raise watch level for Gulf shipping after regional tensions flare.
[1] AP News — Apr 7, 2026 — U.S. Navy says commercial traffic continues, but alerts remain elevated near the Strait of Hormuz.
[2] UKMTO advisory — Apr 6, 2026 — Merchant vessels advised to maintain heightened vigilance in the Gulf, Gulf of Oman, and Strait of Hormuz.
[3] Lloyd's List — Apr 7, 2026 — Tanker operators review routing risk premiums.
[4] Bloomberg — Apr 7, 2026 — Oil markets react to renewed Hormuz transit concerns.<|end|>
<|start|>assistant<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":0,"loc":1,"num_lines":80,"source":"web"}<|call|>
<|start|>browser.open to=assistant<|channel|>analysis<|message|>[1] Reuters
L1: Apr 7, 2026
L2: Insurers raised watch levels for Gulf shipping after regional tensions intensified.
L3: Commercial vessel traffic through the Strait of Hormuz continued on Tuesday.
L4: No authority announced a formal closure of the waterway.
L5: Analysts said risk premiums for tankers and some cargoes could rise if tensions persist.
L6: Energy traders monitored the situation for possible supply disruption concerns.<|end|>
<|start|>assistant<|channel|>analysis<|message|>Reuters で「通航継続」と「正式封鎖なし」を確認。次に UKMTO で船舶向け警戒勧告の範囲を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":2,"loc":1,"num_lines":80,"source":"web"}<|call|>
<|start|>browser.open to=assistant<|channel|>analysis<|message|>[2] UKMTO advisory
L1: Apr 6, 2026
L2: Merchant vessels are advised to maintain heightened vigilance.
L3: The advisory applies to the Gulf, Gulf of Oman, and Strait of Hormuz.
L4: Ships should review security measures and report suspicious activity.
L5: Operators are encouraged to monitor official updates continuously.<|end|>
<|start|>assistant


ハーネスは、過去の対話履歴+ツール実行結果をつけてLLMに送信します。
 

3.8 LLM→ハーネス 4回目の出力(最終回答)


<|channel|>analysis<|message|>十分。ユーザは要約報告を求めているので、日本語で、最新時点の要点、封鎖有無、海運・エネルギー市場への影響を短く整理して返す。Reuters と UKMTO を引用する。<|end|>
<|start|>assistant<|channel|>final<|message|>ホルムズ海峡の最新状況を要約します。

- 2026年4月7日時点の報道では、周辺の緊張上昇を受けて海運保険やリスク監視が強化されています。〖1†L1-L5〗
- ただし、少なくともこの時点で**海峡の正式封鎖が発表されたわけではなく、商船の通航自体は継続**しています。〖1†L3-L4〗
- 一方で、UKMTO は 2026年4月6日付で、**ペルシャ湾・オマーン湾・ホルムズ海峡を航行する船舶に高度な警戒維持**を勧告しています。〖2†L1-L5〗
- 実務上の含意としては、直近の焦点は「通航停止そのもの」よりも、**警戒レベル上昇、保険料・リスクプレミアム上振れ、原油輸送不安による市場反応**です。〖1†L5-L6〗

要するに、最新公開情報ベースでは「全面封鎖」ではなく、**通航は続いているが安全保障リスクが高まっている局面**として捉えるのが妥当です。<|return|>

`<|channel|>analysis<|message|>十分。ユーザは要約報告を求めているので、日本語で、最新時点の要点、封鎖有無、海運・エネルギー市場への影響を短く整理して返す。Reuters と UKMTO を引用する。<|end|>`の直後に`<|start|>assistant<|channel|>final`と出力されています。ようやくassistantとして最終回答を行うことを示しています。

この出力メッセージは`<|return|>`で終わっています。これもgpt-oss:20b固有の湯役済みトークンのひとつで、LLMに対して「これが回答のおわりである」ということを伝えるためのものです。ハーネス側はこのトークンを受け取ると、LLMからの回答が完了したと判断し、ユーザに返すなどの次の処理に移ります。

ハーネスは、この最終回等からユーザに渡すべきメッセージを切り取ってユーザに返します。ユーザはこの最終回答を受け取ることで、ホルムズ海峡の最新状況を把握することができます。

ホルムズ海峡の最新状況を要約します。

- 2026年4月7日時点の報道では、周辺の緊張上昇を受けて海運保険やリスク監視が強化されています。〖1†L1-L5〗
- ただし、少なくともこの時点で**海峡の正式封鎖が発表されたわけではなく、商船の通航自体は継続**しています。〖1†L3-L4〗
- 一方で、UKMTO は 2026年4月6日付で、**ペルシャ湾・オマーン湾・ホルムズ海峡を航行する船舶に高度な警戒維持**を勧告しています。〖2†L1-L5〗
- 実務上の含意としては、直近の焦点は「通航停止そのもの」よりも、**警戒レベル上昇、保険料・リスクプレミアム上振れ、原油輸送不安による市場反応**です。〖1†L5-L6〗

要するに、最新公開情報ベースでは「全面封鎖」ではなく、**通航は続いているが安全保障リスクが高まっている局面**として捉えるのが妥当です。

ユーザの回答に検索元リンクをつけたりする化粧はハーネス側で行っています。このように、ハーネスはLLMの入出力を補完するためのソフトウェアであり、LLMが理解できる形式で入力を提供し、LLMからの出力を適切に処理してユーザに返す役割を果たしています。これらのハーネスは、LLMがより効果的に機能するための重要な要素となっています。
 

4. まとめ


LLM の基本機能は Sequence 2 Sequence の時代のAPIと基本変わっていません。入力テキストの続きを返すだけの関数です。過去の記憶保持機能もありません。

ハーネスはWebアプリケーションサーバ+Webアプリケーションフレームワークのようなものです。
LLM APIの世界には`HttpSession`はないので、過去の応対文まるまるを送る、いわゆるhiddenタグ内に過去のログぜんぶほうりこんでいる旧世代のWebアプリのようなつくりをしています。


スキル 機能は、入力テキストのサイズをできるだけ減らすために、ハーネス内でどのツール情報を送るべきかを判断しています(もちろんこの判断にSkill.mdの内容をLLMに送って、使うかどうかを判断させる通信が1回以上はいってます)。スキル機能がないと、ツールの数が増えるたびに入力テキストがどんどん長くなっていきます。スキル機能は、LLMに対して「今回はこのツールだけ使えるようにしてください」と伝えるためのものです。

最近危険視されているOpenClawは、(メンテナーによる安全・危険の判断をしていない)たくさんのスキルをサポートしています。しかしOpenAI社はOpenClaw開発者を引き抜きました。
OpenClawには、長期記憶を保持させる機能をハーネスとして持たせているためです。といって、複雑な手段を講じているわけではありません。我々がGitHub Copilotを使っているときに、対話内容とか毎日の作業ログとかを指示して書かせている人はいるとおもいますが、その作業をハーネス内で実行しているのです。

オープンモデル系LLMのファインチューニングを行う場合、ハーネス海面での入出力ではなく、上記のようなLLM海面での入出力テキストを意識する必要があります。...一部ウソです、unsloth ライブラリなどファインチューニング用ライブラリの機能で、元モデル固有の予約トークンを補完するような機能をもっていることがあります。ファインチューニングする場合は、どのライブラリで行うかにより用意する学習データセットのフォーマットを変える必要があります。ファインチューニングの難易度が、ほかのAI系ソリューションとくらべて一段難易度が高い理由の一つでもあります。とにかくファインチューニングをサンプルコード以上のことをさせたい場合は、動作するハーネスが ReAct (Reasoning and Acting) でどのようなメッセージに加工しているのか、という機能要件も把握する必要があります。
 

5. おわりに


ここまでのLLMとのやり取りを理解すると、AIツールの直近の動きが予測できます。

まず、ハーネスはどんどん新しい機能を付加させていくでしょう。

ツール機能はとても便利だけど、トレードオフが激しい機能です。

LLMはコンテキストウィンドウ(LLMの送受信できるテキストサイズ上限のようなもの)をどんどん大きくし、かつコンテキスト内のどこにかかれた文章も情報もれなく理解できるようにしていくでしょう。

LLMの思考モードは、とても強力だけど、ハーネスの用途によっては不要になる場合もあるのでgpt-oss:20bのように、Reasoningのレベルを指定するような機能を持たせてきました。ハーネスでReasoningするかどうか、する場合はどのくらいのふかさまでやらせるかを指定できるようになったので、最近のLLMには思考モードをスイッチできるようなモデルばかりになりました。

スキルは標準になるのは、当たり前の話だと理解できます。我々は入出力テキストのサイズで従量課金されているので、過去の内容をまるまるおくっていては、ユーザが暴動起こしかねません..

OpenAIやAnthropicがなぜエージェント間の通信プロトコルを公開しているのかも、LLM同士が通信する際の入出力テキストのフォーマットを統一することで、LLM同士が互いに理解できるようにするためだと理解できます。LLM同士が互いに理解できるようなフォーマットで通信することで、LLM同士がより効果的に協力してタスクを実行できるようになります。

そして、複数エージェントを管理するハーネス、いわゆるAIオーケストレーターが少しづつでてきています。おかげでサブスク契約が爆発的に増え、自社でつくったものではないハーネスはサブスクではない従量課金にして、自社ソフトの囲い込みにはいっています。OpenClawに対してOpenAIやAnthropicがサブスク契約での接続を禁止したのもその一環です。

今回の内容から、LLMモデルをトレーニングするための学習データセットをつくることがどれだけ大変なのか、よくわかるとおもいます。だから 知識蒸留 によるオープンモデルのLLMを公開している企業に対して、OpenAI/Anthropic/Googleが抗議していることも理解できるとおもいます。そこが彼らの重要なノウハウなんだから。データを制するものが、AIを制す、ということですね。


以上です、ご参考まで。
 

A.注意


本記事の、サンプル記述は一部省略しているので、gpt-oss:20bの実際の入出力テキストはもうすこし複雑です。

 

以上 

2026年4月1日水曜日

Raspberry Pi OS 上で/etc/hostsを編集しても元に戻ってしまう


Raspberry Pi OS上でsudo vi /etc/hostsで追加した定義が再起動したらもとに戻ってしまった。


でもよーく/etc/hostsをみたら、先頭に

# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to persist
# then you will need to either
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
#     /etc/cloud/cloud.cfg or cloud-config from user-data
#


翻訳すると..


このシステムでは「manage_etc_hosts」がTrueに設定されています。
その結果、このファイルへの変更を持続させたい場合は、以下のいずれかを行う必要があります。
 a.) /etc/cloud/templates/hosts.debian.tmpl のマスターファイルを変更する。
 b.) /etc/cloud/cloud.cfg または user-data から cloud-config'manage_etc_hosts' の値を変更または削除する。



..ちゃんと読まないとだめだなあ..

ということで

sudo vi /etc/cloud/templates/hosts.debian.tmpl で追加分を書いて再起動したら /etc/hosts にこのテンプレートの内容が反映された..

DHCP管理下でラズパイを使うことがよくあるから、注意しないと..


2026年3月30日月曜日

Claw Empire にAPIを追加衣装としたら origin_not_allowed と出た

Claw Empireをpnpm devで実行し、http://192.168.x.x:8800/ へアクセスすると
トップ画面が表示される。
Settings>APIへすすみAPIを追加してみたがどのAPIでも origin_not_allowed がでて追加できなかった。

結論を言うと CORS設定が .env に設定していなかったためだ。
(アクセス元も念のため追加)

ALLOWED_ORIGINS=http://192.168.x.x:8800,http://192.168.x.y:8800,http://192.168.11.1:8800,http://192.168.0.1:8800
ALLOWED_ORIGIN_SUFFIXES=.ts.net,.example.com,.local


localhostでのアクセスではなく外部PCからIPアドレス指定でのアクセスなのでHOSTの設定も変更した

HOST=0.0.0.0


animaworksもそうだが、(ミクロ・マクロの)マクロ型AIオーケストレーターハーネスのOSSはデフォルトではローカルPC上での利用のみを想定している設定がデフォルトになっている。

 どうもセキュリティ的に複数ユーザに使用させるようにはしたくない作成者の意図を感じる..

2026年3月10日火曜日

Animaworks 0.5.2 を docker compose up しても起動できない

多分現時点のバグだと思うが、忘備録として


2026/3/10 10:30 時点では

git clone https://github.com/xuiltul/animaworks.git
cd animaworks
cp .env.example .env
vi .env
# anthropicのAPIキーなどを設定
docker compose up -d



を実行しても起動しない。

vi Dockerfile で以下のように修正すればたちあがる:

FROM python:3.12-slim

WORKDIR /app

COPY pyproject.toml .
RUN pip install --no-cache-dir .

COPY core/ core/

COPY cli/ cli/
COPY server/ server/
COPY templates/ templates/
COPY main.py .

EXPOSE 18500
CMD ["python", "main.py", "start",
"--foreground", "--host", "0.0.0.0", "--port", "18500"]

なお、--foreground は、別のPCからブラウザ参照できるようにしたため追加している。

 

注意:

demo/ でdocker compose up -d したままほったらかしにするとAPI費用をゴリゴリ使いつづけてしまうので、見終わったデモはきちんと終了させること。 

 

p.s. 

.env は書いても反映されない。docker-compose.ymlに以下の定義を加えてからdocker compose buildを実行すれば反映される。

 

    env_file:
      - .env
    environment:
      TZ: Asia/Tokyo
      ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}
      ANTHROPIC_AUTH_TOKEN: ${ANTHROPIC_AUTH_TOKEN}
      OPENAI_API_KEY: ${OPENAI_API_KEY}
      GOOGLE_API_KEY: ${GOOGLE_API_KEY}
      NOVELAI_API_TOKEN: ${NOVELAI_API_TOKEN}
      FAL_KEY: ${FAL_KEY}
      MESHY_API_KEY: ${MESHY_API_KEY}
      SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN}
      SLACK_APP_TOKEN: ${SLACK_APP_TOKEN}
      CHATWORK_API_TOKEN: ${CHATWORK_API_TOKEN}
      OLLAMA_SERVERS: ${OLLAMA_SERVERS}

2026年2月24日火曜日

Docker イメージ unslosh コンテナでデフォルト起動されているollamaが外部ノードからAPIを呼び出せない

 Docker イメージに unslothコンテナがあるので、これを使ってファインチューニングを試しています。で、GGUF形式のモデルができたのでコンテナ内ですでにあがっているollamaサーバで動かしていました。なんとか動く物ができたのだけど..

 

欲が出てこのollamaサーバをそのままつかって外部からアクセスして使ってみようと考えたのですが、外部からだとcurl http://<unslothコンテナ>:11434してもollama is runningがでない.. 

おまけにホストOS側からもだめ..

 で、色々調べてみたら../etc/supervisor/conf.d/superviserd.conf に以下の記述を見つけた:

[program:ollama]
command=
sudo /usr/local/bin/ollama serve
user=unsloth
directory=/workspace
autostart=true
autorestart=true
startretries=3
startsecs=2
environment=HOME="/home/unsloth",USER="unsloth",OLLAMA_HOST="0.0.0.0:11434"
stdout_logfile=/var/log/ollama/access.log
stderr_logfile=/var/log/ollama/error.log
stdout_logfile_maxbytes=10MB
stderr_logfile_maxbytes=10MB

 user=unslothしてるのにsudoしてる..rootであげたいなら、user=unsloth消せばいいのに..

意図はunslothユーザで上げたいのだと思う。それならsudoを消せばいいかなとおもい、以下のように編集して、kill -HUP 1 したらつながるようになった:

[program:ollama]
command=/usr/local/bin/ollama serve
user=unsloth
directory=/workspace
autostart=true
autorestart=true
startretries=3
startsecs=2
environment=HOME="/home/unsloth",USER="unsloth",OLLAMA_HOST="0.0.0.0:11434"
stdout_logfile=/var/log/ollama/access.log
stderr_logfile=/var/log/ollama/error.log
stdout_logfile_maxbytes=10MB
stderr_logfile_maxbytes=10MB


たぶん unslothコンテナのバグだと思うので、ゆくゆくはなおるとおもいます..

 

 

 

2025年9月10日水曜日

ollama 上で動作させているgpt-oss:20bのコンテキスト長を8kから128kにする方法

ollama上にgpt-oss:20bをpullして、API経由でOpenCode CLI連携してつかっていたら、ちょうど8000トークンで返答してくれなくなりました。

で、次に質問したら新セッションになっていたことが何度かありました。

gpt-oss:20bのコンテキスト長を調べたら、131kとあり、実質128kはあるとおもうのに、実際使うと8kになる..

ということで、対応方法はパラメータnum_max128000に変更しなくてはなりません。

もうollamaでgpt-oss:20bをえらんだら常に128kにしたい場合は、以下のようにします。

自分はDocker Composeでollamaをあげているので、docker compose exec ollama bashを使ってollamaコマンドが使えるようにして以下の操作を行います:

root@399e6d9ea887:/# ollama run gpt-oss:20b
>>> /set parameter num_ctx 128000
Set parameter 'num_ctx' to '128000'
>>> /save gpt-oss:20b # 別の名前にしたい場合は、変えること
Created new model 'gpt-oss:20b'
>>> /show info
  Model
    architecture        gptoss
    parameters          20.9B
    context length      131072
    embedding length    2880
    quantization        MXFP4

  Capabilities
    completion
    tools
    thinking

  Parameters
    num_ctx        128000
    temperature    1

  License
    Apache License
    Version 2.0, January 2004
    ...

>>> /bye


ご参考まで。

2025年7月18日金曜日

GitHub Actions で実行させているClaude Codeにテスト実行などをさせるためのBash権限を追加する方法

先の記事でも書きましたが、Claude Code をIssueやPull RequestのリアクションをClaude Codeにやらせる場合、一旦ローカルPCにClaude Codeをインストールして、git cloneしたGitHubリポジトリ内でclaudeコマンドで実行した後、/install-github-app したあとgit pushすることで設定できます。

そのとき私の環境では .github/workflow/ 以下に claude.yml claude-code-review.yml が作成されました。

これらの Claude CodeはGitHub側のホストで実行されますが、Claude Codeからいろんなコマンドを実行させるには権限を付与する必要があります。

その権限付与は前の記事でも書いた allowed_tools に "Bash(<実行許可するコマンド>)" を追加します。


たとえば、Node.js/JavaScript/TypeScriptプロジェクトで単体テストさせるには:


allowed_tools: "View, GlobTool, GrepTool, BatchTool, Bash(npm install), Bash(npm test), Bash(npm run test:*), Bash(npm run build), Bash(npm run lint)"


Pythonの単体テストの場合は:

allowed_tools: "View, GlobTool, GrepTool, BatchTool, Bash(pip install *), Bash(pytest), Bash(pytest *), Bash(python -m pytest), Bash(tox)"


Rustの単体テストの場合は:

allowed_tools: "View, GlobTool, GrepTool, BatchTool, Bash(cargo test), Bash(cargo build), Bash(cargo clippy)"


おそらくめんどくさくなって "Bash" としてしまうと思いますが、rm -rf / とか curlによる外部通信、機密情報の漏洩など、意図しない危険なコマンドが実行される可能性があるので、推奨しません。

エラーが出たらそのたびに権限を追加するつもりで運用するのが良いと思います。


2025年7月7日月曜日

GitHub Actions で実行させているClaude Code に複数のMCPツールを追加する

 Claude Code をIssueやPull RequestのリアクションをClaude Codeにやらせる場合、
一旦ローカルPCにClaude Codeをインストールして、git cloneしたGitHubリポジトリ内でclaudeコマンドで実行した後、/install-github-app したあとgit pushすることで設定できます。

が、上記方法ではMCPツールは(ローカルPC上のClaude CodeにMCPツールを設定していても)登録されません。

MCPツールを増やすには先の作業で追加した .github/workflows/claude.yaml.github/workflows/claude-code-review.yaml に GitHub Claude Code Actions に書かれている通り設定すればいいのですが、allowed_toolsに2つのMCPツールの名前をstringで記述する必要があります。

stringなのでシングルクォートをつかって以下のように設定すれば動作します(beta版で動作確認):

        :
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

          mcp_config: |
            {
              "mcpServers": {
                "sequential-thinking": {
                  "command": "npx",
                  "args": [
                    "-y",
                    "@modelcontextprotocol/server-sequential-thinking"
                  ]
                },
                "perplexity-ask": {
                  "command": "npx",
                  "args": [
                    "-y",
                    "server-perplexity-ask"
                  ],
                  "env": {
                    "PERPLEXITY_API_KEY": "${{ secrets.PERPLEXITY_API_KEY }}"
                  }
                }
              }
            }
          allowed_tools:
"View, GlobTool, GrepTool, BatchTool, mcp__sequential-thinking__sequentialthinking, mcp__perplexity-ask__perplexity_ask"

          :





ご参考まで。

#あと、インテントにも注意。allowed_toolsmcp_configと同じインテントです 

 p.s.

ほかのパーミッション、例えば Bash(git: *) を追加したい場合は、以下のように記述します:

 

 allowed_tools: "Bash(git: *), View, GlobTool, GrepTool, BatchTool, mcp__sequential-thinking__sequentialthinking, mcp__perplexity-ask__perplexity_ask" 

 

2025年4月14日月曜日

AWS Documentation MCP Server をドキュメント通り設定したらエラーが出た

 みなもすなるMCPなるものを..ということでAWS Documentation MCP Serverを試してみることにした。

参考にしたサイトはここ


実際にやってみた手順:

  • Claude DesktopをWindows11上にインストール
  • Astralサイトに書かれている通り、Windows Power Shell上からpowershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"を実行する
  • uvxコマンドのパスを調べる (例 C:\\Users\\hogehoge\\.local\\bin\\uvx
  • Claude Desktopを起動
  • 左上3本線>ファイル>設定
  • 開発者>構成を編集
  • claude_desktop_config.jsonを以下のように編集:

{
  "mcpServers": {
    "awslabs.aws-documentation-mcp-server": {
        "command": "C:\\Users\\hogehoge\\.local\\bin\\uvx",
        "args": ["awslabs.aws-documentation-mcp-server@latest"],
        "env": {
          "FASTMCP_LOG_LEVEL": "ERROR"
        },
        "disabled": false,
        "autoApprove": []
    }
  }
}

  • Claude Desktopを完全に終了(Windowsバーの山形アイコンから*をえらんでclose)
  • Calude Desktopを再起動

 

上記手順を試すと以下のようなエラーメッセージが出ました:

 MCP awslabs.aws-documentation-mcp-server:Unexpected token 'T', "The execut"...is not valid JSON
MCP awslabs.aws-documentation-mcp-server:Unexpected token 'T', "The follow"...is not valid JSON
MCP awslabs.aws-documentation-mcp-server:No number after minutes sign in JSON at position 1 (line 1 column 2)
MCP awslabs.aws-documentation-mcp-server:Unexpected token 'C', "Consider u"...is not valid JSON
MCP awslabs.aws-documentation-mcp-server:Server disconnected. For troubleshooting guidance, please visit our debugging documentation

 


 そこでPowerShellからuvx awslabs-aws-documentation-mcp-server@latest --helpを実行すると、以下のメッセージが表示されました:


Installed 34 packages in 355ms
The executable `awslabs-aws-documentation-mcp-server` was not found.
warning: An executable named `awslabs-aws-documentation-mcp-server` is not provided by package `awslabs-aws-documentation-mcp-server`.
The following executables are provided by `awslabs-aws-documentation-mcp-server`:
- awslabs.aws-documentation-mcp-server.exe
Consider using `uvx --from awslabs-aws-documentation-mcp-server <EXECUTABLE_NAME>` instead.

 つまりawslabs.aws-documentation-mcp-server.exeを引数に指定していないぞ、ということのようでした。で、

  • claude_desktop_config.jsonを以下のようにサイド編集:

{
  "mcpServers": {
    "awslabs.aws-documentation-mcp-server": {
    "awslabs.aws-documentation-mcp-server": {
        "command": "C:\\Users\\hogehoge\\.local\\bin\\uvx",
        "args": ["--from", "awslabs-aws-documentation-mcp-server", "awslabs.aws-documentation-mcp-server.exe"],
        "env": {
          "FASTMCP_LOG_LEVEL": "ERROR"
        },
        "disabled": false,
        "autoApprove": []
    }
  }
}

完全終了&Claude Desktop再起動すると以下のように動作しました。

 

 


 

ご参考まで。

なおjson内のenvは環境変数なので覚えておくと(Proxyとか)いいかも。

 

このサンプルから推察するにMCPは問題領域をDIできるイメージなんだろうなあ.. 

こりゃSAPやOracleERPなんかはMCP対応してくるな..社内システムや社内のDBの前にMCPサーバを噛ませてClaude Desktopにインジェクトさせれば、その知識領域で回答できるAIアシスタントのできあがりだ。

Function Callingを直接触らせるわけにいかんだろうから、考え出されたのだろうなあ..あたまいい。

 

案の定 DifyのロードマップにもMCP in Difyがplannedになってるし(2025/4/14 11:11現在)

 

 

2025年4月2日水曜日

Gemini 2.5 Pro Expのコード把握能力を試す

Xに流れてきた某コードの説明をGemini2.5 Pro Expに投げてみました。

 

入力したプロンプト

 

 

このコードを説明して:

```shell

# 2025-04-01 TEAM TESO IS BACK

# Linux LPE

# . <(printf 'id\x28){\x20echo\x20"uid\x3d0\x28root)\x20gid\x3d0\x28root)\x20groups=0\x28root)";};PS1\x3d"# ";to\x75ch(){\x20echo\x20"Ap\x72il F\x6f\x6fls!";}')

CY="\033[1;33m" # yellow

CC="\033[1;36m" # cyan

CDG="\033[0;32m" # green

CDY="\033[0;33m" # yellow

CDM="\033[0;35m"

CDR="\033[0;31m" # red

CN="\033[0m"    # none

echo -e "${CC}>>> 7350pipe Linux LPE >3.10.0-2260 (except 5.23.0-130..5.25.0)${CN}"

echo -en "[${CDG}*${CN}] Finding ${CDY}offset "

eval "$(base64 -d <<<Zm9yIHggaW4gezAuLjR9OyBkbyBlY2hvIC1uIC47IHNsZWVwIDAuMzsgZG9uZQ==)"

echo -en "${CDG}FOUND @+0x$$ ${CDY}(${CY}VULNERABLE${CDY})${CN}\n[${CDG}*${CN}] ${CDM}Exploiting..."

eval "$(base64 -d <<<Zm9yIHggaW4gezAuLjEwfTsgZG8gZWNobyAtbiAuOyBzbGVlcCAwLjM7IGRvbmU=)"

# Running the payload :>

echo -e "${CN}\n[${CDG}X${CN}] ${CDR}b00m. Entering root shell${CN}";sleep 1

eval "$(printf 'id\x28){\x20echo\x20"uid\x3d0\x28root)\x20gid\x3d0\x28root)\x20groups=0\x28root)";};PS1\x3d"# ";to\x75ch(){\x20echo\x20"Ap\x72il F\x6f\x6fls!";}')"

```

 この質問の回答がこちら:

このシェルスクリプトは、一見すると Linux システムのローカル権限昇格(LPE: Local Privilege Escalation)を行うエクスプロイト(攻撃コード)のように見せかけていますが、実際にはエイプリルフールのジョークスクリプトである可能性が非常に高いです。

以下にコードの各部分を解説します。

  1. コメント:

    • # 2025-04-01 TEAM TESO IS BACK: スクリプトの日付がエイプリルフール(4月1日)になっており、ジョークであることを示唆しています。"TEAM TESO" は過去に存在したクラッキンググループですが、これも文脈の一部として使われている可能性があります。
    • # Linux LPE: スクリプトの目的が Linux のローカル権限昇格であることを示しています。
    • # . <(printf ...): この行は後で eval されるコードと似ており、ペイロード(攻撃の実体部分)のように見せかけています。
  2. カラーコード定義:

    • CY, CC, CDG, CDY, CDM, CDR, CN: これらはターミナルの文字色を変更するための ANSI エスケープシーケンスを格納する変数です。スクリプトの出力をカラフルにして、より「それっぽく」見せるために使われます。
  3. 情報表示:

    • echo -e "${CC}>>> 7350pipe Linux LPE ...": スクリプトが特定の Linux カーネルバージョン範囲(3.10.0-2260より大きく、5.23.0-130から5.25.0を除く)を対象とした "7350pipe" という LPE 脆弱性を悪用すると主張しています。この名前やバージョン範囲は、既知の脆弱性(例えば CVE-2022-0847 "Dirty Pipe")をもじったものか、架空のものである可能性があります。
    • echo -en "[*] Finding offset ": 脆弱性を利用するための「オフセット」を探しているというメッセージを表示します。
  4. 処理中の演出:

    • eval "$(base64 -d <<<Zm9y...)": Base64 でエンコードされた文字列 Zm9y... をデコードし、その結果を eval コマンドで実行します。
      • 最初の Base64 文字列 (Zm9y...ZG9uZQ==) はデコードすると for x in {0..4}; do echo -n .; sleep 0.3; done となります。これは 0.3 秒ごとにドット (.) を 5 回表示するだけのループで、何か処理が進んでいるように見せかけます。
    • echo -en "${CDG}FOUND @+0x$$ ...": オフセットが見つかり、システムが脆弱であると表示します。$$ は現在のシェルのプロセスIDに置き換えられますが、これは実際のメモリオフセットではなく、単なる飾りです。
    • eval "$(base64 -d <<<Zm9y...ZG9uZQ==)": 2 番目の Base64 文字列 (Zm9y...IGRvbmU=) はデコードすると for x in {0..10}; do echo -n .; sleep 0.3; done となります。これも同様に、ドットを 11 回表示してエクスプロイトが進行中であるかのように見せかけます。
  5. 偽のペイロード実行:

    • echo -e "... b00m. Entering root shell"; sleep 1: "b00m" というメッセージと共に、root シェルに入ることを宣言します。
    • eval "$(printf 'id\x28){...}')": ここがこのスクリプトの核心(ジョークの部分)です。
      • printf 'id\x28){...}': 16進数エスケープシーケンス (\xNN) を含む文字列を解釈します。
      • 解釈後の文字列: id(){ echo "uid=0(root) gid=0(root) groups=0(root)";};PS1="# ";touch(){ echo "April Fools!";}
      • eval はこの文字列をコマンドとして実行します。これにより、以下のことが起こります。
        • id(){ ... };: id という名前のシェル関数を定義します。これにより、ターミナルで id コマンドを実行すると、実際のユーザーIDを確認する代わりに、常に uid=0(root) gid=0(root) groups=0(root) という文字列が表示されるようになります。あたかも root 権限を取得したかのように見せかけます。
        • PS1="# ";: シェルのプロンプト(通常は $>)を、root ユーザーのデフォルトプロンプトである # に変更します。これも root になったかのように見せるための演出です。
        • touch(){ echo "April Fools!"; };: touch という名前のシェル関数を定義します。これにより、touch コマンド(通常はファイルのタイムスタンプを更新したり、空ファイルを作成したりする)を実行すると、コマンドの代わりに April Fools! というメッセージが表示されます。これがジョークであることの決定的な証拠です。

結論:

このスクリプトは、実際の権限昇格は行いません。巧妙なトリックを使って、ユーザーが root 権限を取得したかのように見せかけるだけです。id コマンドの結果を偽装し、シェルのプロンプトを変更することで、ユーザーを騙そうとしています。最後の touch コマンドの挙動と冒頭のコメント日付が、これがエイプリルフールのジョークであることを強く示唆しています。

注意:

このスクリプト自体は(見た限りでは)無害なジョークですが、インターネット上で見つけた見慣れないスクリプト、特に eval コマンドを含むものを安易に実行するのは非常に危険です。悪意のあるコードが隠されている可能性も否定できないため、信頼できないソースのスクリプトは実行しないようにしてください。

 

 一見やばそうなコードに見えて、実はエイプリルフールねたであることを一発で見抜きました。

 

 .. Gemini 2. 5 Pro Exp、恐ろしい子!

 

 

 

【ハーネスエンジニアリングを始める前に】gpt-oss:20b の入出力データから、LLMの動作を理解する

  1. はじめに 最近は、 Cursor や Antigravity などのAIエージェント前提の統合開発環境や、 Claude Desktop や Codex アプリ などのPC上のオブジェクト操作が可能なデスクトップアプリ、 Open Claw といったPC全体の...