vlmparse 0.1.7__py3-none-any.whl → 0.1.9__py3-none-any.whl

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 (36) hide show
  1. vlmparse/build_doc.py +20 -19
  2. vlmparse/cli.py +439 -270
  3. vlmparse/clients/chandra.py +176 -60
  4. vlmparse/clients/deepseekocr.py +193 -12
  5. vlmparse/clients/docling.py +0 -1
  6. vlmparse/clients/dotsocr.py +34 -31
  7. vlmparse/clients/glmocr.py +243 -0
  8. vlmparse/clients/granite_docling.py +9 -36
  9. vlmparse/clients/hunyuanocr.py +5 -1
  10. vlmparse/clients/lightonocr.py +23 -1
  11. vlmparse/clients/mineru.py +0 -1
  12. vlmparse/clients/mistral_converter.py +85 -0
  13. vlmparse/clients/nanonetocr.py +5 -1
  14. vlmparse/clients/olmocr.py +6 -2
  15. vlmparse/clients/openai_converter.py +95 -60
  16. vlmparse/clients/paddleocrvl.py +195 -40
  17. vlmparse/converter.py +51 -11
  18. vlmparse/converter_with_server.py +92 -19
  19. vlmparse/registries.py +107 -89
  20. vlmparse/servers/base_server.py +127 -0
  21. vlmparse/servers/docker_compose_deployment.py +489 -0
  22. vlmparse/servers/docker_compose_server.py +39 -0
  23. vlmparse/servers/docker_run_deployment.py +226 -0
  24. vlmparse/servers/docker_server.py +17 -109
  25. vlmparse/servers/model_identity.py +48 -0
  26. vlmparse/servers/server_registry.py +42 -0
  27. vlmparse/servers/utils.py +83 -219
  28. vlmparse/st_viewer/st_viewer.py +1 -1
  29. vlmparse/utils.py +15 -2
  30. {vlmparse-0.1.7.dist-info → vlmparse-0.1.9.dist-info}/METADATA +13 -3
  31. vlmparse-0.1.9.dist-info/RECORD +44 -0
  32. {vlmparse-0.1.7.dist-info → vlmparse-0.1.9.dist-info}/WHEEL +1 -1
  33. vlmparse-0.1.7.dist-info/RECORD +0 -36
  34. {vlmparse-0.1.7.dist-info → vlmparse-0.1.9.dist-info}/entry_points.txt +0 -0
  35. {vlmparse-0.1.7.dist-info → vlmparse-0.1.9.dist-info}/licenses/LICENSE +0 -0
  36. {vlmparse-0.1.7.dist-info → vlmparse-0.1.9.dist-info}/top_level.txt +0 -0
vlmparse/servers/utils.py CHANGED
@@ -1,228 +1,9 @@
1
- import getpass
2
- import time
3
- from contextlib import contextmanager
4
- from pathlib import Path
5
1
  from urllib.parse import parse_qsl, urlparse
6
2
 
7
3
  import docker
8
4
  from loguru import logger
9
5
 
10
6
 
