fabricatio 0.2.13.dev1__cp312-cp312-win_amd64.whl → 0.2.13.dev2__cp312-cp312-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.
@@ -21,17 +21,17 @@ from fabricatio.models.extra.article_outline import ArticleOutline
21
21
  from fabricatio.models.extra.rule import RuleSet
22
22
  from fabricatio.models.kwargs_types import ChooseKwargs, LLMKwargs
23
23
  from fabricatio.rust import convert_to_block_formula, convert_to_inline_formula
24
- from fabricatio.utils import ask_retain, ok
24
+ from fabricatio.utils import ok
25
25
 
26
26
  TYPST_CITE_USAGE = (
27
- "citation number is REQUIRED to cite any reference!,for example in Auther Pattern: 'Doe et al.[[1]], Jack et al.[[2]]' or in Sentence Suffix Sattern: 'Global requirement is incresing[[1]].'\n"
28
- "Everything is build upon the typst language, which is similar to latex, \n"
27
+ "citation number is REQUIRED to cite any reference!'\n"
29
28
  "Legal citing syntax examples(seperated by |): [[1]]|[[1,2]]|[[1-3]]|[[12,13-15]]|[[1-3,5-7]]\n"
30
29
  "Illegal citing syntax examples(seperated by |): [[1],[2],[3]]|[[1],[1-2]]\n"
30
+ "You SHALL not cite a single reference more than once!"
31
31
  "Those reference mark shall not be omitted during the extraction\n"
32
32
  "It's recommended to cite multiple references that supports your conclusion at a time.\n"
33
33
  "Wrap inline expression with '\\(' and '\\)',like '\\(>5m\\)' '\\(89%\\)', and wrap block equation with '\\[' and '\\]'.\n"
34
- "In addition to that, you can add a label outside the block equation which can be used as a cross reference identifier, the label is a string wrapped in `<` and `>` like `<energy-release-rate-equation>`.Note that the label string should be a summarizing title for the equation being labeled.\n"
34
+ "In addition to that, you can add a label outside the block equation which can be used as a cross reference identifier, the label is a string wrapped in `<` and `>` like `<energy-release-rate-equation>`.Note that the label string should be a summarizing title for the equation being labeled and should never be written within the formula block.\n"
35
35
  "you can refer to that label by using the syntax with prefix of `@eqt:`, which indicate that this notation is citing a label from the equations. For example ' @eqt:energy-release-rate-equation ' DO remember that the notation shall have both suffixed and prefixed space char which enable the compiler to distinguish the notation from the plaintext."
36
36
  "Below is two usage example:\n"
37
37
  "```typst\n"
@@ -47,6 +47,7 @@ TYPST_CITE_USAGE = (
47
47
  class WriteArticleContentRAG(Action, RAG, Extract):
48
48
  """Write an article based on the provided outline."""
49
49
 
50
+ ctx_override: ClassVar[bool] = True
50
51
  search_increment_multiplier: float = 1.6
51
52
  """The increment multiplier of the search increment."""
52
53
  ref_limit: int = 35
@@ -63,6 +64,7 @@ class WriteArticleContentRAG(Action, RAG, Extract):
63
64
  """The number of results to be returned per query."""
64
65
  req: str = TYPST_CITE_USAGE
65
66
  """The req of the write article content."""
67
+ tei_endpoint: Optional[str] = None
66
68
 
67
69
  async def _execute(
68
70
  self,
@@ -108,16 +110,7 @@ class WriteArticleContentRAG(Action, RAG, Extract):
108
110
 
109
111
  while not await confirm("Accept this version and continue?").ask_async():
110
112
  if inst := await text("Search for more refs for additional spec.").ask_async():
111
- await self.search_database(
112
- article,
113
- article_outline,
114
- chap,
115
- sec,
116
- subsec,
117
- cm,
118
- supervisor=True,
119
- extra_instruction=inst,
120
- )
113
+ await self.search_database(article, article_outline, chap, sec, subsec, cm, extra_instruction=inst)
121
114
 
122
115
  if instruction := await text("Enter the instructions to improve").ask_async():
123
116
  raw = await self.write_raw(article, article_outline, chap, sec, subsec, cm, instruction)
@@ -200,7 +193,6 @@ class WriteArticleContentRAG(Action, RAG, Extract):
200
193
  subsec: ArticleSubsection,
201
194
  cm: CitationManager,
202
195
  extra_instruction: str = "",
203
- supervisor: bool = False,
204
196
  ) -> None:
205
197
  """Search database for related references."""
206
198
  search_req = (
@@ -208,50 +200,19 @@ class WriteArticleContentRAG(Action, RAG, Extract):
208
200
  f"More specifically, i m witting the Chapter `{chap.title}` >> Section `{sec.title}` >> Subsection `{subsec.title}`.\n"
209
201
  f"I need to search related references to build up the content of the subsec mentioned above, which is `{subsec.title}`.\n"
210
202
  f"provide 10~16 queries as possible, to get best result!\n"
211
- f"You should provide both English version and chinese version of the refined queries!\n{extra_instruction}\n"
212
- )
213
-
214
- ref_q = ok(
215
- await self.arefined_query(
216
- search_req,
217
- **self.query_model,
218
- ),
219
- "Failed to refine query.",
220
- )
221
-
222
- if supervisor:
223
- ref_q = await ask_retain(ref_q)
224
- ret = await self.aretrieve(
225
- ref_q,
226
- ArticleChunk,
227
- max_accepted=self.ref_limit,
228
- result_per_query=self.result_per_query,
229
- similarity_threshold=self.threshold,
230
- )
231
-
232
- cm.add_chunks(ok(ret))
233
- ref_q = await self.arefined_query(
234
- f"{cm.as_prompt()}\n\nAbove is the retrieved references in the first RAG, now we need to perform the second RAG.\n\n{search_req}",
235
- **self.query_model,
203
+ f"You should provide both English version and chinese version of the refined queries!\n{extra_instruction}"
236
204
  )
237
205
 
238
- if ref_q is None:
239
- logger.warning("Second refine query is None, skipping.")
240
- return
241
- if supervisor:
242
- ref_q = await ask_retain(ref_q)
243
-
244
- ret = await self.aretrieve(
245
- ref_q,
246
- ArticleChunk,
247
- max_accepted=int(self.ref_limit * self.search_increment_multiplier),
248
- result_per_query=int(self.result_per_query * self.search_increment_multiplier),
249
- similarity_threshold=self.threshold,
206
+ await self.clued_search(
207
+ search_req,
208
+ cm,
209
+ refinery_kwargs=self.ref_q_model,
210
+ expand_multiplier=self.search_increment_multiplier,
211
+ base_accepted=self.ref_limit,
212
+ result_per_query=self.ref_per_q,
213
+ similarity_threshold=self.similarity_threshold,
214
+ tei_endpoint=self.tei_endpoint,
250
215
  )
251
- if ret is None:
252
- logger.warning("Second retrieve is None, skipping.")
253
- return
254
- cm.add_chunks(ret)
255
216
 
256
217
 
257
218
  class ArticleConsultRAG(Action, AdvancedRAG):
@@ -261,9 +222,9 @@ class ArticleConsultRAG(Action, AdvancedRAG):
261
222
  output_key: str = "consult_count"
262
223
  search_increment_multiplier: float = 1.6
263
224
  """The multiplier to increase the limit of references to retrieve per query."""
264
- ref_limit: int = 20
225
+ ref_limit: int = 26
265
226
  """The final limit of references."""
266
- ref_per_q: int = 3
227
+ ref_per_q: int = 13
267
228
  """The limit of references to retrieve per query."""
268
229
  similarity_threshold: float = 0.62
269
230
  """The similarity threshold of references to retrieve."""
@@ -7,6 +7,7 @@ from fabricatio.journal import logger
7
7
  from fabricatio.models.adv_kwargs_types import FetchKwargs
8
8
  from fabricatio.models.extra.aricle_rag import ArticleChunk, CitationManager
9
9
  from fabricatio.models.kwargs_types import ChooseKwargs
10
+ from fabricatio.utils import fallback_kwargs
10
11
 
11
12
 
12
13
  class AdvancedRAG(RAG):
@@ -40,10 +41,13 @@ class AdvancedRAG(RAG):
40
41
  f"\n\n{requirement}",
41
42
  **refinery_kwargs,
42
43
  )
44
+
43
45
  if ref_q is None:
44
46
  logger.error(f"At round [{i}/{max_round}] search, failed to refine the query, exit.")
45
47
  return cm
46
- refs = await self.aretrieve(ref_q, ArticleChunk, base_accepted, **kwargs)
48
+ refs = await self.aretrieve(
49
+ ref_q, ArticleChunk, base_accepted, **fallback_kwargs(kwargs, filter_expr=cm.as_milvus_filter_expr())
50
+ )
47
51
 
48
52
  if (max_capacity := max_capacity - len(refs)) < 0:
49
53
  cm.add_chunks(refs[0:max_capacity])
@@ -150,6 +150,7 @@ class RAG(EmbeddingUsage):
150
150
  result_per_query: int = 10,
151
151
  tei_endpoint: Optional[str] = None,
152
152
  reranker_threshold: float = 0.7,
153
+ filter_expr: str = "",
153
154
  ) -> List[D]:
154
155
  """Asynchronously fetches documents from a Milvus database based on input vectors.
155
156
 
@@ -162,6 +163,7 @@ class RAG(EmbeddingUsage):
162
163
  result_per_query (int): The maximum number of results to return per query. Defaults to 10.
163
164
  tei_endpoint (str): the endpoint of the TEI api.
164
165
  reranker_threshold (float): The threshold used to filtered low relativity document.
166
+ filter_expr (str): filter_expression parsed into pymilvus search.
165
167
 
166
168
  Returns:
167
169
  List[D]: A list of document objects created from the fetched data.
@@ -172,6 +174,7 @@ class RAG(EmbeddingUsage):
172
174
  await self.vectorize(query),
173
175
  search_params={"radius": similarity_threshold},
174
176
  output_fields=list(document_model.model_fields),
177
+ filter=filter_expr,
175
178
  limit=result_per_query,
176
179
  )
177
180
  if tei_endpoint is not None:
@@ -184,8 +187,11 @@ class RAG(EmbeddingUsage):
184
187
 
185
188
  for q, g in zip(query, search_results, strict=True):
186
189
  models = document_model.from_sequence([res["entity"] for res in g if res["id"] not in retrieved_id])
190
+ logger.debug(f"Retrived {len(g)} raw document, filtered out {len(models)}.")
187
191
  retrieved_id.update(res["id"] for res in g)
188
- rank_scores = await reranker.arerank(q, [m.prepare_vectorization() for m in models])
192
+ if not models:
193
+ continue
194
+ rank_scores = await reranker.arerank(q, [m.prepare_vectorization() for m in models], truncate=True)
189
195
  raw_result.extend(
190
196
  (models[s["index"]], s["score"]) for s in rank_scores if s["score"] > reranker_threshold
191
197
  )
@@ -60,3 +60,4 @@ if find_spec("pymilvus"):
60
60
  result_per_query: NotRequired[int]
61
61
  tei_endpoint: NotRequired[Optional[str]]
62
62
  reranker_threshold: NotRequired[float]
63
+ filter_expr: NotRequired[str]
@@ -1,6 +1,7 @@
1
1
  """A Module containing the article rag models."""
2
2
 
3
3
  import re
4
+ from itertools import groupby
4
5
  from pathlib import Path
5
6
  from typing import ClassVar, Dict, List, Optional, Self, Unpack
6
7
 
@@ -10,12 +11,13 @@ from fabricatio.models.extra.rag import MilvusDataBase
10
11
  from fabricatio.models.generic import AsPrompt
11
12
  from fabricatio.models.kwargs_types import ChunkKwargs
12
13
  from fabricatio.rust import BibManager, blake3_hash, split_into_chunks
13
- from fabricatio.utils import ok
14
+ from fabricatio.utils import ok, wrapp_in_block
15
+ from more_itertools.more import first
14
16
  from more_itertools.recipes import flatten, unique
15
17
  from pydantic import Field
16
18
 
17
19
 
18
- class ArticleChunk(MilvusDataBase, AsPrompt):
20
+ class ArticleChunk(MilvusDataBase):
19
21
  """The chunk of an article."""
20
22
 
21
23
  etc_word: ClassVar[str] = "等"
@@ -51,10 +53,9 @@ class ArticleChunk(MilvusDataBase, AsPrompt):
51
53
  bibtex_cite_key: str
52
54
  """The bibtex cite key of the article"""
53
55
 
54
- def _as_prompt_inner(self) -> Dict[str, str]:
55
- return {
56
- f"[[{ok(self._cite_number, 'You need to update cite number first.')}]] reference `{self.article_title}` from {self.as_auther_seq()}": self.chunk
57
- }
56
+ @property
57
+ def reference_header(self) -> str:
58
+ return f"[[{ok(self._cite_number, 'You need to update cite number first.')}]] reference `{self.article_title}` from {self.as_auther_seq()}"
58
59
 
59
60
  @property
60
61
  def cite_number(self) -> int:
@@ -204,13 +205,23 @@ class CitationManager(AsPrompt):
204
205
 
205
206
  def set_cite_number_all(self) -> Self:
206
207
  """Set citation numbers for all article chunks."""
207
- for i, a in enumerate(self.article_chunks, 1):
208
- a.update_cite_number(i)
208
+ number_mapping = {a.bibtex_cite_key: 0 for a in self.article_chunks}
209
+
210
+ for i, k in enumerate(number_mapping.keys()):
211
+ number_mapping[k] = i
212
+
213
+ for a in self.article_chunks:
214
+ a.update_cite_number(number_mapping[a.bibtex_cite_key])
209
215
  return self
210
216
 
211
217
  def _as_prompt_inner(self) -> Dict[str, str]:
212
218
  """Generate prompt inner representation."""
213
- return {"References": "\n".join(r.as_prompt() for r in self.article_chunks)}
219
+ seg = []
220
+ for k, g in groupby(self.article_chunks, key=lambda a: a.bibtex_cite_key):
221
+ g = list(g)
222
+ logger.debug(f"Group [{k}]: {len(g)}")
223
+ seg.append(wrapp_in_block("\n\n".join(a.chunk for a in g), first(g).reference_header))
224
+ return {"References": "\n".join(seg)}
214
225
 
215
226
  def apply(self, string: str) -> str:
216
227
  """Apply citation replacements to the input string."""
@@ -261,5 +272,9 @@ class CitationManager(AsPrompt):
261
272
 
262
273
  def unpack_cite_seq(self, citation_seq: List[int]) -> str:
263
274
  """Unpack citation sequence into a string."""
264
- chunk_seq = [a for a in self.article_chunks if a.cite_number in citation_seq]
265
- return "".join(a.as_typst_cite() for a in chunk_seq)
275
+ chunk_seq = {a.bibtex_cite_key: a for a in self.article_chunks if a.cite_number in citation_seq}
276
+ return "".join(a.as_typst_cite() for a in chunk_seq.values())
277
+
278
+ def as_milvus_filter_expr(self, blacklist: bool = True) -> str:
279
+ if blacklist:
280
+ return " and ".join(f'bibtex_cite_key != "{a.bibtex_cite_key}"' for a in self.article_chunks)
@@ -53,6 +53,7 @@ class Paragraph(SketchedAble, WordCount, Described):
53
53
 
54
54
  @property
55
55
  def exact_wordcount(self) -> int:
56
+ """Calculates the exact word count of the content."""
56
57
  return word_count(self.content)
57
58
 
58
59
 
@@ -19,6 +19,7 @@ class ArticleSubsectionOutline(SubSectionBase):
19
19
 
20
20
  class ArticleSectionOutline(SectionBase[ArticleSubsectionOutline]):
21
21
  """A slightly more detailed research component specification for academic paper generation, Must contain subsections."""
22
+
22
23
  @classmethod
23
24
  def from_typst_code(cls, title: str, body: str, **kwargs) -> Self:
24
25
  """Parse the given Typst code into an ArticleSectionOutline instance."""
@@ -32,7 +33,6 @@ class ArticleSectionOutline(SectionBase[ArticleSubsectionOutline]):
32
33
  )
33
34
 
34
35
 
35
-
36
36
  class ArticleChapterOutline(ChapterBase[ArticleSectionOutline]):
37
37
  """Macro-structural unit implementing standard academic paper organization. Must contain sections."""
38
38
 
@@ -46,11 +46,9 @@ class ArticleChapterOutline(ChapterBase[ArticleSectionOutline]):
46
46
  ArticleSectionOutline.from_typst_code(*pack)
47
47
  for pack in extract_sections(body, level=2, section_char="=")
48
48
  ],
49
-
50
49
  )
51
50
 
52
51
 
53
-
54
52
  class ArticleOutline(
55
53
  WithRef[ArticleProposal],
56
54
  PersistentAble,
Binary file
fabricatio/utils.py CHANGED
@@ -182,7 +182,7 @@ class RerankerAPI:
182
182
  response = requests.post(f"{self.base_url}/rerank", json=payload)
183
183
 
184
184
  # Handle non-200 status codes
185
- if response.ok:
185
+ if not response.ok:
186
186
  error_data = None
187
187
  if "application/json" in response.headers.get("Content-Type", ""):
188
188
  error_data = response.json()
@@ -239,7 +239,7 @@ class RerankerAPI:
239
239
  session.post(f"{self.base_url}/rerank", json=payload) as response,
240
240
  ):
241
241
  # Handle non-200 status codes
242
- if response.ok:
242
+ if not response.ok:
243
243
  if "application/json" in response.headers.get("Content-Type", ""):
244
244
  error_data = await response.json()
245
245
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fabricatio
3
- Version: 0.2.13.dev1
3
+ Version: 0.2.13.dev2
4
4
  Classifier: License :: OSI Approved :: MIT License
5
5
  Classifier: Programming Language :: Rust
6
6
  Classifier: Programming Language :: Python :: 3.12
@@ -1,21 +1,21 @@
1
- fabricatio-0.2.13.dev1.dist-info/METADATA,sha256=ENDDnuCUK0GlyVyXGfL3-_wBsswudphZ1HOhiD-EN7Y,5316
2
- fabricatio-0.2.13.dev1.dist-info/WHEEL,sha256=jABKVkLC9kJr8mi_er5jOqpiQUjARSLXDUIIxDqsS50,96
3
- fabricatio-0.2.13.dev1.dist-info/licenses/LICENSE,sha256=do7J7EiCGbq0QPbMAL_FqLYufXpHnCnXBOuqVPwSV8Y,1088
1
+ fabricatio-0.2.13.dev2.dist-info/METADATA,sha256=-Wa7FaGztQxqO0dcMsIB6FNH6w5r4jQi5URaPkevk60,5316
2
+ fabricatio-0.2.13.dev2.dist-info/WHEEL,sha256=jABKVkLC9kJr8mi_er5jOqpiQUjARSLXDUIIxDqsS50,96
3
+ fabricatio-0.2.13.dev2.dist-info/licenses/LICENSE,sha256=do7J7EiCGbq0QPbMAL_FqLYufXpHnCnXBOuqVPwSV8Y,1088
4
4
  fabricatio/actions/article.py,sha256=c9HfLM1p0kkdEcQrl8w6Qa5p8riPnkEO--QbNZj88HQ,12562
5
- fabricatio/actions/article_rag.py,sha256=sG8eW75tDuICbGxBlMFzt0mPPNWqbMrR_Sugfv6jpyo,19100
5
+ fabricatio/actions/article_rag.py,sha256=0J5aeTyHS30bDaQBnxxc8p16oB87hRK_fOgijShWJPA,17797
6
6
  fabricatio/actions/fs.py,sha256=gJR14U4ln35nt8Z7OWLVAZpqGaLnED-r1Yi-lX22tkI,959
7
7
  fabricatio/actions/output.py,sha256=lX0HkDse3ypCzZgeF-8Dr-EnNFdBiE-WQ1iLPFlGM1g,8302
8
8
  fabricatio/actions/rag.py,sha256=KN-OWgcQjGmNgSZ-s5B8m4LpYKSGFJR8eq72mo2CP9k,3592
9
9
  fabricatio/actions/rules.py,sha256=dkvCgNDjt2KSO1VgPRsxT4YBmIIMeetZb5tiz-slYkU,3640
10
10
  fabricatio/actions/__init__.py,sha256=wVENCFtpVb1rLFxoOFJt9-8smLWXuJV7IwA8P3EfFz4,48
11
11
  fabricatio/capabilities/advanced_judge.py,sha256=selB0Gwf1F4gGJlwBiRo6gI4KOUROgh3WnzO3mZFEls,706
12
- fabricatio/capabilities/advanced_rag.py,sha256=1LAAaCgVnZllNzLH3yW9MNwguUNPB7NMOJbD83VLdAo,2376
12
+ fabricatio/capabilities/advanced_rag.py,sha256=FaXHGOqS4VleGSLsnC5qm4S4EBcHZLZbj8TjXRieKBs,2513
13
13
  fabricatio/capabilities/censor.py,sha256=bBT5qy-kp7fh8g4Lz3labSwxwJ60gGd_vrkc6k1cZ1U,4719
14
14
  fabricatio/capabilities/check.py,sha256=kYqzohhv2bZfl1aKSUt7a8snT8YEl2zgha_ZdAdMMfQ,8622
15
15
  fabricatio/capabilities/correct.py,sha256=W_cInqlciNEhyMK0YI53jk4EvW9uAdge90IO9OElUmA,10420
16
16
  fabricatio/capabilities/extract.py,sha256=PMjkWvbsv57IYT7zzd_xbIu4eQqQjpcmBtJzqlWZhHY,2495
17
17
  fabricatio/capabilities/propose.py,sha256=hkBeSlmcTdfYWT-ph6nlbtHXBozi_JXqXlWcnBy3W78,2007
18
- fabricatio/capabilities/rag.py,sha256=q2h4v3aXIKXspt7Xh6jBIf-NqPhBi2ispfrkmJEj13E,10743
18
+ fabricatio/capabilities/rag.py,sha256=icJgFwEX4eOlZdtchDaITjFRBrAON6xezyFfPmzehI8,11058
19
19
  fabricatio/capabilities/rating.py,sha256=iMtQs3H6vCjuEjiuuz4SRKMVaX7yff7MHWz-slYvi5g,17835
20
20
  fabricatio/capabilities/review.py,sha256=-EMZe0ADFPT6fPGmra16UPjJC1M3rAs6dPFdTZ88Fgg,5060
21
21
  fabricatio/capabilities/task.py,sha256=uks1U-4LNCUdwdRxAbJJjMc31hOw6jlrcYriuQQfb04,4475
@@ -29,14 +29,14 @@ fabricatio/fs/readers.py,sha256=UXvcJO3UCsxHu9PPkg34Yh55Zi-miv61jD_wZQJgKRs,1751
29
29
  fabricatio/fs/__init__.py,sha256=FydmlEY_3QY74r1BpGDc5lFLhE6g6gkwOAtE30Fo-aI,786
30
30
  fabricatio/journal.py,sha256=stnEP88aUBA_GmU9gfTF2EZI8FS2OyMLGaMSTgK4QgA,476
31
31
  fabricatio/models/action.py,sha256=qxPeOD_nYNN94MzOhCzRDhySZFvM8uoZb_hhA7d_yn4,10609
32
- fabricatio/models/adv_kwargs_types.py,sha256=NfYEeY0WV3YVayqFTi54NC6WkGhLxCX4KNlsw_J2Nmk,2058
32
+ fabricatio/models/adv_kwargs_types.py,sha256=IBV3ZcsNLvvEjO_2hBpYg_wLSpNKaMx6Ndam3qXJCw8,2097
33
33
  fabricatio/models/events.py,sha256=wiirk_ASg3iXDOZU_gIimci1VZVzWE1nDmxy-hQVJ9M,4150
34
34
  fabricatio/models/extra/advanced_judge.py,sha256=INUl_41C8jkausDekkjnEmTwNfLCJ23TwFjq2cM23Cw,1092
35
- fabricatio/models/extra/aricle_rag.py,sha256=p91JI8FmFSrHVg5KbhJq4w8vQdx4VUW75SrtQUi9ju4,10987
35
+ fabricatio/models/extra/aricle_rag.py,sha256=6mkuxNZD_8cdWINmxP8ajmTwdwSH45jcdUSBmY6ZZfQ,11685
36
36
  fabricatio/models/extra/article_base.py,sha256=qBkRYAOdrtTnO02G0W1zDDtQWYrQIKot_XyyDaaCLp8,15697
37
37
  fabricatio/models/extra/article_essence.py,sha256=mlIkkRMR3I1RtqiiOnmIE3Vy623L4eECumkRzryE1pw,2749
38
- fabricatio/models/extra/article_main.py,sha256=0gvdodo0gpYSe9YjGhfXurT3oYzB5_xVqkT1oEDY9Z0,11148
39
- fabricatio/models/extra/article_outline.py,sha256=C9WNZNSz6gyuw9lDp29qidPvHBTENaeqcHfCoE_Y7F4,2793
38
+ fabricatio/models/extra/article_main.py,sha256=zUkFQRLv6cLoPBbo7H21rrRScjgGv_SzhFd0Y514FsA,11211
39
+ fabricatio/models/extra/article_outline.py,sha256=M4TSrhQ7zGaOcGN91Z-zrhm_IKr8GrPM6uOpK_0JfFI,2789
40
40
  fabricatio/models/extra/article_proposal.py,sha256=NbyjW-7UiFPtnVD9nte75re4xL2pD4qL29PpNV4Cg_M,1870
41
41
  fabricatio/models/extra/patches.py,sha256=_WNCxtYzzsVfUxI16vu4IqsLahLYRHdbQN9er9tqhC0,997
42
42
  fabricatio/models/extra/problem.py,sha256=8tTU-3giFHOi5j7NJsvH__JJyYcaGrcfsRnkzQNm0Ew,7216
@@ -56,12 +56,12 @@ fabricatio/rust_instances.py,sha256=Byeo8KHW_dJiXujJq7YPGDLBX5bHNDYbBc4sY3uubVY,
56
56
  fabricatio/toolboxes/arithmetic.py,sha256=WLqhY-Pikv11Y_0SGajwZx3WhsLNpHKf9drzAqOf_nY,1369
57
57
  fabricatio/toolboxes/fs.py,sha256=l4L1CVxJmjw9Ld2XUpIlWfV0_Fu_2Og6d3E13I-S4aE,736
58
58
  fabricatio/toolboxes/__init__.py,sha256=KBJi5OG_pExscdlM7Bnt_UF43j4I3Lv6G71kPVu4KQU,395
59
- fabricatio/utils.py,sha256=oJ_PPhyRDPTnnmakIpBPXBm_y2PXHFcRVekFWxR_I8A,10291
59
+ fabricatio/utils.py,sha256=IBKfs2Rg3bJnazzvj1-Fz1rMWNKhiuQG5_rZ1nxQeMI,10299
60
60
  fabricatio/workflows/articles.py,sha256=ObYTFUqLUk_CzdmmnX6S7APfxcGmPFqnFr9pdjU7Z4Y,969
61
61
  fabricatio/workflows/rag.py,sha256=-YYp2tlE9Vtfgpg6ROpu6QVO8j8yVSPa6yDzlN3qVxs,520
62
62
  fabricatio/workflows/__init__.py,sha256=5ScFSTA-bvhCesj3U9Mnmi6Law6N1fmh5UKyh58L3u8,51
63
63
  fabricatio/__init__.py,sha256=Rmvq2VgdS2u68vnOi2i5RbeWbAwrJDbk8D8D883PJWE,1022
64
- fabricatio/rust.cp312-win_amd64.pyd,sha256=jOC7VoxFTr8NSJyAR95446yUyqny3Bp6F2GlWxoxTYc,4449792
65
- fabricatio-0.2.13.dev1.data/scripts/tdown.exe,sha256=3bjfVSSSH6XXabKxMmS0tQLzoOnVQGTbDIZDnpJuEww,3353088
66
- fabricatio-0.2.13.dev1.data/scripts/ttm.exe,sha256=urASVLhELNfz0_gPdPU_LL-L9UCSRnluYOuJrmPwwt4,2556416
67
- fabricatio-0.2.13.dev1.dist-info/RECORD,,
64
+ fabricatio/rust.cp312-win_amd64.pyd,sha256=wOu3NK1TiWnQPmJd_p7QJgVnP91_xrD4AkIzBFbUBhY,4449280
65
+ fabricatio-0.2.13.dev2.data/scripts/tdown.exe,sha256=e7KGiGIaLTHej3keQvWbFbjQGLGstQWBuQkQp3w0uhM,3359232
66
+ fabricatio-0.2.13.dev2.data/scripts/ttm.exe,sha256=OMXhJIJdSO8HuoWtClyLtllDQ2M_06FzeC2nXi7ryMM,2554880
67
+ fabricatio-0.2.13.dev2.dist-info/RECORD,,