コンテンツにスキップ

ページ読み取り

記述子の kind を通じて汎用ルーティングラダーへ参加する読み取り機能、OCR エンジン、ビジョンモデルを追加します。

汎用読み取り機能は PageReader プロトコルを実装し、ルーティングラダー内の位置を決める kind を宣言します。この例は CPU の OCR レーンです。read_with_engine() は独自コードを表し、indx と接する部分はすべて実際の公開契約です。パッケージ化とインストールは概要の手順に従います。

from typing import Any
from indx_interfaces import (
BlockStatus,
CapabilityDescriptor,
CapabilityId,
CapabilityKind,
Device,
PageOutput,
)
CAPABILITY_ID = CapabilityId("acme-ocr")
class Reader:
def read(
self, content: bytes, media_type: str, pages: tuple[int, ...]
) -> tuple[PageOutput, ...]:
outputs = []
for page in pages:
try:
text, metadata = read_with_engine(content, media_type, page)
outputs.append(PageOutput(page=page, text=text, metadata=metadata))
except Exception as error:
outputs.append(
PageOutput(
page=page,
status=BlockStatus.FAILED,
reason=str(error),
)
)
return tuple(outputs)
class Provider:
def descriptors(self) -> tuple[CapabilityDescriptor, ...]:
return (
CapabilityDescriptor(
id=CAPABILITY_ID,
version="1",
kind=CapabilityKind.OCR,
devices=(Device.CPU,),
media_types=("application/pdf",),
available=True,
),
)
def create(self, capability_id: CapabilityId) -> Any:
if capability_id != CAPABILITY_ID:
raise ValueError(f"unknown capability: {capability_id}")
return Reader()

重い実行環境は create()read()、または遅延インポートする実装モジュール内で読み込みます。探索はすべてのスナップショット構築時に descriptors() を呼ぶため、モデルの重み、GPU の初期化、外部サービスへの接続を行ってはいけません。