1
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?

OpenAI Agents SDK の「Sandbox Agents」と「Langfuse(今回は Python版)」を組み合わせてた処理過程の情報の取得

1
Posted at

はじめに

この記事は、Langfuse を軽く試してみた、という話の第二弾です。

第一弾の軽いお試しは、以下の記事に書いています。

●Langfuse を軽く試してみる: OpenAI SDK(JS/TS)の組み合わせ - Qiita
 https://qiita.com/youtoy/items/856c29f4e90728238f52

上記の第一弾は、JavaScript/TypeScript でのお試しでした。今回は Python を使ったお試しです。

今回 Python を使う理由は、以下の Langfuse関連ではない直近での OpenAI関連のお試しと組み合わせてみたかったためです。以下で扱った「Sandbox Agents」は現時点では Python版の OpenAI Agents SDK にしか対応していないため、今回は Python を使います。

●OpenAI Agents SDK の「Sandbox Agents」を Mac で軽く試してみる(「uv」を使いつつ) - Qiita
 https://qiita.com/youtoy/items/90d49c1f42642e39260e

今回扱う内容の概要は、上記の記事に書いているので、本記事ではお試しの流れをざっくり書くのみとします。

お試しの流れ

さっそくお試しの流れです。

下準備

OpenAI Agents SDK の Sandbox Agents を試した時と同様に、uv を使って進めていきます。以下のコマンドで、プロジェクトを初期化します。

uv init sandbox-quickstart
cd sandbox-quickstart

前の OpenAI Agents SDK の Sandbox Agents のお試しでは、uv で openai-agents を追加しましたが、今回は Langfuse 関連の内容も追加します。コマンドは、以下のとおりです。

# uv add openai-agents を以下に変更

uv add openai-agents langfuse openinference-instrumentation-openai-agents

それと、この後に出てくるコードを実行する際には、以下の環境変数が使える状態にしておきます。

OPENAI_API_KEY=【OpenAI の APIキー】
LANGFUSE_PUBLIC_KEY=【Langfuse の Secret Key】
LANGFUSE_SECRET_KEY=【Langfuse の Public Key】
LANGFUSE_BASE_URL=【Langfuse の Host Name】

コードと処理の実行結果

今回のコードは、以下のようにしました。前の OpenAI Agents SDK のお試しのコードをベースに、Python版の Langfuse を扱う処理を加えています。

import asyncio
from pathlib import Path

from agents import Runner
from agents.run import RunConfig
from agents.sandbox import Manifest, SandboxAgent, SandboxRunConfig
from agents.sandbox.capabilities import Capabilities
from agents.sandbox.entries import Dir, File
from agents.sandbox.sandboxes.unix_local import UnixLocalSandboxClient

from langfuse import get_client
from openinference.instrumentation.openai_agents import OpenAIAgentsInstrumentor

OpenAIAgentsInstrumentor().instrument()
langfuse = get_client()

BASE_DIR = Path(__file__).resolve().parent
WORKSPACE_DIR = BASE_DIR / ".sandbox-workspace"

TASK_TEXT = """output/squares.csv を次のルールで作成してください:
- ヘッダは n,square とする
- 1 から 30 までの整数について、各整数とその二乗の行を作る
- その後、次の集計行をこの順で追加する
  - TOTAL_ALL,<1 から 30 までの二乗の合計>
  - TOTAL_EVEN,<偶数だけの二乗の合計>
  - TOTAL_ODD,<奇数だけの二乗の合計>
  - DIFF,<TOTAL_EVEN - TOTAL_ODD>
  - CHECK,<公式 n(n+1)(2n+1)/6 を使って求めた 1 から 30 までの二乗和>
- TOTAL_ALL と CHECK は一致していなければならない
- 作成後、そのファイルの内容を表示して確認する
- 最後に、何を作成したかを簡潔に要約する
"""

def build_agent() -> SandboxAgent[None]:
    return SandboxAgent(
        name="CSV Builder",
        model="gpt-5.4",
        instructions=(
            "最初に task.md を読んでください。"
            "sandbox の filesystem と shell のツールを使ってください。"
            "指示どおりに output/squares.csv を作成してください。"
            "作成後、ファイル内容を表示して確認してください。"
            "必要なら Python を使って計算や検算をしてかまいません。"
            "最後の要約は短くしてください。"
        ),
        default_manifest=Manifest(
            root=str(WORKSPACE_DIR),
            entries={
                "task.md": File(content=TASK_TEXT.encode("utf-8")),
                "output": Dir(),
            },
        ),
        capabilities=Capabilities.default(),
    )

async def main() -> None:
    result = await Runner.run(
        build_agent(),
        "task.md を開いて、作業を完了してください。",
        run_config=RunConfig(
            sandbox=SandboxRunConfig(client=UnixLocalSandboxClient()),
            workflow_name="Sandbox CSV example",
        ),
    )

    print("=== エージェントの出力 ===")
    print(result.final_output)
    print()
    print("=== 生成される想定のファイル ===")
    print(WORKSPACE_DIR / "output" / "squares.csv")

    langfuse.flush()

if __name__ == "__main__":
    asyncio.run(main())

あとは、上で書いていた環境変数が設定されている状態で、以下のコマンドで処理を実行します。

uv run python main.py

少し待つと、ターミナルでは以下の出力が得られました。

2026-04-24_02-15-24.jpg

Langfuse側の確認

Langfuse側で得られている情報を確認していきます。

先日の「OpenAI SDK(JS/TS)+ Langfuse」のお試しの時のようなシンプルな 1往復のやりとりではなく、内部で複数ステップの処理がはしる内容だったので、その時のログよりずいぶんリッチな見た目のものになっています。

2026-04-24_02-17-45.jpg

上記画像の右上あたりを見ると、かかった費用などの情報が出ています。

次に、実行された処理がリストになっているものを見ると、以下のような内容になっていました。

2026-04-24_02-17-07.jpg

ちなみに、前回のお試しで処理を実行した後は、以下のような感じでした。

2026-04-27_23-02-54.jpg

先ほど、さくさんの行があったリストの処理内容について、画面内の「Filters」の部分を見ると概要が分かります。それを見ると、CHAIN や GENERATION、TOOL や AGENT といった種類の処理が混在していることが分かります。

2026-04-24_02-26-16.jpg

あらためて、先ほど複数行で書かれていた部分を少し拡大して見てみると、以下のような感じです。

2026-04-24_02-26-30.jpg

1回の処理全体がグラフとして可視化された部分も見てみます。ノードと矢印で構成されるグラフで、処理の流れや関係性が可視化されています。

2026-04-24_02-27-58.jpg

今のところ自分はまだ使いこなせてないところがありますが、多段の複雑な処理を解析したりする際などに便利に使えそうです。

1
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
1
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?