TL;DR
Amazon Bedrock AgentCore runtime과 Amazon SageMaker AI의 OpenAI 호환 엔드포인트를 결합하면 Claude 계열 모델과 SageMaker의 Qwen 3.5 9B를 하나의 Strands Agents 멀티 에이전트 시스템에서 함께 사용할 수 있습니다. Orchestrator agent가 요청을 Budget agent와 Financial analysis agent로 분배하고, 각 전문 에이전트가 작업에 맞는 모델과 도구를 호출하는 구조입니다. SageMaker 호출에는 기본 token telemetry가 없으므로 gen_ai.chat OpenTelemetry span을 직접 만들고 result.metrics.accumulated_usage를 기록해야 하며, vLLM의 stream_options에 include_usage를 켜야 token 수가 채워집니다. 예시 trace에는 입력 1391개, 출력 1432개, 전체 2823개의 token이 기록됐고, AgentCore 배포와 AWS X-Ray 샘플링 설정까지 갖추면 비용·지연 시간·호출 흐름을 함께 추적할 수 있습니다.
섹션별 상세

region = "us-west-2"
model_id = "Qwen/Qwen3.5-9B"
instance_type = "ml.g6e.2xlarge" # 1x L40S (48GB VRAM)
num_gpu = 1 # vLLM 0.22.1, Python 3.12, CUDA 13.0, Ubuntu 22.04
inference_image = f"763104351884.dkr.ecr.{region}.amazonaws.com/vllm:0.22.1-gpu-py312-cu130-ubuntu22.04-sagemaker"
env = {
"SM_VLLM_MODEL": model_id,
"SM_VLLM_TENSOR_PARALLEL_SIZE": "1",
"SM_VLLM_MAX_MODEL_LEN": "32768",
}
# Create Model
sm.create_model(
ModelName=model_name,
ExecutionRoleArn=role,
PrimaryContainer={"Image": inference_image, "Environment": env},
)
# Create Endpoint Config + Endpoint
sm.create_endpoint_config(
EndpointConfigName=endpoint_config_name,
ProductionVariants=[{
"VariantName": "v1",
"ModelName": model_name,
"InstanceType": instance_type,
"InitialInstanceCount": 1,
"ContainerStartupHealthCheckTimeoutInSeconds": 1200,
"InferenceAmiVersion": inference_ami_version,
}],
)
sm.create_endpoint(EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name)vLLM 컨테이너를 사용해 Qwen 3.5 9B를 Amazon SageMaker AI 엔드포인트로 배포합니다.
import httpx
from openai import AsyncOpenAI
from sagemaker.core.token_generator import generate_token
class SageMakerAuth(httpx.Auth):
def __init__(self, region):
self.region = region
def auth_flow(self, request):
request.headers["Authorization"] = f"Bearer {generate_token(region=self.region)}"
yield request
strands_client = AsyncOpenAI(
base_url=f"https://runtime.sagemaker.{REGION}.amazonaws.com/endpoints/{ENDPOINT_NAME}/openai/v1",
api_key="sagemaker",
http_client=httpx.AsyncClient(auth=SageMakerAuth(region=REGION)),
)SageMaker OpenAI 호환 엔드포인트에 요청할 때마다 갱신되는 bearer token을 주입합니다.
qwen_model = OpenAIModel(
client=strands_client,
model_id="",
params={"temperature": 0.7, "max_tokens": 4096, "stream_options": {"include_usage": True}},
)vLLM streaming 응답의 마지막 usage chunk에서 token 수를 받을 수 있도록 설정합니다.
with tracer.start_as_current_span("gen_ai.chat", attributes={
"gen_ai.system": "openai",
"gen_ai.request.model": f"qwen3.5-9b ({SAGEMAKER_ENDPOINT_NAME})",
"gen_ai.operation.name": "chat",
}) as span:
fa_agent = Agent(
model=OpenAIModel(
client=strands_client,
model_id="",
params={"temperature": 0.7, "max_tokens": 4096, "stream_options": {"include_usage": True}},
),
system_prompt=FINANCIAL_ANALYSIS_PROMPT,
tools=[get_stock_analysis, create_diversified_portfolio, compare_stock_performance],
callback_handler=None,
)
result = fa_agent(query)
# Extract token usage from Strands agent metrics
usage = result.metrics.accumulated_usage
span.set_attribute("gen_ai.usage.input_tokens", usage.get("inputTokens", 0))
span.set_attribute("gen_ai.usage.output_tokens", usage.get("outputTokens", 0))
span.set_attribute("gen_ai.usage.total_tokens", usage.get("totalTokens", 0))
return str(result)SageMaker 모델 호출을 수동 gen_ai.chat span으로 감싸고 Strands 내부 metric에서 token 수를 기록합니다.
- Amazon SageMaker AI의 OpenAI 호환 엔드포인트는 Strands OpenAIModel을 통해 호출해도 token telemetry가 자동으로 생성되지 않는다. — Configure observability for SageMaker endpoints의 Invisible token usage 및 Root cause 단락
- result.metrics.accumulated_usage에서 inputTokens, outputTokens, totalTokens를 읽어 수동 gen_ai.chat span의 속성으로 기록할 수 있다. — The solution: Custom OpenTelemetry spans의 코드 블록 및 Key detail 단락
- Amazon Bedrock AgentCore runtime은 Bedrock 모델 호출을 자동 계측하지만 SageMaker OpenAI 엔드포인트에는 수동 span이 필요하다. — Key learnings 목록

