Istvan-Adem commited on
Commit
0e48a80
·
1 Parent(s): 2cace27
ocr/api/message/openai_request.py CHANGED
@@ -1,28 +1,17 @@
1
- import asyncio
2
- import io
3
-
4
- from starlette.datastructures import UploadFile
5
-
6
  from ocr.api.message.prompts import OCRPrompts
7
- from ocr.api.message.utils import clean_assistant_response
8
- from ocr.core.config import settings
9
 
10
 
11
- async def analyze_uploaded_document(file: UploadFile):
12
- contents = await file.read()
13
- openai_file = io.BytesIO(contents)
14
- openai_file.name = file.filename
15
- thread, openai_file = await asyncio.gather(
16
- settings.OPENAI_CLIENT.beta.threads.create(),
17
- settings.OPENAI_CLIENT.files.create(purpose='assistants', file=openai_file)
18
- )
19
- await settings.OPENAI_CLIENT.beta.threads.messages.create(
20
- attachments=[{"file_id": openai_file.id, "tools": [{"type": "file_search"}]}],
21
- thread_id=thread.id,
22
- role="user",
23
- content='Generate a report on the attached document'
24
- )
25
- run = await settings.OPENAI_CLIENT.beta.threads.runs.create_and_poll(
26
- assistant_id=settings.ASSISTANT_ID, thread_id=thread.id, instructions=OCRPrompts.generate_general_answer
27
- )
28
- return await clean_assistant_response(thread.id, run.id)
 
 
 
 
 
 
1
  from ocr.api.message.prompts import OCRPrompts
2
+ from ocr.core.wrappers import openai_wrapper
 
3
 
4
 
5
+ @openai_wrapper(model='gpt-4o-mini')
6
+ async def generate_report(request_content: list[dict]):
7
+ messages = [
8
+ {
9
+ "role": "system",
10
+ "content": OCRPrompts.generate_general_answer
11
+ },
12
+ {
13
+ "role": "user",
14
+ "content": request_content
15
+ }
16
+ ]
17
+ return messages
 
 
 
 
 
ocr/api/message/utils.py CHANGED
@@ -1,18 +1,40 @@
 
 
1
  import re
2
 
3
- from ocr.core.config import settings
4
 
5
 
6
- async def clean_assistant_response(thread_id: str, run_id: str):
7
- result = ''
8
- async for message in settings.OPENAI_CLIENT.beta.threads.messages.list(thread_id=thread_id, run_id=run_id):
9
- message_content = message.content[0].text
10
- annotations = message_content.annotations
11
- for annotation in annotations:
12
- message_content.value = message_content.value.replace(annotation.text, f"")
13
- result = message_content.value
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  try:
15
- result = re.search(r'```markdown\s*(.*?)\s*```', result, re.DOTALL).group(1)
16
  except Exception as e:
17
  pass
18
- return result
 
1
+ import base64
2
+ import io
3
  import re
4
 
5
+ from pdf2image import convert_from_bytes
6
 
7
 
8
+ def divide_images(contents: bytes) -> list[bytes]:
9
+ images = convert_from_bytes(contents, dpi=250)
10
+ image_bytes_list = []
11
+ for image in images:
12
+ img_byte_array = io.BytesIO()
13
+ image.save(img_byte_array, format='PNG')
14
+ img_byte_array.seek(0)
15
+ image_bytes_list.append(img_byte_array.read())
16
+ return image_bytes_list
17
+
18
+
19
+ def prepare_request_content(images: list[bytes]):
20
+ content = [
21
+ {"type": "text", "text": "Generate a report on the attached document"},
22
+ *[
23
+ {
24
+ "type": "image_url",
25
+ "image_url": {
26
+ "url": f"data:image/jpeg;base64,{base64.b64encode(image).decode('utf-8')}",
27
+ },
28
+ }
29
+ for image in images
30
+ ]
31
+ ]
32
+ return content
33
+
34
+
35
+ def clean_response(text: str) -> str:
36
  try:
37
+ text = re.search(r'```markdown\s*(.*?)\s*```', text, re.DOTALL).group(1)
38
  except Exception as e:
39
  pass
40
+ return text
ocr/api/message/views.py CHANGED
@@ -1,8 +1,9 @@
1
  from fastapi import File, UploadFile
2
 
3
  from ocr.api.message import ocr_router
4
- from ocr.api.message.openai_request import analyze_uploaded_document
5
  from ocr.api.message.schemas import OcrResponse
 
6
  from ocr.core.wrappers import OcrResponseWrapper
7
 
8
 
@@ -10,5 +11,11 @@ from ocr.core.wrappers import OcrResponseWrapper
10
  async def get_all_chat_messages(
11
  file: UploadFile = File(...)
12
  ) -> OcrResponseWrapper[OcrResponse]:
13
- response = await analyze_uploaded_document(file)
14
- return OcrResponseWrapper(data=OcrResponse(text=response))
 
 
 
 
 
 
 
1
  from fastapi import File, UploadFile
2
 
3
  from ocr.api.message import ocr_router
4
+ from ocr.api.message.openai_request import generate_report
5
  from ocr.api.message.schemas import OcrResponse
6
+ from ocr.api.message.utils import divide_images, prepare_request_content, clean_response
7
  from ocr.core.wrappers import OcrResponseWrapper
8
 
9
 
 
11
  async def get_all_chat_messages(
12
  file: UploadFile = File(...)
13
  ) -> OcrResponseWrapper[OcrResponse]:
14
+ try:
15
+ contents = await file.read()
16
+ images = divide_images(contents)
17
+ request_content = prepare_request_content(images)
18
+ response = await generate_report(request_content)
19
+ return OcrResponseWrapper(data=OcrResponse(text=clean_response(response)))
20
+ finally:
21
+ await file.close()