orbitkit 0.9.26__tar.gz → 0.9.28__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. {orbitkit-0.9.26/orbitkit.egg-info → orbitkit-0.9.28}/PKG-INFO +1 -1
  2. orbitkit-0.9.28/orbitkit/VERSION +1 -0
  3. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/airflow_handler/file_flow_exit_process.py +41 -4
  4. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/airflow_handler/file_handler_v2.py +18 -0
  5. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_transformer/mineru/result_transformer.py +2 -2
  6. {orbitkit-0.9.26 → orbitkit-0.9.28/orbitkit.egg-info}/PKG-INFO +1 -1
  7. orbitkit-0.9.26/orbitkit/VERSION +0 -1
  8. {orbitkit-0.9.26 → orbitkit-0.9.28}/LICENSE +0 -0
  9. {orbitkit-0.9.26 → orbitkit-0.9.28}/MANIFEST.in +0 -0
  10. {orbitkit-0.9.26 → orbitkit-0.9.28}/README.md +0 -0
  11. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/__init__.py +0 -0
  12. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/airflow_handler/__init__.py +0 -0
  13. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/airflow_handler/data_preprocessing.py +0 -0
  14. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/airflow_handler/file_flow_entry.py +0 -0
  15. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/airflow_handler/file_flow_entry_process.py +0 -0
  16. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/airflow_handler/file_handler.py +0 -0
  17. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/audio_transcoder/__init__.py +0 -0
  18. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/audio_transcoder/netmind_extract_v1.py +0 -0
  19. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/constant/__init__.py +0 -0
  20. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/constant/report_schema.py +0 -0
  21. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/id_srv/__init__.py +0 -0
  22. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/id_srv/id_gen.py +0 -0
  23. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/id_srv/id_perm_like.py +0 -0
  24. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/lark_send/__init__.py +0 -0
  25. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/lark_send/lark.py +0 -0
  26. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/llm_tools/__init__.py +0 -0
  27. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/llm_tools/quick_rag_chat.py +0 -0
  28. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/orbit_type/__init__.py +0 -0
  29. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/orbit_type/doc_4_compile_rule.py +0 -0
  30. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/orbit_type/orbit_type_simple.py +0 -0
  31. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/orbit_type/tools.py +0 -0
  32. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_chunking/__init__.py +0 -0
  33. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_chunking/chunk_fallback.py +0 -0
  34. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_chunking/chunk_plan.py +0 -0
  35. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_chunking/page_limit.py +0 -0
  36. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_chunking/pdf_metadata.py +0 -0
  37. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_embedding/__init__.py +0 -0
  38. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_embedding/pdf_txt_embedding.py +0 -0
  39. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_embedding/pdf_txt_embedding_v2.py +0 -0
  40. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/__init__.py +0 -0
  41. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/a_stock_extractor_v1.py +0 -0
  42. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/exceptions.py +0 -0
  43. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/mineru_demo.py +0 -0
  44. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/pdf_block_extractor_base.py +0 -0
  45. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/pdf_block_extractor_v1.py +0 -0
  46. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/pdf_block_extractor_v2.py +0 -0
  47. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/pdf_extractor_azure.py +0 -0
  48. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/pdf_extractor_minerU_v1.py +0 -0
  49. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/pdf_extractor_netmind_v1.py +0 -0
  50. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/pdf_extractor_netmind_v2.py +0 -0
  51. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/pdf_extractor_netmind_v3.py +0 -0
  52. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor/pdf_extractor_orbit.py +0 -0
  53. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor_simple/__init__.py +0 -0
  54. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor_simple/base.py +0 -0
  55. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor_simple/cloud_provider.py +0 -0
  56. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor_simple/core.py +0 -0
  57. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor_simple/exceptions.py +0 -0
  58. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor_simple/extractors.py +0 -0
  59. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_extractor_simple/utils.py +0 -0
  60. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_pipeline_io/__init__.py +0 -0
  61. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_pipeline_io/cdn.py +0 -0
  62. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_pipeline_io/pg_task_store.py +0 -0
  63. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_quality/__init__.py +0 -0
  64. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_quality/failure_codes.py +0 -0
  65. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_quality/ocr_lang.py +0 -0
  66. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_quality/parse_record.py +0 -0
  67. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_quality/verdict.py +0 -0
  68. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_transformer/__init__.py +0 -0
  69. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_transformer/mineru/__init__.py +0 -0
  70. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_transformer/mineru/backends.py +0 -0
  71. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_transformer/mineru/bbox_rotation.py +0 -0
  72. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_validator/__init__.py +0 -0
  73. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_validator/filters/__init__.py +0 -0
  74. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_validator/filters/drop_invalid_bbox.py +0 -0
  75. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_validator/filters/drop_non_text.py +0 -0
  76. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_validator/filters/drop_vlm_artifacts.py +0 -0
  77. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_validator/filters/repeated_text.py +0 -0
  78. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_validator/pipeline.py +0 -0
  79. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_validator/registry.py +0 -0
  80. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_validator/validate.py +0 -0
  81. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_writer/__init__.py +0 -0
  82. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/pdf_writer/pdf_writer_simple.py +0 -0
  83. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/__init__.py +0 -0
  84. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/cache_asset_downloader.py +0 -0
  85. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/common.py +0 -0
  86. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/customize_regix_manager.py +0 -0
  87. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/is_xbrl_structure.py +0 -0
  88. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/secret_manager.py +0 -0
  89. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/universal_extractor.py +0 -0
  90. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_aliyun.py +0 -0
  91. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_aliyun_oss_simple.py +0 -0
  92. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_aws.py +0 -0
  93. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_aws_s3_wrapper.py +0 -0
  94. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_date.py +0 -0
  95. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_html.py +0 -0
  96. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_kafka.py +0 -0
  97. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_md5.py +0 -0
  98. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_selenium.py +0 -0
  99. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_simple_timer.py +0 -0
  100. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_str.py +0 -0
  101. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_type_mapping.py +0 -0
  102. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit/util/util_url.py +0 -0
  103. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit.egg-info/SOURCES.txt +0 -0
  104. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit.egg-info/dependency_links.txt +0 -0
  105. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit.egg-info/not-zip-safe +0 -0
  106. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit.egg-info/requires.txt +0 -0
  107. {orbitkit-0.9.26 → orbitkit-0.9.28}/orbitkit.egg-info/top_level.txt +0 -0
  108. {orbitkit-0.9.26 → orbitkit-0.9.28}/setup.cfg +0 -0
  109. {orbitkit-0.9.26 → orbitkit-0.9.28}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orbitkit
