Qua 3 năm triển khai LangChain trong các dự án AI enterprise, tôi đã gặp vô số trường hợp agents chết máy, timeout không rõ nguyên nhân, và chi phí API phình to vì không tận dụng được streaming. Bài viết này tổng hợp kinh nghiệm thực chiến của tôi, kèm code production-ready và chi phí thực tế 2026 để bạn có thể áp dụng ngay.
Bối cảnh chi phí AI 2026: Tại sao async và streaming quan trọng
Trước khi đi vào kỹ thuật, hãy làm rõ lý do tài chính. Dữ liệu giá được xác minh từ các nhà cung cấp hàng đầu:
- GPT-4.1: Output $8/MTok — cao nhất trong nhóm
- Claude Sonnet 4.5: Output $15/MTok — đắt nhất thị trường
- Gemini 2.5 Flash: Output $2.50/MTok — cân bằng giữa giá và chất lượng
- DeepSeek V3.2: Output $0.42/MTok — tiết kiệm nhất, chỉ bằng 1/20 giá Claude
Với workload 10 triệu token/tháng, đây là bảng so sánh chi phí:
| Model | Chi phí/tháng | Ghi chú |
|---|---|---|
| GPT-4.1 | $80 | Baseline |
| Claude Sonnet 4.5 | $150 | Đắt nhất |
| Gemini 2.5 Flash | $25 | Tiết kiệm 69% |
| DeepSeek V3.2 | $4.20 | Tiết kiệm 95% |
Điều tôi nhận ra sau khi tối ưu async + streaming: cùng một task, chi phí giảm 40-60% vì tránh được các API call thừa và xử lý nhanh hơn. Streaming còn cho phép hiển thị phản hồi ngay lập tức, cải thiện trải nghiệm người dùng đáng kể.
Kiến trúc Agent bất đồng bộ với LangChain
Trong các dự án thực tế, tôi thường gặp 2 vấn đề cổ điển: agent chờ response hoàn chỉnh (blocking) và không tận dụng được token-by-token streaming. Giải pháp là xây dựng kiến trúc async ngay từ đầu.
import asyncio
import os
from typing import AsyncGenerator, List, Dict, Any
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from langchain_core.outputs import ChatGenerationChunk, AIMessageChunk
from dataclasses import dataclass, field
from datetime import datetime
@dataclass
class TokenUsage:
prompt_tokens: int = 0
completion_tokens: int = 0
total_tokens: int = 0
cost_usd: float = 0.0
latency_ms: float = 0.0
class AsyncStreamingAgent:
"""
Agent bất đồng bộ với streaming token-by-token.
Tích hợp HolySheep AI với giá tiết kiệm 85%+.
"""
def __init__(
self,
api_key: str,
model: str = "deepseek-chat",
base_url: str = "https://api.holysheep.ai/v1"
):
self.base_url = base_url
self.model = model
self.usage = TokenUsage()
# Khởi tạo LLM với streaming
self.llm = ChatOpenAI(
model=model,
api_key=api_key,
base_url=base_url,
streaming=True,
max_retries=3,
timeout=120
)
# Pricing lookup (USD per million tokens - output)
self.pricing = {
"gpt-4.1": 8.0,
"claude-sonnet-4.5": 15.0,
"gemini-2.5-flash": 2.50,
"deepseek-chat": 0.42,
"deepseek-v3": 0.42
}
async def stream_response(
self,
messages: List[Dict[str, str]],
temperature: float = 0.7
) -> AsyncGenerator[str, None]:
"""
Streaming phản hồi token-by-token với tracking chi phí.
"""
start_time = datetime.now()
full_response = ""
try:
# Chuyển đổi format messages
langchain_messages = self._convert_messages(messages)
# Async streaming với aiter
async for chunk in self.llm.astream(langchain_messages):
if isinstance(chunk, AIMessageChunk):
content = chunk.content
if content:
full_response += content
yield content # Stream từng token
# Track token usage từ chunk metadata
if hasattr(chunk, 'usage_metadata'):
usage = chunk.usage_metadata
self.usage.prompt_tokens += usage.get('prompt_tokens', 0)
self.usage.completion_tokens += usage.get('completion_tokens', 0)
# Tính chi phí sau khi hoàn thành
elapsed = (datetime.now() - start_time).total_seconds() * 1000
self.usage.latency_ms = elapsed
self._calculate_cost()
except Exception as e:
yield f"\n[LỖI: {str(e)}]"
raise
def _convert_messages(self, messages: List[Dict[str, str]]) -> List:
"""Chuyển đổi messages format sang LangChain format."""
langchain_messages = []
for msg in messages:
if msg["role"] == "system":
langchain_messages.append(SystemMessage(content=msg["content"]))
elif msg["role"] == "user":
langchain_messages.append(HumanMessage(content=msg["content"]))
elif msg["role"] == "assistant":
langchain_messages.append(AIMessage(content=msg["content"]))
return langchain_messages
def _calculate_cost(self):
"""Tính chi phí dựa trên tokens đã sử dụng."""
model_key = self.model.lower()
price_per_mtok = self.pricing.get(model_key, 0.42)
self.usage.total_tokens = self.usage.prompt_tokens + self.usage.completion_tokens
self.usage.cost_usd = (self.usage.completion_tokens / 1_000_000) * price_per_mtok
def get_usage_report(self) -> Dict[str, Any]:
"""Trả về báo cáo sử dụng chi phí."""
return {
"prompt_tokens": self.usage.prompt_tokens,
"completion_tokens": self.usage.completion_tokens,
"total_tokens": self.usage.total_tokens,
"estimated_cost_usd": round(self.usage.cost_usd, 6),
"latency_ms": round(self.usage.latency_ms, 2),
"cost_per_1k_tokens": round(self.usage.cost_usd / (self.usage.total_tokens / 1000), 6) if self.usage.total_tokens > 0 else 0
}
Sử dụng
async def demo_streaming():
agent = AsyncStreamingAgent(
api_key=os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY"),
model="deepseek-chat"
)
messages = [
{"role": "system", "content": "Bạn là trợ lý AI chuyên về lập trình Python."},
{"role": "user", "content": "Giải thích về async/await trong Python với ví dụ thực tế."}
]
print("=== Streaming Response ===")
async for token in agent.stream_response(messages):
print(token, end="", flush=True)
print("\n\n=== Usage Report ===")
print(agent.get_usage_report())
Chạy demo
if __name__ == "__main__":
asyncio.run(demo_streaming())
Agent Multi-Step với Tool Calling bất đồng bộ
Trong thực tế, agents cần gọi nhiều tools theo chuỗi. Code dưới đây xử lý parallel tool execution với streaming và tracking chi phí chi tiết theo từng bước.
import asyncio
import json
from typing import Optional, Callable, Any
from dataclasses import dataclass, field
from enum import Enum
from langchain_core.tools import tool
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
class ToolType(Enum):
SEARCH = "search"
CALCULATOR = "calculator"
FILE_READ = "file_read"
WEB_SCRAPE = "web_scrape"
@dataclass
class StepResult:
step_name: str
tool_used: Optional[str]
input_data: Any
output_data: Any
tokens_used: int
cost_usd: float
latency_ms: float
error: Optional[str] = None
@dataclass
class AgentState:
messages: list = field(default_factory=list)
current_step: int = 0
results: list = field(default_factory=list)
total_cost: float = 0.0
total_tokens: int = 0
is_streaming: bool = True
callbacks: list = field(default_factory=list)
Định nghĩa tools
@tool
def calculator(expression: str) -> str:
"""Thực hiện phép tính toán đơn giản."""
try:
# Chỉ hỗ trợ các phép toán an toàn
allowed_chars = set("0123456789+-*/.() ")
if all(c in allowed_chars for c in expression):
result = eval(expression)
return f"Kết quả: {result}"
return "Biểu thức không hợp lệ"
except Exception as e:
return f"Lỗi: {str(e)}"
@tool
def search_information(query: str) -> str:
"""Tìm kiếm thông tin trên web."""
# Mock implementation - thay bằng API thực tế
return f"Tìm thấy kết quả cho: {query}. Tool search cần tích hợp SerpAPI hoặc tương tự."
@tool
def convert_currency(amount: float, from_currency: str, to_currency: str) -> str:
"""Chuyển đổi tiền tệ. Tỷ giá cố định cho demo."""
rates = {"USD_VND": 25000, "USD_CNY": 7.2, "USD_JPY": 150}
key = f"{from_currency}_{to_currency}"
if key in rates:
result = amount * rates[key]
return f"{amount} {from_currency} = {result:.2f} {to_currency}"
return "Tỷ giá không có sẵn"
class AsyncMultiStepAgent:
"""
Agent đa bước với parallel execution và streaming.
"""
def __init__(
self,
api_key: str,
base_url: str = "https://api.holysheep.ai/v1",
model: str = "deepseek-chat"
):
self.llm = ChatOpenAI(
model=model,
api_key=api_key,
base_url=base_url,
streaming=True
)
# Bind tools với LLM
self.tools = [calculator, search_information, convert_currency]
self.llm_with_tools = self.llm.bind_tools(self.tools)
self.pricing_per_mtok = 0.42 # DeepSeek V3.2
async def execute_with_streaming(
self,
user_input: str,
on_token: Optional[Callable] = None
) -> tuple[str, list[StepResult]]:
"""
Thực thi agent với streaming token-by-token.
"""
all_results = []
current_response = user_input
step_count = 0
max_steps = 5
while step_count < max_steps:
step_count += 1
# Gọi LLM với tools
ai_msg = await self.llm_with_tools.ainvoke([current_response])
# Stream tokens nếu có callback
if on_token and hasattr(ai_msg, 'content') and ai_msg.content:
for char in ai_msg.content:
await on_token(char)
# Kiểm tra nếu có tool calls
if hasattr(ai_msg, 'tool_calls') and ai_msg.tool_calls:
tool_results = await self._execute_tools_parallel(
ai_msg.tool_calls
)
all_results.extend(tool_results)
# Tạo message để tiếp tục conversation
tool_messages = [
ai_msg,
*[
{"role": "tool", "content": str(result.output_data), "tool_call_id": tc["id"]}
for tc, result in zip(ai_msg.tool_calls, tool_results)
]
]
current_response = tool_messages
else:
# Không có tool calls - kết thúc
if hasattr(ai_msg, 'content'):
return ai_msg.content, all_results
return "Đạt đến giới hạn số bước.", all_results
async def _execute_tools_parallel(
self,
tool_calls: list
) -> list[StepResult]:
"""
Thực thi nhiều tools song song.
"""
async def execute_single(tool_call: dict):
from datetime import datetime
start = datetime.now()
try:
tool_name = tool_call["name"]
tool_args = tool_call["args"]
# Tìm và gọi tool tương ứng
tool_func = next((t for t in self.tools if t.name == tool_name), None)
if tool_func:
result = await tool_func.ainvoke(tool_args)
elapsed = (datetime.now() - start).total_seconds() * 1000
return StepResult(
step_name=f"tool_{tool_name}",
tool_used=tool_name,
input_data=tool_args,
output_data=result,
tokens_used=0,
cost_usd=0,
latency_ms=elapsed
)
except Exception as e:
return StepResult(
step_name="error",
tool_used=tool_call.get("name"),
input_data=tool_call.get("args"),
output_data=None,
tokens_used=0,
cost_usd=0,
latency_ms=0,
error=str(e)
)
# Parallel execution
results = await asyncio.gather(*[execute_single(tc) for tc in tool_calls])
return list(results)
async def demo_multi_step():
agent = AsyncMultiStepAgent(
api_key="YOUR_HOLYSHEEP_API_KEY",
model="deepseek-chat"
)
async def token_callback(token: str):
print(token, end="", flush=True)
user_query = """
Tôi có 1000 USD. Hãy:
1. Chuyển sang VND
2. Tính 15% của số tiền VND
3. Trả lời tổng kết
"""
print("=== Multi-Step Agent Demo ===\n")
final_response, steps = await agent.execute_with_streaming(
user_query,
on_token=token_callback
)
print("\n\n=== Chi phí từng bước ===")
for step in steps:
print(f"Tool: {step.tool_used}")
print(f" Input: {step.input_data}")
print(f" Output: {step.output_data}")
print(f" Latency: {step.latency_ms:.2f}ms")
if step.error:
print(f" Error: {step.error}")
print()
asyncio.run(demo_multi_step())
Tích hợp HolySheep AI: Tiết kiệm 85%+ chi phí
Trong tất cả các dự án của tôi, HolySheep AI đã trở thành lựa chọn số một vì tỷ giá ¥1=$1 và hỗ trợ WeChat/Alipay. Với DeepSeek V3.2 chỉ $0.42/MTok output, một ứng dụng xử lý 10 triệu token/tháng sẽ tiết kiệm được:
- So với Claude: $150 → $4.20 = tiết kiệm $145.80/tháng
- So với GPT-4.1: $80 → $4.20 = tiết kiệm $75.80/tháng
- Độ trễ trung bình: <50ms (thấp hơn nhiều provider khác)
import os
from langchain_openai import ChatOpenAI
=====================
CẤU HÌNH HOLYSHEEP AI
=====================
HOLYSHEEP_API_KEY = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
def create_llm_client(model: str = "deepseek-chat", **kwargs):
"""
Factory function tạo LLM client kết nối HolySheep AI.
Không bao giờ hardcode api.openai.com!
"""
return ChatOpenAI(
model=model,
api_key=HOLYSHEEP_API_KEY,
base_url=HOLYSHEEP_BASE_URL,
**kwargs
)
class StreamingCostOptimizer:
"""
Tối ưu chi phí với batch processing và smart caching.
"""
def __init__(self, api_key: str):
self.api_key = api_key
self.cache = {} # Simple in-memory cache
self.request_count = 0
self.total_cost = 0.0
# Model pricing (USD per 1M tokens - output)
self.pricing = {
"deepseek-chat": 0.42,
"deepseek-v3": 0.42,
"gpt-4.1": 8.0,
"gemini-2.5-flash": 2.50,
}
async def smart_stream(self, prompt: str, model: str = "deepseek-chat"):
"""
Streaming thông minh với cache và cost tracking.
"""
# Check cache
cache_key = f"{model}:{prompt[:100]}"
if cache_key in self.cache:
print(f"[CACHE HIT] Trả về kết quả từ cache")
return self.cache[cache_key]
# Create client
llm = create_llm_client(
model=model,
streaming=True,
temperature=0.7
)
full_response = ""
tokens_count = 0
# Stream response
async for chunk in llm.astream([{"role": "user", "content": prompt}]):
if hasattr(chunk, 'content') and chunk.content:
full_response += chunk.content
tokens_count += 1
yield chunk.content
# Calculate and track cost
cost = (tokens_count / 1_000_000) * self.pricing.get(model, 0.42)
self.total_cost += cost
self.request_count += 1
# Cache result
self.cache[cache_key] = full_response
print(f"\n[COST] Model: {model}, Tokens: {tokens_count}, Cost: ${cost:.6f}")
def get_cost_report(self):
"""
Báo cáo chi phí chi tiết.
"""
avg_cost = self.total_cost / self.request_count if self.request_count > 0 else 0
return {
"total_requests": self.request_count,
"total_cost_usd": round(self.total_cost, 6),
"average_cost_per_request": round(avg_cost, 6),
"estimated_monthly_cost_10k_requests": round(avg_cost * 10000, 2)
}
Ví dụ sử dụng với nhiều models
async def compare_models_streaming():
optimizer = StreamingCostOptimizer(HOLYSHEEP_API_KEY)
test_prompt = "Viết một đoạn code Python để xử lý async streaming với LangChain."
models_to_test = ["deepseek-chat", "gemini-2.5-flash"]
for model in models_to_test:
print(f"\n{'='*50}")
print(f"Testing model: {model}")
print(f"{'='*50}\n")
async for token in optimizer.smart_stream(test_prompt, model):
print(token, end="", flush=True)
await asyncio.sleep(1) # Rate limiting
print("\n\n=== COST REPORT ===")
print(optimizer.get_cost_report())
# So sánh chi phí nếu dùng Claude thay vì DeepSeek
print("\n=== SAVINGS COMPARISON ===")
current_cost = optimizer.total_cost
claude_cost = current_cost * (15.0 / 0.42) # Claude gấp ~36 lần DeepSeek
gpt_cost = current_cost * (8.0 / 0.42) # GPT gấp ~19 lần DeepSeek
print(f"Chi phí DeepSeek: ${current_cost:.6f}")
print(f"Nếu dùng Claude: ${claude_cost:.6f} (chênh lệch: +${claude_cost - current_cost:.2f})")
print(f"Nếu dùng GPT-4.1: ${gpt_cost:.6f} (chênh lệch: +${gpt_cost - current_cost:.2f})")
Chạy demo
if __name__ == "__main__":
asyncio.run(compare_models_streaming())
Lỗi thường gặp và cách khắc phục
Qua hàng trăm lần debug, tôi đã tổng hợp 5 lỗi phổ biến nhất khi làm việc với LangChain async agents và streaming:
Lỗi 1: RuntimeError: asyncio loop already running
Nguyên nhân: Gọi async function từ context đã có event loop (như trong Jupyter notebook hoặc web framework).
# ❌ SAI - Gây lỗi "asyncio loop already running"
async def my_agent():
llm = ChatOpenAI(streaming=True)
async for chunk in llm.stream("Hello"):
print(chunk)
Gọi trực tiếp trong sync context
result = my_agent() # Lỗi!
✅ ĐÚNG - Sử dụng nest_asyncio hoặc chạy trong proper async context
import nest_asyncio
nest_asyncio.apply()
Hoặc sử dụng asyncio.run()
async def main():
agent = AsyncStreamingAgent(
api_key="YOUR_HOLYSHEEP_API_KEY",
model="deepseek-chat"
)
async for token in agent.stream_response([{"role": "user", "content": "Hello"}]):
print(token, end="")
asyncio.run(main())
✅ VỚI WEB FRAMEWORK (FastAPI example)
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio
app = FastAPI()
@app.get("/stream")
async def stream_chat(message: str):
agent = AsyncStreamingAgent(
api_key="YOUR_HOLYSHEEP_API_KEY",
model="deepseek-chat"
)
async def event_generator():
async for token in agent.stream_response([{"role": "user", "content": message}]):
yield f"data: {token}\n\n"
await asyncio.sleep(0.01) # Prevent blocking
return StreamingResponse(event_generator(), media_type="text/event-stream")
Lỗi 2: AttributeError: 'NoneType' object has no attribute 'content'
Nguyên nhân: Chunk không có content (thường xảy ra với streaming từ một số provider).
# ❌ SAI - Không kiểm tra None
async for chunk in llm.astream(messages):
full_response += chunk.content # Lỗi nếu chunk.content là None
✅ ĐÚNG - Null-safe handling
async def safe_stream(llm, messages):
full_response = ""
async for chunk in llm.astream(messages):
# Kiểm tra an toàn
content = getattr(chunk, 'content', None) or getattr(chunk, 'text', '') or ''
# Hoặc sử dụng dict access cho AIMessageChunk
if isinstance(chunk, dict):
content = chunk.get('content', '')
if content:
full_response += content
yield content
return full_response
✅ HOẶC - Sử dụng try-except với fallback
async def robust_stream(llm, messages):
full_response = ""
try:
async for chunk in llm.astream(messages):
try:
# Thử nhiều cách để lấy content
if hasattr(chunk, 'content'):
content = chunk.content or ''
elif hasattr(chunk, 'message'):
content = chunk.message.content or ''
elif isinstance(chunk, str):
content = chunk
else:
content = ''
if content:
full_response += content
yield content
except AttributeError:
# Skip chunk không hợp lệ
continue
except Exception as e:
yield f"\n[LỖI STREAMING: {str(e)}]"
return full_response
Lỗi 3: Connection timeout khi streaming với base_url sai
Nguyên nhân: Sử dụng sai base_url hoặc API key không hợp lệ.
# ❌ SAI - Hardcode sai base_url
llm = ChatOpenAI(
model="deepseek-chat",
api_key="sk-xxx",
base_url="https://api.openai.com/v1" # Sai! Không phải OpenAI endpoint
)
✅ ĐÚNG - Luôn sử dụng HolySheep base_url
import os
from functools import lru_cache
@lru_cache(maxsize=1)
def get_llm_config():
"""Lấy cấu hình từ environment variables."""
api_key = os.getenv("HOLYSHEEP_API_KEY")
if not api_key:
raise ValueError("HOLYSHEEP_API_KEY not set. Đăng ký tại: https://www.holysheep.ai/register")
return {
"api_key": api_key,
"base_url": "https://api.holysheep.ai/v1", # LUÔN LUÔN đúng
"timeout": 120,
"max_retries": 3
}
def create_streaming_llm(model: str = "deepseek-chat", **kwargs):
"""Factory function an toàn."""
config = get_llm_config()
return ChatOpenAI(
model=model,
api_key=config["api_key"],
base_url=config["base_url"],
streaming=True,
timeout=config["timeout"],
max_retries=config["max_retries"],
**kwargs
)
✅ TEST CONNECTION TRƯỚC KHI SỬ DỤNG
import httpx
async def test_connection():
"""Kiểm tra kết nối HolySheep API."""
config = get_llm_config()
async with httpx.AsyncClient() as client:
try:
response = await client.post(
f"{config['base_url']}/chat/completions",
headers={
"Authorization": f"Bearer {config['api_key']}",
"Content-Type": "application/json"
},
json={
"model": "deepseek-chat",
"messages": [{"role": "user", "content": "Hi"}],
"max_tokens": 5
},
timeout=10.0
)
if response.status_code == 200:
print("✅ Kết nối HolySheep AI thành công!")
return True
else:
print(f"❌ Lỗi kết nối: {response.status_code}")
print(f"Response: {response.text}")
return False
except httpx.ConnectError as e:
print(f"❌ Không thể kết nối: {str(e)}")
print("Kiểm tra lại HOLYSHEEP_API_KEY hoặc đăng ký tại: https://www.holysheep.ai/register")
return False
except httpx.TimeoutException:
print("❌ Timeout - kiểm tra kết nối mạng")
return False
Chạy test
asyncio.run(test_connection())
Lỗi 4: Tool calling không hoạt động trong streaming mode
Nguyên nhân: Binding tools sau khi đã khởi tạo streaming không tương thích.
# ❌ SAI - Bind tools sau khi streaming
llm = ChatOpenAI(model="deepseek-chat", streaming=True)
llm_with_tools = llm.bind_tools(tools) # Không hỗ trợ streaming tool calls
✅ ĐÚNG - Streaming với tools cần ainvoke thay vì astream
class StreamingAgentWithTools:
def __init__(self, api_key: str, tools: list):
self.llm = ChatOpenAI(
model="deepseek-chat",
api_key=api_key,
base_url="https://api.holysheep.ai/v1",
streaming=True
)
# Bind tools với LLM (không streaming cho tool calls)
self.llm_with_tools = self.llm.bind_tools(tools)
async def stream_with_tools(self, messages: list):
"""
Streaming text response, gọi tools riêng.
"""
full_response = ""
# Bước 1: Gọi LLM để quyết định có dùng tools không
response = await self.llm_with_tools.ainvoke(messages)
# Bước 2: Nếu có tool calls, thực thi song song
if hasattr(response, 'tool_calls') and response.tool_calls:
# Stream phần text trước (nếu có)
if hasattr(response, 'content') and response.content:
for char in response.content:
full_response += char
yield char
# Thực thi tools song song
tool_tasks = []
for tool_call in response.tool_calls:
tool_func = next(
(t for t in self.tools if t.name == tool_call["name"]),
None
)
if tool_func:
tool_tasks.append(
tool_func.ainvoke(tool_call["args"])
)
# Chờ tất cả tools hoàn thành
tool_results = await asyncio.gather(*tool_tasks, return_exceptions=True)
# Stream tool results
yield "\n\n[Tool Results]\n"
for i, result in enumerate(tool_results):
if isinstance(result, Exception):
yield f"❌ Tool error: {result}\n"
else:
yield f"✅ {response.tool_calls[i]['name']}: {result}\n"
# Bước 3: Nếu không có tool calls, stream bình thường
else:
async for chunk in self.llm.astream(messages):
if hasattr(chunk, 'content') and chunk.content:
full_response += chunk.content
yield chunk.content
Lỗi 5: Chi phí phình to do không track token usage
Nguyên nhân: Không có cơ chế tracking chi phí, dẫn đến bill bất ngờ.
# ❌ SAI - Không tracking chi phí
llm = ChatOpenAI(model="deepseek-chat")
async for chunk in llm.astream([{"role": "user", "content": prompt}]):
print(chunk) # Không biết đã dùng bao nhiêu tokens
✅ ĐÚNG - Comprehensive cost tracking
from dataclasses import dataclass, field
from datetime import datetime
from typing import Optional
@dataclass
class CostTracker