Some checks failed
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 28s
CI / test-go-edu-search (push) Successful in 29s
CI / test-python-klausur (push) Failing after 2m31s
CI / test-python-agent-core (push) Successful in 20s
CI / test-nodejs-website (push) Successful in 23s
grid/ package (16 files): grid/build/ — core, zones, cleanup, text_ops, cell_ops, finalize grid/editor/ — api, helpers, columns, filters, headers, zones vocab/ package (10 files): vocab/worksheet/ — api, models, extraction, generation, ocr, upload, analysis, compare vocab/ — session_store, learn_bridge 26 backward-compat shims. Internal imports relative. RAG untouched. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
"""
|
|
Grid Editor API — unified grid endpoints.
|
|
"""
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
|
|
from ocr_pipeline_session_store import (
|
|
get_session_db,
|
|
update_session_db,
|
|
)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(prefix="/api/v1/ocr-pipeline", tags=["grid-editor"])
|
|
|
|
|
|
@router.post("/sessions/{session_id}/build-unified-grid")
|
|
async def build_unified_grid_endpoint(session_id: str):
|
|
"""Build a single-zone unified grid merging content + box zones.
|
|
|
|
Takes the existing multi-zone grid_editor_result and produces a
|
|
unified grid where boxes are integrated into the main row sequence.
|
|
Persists as unified_grid_result (preserves original multi-zone data).
|
|
"""
|
|
session = await get_session_db(session_id)
|
|
if not session:
|
|
raise HTTPException(status_code=404, detail=f"Session {session_id} not found")
|
|
|
|
grid_data = session.get("grid_editor_result")
|
|
if not grid_data:
|
|
raise HTTPException(status_code=400, detail="No grid data. Run build-grid first.")
|
|
|
|
from unified_grid import build_unified_grid
|
|
|
|
result = build_unified_grid(
|
|
zones=grid_data.get("zones", []),
|
|
image_width=grid_data.get("image_width", 0),
|
|
image_height=grid_data.get("image_height", 0),
|
|
layout_metrics=grid_data.get("layout_metrics", {}),
|
|
)
|
|
|
|
# Persist as separate field (don't overwrite original multi-zone grid)
|
|
await update_session_db(session_id, unified_grid_result=result)
|
|
|
|
logger.info(
|
|
"build-unified-grid session %s: %d rows, %d cells",
|
|
session_id,
|
|
result.get("summary", {}).get("total_rows", 0),
|
|
result.get("summary", {}).get("total_cells", 0),
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
@router.get("/sessions/{session_id}/unified-grid")
|
|
async def get_unified_grid(session_id: str):
|
|
"""Retrieve the unified grid for a session."""
|
|
session = await get_session_db(session_id)
|
|
if not session:
|
|
raise HTTPException(status_code=404, detail=f"Session {session_id} not found")
|
|
|
|
result = session.get("unified_grid_result")
|
|
if not result:
|
|
raise HTTPException(
|
|
status_code=404,
|
|
detail="No unified grid. Run build-unified-grid first.",
|
|
)
|
|
|
|
return result
|