3
- Version: 0.9.26
3
+ Version: 0.9.28
4
4
  Summary: This project is only for Orbit Tech internal use.
5
5
  Home-page: https://github.com/clown-0726/orbitkit
6
6
  Author: Lilu Cao
@@ -0,0 +1 @@
1
+ 0.9.28
@@ -8,6 +8,9 @@ from orbitkit.constant.report_schema import SchemaKafkaIgnore
8
8
 
9
9
  logger = logging.getLogger(__name__)
10
10
 
11
+ # 页数异常失败码(op_attachment_failure_helper:MINERU_PAGE_COUNT_INVALID)
12
+ PAGE_COUNT_INVALID_CODE = '30009'
13
+
11
14
 
12
15
  class FlowUpdater:
13
16
 
@@ -40,6 +43,7 @@ class FlowUpdater:
40
43
 
41
44
  store_path_set = set()
42
45
  parent_id_store_path_map = {i['parent_id']: i['store_path'] for i in attachments_pdf}
46
+ parent_id_page_size_map = {i['parent_id']: i.get('page_size') for i in attachments_pdf}
43
47
  x_attachments_pdf = []
44
48
  for item in attachments:
45
49
  # The video branch will generate store_path_pre, so check for the existence of store_path_pre first.
@@ -53,14 +57,18 @@ class FlowUpdater:
53
57
  store_path_set.add(store_path)
54
58
  # new_store_path = store_path if store_path.lower().endswith('.pdf') else store_path + '.pdf'
55
59
  new_store_path = parent_id_store_path_map[parent_id]
