fabricatio 0.3.14.dev5__cp313-cp313-manylinux_2_34_x86_64.whl → 0.3.14.dev8__cp313-cp313-manylinux_2_34_x86_64.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.
@@ -21,10 +21,7 @@ from fabricatio.models.extra.rule import RuleSet
21
21
  from fabricatio.models.kwargs_types import ChooseKwargs, LLMKwargs
22
22
  from fabricatio.rust import (
23
23
  BibManager,
24
- convert_all_block_tex,
25
- convert_all_inline_tex,
26
- convert_to_block_formula,
27
- convert_to_inline_formula,
24
+ convert_all_tex_math,
28
25
  fix_misplaced_labels,
29
26
  )
30
27
  from fabricatio.utils import ok
@@ -129,8 +126,7 @@ class WriteArticleContentRAG(Action, Extract, AdvancedRAG):
129
126
  raw_paras = edt
130
127
 
131
128
  raw_paras = fix_misplaced_labels(raw_paras)
132
- raw_paras = convert_all_inline_tex(raw_paras)
133
- raw_paras = convert_all_block_tex(raw_paras)
129
+ raw_paras = convert_all_tex_math(raw_paras)
134
130
 
135
131
  r_print(raw_paras)
136
132
 
@@ -153,8 +149,7 @@ class WriteArticleContentRAG(Action, Extract, AdvancedRAG):
153
149
  raw_paras = "\n".join(p for p in raw_paras.splitlines() if p and not p.endswith("**") and not p.startswith("#"))
154
150
 
155
151
  raw_paras = fix_misplaced_labels(raw_paras)
156
- raw_paras = convert_all_inline_tex(raw_paras)
157
- raw_paras = convert_all_block_tex(raw_paras)
152
+ raw_paras = convert_all_tex_math(raw_paras)
158
153
 
159
154
  return await self.extract_new_subsec(subsec, raw_paras, cm)
160
155
 
@@ -261,8 +256,6 @@ class ArticleConsultRAG(Action, AdvancedRAG):
261
256
  from questionary import confirm, text
262
257
  from rich import print as r_print
263
258
 
264
- from fabricatio.rust import convert_all_block_tex, convert_all_inline_tex, fix_misplaced_labels
265
-
266
259
  self.target_collection = collection_name or self.safe_target_collection
267
260
 
268
261
  cm = CitationManager()
@@ -272,8 +265,7 @@ class ArticleConsultRAG(Action, AdvancedRAG):
272
265
  if await confirm("Empty the cm?").ask_async():
273
266
  cm.empty()
274
267
 
275
- req = convert_to_block_formula(req)
276
- req = convert_to_inline_formula(req)
268
+ req = convert_all_tex_math(req)
277
269
 
278
270
  await self.clued_search(
279
271
  req,
@@ -289,8 +281,7 @@ class ArticleConsultRAG(Action, AdvancedRAG):
289
281
  ret = await self.aask(f"{cm.as_prompt()}\n{self.req}\n{req}")
290
282
 
291
283
  ret = fix_misplaced_labels(ret)
292
- ret = convert_all_inline_tex(ret)
293
- ret = convert_all_block_tex(ret)
284
+ ret = convert_all_tex_math(ret)
294
285
  ret = cm.apply(ret)
295
286
 
296
287
  r_print(ret)
@@ -51,16 +51,16 @@ class RAG(EmbeddingUsage, ABC):
51
51
  return self._client
52
52
 
53
53
  def init_client(
54
- self,
55
- milvus_uri: Optional[str] = None,
56
- milvus_token: Optional[str] = None,
57
- milvus_timeout: Optional[float] = None,
54
+ self,
55
+ milvus_uri: Optional[str] = None,
56
+ milvus_token: Optional[str] = None,
57
+ milvus_timeout: Optional[float] = None,
58
58
  ) -> Self:
59
59
  """Initialize the Milvus client."""
60
60
  self._client = create_client(
61
61
  uri=milvus_uri or ok(self.milvus_uri or CONFIG.rag.milvus_uri),
62
62
  token=milvus_token
63
- or (token.get_secret_value() if (token := (self.milvus_token or CONFIG.rag.milvus_token)) else ""),
63
+ or (token.get_secret_value() if (token := (self.milvus_token or CONFIG.rag.milvus_token)) else ""),
64
64
  timeout=milvus_timeout or self.milvus_timeout or CONFIG.rag.milvus_timeout,
65
65
  )
66
66
  return self
@@ -74,7 +74,7 @@ class RAG(EmbeddingUsage, ABC):
74
74
  return self
75
75
 
76
76
  def view(
77
- self, collection_name: Optional[str], create: bool = False, **kwargs: Unpack[CollectionConfigKwargs]
77
+ self, collection_name: Optional[str], create: bool = False, **kwargs: Unpack[CollectionConfigKwargs]
78
78
  ) -> Self:
79
79
  """View the specified collection.
80
80
 
@@ -116,7 +116,7 @@ class RAG(EmbeddingUsage, ABC):
116
116
  return ok(self.target_collection, "No collection is being viewed. Have you called `self.view()`?")
117
117
 
118
118
  async def add_document[D: MilvusDataBase](
119
- self, data: List[D] | D, collection_name: Optional[str] = None, flush: bool = False
119
+ self, data: List[D] | D, collection_name: Optional[str] = None, flush: bool = False
120
120
  ) -> Self:
121
121
  """Adds a document to the specified collection.
122
122
 
@@ -143,15 +143,15 @@ class RAG(EmbeddingUsage, ABC):
143
143
  return self
144
144
 
145
145
  async def afetch_document[D: MilvusDataBase](
146
- self,
147
- query: List[str],
148
- document_model: Type[D],
149
- collection_name: Optional[str] = None,
150
- similarity_threshold: float = 0.37,
151
- result_per_query: int = 10,
152
- tei_endpoint: Optional[str] = None,
153
- reranker_threshold: float = 0.7,
154
- filter_expr: str = "",
146
+ self,
147
+ query: List[str],
148
+ document_model: Type[D],
149
+ collection_name: Optional[str] = None,
150
+ similarity_threshold: float = 0.37,
151
+ result_per_query: int = 10,
152
+ tei_endpoint: Optional[str] = None,
153
+ reranker_threshold: float = 0.7,
154
+ filter_expr: str = "",
155
155
  ) -> List[D]:
156
156
  """Asynchronously fetches documents from a Milvus database based on input vectors.
157
157
 
@@ -192,7 +192,8 @@ class RAG(EmbeddingUsage, ABC):
192
192
  retrieved_id.update(res["id"] for res in g)
193
193
  if not models:
194
194
  continue
195
- rank_scores = await reranker.arerank(q, [m.prepare_vectorization() for m in models], truncate=True)
195
+ rank_scores = await reranker.arerank(q, [m.prepare_vectorization() for m in models], truncate=True,
196
+ truncation_direction="Left")
196
197
  raw_result.extend((models[idx], scr) for (idx, scr) in rank_scores if scr > reranker_threshold)
197
198
 
198
199
  raw_result_sorted = sorted(raw_result, key=lambda x: x[1], reverse=True)
@@ -214,11 +215,11 @@ class RAG(EmbeddingUsage, ABC):
214
215
  return document_model.from_sequence(resp)
215
216
 
216
217
  async def aretrieve[D: MilvusDataBase](
217
- self,
218
- query: List[str] | str,
219
- document_model: Type[D],
220
- max_accepted: int = 20,
221
- **kwargs: Unpack[FetchKwargs],
218
+ self,
219
+ query: List[str] | str,
220
+ document_model: Type[D],
221
+ max_accepted: int = 20,
222
+ **kwargs: Unpack[FetchKwargs],
222
223
  ) -> List[D]:
223
224
  """Retrieve data from the collection.
224
225
 
@@ -235,15 +236,15 @@ class RAG(EmbeddingUsage, ABC):
235
236
  query = [query]
236
237
 
237
238
  return (
238
- await self.afetch_document(
239
- query=query,
240
- document_model=document_model,
241
- **kwargs,
242
- )
243
- )[:max_accepted]
239
+ await self.afetch_document(
240
+ query=query,
241
+ document_model=document_model,
242
+ **kwargs,
243
+ )
244
+ )[:max_accepted]
244
245
 
