fabricatio 0.3.14.dev4__cp313-cp313-win_amd64.whl → 0.3.14.dev7__cp313-cp313-win_amd64.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.
@@ -1,10 +1,10 @@
1
1
  """A module for writing articles using RAG (Retrieval-Augmented Generation) capabilities."""
2
2
 
3
3
  from asyncio import gather
4
- from pathlib import Path
5
- from typing import ClassVar, List, Optional
6
4
 
5
+ from pathlib import Path
7
6
  from pydantic import Field, PositiveInt
7
+ from typing import ClassVar, List, Optional
8
8
 
9
9
  from fabricatio.capabilities.advanced_rag import AdvancedRAG
10
10
  from fabricatio.capabilities.censor import Censor
@@ -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
@@ -78,11 +75,11 @@ class WriteArticleContentRAG(Action, Extract, AdvancedRAG):
78
75
  tei_endpoint: Optional[str] = None
79
76
 
80
77
  async def _execute(
81
- self,
82
- article_outline: ArticleOutline,
83
- collection_name: Optional[str] = None,
84
- supervisor: Optional[bool] = None,
85
- **cxt,
78
+ self,
79
+ article_outline: ArticleOutline,
80
+ collection_name: Optional[str] = None,
81
+ supervisor: Optional[bool] = None,
82
+ **cxt,
86
83
  ) -> Article:
87
84
  article = Article.from_outline(article_outline).update_ref(article_outline)
88
85
  self.target_collection = collection_name or self.safe_target_collection
@@ -103,12 +100,12 @@ class WriteArticleContentRAG(Action, Extract, AdvancedRAG):
103
100
  "questionary", "`questionary` is required for supervisor mode, please install it by `fabricatio[qa]`"
104
101
  )
105
102
  async def _supervisor_inner(
106
- self,
107
- article: Article,
108
- article_outline: ArticleOutline,
109
- chap: ArticleChapter,
110
- sec: ArticleSection,
111
- subsec: ArticleSubsection,
103
+ self,
104
+ article: Article,
105
+ article_outline: ArticleOutline,
106
+ chap: ArticleChapter,
107
+ sec: ArticleSection,
108
+ subsec: ArticleSubsection,
112
109
  ) -> ArticleSubsection:
113
110
  from questionary import confirm, text
114
111
  from rich import print as r_print
@@ -129,20 +126,19 @@ 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
 
137
133
  return await self.extract_new_subsec(subsec, raw_paras, cm)
138
134
 
139
135
  async def _inner(
140
- self,
141
- article: Article,
142
- article_outline: ArticleOutline,
143
- chap: ArticleChapter,
144
- sec: ArticleSection,
145
- subsec: ArticleSubsection,
136
+ self,
137
+ article: Article,
138
+ article_outline: ArticleOutline,
139
+ chap: ArticleChapter,
140
+ sec: ArticleSection,
141
+ subsec: ArticleSubsection,
146
142
  ) -> ArticleSubsection:
147
143
  cm = CitationManager()
148
144
 
@@ -153,13 +149,12 @@ 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
 
161
156
  async def extract_new_subsec(
162
- self, subsec: ArticleSubsection, raw_paras: str, cm: CitationManager
157
+ self, subsec: ArticleSubsection, raw_paras: str, cm: CitationManager
163
158
  ) -> ArticleSubsection:
164
159
  """Extract the new subsec."""