11
- def _ensure_image_exists(
12
- client: docker.DockerClient,
13
- image: str,
14
- dockerfile_path: Path,
15
- ):
16
- """Check if image exists, build it if not."""
17
- try:
18
- client.images.get(image)
19
- logger.info(f"Docker image {image} found")
20
- return
21
- except docker.errors.ImageNotFound:
22
- logger.info(f"Docker image {image} not found, building...")
23
-
24
- if not dockerfile_path.exists():
25
- raise FileNotFoundError(
26
- f"Dockerfile directory not found at {dockerfile_path}"
27
- ) from None
28
-
29
- logger.info(f"Building image from {dockerfile_path}")
30
-
31
- # Use low-level API for real-time streaming
32
- api_client = docker.APIClient(base_url="unix://var/run/docker.sock")
33
-
34
- # Build the image with streaming
35
- build_stream = api_client.build(
36
- path=str(dockerfile_path),
37
- tag=image,
38
- rm=True,
39
- decode=True, # Automatically decode JSON responses to dict
40
- )
41
-
42
- # Stream build logs in real-time
43
- for chunk in build_stream:
44
- if "stream" in chunk:
45
- for line in chunk["stream"].splitlines():
46
- logger.info(line)
47
- elif "error" in chunk:
48
- logger.error(chunk["error"])
49
- raise docker.errors.BuildError(chunk["error"], build_stream) from None
50
- elif "status" in chunk:
51
- # Handle status updates (e.g., downloading layers)
52
- logger.debug(chunk["status"])
53
-
54
- logger.info(f"Successfully built image {image}")
55
-
56
-
57
- @contextmanager
58
- def docker_server(
59
- config: "DockerServerConfig", # noqa: F821
60
- timeout: int = 1000,
61
- cleanup: bool = True,
62
- ):
63
- """Generic context manager for Docker server deployment.
64
-
65
- Args:
66
- config: DockerServerConfig (can be VLLMDockerServerConfig or GenericDockerServerConfig)
67
- timeout: Timeout in seconds to wait for server to be ready
68
- cleanup: If True, stop and remove container on exit. If False, leave container running
69
-
70
- Yields:
71
- tuple: (base_url, container) - The base URL of the server and the Docker container object
72
- """
73
-
74
- client = docker.from_env()
75
- container = None
76
-
77
- try:
78
- # Ensure image exists
79
- logger.info(f"Checking for Docker image {config.docker_image}...")
80
-
81
- if config.dockerfile_dir is not None:
82
- _ensure_image_exists(
83
- client, config.docker_image, Path(config.dockerfile_dir)
84
- )
85
- else:
86
- # Pull pre-built image
87
- try:
88
- client.images.get(config.docker_image)
89
- logger.info(f"Docker image {config.docker_image} found locally")
90
- except docker.errors.ImageNotFound:
91
- logger.info(
92
- f"Docker image {config.docker_image} not found locally, pulling..."
93
- )
94
- client.images.pull(config.docker_image)
95
- logger.info(f"Successfully pulled {config.docker_image}")
96
-
97
- logger.info(
98
- f"Starting Docker container for {config.model_name} on port {config.docker_port}"
99
- )
100
-
101
- # Configure GPU access
102
- device_requests = None
103
-
104
- if config.gpu_device_ids is None:
105
- # Default: Try to use all GPUs if available
106
- device_requests = [
107
- docker.types.DeviceRequest(count=-1, capabilities=[["gpu"]])
108
- ]
109
- elif len(config.gpu_device_ids) > 0 and config.gpu_device_ids[0] != "":
110
- # Use specific GPU devices
111
- device_requests = [
112
- docker.types.DeviceRequest(
113
- device_ids=config.gpu_device_ids, capabilities=[["gpu"]]
114
- )
115
- ]
116
- else:
117
- # Empty list means CPU-only, no GPU
118
- device_requests = None
119
-
120
- # Use generic methods from config
121
- command = config.get_command()
122
- volumes = config.get_volumes()
123
- environment = config.get_environment()
124
- container_port = config.container_port
125
- log_prefix = config.model_name
126
-
127
- # Construct URI for label
128
- uri = f"http://localhost:{config.docker_port}{config.get_base_url_suffix()}"
129
-
130
- # Determine GPU label
131
- if config.gpu_device_ids is None:
132
- gpu_label = "all"
133
- elif len(config.gpu_device_ids) == 0 or (
134
- len(config.gpu_device_ids) == 1 and config.gpu_device_ids[0] == ""
135
- ):
136
- gpu_label = "cpu"
137
- else:
138
- gpu_label = ",".join(config.gpu_device_ids)
139
-
140
- # Start container
141
- container_kwargs = {
142
- "image": config.docker_image,
143
- "ports": {f"{container_port}/tcp": config.docker_port},
144
- "detach": True,
145
- "remove": True,
146
- "name": f"vlmparse-{config.model_name.replace('/', '-')}-{getpass.getuser()}",
147
- "labels": {
148
- "vlmparse_model_name": config.model_name,
149
- "vlmparse_uri": uri,
150
- "vlmparse_gpus": gpu_label,
151
- },
152
- }
153
-
154
- if device_requests is not None:
155
- container_kwargs["device_requests"] = device_requests
156
- if command:
157
- container_kwargs["command"] = command
158
- if environment:
159
- container_kwargs["environment"] = environment
160
- if volumes:
161
- container_kwargs["volumes"] = volumes
162
- if config.entrypoint:
163
- container_kwargs["entrypoint"] = config.entrypoint
164
-
165
- container = client.containers.run(**container_kwargs)
166
-
167
- logger.info(
168
- f"Container {container.short_id} started, waiting for server to be ready..."
169
- )
170
-
171
- # Wait for server to be ready
172
- start_time = time.time()
173
- server_ready = False
174
- last_log_position = 0
175
-
176
- while time.time() - start_time < timeout:
177
- try:
178
- container.reload()
179
- except docker.errors.NotFound as e:
180
- logger.error("Container stopped unexpectedly during startup")
181
- raise RuntimeError(
182
- "Container crashed during initialization. Check Docker logs for details."
183
- ) from e
184
-
185
- if container.status == "running":
186
- # Get all logs and display new ones
187
- all_logs = container.logs().decode("utf-8")
188
-
189
- # Display new log lines
190
- if len(all_logs) > last_log_position:
191
- new_logs = all_logs[last_log_position:]
192
- for line in new_logs.splitlines():
193
- if line.strip(): # Only print non-empty lines
194
- logger.info(f"[{log_prefix}] {line}")
195
- last_log_position = len(all_logs)
196
-
197
- # Check if server is ready
198
- for indicator in config.server_ready_indicators:
199
- if indicator in all_logs:
200
- server_ready = True
201
- if server_ready:
202
- logger.info(f"Server ready indicator '{indicator}' found in logs")
203
- break
204
-
205
- time.sleep(2)
206
-
207
- if not server_ready:
208
- raise TimeoutError(f"Server did not become ready within {timeout} seconds")
209
-
210
- # Build base URL using config's suffix method
211
- base_url = (
212
- f"http://localhost:{config.docker_port}{config.get_base_url_suffix()}"
213
- )
214
-
215
- logger.info(f"{log_prefix} server ready at {base_url}")
216
-
217
- yield base_url, container
218
-
219
- finally:
220
- if cleanup and container:
221
- logger.info(f"Stopping container {container.short_id}")
222
- container.stop(timeout=10)
223
- logger.info("Container stopped")
224
-
225
-
226
7
  def normalize_uri(uri: str) -> tuple:
