StrandsAgentsで構築したAI AgentをLangfuseでトレースしてみた
はじめに
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にします。
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の動作確認をします。
# 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でローカルにホストしたいと思います。
以下のドキュメントを参考にコマンドを実行します。
git clone https://github.com/langfuse/langfuse.git
cd langfuse
docker compose up -d
コンテナが起動したらブラウザでhttp://localhost:3000
を開きます
Sign up
を押下してCreate new account
画面でアカウントを作成してログインします。
ログインできたら+ New Organization
でOrganizationを作成します。
任意のOrganization名を入力してCreate
ボタンを押下します。
Organizationが作成できたら、続けてプロジェクトを作成します。
プロジェクト名を入力してCreate
ボタンを押下します。
プロジェクトが作成できたらCreate API Key
ボタンを押下してAPIキーを発行します。
.env
にAPIキー等を追記して、各種ライブラリをインストールします。
# 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周りの設定を追加します。
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
タブからトレース一覧が確認できます。
特定のトレースを押下すると詳細を確認することができ、使用したトークン数やAgentの挙動などが確認できます。
今回は3回のイベントループサイクルが行われたのちにタスクを終了しているようですね。
どのようにToolを使っているかも確認できますね。
まとめ
今回はLLMOpsの入門としてStrandsAgentsで作成したAgentをLangfuseでトレースしてみました。
Langfuseはトレース以外にもプロンプト管理や評価機能もあるようです。
これからいろんな機能を触っていきたいと思います。
どなたかの参考になれば幸いです。