List[Dict[str, Any]]:
"""バッチ処理で複数プロンプトを并发処理"""
semaphore = asyncio.Semaphore(max_concurrent)
async def process_single(prompt: str, idx: int):
async with semaphore:
try:
payload = {
"model": model,
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7,
"max_tokens": 2048
}
async with self.session.post(
f"{BASE_URL}/chat/completions",
json=payload
) as response:
if response.status == 401:
raise Exception("401 Unauthorized: APIキーが無効です")
if response.status == 429:
retry_after = response.headers.get("Retry-After", 5)
await asyncio.sleep(int(retry_after))
return await process_single(prompt, idx)
response.raise_for_status()
data = await response.json()
return {
"index": idx,
"content": data["choices"][0]["message"]["content"],
"usage": data.get("usage", {}),
"status": "success"
}
except asyncio.TimeoutError:
return {
"index": idx,
"error": "ConnectionError: timeout",
"status": "failed"
}
except aiohttp.ClientError as e:
return {
"index": idx,
"error": f"ClientError: {str(e)}",
"status": "failed"
}
tasks = [process_single(prompt, idx) for idx, prompt in enumerate(prompts)]
results = await asyncio.gather(*tasks, return_exceptions=True)
# 例外を结果に変換
processed_results = []
for i, result in enumerate(results):
if isinstance(result, Exception):
processed_results.append({
"index": i,
"error": str(result),
"status": "exception"
})
else:
processed_results.append(result)
return processed_results
使用例
async def main():
prompts = [
f"商品ID {i} のレビューを分析して感情スコアを算出"
for i in range(1000)
]
async with HolySheepBatchProcessor(API_KEY) as processor:
results = await processor.process_batch(prompts, max_concurrent=50)
success_count = sum(1 for r in results if r["status"] == "success")
print(f"成功率: {success_count}/{len(results)}")
# コスト計算
total_tokens = sum(
r.get("usage", {}).get("total_tokens", 0)
for r in results if r["status"] == "success"
)
cost_usd = (total_tokens / 1_000_000) * 0.42 # DeepSeek V3.2
print(f"総トークン数: {total_tokens:,}")
print(f"コスト: ${cost_usd:.4f}")
if __name__ == "__main__":
asyncio.run(main())
実践コード:Node.js Batch処理编
次に、TypeScriptでの実装例を示す。ログ处理や实时分析に適している。
import axios, { AxiosInstance, AxiosError } from 'axios';
const BASE_URL = "https://api.holysheep.ai/v1";
const API_KEY = "YOUR_HOLYSHEEP_API_KEY";
interface BatchRequest {
id: string;
prompt: string;
metadata?: Record;
}
interface BatchResponse {
id: string;
result: string;
tokens: number;
cost: number;
error?: string;
}
class HolySheepBatchClient {
private client: AxiosInstance;
private requestQueue: BatchRequest[] = [];
private maxRetries = 3;
private retryDelay = 1000;
constructor() {
this.client = axios.create({
baseURL: BASE_URL,
headers: {
'Authorization': Bearer ${API_KEY},
'Content-Type': 'application/json',
},
timeout: 120000,
});
this.setupInterceptors();
}
private setupInterceptors() {
this.client.interceptors.response.use(
response => response,
async (error: AxiosError) => {
const originalRequest = error.config;
if (!originalRequest) {
return Promise.reject(error);
}
// 401エラーの处理
if (error.response?.status === 401) {
console.error('401 Unauthorized: APIキーを確認してください');
throw new Error('401 Unauthorized: Invalid API key');
}
// 429 Rate Limit の处理
if (error.response?.status === 429) {
const retryAfter = error.response.headers['retry-after'];
const delay = retryAfter ? parseInt(retryAfter) * 1000 : this.retryDelay;
console.log(Rate limit hit. Retrying after ${delay}ms...);
await this.sleep(delay);
return this.client(originalRequest);
}
// タイムアウト處理
if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
console.error('ConnectionError: timeout - リクエストがタイムアウトしました');
throw new Error('ConnectionError: timeout');
}
// 再試行逻辑
const retryCount = (originalRequest as any).retryCount || 0;
if (retryCount < this.maxRetries && this.isRetryableError(error)) {
(originalRequest as any).retryCount = retryCount + 1;
await this.sleep(this.retryDelay * (retryCount + 1));
return this.client(originalRequest);
}
return Promise.reject(error);
}
);
}
private sleep(ms: number): Promise {
return new Promise(resolve => setTimeout(resolve, ms));
}
private isRetryableError(error: AxiosError): boolean {
return (
error.code === 'ECONNABORTED' ||
error.code === 'ETIMEDOUT' ||
error.code === 'ENOTFOUND' ||
!error.response
);
}
async processBatch(
requests: BatchRequest[],
model: string = "deepseek-v3.2"
): Promise {
const results: BatchResponse[] = [];
const batchSize = 50; // HolySheep推奨のバッチサイズ
console.log(Processing ${requests.length} requests in batches of ${batchSize}...);
for (let i = 0; i < requests.length; i += batchSize) {
const batch = requests.slice(i, i + batchSize);
console.log(Processing batch ${Math.floor(i / batchSize) + 1}...);
const batchPromises = batch.map(async (req) => {
try {
const response = await this.client.post('/chat/completions', {
model: model,
messages: [{ role: 'user', content: req.prompt }],
temperature: 0.7,
max_tokens: 2048,
});
const data = response.data;
const tokens = data.usage?.total_tokens || 0;
// DeepSeek V3.2: $0.42/MTok
const costPerMillion = 0.42;
const cost = (tokens / 1_000_000) * costPerMillion;
return {
id: req.id,
result: data.choices[0].message.content,
tokens: tokens,
cost: cost,
} as BatchResponse;
} catch (error) {
const axiosError = error as AxiosError;
return {
id: req.id,
result: '',
tokens: 0,
cost: 0,
error: axiosError.message || 'Unknown error',
} as BatchResponse;
}
});
const batchResults = await Promise.all(batchPromises);
results.push(...batchResults);
// 次のバッチ前に短いポーズ(レートリミット対策)
if (i + batchSize < requests.length) {
await this.sleep(100);
}
}
const successCount = results.filter(r => !r.error).length;
const totalCost = results.reduce((sum, r) => sum + r.cost, 0);
const totalTokens = results.reduce((sum, r) => sum + r.tokens, 0);
console.log(\n=== 処理完了 ===);
console.log(成功率: ${successCount}/${results.length} (${(successCount/results.length*100).toFixed(1)}%));
console.log(総トークン数: ${totalTokens.toLocaleString()});
console.log(総コスト: $${totalCost.toFixed(4)});
return results;
}
}
// 使用例
async function main() {
const client = new HolySheepBatchClient();
// 1000件のレビューデータを批量処理
const requests: BatchRequest[] = Array.from({ length: 1000 }, (_, i) => ({
id: review-${i},
prompt: 以下のレビューを感情分析してください: 「商品ID ${i} - ポジティブ${'得很好'.repeat(5)}」,
}));
const results = await client.processBatch(requests);
// 成功した結果を保存
const successful = results.filter(r => !r.error);
console.log(成功した処理: ${successful.length}件);
}
main().catch(console.error);
よくあるエラーと対処法
エラー1: 401 Unauthorized
# 症状
ResponseError: 401 Unauthorized - APIキーが無効または期限切れ
原因
- APIキーの入力間違い
- キーを環境変数に設定忘れていた
- キーをローテーション后又期限切れ
解決策
import os
正しいキーの設定方法
API_KEY = os.environ.get("HOLYSHEEP_API_KEY")
キーの有效性チェック
import httpx
async def verify_api_key():
async with httpx.AsyncClient() as client:
response = await client.get(
f"{BASE_URL}/models",
headers={"Authorization": f"Bearer {API_KEY}"}
)
if response.status_code == 401:
raise ValueError("APIキーが無効です。https://www.holysheep.ai/register で確認してください")
return True
エラー2: ConnectionError: timeout
# 症状
asyncio.TimeoutError: timeout of 120 seconds exceeded
原因
- ネットワーク不安定
- プロンプト过长导致处理时间超过タイムアウト
- 同時接続数过多でリソース不足
解決策
import asyncio
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=30))
async def robust_request(session, url, payload, timeout=180):
"""再試行机制付きの顽丈なリクエスト"""
try:
async with session.post(url, json=payload, timeout=timeout) as response:
return await response.json()
except asyncio.TimeoutError:
print("タイムアウト、再試行中...")
raise
except Exception as e:
print(f"エラー発生: {e}")
raise
使用時:プロンプトを分割して处理
MAX_PROMPT_TOKENS = 8000 # 适当な长さに制限
def truncate_prompt(prompt: str) -> str:
"""プロンプト长度を制限"""
if len(prompt) > MAX_PROMPT_TOKENS * 4: # 簡略化
return prompt[:MAX_PROMPT_TOKENS * 4] + "..."
return prompt
エラー3: 429 Rate LimitExceeded
# 症状
ResponseError: 429 Too Many Requests - Rate limit exceeded
原因
- 短时间に大量のリクエストを送信
- アカウントのプラン别レートリミットに到达
解決策
import asyncio
from collections import defaultdict
import time
class RateLimitedClient:
def __init__(self, requests_per_minute: int = 60):
self.rpm = requests_per_minute
self.request_times = defaultdict(list)
self.semaphore = asyncio.Semaphore(requests_per_minute // 10)
async def throttled_request(self, request_id: str, coro):
"""レートリミットを遵守したリクエスト"""
async with self.semaphore:
now = time.time()
# 過去1分間のリクエスト履歴を清理
self.request_times[request_id] = [
t for t in self.request_times[request_id]
if now - t < 60
]
# 上限に達している場合は待機
if len(self.request_times[request_id]) >= self.rpm:
wait_time = 60 - (now - self.request_times[request_id][0])
if wait_time > 0:
print(f"Rate limit回避のため {wait_time:.1f}秒待機...")
await asyncio.sleep(wait_time)
self.request_times[request_id].append(time.time())
return await coro
HolySheep AI の場合は高レートに対応
(¥1=$1レートで связи、使用量に応じた適切なバッチサイズ设计)
コスト最適化のための設定チートシート