Shared Python best practices for LlamaFarm. Covers patterns, async, typing, testing, error handling, and security.
Shared Python best practices and code review checklists for all Python components in the LlamaFarm monorepo.
| Component | Path | Python | Key Dependencies |
|---|---|---|---|
| Server | server/ |
3.12+ | FastAPI, Celery, Pydantic, structlog |
| RAG | rag/ |
3.11+ | LlamaIndex, ChromaDB, Celery |
| Universal Runtime | runtimes/universal/ |
3.11+ | PyTorch, transformers, FastAPI |
| Config | config/ |
3.11+ | Pydantic, JSONSchema |
| Common | common/ |
3.10+ | HuggingFace Hub |
| Topic | File | Key Points |
|---|---|---|
| Patterns | patterns.md | Dataclasses, Pydantic, comprehensions, imports |
| Async | async.md | async/await, asyncio, concurrent execution |
| Typing | typing.md | Type hints, generics, protocols, Pydantic |
| Testing | testing.md | Pytest fixtures, mocking, async tests |
| Errors | error-handling.md | Custom exceptions, logging, context managers |
| Security | security.md | Path traversal, injection, secrets, deserialization |
LlamaFarm uses ruff with shared configuration in ruff.toml:
line-length = 88
target-version = "py311"
select = ["E", "F", "I", "B", "UP", "SIM"]
Key rules:
from pydantic_settings import BaseSettings
class Settings(BaseSettings, env_file=".env"):
LOG_LEVEL: str = "INFO"
HOST: str = "0.0.0.0"
PORT: int = 14345
settings = Settings() # Singleton at module level
from core.logging import FastAPIStructLogger # Server
from core.logging import RAGStructLogger # RAG
from core.logging import UniversalRuntimeLogger # Runtime
logger = FastAPIStructLogger(__name__)
logger.info("Operation completed", extra={"count": 10, "duration_ms": 150})
from abc import ABC, abstractmethod
class Component(ABC):
def __init__(self, name: str, config: dict[str, Any] | None = None):
self.name = name or self.__class__.__name__
self.config = config or {}
@abstractmethod
def process(self, documents: list[Document]) -> ProcessingResult:
pass
from dataclasses import dataclass, field
@dataclass
class Document:
content: str
metadata: dict[str, Any] = field(default_factory=dict)
id: str = field(default_factory=lambda: str(uuid.uuid4()))
from pydantic import BaseModel, Field, ConfigDict
class EmbeddingRequest(BaseModel):
model: str
input: str | list[str]
encoding_format: Literal["float", "base64"] | None = "float"
model_config = ConfigDict(str_strip_whitespace=True)
Each Python component follows this structure:
component/
āāā pyproject.toml # UV-managed dependencies
āāā core/ # Core functionality
ā āāā __init__.py
ā āāā settings.py # Pydantic Settings
ā āāā logging.py # structlog setup
āāā services/ # Business logic (server)
āāā models/ # ML models (runtime)
āāā tasks/ # Celery tasks (rag)
āāā utils/ # Utility functions
āāā tests/
āāā conftest.py # Shared fixtures
āāā test_*.py
When reviewing Python code in LlamaFarm:
Patterns (Medium priority)
Async (High priority)
Typing (Medium priority)
Testing (Medium priority)
Errors (High priority)
Security (Critical priority)
See individual topic files for detailed checklists with grep patterns.