56
- x_attachments_pdf.append({
60
+ attachment_pdf = {
57
61
  "store_path": new_store_path,
58
62
  "store_path_txt": "",
59
63
  "store_path_pre": store_path,
60
64
  "file_name": item['file_name'],
61
65
  "raw_is_pdf": 'true' if store_path.lower().endswith('.pdf') else 'false',
62
66
  "file_hash": id_srv.get_fix_short_id(new_store_path).get("short_id")
63
- })
67
+ }
68
+ # 页数取 op_attachment.page_size(解析成功时由解析服务写入),取不到置为空
69
+ page_size = parent_id_page_size_map.get(parent_id)
70
+ attachment_pdf["page_count"] = page_size if page_size is not None and page_size > 0 else None
71
+ x_attachments_pdf.append(attachment_pdf)
64
72
  return {
65
73
  'x_attachments_pdf': x_attachments_pdf,
66
74
  'x_status_list.status_convert.status': 'convert_done'
@@ -128,6 +136,12 @@ class FlowUpdater:
128
136
  'details': details
129
137
  }
130
138
 
139
+ @staticmethod
140
+ def _is_page_count_invalid(attachment_pdf):
141
+ """转化件页数(op_attachment.page_size)有值但不是正数。为空不算异常,回写时 page_count 置为空。"""
142
+ page_size = attachment_pdf.get('page_size')
143
+ return page_size is not None and page_size <= 0
144
+
131
145
  def update_mongo_data(self, report_id, data_source, update_params, kafka_ignore):
132
146
  if kafka_ignore:
133
147
  update_params.update({self.kafka_ignore.X_OTHERS_K_IGNORE_KEY: self.kafka_ignore.get_k_ignore_val()})
@@ -173,7 +187,8 @@ class FlowUpdater:
173
187
 
174
188
  db_doc = self._check_and_create_collection(data_source).find_one({'_id': report_id},
175
189
  {'_id': 1, 'x_attachments': 1,
176
- 'x_status_list': 1})
190
+ 'x_status_list': 1,
191
+ 'x_attachments_pdf': 1})
177
192
 
178
193
  if not db_doc:
179
194
  logger.warning(f"No document found with id {report_id}.")
@@ -184,10 +199,22 @@ class FlowUpdater:
184
199
  return
185
200
 
186
201
  db_store_path = {f"s3://{i['bucket']}/{i['store_path']}" for i in db_doc['x_attachments']}
202
+ steps = self.step_tuple[start_index:end_index + 1]
203
+
204
+ # 页数检查:提取成功但有转化件页数异常,整篇按提取失败处理(失败码 30009)。
205
+ # 改的是 exit_point 交过来的同一份记录:status 置为 failed 后,下面写 mongo 走现有提取失败分支,
206
+ # exit_point 随后把 op_meta 转 manual,并把标了 exit_failure_code 的附件记为失败(见 FileFlowHandleV2.exit_point)
207
+ if status == 'success' and 'extract' in steps:
208
+ invalid_attachments = [att for att in attachments_pdf if self._is_page_count_invalid(att)]
209
+ if invalid_attachments:
210
+ logger.error(f"Invalid page count: {report_id} {[att.get('store_path') for att in invalid_attachments]}")
211
+ for att in invalid_attachments:
212
+ att['exit_failure_code'] = PAGE_COUNT_INVALID_CODE
213
+ status = op_meta_record['status'] = 'failed'
187
214
 
188
215
  update_params = {}
189
216
  step_status = True
190
- for index, step in enumerate(self.step_tuple[start_index:end_index + 1], 1):
217
+ for index, step in enumerate(steps, 1):
191
218
  if step == end_stage and status == 'failed':
192
219
  step_status = False
193
220
  logger.info(f' Processing step-{index} {step} - {"successfully" if step_status else "failed"}.')
@@ -200,6 +227,16 @@ class FlowUpdater:
200
227
  if parse_record is not None:
201
228
  update_params['x_parse_record'] = parse_record
202
229
 