227
8
  u = urlparse(uri)
228
9
 
@@ -277,3 +58,86 @@ def get_model_from_uri(uri: str) -> str:
277
58
  if model is None:
278
59
  raise ValueError(f"No model found for URI {uri}")
279
60
  return model
61
+
62
+
63
+ def _get_container_labels(container) -> dict[str, str]:
64
+ labels: dict[str, str] = {}
65
+ try:
66
+ labels.update(getattr(container, "labels", None) or {})
67
+ except Exception:
68
+ pass
69
+
70
+ try:
71
+ labels.update((container.attrs or {}).get("Config", {}).get("Labels", {}) or {})
72
+ except Exception:
73
+ pass
74
+
75
+ return labels
76
+
77
+
78
+ def _stop_compose_stack_for_container(target_container) -> bool:
79
+ """If container belongs to a docker-compose project, stop+remove the whole stack.
80
+
81
+ Returns True if a compose stack was detected and a stack stop was attempted.
82
+ """
83
+
84
+ import subprocess
85
+
86
+ labels = _get_container_labels(target_container)
87
+
88
+ project = labels.get("com.docker.compose.project") or labels.get(
89
+ "vlmparse_compose_project"
90
+ )
91
+ compose_file = labels.get("vlmparse_compose_file")
92
+
93
+ if not project:
94
+ return False
95
+
96
+ # Preferred: docker compose down (stops + removes all services/networks consistently)
97
+ if compose_file:
98
+ logger.info(
99
+ f"Detected docker-compose project '{project}'. Bringing stack down (stop + remove)..."
100
+ )
101
+ subprocess.run(
102
+ [
103
+ "docker",
104
+ "compose",
105
+ "-f",
106
+ compose_file,
107
+ "--project-name",
108
+ project,
109
+ "down",
110
+ "--remove-orphans",
111
+ ],
112
+ check=False,
113
+ capture_output=True,
114
+ text=True,
115
+ )
116
+ logger.info("✓ Compose stack brought down")
117
+ return True
118
+
119
+ # Fallback: remove all containers in the compose project via Docker labels
120
+ import docker
121
+
122
+ logger.info(
123
+ f"Detected docker-compose project '{project}' (compose file unknown). "
124
+ "Stopping + removing all project containers via Docker API..."
125
+ )
126
+ client = docker.from_env()
127
+ containers = client.containers.list(
128
+ all=True, filters={"label": [f"com.docker.compose.project={project}"]}
129
+ )
130
+ for c in containers:
131
+ try:
132
+ c.stop()
133
+ except Exception:
134
+ pass
135
+ try:
136
+ c.remove(force=True)
137
+ except Exception:
138
+ pass
139
+
140
+ logger.info(
141
+ f"✓ Removed {len(containers)} container(s) from compose project '{project}'"
142
+ )
143
+ return True
@@ -40,7 +40,7 @@ def run_streamlit(folder: str) -> None:
40
40
  col1, col2 = st.columns(2)
