StrandsAgentsで構築したAI AgentをLangfuseでトレースしてみた

StrandsAgentsで構築したAI AgentをLangfuseでトレースしてみた

2025.10.16

はじめに

AI Agent開発が進む中でLLMOpsの重要性が改めて認識されつつあります。
プロンプトやツール構成の最適化をするためにはObservabilityが必要不可欠となり、それらを容易に実現できるツールとしてLangfuseがあります。
今回はStrandsAgents製のAI AgentをLangfuseでトレースしてみたいと思います。

StrandsAgentでAI Agentを作成

まずはじめにuvでPythonの実行環境を初期化して各種ライブラリをインストールします。

			
			uv init
uv add strands-agents strands-agents-tools dotenv argparse

		

作成するAgentはシンプルな構成としAWS Knowledge MCP ServerのみをToolとして持たせたAgentにします。

agent.py
			
			from dotenv import load_dotenv
from strands import Agent
from strands.models import BedrockModel
from mcp.client.streamable_http import streamablehttp_client
from strands.tools.mcp.mcp_client import MCPClient
import argparse

load_dotenv()

bedrock_model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0",
    region_name="us-west-2",
)

aws_knowledge_mcp_client = MCPClient(
    lambda: streamablehttp_client("https://knowledge-mcp.global.api.aws")
)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="AWS Knowledge Agent")
    parser.add_argument("query", type=str, help="質問内容")
    args = parser.parse_args()

    with aws_knowledge_mcp_client:
        aws_knowledge_mcp = aws_knowledge_mcp_client.list_tools_sync()
        tools = aws_knowledge_mcp

        agent = Agent(
            model=bedrock_model,
            tools=tools,
        )

        agent(args.query)


		

.envにAWSの認証情報を設定してAgentの動作確認をします。

.env
			
			# AWS
AWS_ACCESS_KEY_ID=xxx
AWS_SECRET_ACCESS_KEY=xxx

		

各種Toolを使って最新情報を取得し、回答してくれていることが確認できました。

			
			uv run python agent.py "AgentCoreはいつGAされましたか?"

AgentCoreについてのGA(一般提供開始)時期を調べます。
Tool #1: aws___search_documentation
検索結果から、Amazon Bedrock AgentCoreのGA時期について確認できました。詳細を確認するため、ブログ記事を読んでみます。
Tool #2: aws___read_documentation
Amazon Bedrock AgentCoreは**2025年10月13日**にGA(一般提供開始)されました。

AgentCoreは以下のような特徴を持つエージェントプラットフォームです:

- **任意のフレームワーク、モデル、プロトコル**を使用してエージェントを構築・デプロイ・運用可能
- **主要サービス**: Runtime、Gateway、Memory、Identity、Observability、Code Interpreter、Browser Tool

GAで追加された主な機能:
- VPC、AWS PrivateLink、CloudFormation、リソースタグのサポート
- Agent-to-Agent (A2A) プロトコルのサポート
- Model Context Protocol (MCP) サーバーへの接続
- IAM認証のサポート
- CloudWatch統合による包括的な可視性

**利用可能なリージョン**: 9つのAWSリージョン(バージニア北部、オハイオ、オレゴン、ムンバイ、シンガポール、シドニー、東京、フランクフルト、アイルランド)

プレビュー版は2025年7月から提供されていましたが、GAはその約3ヶ月後の10月となりました。%            

		

Langfuseの設定

LangfuseはSaaS版とself-hosted版があります。
今回は検証用途でのみ利用しますので、DockerComposeでローカルにホストしたいと思います。
以下のドキュメントを参考にコマンドを実行します。

https://langfuse.com/self-hosting/deployment/docker-compose

			
			git clone https://github.com/langfuse/langfuse.git
cd langfuse
docker compose up -d

		

コンテナが起動したらブラウザでhttp://localhost:3000を開きます
Sign upを押下してCreate new account画面でアカウントを作成してログインします。

Pasted image 20251016103530

