Files
opus-orchestrator-ai/opus_orchestrator/texlive_client.py
T
2026-03-14 23:29:13 +00:00

101 lines
2.5 KiB
Python

"""TeX Live API Client for Opus Orchestrator.
Compiles LaTeX via remote TeX Live API service.
"""
import json
import base64
from typing import Optional, Dict, Any
from pathlib import Path
class TeXLiveClient:
"""Client for TeX Live API service."""
def __init__(self, base_url: str = "http://localhost:8080"):
"""Initialize TeX Live client.
Args:
base_url: Base URL of TeX Live API service
"""
self.base_url = base_url.rstrip("/")
def compile(
self,
tex_content: str,
engine: str = "xelatex",
timeout: int = 120,
) -> Dict[str, Any]:
"""Compile LaTeX via API.
Args:
tex_content: LaTeX source code
engine: LaTeX engine (xelatex, pdflatex, lualatex)
timeout: Compilation timeout in seconds
Returns:
Compilation result with PDF data
"""
import requests
response = requests.post(
f"{self.base_url}/compile",
json={
"tex": tex_content,
"engine": engine,
"timeout": timeout,
},
timeout=timeout + 10,
)
if response.status_code != 200:
raise RuntimeError(f"TeX Live API error: {response.text}")
result = response.json()
if result.get("error"):
raise RuntimeError(f"LaTeX compilation failed: {result['error']}")
return result
def compile_file(
self,
tex_path: str,
engine: str = "xelatex",
) -> bytes:
"""Compile LaTeX file via API.
Args:
tex_path: Path to .tex file
engine: LaTeX engine
Returns:
Compiled PDF as bytes
"""
tex_content = Path(tex_path).read_text()
result = self.compile(tex_content, engine)
# Decode PDF from base64
pdf_data = base64.b64decode(result["pdf"])
return pdf_data
def compile_via_texlive(
tex_content: str,
base_url: str = "http://localhost:8080",
engine: str = "xelatex",
) -> bytes:
"""Convenience function to compile LaTeX via TeX Live API.
Args:
tex_content: LaTeX source
base_url: TeX Live API URL
engine: LaTeX engine
Returns:
Compiled PDF bytes
"""
client = TeXLiveClient(base_url)
result = client.compile(tex_content, engine)
return base64.b64decode(result["pdf"])