41
41
  with col1:
42
42
  with st.container(height=700):
43
- st.write(doc.pages[settings["page_no"]].text)
43
+ st.markdown(doc.pages[settings["page_no"]].text, unsafe_allow_html=True)
44
44
 
45
45
  with col2:
46
46
  if settings["plot_layouts"]:
vlmparse/utils.py CHANGED
@@ -19,8 +19,19 @@ def from_base64(base64_str: str):
19
19
  return Image.open(BytesIO(image_data))
20
20
 
21
21
 
22
- def get_file_paths(inputs: str | list[str]):
23
- # Expand file paths from glob patterns
22
+ def get_file_paths(inputs: str | list[str], raise_on_empty: bool = False) -> list[str]:
23
+ """Expand file paths from glob patterns.
24
+
25
+ Args:
26
+ inputs: A string or list of strings containing file paths, glob patterns, or directories.
27
+ raise_on_empty: If True, raise FileNotFoundError when no files are found.
28
+
29
+ Returns:
30
+ List of valid file paths.
31
+
32
+ Raises:
33
+ FileNotFoundError: If raise_on_empty is True and no files are found.
34
+ """
24
35
  file_paths = []
25
36
  if isinstance(inputs, str):
26
37
  inputs = [inputs]
@@ -36,6 +47,8 @@ def get_file_paths(inputs: str | list[str]):
36
47
  file_paths = [f for f in file_paths if os.path.exists(f) and os.path.isfile(f)]
37
48
 
38
49
  if not file_paths:
50
+ if raise_on_empty:
51
+ raise FileNotFoundError("No files found matching the input patterns")
39
52
  logger.error("No PDF files found matching the inputs patterns")
40
53
 
41
54
  return file_paths
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vlmparse
3
- Version: 0.1.7
3
+ Version: 0.1.9
4
4
  Requires-Python: >=3.11.0
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -54,6 +54,12 @@ Dynamic: license-file
54
54
 
