Spaces:
Runtime error
Runtime error
Update pipelines/openai_ingest.py
Browse files- pipelines/openai_ingest.py +6 -17
pipelines/openai_ingest.py
CHANGED
|
@@ -14,11 +14,9 @@ _client = None
|
|
| 14 |
def _client_lazy():
|
| 15 |
global _client
|
| 16 |
if _client is None:
|
| 17 |
-
key = os.environ.get("OPENAI_API_KEY") or os.environ.get("OPENAI_APIKEY") # ←
|
| 18 |
if not key:
|
| 19 |
-
raise RuntimeError(
|
| 20 |
-
"OPENAI_API_KEY (または OPENAI_APIKEY) が未設定です。Spaces > Settings > Variables and secrets で追加してください。"
|
| 21 |
-
)
|
| 22 |
_client = OpenAI(api_key=key)
|
| 23 |
return _client
|
| 24 |
|
|
@@ -35,7 +33,6 @@ def _pdf_to_images(pdf_bytes: bytes, dpi: int = 220, max_pages: int = 10) -> Lis
|
|
| 35 |
|
| 36 |
|
| 37 |
def extract_text_with_openai(payload: bytes, filename: str, filetype: str) -> str:
|
| 38 |
-
"""画像/PDFは画像化してVisionに渡す。テキストは整形依頼してきれいな本文を返す。"""
|
| 39 |
client = _client_lazy()
|
| 40 |
|
| 41 |
images: List[Image.Image] = []
|
|
@@ -43,11 +40,9 @@ def extract_text_with_openai(payload: bytes, filename: str, filetype: str) -> st
|
|
| 43 |
images = _pdf_to_images(payload)
|
| 44 |
elif filetype == "image":
|
| 45 |
images = [Image.open(io.BytesIO(payload)).convert("RGB")]
|
| 46 |
-
else:
|
| 47 |
text = payload.decode("utf-8", errors="ignore")
|
| 48 |
-
prompt =
|
| 49 |
-
"以下は履歴書/職務経歴書の本文です。レイアウトノイズを除去し、見出しや箇条書きを維持しつつ読みやすいテキストに整形して返してください。"
|
| 50 |
-
)
|
| 51 |
resp = client.responses.create(
|
| 52 |
model=MODEL_TEXT,
|
| 53 |
input=[
|
|
@@ -61,15 +56,9 @@ def extract_text_with_openai(payload: bytes, filename: str, filetype: str) -> st
|
|
| 61 |
{"type": "input_text", "text": "日本語の履歴書/職務経歴書の画像です。OCRして本文を日本語テキストで忠実に返してください。"}
|
| 62 |
]
|
| 63 |
for img in images:
|
| 64 |
-
content.append({
|
| 65 |
-
"type": "input_image",
|
| 66 |
-
"image_data": _img_to_base64(img),
|
| 67 |
-
})
|
| 68 |
|
| 69 |
-
resp = client.responses.create(
|
| 70 |
-
model=MODEL_VISION,
|
| 71 |
-
input=[{"role": "user", "content": content}],
|
| 72 |
-
)
|
| 73 |
return resp.output_text
|
| 74 |
|
| 75 |
|
|
|
|
| 14 |
def _client_lazy():
|
| 15 |
global _client
|
| 16 |
if _client is None:
|
| 17 |
+
key = os.environ.get("OPENAI_API_KEY") or os.environ.get("OPENAI_APIKEY") # ← フォールバック
|
| 18 |
if not key:
|
| 19 |
+
raise RuntimeError("OPENAI_API_KEY (または OPENAI_APIKEY) が未設定です。SpacesのSecretsに追加してください。")
|
|
|
|
|
|
|
| 20 |
_client = OpenAI(api_key=key)
|
| 21 |
return _client
|
| 22 |
|
|
|
|
| 33 |
|
| 34 |
|
| 35 |
def extract_text_with_openai(payload: bytes, filename: str, filetype: str) -> str:
|
|
|
|
| 36 |
client = _client_lazy()
|
| 37 |
|
| 38 |
images: List[Image.Image] = []
|
|
|
|
| 40 |
images = _pdf_to_images(payload)
|
| 41 |
elif filetype == "image":
|
| 42 |
images = [Image.open(io.BytesIO(payload)).convert("RGB")]
|
| 43 |
+
else:
|
| 44 |
text = payload.decode("utf-8", errors="ignore")
|
| 45 |
+
prompt = "以下は履歴書/職務経歴書の本文です。レイアウトノイズを除去し、見出しや箇条書きを維持しつつ読みやすいテキストに整形して返してください。"
|
|
|
|
|
|
|
| 46 |
resp = client.responses.create(
|
| 47 |
model=MODEL_TEXT,
|
| 48 |
input=[
|
|
|
|
| 56 |
{"type": "input_text", "text": "日本語の履歴書/職務経歴書の画像です。OCRして本文を日本語テキストで忠実に返してください。"}
|
| 57 |
]
|
| 58 |
for img in images:
|
| 59 |
+
content.append({"type": "input_image", "image_data": _img_to_base64(img)})
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
+
resp = client.responses.create(model=MODEL_VISION, input=[{"role": "user", "content": content}])
|
|
|
|
|
|
|
|
|
|
| 62 |
return resp.output_text
|
| 63 |
|
| 64 |
|