- stream_options: {"include_usage": True}를 설정하지 않으면 vLLM streaming 응답에서 usage가 전달되지 않아 accumulated_usage가 0으로 남는다. — Why stream_options is mandatory for vLLM 단락과 코드 블록
- 예시 trace에 입력 1391개, 출력 1432개, 전체 2823개의 token이 기록됐다. — Example trace output 코드 블록
용어 해설
- 에이전틱 워크플로(Agentic Workflow)
- — 에이전틱 워크플로는 여러 AI 에이전트가 사용자의 요청을 분류하고 필요한 도구와 모델을 선택해 작업을 이어 가는 구조입니다. 이 글에서는 Orchestrator agent가 Budget agent와 Financial analysis agent로 작업을 분배하며, 각 에이전트가 Amazon Bedrock 또는 Amazon SageMaker AI의 모델을 호출합니다.
- OpenAI 호환 API(OpenAI-Compatible API)
- — OpenAI 호환 API는 OpenAI SDK가 사용하는 요청 형식과 인터페이스를 다른 모델 호스팅 환경에서도 사용할 수 있게 하는 API 방식입니다. Amazon SageMaker AI 엔드포인트는 이 인터페이스를 통해 Qwen 3.5 9B를 호출하며, bearer token 인증과 streaming 응답을 사용합니다.
- vLLM
- — vLLM은 대규모 언어 모델 추론을 제공하는 오픈소스 엔진으로, 이 글에서는 Qwen 3.5 9B를 Amazon SageMaker AI 실시간 엔드포인트에 배포하는 Deep Learning Container로 사용됩니다. streaming 응답에 token usage를 포함하려면 별도의 stream_options 설정이 필요합니다.
- OpenTelemetry
- — OpenTelemetry는 애플리케이션의 호출 흐름과 지연 시간 같은 텔레메트리를 수집하는 표준 프레임워크입니다. Amazon Bedrock AgentCore runtime은 에이전트를 자동 계측하지만 SageMaker의 OpenAIModel 호출은 자동으로 gen_ai.chat span을 만들지 않아 수동 span 생성이 필요합니다.
- gen_ai.chat span(gen_ai.chat Span)
- — gen_ai.chat span은 생성형 AI 모델 호출을 추적하는 OpenTelemetry span으로, 모델명과 입력·출력·전체 token 수 같은 속성을 담습니다. 이 글에서는 SageMaker 에이전트 호출을 직접 감싸고 result.metrics.accumulated_usage에서 token 수를 읽어 추적 데이터에 기록합니다.
기술
- Amazon SageMaker AI
- Amazon Bedrock AgentCore runtime
- Amazon Bedrock
- Strands Agents
- Qwen 3.5 9B
- Claude Haiku 4.5
- Claude Sonnet 4.6
- vLLM
- OpenAI-compatible API
- httpx.Auth
- AsyncOpenAI
- OpenTelemetry
- AWS X-Ray
- Amazon CloudWatch Transaction Search
- Python 3.12
- Pydantic
활용 사례
- 예산 배분을 위한 Budget agent와 주식 분석·포트폴리오 구성을 위한 Financial analysis agent의 협업
- Amazon Bedrock 모델과 Amazon SageMaker AI 호스팅 모델을 함께 사용하는 개인 금융 에이전트
- SageMaker에서 호스팅한 모델의 token 사용량, 비용, 지연 시간 추적
- 기본 모델과 Fine-tuned 모델의 A/B 테스트
- 질의 복잡도에 따른 비용 인식형 모델 라우팅
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.