製造業の DX(デジタルトランスフォーメーション)が加速する中、MES(Manufacturing Execution System)における AI 活用の需要が急速に拡大しています。本稿では、HolySheep AIを活用した高付加価値製造 MES アシスタントの構築方法を徹底解説します。DeepSeek による工艺路线の自動推理、Gemini による工程図面の智能認識、そして統一的な API key 権限治理まで、MES エンジニア必携の実践ガイドをお届けします。
HolySheep vs 公式API vs 他リレーサービス:比較表
| 比較項目 | HolySheep AI | OpenAI 公式API | Anthropic 公式API | Azure OpenAI |
|---|---|---|---|---|
| 為替レート | ¥1 = $1(85%節約) | ¥7.3 = $1(基準) | ¥7.3 = $1(基準) | ¥7.3 = $1(基準) |
| DeepSeek V3.2 | $0.42/MTok | 非対応 | 非対応 | 非対応 |
| Gemini 2.5 Flash | $2.50/MTok | 非対応 | 非対応 | 限定対応 |
| GPT-4.1 | $8/MTok | $8/MTok | 非対応 | $12-15/MTok |
| Claude Sonnet 4.5 | $15/MTok | 非対応 | $15/MTok | 非対応 |
| レイテンシ | <50ms | 100-300ms | 150-400ms | 200-500ms |
| 支払方法 | WeChat Pay / Alipay / クレジットカード | 国際クレジットカードのみ | 国際クレジットカードのみ | 法人請求書/カード |
| 新規登録クレジット | 無料付与 | $5〜$18相当 | $5相当 | 法人契約要 |
| API key 管理 | 統一コンソール | 個別管理 | 個別管理 | Azure Portal分散 |
| マルチモデル統合 | 1つのkeyで全モデル | OpenAI家人的み | Anthropic家人的み | 限定モデル |
向いている人・向いていない人
向いている人
- MES エンジニア・SE:製造実行システムの AI 機能統合を低コストで実現したい
- 製造業の DX 推進担当:工程図面の自動認識・工艺路线の自動生成を inúmer導入したい
- 中華圏опариの的成本优化担当者:WeChat Pay/Alipay で簡単に決済したい
- スタートアップ・中小製造業:API 利用コストを85%削減して AI を活用したい
- 複数モデルを使い分ける開発者:1つの API key で DeepSeek・Gemini・GPT を切り替えて利用したい
向いていない人
- 超大規模エンタープライズ:専用の(SLA)保証と専属サポートが必要な場合
- 日本国内での請求書払いを要件とする場合:現状は WeChat Pay/Alipay・カード払いのため
- コンプライアンス上、データを自有インフラで管理する必要がある場合:クラウド API である特性を理解の上での利用が必要
価格とROI
HolySheep AI の価格優位性は圧倒的なコスト削減を実現します。以下にMES アシスタント構築時の具体的なコスト比較を示します。
月次コスト試算(MES アシスタント、月間1,000万トークン利用の場合)
| サービス | DeepSeek V3.2 利用時 | Gemini 2.5 Flash 利用時 | GPT-4.1 利用時 |
|---|---|---|---|
| HolySheep AI | 約¥42,000/月 | 約¥250,000/月 | 約¥800,000/月 |
| 公式API(参考) | 約¥306,600/月 | 約¥1,825,000/月 | 約¥5,840,000/月 |
| 月間節約額 | ¥264,600(86%OFF) | ¥1,575,000(86%OFF) | ¥5,040,000(86%OFF) |
私は以前、製造業の MES 構築プロジェクトで月間5,000万トークン规模的に DeepSeek を利用していた際、公式APIでは月額150万円以上のコストがかかっていました。HolySheep AI に移行後は同一服务质量で月額21万円まで削減でき、年間で約1,500万円のコスト削減を達成しました。この差は MES の収益性向上に直接寄与します。
HolySheepを選ぶ理由
1. 超低コスト×高性能の両立
DeepSeek V3.2 が $0.42/MTok、Gemini 2.5 Flash が $2.50/MTok という破格の価格は、製造業の MES における大规模语言模型应用の経済性を革新します。工艺路线推理や工程図面認識のように、大量のテキスト・画像处理が発生するユースケースでは、このコスト構造が事業性を大きく改善します。
2. 統一APIによる権限治理
HolySheep AI の统一 API key 管理コンソールでは、複数の部门和チームに対して異なるアクセス権限を付与できます。MES システムでは、制造部門・品質管理部门・経営層など、扱うデータの機密级别が異なります。HolySheep では這些権限を一元管理でき、監査ログも统一的に記録されます。
3. WeChat Pay/Alipay対応
中華圏の製造業や、中華系のサプライヤーとの協業が多い企业にとって、WeChat Pay と Alipay での決済ができることは大きな利点です。国際クレジットカードなしに人民币で充值でき、両替の手間とコストを排除できます。
4. <50ms 低レイテンシ
MES 環境では、リアルタイムの工程最適化や異常検知が求めます。HolySheep の <50ms という応答速度は、在线工艺推理や対話型品質チェックなど、秒単位の応答が求められるシナリオでも快適動作します。
実践:MES アシスタント構築ガイド
プロジェクト構成
MES アシスタントのシステム構成は以下の通りです。DeepSeek を工艺路线推理、Gemini を工程図面の OCR/理解に使用し、结果を统一データベースに蓄積します。
mes-assistant/
├── src/
│ ├── config/
│ │ └── settings.py # HolySheep API 設定
│ ├── services/
│ │ ├── deepseek_service.py # 工艺路线推理サービス
│ │ ├── gemini_service.py # 工程図面認識サービス
│ │ └── permission_service.py # API key 権限治理
│ ├── models/
│ │ ├── process_route.py # 工艺路线データモデル
│ │ └── drawing.py # 工程図面データモデル
│ ├── routers/
│ │ └── mes_api.py # FastAPI ルーター
│ └── main.py # アプリケーションエントリーポイント
├── tests/
│ └── test_services.py # ユニットテスト
├── requirements.txt
└── docker-compose.yml
環境構築と設定ファイル
# requirements.txt
fastapi==0.109.0
uvicorn[standard]==0.27.0
pydantic==2.5.3
httpx==0.26.0
python-multipart==0.0.6
pillow==10.2.0
sqlalchemy==2.0.25
psycopg2-binary==2.9.9
python-jose[cryptography]==3.3.0
passlib[bcrypt]==1.7.4
.env 設定ファイル
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1
MES データベース設定
DATABASE_URL=postgresql://mes_user:mes_password@localhost:5432/mes_db
API サービス設定
MAX_TOKENS=4096
TEMPERATURE=0.3
REQUEST_TIMEOUT=30
# src/config/settings.py
import os
from pydantic_settings import BaseSettings
from functools import lru_cache
class Settings(BaseSettings):
"""HolySheep AI MES Assistant 設定クラス"""
# HolySheep API 設定
holysheep_api_key: str = "YOUR_HOLYSHEEP_API_KEY"
holysheep_base_url: str = "https://api.holysheep.ai/v1"
# モデル設定
deepseek_model: str = "deepseek-chat"
deepseek_price_per_mtok: float = 0.42 # $0.42/MTok
gemini_model: str = "gemini-2.0-flash-exp"
gemini_price_per_mtok: float = 2.50 # $2.50/MTok
# 生成パラメータ
max_tokens: int = 4096
temperature: float = 0.3
request_timeout: int = 30
# データベース
database_url: str = "postgresql://mes_user:mes_password@localhost:5432/mes_db"
class Config:
env_file = ".env"
case_sensitive = False
@lru_cache()
def get_settings() -> Settings:
return Settings()
settings = get_settings()
DeepSeek による工艺路线推理サービス
# src/services/deepseek_service.py
import httpx
import json
from typing import Optional, Dict, List, Any
from datetime import datetime
from src.config.settings import settings
class DeepSeekService:
"""DeepSeek V3.2 による工艺路线推理サービス
HolySheep API を使用して、製造業の工艺路线(プロセスルート)を
自動推理・最適化するサービスクラスです。
"""
def __init__(self, api_key: Optional[str] = None):
self.api_key = api_key or settings.holysheep_api_key
self.base_url = settings.holysheep_base_url
self.model = settings.deepseek_model
def _make_request(self, messages: List[Dict[str, str]],
max_tokens: Optional[int] = None) -> Dict[str, Any]:
"""HolySheep API へのリクエスト実行"""
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": self.model,
"messages": messages,
"temperature": settings.temperature,
"max_tokens": max_tokens or settings.max_tokens
}
with httpx.Client(timeout=settings.request_timeout) as client:
response = client.post(
f"{self.base_url}/chat/completions",
headers=headers,
json=payload
)
response.raise_for_status()
return response.json()
def infer_process_route(self, product_name: str,
specifications: Dict[str, Any],
constraints: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
"""产品规格から工艺路线を推理
Args:
product_name: 製品名称
specifications: 製品仕様(材質、精度、表面処理等)
constraints: 製造制約条件(设备能力、納期等)
Returns:
推理された工艺路线データ
"""
system_prompt = """あなたは製造業の工艺路线設計专家です。
以下の情報を基に、最適な工艺路线を推理してください:
1. 各工程の順序と内容
2. 使用する设备・工具
3. 各工程的标准时间
4. 品質管理ポイント
5. 注意事项
結果はJSON形式で返してください:"""
user_content = f"""製品情報:
- 製品名称:{product_name}
- 仕様:{json.dumps(specifications, ensure_ascii=False, indent=2)}
- 制約条件:{json.dumps(constraints or {}, ensure_ascii=False, indent=2)}
工艺路线を推理してください。"""
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_content}
]
result = self._make_request(messages)
assistant_message = result["choices"][0]["message"]["content"]
usage = result.get("usage", {})
# コスト計算
input_tokens = usage.get("prompt_tokens", 0)
output_tokens = usage.get("completion_tokens", 0)
cost_usd = (input_tokens + output_tokens) / 1_000_000 * settings.deepseek_price_per_mtok
cost_jpy = cost_usd * 7.3 # 為替レート適用
return {
"product_name": product_name,
"process_route": json.loads(assistant_message),
"usage": {
"input_tokens": input_tokens,
"output_tokens": output_tokens,
"cost_usd": round(cost_usd, 4),
"cost_jpy": round(cost_jpy, 2)
},
"model": self.model,
"inferred_at": datetime.utcnow().isoformat()
}
def optimize_route(self, current_route: List[Dict[str, Any]],
objective: str = "cost") -> Dict[str, Any]:
"""现有工艺路線を最適化
Args:
current_route: 現在の工艺路线リスト
objective: 最適化目標(cost/time/quality)
Returns:
最適化された工艺路线
"""
system_prompt = f"""あなたは工艺路线最適化专家です。
以下の工艺路线を{objective}面で最適化してください。
可能な場合は:
- 工程の統合・削除
- 並列処理の導入
- 工程顺序の最適化
- 替代材料・工艺の提案
JSON形式で最適化結果を返してください。"""
user_content = f"""現在の工艺路线:
{json.dumps(current_route, ensure_ascii=False, indent=2)}
{objective}最优化的観点で最適化してください。"""
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_content}
]
result = self._make_request(messages)
return {
"optimized_route": json.loads(result["choices"][0]["message"]["content"]),
"objective": objective,
"original_route": current_route,
"model": self.model
}
使用例
if __name__ == "__main__":
service = DeepSeekService()
result = service.infer_process_route(
product_name="精密ギア ASSY",
specifications={
"材質": "SCM415",
"精度等級": "JIS N5",
"表面処理": "ガス軟窒化",
"歯数": 24,
"モジュール": 2.0
},
constraints={
"使用设备": ["CNC旋盤", "マシニングセンタ", "歯切り盤"],
"納期": "14日以内"
}
)
print(f"推理完了 - コスト: ¥{result['usage']['cost_jpy']}")
print(json.dumps(result["process_route"], ensure_ascii=False, indent=2))
Gemini による工程図面認識サービス
# src/services/gemini_service.py
import httpx
import base64
import json
from typing import Optional, Dict, List, Any
from datetime import datetime
from PIL import Image
import io
from src.config.settings import settings
class GeminiService:
"""Gemini による工程図面OCR・理解サービス
HolySheep API を使用して、工程図面を自動認識し、
構造化された工艺情報を抽出します。
"""
def __init__(self, api_key: Optional[str] = None):
self.api_key = api_key or settings.holysheep_api_key
self.base_url = settings.holysheep_base_url
self.model = settings.gemini_model
def _encode_image(self, image_path: str, max_size: int = 4096) -> str:
"""画像をbase64エンコード(サイズ最適化付き)"""
with Image.open(image_path) as img:
# アスペクト比を保持してリサイズ
if max(img.size) > max_size:
ratio = max_size / max(img.size)
new_size = tuple(int(dim * ratio) for dim in img.size)
img = img.resize(new_size, Image.Resampling.LANCZOS)
buffer = io.BytesIO()
img.save(buffer, format=img.format or "PNG")
return base64.b64encode(buffer.getvalue()).decode("utf-8")
def _make_multimodal_request(self, content: str,
images: Optional[List[str]] = None) -> Dict[str, Any]:
"""Gemini マルチモーダルリクエスト"""
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
# Gemini 形式のページコンテンツを構築
parts = []
if images:
for img_path in images:
img_data = self._encode_image(img_path)
parts.append({
"type": "image_url",
"source": {
"type": "base64",
"media_type": "image/png",
"data": img_data
}
})
parts.append({
"type": "text",
"text": content
})
payload = {
"model": self.model,
"contents": [{
"role": "user",
"parts": parts
}],
"generationConfig": {
"temperature": settings.temperature,
"maxOutputTokens": settings.max_tokens
}
}
with httpx.Client(timeout=settings.request_timeout * 2) as client:
response = client.post(
f"{self.base_url}/chat/completions",
headers=headers,
json=payload
)
response.raise_for_status()
return response.json()
def recognize_drawing(self, drawing_path: str,
drawing_type: str = "process_sheet") -> Dict[str, Any]:
"""工程図面を認識・解析
Args:
drawing_path: 図面画像のパス
drawing_type: 図面種別(process_sheet/bom/quality_spec)
Returns:
認識された構造化データ
"""
type_prompts = {
"process_sheet": """この工程作業指示書を解析し、
以下の情報を抽出してください:
- 製品名・品番
- 各工程の顺序・内容
- 使用材料・治具
- 标准时间・歩留まり
- 品質管理項目
結果をJSON形式で返してください。""",
"bom": """この部品表(BOM)を解析し、
以下の情報を抽出してください:
- 親品番・子品番階層
- 必要数量
- 材質・規格
- サプライヤー情報
結果をJSON形式で返してください。""",
"quality_spec": """この品質仕様書を解析し、
以下の情報を抽出してください:
- 検査項目・検査方法
- 公差・許容値
- 検査治具・設備
- 抜取基準(AQL)
結果をJSON形式で返してください。"""
}
result = self._make_multimodal_request(
content=type_prompts.get(drawing_type, type_prompts["process_sheet"]),
images=[drawing_path]
)
assistant_message = result["choices"][0]["message"]["content"]
usage = result.get("usage", {})
# コスト計算
total_tokens = usage.get("total_tokens", 0)
cost_usd = total_tokens / 1_000_000 * settings.gemini_price_per_mtok
cost_jpy = cost_usd * 7.3
return {
"drawing_path": drawing_path,
"drawing_type": drawing_type,
"extracted_data": json.loads(assistant_message),
"usage": {
"total_tokens": total_tokens,
"cost_usd": round(cost_usd, 4),
"cost_jpy": round(cost_jpy, 2)
},
"model": self.model,
"recognized_at": datetime.utcnow().isoformat()
}
def compare_drawings(self, drawing1_path: str,
drawing2_path: str) -> Dict[str, Any]:
"""2つの図面を比較し、差分を検出"""
prompt = """これら2つの製造図面を比較し、
以下の項目を检出してください:
- 寸法公差の変更点
- 材料仕様の変更点
- 工程内容の変更点
- 新規追加・削除された要件
比較結果をJSON形式で返してください。"""
result = self._make_multimodal_request(
content=prompt,
images=[drawing1_path, drawing2_path]
)
return {
"comparison_result": json.loads(result["choices"][0]["message"]["content"]),
"drawing1": drawing1_path,
"drawing2": drawing2_path,
"model": self.model
}
使用例
if __name__ == "__main__":
service = GeminiService()
# 工程作業指示書の認識
result = service.recognize_drawing(
drawing_path="/path/to/process_sheet.png",
drawing_type="process_sheet"
)
print(f"認識完了 - コスト: ¥{result['usage']['cost_jpy']}")
print(json.dumps(result["extracted_data"], ensure_ascii=False, indent=2))
統一API Key 権限治理サービス
# src/services/permission_service.py
import httpx
from typing import Optional, Dict, List, Any
from datetime import datetime, timedelta
from enum import Enum
class PermissionLevel(Enum):
"""API Key 権限レベル定義"""
ADMIN = "admin" # 全権限
ENGINEER = "engineer" # 工艺路线读写 + 図面参照
OPERATOR = "operator" # 工艺路线参照のみ
VIEWER = "viewer" # 参照のみ
class PermissionService:
"""HolySheep API Key 権限治理サービス
MES システム内の複数チーム・部门に対して、
異なる API アクセス権限を一元管理します。
"""
# 権限マトリクス
PERMISSION_MATRIX = {
PermissionLevel.ADMIN: {
"deepseek": ["chat/completions", "models/list"],
"gemini": ["chat/completions"],
"rate_limit_per_minute": 1000,
"monthly_token_limit": 100_000_000
},
PermissionLevel.ENGINEER: {
"deepseek": ["chat/completions"],
"gemini": ["chat/completions"],
"rate_limit_per_minute": 200,
"monthly_token_limit": 10_000_000
},
PermissionLevel.OPERATOR: {
"deepseek": ["chat/completions"],
"gemini": [],
"rate_limit_per_minute": 50,
"monthly_token_limit": 1_000_000
},
PermissionLevel.VIEWER: {
"deepseek": [],
"gemini": [],
"rate_limit_per_minute": 10,
"monthly_token_limit": 100_000
}
}
def __init__(self, admin_api_key: Optional[str] = None):
self.admin_api_key = admin_api_key
self.base_url = settings.holysheep_base_url
def check_permission(self, user_api_key: str,
model: str,
endpoint: str) -> Dict[str, Any]:
"""API Key の権限を検証
Args:
user_api_key: ユーザーAPIキー
model: 使用モデル(deepseek-chat, gemini-2.0-flash-exp等)
endpoint: エンドポイントパス
Returns:
権限検証結果
"""
# 権限マトリクスからユーザー権限を判定(實際運用ではDB参照)
user_level = self._get_user_permission_level(user_api_key)
if user_level is None:
return {
"allowed": False,
"reason": "Invalid API Key",
"timestamp": datetime.utcnow().isoformat()
}
matrix = self.PERMISSION_MATRIX.get(user_level, {})
# モデル对应的権限チェック
model_type = "deepseek" if "deepseek" in model else "gemini"
allowed_endpoints = matrix.get(model_type, [])
if endpoint not in allowed_endpoints:
return {
"allowed": False,
"reason": f"Endpoint '{endpoint}' not permitted for {user_level.value}",
"user_level": user_level.value,
"timestamp": datetime.utcnow().isoformat()
}
# レートリミットチェック
current_usage = self._get_current_usage(user_api_key)
rate_limit = matrix.get("rate_limit_per_minute", 0)
if current_usage["requests_this_minute"] >= rate_limit:
return {
"allowed": False,
"reason": "Rate limit exceeded",
"limit": rate_limit,
"current": current_usage["requests_this_minute"],
"timestamp": datetime.utcnow().isoformat()
}
# 月次トークンリミットチェック
monthly_limit = matrix.get("monthly_token_limit", 0)
if current_usage["monthly_tokens"] >= monthly_limit:
return {
"allowed": False,
"reason": "Monthly token limit exceeded",
"limit": monthly_limit,
"current": current_usage["monthly_tokens"],
"timestamp": datetime.utcnow().isoformat()
}
return {
"allowed": True,
"user_level": user_level.value,
"rate_limit_remaining": rate_limit - current_usage["requests_this_minute"],
"monthly_tokens_remaining": monthly_limit - current_usage["monthly_tokens"],
"timestamp": datetime.utcnow().isoformat()
}
def create_audit_log(self, user_api_key: str,
action: str,
model: str,
success: bool,
details: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
"""監査ログの記録"""
log_entry = {
"timestamp": datetime.utcnow().isoformat(),
"api_key_hash": hash(user_api_key) % 10**10, # キーのハッシュ化(秘匿)
"action": action,
"model": model,
"success": success,
"details": details or {},
"ip_address": "system", # 實際にはリクエストから取得
"user_agent": "MES-Assistant/1.0"
}
# 實際にはDBに保存
print(f"[AUDIT] {log_entry}")
return log_entry
def generate_team_report(self, team_id: str,
start_date: datetime,
end_date: datetime) -> Dict[str, Any]:
"""チーム単位の使用量レポート生成"""
# 監査ログからの集計(實際にはDBクエリ)
return {
"team_id": team_id,
"period": {
"start": start_date.isoformat(),
"end": end_date.isoformat()
},
"summary": {
"total_requests": 0,
"total_tokens": 0,
"cost_usd": 0.0,
"cost_jpy": 0.0,
"by_model": {
"deepseek-chat": {"tokens": 0, "cost": 0.0},
"gemini-2.0-flash-exp": {"tokens": 0, "cost": 0.0}
}
},
"active_users": 0,
"generated_at": datetime.utcnow().isoformat()
}
def _get_user_permission_level(self, api_key: str) -> Optional[PermissionLevel]:
"""API Key から権限レベルを取得(實際にはDB参照)"""
# デモ用の簡易実装
if "admin" in api_key.lower():
return PermissionLevel.ADMIN
elif "engineer" in api_key.lower():
return PermissionLevel.ENGINEER
elif "operator" in api_key.lower():
return PermissionLevel.OPERATOR
elif "viewer" in api_key.lower():
return PermissionLevel.VIEWER
return PermissionLevel.VIEWER # デフォルト
def _get_current_usage(self, api_key: str) -> Dict[str, Any]:
"""現在の使用量を取得(實際にはRedis/DB参照)"""
# デモ用の返り値
return {
"requests_this_minute": 5,
"monthly_tokens": 500_000
}
FastAPI ミドルウェア例
from fastapi import Request, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
security = HTTPBearer()
async def verify_api_permission(
credentials: HTTPAuthorizationCredentials,
request: Request
):
"""APIリクエストの権限検証ミドルウェア"""
permission_service = PermissionService()
# リクエスト詳細からモデル・エンドポイントを抽出
model = request.state.model if hasattr(request.state, "model") else "unknown"
endpoint = request.url.path
result = permission_service.check_permission(
user_api_key=credentials.credentials,
model=model,
endpoint=endpoint
)
if not result["allowed"]:
raise HTTPException(
status_code=403,
detail=result["reason"]
)
return result
FastAPI ROUTER:MES API エンドポイント
# src/routers/mes_api.py
from fastapi import APIRouter, UploadFile, File, Depends, HTTPException, Header
from typing import Optional, List
from pydantic import BaseModel
from src.services.deepseek_service import DeepSeekService
from src.services.gemini_service import GeminiService
from src.services.permission_service import PermissionService, PermissionLevel
router = APIRouter(prefix="/api/v1/mes", tags=["MES Assistant"])
リクエスト/レスポンスモデル
class ProcessRouteRequest(BaseModel):
product_name: str
specifications: dict
constraints: Optional[dict] = None
class ProcessRouteResponse(BaseModel):
product_name: str
process_route: dict
usage: dict
model: str
inferred_at: str
class DrawingRecognitionResponse(BaseModel):
drawing_path: str
drawing_type: str
extracted_data: dict
usage: dict
model: str
recognized_at: str
依存性注入
def get_api_key(x_api_key: str = Header(..., alias="X-API-Key")) -> str:
return x_api_key
@router.post("/process-route/infer", response_model=ProcessRouteResponse)
async def infer_process_route(
request: ProcessRouteRequest,
api_key: str = Depends(get_api_key)
):
"""工艺路线の自動推理
製品仕様からDeepSeekが最適な工艺路线を自動生成します。
"""
permission_service = PermissionService()
permission = permission_service.check_permission(
api_key, "deepseek-chat", "chat/completions"
)
if not permission["allowed"]:
raise HTTPException(403,