from __future__ import annotations import base64 import html import json import re from typing import Any from document_processing import MAX_DOCUMENT_BYTES, MAX_PAGES EMPTY_TEXT = """
Ready to parse Run Cohere Parse to extract this document's content.
""" EMPTY_TABLES = """
No rendered tables yet Tables found by Cohere Parse will appear here.
""" def format_bytes(value: int) -> str: if value <= 0: return "0 MB" megabytes = value / (1024 * 1024) precision = 0 if megabytes >= 10 else 1 return f"{megabytes:.{precision}f} MB" def format_duration(milliseconds: int | float) -> str: if milliseconds < 1000: return f"{round(milliseconds)} MS" return f"{milliseconds / 1000:.1f} S" def header_html() -> str: return """
Parse Parse documentation
""" def upload_intro_html() -> str: return f"""

Parse a document

Extract text, tables, and document structure from PDFs and images.

PDF, PNG, JPEG, or WebP · {MAX_PAGES} pages · {format_bytes(MAX_DOCUMENT_BYTES)} maximum

""" def privacy_html() -> str: return """
Uploaded documents are converted to page images and sent to Cohere for processing. Do not upload documents containing information you are not authorized to share. Cohere Privacy Policy
""" def progress_html(message: str, *, upload: bool = False) -> str: safe_message = html.escape(message) classes = "upload-progress" if upload else "run-status is-running" return f"""
{safe_message}
""" def output_progress_html(page_number: int, page_count: int) -> str: return f"""
Parsing document Processing page {page_number} / {page_count}
""" def file_strip_html(state: dict) -> str: completed = [result for result in state["results"] if result] elapsed = sum(result.get("elapsed_ms", 0) for result in completed) characters = sum(result.get("output_chars", 0) for result in completed) icon = "filetype_doc.svg" if state["kind"] == "pdf" else "filetype_image.svg" safe_name = html.escape(state["name"]) if completed: metrics = ( f'{format_duration(elapsed)}' f'{len(completed)}/{len(state["pages"])} PARSED' f'{characters:,} CHARS' ) else: metrics = ( f"{len(state['pages'])} page" f"{'s' if len(state['pages']) != 1 else ''} ready" f"{format_bytes(state['size'])}" ) return f"""
{safe_name}
{metrics}
""" def page_limit_html(state: dict) -> str: if state["total_pages"] <= MAX_PAGES: return "" skipped = state["total_pages"] - len(state["pages"]) suffix = "page" if skipped == 1 else "pages" return f""" """ def settings_html(state: dict) -> str: return """

Configuration

Parse settings

""" def page_context_html(state: dict) -> str: page_count = len(state["pages"]) current = state["current_page"] + 1 if page_count <= 1: return "" remaining = [number for number in range(current + 1, page_count + 1)] if not remaining: return f'of {page_count}' if len(remaining) <= 3: labels = [str(number) for number in remaining] else: labels = [str(remaining[0]), "…", str(page_count)] return "".join(f"{html.escape(label)}" for label in labels) def zoom_label_html(zoom: int) -> str: return f'{max(1, min(100, zoom))}%' def status_html( state: dict, *, running: bool = False, running_page: int | None = None, error: str = "", ) -> str: if error: return ( '
' '' '
Parse failed' f"{html.escape(error)}
" ) completed = sum(result is not None for result in state["results"]) if running: page_number = running_page or state["current_page"] + 1 return progress_html( f"Processing page {page_number} / {len(state['pages'])}" ) if completed == len(state["pages"]) and completed: return ( '
' '' f"{completed} page{'s' if completed != 1 else ''} parsed" "
" ) return "" def _box_html(box: dict, index: int) -> str: x1, y1, x2, y2 = box["bbox"] left = x1 * 100 top = y1 * 100 width = (x2 - x1) * 100 height = (y2 - y1) * 100 label = html.escape(box.get("label", "element")) color_class = f"box-color-{index % 4}" return f""" {label} """ def zoom_width(zoom: int) -> float: bounded = max(1, min(100, zoom)) if bounded <= 50: return 50 + bounded return 100 + ((bounded - 50) * 1.2) def viewer_html(state: dict, *, show_boxes: bool, zoom: int) -> str: page = state["pages"][state["current_page"]] result = state["results"][state["current_page"]] encoded = base64.b64encode(page["png"]).decode("ascii") boxes = result.get("boxes", []) if result and show_boxes else [] overlays = "".join(_box_html(box, index) for index, box in enumerate(boxes)) return f"""
Rendered document page {page[ {overlays}
""" def output_values(state: dict, *, render_tables: bool) -> tuple[str, str, str]: result = state["results"][state["current_page"]] if not result: return EMPTY_TEXT, EMPTY_TABLES, "" text_output = result.get("text_html") or ( '
No text returned
' ) if render_tables and result.get("tables_html"): tables = f'
{result["tables_html"]}
' elif not render_tables: tables = """
Rendered tables are hidden Enable the table setting to inspect extracted tables.
""" else: tables = EMPTY_TABLES return text_output, tables, result.get("raw_output", "") def download_html(state: dict) -> str: if not state or not all(state["results"]): return "" payload = { "document": { "name": state["name"], "total_pages": state["total_pages"], "processed_pages": len(state["pages"]), }, "pages": [ { "page": page["number"], "text": result.get("text_output", result["raw_output"]), "response": result.get("response"), "bounding_boxes": result["boxes"], "elapsed_ms": result["elapsed_ms"], "model": result["model"], "usage": result["usage"], "request_id": result["request_id"], } for page, result in zip(state["pages"], state["results"]) ], } encoded = base64.b64encode( json.dumps(payload, indent=2, ensure_ascii=True).encode("utf-8") ).decode("ascii") stem = re.sub(r"[^a-zA-Z0-9._-]+", "-", state["name"]).strip("-") filename = f"{stem or 'cohere-parse'}-results.json" return f""" Download JSON """ def configuration_required_html(api_key_name: str | None = None) -> str: if api_key_name: detail = ( f"Add the {html.escape(api_key_name)} secret in the Space settings " "before parsing." ) else: detail = "Set COHERE_ENV to either staging or production." return f""" """