Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions apps/inference_api/models/schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from pydantic import BaseModel, Field
from typing import List, Optional

class BiologyRequest(BaseModel):
sequence: str = Field(..., description="Protein sequence")
model_version: str = Field(default="2", pattern="^[12]$")
confidence_threshold: float = Field(default=0.8, ge=0.0, le=1.0)
explain: bool = Field(default=False, description="Enable XAI explanation")
mode: Optional[str] = Field(default=None, description="Inference mode, e.g., 'speculative'")

class MaterialsRequest(BaseModel):
structure: str = Field(..., description="Material structure")
model_version: str = Field(default="2", pattern="^[12]$")
energy_threshold: float = Field(default=0.5, ge=0.0)
explain: bool = Field(default=False, description="Enable XAI explanation")
mode: Optional[str] = Field(default=None, description="Inference mode, e.g., 'speculative'")

class BatchBiologyRequest(BaseModel):
requests: List[BiologyRequest]

class BatchMaterialsRequest(BaseModel):
requests: List[MaterialsRequest]

class PipelineRequest(BaseModel):
query: str = Field(..., description="The natural language query to initiate the pipeline.")

class LLMRequest(BaseModel):
prompt: str = Field(..., description="Prompt for the LLM.")
max_tokens: int = Field(default=100, ge=10, le=512)

class BenchmarkRequest(BaseModel):
model_type: str = Field(..., description="Model to benchmark", pattern="^(bio|materials|llm)$")
model_version: str = Field(default="1", description="Model version to benchmark")
test_duration_seconds: int = Field(default=10, ge=5, le=60, description="Duration of the benchmark test in seconds.")

class DatasetRequest(BaseModel):
model_type: str = Field(..., pattern="^(bio|materials)$")
model_version: str = Field(default="2", pattern="^[12]$")
size: int = Field(default=100, ge=10, le=1000)
17 changes: 17 additions & 0 deletions apps/inference_api/src/auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from fastapi import HTTPException, Security
from fastapi.security.api_key import APIKeyHeader
import os

API_KEY_HEADER = APIKeyHeader(name="X-API-Key", auto_error=True)

async def verify_api_key(api_key: str = Security(API_KEY_HEADER)):
"""Verify API key from header"""
# For development, use a hardcoded key. In production, use environment variables
VALID_API_KEY = os.getenv("API_KEY", "development_key")

if api_key != VALID_API_KEY:
raise HTTPException(
status_code=401,
detail="Invalid API Key"
)
return api_key
48 changes: 48 additions & 0 deletions apps/inference_api/src/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# src/Config.py
import os
import json

class Config:
"""
Configuration class to manage settings for the application.
Loads configuration from a JSON file and provides access to settings.
"""

def __init__(self, config_file='config.json'):
self.config_file = config_file
self.settings = {}
self.load_config()

def load_config(self):
"""Load configuration from a JSON file."""
if not os.path.exists(self.config_file):
raise FileNotFoundError(f"Configuration file not found: {self.config_file}")

with open(self.config_file, 'r') as f:
self.settings = json.load(f)

def get(self, key, default=None):
"""Get a configuration setting by key."""
return self.settings.get(key, default)

def set(self, key, value):
"""Set a configuration setting by key and save it."""
self.settings[key] = value
self.save_config()

def save_config(self):
"""Save the current settings to the configuration file."""
with open(self.config_file, 'w') as f:
json.dump(self.settings, f, indent=4)

def __getitem__(self, key):
"""Get a configuration setting using dictionary-like access."""
return self.get(key)

def __setitem__(self, key, value):
"""Set a configuration setting using dictionary-like access."""
self.set(key, value)

def __repr__(self):
"""String representation of the configuration settings."""
return f"Config(settings={self.settings})"
Loading