55
55
  # vlmparse
56
56
 
57
+ <div align="center">
58
+
59
+ [\[📜 arXiv coming soon\]] | [[Dataset (🤗Hugging Face)]](https://huggingface.co/datasets/pulsia/fr-bench-pdf2md) | [[pypi]](https://pypi.org/project/vlmparse/) | [[vlmparse]](https://github.com/ld-lab-pulsia/vlmparse) | [[Benchmark]](https://github.com/ld-lab-pulsia/benchpdf2md)
60
+
61
+ </div>
62
+
57
63
  A unified wrapper for Vision Language Models (VLM) and OCR solutions to parse PDF documents into Markdown.
58
64
 
59
65
  Features:
@@ -125,13 +131,13 @@ Deployment (requires a gpu + docker installation):
125
131
  - Check that the port is not used by another service.
126
132
 
127
133
  ```bash
128
- vlmparse serve --model lightonocr --port 8000 --gpus 1
134
+ vlmparse serve --model lightonocr2 --port 8000 --gpus 1
129
135
  ```
130
136
 
131
137
  then convert:
132
138
 
133
139
  ```bash
134
- vlmparse convert --input "*.pdf" --out_folder ./output --model lightonocr --uri http://localhost:8000/v1
140
+ vlmparse convert "*.pdf" --out_folder ./output --uri http://localhost:8000/v1
135
141
  ```
136
142
 
137
143
  You can also list all running servers:
@@ -209,3 +215,7 @@ with ConverterWithServer(model="mineru2.5") as converter_with_server:
209
215
  ```
210
216
 
211
217
  Note that if you pass an uri of a vllm server to `ConverterWithServer`, the model name is inferred automatically and no server is started.
218
+
219
+ ## Credits
220
+
221
+ This work was financed by La Poste and led by members of Probayes and OpenValue, two subsidiaries (filiales) of La Poste.
@@ -0,0 +1,44 @@
1
+ vlmparse/base_model.py,sha256=4U4UPe8SNArliKnUf8pp8zQugWYsnhg9okylt7mrW1U,381
2
+ vlmparse/build_doc.py,sha256=fb7awoqVN-6NBlKVkMFb1v1iTWcxne5QAyNaKYTyvM4,2275
3
+ vlmparse/cli.py,sha256=CAEa6_BGrHxagR_T25pV4UIDY2u6Ep4p30pAk3SlelM,18514
4
+ vlmparse/constants.py,sha256=DYaK7KtTW8p9MPb3iPvoP5H1r7ICRuIFo89P01q4uCI,184
5
+ vlmparse/converter.py,sha256=KKcXqrp3nJo3d7DXjHn3O2SklbsJ489rDY4NJ9O42Fs,8795
6
+ vlmparse/converter_with_server.py,sha256=Ol5llwOdYcsRIRHR1A1g0nL4pneYi4MzWtBld2LlP80,8863
7
+ vlmparse/registries.py,sha256=4xiDKyIzAW68ZWyOtUmBOvzcXVqTPPdeoxD2s9RbjZ0,6714
8
+ vlmparse/utils.py,sha256=6Ff9OfAIVR-4_37QD5sifoNt_GmB3YUqgFwmIjuemtc,1727
9
+ vlmparse/clients/chandra.py,sha256=zAHjgI_MJ5FVGANHCG8KJQByaw6-zTS6CHXsCBA8TJI,13025
10
+ vlmparse/clients/deepseekocr.py,sha256=4NiW-the4JHPqI0rNF2xG3juGZJX4tiI7doCk1jyYec,12772
11
+ vlmparse/clients/docling.py,sha256=BLtNAxVJR6qvPip4ZBP-se8IMNFSbJ-fWEGlTSwimK8,5310
12
+ vlmparse/clients/dotsocr.py,sha256=oAUzDMTObeW0sTy5sFl08O6GQPSTic5ITbJYh_45Z54,10414
13
+ vlmparse/clients/glmocr.py,sha256=WzRntPKx3BPDAZEjfAHQj2OukBEEOEKbtpZag0me53g,7727
14
+ vlmparse/clients/granite_docling.py,sha256=KYaEdgk3oD0TuYDKqTQ4o6IkXC-E3AIYJ2KYxnEsjWM,3595
15
+ vlmparse/clients/hunyuanocr.py,sha256=etpIiA28OoGW-o5pOGeBxOlUDjUQ4zcKXWnJ8ba44DU,1979
16
+ vlmparse/clients/lightonocr.py,sha256=ZWC12U6myDr_2EuOPYGyJYxpBachjOUtLrxS62A8mzg,2048
17
+ vlmparse/clients/mineru.py,sha256=9r6_JwCGB6-C-YKpoadUs7lSuDEJyBFkfjWV5WN-VrE,3599
18
+ vlmparse/clients/mistral_converter.py,sha256=_hEyK_2vM5LEwbt30bFodMrWJtavLsBDxCkVclNUF4M,2837
19
+ vlmparse/clients/nanonetocr.py,sha256=gTbD4OtuHiWd6Ack6Bx-anZM9P_aErfSHXwtymETvqM,1665
20
+ vlmparse/clients/olmocr.py,sha256=V4638WftLCTr5Q6ZRgWKKSPAhFYdpBw3izeuda6EKDQ,1966
21
+ vlmparse/clients/openai_converter.py,sha256=bckm33Pkvqul--DjfEEEI3evn4_va0CoQcigdpCCMGc,7746
22
+ vlmparse/clients/paddleocrvl.py,sha256=50HuQm5aOH7xi0vdJ5isowsw6eBtEBNV8DWY4wbaTGA,7094
23
+ vlmparse/clients/prompts.py,sha256=-J60lqxgRzlkQ9VsQLxmWsIMaDt-gNqWqWoqHIw9CLc,4228
24
+ vlmparse/clients/pipe_utils/cleaner.py,sha256=oxBkBTOkluN1lmeNbzajRIe0_D__ZGwUOBaI_Ph0uxE,2396
25
+ vlmparse/clients/pipe_utils/html_to_md_conversion.py,sha256=cFFqzD2jCNw_968_eu3Wt--Ox7iJj2Rn5UoP_DZWosU,4112
26
+ vlmparse/clients/pipe_utils/utils.py,sha256=935ecIO446I0pstszE_1nrIPHn1Ffrxunq7fVd0dsd8,315
27
+ vlmparse/data_model/box.py,sha256=lJsh4qhjgYXZF5vTSJ1qMXD5GVlBi2_SBedBMlfJikU,16868
28
+ vlmparse/data_model/document.py,sha256=xheaMeStOj2c9GZKmdtxcEl_Dj44V5JyVp6JnTrSpH0,4615
29
+ vlmparse/servers/base_server.py,sha256=NLoGaXu8tapAm2dKjzZSBNY0EOXAK4Zo-zMtTx_VvdA,4343
30
+ vlmparse/servers/docker_compose_deployment.py,sha256=sGmZd7TRkOwZyh8raZhE2udxCBhKhxyn0hJcjCn9_DE,16999
31
+ vlmparse/servers/docker_compose_server.py,sha256=UsAokpmGeTHaaS6MVVlM3KxpILDUzeWuS4GSlr_2gT0,1394
32
+ vlmparse/servers/docker_run_deployment.py,sha256=34vHVZwRcw2Z5i5kPj8r2GCc7OmgVJXaSPctlXDWgvU,7898
33
+ vlmparse/servers/docker_server.py,sha256=KrTTcwN1wxhK0bpMuZtJZ5cQz4MuaTWLTlh9nMG87Fg,3777
34
+ vlmparse/servers/model_identity.py,sha256=DkH7KQAAZA9Sn7eJEnaKfH54XSEI17aqD1ScqqkTBEk,1711
35
+ vlmparse/servers/server_registry.py,sha256=FUF_XnN8872vKnc8-TrEBntwBS5i3ZYVJvTHrHfI7IM,1315
36
+ vlmparse/servers/utils.py,sha256=rbqn9i6XB1YOEFluP4Ur0Ma40_6riUxJ1eMS8LSWbKs,3998
37
+ vlmparse/st_viewer/fs_nav.py,sha256=7GNH68h2Loh5pQ64Pe72-D2cs2BLhqRXevEmKdFmPX0,1616
38
+ vlmparse/st_viewer/st_viewer.py,sha256=wg0qfhAKdvnkpc3xDK8QnWP9adjEThzeS-I5vHGDhIU,2132
39
+ vlmparse-0.1.9.dist-info/licenses/LICENSE,sha256=3TKJHk8hPBR5dbLWZ3IpfCftl-_m-iyBwpYQGZYxj14,1080
40
+ vlmparse-0.1.9.dist-info/METADATA,sha256=UNniHfumm45awE3CpNS7AT2mEDC28H_3H8KbnNoCf44,6022
41
+ vlmparse-0.1.9.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
42
+ vlmparse-0.1.9.dist-info/entry_points.txt,sha256=gD5berP6HwE2wNIkls-Lw5goiceA8uMgPEd7ifnFJXs,47
43
+ vlmparse-0.1.9.dist-info/top_level.txt,sha256=k4ni-GNH_iAX7liQEsk_KY_c3xgZgt8k9fsSs9IXLXs,9
44
+ vlmparse-0.1.9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,36 +0,0 @@
1
- vlmparse/base_model.py,sha256=4U4UPe8SNArliKnUf8pp8zQugWYsnhg9okylt7mrW1U,381
2
- vlmparse/build_doc.py,sha256=LAWrnFrqamN5PwJo57AUtQOPrMFGnCGw4gBjEKZ6pYo,2127
3
- vlmparse/cli.py,sha256=JfR6gk0pdYAavJgFTVx4OcgWdiLktGoKJ8TcVcD_IHw,12235
4
- vlmparse/constants.py,sha256=DYaK7KtTW8p9MPb3iPvoP5H1r7ICRuIFo89P01q4uCI,184
5
- vlmparse/converter.py,sha256=F0JSY9sFYUggCvaUCb27kKGJJpnZKW2FStMDVJoIOeQ,7383
6
- vlmparse/converter_with_server.py,sha256=zpUHDpHbDBs4Cj7dcVjvUQw0-U_InRNDC5Ekb_gehRM,6022
7
- vlmparse/registries.py,sha256=yBVrrhy61rSoLwdNV-z0C4lqIpTbLoWab3V6u7aSyNM,5797
8
- vlmparse/utils.py,sha256=rcVrtPiQVj_8HAmFQOu___72uYIapp_X89yxrMNCBow,1236
9
- vlmparse/clients/chandra.py,sha256=EulsCZdwOtm0pQ6CDm320U96k8aWFN4wKqCm1Xo7VCE,9775
10
- vlmparse/clients/deepseekocr.py,sha256=Uw6tPvP2KVsPDlz1ZUgYdbgQSjmFPuYeFDrGMMOTBAo,6501
11
- vlmparse/clients/docling.py,sha256=SAkLsqseuWfkuiel8FWR1G0Z5s-SZU3dE2JbsOvF4SA,5328
12
- vlmparse/clients/dotsocr.py,sha256=uGJoYEiDkP3-rmfdkAnMeAX-T4RZyEPoh6jmow5_-J8,10336
13
- vlmparse/clients/granite_docling.py,sha256=LMJAFjpSxcgLhsVxknSqrCC35MUTmklsE9PJZvMK2O8,4691
14
- vlmparse/clients/hunyuanocr.py,sha256=UFqaS4b8UM9EtizyrZIxlqcYlESmxm8xrQZP7lL6tkE,1857
15
- vlmparse/clients/lightonocr.py,sha256=wx1Im8Z3wlRWwYbPqnSd3LqTtdAU8CnX5mzu1BuCUY8,1314
16
- vlmparse/clients/mineru.py,sha256=6jZ1sKn2kGwUvD8gVs4PqEDH7uUXYK8pAB5Fr1JeqnY,3617
17
- vlmparse/clients/nanonetocr.py,sha256=BT5vaeerCsK5agvOaHK3NvLUqWd1FfDmrMmDYbp646I,1543
18
- vlmparse/clients/olmocr.py,sha256=A4Vl0meYpU5QPTML_OxyyRM07xCxtfrMZedgGMYEcuU,1851
19
- vlmparse/clients/openai_converter.py,sha256=bIDpR7Yn70eEp0pmzFoG2dDwY-mxCj3kH1IZS9BvXVQ,6266
20
- vlmparse/clients/paddleocrvl.py,sha256=qFBDj_UQocyq3WCh24tUOx9Ud7S9DfSm-1n3ztikY2s,1402
21
- vlmparse/clients/prompts.py,sha256=-J60lqxgRzlkQ9VsQLxmWsIMaDt-gNqWqWoqHIw9CLc,4228
22
- vlmparse/clients/pipe_utils/cleaner.py,sha256=oxBkBTOkluN1lmeNbzajRIe0_D__ZGwUOBaI_Ph0uxE,2396
23
- vlmparse/clients/pipe_utils/html_to_md_conversion.py,sha256=cFFqzD2jCNw_968_eu3Wt--Ox7iJj2Rn5UoP_DZWosU,4112
24
- vlmparse/clients/pipe_utils/utils.py,sha256=935ecIO446I0pstszE_1nrIPHn1Ffrxunq7fVd0dsd8,315
25
- vlmparse/data_model/box.py,sha256=lJsh4qhjgYXZF5vTSJ1qMXD5GVlBi2_SBedBMlfJikU,16868
26
- vlmparse/data_model/document.py,sha256=xheaMeStOj2c9GZKmdtxcEl_Dj44V5JyVp6JnTrSpH0,4615
27
- vlmparse/servers/docker_server.py,sha256=UVU7VDloJ8Yfqj-WUv3Trti9AODcdC9JyTzW3sCM-l4,7032
28
- vlmparse/servers/utils.py,sha256=tIXhgbF9EVOJy2nYEguVq69gn9ATxtya_1F4wZSt68o,9454
29
- vlmparse/st_viewer/fs_nav.py,sha256=7GNH68h2Loh5pQ64Pe72-D2cs2BLhqRXevEmKdFmPX0,1616
30
- vlmparse/st_viewer/st_viewer.py,sha256=m2rQTtk5rlwErNmivNAg-4rkHkvNkvLhoJZxFQi7Dwk,2105
31
- vlmparse-0.1.7.dist-info/licenses/LICENSE,sha256=3TKJHk8hPBR5dbLWZ3IpfCftl-_m-iyBwpYQGZYxj14,1080
32
- vlmparse-0.1.7.dist-info/METADATA,sha256=DP--8aCeLxAgvo6vvaDog7xzzMzvZywVvCrMiAKhDbo,5597
33
- vlmparse-0.1.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
34
- vlmparse-0.1.7.dist-info/entry_points.txt,sha256=gD5berP6HwE2wNIkls-Lw5goiceA8uMgPEd7ifnFJXs,47
35
- vlmparse-0.1.7.dist-info/top_level.txt,sha256=k4ni-GNH_iAX7liQEsk_KY_c3xgZgt8k9fsSs9IXLXs,9
36
- vlmparse-0.1.7.dist-info/RECORD,,