{"product_id":"claude-api-hướng-dẫn-từ-a-dến-z-cho-developer","title":"Claude API — Hướng dẫn từ A đến Z cho developer","description":"\n\u003ch2\u003eTại sao dùng Claude API?\u003c\/h2\u003e\n\u003cp\u003eClaude.ai là interface tuyệt vời cho người dùng cá nhân, nhưng nếu bạn muốn tích hợp Claude vào ứng dụng của mình — xây dựng chatbot, tự động hóa quy trình, hay tạo sản phẩm AI — bạn cần Anthropic API.\u003c\/p\u003e\n\n\u003cp\u003eAPI cho phép bạn:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003eGọi Claude programmatically từ bất kỳ ngôn ngữ lập trình nào\u003c\/li\u003e\n  \u003cli\u003eKiểm soát hoàn toàn system prompt, model, và parameters\u003c\/li\u003e\n  \u003cli\u003eXử lý nhiều requests song song\u003c\/li\u003e\n  \u003cli\u003eTích hợp vào CI\/CD pipeline hoặc workflow tự động hóa\u003c\/li\u003e\n  \u003cli\u003eBuild sản phẩm mà người dùng cuối tương tác với Claude qua giao diện của bạn\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003cp\u003eBài viết này hướng dẫn toàn bộ quy trình: từ lấy API key đến deploy production.\u003c\/p\u003e\n\n\u003ch2\u003eBước 1: Lấy API Key\u003c\/h2\u003e\n\n\u003col\u003e\n  \u003cli\u003eTruy cập \u003cstrong\u003econsole.anthropic.com\u003c\/strong\u003e\n\u003c\/li\u003e\n  \u003cli\u003eTạo tài khoản hoặc đăng nhập nếu đã có\u003c\/li\u003e\n  \u003cli\u003eVào mục \u003cstrong\u003eAPI Keys\u003c\/strong\u003e trong sidebar\u003c\/li\u003e\n  \u003cli\u003eNhấn \u003cstrong\u003eCreate Key\u003c\/strong\u003e\n\u003c\/li\u003e\n  \u003cli\u003eĐặt tên mô tả cho key (ví dụ: \"production-app\", \"local-dev\")\u003c\/li\u003e\n  \u003cli\u003eCopy key ngay — key chỉ hiển thị một lần duy nhất\u003c\/li\u003e\n\u003c\/ol\u003e\n\n\u003ch3\u003eBilling và Free tier\u003c\/h3\u003e\n\u003cp\u003eAPI không có free tier vĩnh viễn — bạn cần thêm payment method và được charge theo usage (số tokens). Tuy nhiên, Anthropic thường cung cấp credit miễn phí cho account mới để thử nghiệm.\u003c\/p\u003e\n\n\u003ch3\u003eBảo mật API Key\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# KHÔNG bao giờ commit API key vào git\n# Dùng environment variables\n\n# .env file (thêm .env vào .gitignore)\nANTHROPIC_API_KEY=sk-ant-...\n\n# Load trong Python\nimport os\nfrom anthropic import Anthropic\nclient = Anthropic(api_key=os.environ.get(\"ANTHROPIC_API_KEY\"))\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eBước 2: Cài đặt SDK\u003c\/h2\u003e\n\n\u003ch3\u003ePython SDK\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003epip install anthropic\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eNode.js \/ TypeScript SDK\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003enpm install @anthropic-ai\/sdk\n# hoặc\nyarn add @anthropic-ai\/sdk\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eKiểm tra cài đặt\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Python\npython3 -c \"import anthropic; print(anthropic.__version__)\"\n\n# Node.js\nnode -e \"const Anthropic = require('@anthropic-ai\/sdk'); console.log('OK')\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eBước 3: Messages API cơ bản\u003c\/h2\u003e\n\u003cp\u003eTất cả interactions với Claude đều qua \u003cstrong\u003eMessages API\u003c\/strong\u003e. Đây là request đơn giản nhất:\u003c\/p\u003e\n\n\u003ch3\u003ePython\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eimport anthropic\n\nclient = anthropic.Anthropic()  # Tự động lấy ANTHROPIC_API_KEY từ env\n\nmessage = client.messages.create(\n    model=\"claude-sonnet-4-5\",\n    max_tokens=1024,\n    messages=[\n        {\"role\": \"user\", \"content\": \"Xin chào! Bạn có thể giúp tôi viết một email không?\"}\n    ]\n)\n\nprint(message.content[0].text)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eNode.js\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eimport Anthropic from '@anthropic-ai\/sdk';\n\nconst client = new Anthropic(); \/\/ Tự động lấy ANTHROPIC_API_KEY từ env\n\nconst message = await client.messages.create({\n  model: 'claude-sonnet-4-5',\n  max_tokens: 1024,\n  messages: [\n    { role: 'user', content: 'Xin chào! Bạn có thể giúp tôi viết một email không?' }\n  ]\n});\n\nconsole.log(message.content[0].text);\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eRoles trong Messages API\u003c\/h2\u003e\n\u003cp\u003eMessages API sử dụng ba roles để cấu trúc hội thoại:\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003esystem:\u003c\/strong\u003e Hướng dẫn tổng thể cho Claude — định nghĩa vai trò, phong cách, quy tắc\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003euser:\u003c\/strong\u003e Tin nhắn từ người dùng\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eassistant:\u003c\/strong\u003e Tin nhắn từ Claude (dùng trong multi-turn conversations)\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eDùng system prompt\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003emessage = client.messages.create(\n    model=\"claude-sonnet-4-5\",\n    max_tokens=1024,\n    system=\"Bạn là một trợ lý customer service cho công ty thương mại điện tử. \"\n           \"Luôn lịch sự, hữu ích, và trả lời bằng tiếng Việt. \"\n           \"Nếu không biết câu trả lời, hãy chuyển sang bộ phận hỗ trợ.\",\n    messages=[\n        {\"role\": \"user\", \"content\": \"Đơn hàng của tôi bị delay, tôi phải làm gì?\"}\n    ]\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eMulti-turn Conversations\u003c\/h2\u003e\n\u003cp\u003eClaude không tự lưu lịch sử hội thoại — bạn phải truyền toàn bộ history trong mỗi request:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003econversation_history = []\n\ndef chat(user_message):\n    conversation_history.append({\n        \"role\": \"user\",\n        \"content\": user_message\n    })\n\n    response = client.messages.create(\n        model=\"claude-sonnet-4-5\",\n        max_tokens=1024,\n        system=\"Bạn là trợ lý lập trình Python hữu ích.\",\n        messages=conversation_history\n    )\n\n    assistant_message = response.content[0].text\n\n    conversation_history.append({\n        \"role\": \"assistant\",\n        \"content\": assistant_message\n    })\n\n    return assistant_message\n\n# Sử dụng\nprint(chat(\"Giải thích list comprehension trong Python\"))\nprint(chat(\"Cho tôi ví dụ phức tạp hơn\"))\nprint(chat(\"Khi nào nên dùng list comprehension thay vì for loop?\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eQuản lý context window\u003c\/h3\u003e\n\u003cp\u003eContext window của Claude là 200K tokens. Với conversation dài, bạn cần chiến lược quản lý:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSliding window:\u003c\/strong\u003e Chỉ giữ N tin nhắn gần nhất\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSummarization:\u003c\/strong\u003e Tóm tắt phần đầu conversation khi quá dài\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSelective memory:\u003c\/strong\u003e Chỉ giữ những turns quan trọng\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eStreaming Responses\u003c\/h2\u003e\n\u003cp\u003eStreaming cho phép hiển thị phản hồi từng chữ ngay khi Claude generate — giảm perceived latency đáng kể, đặc biệt cho response dài.\u003c\/p\u003e\n\n\u003ch3\u003ePython streaming\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003ewith client.messages.stream(\n    model=\"claude-sonnet-4-5\",\n    max_tokens=1024,\n    messages=[{\"role\": \"user\", \"content\": \"Viết một bài thơ về Hà Nội\"}]\n) as stream:\n    for text in stream.text_stream:\n        print(text, end=\"\", flush=True)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eNode.js streaming\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003econst stream = await client.messages.stream({\n  model: 'claude-sonnet-4-5',\n  max_tokens: 1024,\n  messages: [{ role: 'user', content: 'Viết một bài thơ về Hà Nội' }]\n});\n\nfor await (const chunk of stream) {\n  if (chunk.type === 'content_block_delta' \u0026amp;\u0026amp; chunk.delta.type === 'text_delta') {\n    process.stdout.write(chunk.delta.text);\n  }\n}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVision API — Phân tích hình ảnh\u003c\/h2\u003e\n\u003cp\u003eTruyền hình ảnh vào Messages API bằng cách thêm image content block:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport base64\n\n# Đọc và encode ảnh\nwith open(\"screenshot.png\", \"rb\") as f:\n    image_data = base64.standard_b64encode(f.read()).decode(\"utf-8\")\n\nmessage = client.messages.create(\n    model=\"claude-sonnet-4-5\",\n    max_tokens=1024,\n    messages=[\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\n                    \"type\": \"image\",\n                    \"source\": {\n                        \"type\": \"base64\",\n                        \"media_type\": \"image\/png\",\n                        \"data\": image_data,\n                    },\n                },\n                {\n                    \"type\": \"text\",\n                    \"text\": \"Mô tả UI trong screenshot này và gợi ý cải thiện UX.\"\n                }\n            ],\n        }\n    ],\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eCũng có thể dùng URL trực tiếp thay vì base64 (ảnh phải publicly accessible).\u003c\/p\u003e\n\n\u003ch2\u003eTool Use — Function Calling\u003c\/h2\u003e\n\u003cp\u003eTool use cho phép Claude gọi các function bạn định nghĩa — đây là nền tảng để xây dựng AI agents có thể tương tác với hệ thống bên ngoài.\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003etools = [\n    {\n        \"name\": \"get_weather\",\n        \"description\": \"Lấy thông tin thời tiết hiện tại cho một thành phố\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"city\": {\n                    \"type\": \"string\",\n                    \"description\": \"Tên thành phố, ví dụ 'Hà Nội', 'TP. HCM'\"\n                },\n                \"unit\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"celsius\", \"fahrenheit\"],\n                    \"description\": \"Đơn vị nhiệt độ\"\n                }\n            },\n            \"required\": [\"city\"]\n        }\n    }\n]\n\nresponse = client.messages.create(\n    model=\"claude-sonnet-4-5\",\n    max_tokens=1024,\n    tools=tools,\n    messages=[\n        {\"role\": \"user\", \"content\": \"Thời tiết Hà Nội hôm nay thế nào?\"}\n    ]\n)\n\n# Kiểm tra nếu Claude muốn dùng tool\nif response.stop_reason == \"tool_use\":\n    tool_use = next(block for block in response.content if block.type == \"tool_use\")\n    tool_name = tool_use.name\n    tool_input = tool_use.input\n\n    # Gọi function thực tế\n    if tool_name == \"get_weather\":\n        weather_result = get_weather(tool_input[\"city\"], tool_input.get(\"unit\", \"celsius\"))\n\n    # Trả kết quả cho Claude\n    final_response = client.messages.create(\n        model=\"claude-sonnet-4-5\",\n        max_tokens=1024,\n        tools=tools,\n        messages=[\n            {\"role\": \"user\", \"content\": \"Thời tiết Hà Nội hôm nay thế nào?\"},\n            {\"role\": \"assistant\", \"content\": response.content},\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"tool_result\",\n                        \"tool_use_id\": tool_use.id,\n                        \"content\": str(weather_result)\n                    }\n                ]\n            }\n        ]\n    )\n    print(final_response.content[0].text)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eError Handling\u003c\/h2\u003e\n\u003cp\u003eXử lý errors đúng cách là bắt buộc trong production:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\nfrom anthropic import APIConnectionError, RateLimitError, APIStatusError\n\nclient = anthropic.Anthropic()\n\ntry:\n    message = client.messages.create(\n        model=\"claude-sonnet-4-5\",\n        max_tokens=1024,\n        messages=[{\"role\": \"user\", \"content\": \"Hello\"}]\n    )\n    print(message.content[0].text)\n\nexcept RateLimitError as e:\n    print(f\"Rate limit exceeded. Retry after: {e.response.headers.get('retry-after')}\")\n    # Implement exponential backoff\n\nexcept APIConnectionError as e:\n    print(f\"Connection error: {e}\")\n    # Retry với backoff\n\nexcept APIStatusError as e:\n    print(f\"API error {e.status_code}: {e.message}\")\n    if e.status_code == 529:\n        print(\"API overloaded, retry later\")\n    elif e.status_code == 401:\n        print(\"Invalid API key\")\n    elif e.status_code == 400:\n        print(f\"Bad request: {e.body}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eRate Limits\u003c\/h2\u003e\n\u003cp\u003eAnthropic áp dụng rate limits theo account tier:\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eTier\u003c\/th\u003e\n      \u003cth\u003eRequests\/min\u003c\/th\u003e\n      \u003cth\u003eTokens\/min\u003c\/th\u003e\n      \u003cth\u003eTokens\/ngày\u003c\/th\u003e\n    \u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTier 1 (mới)\u003c\/td\u003e\n      \u003ctd\u003e50\u003c\/td\u003e\n      \u003ctd\u003e50,000\u003c\/td\u003e\n      \u003ctd\u003e1,000,000\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTier 2\u003c\/td\u003e\n      \u003ctd\u003e1,000\u003c\/td\u003e\n      \u003ctd\u003e100,000\u003c\/td\u003e\n      \u003ctd\u003e2,500,000\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTier 3\u003c\/td\u003e\n      \u003ctd\u003e2,000\u003c\/td\u003e\n      \u003ctd\u003e200,000\u003c\/td\u003e\n      \u003ctd\u003e5,000,000\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTier 4\u003c\/td\u003e\n      \u003ctd\u003e4,000\u003c\/td\u003e\n      \u003ctd\u003e400,000\u003c\/td\u003e\n      \u003ctd\u003e10,000,000\u003c\/td\u003e\n    \u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003eTier tăng dần khi account có lịch sử sử dụng và thanh toán. Implement exponential backoff khi gặp 429 (rate limit error).\u003c\/p\u003e\n\n\u003ch2\u003ePrompt Caching — Tiết kiệm chi phí\u003c\/h2\u003e\n\u003cp\u003ePrompt caching cho phép cache phần đầu của prompt (thường là system prompt dài hoặc large documents) để giảm chi phí cho requests lặp đi lặp lại với cùng context:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eresponse = client.messages.create(\n    model=\"claude-sonnet-4-5\",\n    max_tokens=1024,\n    system=[\n        {\n            \"type\": \"text\",\n            \"text\": \"Bạn là trợ lý phân tích pháp lý. Dưới đây là toàn bộ bộ luật dân sự Việt Nam...\",\n            \"cache_control\": {\"type\": \"ephemeral\"}  # Cache phần này\n        }\n    ],\n    messages=[{\"role\": \"user\", \"content\": \"Điều 123 quy định gì?\"}]\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003ePhần được cache chỉ tính 10% giá input token (thay vì 100%) cho các requests tiếp theo. Đặc biệt hiệu quả khi:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003eSystem prompt rất dài (hàng nghìn tokens)\u003c\/li\u003e\n  \u003cli\u003ePhân tích cùng một document nhiều lần\u003c\/li\u003e\n  \u003cli\u003eRAG với large context được dùng nhiều lần\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eTối ưu chi phí\u003c\/h2\u003e\n\n\u003ch3\u003eChọn đúng model\u003c\/h3\u003e\n\u003cp\u003eChi phí API khác nhau đáng kể giữa các model (tính per million tokens):\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eModel\u003c\/th\u003e\n      \u003cth\u003eInput\u003c\/th\u003e\n      \u003cth\u003eOutput\u003c\/th\u003e\n      \u003cth\u003eKhi nào dùng\u003c\/th\u003e\n    \u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eClaude Opus 4\u003c\/td\u003e\n      \u003ctd\u003e$15\u003c\/td\u003e\n      \u003ctd\u003e$75\u003c\/td\u003e\n      \u003ctd\u003eTasks phức tạp, cần chất lượng cao nhất\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eClaude Sonnet 4\u003c\/td\u003e\n      \u003ctd\u003e$3\u003c\/td\u003e\n      \u003ctd\u003e$15\u003c\/td\u003e\n      \u003ctd\u003eHầu hết production use cases\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eClaude Haiku 3.5\u003c\/td\u003e\n      \u003ctd\u003e$0.80\u003c\/td\u003e\n      \u003ctd\u003e$4\u003c\/td\u003e\n      \u003ctd\u003eHigh volume, simple tasks\u003c\/td\u003e\n    \u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003ch3\u003eCác kỹ thuật tiết kiệm\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eDùng Haiku cho pre-filtering:\u003c\/strong\u003e Dùng Haiku để phân loại\/filter requests đơn giản, chỉ escalate lên Sonnet\/Opus khi thực sự cần\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eOptimize max_tokens:\u003c\/strong\u003e Set max_tokens phù hợp — đừng set quá cao cho mọi request\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePrompt caching:\u003c\/strong\u003e Cache system prompt dài để giảm chi phí\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eBatch processing:\u003c\/strong\u003e Dùng Anthropic Batch API cho jobs offline (giảm 50% chi phí)\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eBest Practices cho Production\u003c\/h2\u003e\n\n\u003ch3\u003eLogging và monitoring\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eimport logging\nimport time\n\ndef create_message_with_logging(messages, model=\"claude-sonnet-4-5\"):\n    start_time = time.time()\n\n    response = client.messages.create(\n        model=model,\n        max_tokens=1024,\n        messages=messages\n    )\n\n    duration = time.time() - start_time\n\n    logging.info({\n        \"model\": model,\n        \"input_tokens\": response.usage.input_tokens,\n        \"output_tokens\": response.usage.output_tokens,\n        \"duration_ms\": round(duration * 1000),\n        \"stop_reason\": response.stop_reason\n    })\n\n    return response\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eTimeout và retry\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eimport anthropic\nfrom tenacity import retry, stop_after_attempt, wait_exponential\n\nclient = anthropic.Anthropic(timeout=30.0)  # 30 giây timeout\n\n@retry(\n    stop=stop_after_attempt(3),\n    wait=wait_exponential(multiplier=1, min=4, max=10)\n)\ndef resilient_create(messages):\n    return client.messages.create(\n        model=\"claude-sonnet-4-5\",\n        max_tokens=1024,\n        messages=messages\n    )\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eInput validation\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eValidate và sanitize user input trước khi đưa vào prompt\u003c\/li\u003e\n  \u003cli\u003eSet message length limits để tránh token overflow\u003c\/li\u003e\n  \u003cli\u003eImplement content moderation nếu nhận input từ user không tin cậy\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eSecurity\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eKhông expose API key ra client-side (browser)\u003c\/li\u003e\n  \u003cli\u003eLuôn call API từ server-side\u003c\/li\u003e\n  \u003cli\u003eImplement authentication cho API endpoints của bạn\u003c\/li\u003e\n  \u003cli\u003eMonitor usage để phát hiện bất thường sớm\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eExtended Thinking qua API\u003c\/h2\u003e\n\u003cp\u003eExtended Thinking cho phép Claude \"suy nghĩ\" dài hơn trước khi trả lời — hiệu quả cho các bài toán phức tạp:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eresponse = client.messages.create(\n    model=\"claude-opus-4\",  # Extended Thinking hỗ trợ Opus 4 và Sonnet 4\n    max_tokens=16000,\n    thinking={\n        \"type\": \"enabled\",\n        \"budget_tokens\": 10000  # Số tokens cho thinking\n    },\n    messages=[\n        {\n            \"role\": \"user\",\n            \"content\": \"Phân tích trade-offs giữa microservices và monolith cho startup 5 người với 10K users.\"\n        }\n    ]\n)\n\n# Kết quả có thể chứa cả thinking blocks và text blocks\nfor block in response.content:\n    if block.type == \"thinking\":\n        print(\"=== Thinking ===\")\n        print(block.thinking)\n    elif block.type == \"text\":\n        print(\"=== Response ===\")\n        print(block.text)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eBatch API — Xử lý hàng loạt\u003c\/h2\u003e\n\u003cp\u003eVới tasks offline không cần response realtime (ví dụ: xử lý hàng nghìn records qua đêm), Batch API giúp giảm chi phí 50% so với API thông thường:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\n\nclient = anthropic.Anthropic()\n\n# Tạo batch với nhiều requests\nmessage_batch = client.messages.batches.create(\n    requests=[\n        {\n            \"custom_id\": \"product-001\",\n            \"params\": {\n                \"model\": \"claude-haiku-3-5\",\n                \"max_tokens\": 512,\n                \"messages\": [{\"role\": \"user\", \"content\": \"Viết mô tả 50 từ cho sản phẩm: Áo thun cotton trắng size M\"}]\n            }\n        },\n        {\n            \"custom_id\": \"product-002\",\n            \"params\": {\n                \"model\": \"claude-haiku-3-5\",\n                \"max_tokens\": 512,\n                \"messages\": [{\"role\": \"user\", \"content\": \"Viết mô tả 50 từ cho sản phẩm: Quần jeans xanh slim fit\"}]\n            }\n        }\n        # Có thể thêm hàng nghìn requests\n    ]\n)\n\nprint(f\"Batch ID: {message_batch.id}\")\n\n# Kiểm tra status sau đó\nbatch_status = client.messages.batches.retrieve(message_batch.id)\nprint(f\"Status: {batch_status.processing_status}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eBatch API xử lý trong vòng 24 giờ. Phù hợp cho: generating product descriptions, moderating large datasets, translating content libraries.\u003c\/p\u003e\n\n\u003ch2\u003eAnthropic API vs Claude.ai — Chọn gì?\u003c\/h2\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eTiêu chí\u003c\/th\u003e\n      \u003cth\u003eClaude.ai (Web\/App)\u003c\/th\u003e\n      \u003cth\u003eAnthropic API\u003c\/th\u003e\n    \u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eĐối tượng\u003c\/td\u003e\n      \u003ctd\u003eEnd users, cá nhân\u003c\/td\u003e\n      \u003ctd\u003eDevelopers, doanh nghiệp\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eChi phí\u003c\/td\u003e\n      \u003ctd\u003e$0-$25\/user\/tháng\u003c\/td\u003e\n      \u003ctd\u003ePay per token (biến đổi)\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTraining data\u003c\/td\u003e\n      \u003ctd\u003eCó (opt-out được)\u003c\/td\u003e\n      \u003ctd\u003eKhông\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eCustomization\u003c\/td\u003e\n      \u003ctd\u003eHạn chế\u003c\/td\u003e\n      \u003ctd\u003eHoàn toàn kiểm soát\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eIntegration\u003c\/td\u003e\n      \u003ctd\u003eStandalone app\u003c\/td\u003e\n      \u003ctd\u003eTích hợp vào bất kỳ app\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eArtifacts\u003c\/td\u003e\n      \u003ctd\u003eCó giao diện visual\u003c\/td\u003e\n      \u003ctd\u003eChỉ text output\u003c\/td\u003e\n    \u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003eQuy tắc chung: Nếu bạn đang \u003cem\u003ebuild sản phẩm\u003c\/em\u003e, dùng API. Nếu bạn đang \u003cem\u003edùng Claude cho bản thân\u003c\/em\u003e, dùng claude.ai.\u003c\/p\u003e\n\n\u003ch2\u003eTesting và development workflow\u003c\/h2\u003e\n\n\u003ch3\u003eDùng Workbench để prototype prompts\u003c\/h3\u003e\n\u003cp\u003eTrước khi code, dùng \u003cstrong\u003econsole.anthropic.com\/workbench\u003c\/strong\u003e để test prompts interactively. Workbench cho phép:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003eTest prompts với các model khác nhau\u003c\/li\u003e\n  \u003cli\u003eĐiều chỉnh parameters (temperature, max_tokens) trực tiếp\u003c\/li\u003e\n  \u003cli\u003eExport code snippets Python\/TypeScript ngay từ Workbench\u003c\/li\u003e\n  \u003cli\u003eSo sánh output giữa các model song song\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eUnit testing với mock responses\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eimport unittest\nfrom unittest.mock import MagicMock, patch\n\nclass TestMyAIFeature(unittest.TestCase):\n\n    @patch('anthropic.Anthropic')\n    def test_summarize_text(self, mock_anthropic):\n        # Mock Claude response\n        mock_client = MagicMock()\n        mock_anthropic.return_value = mock_client\n\n        mock_response = MagicMock()\n        mock_response.content[0].text = \"Tóm tắt: văn bản nói về X.\"\n        mock_client.messages.create.return_value = mock_response\n\n        # Test function của bạn\n        result = summarize_text(\"Văn bản dài...\")\n        self.assertIn(\"Tóm tắt\", result)\n\n        # Verify API được gọi đúng\n        mock_client.messages.create.assert_called_once()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eResources tiếp theo\u003c\/h2\u003e\n\u003cp\u003eĐể đi sâu hơn vào Claude API:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003edocs.anthropic.com\u003c\/strong\u003e — Official documentation đầy đủ nhất\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003econsole.anthropic.com\/workbench\u003c\/strong\u003e — Prototype và test prompts\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003egithub.com\/anthropics\/anthropic-cookbook\u003c\/strong\u003e — Code examples và patterns thực tế\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eanthropic.com\/research\u003c\/strong\u003e — Papers về Constitutional AI và kỹ thuật đằng sau Claude\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eKết luận\u003c\/h2\u003e\n\u003cp\u003eAnthropic API là một trong những AI API được thiết kế tốt nhất hiện nay — documentation rõ ràng, SDK ổn định, và tính năng phong phú từ streaming đến tool use đến vision.\u003c\/p\u003e\n\n\u003cp\u003eĐiểm mấu chốt để thành công với Claude API trong production là: xử lý errors đúng cách, implement retry logic, chọn model phù hợp với use case và budget, và monitor usage liên tục. Với nền tảng đó, Claude API có thể xử lý quy mô từ prototype đến production của hàng triệu requests.\u003c\/p\u003e\n\n\u003cp\u003eTài liệu chính thức đầy đủ có tại \u003cstrong\u003edocs.anthropic.com\u003c\/strong\u003e — luôn là nguồn tham khảo đáng tin cậy nhất khi có thắc mắc về tính năng cụ thể.\u003c\/p\u003e\n\n\u003chr\u003e\n\u003ch3\u003eBài viết liên quan\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/building-effective-agents-v%E1%BB%9Bi-claude-h%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-ki%E1%BA%BFn-truc\"\u003eBuilding Effective Agents với Claude — Hướng dẫn kiến trúc\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/developer-playbook-claude-cho-l%E1%BA%ADp-trinh-vien\"\u003eDeveloper Playbook — Claude cho lập trình viên\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-code-toan-t%E1%BA%ADp-l%E1%BA%ADp-trinh-v%E1%BB%9Bi-ai-agent-trong-terminal\"\u003eClaude Code toàn tập — Lập trình với AI agent trong terminal\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/calculator-tool-bai-h%E1%BB%8Dc-d%E1%BA%A7u-tien-v%E1%BB%81-tool-use-v%E1%BB%9Bi-claude\"\u003eCalculator Tool — Bài học đầu tiên về Tool Use với Claude\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-engineering-system-design-interviews-va-planning\"\u003eClaude cho Engineering: System Design interviews và planning\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721067938004,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/claude-api-h_ng-d_n-t_-a-d_n-z-cho-developer.jpg?v=1774521090","url":"https:\/\/claude.vn\/en\/products\/claude-api-h%c6%b0%e1%bb%9bng-d%e1%ba%abn-t%e1%bb%ab-a-d%e1%ba%bfn-z-cho-developer","provider":"CLAUDE.VN","version":"1.0","type":"link"}