165
160
  new_subsec = ok(
@@ -182,14 +177,14 @@ class WriteArticleContentRAG(Action, Extract, AdvancedRAG):
182
177
  return subsec
183
178
 
184
179
  async def write_raw(
185
- self,
186
- article: Article,
187
- article_outline: ArticleOutline,
188
- chap: ArticleChapter,
189
- sec: ArticleSection,
190
- subsec: ArticleSubsection,
191
- cm: CitationManager,
192
- extra_instruction: str = "",
180
+ self,
181
+ article: Article,
182
+ article_outline: ArticleOutline,
183
+ chap: ArticleChapter,
184
+ sec: ArticleSection,
185
+ subsec: ArticleSubsection,
186
+ cm: CitationManager,
187
+ extra_instruction: str = "",
193
188
  ) -> str:
194
189
  """Write the raw paragraphs of the subsec."""
195
190
  return await self.aask(
@@ -205,14 +200,14 @@ class WriteArticleContentRAG(Action, Extract, AdvancedRAG):
205
200
  )
206
201
 
207
202
  async def search_database(
208
- self,
209
- article: Article,
210
- article_outline: ArticleOutline,
211
- chap: ArticleChapter,
212
- sec: ArticleSection,
213
- subsec: ArticleSubsection,
214
- cm: CitationManager,
215
- extra_instruction: str = "",
203
+ self,
204
+ article: Article,
205
+ article_outline: ArticleOutline,
206
+ chap: ArticleChapter,
207
+ sec: ArticleSection,
208
+ subsec: ArticleSubsection,
209
+ cm: CitationManager,
210
+ extra_instruction: str = "",
216
211
  ) -> None:
217
212
  """Search database for related references."""
218
213
  search_req = (
@@ -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)
@@ -321,12 +312,12 @@ class TweakArticleRAG(Action, RAG, Censor):
321
312
  """The limit of references to be retrieved"""
322
313
 
323
314
  async def _execute(
324
- self,
325
- article: Article,
326
- collection_name: str = "article_essence",
327
- twk_rag_ruleset: Optional[RuleSet] = None,
328
- parallel: bool = False,
329
- **cxt,
315
+ self,
316
+ article: Article,
317
+ collection_name: str = "article_essence",
318
+ twk_rag_ruleset: Optional[RuleSet] = None,
319
+ parallel: bool = False,
320
+ **cxt,
330
321
  ) -> Article:
331
322
  """Write an article based on the provided outline.
332
323
 
@@ -381,10 +372,10 @@ class TweakArticleRAG(Action, RAG, Censor):
381
372
  subsec,
382
373
  ruleset=ruleset,
383
374
  reference=f"{'\n\n'.join(d.display() for d in await self.aretrieve(refind_q, document_model=ArticleEssence, max_accepted=self.ref_limit))}\n\n"
384
- f"You can use Reference above to rewrite the `{subsec.__class__.__name__}`.\n"
385
- f"You should Always use `{subsec.language}` as written language, "
386
- f"which is the original language of the `{subsec.title}`. "
387
- f"since rewrite a `{subsec.__class__.__name__}` in a different language is usually a bad choice",
375
+ f"You can use Reference above to rewrite the `{subsec.__class__.__name__}`.\n"
376
+ f"You should Always use `{subsec.language}` as written language, "
377
+ f"which is the original language of the `{subsec.title}`. "
378
+ f"since rewrite a `{subsec.__class__.__name__}` in a different language is usually a bad choice",
388
379
  )
389
380
 
390
381
 
@@ -399,12 +390,12 @@ class ChunkArticle(Action):
399
390
  """The maximum overlapping rate between chunks."""
400
391
 
401
392
  async def _execute(
402
- self,
403
- article_path: str | Path,
404
- bib_manager: BibManager,
405
- max_chunk_size: Optional[int] = None,
406
- max_overlapping_rate: Optional[float] = None,
407
- **_,
393
+ self,
394
+ article_path: str | Path,
395
+ bib_manager: BibManager,
396
+ max_chunk_size: Optional[int] = None,
397
+ max_overlapping_rate: Optional[float] = None,
398
+ **_,
408
399
  ) -> List[ArticleChunk]:
409
400
  return ArticleChunk.from_file(
410
401
  article_path,
@@ -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
 
@@ -1,8 +1,13 @@
1
1
  """A Module containing the article rag models."""
2
2
 
3
- import re
4
3
  from itertools import groupby
4
+
5
+ import re
6
+ from dataclasses import dataclass, field
7
+ from more_itertools.more import first
8
+ from more_itertools.recipes import flatten, unique
5
9
  from pathlib import Path
10
+ from pydantic import Field
6
11
  from typing import ClassVar, Dict, List, Optional, Self, Unpack
7
12
 
8
13
  from fabricatio.fs import safe_text_read
@@ -12,9 +17,6 @@ from fabricatio.models.generic import AsPrompt
12
17
  from fabricatio.models.kwargs_types import ChunkKwargs
13
18
  from fabricatio.rust import BibManager, blake3_hash, split_into_chunks
14
19
  from fabricatio.utils import ok, wrapp_in_block
15
- from more_itertools.more import first
16
- from more_itertools.recipes import flatten, unique
17
- from pydantic import Field
18
20
 
19
21
 
20
22
  class ArticleChunk(MilvusDataBase):
@@ -68,7 +70,7 @@ class ArticleChunk(MilvusDataBase):
68
70
 
69
71
  @classmethod
70
72
  def from_file[P: str | Path](
71
- cls, path: P | List[P], bib_mgr: BibManager, **kwargs: Unpack[ChunkKwargs]
73
+ cls, path: P | List[P], bib_mgr: BibManager, **kwargs: Unpack[ChunkKwargs]
72
74
  ) -> List[Self]:
73
75
  """Load the article chunks from the file."""
74
76
  if isinstance(path, list):
@@ -85,9 +87,9 @@ class ArticleChunk(MilvusDataBase):
85
87
  title_seg = path.stem.split(" - ").pop()
86
88
 
87
89
  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)
90
+ bib_mgr.get_cite_key_by_title(title_seg)
91
+ or bib_mgr.get_cite_key_by_title_fuzzy(title_seg)
92
+ or bib_mgr.get_cite_key_fuzzy(path.stem)
91
93
  )
92
94
  if key is None:
93
95
  logger.warning(f"no cite key found for {path.as_posix()}, skip.")
@@ -165,10 +167,11 @@ class ArticleChunk(MilvusDataBase):
165
167
  return self
166
168
 
167
169
 
170
+ @dataclass
168
171
  class CitationManager(AsPrompt):
169
172
  """Citation manager."""
170
173
 
171
- article_chunks: List[ArticleChunk] = Field(default_factory=list)
174
+ article_chunks: List[ArticleChunk] = field(default_factory=list)
172
175
  """Article chunks."""
173
176
 
174
177
  pat: str = r"(\[\[([\d\s,-]*)]])"
@@ -179,7 +182,7 @@ class CitationManager(AsPrompt):
179
182
  """Separator for abbreviated citation numbers."""
180
183
 
181
184
  def update_chunks(
182
- self, article_chunks: List[ArticleChunk], set_cite_number: bool = True, dedup: bool = True
185
+ self, article_chunks: List[ArticleChunk], set_cite_number: bool = True, dedup: bool = True
183
186
  ) -> Self:
184
187
  """Update article chunks."""
185
188
  self.article_chunks.clear()
@@ -3,6 +3,7 @@
3
3
  from abc import ABC
4
4
  from enum import StrEnum
5
5
  from pathlib import Path
6
+ from pydantic import Field
6
7
  from typing import ClassVar, Generator, List, Optional, Self, Tuple, Type
7
8
 
8
9
  from fabricatio.capabilities.persist import PersistentAble
@@ -21,9 +22,8 @@ from fabricatio.models.generic import (
21
22
  Titled,
22
23
  WordCount,
23
24
  )
24
- from fabricatio.rust import extract_body, inplace_update, split_out_metadata, to_metadata, word_count
25
+ from fabricatio.rust import extract_body, replace_thesis_body, split_out_metadata, to_metadata, word_count
25
26
  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
 
@@ -405,7 +405,7 @@ class ArticleBase[T: ChapterBase](FinalizedDumpAble, AsPrompt, FromTypstCode, To
405
405
  """Update the article file."""
406
406
  file = Path(file)
407
407
  string = safe_text_read(file)
408
- if updated := inplace_update(string, ARTICLE_WRAPPER, self.to_typst_code()):
408
+ if updated := replace_thesis_body(string, ARTICLE_WRAPPER, self.to_typst_code()):
409
409
  dump_text(file, updated)
410
410
  logger.success(f"Successfully updated {file.as_posix()}.")
411
411
  else:
@@ -1,15 +1,7 @@
1
1
  """ArticleBase and ArticleSubsection classes for managing hierarchical document components."""
2
2
 
3
- from typing import ClassVar, Dict, Generator, List, Self, Tuple, Type, override
4
-
5
- from fabricatio.rust import (
6
- convert_all_block_tex,
7
- convert_all_inline_tex,
8
- fix_misplaced_labels,
9
- split_out_metadata,
10
- word_count,
11
- )
12
3
  from pydantic import Field, NonNegativeInt
4
+ from typing import ClassVar, Dict, Generator, List, Self, Tuple, Type, override
13
5
 
14
6
  from fabricatio.capabilities.persist import PersistentAble
15
7
  from fabricatio.decorators import precheck_package
@@ -27,6 +19,12 @@ from fabricatio.models.extra.article_outline import (
27
19
  ArticleSubsectionOutline,
28
20
  )
29
21
  from fabricatio.models.generic import Described, SequencePatch, SketchedAble, WithRef, WordCount
22
+ from fabricatio.rust import (
23
+ convert_all_tex_math,
24
+ fix_misplaced_labels,
25
+ split_out_metadata,
26
+ word_count,
27
+ )
30
28
 
31
29
  PARAGRAPH_SEP = "// - - -"
32
30
 
@@ -156,15 +154,13 @@ class Article(
156
154
  if descriptions:
157
155
  for a in self.iter_dfs():
158
156
  a.description = fix_misplaced_labels(a.description)
159
- a.description = convert_all_inline_tex(a.description)
160
- a.description = convert_all_block_tex(a.description)
157
+ a.description = convert_all_tex_math(a.description)
161
158
 
162
159
  if paragraphs:
163
160
  for _, _, subsec in self.iter_subsections():
164
161
  for p in subsec.paragraphs:
165
162
  p.content = fix_misplaced_labels(p.content)
166
- p.content = convert_all_inline_tex(p.content)
167
- p.content = convert_all_block_tex(p.content)
163
+ p.content = convert_all_tex_math(p.content)
168
164
  return self
169
165
 
170
166
  @override
fabricatio/models/tool.py CHANGED
@@ -3,18 +3,18 @@
3
3
  This module provides classes for defining tools and toolboxes, which can be used to manage and execute callable functions
4
4
  with additional functionalities such as logging, execution info, and briefing.
5
5
  """
6
+
6
7
  from importlib.machinery import ModuleSpec
7
8
  from importlib.util import module_from_spec
8
9
  from inspect import iscoroutinefunction, signature
9
10
  from types import CodeType, ModuleType
10
11
  from typing import Any, Callable, Dict, List, Optional, Self, cast, overload
11
12
 
12
- from fabricatio.rust import CONFIG
13
- from pydantic import Field
14
-
15
13
  from fabricatio.decorators import logging_execution_info, use_temp_module
16
14
  from fabricatio.journal import logger
17
15
  from fabricatio.models.generic import Base, WithBriefing
16
+ from fabricatio.rust import CONFIG
17
+ from pydantic import Field
18
18
 
19
19
 
20
20
  class Tool[**P, R](WithBriefing):
Binary file
fabricatio/rust.pyi CHANGED
@@ -12,9 +12,9 @@ Key Features:
12
12
  """
13
13
 
14
14
  from enum import StrEnum
15
+ from pydantic import JsonValue
15
16
  from typing import Any, Dict, List, Literal, Optional, Self, Tuple, Union, overload
16
17
 
17
- from pydantic import JsonValue
18
18
 
19
19
  class TemplateManager:
20
20
  """Template rendering engine using Handlebars templates.
@@ -47,8 +47,10 @@ class TemplateManager:
47
47
 
48
48
  @overload
49
49
  def render_template(self, name: str, data: Dict[str, Any]) -> str: ...
50
+
50
51
  @overload
51
52
  def render_template(self, name: str, data: List[Dict[str, Any]]) -> List[str]: ...
53
+
52
54
  def render_template(self, name: str, data: Dict[str, Any] | List[Dict[str, Any]]) -> str | List[str]:
53
55
  """Render a template with context data.
54
56
 
@@ -65,8 +67,10 @@ class TemplateManager:
65
67
 
66
68
  @overload
67
69
  def render_template_raw(self, template: str, data: Dict[str, Any]) -> str: ...
70
+
68
71
  @overload
69
72
  def render_template_raw(self, template: str, data: List[Dict[str, Any]]) -> List[str]: ...
73
+
70
74
  def render_template_raw(self, template: str, data: Dict[str, Any] | List[Dict[str, Any]]) -> str | List[str]:
71
75
  """Render a template with context data.
72
76
 
@@ -78,6 +82,7 @@ class TemplateManager:
78
82
  Rendered template content as string or list of strings
79
83
  """
80
84
 
85
+
81
86
  class BibManager:
82
87
  """BibTeX bibliography manager for parsing and querying citation data."""
83
88
 
@@ -186,6 +191,7 @@ class BibManager:
186
191
  Field value if found, None otherwise
187
192
  """
188
193
 
194
+
189
195
  def blake3_hash(content: bytes) -> str:
190
196
  """Calculate the BLAKE3 cryptographic hash of data.
191
197
 
@@ -196,9 +202,11 @@ def blake3_hash(content: bytes) -> str:
196
202
  Hex-encoded BLAKE3 hash string
197
203
  """
198
204
 
205
+
199
206
  def detect_language(string: str) -> str:
200
207
  """Detect the language of a given string."""
201
208
 
209
+
202
210
  def split_word_bounds(string: str) -> List[str]:
203
211
  """Split the string into words based on word boundaries.
204
212
 
@@ -209,6 +217,7 @@ def split_word_bounds(string: str) -> List[str]:
209
217
  A list of words extracted from the string.
210
218
  """
211
219
 
220
+
212
221
  def split_sentence_bounds(string: str) -> List[str]:
213
222
  """Split the string into sentences based on sentence boundaries.
214
223
 
@@ -219,6 +228,7 @@ def split_sentence_bounds(string: str) -> List[str]:
219
228
  A list of sentences extracted from the string.
220
229
  """
221
230
 
231
+
222
232
  def split_into_chunks(string: str, max_chunk_size: int, max_overlapping_rate: float = 0.3) -> List[str]:
223
233
  """Split the string into chunks of a specified size.
224
234
 
@@ -231,6 +241,7 @@ def split_into_chunks(string: str, max_chunk_size: int, max_overlapping_rate: fl
231
241
  A list of chunks extracted from the string.
232
242
  """
233
243
 
244
+
234
245
  def word_count(string: str) -> int:
235
246
  """Count the number of words in the string.
236
247
 
@@ -241,51 +252,67 @@ def word_count(string: str) -> int:
241
252
  The number of words in the string.
242
253
  """
243
254
 
255
+
244
256
  def is_chinese(string: str) -> bool:
245
257
  """Check if the given string is in Chinese."""
246
258
 
259
+
247
260
  def is_english(string: str) -> bool:
248
261
  """Check if the given string is in English."""
249
262
 
263
+
250
264
  def is_japanese(string: str) -> bool:
251
265
  """Check if the given string is in Japanese."""
252
266
 
267
+
253
268
  def is_korean(string: str) -> bool:
254
269
  """Check if the given string is in Korean."""
255
270
 
271
+
256
272
  def is_arabic(string: str) -> bool:
257
273
  """Check if the given string is in Arabic."""
258
274
 
275
+
259
276
  def is_russian(string: str) -> bool:
260
277
  """Check if the given string is in Russian."""
261
278
 
279
+
262
280
  def is_german(string: str) -> bool:
263
281
  """Check if the given string is in German."""
264
282
 
283
+
265
284
  def is_french(string: str) -> bool:
266
285
  """Check if the given string is in French."""
267
286
 
287
+
268
288
  def is_hindi(string: str) -> bool:
269
289
  """Check if the given string is in Hindi."""
270
290
 
291
+
271
292
  def is_italian(string: str) -> bool:
272
293
  """Check if the given string is in Italian."""
273
294
 
295
+
274
296
  def is_dutch(string: str) -> bool:
275
297
  """Check if the given string is in Dutch."""
276
298
 
299
+
277
300
  def is_portuguese(string: str) -> bool:
278
301
  """Check if the given string is in Portuguese."""
279
302
 
303
+
280
304
  def is_swedish(string: str) -> bool:
281
305
  """Check if the given string is in Swedish."""
282
306
 
307
+
283
308
  def is_turkish(string: str) -> bool:
284
309
  """Check if the given string is in Turkish."""
285
310
 
311
+
286
312
  def is_vietnamese(string: str) -> bool:
287
313
  """Check if the given string is in Vietnamese."""
288
314
 
315
+
289
316
  def tex_to_typst(string: str) -> str:
290
317
  """Convert TeX to Typst.
291
318
 
@@ -296,26 +323,20 @@ def tex_to_typst(string: str) -> str:
296
323
  The converted Typst string.
297
324
  """
298
325
 
299
- def convert_all_inline_tex(string: str) -> str:
300
- """Convert all inline TeX code in the string.
301
-
302
- Args:
303
- string: The input string containing inline TeX code wrapped in $code$.
304
326
 
305
- Returns:
306
- The converted string with inline TeX code replaced.
307
- """
327
+ def convert_all_tex_math(string: str) -> str:
328
+ r"""Unified function to convert all supported TeX math expressions in a string to Typst format.
308
329
 
309
- def convert_all_block_tex(string: str) -> str:
310
- """Convert all block TeX code in the string.
330
+ Handles $...$, $$...$$, \\(...\\), and \\[...\\]
311
331
 
312
332
  Args:
313
- string: The input string containing block TeX code wrapped in $$code$$.
333
+ string: The input string containing TeX math expressions.
314
334
 
315
335
  Returns:
316
- The converted string with block TeX code replaced.
336
+ The string with TeX math expressions converted to Typst format.
317
337
  """
318
338
 
339
+
319
340
  def fix_misplaced_labels(string: str) -> str:
320
341
  """A func to fix labels in a string.
321
342
 
@@ -326,8 +347,9 @@ def fix_misplaced_labels(string: str) -> str:
326
347
  The fixed string with labels properly placed.
327
348
  """
328
349
 
350
+
329
351
  def comment(string: str) -> str:
330
- """Add comment to the string.
352
+ r"""Add comment to the string.
331
353
 
332
354
  Args:
333
355
  string: The input string to which comments will be added.
@@ -336,6 +358,7 @@ def comment(string: str) -> str:
336
358
  The string with each line prefixed by '// '.
337
359
  """
338
360
 
361
+
339
362
  def uncomment(string: str) -> str:
340
363
  """Remove comment from the string.
341
364
 
@@ -346,6 +369,7 @@ def uncomment(string: str) -> str:
346
369
  The string with comments (lines starting with '// ' or '//') removed.
347
370
  """
348
371
 
372
+
349
373
  def split_out_metadata(string: str) -> Tuple[Optional[JsonValue], str]:
350
374
  """Split out metadata from a string.
351
375
 
@@ -356,6 +380,7 @@ def split_out_metadata(string: str) -> Tuple[Optional[JsonValue], str]:
356
380
  A tuple containing the metadata as a Python object (if parseable) and the remaining string.
357
381
  """
358
382
 
383
+
359
384
  def to_metadata(data: JsonValue) -> str:
360
385
  """Convert a Python object to a YAML string.
361
386
 
@@ -366,13 +391,8 @@ def to_metadata(data: JsonValue) -> str:
366
391
  The YAML string representation of the input data.
367
392
  """
368
393
 
369
- def convert_to_inline_formula(string: str) -> str:
370
- r"""Convert `$...$` to inline formula `\(...\)` and trim spaces."""
371
394
 
372
- def convert_to_block_formula(string: str) -> str:
373
- r"""Convert `$$...$$` to block formula `\[...\]` and trim spaces."""
374
-
375
- def inplace_update(string: str, wrapper: str, new_body: str) -> Optional[str]:
395
+ def replace_thesis_body(string: str, wrapper: str, new_body: str) -> Optional[str]:
376
396
  """Replace content between wrapper strings.
377
397
 
378
398
  Args:
@@ -385,6 +405,7 @@ def inplace_update(string: str, wrapper: str, new_body: str) -> Optional[str]:
385
405
 
386
406
  """
387
407
 
408
+
388
409
  def extract_body(string: str, wrapper: str) -> Optional[str]:
389
410
  """Extract the content between two occurrences of a wrapper string.
390
411
 
@@ -396,6 +417,7 @@ def extract_body(string: str, wrapper: str) -> Optional[str]:
396
417
  The content between the first two occurrences of the wrapper string if found, otherwise None.
397
418
  """
398
419
 
420
+
399
421
  class LLMConfig:
400
422
  """LLM configuration structure.
401
423
 
@@ -447,6 +469,7 @@ class LLMConfig:
447
469
  frequency_penalty: Optional[float]
448
470
  """Penalizes new tokens based on their frequency in text so far (-2.0-2.0)."""
449
471
 
472
+
450
473
  class EmbeddingConfig:
451
474
  """Embedding configuration structure."""
452
475
 
@@ -471,6 +494,7 @@ class EmbeddingConfig:
471
494
  api_key: Optional[SecretStr]
472
495
  """The API key."""
473
496
 
497
+
474
498
  class RagConfig:
475
499
  """RAG (Retrieval Augmented Generation) configuration structure."""
476
500
 
@@ -486,12 +510,14 @@ class RagConfig:
486
510
  milvus_dimensions: Optional[int]
487
511
  """The dimensions for Milvus vectors."""
488
512
 
513
+
489
514
  class DebugConfig:
490
515
  """Debug configuration structure."""
491
516
 
492
517
  log_level: Optional[str]
493
518
  """The logging level to use."""
494
519
 
520
+
495
521
  class TemplateManagerConfig:
496
522
  """Template manager configuration structure."""
497
523
 
@@ -504,6 +530,7 @@ class TemplateManagerConfig:
504
530
  template_suffix: Optional[str]
505
531
  """The suffix of the templates."""
506
532
 
533
+
507
534
  class TemplateConfig:
508
535
  """Template configuration structure."""
509
536
 
@@ -588,6 +615,7 @@ class TemplateConfig:
588
615
  chap_summary_template: str
589
616
  """The name of the chap summary template which will be used to generate a chapter summary."""
590
617
 
618
+
591
619
  class RoutingConfig:
592
620
  """Routing configuration structure for controlling request dispatching behavior."""
593
621
 
@@ -603,6 +631,7 @@ class RoutingConfig:
603
631
  cooldown_time: Optional[int]
604
632
  """Time to cooldown a deployment after failure in seconds."""
605
633
 
634
+
606
635
  class GeneralConfig:
607
636
  """General configuration structure for application-wide settings."""
608
637
 
@@ -612,6 +641,7 @@ class GeneralConfig:
612
641
  use_json_repair: bool
613
642
  """Whether to automatically repair malformed JSON."""
614
643
 
644
+
615
645
  class ToolBoxConfig:
616
646
  """Configuration for toolbox functionality."""
617
647
 
@@ -621,6 +651,7 @@ class ToolBoxConfig:
621
651
  data_module_name: str
622
652
  """The name of the module containing the data."""
623
653
 
654
+
624
655
  class PymitterConfig:
625
656
  """Pymitter configuration structure for controlling event emission and listener behavior."""
626
657
 
@@ -633,6 +664,7 @@ class PymitterConfig:
633
664
  max_listeners: int
634
665
  """The maximum number of listeners per event. -1 means unlimited."""
635
666
 
667
+
636
668
  class Config:
637
669
  """Configuration structure containing all system components."""
638
670
 
@@ -666,17 +698,22 @@ class Config:
666
698
  pymitter: PymitterConfig
667
699
  """Pymitter configuration."""
668
700
 
701
+
669
702
  CONFIG: Config
670
703
 
704
+
671
705
  class SecretStr:
672
706
  """A string that should not be exposed."""
673
707
 
674
708
  def __init__(self, source: str) -> None: ...
709
+
675
710
  def get_secret_value(self) -> str:
676
711
  """Expose the secret string."""
677
712
 
713
+
678
714
  TEMPLATE_MANAGER: TemplateManager
679
715
 
716
+
680
717
  class Event:
681
718
  """Event class that represents a hierarchical event with segments.
682
719
 
@@ -788,9 +825,12 @@ class Event:
788
825
  """
789
826
 
790
827
  def __hash__(self) -> int: ...
828
+
791
829
  def __eq__(self, other: object) -> bool: ...
830
+
792
831
  def __ne__(self, other: object) -> bool: ...
793
832
 
833
+
794
834
  class TaskStatus(StrEnum, str):
795
835
  """Enumeration of possible task statuses."""
796
836
 
@@ -809,6 +849,7 @@ class TaskStatus(StrEnum, str):
809
849
  Cancelled: TaskStatus
810
850
  """Task has been cancelled."""
811
851
 
852
+
812
853
  class TEIClient:
813
854
  """Client for TEI reranking service.
814
855
 
@@ -824,11 +865,11 @@ class TEIClient:
824
865
  """
825
866
 
826
867
  async def arerank(
827
- self,
828
- query: str,
829
- texts: List[str],
830
- truncate: bool = False,
831
- truncation_direction: Literal["Left", "Right"] = "Left",
868
+ self,
869
+ query: str,
870
+ texts: List[str],
871
+ truncate: bool = False,
872
+ truncation_direction: Literal["Left", "Right"] = "Left",
832
873
  ) -> List[Tuple[int, float]]:
833
874
  """Rerank texts based on relevance to query.
834
875
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fabricatio
3
- Version: 0.3.14.dev4
3
+ Version: 0.3.14.dev7
4
4
  Classifier: License :: OSI Approved :: MIT License
5
5
  Classifier: Programming Language :: Rust
6
6
  Classifier: Programming Language :: Python :: 3.12
@@ -1,13 +1,17 @@
1
- fabricatio-0.3.14.dev4.dist-info/METADATA,sha256=RQu1-d7pqsIWpqH7Ts6YVBMl91x2LaSOvvhxozZhrk4,5116
2
- fabricatio-0.3.14.dev4.dist-info/WHEEL,sha256=6gg8M7kMeWmDzkhJuJzWLhBYdt7OGDF81wlSJjN85_E,96
3
- fabricatio-0.3.14.dev4.dist-info/licenses/LICENSE,sha256=do7J7EiCGbq0QPbMAL_FqLYufXpHnCnXBOuqVPwSV8Y,1088
1
+ fabricatio-0.3.14.dev7.data/scripts/tdown.exe,sha256=lHV09r-4UOiWlzHyfYV6iq1iXdXP8FbwtMwjGiPKaqU,3450880
2
+ fabricatio-0.3.14.dev7.data/scripts/ttm.exe,sha256=JYT1OR7umACb3xXHjQZ9JzoILYX-atkSZ-ENFBo4Gcw,2561536
3
+ fabricatio-0.3.14.dev7.dist-info/METADATA,sha256=btu_bPIYHocy_FeY8gF0BZ1qx60Td8eujW1SGyEQOr8,5116
4
+ fabricatio-0.3.14.dev7.dist-info/WHEEL,sha256=aR9tSjQsZDIcSIX9Ihx1Vyf9toUnjsKopg6qQPYNdi8,96
5
+ fabricatio-0.3.14.dev7.dist-info/licenses/LICENSE,sha256=do7J7EiCGbq0QPbMAL_FqLYufXpHnCnXBOuqVPwSV8Y,1088
6
+ fabricatio/__init__.py,sha256=w7ObFg6ud4pQuC1DhVyQI9x9dtp05QrcJAEk643iJmc,761
7
+ fabricatio/actions/__init__.py,sha256=wVENCFtpVb1rLFxoOFJt9-8smLWXuJV7IwA8P3EfFz4,48
4
8
  fabricatio/actions/article.py,sha256=TPS2fOqCymKv2hK2c_WmMRMKNBkvN8M91QkB9ar8-bg,12507
5
- fabricatio/actions/article_rag.py,sha256=e1fVh7Jph2zVD0bRAmK2dJ0BVkSEvF-FPfxUKujkn6s,18407
9
+ fabricatio/actions/article_rag.py,sha256=81668J2A_v00ODc01T-4FBEAtla6SB55VwSDO7DuRR4,18213
6
10
  fabricatio/actions/fs.py,sha256=gJR14U4ln35nt8Z7OWLVAZpqGaLnED-r1Yi-lX22tkI,959
7
11
  fabricatio/actions/output.py,sha256=jZL72D5uFobKNiVFapnVxBcjSNqGEThYNlCUKQvZwz8,9935
8
12
  fabricatio/actions/rag.py,sha256=vgCzIfbSd3_vL3QxB12PY4h12V9Pe3sZRsWme0KC6X8,3583
9
13
  fabricatio/actions/rules.py,sha256=dkvCgNDjt2KSO1VgPRsxT4YBmIIMeetZb5tiz-slYkU,3640
10
- fabricatio/actions/__init__.py,sha256=wVENCFtpVb1rLFxoOFJt9-8smLWXuJV7IwA8P3EfFz4,48
14
+ fabricatio/capabilities/__init__.py,sha256=v1cHRHIJ2gxyqMLNCs6ERVcCakSasZNYzmMI4lqAcls,57
11
15
  fabricatio/capabilities/advanced_judge.py,sha256=jQ_Gsn6L8EKb6KQi3j0G0GSUz2j8D2220C1hIhrAeU8,682
12
16
  fabricatio/capabilities/advanced_rag.py,sha256=DYh-imLQkjVOgKd__OEbwGzqwNeTtX_6NBGx_bCiFs8,2539
13
17
  fabricatio/capabilities/censor.py,sha256=e0tHll4J_-TT8-Vn1OZ1innVZbJfx55oyGtDoEI99r8,4745
@@ -16,49 +20,45 @@ fabricatio/capabilities/correct.py,sha256=-JR8ZUAtagmNXepVyY679MBUyFCZwtKPjv8dAN
16
20
  fabricatio/capabilities/extract.py,sha256=E7CLZflWzJ6C6DVLEWysYZ_48g_-F93gZJVU56k2-XA,2523
17
21
  fabricatio/capabilities/persist.py,sha256=9XnKoeZ62YjXVDpYnkbDFf62B_Mz46WVsq1dTr2Wvvc,3421
18
22
  fabricatio/capabilities/propose.py,sha256=v8OiUHc8GU7Jg1zAUghYhrI-AKgmBeUvQMo22ZAOddw,2030
19
- fabricatio/capabilities/rag.py,sha256=D5rULrQxPmp4kVLP_jBE4yal1v9N68XOgBdJqGvVHpU,10979
23
+ fabricatio/capabilities/rag.py,sha256=lwFrC96tL3uJ4keJ6n46vrvrdF6bARg1Yn6y6pQn7VQ,11194
20
24
  fabricatio/capabilities/rating.py,sha256=cm-s2YJMYcS36mR9b7XNwRQ1x0h0uWxLHCapoAORv8I,17815
21
25
  fabricatio/capabilities/review.py,sha256=l06BYcQzPi7VKmWdplj9L6WvZEscZqW1Wx9OhR-UnNw,5061
22
26
  fabricatio/capabilities/task.py,sha256=-b92cGi7b3B30kOSS-90_H6BjA0VF_cjc1BzPbO5MkI,4401
23
- fabricatio/capabilities/__init__.py,sha256=v1cHRHIJ2gxyqMLNCs6ERVcCakSasZNYzmMI4lqAcls,57
24
27
  fabricatio/decorators.py,sha256=OohwKgc5dUjybv70D-J2lA0C9zjUuq8-gzU5O8JPl8w,8962
25
28
  fabricatio/emitter.py,sha256=n4vH6E7lcT57qVve_3hUAdfvj0mQUDkWu6iU5aNztB8,6341
29
+ fabricatio/fs/__init__.py,sha256=USoMI_HcIr3Yc77_JQYYsXrsplYPXtFTaNB9YgFfC4s,713
26
30
  fabricatio/fs/curd.py,sha256=652nHulbJ3gwt0Z3nywtPMmjhEyglDvEfc3p7ieJNNA,4777
27
31
  fabricatio/fs/readers.py,sha256=UXvcJO3UCsxHu9PPkg34Yh55Zi-miv61jD_wZQJgKRs,1751
28
- fabricatio/fs/__init__.py,sha256=USoMI_HcIr3Yc77_JQYYsXrsplYPXtFTaNB9YgFfC4s,713
29
32
  fabricatio/journal.py,sha256=mnbdB1Dw-mhEKIgWlPKn7W07ssg-6dmxMXilIGQMFV8,216
30
33
  fabricatio/models/action.py,sha256=RhjHaEJILiCZux5hzxSZVt_7Evcu3TnFHNuJN8rzgq8,10052
31
34
  fabricatio/models/adv_kwargs_types.py,sha256=IBV3ZcsNLvvEjO_2hBpYg_wLSpNKaMx6Ndam3qXJCw8,2097
35
+ fabricatio/models/extra/__init__.py,sha256=XlYnS_2B9nhLhtQkjE7rvvfPmAAtXVdNi9bSDAR-Ge8,54
32
36
  fabricatio/models/extra/advanced_judge.py,sha256=INUl_41C8jkausDekkjnEmTwNfLCJ23TwFjq2cM23Cw,1092
33
- fabricatio/models/extra/aricle_rag.py,sha256=fTxlQyrzyl9bLCC5Zreb71TKaJ7xiHqqyR62HXr2unQ,11935
34
- fabricatio/models/extra/article_base.py,sha256=Hm78qqqkZpeLlt979cgGiam3LE4CussLv0nQkNC9mW8,16769
37
+ fabricatio/models/extra/aricle_rag.py,sha256=K2ceihjIJFfkE82ykNH8hwTLDbXfFRZAXhz1NkdVZSA,12011
38
+ fabricatio/models/extra/article_base.py,sha256=1azdvRfT9lKiPT3xVTlP26FfzJOTwMlueJQDee3TgOU,16783
35
39
  fabricatio/models/extra/article_essence.py,sha256=z3Qz6xVsB9k-K-c4Y2CoKzxZrXaUd4oyt2Mb6hGDYdg,2793
36
- fabricatio/models/extra/article_main.py,sha256=S6eUUBuzBzRcuFe8hPhaFvL7UhyO1gaUCyJkNbJIgz8,11278
40
+ fabricatio/models/extra/article_main.py,sha256=7fH_pVjIDtaz4Gw885FU1m29puKgm3nHoowrVeWdMIE,11106
37
41
  fabricatio/models/extra/article_outline.py,sha256=P0T-1DGCzoNmQ3iQVwSmOul0nwS6qLgr0FF8jDdD7F0,1673
38
42
  fabricatio/models/extra/article_proposal.py,sha256=OQIKoJkmJv0ogYVk7eGK_TOtANVYcBPA_HeV1nuG0Vo,1909
39
43
  fabricatio/models/extra/patches.py,sha256=_WNCxtYzzsVfUxI16vu4IqsLahLYRHdbQN9er9tqhC0,997
40
44
  fabricatio/models/extra/problem.py,sha256=8tTU-3giFHOi5j7NJsvH__JJyYcaGrcfsRnkzQNm0Ew,7216
41
45
  fabricatio/models/extra/rag.py,sha256=C7ptZCuGJmT8WikjpF9KhZ0Bw-VicdB-s8EqEAgMLKE,3967
42
46
  fabricatio/models/extra/rule.py,sha256=WKahNiaIp8s_l2r_FG21F_PP3_hgNm4hfSVCSFyfoBE,2669
43
- fabricatio/models/extra/__init__.py,sha256=XlYnS_2B9nhLhtQkjE7rvvfPmAAtXVdNi9bSDAR-Ge8,54
44
47
  fabricatio/models/generic.py,sha256=OJrYClooL2XnyalWTyyLgorycA1d_JNW8VqOYNDJdXc,27873
45
48
  fabricatio/models/kwargs_types.py,sha256=Ik8-Oi_NmwfkvC9B8K4NsoZc_vSWV85xKCSthA1Xv_k,3403
46
49
  fabricatio/models/role.py,sha256=b3zg96YKDsMBqa7SIe9LQHc-IVs2fGWqoQeRQYQIl4o,3856
47
50
  fabricatio/models/task.py,sha256=XZ1l1P-iS02ZF9P8cXv8gEfJKBa17PFPNJ1SbhyhT4Q,11033
48
- fabricatio/models/tool.py,sha256=K7XYG_DnlM5IfFabe4LwEZ3DtlSCcf5LZOKbeDWBH14,12419
51
+ fabricatio/models/tool.py,sha256=q2wDtZAebWMZlsFifgmJq8N3XvAhVNMb0aUIKkdruGc,12419
49
52
  fabricatio/models/usages.py,sha256=q2jLqa0vJ7ho9ZUkC-2uPuFpK8uClBLIS6TEEYHUotY,33041
50
53
  fabricatio/parser.py,sha256=dYFri9pDlsiwVpEJ-a5jmVU2nFuKN3uBHC8VsVpdEm8,4642
51
54
  fabricatio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- fabricatio/rust.pyi,sha256=dlssKYR2RrS9UQb9bc3y6XP7a9Clq1Qr40dzMW_vNB0,26256
55
+ fabricatio/rust.cp313-win_amd64.pyd,sha256=fMFlamARxZ3hNaXJGCkFN6C2BYuPgZI1poi3QE9JIys,7830016
56
+ fabricatio/rust.pyi,sha256=PK9KfYSUto6nZ2KaCmF5sEVWCNizdtgOLhJhc1E7w20,25962
57
+ fabricatio/toolboxes/__init__.py,sha256=KBJi5OG_pExscdlM7Bnt_UF43j4I3Lv6G71kPVu4KQU,395
53
58
  fabricatio/toolboxes/arithmetic.py,sha256=WLqhY-Pikv11Y_0SGajwZx3WhsLNpHKf9drzAqOf_nY,1369
54
59
  fabricatio/toolboxes/fs.py,sha256=l4L1CVxJmjw9Ld2XUpIlWfV0_Fu_2Og6d3E13I-S4aE,736
55
- fabricatio/toolboxes/__init__.py,sha256=KBJi5OG_pExscdlM7Bnt_UF43j4I3Lv6G71kPVu4KQU,395
56
60
  fabricatio/utils.py,sha256=WYhFB4tHk6jKmjZgAsYhRmg1ZvBjn4X2y4n7yz25HjE,5454
61
+ fabricatio/workflows/__init__.py,sha256=5ScFSTA-bvhCesj3U9Mnmi6Law6N1fmh5UKyh58L3u8,51
57
62
  fabricatio/workflows/articles.py,sha256=ObYTFUqLUk_CzdmmnX6S7APfxcGmPFqnFr9pdjU7Z4Y,969
58
63
  fabricatio/workflows/rag.py,sha256=-YYp2tlE9Vtfgpg6ROpu6QVO8j8yVSPa6yDzlN3qVxs,520
59
- fabricatio/workflows/__init__.py,sha256=5ScFSTA-bvhCesj3U9Mnmi6Law6N1fmh5UKyh58L3u8,51
60
- fabricatio/__init__.py,sha256=w7ObFg6ud4pQuC1DhVyQI9x9dtp05QrcJAEk643iJmc,761
61
- fabricatio/rust.cp313-win_amd64.pyd,sha256=-Xps_ojYfsRw7s4AWzvPcftvF2bwbhluP_KXKTJAMns,7819776
62
- fabricatio-0.3.14.dev4.data/scripts/tdown.exe,sha256=rcQpG_q-9J97Dg_hgHJhUiMdfXBvSwbbrOXHYpx8xoo,3448320
63
- fabricatio-0.3.14.dev4.data/scripts/ttm.exe,sha256=PkRspfDbHwEkKoBkgftRPu_GGCBOCsuuv61IwV4lJTw,2555392
64
- fabricatio-0.3.14.dev4.dist-info/RECORD,,
64
+ fabricatio-0.3.14.dev7.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: maturin (1.8.3)
2
+ Generator: maturin (1.8.4)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp313-cp313-win_amd64
Binary file