ログインできたら+ New OrganizationでOrganizationを作成します。

Pasted image 20251016103425

任意のOrganization名を入力してCreateボタンを押下します。

2025-10-16-170

Pasted image 20251016135909

Organizationが作成できたら、続けてプロジェクトを作成します。
プロジェクト名を入力してCreateボタンを押下します。

2025-10-16-172

プロジェクトが作成できたらCreate API Keyボタンを押下してAPIキーを発行します。

Pasted image 20251016143914
Pasted image 20251016144103

.envにAPIキー等を追記して、各種ライブラリをインストールします。

.env
			
			# AWS
AWS_ACCESS_KEY_ID=xxx
AWS_SECRET_ACCESS_KEY=xxx

# Langfuse
+ LANGFUSE_SECRET_KEY=sk-lf-71ec2574-e68a-4efb-b894-bbb36a68b59d
+ LANGFUSE_PUBLIC_KEY=pk-lf-ca2462e7-dcb2-45d0-b229-4ee8c435163f
+ LANGFUSE_HOST="http://localhost:3000"

		
			
			uv add "strands-agents[otel]" strands-agents-tools langfuse uuid

		

以下のドキュメントを参考にagent.pyにもLangfuse周りの設定を追加します。

agent.py
			
			from dotenv import load_dotenv
from strands import Agent
from strands.models import BedrockModel
from mcp.client.streamable_http import streamablehttp_client
from strands.tools.mcp.mcp_client import MCPClient
import argparse
+ import os
+ import base64
+ from strands.telemetry import StrandsTelemetry
+ import uuid

load_dotenv()

+ LANGFUSE_PUBLIC_KEY = os.getenv("LANGFUSE_PUBLIC_KEY")
+ LANGFUSE_SECRET_KEY = os.getenv("LANGFUSE_SECRET_KEY")
+ LANGFUSE_HOST = os.getenv("LANGFUSE_HOST")

+ LANGFUSE_AUTH = base64.b64encode(
+     f"{LANGFUSE_PUBLIC_KEY}:{LANGFUSE_SECRET_KEY}".encode()
+ ).decode()

+ os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = LANGFUSE_HOST + "/api/public/otel"
+ os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = f"Authorization=Basic {LANGFUSE_AUTH}"

+ strands_telemetry = StrandsTelemetry().setup_otlp_exporter()

bedrock_model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0",
    region_name="us-west-2",
)

aws_knowledge_mcp_client = MCPClient(
    lambda: streamablehttp_client("https://knowledge-mcp.global.api.aws")
)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="AWS Knowledge Agent")
    parser.add_argument("query", type=str, help="質問内容")
    args = parser.parse_args()
    session_id = str(uuid.uuid4())

    with aws_knowledge_mcp_client:
        aws_knowledge_mcp = aws_knowledge_mcp_client.list_tools_sync()
        tools = aws_knowledge_mcp

        agent = Agent(
            model=bedrock_model,
            tools=tools,
+           trace_attributes={
+               "session.id": session_id,
+               "user.id": "test-user@example.com",
+               "langfuse.tags": ["Strands-Agent"],
+          },
        )

        agent(args.query)


		

動作確認

諸々の設定が終わったので最後に動作確認をします。

			
			uv run python agent.py "AgentCoreはいつGAされましたか?"

		

agent.pyを実行すると実行結果がLangfuse側にトレースされ、Tracingタブからトレース一覧が確認できます。

2025-10-16-175

特定のトレースを押下すると詳細を確認することができ、使用したトークン数やAgentの挙動などが確認できます。
今回は3回のイベントループサイクルが行われたのちにタスクを終了しているようですね。

Pasted image 20251016145132

どのようにToolを使っているかも確認できますね。

2025-10-16-181

まとめ

今回はLLMOpsの入門としてStrandsAgentsで作成したAgentをLangfuseでトレースしてみました。
Langfuseはトレース以外にもプロンプト管理や評価機能もあるようです。
これからいろんな機能を触っていきたいと思います。
どなたかの参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事