Loading
Loading
AWS Bedrock is a managed service providing access to large AI models from multiple companies via a unified API.
Pay-per-token usage:
import json
# โโโ ู
ุญุงูุงุฉ Bedrock Runtime โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
class BedrockRuntime:
"""ู
ุญุงูุงุฉ boto3 bedrock-runtime client"""
MODELS = {
"anthropic.claude-3-haiku-20240307-v1:0": {
"name": "Claude 3 Haiku", "provider": "Anthropic",
"in_price": 0.00025, "out_price": 0.00125,
},
"anthropic.claude-3-sonnet-20240229-v1:0": {
"name": "Claude 3 Sonnet", "provider": "Anthropic",
"in_price": 0.003, "out_price": 0.015,
},
"amazon.titan-text-express-v1": {
"name": "Titan Text Express", "provider": "Amazon",
"in_price": 0.0002, "out_price": 0.0006,
},
}
def list_foundation_models(self) -> list:
return [
{"modelId": mid, "modelName": m["name"], "providerName": m["provider"]}
for mid, m in self.MODELS.items()
]
def invoke_model(self, modelId: str, body: dict) -> dict:
if modelId not in self.MODELS:
raise ValueError(f"ุงููู
ูุฐุฌ {modelId} ุบูุฑ ู
ุชุงุญ")
m = self.MODELS[modelId]
prompt = (body.get("messages") or [{"content": ""}])[-1].get("content", "")
in_tok = max(10, int(len(prompt.split()) * 1.3))
out_tok = 80
cost = (in_tok / 1000) * m["in_price"] + (out_tok / 1000) * m["out_price"]
return {
"content": [{"text": f"[{m['name']}] ุฑุฏูู ุนูู: {prompt[:50]}..."}],
"usage": {"input_tokens": in_tok, "output_tokens": out_tok},
"cost_usd": round(cost, 7),
}
# โโโ Claude Wrapper โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
class ClaudeOnBedrock:
def __init__(self, model: str = "anthropic.claude-3-haiku-20240307-v1:0"):
self._rt = BedrockRuntime()
self.model = model
self.total_cost = 0.0
self.total_calls = 0
def chat(self, message: str, system: str = "") -> str:
body = {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1024,
"system": system,
"messages": [{"role": "user", "content": message}],
}
resp = self._rt.invoke_model(self.model, body)
self.total_cost += resp["cost_usd"]
self.total_calls += 1
cost_str = "$" + f"{resp['cost_usd']:.7f}"
print(f" tokens: {resp['usage']['input_tokens']}in + {resp['usage']['output_tokens']}out | cost: {cost_str}")
return resp["content"][0]["text"]
def summary(self):
total_str = "$" + f"{self.total_cost:.6f}"
print(f"\n๐ ู
ูุฎุต ุงูุงุณุชุฎุฏุงู
:")
print(f" ุงูู
ูุงูู
ุงุช : {self.total_calls}")
print(f" ุฅุฌู
ุงูู ุงูุชูููุฉ : {total_str}")
# โโโ ุนุฑุถ ุงููู
ุงุฐุฌ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
runtime = BedrockRuntime()
print("๐ค ุงููู
ุงุฐุฌ ุงูู
ุชุงุญุฉ ุนูู AWS Bedrock:")
for m in runtime.list_foundation_models():
print(f" [{m['providerName']:<12}] {m['modelName']}")
print(f" ID: {m['modelId']}")
print()
# โโโ ุงุฎุชุจุงุฑ Claude 3 Haiku โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
print("=" * 55)
print("๐ฌ ุงุฎุชุจุงุฑ Claude 3 Haiku ุนุจุฑ Bedrock:")
print("=" * 55)
claude = ClaudeOnBedrock()
questions = [
("ู
ุง ูู AWS Bedrockุ", "ุฃุฌุจ ุจุฌู
ูุชูู ููุท ุจุงูุนุฑุจูุฉ"),
("ู
ุชู ุฃุณุชุฎุฏู
Haiku ุจุฏูุงู ู
ู Sonnetุ", "ุฌู
ูุฉ ูุงุญุฏุฉ ููุท"),
("ู
ุง ูู ู
ุฒุงูุง Bedrock ุนูู Claude APIุ", ""),
]
for q, sys_prompt in questions:
print(f"\nโ {q}")
answer = claude.chat(q, system=sys_prompt)
print(f"๐ก {answer}")
claude.summary()
print("\nโ
ุชู
ุงุฎุชุจุงุฑ AWS Bedrock ุจูุฌุงุญ!")