245
246
  async def arefined_query(
246
- self, question: List[str] | str, **kwargs: Unpack[ChooseKwargs[Optional[List[str]]]]
247
+ self, question: List[str] | str, **kwargs: Unpack[ChooseKwargs[Optional[List[str]]]]
247
248
  ) -> Optional[List[str]]:
248
249
  """Refines the given question using a template.
249
250
 
fabricatio/decorators.py CHANGED
@@ -235,6 +235,7 @@ def logging_exec_time[**P, R](
235
235
  @wraps(func)
236
236
  async def _async_wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
237
237
  start_time = time()
238
+ logger.debug(f"Starting execution of {func.__name__}")
238
239
  result = await func(*args, **kwargs)
239
240
  logger.debug(f"Execution time of `{func.__name__}`: {time() - start_time:.2f} s")
240
241
  return result
@@ -244,6 +245,7 @@ def logging_exec_time[**P, R](
244
245
  @wraps(func)
245
246
  def _wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
246
247
  start_time = time()
248
+ logger.debug(f"Starting execution of {func.__name__}")
247
249
  result = func(*args, **kwargs)
248
250
  logger.debug(f"Execution time of {func.__name__}: {(time() - start_time) * 1000:.2f} ms")
249
251
  return result
@@ -1,6 +1,7 @@
1
1
  """A Module containing the article rag models."""
2
2
 
3
3
  import re
4
+ from dataclasses import dataclass, field
4
5
  from itertools import groupby
5
6
  from pathlib import Path
6
7
  from typing import ClassVar, Dict, List, Optional, Self, Unpack
@@ -68,7 +69,7 @@ class ArticleChunk(MilvusDataBase):
68
69
 
69
70
  @classmethod
70
71
  def from_file[P: str | Path](
71
- cls, path: P | List[P], bib_mgr: BibManager, **kwargs: Unpack[ChunkKwargs]
72
+ cls, path: P | List[P], bib_mgr: BibManager, **kwargs: Unpack[ChunkKwargs]
72
73
  ) -> List[Self]:
73
74
  """Load the article chunks from the file."""
74
75
  if isinstance(path, list):
@@ -85,9 +86,9 @@ class ArticleChunk(MilvusDataBase):
85
86
  title_seg = path.stem.split(" - ").pop()
86
87
 
87
88
  key = (
88
- bib_mgr.get_cite_key_by_title(title_seg)
89
- or bib_mgr.get_cite_key_by_title_fuzzy(title_seg)
90
- or bib_mgr.get_cite_key_fuzzy(path.stem)
89
+ bib_mgr.get_cite_key_by_title(title_seg)
90
+ or bib_mgr.get_cite_key_by_title_fuzzy(title_seg)
91
+ or bib_mgr.get_cite_key_fuzzy(path.stem)
91
92
  )
92
93
  if key is None:
93
94
  logger.warning(f"no cite key found for {path.as_posix()}, skip.")
@@ -165,10 +166,11 @@ class ArticleChunk(MilvusDataBase):
165
166
  return self
166
167
 
167
168
 
169
+ @dataclass
168
170
  class CitationManager(AsPrompt):
169
171
  """Citation manager."""
170
172
 
171
- article_chunks: List[ArticleChunk] = Field(default_factory=list)
173
+ article_chunks: List[ArticleChunk] = field(default_factory=list)
172
174
  """Article chunks."""
173
175
 
174
176
  pat: str = r"(\[\[([\d\s,-]*)]])"
@@ -179,7 +181,7 @@ class CitationManager(AsPrompt):
179
181
  """Separator for abbreviated citation numbers."""
180
182
 
181
183
  def update_chunks(
182
- self, article_chunks: List[ArticleChunk], set_cite_number: bool = True, dedup: bool = True
184
+ self, article_chunks: List[ArticleChunk], set_cite_number: bool = True, dedup: bool = True
183
185
  ) -> Self:
184
186
  """Update article chunks."""
185
187
  self.article_chunks.clear()
@@ -2,9 +2,7 @@
2
2
 
3
3
  from abc import ABC
4
4
  from enum import StrEnum
5
- from fabricatio.rust import extract_body, replace_thesis_body, split_out_metadata, to_metadata, word_count
6
5
  from pathlib import Path
7
- from pydantic import Field
8
6
  from typing import ClassVar, Generator, List, Optional, Self, Tuple, Type
9
7
 
10
8
  from fabricatio.capabilities.persist import PersistentAble
@@ -23,7 +21,9 @@ from fabricatio.models.generic import (
23
21
  Titled,
24
22
  WordCount,
25
23
  )
24
+ from fabricatio.rust import extract_body, replace_thesis_body, split_out_metadata, to_metadata, word_count
26
25
  from fabricatio.utils import fallback_kwargs, ok
26
+ from pydantic import Field
27
27
 
28
28
  ARTICLE_WRAPPER = "// =-=-=-=-=-=-=-=-=-="
29
29
 
@@ -275,7 +275,7 @@ class ArticleBase[T: ChapterBase](FinalizedDumpAble, AsPrompt, FromTypstCode, To
275
275
  )
276
276
 
277
277
  def iter_dfs_rev(
278
- self,
278
+ self,
279
279
  ) -> Generator[ArticleOutlineBase, None, None]:
280
280
  """Performs a depth-first search (DFS) through the article structure in reverse order.