230
+ # 只重做提取(不重建 x_attachments_pdf):把 mongo 已有的 x_attachments_pdf 按 store_path 填上 PG 页数后整体写回,
231
+ # 以 PG 为准(取不到置为空);meta 写的标题、语言、摘要等字段原样带回
232
+ if status == 'success' and 'extract' in steps and 'x_attachments_pdf' not in update_params:
233
+ page_counts = {att['store_path']: att['page_size'] for att in attachments_pdf}
234
+ db_attachments_pdf = db_doc['x_attachments_pdf'] # 只重做提取时 mongo 必是 convert_done,x_attachments_pdf 必有
235
+ for att in db_attachments_pdf:
236
+ if att['store_path'] in page_counts:
237
+ att['page_count'] = page_counts[att['store_path']]
238
+ update_params['x_attachments_pdf'] = db_attachments_pdf
239
+
203
240
  if update_params:
204
241
  # logger.info(json.dumps(update_params, ensure_ascii=False, indent=2))
205
242
  self.update_mongo_data(report_id, data_source, update_params, kafka_ignore)
@@ -202,6 +202,23 @@ class FileFlowHandleV2:
202
202
 
203
203
  postgres_coon.execute(op_meta_stmt, {'op_meta_id': op_meta_id})
204
204
 
205
+ def _update_exit_failed_attachments(self, postgres_coon, meta_data):
206
+ """回更时判定失败的附件(FlowUpdater 标了 exit_failure_code,如页数异常 30009),按提取失败写回 op_attachment。"""
207
+ for attachment in meta_data.get('x_attachments_pdf') or []:
208
+ failure_code = attachment.get('exit_failure_code')
209
+ if not failure_code:
210
+ continue
211
+ stmt = (
212
+ update(self.table_op_attachment)
213
+ .where(self.table_op_attachment.c.id == attachment['id'])
214
+ .values(
215
+ status_extract='failed',
216
+ failure_code=failure_code,
217
+ updated_at=datetime.datetime.now(datetime.timezone.utc)
218
+ )
219
+ )
220
+ postgres_coon.execute(stmt)
221
+
205
222
  def _update_low_priority_processing_data(self, meta_id_set, params):
206
223
  meta_id_list = list(meta_id_set)
207
224
  if not meta_id_list:
@@ -457,6 +474,7 @@ class FileFlowHandleV2:
457
474
  self._delete_and_backup_data_from_queue(session, item)
458
475
  elif status == 'failed':
459
476
  self._update_failed_record_to_manual(session, meta_id)
477
+ self._update_exit_failed_attachments(session, item)
460
478
  else:
461
479
  logger.info(f"Data is still processing. Current status: {status}")
462
480
  session.commit()
@@ -598,7 +598,7 @@ def _jsonl_bytes(records: List[dict]) -> bytes:
598
598
  # - para_blocks 然后 discarded_blocks
599
599
  # - btype=page_number 直接跳过
600
600
  # - 文本类(text/title/discarded/index/header/footer/aside_text/footnote/
601
- # reference/ref_text/equation/page_footnote/caption/abstract/code)走
601
+ # reference/ref_text/phonetic/equation/page_footnote/caption/abstract/code)走
602
602
  # get_com_lines 提文本,title/header → out_type=title,其它 → sentence
603
603
  # - list 递归 blk['blocks'](如有)
604
604
  # - table 提 HTML(span.type=table 取 span.html),text spans 拆为单独 block
@@ -612,7 +612,7 @@ def _jsonl_bytes(records: List[dict]) -> bytes:
612
612
  _TEXT_LIKE_TYPES = frozenset({
613
613
  "text", "discarded", "title", "index",
614
614
  "header", "footer", "aside_text",
615
- "footnote", "reference", "ref_text",
615
+ "footnote", "reference", "ref_text", "phonetic",
616
616
  "equation", "page_footnote",
617
617
  "caption", "abstract", "code",
618
618
  })
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orbitkit
3
- Version: 0.9.26
3
+ Version: 0.9.28
4
4
  Summary: This project is only for Orbit Tech internal use.
5
5
  Home-page: https://github.com/clown-0726/orbitkit
6
6
  Author: Lilu Cao
@@ -1 +0,0 @@
1
- 0.9.26
File without changes
File without changes
File without changes
File without changes
File without changes