281
281
 
@@ -19,8 +19,7 @@ from fabricatio.models.extra.article_outline import (
19
19
  )
20
20
  from fabricatio.models.generic import Described, SequencePatch, SketchedAble, WithRef, WordCount
21
21
  from fabricatio.rust import (
22
- convert_all_block_tex,
23
- convert_all_inline_tex,
22
+ convert_all_tex_math,
24
23
  fix_misplaced_labels,
25
24
  split_out_metadata,
26
25
  word_count,
@@ -155,15 +154,13 @@ class Article(
155
154
  if descriptions:
156
155
  for a in self.iter_dfs():
157
156
  a.description = fix_misplaced_labels(a.description)
158
- a.description = convert_all_inline_tex(a.description)
159
- a.description = convert_all_block_tex(a.description)
157
+ a.description = convert_all_tex_math(a.description)
160
158
 
161
159
  if paragraphs:
162
160
  for _, _, subsec in self.iter_subsections():
163
161
  for p in subsec.paragraphs:
164
162
  p.content = fix_misplaced_labels(p.content)
165
- p.content = convert_all_inline_tex(p.content)
166
- p.content = convert_all_block_tex(p.content)
163
+ p.content = convert_all_tex_math(p.content)
167
164
  return self
168
165
 
169
166
  @override
fabricatio/models/role.py CHANGED
@@ -1,7 +1,7 @@
1
1
  """Module that contains the Role class for managing workflows and their event registrations."""
2
2
 
3
3
  from functools import partial
4
- from typing import Any, Dict, Self
4
+ from typing import Any, Callable, Dict, Self, Type
5
5
 
6
6
  from fabricatio.emitter import env
7
7
  from fabricatio.journal import logger
@@ -68,28 +68,32 @@ class Role(WithBriefing):
68
68
  workflow.inject_personality(self.briefing)
69
69
  return self
70
70
 
71
- def _configure_scoped_config(self, workflow: WorkFlow) -> None:
72
- """Configure scoped configuration for workflow and its actions."""
73
- if not is_scoped_config(self.__class__):
71
+ def _propagate_config(
72
+ self,
73
+ workflow: WorkFlow,
74
+ has_capability: Callable[[Type], bool],
75
+ config_method_name: str,
76
+ capability_description: str,
77
+ ) -> None:
78
+ """Propagates configuration to workflow and its actions if they have a given capability."""
79
+ if not has_capability(self.__class__):
74
80
  return
75
81
 
76
- fallback_target = self
77
- if is_scoped_config(workflow):
78
- workflow.fallback_to(self)
79
- fallback_target = workflow
82
+ config_source_for_actions = self
83
+ if has_capability(workflow.__class__):
84
+ logger.debug(
85
+ f"Configuring {capability_description} inherited from `{self.name}` for workflow: `{workflow.name}`"
86
+ )
87
+ getattr(workflow, config_method_name)(self)
88
+ config_source_for_actions = workflow
80
89
 
81
- for action in (a for a in workflow.iter_actions() if is_scoped_config(a)):
82
- action.fallback_to(fallback_target)
90
+ for action in (act for act in workflow.iter_actions() if has_capability(act.__class__)):
91
+ getattr(action, config_method_name)(config_source_for_actions)
92
+
93
+ def _configure_scoped_config(self, workflow: WorkFlow) -> None:
94
+ """Configure scoped configuration for workflow and its actions."""
95
+ self._propagate_config(workflow, is_scoped_config, "fallback_to", "scoped config")
83
96
 
84
97
  def _configure_toolbox_usage(self, workflow: WorkFlow) -> None:
85
98
  """Configure toolbox usage for workflow and its actions."""
86
- if not is_toolbox_usage(self.__class__):
87
- return
88
-
89
- supply_target = self
90
- if is_toolbox_usage(workflow):
91
- workflow.supply_tools_from(self)
92
- supply_target = workflow
93
-
94
- for action in (a for a in workflow.iter_actions() if is_toolbox_usage(a)):
95
- action.supply_tools_from(supply_target)
99
+ self._propagate_config(workflow, is_toolbox_usage, "supply_tools_from", "toolbox usage")
fabricatio/rust.pyi CHANGED
@@ -12,9 +12,10 @@ Key Features:
12
12
  """
13
13
 
14
14
  from enum import StrEnum
15
- from pydantic import JsonValue
15
+ from pathlib import Path
16
16
  from typing import Any, Dict, List, Literal, Optional, Self, Tuple, Union, overload
17
17
 
18
+ from pydantic import JsonValue
18
19
 
19
20
  class TemplateManager:
20
21
  """Template rendering engine using Handlebars templates.
@@ -47,10 +48,8 @@ class TemplateManager:
47
48
 
48
49
  @overload
49
50
  def render_template(self, name: str, data: Dict[str, Any]) -> str: ...
50
-
51
51
  @overload
52
52
  def render_template(self, name: str, data: List[Dict[str, Any]]) -> List[str]: ...
53
-
54
53
  def render_template(self, name: str, data: Dict[str, Any] | List[Dict[str, Any]]) -> str | List[str]:
55
54
  """Render a template with context data.
56
55
 
@@ -67,10 +66,8 @@ class TemplateManager:
67
66
 
68
67
  @overload
69
68
  def render_template_raw(self, template: str, data: Dict[str, Any]) -> str: ...
70
-
71
69
  @overload
72
70
  def render_template_raw(self, template: str, data: List[Dict[str, Any]]) -> List[str]: ...
73
-
74
71
  def render_template_raw(self, template: str, data: Dict[str, Any] | List[Dict[str, Any]]) -> str | List[str]:
75
72
  """Render a template with context data.
76
73
 
@@ -82,7 +79,6 @@ class TemplateManager:
82
79
  Rendered template content as string or list of strings
83
80
  """
84
81
 
85
-
86
82
  class BibManager:
87
83
  """BibTeX bibliography manager for parsing and querying citation data."""
88
84
 
@@ -191,7 +187,6 @@ class BibManager:
191
187
  Field value if found, None otherwise
192
188
  """
193
189
 
194
-
195
190
  def blake3_hash(content: bytes) -> str:
196
191
  """Calculate the BLAKE3 cryptographic hash of data.
197
192
 
@@ -202,11 +197,9 @@ def blake3_hash(content: bytes) -> str:
202
197
  Hex-encoded BLAKE3 hash string
203
198
  """
204
199
 
205
-
206
200
  def detect_language(string: str) -> str:
207
201
  """Detect the language of a given string."""
208
202
 
209
-
210
203
  def split_word_bounds(string: str) -> List[str]:
211
204
  """Split the string into words based on word boundaries.
212
205
 
@@ -217,7 +210,6 @@ def split_word_bounds(string: str) -> List[str]:
217
210
  A list of words extracted from the string.
218
211
  """
219
212
 
220
-
221
213
  def split_sentence_bounds(string: str) -> List[str]:
222
214
  """Split the string into sentences based on sentence boundaries.
223
215
 
@@ -228,7 +220,6 @@ def split_sentence_bounds(string: str) -> List[str]:
228
220
  A list of sentences extracted from the string.
229
221
  """
230
222
 
231
-
232
223
  def split_into_chunks(string: str, max_chunk_size: int, max_overlapping_rate: float = 0.3) -> List[str]:
233
224
  """Split the string into chunks of a specified size.
234
225
 
@@ -241,7 +232,6 @@ def split_into_chunks(string: str, max_chunk_size: int, max_overlapping_rate: fl
241
232
  A list of chunks extracted from the string.
242
233
  """
243
234
 
244
-
245
235
  def word_count(string: str) -> int:
246
236
  """Count the number of words in the string.
247
237
 
@@ -252,67 +242,51 @@ def word_count(string: str) -> int:
252
242
  The number of words in the string.
253
243
  """
254
244
 
255
-
256
245
  def is_chinese(string: str) -> bool:
257
246
  """Check if the given string is in Chinese."""
258
247
 
259
-
260
248
  def is_english(string: str) -> bool:
261
249
  """Check if the given string is in English."""
262
250
 
263
-
264
251
  def is_japanese(string: str) -> bool:
265
252
  """Check if the given string is in Japanese."""
266
253
 
267
-
268
254
  def is_korean(string: str) -> bool:
269
255
  """Check if the given string is in Korean."""
270
256
 
271
-
272
257
  def is_arabic(string: str) -> bool:
273
258
  """Check if the given string is in Arabic."""
274
259
 
275
-
276
260
  def is_russian(string: str) -> bool:
277
261
  """Check if the given string is in Russian."""
278
262
 
279
-
280
263
  def is_german(string: str) -> bool:
281
264
  """Check if the given string is in German."""
282
265
 
283
-
284
266
  def is_french(string: str) -> bool:
285
267
  """Check if the given string is in French."""
286
268
 
287
-
288
269
  def is_hindi(string: str) -> bool:
289
270
  """Check if the given string is in Hindi."""
290
271
 
291
-
292
272
  def is_italian(string: str) -> bool:
293
273
  """Check if the given string is in Italian."""
294
274
 
295
-
296
275
  def is_dutch(string: str) -> bool:
297
276
  """Check if the given string is in Dutch."""
298
277
 
299
-
300
278
  def is_portuguese(string: str) -> bool:
301
279
  """Check if the given string is in Portuguese."""
302
280
 
303
-
304
281
  def is_swedish(string: str) -> bool:
305
282
  """Check if the given string is in Swedish."""
306
283
 
307
-
308
284
  def is_turkish(string: str) -> bool:
309
285
  """Check if the given string is in Turkish."""
310
286
 
311
-
312
287
  def is_vietnamese(string: str) -> bool:
313
288
  """Check if the given string is in Vietnamese."""
314
289
 
315
-
316
290
  def tex_to_typst(string: str) -> str:
317
291
  """Convert TeX to Typst.
318
292
 
@@ -323,11 +297,11 @@ def tex_to_typst(string: str) -> str:
323
297
  The converted Typst string.
324
298
  """
325
299
 
326
-
327
300
  def convert_all_tex_math(string: str) -> str:
328
- """Unified function to convert all supported TeX math expressions in a string to Typst format.
301
+ r"""Unified function to convert all supported TeX math expressions in a string to Typst format.
329
302
 
330
303
  Handles $...$, $$...$$, \\(...\\), and \\[...\\]
304
+
331
305
  Args:
332
306
  string: The input string containing TeX math expressions.
333
307
 
@@ -335,7 +309,6 @@ def convert_all_tex_math(string: str) -> str:
335
309
  The string with TeX math expressions converted to Typst format.
336
310
  """
337
311
 
338
-
339
312
  def fix_misplaced_labels(string: str) -> str:
340
313
  """A func to fix labels in a string.
341
314
 
@@ -346,9 +319,8 @@ def fix_misplaced_labels(string: str) -> str:
346
319
  The fixed string with labels properly placed.
347
320
  """
348
321
 
349
-
350
322
  def comment(string: str) -> str:
351
- """Add comment to the string.
323
+ r"""Add comment to the string.
352
324
 
353
325
  Args:
354
326
  string: The input string to which comments will be added.
@@ -357,7 +329,6 @@ def comment(string: str) -> str:
357
329
  The string with each line prefixed by '// '.
358
330
  """
359
331
 
360
-
361
332
  def uncomment(string: str) -> str:
362
333
  """Remove comment from the string.
363
334
 
@@ -368,7 +339,6 @@ def uncomment(string: str) -> str:
368
339
  The string with comments (lines starting with '// ' or '//') removed.
369
340
  """
370
341
 
371
-
372
342
  def split_out_metadata(string: str) -> Tuple[Optional[JsonValue], str]:
373
343
  """Split out metadata from a string.
374
344
 
@@ -379,7 +349,6 @@ def split_out_metadata(string: str) -> Tuple[Optional[JsonValue], str]:
379
349
  A tuple containing the metadata as a Python object (if parseable) and the remaining string.
380
350
  """
381
351
 
382
-
383
352
  def to_metadata(data: JsonValue) -> str:
384
353
  """Convert a Python object to a YAML string.
385
354
 
@@ -390,7 +359,6 @@ def to_metadata(data: JsonValue) -> str:
390
359
  The YAML string representation of the input data.
391
360
  """
392
361
 
393
-
394
362
  def replace_thesis_body(string: str, wrapper: str, new_body: str) -> Optional[str]:
395
363
  """Replace content between wrapper strings.
396
364
 
@@ -404,7 +372,6 @@ def replace_thesis_body(string: str, wrapper: str, new_body: str) -> Optional[st
404
372
 
405
373
  """
406
374
 
407
-
408
375
  def extract_body(string: str, wrapper: str) -> Optional[str]:
409
376
  """Extract the content between two occurrences of a wrapper string.
410
377
 
@@ -416,7 +383,6 @@ def extract_body(string: str, wrapper: str) -> Optional[str]:
416
383
  The content between the first two occurrences of the wrapper string if found, otherwise None.
417
384
  """
418
385
 
419
-
420
386
  class LLMConfig:
421
387
  """LLM configuration structure.
422
388
 
@@ -468,7 +434,6 @@ class LLMConfig:
468
434
  frequency_penalty: Optional[float]
469
435
  """Penalizes new tokens based on their frequency in text so far (-2.0-2.0)."""
470
436
 
471
-
472
437
  class EmbeddingConfig:
473
438
  """Embedding configuration structure."""
474
439
 
@@ -493,7 +458,6 @@ class EmbeddingConfig:
493
458
  api_key: Optional[SecretStr]
494
459
  """The API key."""
495
460
 
496
-
497
461
  class RagConfig:
498
462
  """RAG (Retrieval Augmented Generation) configuration structure."""
499
463
 
@@ -509,18 +473,16 @@ class RagConfig:
509
473
  milvus_dimensions: Optional[int]
510
474
  """The dimensions for Milvus vectors."""
511
475
 
512
-
513
476
  class DebugConfig:
514
477
  """Debug configuration structure."""
515
478
 
516
479
  log_level: Optional[str]
517
480
  """The logging level to use."""
518
481
 
519
-
520
482
  class TemplateManagerConfig:
521
483
  """Template manager configuration structure."""
522
484
 
523
- template_dir: List[str]
485
+ template_dir: List[Path]
524
486
  """The directories containing the templates."""
525
487
 
526
488
  active_loading: Optional[bool]
@@ -529,7 +491,6 @@ class TemplateManagerConfig:
529
491
  template_suffix: Optional[str]
530
492
  """The suffix of the templates."""
531
493
 
532
-
533
494
  class TemplateConfig:
534
495
  """Template configuration structure."""
535
496
 
@@ -614,7 +575,6 @@ class TemplateConfig:
614
575
  chap_summary_template: str
615
576
  """The name of the chap summary template which will be used to generate a chapter summary."""
616
577
 
617
-
618
578
  class RoutingConfig:
619
579
  """Routing configuration structure for controlling request dispatching behavior."""
620
580
 
@@ -630,7 +590,6 @@ class RoutingConfig:
630
590
  cooldown_time: Optional[int]
631
591
  """Time to cooldown a deployment after failure in seconds."""
632
592
 
633
-
634
593
  class GeneralConfig:
635
594
  """General configuration structure for application-wide settings."""
636
595
 
@@ -640,7 +599,6 @@ class GeneralConfig:
640
599
  use_json_repair: bool
641
600
  """Whether to automatically repair malformed JSON."""
642
601
 
643
-
644
602
  class ToolBoxConfig:
645
603
  """Configuration for toolbox functionality."""
646
604
 
@@ -650,7 +608,6 @@ class ToolBoxConfig:
650
608
  data_module_name: str
651
609
  """The name of the module containing the data."""
652
610
 
653
-
654
611
  class PymitterConfig:
655
612
  """Pymitter configuration structure for controlling event emission and listener behavior."""
656
613
 
@@ -663,7 +620,6 @@ class PymitterConfig:
663
620
  max_listeners: int
664
621
  """The maximum number of listeners per event. -1 means unlimited."""
665
622
 
666
-
667
623
  class Config:
668
624
  """Configuration structure containing all system components."""
669
625
 
@@ -697,22 +653,17 @@ class Config:
697
653
  pymitter: PymitterConfig
698
654
  """Pymitter configuration."""
699
655
 
700
-
701
656
  CONFIG: Config
702
657
 
703
-
704
658
  class SecretStr:
705
659
  """A string that should not be exposed."""
706
660
 
707
661
  def __init__(self, source: str) -> None: ...
708
-
709
662
  def get_secret_value(self) -> str:
710
663
  """Expose the secret string."""
711
664
 
712
-
713
665
  TEMPLATE_MANAGER: TemplateManager
714
666
 
715
-
716
667
  class Event:
717
668
  """Event class that represents a hierarchical event with segments.
718
669
 
@@ -824,12 +775,9 @@ class Event:
824
775
  """
825
776
 
826
777
  def __hash__(self) -> int: ...
827
-
828
778
  def __eq__(self, other: object) -> bool: ...
829
-
830
779
  def __ne__(self, other: object) -> bool: ...
831
780
 
832
-
833
781
  class TaskStatus(StrEnum, str):
834
782
  """Enumeration of possible task statuses."""
835
783
 
@@ -848,7 +796,6 @@ class TaskStatus(StrEnum, str):
848
796
  Cancelled: TaskStatus
849
797
  """Task has been cancelled."""
850
798
 
851
-
852
799
  class TEIClient:
853
800
  """Client for TEI reranking service.
854
801
 
@@ -864,11 +811,11 @@ class TEIClient:
864
811
  """
865
812
 
866
813
  async def arerank(
867
- self,
868
- query: str,
869
- texts: List[str],
870
- truncate: bool = False,
871
- truncation_direction: Literal["Left", "Right"] = "Left",
814
+ self,
815
+ query: str,
816
+ texts: List[str],
817
+ truncate: bool = False,
818
+ truncation_direction: Literal["Left", "Right"] = "Left",
872
819
  ) -> List[Tuple[int, float]]:
873
820
  """Rerank texts based on relevance to query.
874
821
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fabricatio
3
- Version: 0.3.14.dev5
3
+ Version: 0.3.14.dev8
4
4
  Classifier: License :: OSI Approved :: MIT License
5
5
  Classifier: Programming Language :: Rust
6
6
  Classifier: Programming Language :: Python :: 3.12
@@ -1,64 +1,64 @@
1
- fabricatio-0.3.14.dev5.dist-info/METADATA,sha256=2LK_J4cxsA961zFKDG-gpZl8C7-TGenr1BFCFJJbHEs,4969
2
- fabricatio-0.3.14.dev5.dist-info/WHEEL,sha256=0T3ERfOVy2_NA0spmJ9W283dd80DxGxyjANqE-4dteM,108
3
- fabricatio-0.3.14.dev5.dist-info/licenses/LICENSE,sha256=yDZaTLnOi03bi3Dk6f5IjhLUc5old2yOsihHWU0z-i0,1067
4
- fabricatio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- fabricatio/journal.py,sha256=qZoaPdv17fc_9l2xVZ-ve7dXKmMFJ8MzPa8_vNXMGyE,204
6
- fabricatio/emitter.py,sha256=QpMvs8dTy1zs5iDORFKzA615S3Lb1tm6AQxYBemQGcc,6164
1
+ fabricatio-0.3.14.dev8.data/scripts/tdown,sha256=op_mffGEO0MwNpPoDJVgVwtrHvVHizmgffZG2vc7aXE,4722624
2
+ fabricatio-0.3.14.dev8.data/scripts/ttm,sha256=497Iiu2C1OODIRb-pqOJ9WZdSL7wlHqfTDoPNkINJX8,3918760
3
+ fabricatio-0.3.14.dev8.dist-info/METADATA,sha256=pPky7D10BatBBFi46gZ4JXl6uVfgtnK_-BS5ydzBMlU,4969
4
+ fabricatio-0.3.14.dev8.dist-info/WHEEL,sha256=OZYXF4emuP5o7uCHyen8StXv3k74AF7eDhQe1rxgOqQ,108
5
+ fabricatio-0.3.14.dev8.dist-info/licenses/LICENSE,sha256=yDZaTLnOi03bi3Dk6f5IjhLUc5old2yOsihHWU0z-i0,1067
7
6
  fabricatio/__init__.py,sha256=pSLe6QL4zQGaZXfhF9KW4fa1D8chqCQm_7yInCP6Kt8,732
8
- fabricatio/actions/article_rag.py,sha256=1CoL5Jdvur5Pyn9S4GilBfAAiPL2--fmkFLTOwtrT1I,17991
9
7
  fabricatio/actions/__init__.py,sha256=ZMa1LeM5BNeqp-J-D32W-f5bD53-kdXGyt0zuueJofM,47
10
- fabricatio/actions/output.py,sha256=3VRwDcvimBPrf4ypxbhJd_ScJ_JYiC0ucr6vGOqs9Fc,9687
11
8
  fabricatio/actions/article.py,sha256=8ea9QZk7m21j5fw6_CO_znZtik9_o71JmX77Po5gyS4,12188
12
- fabricatio/actions/rag.py,sha256=GuRU6VJzIxo3V8dvGWNQ0uQbu6nF0g_qgVuC8NPRx2Y,3487
9
+ fabricatio/actions/article_rag.py,sha256=2lQogjV_1iZkbYI4C9kGGpQH9TBeIDaQCkyi7ueqFus,17582
13
10
  fabricatio/actions/fs.py,sha256=nlTmk-tYDW158nz_fzlsNfuYJwj7j4BHn_MFY5hxdqs,934
11
+ fabricatio/actions/output.py,sha256=3VRwDcvimBPrf4ypxbhJd_ScJ_JYiC0ucr6vGOqs9Fc,9687
12
+ fabricatio/actions/rag.py,sha256=GuRU6VJzIxo3V8dvGWNQ0uQbu6nF0g_qgVuC8NPRx2Y,3487
14
13
  fabricatio/actions/rules.py,sha256=07ILsiwR250AUcKLPHTUPpWD_mPhPCfWKSkEAKcPv3A,3557
15
- fabricatio/capabilities/rating.py,sha256=FSIh3h0E7G1OkBKAkY83VA4w0G6OZ2bXq27b40WRsL8,17411
14
+ fabricatio/capabilities/__init__.py,sha256=skaJ43CqAQaZMH-mCRzF4Fps3x99P2SwJ8vSM9pInX8,56
16
15
  fabricatio/capabilities/advanced_judge.py,sha256=wTiTyBxkZfOXsmzULOW4nX-QAwFMz9wQqqAAM3aQ5XQ,662
16
+ fabricatio/capabilities/advanced_rag.py,sha256=2GYYUHFUP6O8rVOlLqxmPnU1Ve-JwxbUnLv3GRlOCCQ,2478
17
+ fabricatio/capabilities/censor.py,sha256=m90gGDAkEkkxkUKcZNkyhYsRwAxkcDut_-gZEBKrUCU,4640
18
+ fabricatio/capabilities/check.py,sha256=eiZZaiX78k-Zt7-Ik43Pn5visXHeOJLk8yLWgtqln40,8379
17
19
  fabricatio/capabilities/correct.py,sha256=z7KiMK1KykGXNdLVA0sB28x63LsQ6Hd4wbtYd0bkEKE,10175
18
20
  fabricatio/capabilities/extract.py,sha256=eLQagkRnHVLZ64yPBtLVcPELO7ubJlN3fbwoaNMWT70,2449
19
- fabricatio/capabilities/task.py,sha256=Ah14-xLUzXCMRydAemHoo85QDB-cLlXJslmaTCRsfms,4288
20
- fabricatio/capabilities/__init__.py,sha256=skaJ43CqAQaZMH-mCRzF4Fps3x99P2SwJ8vSM9pInX8,56
21
- fabricatio/capabilities/review.py,sha256=rxA_qdnJc8ehytL5EnlKo9QJ99stnF-n6YaBFRYLe5I,4947
22
21
  fabricatio/capabilities/persist.py,sha256=GAbj93lYLnGVPu74H_ImrINGWNAglIDH9aGSLJKMLkw,3318
23
22
  fabricatio/capabilities/propose.py,sha256=KqeXaUURJ6O-Ve0ijZYg88rgQYCZEFbuWoqIepI-nQ8,1965
24
- fabricatio/capabilities/rag.py,sha256=YF0RPPMutqGLdIVFvQsfUBCRJFeJZ95Bk5hrRzogf9k,10716
25
- fabricatio/capabilities/advanced_rag.py,sha256=2GYYUHFUP6O8rVOlLqxmPnU1Ve-JwxbUnLv3GRlOCCQ,2478
26
- fabricatio/capabilities/check.py,sha256=eiZZaiX78k-Zt7-Ik43Pn5visXHeOJLk8yLWgtqln40,8379
27
- fabricatio/capabilities/censor.py,sha256=m90gGDAkEkkxkUKcZNkyhYsRwAxkcDut_-gZEBKrUCU,4640
28
- fabricatio/fs/readers.py,sha256=hFHfGw1E58Da0ndBXXWcD2t-4HNdR1FimeDxuMI4-oE,1690
23
+ fabricatio/capabilities/rag.py,sha256=VSk4BKN8Clwi28-8bz-roqHRln9vu6mGnozr6snaPeY,10930
24
+ fabricatio/capabilities/rating.py,sha256=FSIh3h0E7G1OkBKAkY83VA4w0G6OZ2bXq27b40WRsL8,17411
25
+ fabricatio/capabilities/review.py,sha256=rxA_qdnJc8ehytL5EnlKo9QJ99stnF-n6YaBFRYLe5I,4947
26
+ fabricatio/capabilities/task.py,sha256=Ah14-xLUzXCMRydAemHoo85QDB-cLlXJslmaTCRsfms,4288
27
+ fabricatio/decorators.py,sha256=t3fc9SRdpy8ksQclWzm9jLMv87Ls0o4wAVhN3kMUJ_Y,8841
28
+ fabricatio/emitter.py,sha256=QpMvs8dTy1zs5iDORFKzA615S3Lb1tm6AQxYBemQGcc,6164
29
29
  fabricatio/fs/__init__.py,sha256=NQ_BnAwJ0iScY34QpCBH1dCq8vO5Zi4fh6VyEzrBIb8,678
30
30
  fabricatio/fs/curd.py,sha256=x7Je9V1ydv-BdZTjlLc3syZ6380gkOhpfrfnhXstisg,4624
31
- fabricatio/utils.py,sha256=qvl4R8ThuNIIoBJuR1DGEuWYZ7jRFT_8SRx4I_FA8pU,5298
32
- fabricatio/workflows/__init__.py,sha256=Lq9pFo2cudwFCrQUUNgSTr1CoU0J1Nw-HNEQN7cHLp8,50
33
- fabricatio/workflows/articles.py,sha256=ZDV5nqUKRo1GOuuKWeSV7ZI32FYZU7WiTrD4YDuCeEo,945
34
- fabricatio/workflows/rag.py,sha256=uOZXprD479fUhLA6sYvEM8RWcVcUZXXtP0xRbTMPdHE,509
35
- fabricatio/models/usages.py,sha256=bpM-a9i-WpSOh-XL3LiYTa3AxQUd_ckn44lh-uuKM6M,32250
36
- fabricatio/models/tool.py,sha256=jYdN6FWEz6pE-vEh3H78VHDPpSttUQE79nfXOD4FE6U,12091
37
- fabricatio/models/role.py,sha256=tOwzILaTb8QUOddy9RrJRyhfB_pEVv_IiUBRuc6ylH8,3761
38
- fabricatio/models/adv_kwargs_types.py,sha256=nmj1D0GVosZxKcdiw-B5vJB04Whr5zh30ZBJntSZUpY,2034
31
+ fabricatio/fs/readers.py,sha256=hFHfGw1E58Da0ndBXXWcD2t-4HNdR1FimeDxuMI4-oE,1690
32
+ fabricatio/journal.py,sha256=qZoaPdv17fc_9l2xVZ-ve7dXKmMFJ8MzPa8_vNXMGyE,204
39
33
  fabricatio/models/action.py,sha256=O8BLh8fRNqde_3PC7OFHBjLTdLRPvy5mtalMqQFaZXs,9789
40
- fabricatio/models/task.py,sha256=CdR1Zbf-lZN0jODj9iriTn1X2DxLxjXlvZgy3kEd6lI,10723
41
- fabricatio/models/kwargs_types.py,sha256=VrzAJaOSlQ-xN5NIIi3k4KpIY0c9beuxcuUnF-mkEEk,3282
42
- fabricatio/models/generic.py,sha256=dGap-ckYy7ZX_lXDNxv4d3yM45vdoLDYW4cl49BbCAY,27061
43
- fabricatio/models/extra/problem.py,sha256=1Sd8hsThQK6pXMXhErRhP1ft58z4PvqeB8AV8VcXiaI,7051
44
- fabricatio/models/extra/advanced_judge.py,sha256=CKPP4Lseb_Ey8Y7i2V9HJfB-mZgCknFdqq7Zo41o6s4,1060
45
- fabricatio/models/extra/aricle_rag.py,sha256=egUZPmHkzA48IU8s9f6WRhqVMI8B8Uz8Amx-WkLLWGE,11651
46
- fabricatio/models/extra/article_base.py,sha256=0_WWal6Z6iAmEoy1g-o7JO9fNqOZ7cJX-1_AD1Rkuqg,16361
47
- fabricatio/models/extra/patches.py,sha256=_ghmnlvTZQq7UJyaH77mTZE9abjvxRJ2mgWHUbezUls,977
48
- fabricatio/models/extra/rule.py,sha256=TYtA_aSgunw8wRS3BfdNqBZbbdeS-VXLbVCJhz85Suk,2617
49
- fabricatio/models/extra/article_outline.py,sha256=71mgx66KRiXBtdYId4WNkAYp9tJ7OhUqmQyOEe7IRxI,1627
34
+ fabricatio/models/adv_kwargs_types.py,sha256=nmj1D0GVosZxKcdiw-B5vJB04Whr5zh30ZBJntSZUpY,2034
50
35
  fabricatio/models/extra/__init__.py,sha256=0R9eZsCNu6OV-Xtf15H7FrqhfHTFBFf3fBrcd7ChsJ0,53
36
+ fabricatio/models/extra/advanced_judge.py,sha256=CKPP4Lseb_Ey8Y7i2V9HJfB-mZgCknFdqq7Zo41o6s4,1060
37
+ fabricatio/models/extra/aricle_rag.py,sha256=KaryVIaMZRV6vpUYwkHDe09tgOihVWGPb1mGs1GXKSw,11723
38
+ fabricatio/models/extra/article_base.py,sha256=GmtgMa--sHSP_H4rJ-6fUxj6tYYfd-m8fOOBDXVyMZQ,16357
51
39
  fabricatio/models/extra/article_essence.py,sha256=lAkfGj4Jqiy3dSmtloVVr2krej76TV1Ky-2Fr6pNE_Q,2692
40
+ fabricatio/models/extra/article_main.py,sha256=Lg0cT4SF-0Y9in5LfYU1l9Rq_OnMYH3cCqqEByEnOhE,10817
41
+ fabricatio/models/extra/article_outline.py,sha256=71mgx66KRiXBtdYId4WNkAYp9tJ7OhUqmQyOEe7IRxI,1627
52
42
  fabricatio/models/extra/article_proposal.py,sha256=7OgcsS9ujjSi_06Z1ln4SCDQgrS4xPGrtgc2dv8EzGo,1857
43
+ fabricatio/models/extra/patches.py,sha256=_ghmnlvTZQq7UJyaH77mTZE9abjvxRJ2mgWHUbezUls,977
44
+ fabricatio/models/extra/problem.py,sha256=1Sd8hsThQK6pXMXhErRhP1ft58z4PvqeB8AV8VcXiaI,7051
53
45
  fabricatio/models/extra/rag.py,sha256=fwyEXOECQNe8LPUKGAxEcp9vp7o5356rna-TzGpkvnE,3869
54
- fabricatio/models/extra/article_main.py,sha256=9VUJ4gVp3V4EcakFfua2eEIPwX8X6kjnvOLXoRVX358,10984
46
+ fabricatio/models/extra/rule.py,sha256=TYtA_aSgunw8wRS3BfdNqBZbbdeS-VXLbVCJhz85Suk,2617
47
+ fabricatio/models/generic.py,sha256=dGap-ckYy7ZX_lXDNxv4d3yM45vdoLDYW4cl49BbCAY,27061
48
+ fabricatio/models/kwargs_types.py,sha256=VrzAJaOSlQ-xN5NIIi3k4KpIY0c9beuxcuUnF-mkEEk,3282
49
+ fabricatio/models/role.py,sha256=KxiP_hsIP85QtJhOQL_UH0lKul87hqRcd49IdWr05qQ,4154
50
+ fabricatio/models/task.py,sha256=CdR1Zbf-lZN0jODj9iriTn1X2DxLxjXlvZgy3kEd6lI,10723
51
+ fabricatio/models/tool.py,sha256=jYdN6FWEz6pE-vEh3H78VHDPpSttUQE79nfXOD4FE6U,12091
52
+ fabricatio/models/usages.py,sha256=bpM-a9i-WpSOh-XL3LiYTa3AxQUd_ckn44lh-uuKM6M,32250
55
53
  fabricatio/parser.py,sha256=3vT5u5SGpzDH4WLJdMwK5CP8RqO4g1MyQUYpiDKDoEo,4528
56
- fabricatio/decorators.py,sha256=7QU7FvTTZZ5cdVgw9VhG6wQBntGHbsfkBqifGm6wNjA,8711
57
- fabricatio/rust.pyi,sha256=Auus2CC9j714qrubsSMfNESa6G3KkACh2071Bbrp0g8,25072
54
+ fabricatio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ fabricatio/rust.cpython-313-x86_64-linux-gnu.so,sha256=xzXBPe9ePywwC0nHRFo7mouBTKUerBYu1YotXCT3NJU,7904464
56
+ fabricatio/rust.pyi,sha256=czqdl3jgSjmF05T_mUK6wwzpLaPEXQIFGHckRmuYspA,25026
58
57
  fabricatio/toolboxes/__init__.py,sha256=dYm_Gd8XolSU_h4wnkA09dlaLDK146eeFz0CUgPZ8_c,380
59
58
  fabricatio/toolboxes/arithmetic.py,sha256=sSTPkKI6-mb278DwQKFO9jKyzc9kCx45xNH7V6bGBpE,1307
60
59
  fabricatio/toolboxes/fs.py,sha256=OQMdeokYxSNVrCZJAweJ0cYiK4k2QuEiNdIbS5IHIV8,705
61
- fabricatio/rust.cpython-313-x86_64-linux-gnu.so,sha256=ruRcPJoTab5aT8PvqxUytxm03NGh8hmZhOROgc-V6xU,7905376
62
- fabricatio-0.3.14.dev5.data/scripts/tdown,sha256=ywBivzYLJ6pCFyMUqAbNkiVTv0d9MY8hbrSgFxYE3kE,4721664
63
- fabricatio-0.3.14.dev5.data/scripts/ttm,sha256=_QlP2ddeLPomk-SdEy_DE94JIuOGlDLSw7rEFtwZEXw,3920552
64
- fabricatio-0.3.14.dev5.dist-info/RECORD,,
60
+ fabricatio/utils.py,sha256=qvl4R8ThuNIIoBJuR1DGEuWYZ7jRFT_8SRx4I_FA8pU,5298
61
+ fabricatio/workflows/__init__.py,sha256=Lq9pFo2cudwFCrQUUNgSTr1CoU0J1Nw-HNEQN7cHLp8,50
62
+ fabricatio/workflows/articles.py,sha256=ZDV5nqUKRo1GOuuKWeSV7ZI32FYZU7WiTrD4YDuCeEo,945
63
+ fabricatio/workflows/rag.py,sha256=uOZXprD479fUhLA6sYvEM8RWcVcUZXXtP0xRbTMPdHE,509
64
+ fabricatio-0.3.14.dev8.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: maturin (1.8.3)
2
+ Generator: maturin (1.8.6)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp313-cp313-manylinux_2_34_x86_64