janus-llm 3.4.2__py3-none-any.whl → 3.4.3__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
janus/__init__.py CHANGED
@@ -5,7 +5,7 @@ from langchain_core._api.deprecation import LangChainDeprecationWarning
5
5
  from janus.converter.translate import Translator
6
6
  from janus.metrics import * # noqa: F403
7
7
 
8
- __version__ = "3.4.2"
8
+ __version__ = "3.4.3"
9
9
 
10
10
  # Ignoring a deprecation warning from langchain_core that I can't seem to hunt down
11
11
  warnings.filterwarnings("ignore", category=LangChainDeprecationWarning)
@@ -7,7 +7,6 @@ from typing import Any, List, Optional, Tuple
7
7
  from langchain.output_parsers import RetryWithErrorOutputParser
8
8
  from langchain_core.exceptions import OutputParserException
9
9
  from langchain_core.language_models import BaseLanguageModel
10
- from langchain_core.output_parsers import BaseOutputParser
11
10
  from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate
12
11
  from langchain_core.runnables import RunnableLambda, RunnableParallel
13
12
  from openai import BadRequestError, RateLimitError
@@ -26,7 +25,7 @@ from janus.language.splitter import (
26
25
  from janus.llm import load_model
27
26
  from janus.llm.model_callbacks import get_model_callback
28
27
  from janus.llm.models_info import MODEL_PROMPT_ENGINES
29
- from janus.parsers.code_parser import GenericParser
28
+ from janus.parsers.parser import GenericParser, JanusParser
30
29
  from janus.parsers.refiner_parser import RefinerParser
31
30
  from janus.refiners.refiner import BasicRefiner, Refiner
32
31
  from janus.utils.enums import LANGUAGES
@@ -129,7 +128,7 @@ class Converter:
129
128
  self._llm: BaseLanguageModel
130
129
  self._prompt: ChatPromptTemplate
131
130
 
132
- self._parser: BaseOutputParser = GenericParser()
131
+ self._parser: JanusParser = GenericParser()
133
132
  self._combiner: Combiner = Combiner()
134
133
 
135
134
  self._refiner_type: str
@@ -328,6 +327,7 @@ class Converter:
328
327
  "_prompt_template_name",
329
328
  "_source_language",
330
329
  "_model_name",
330
+ "_parser",
331
331
  )
332
332
  def _load_prompt(self) -> None:
333
333
  """Load the prompt according to this instance's attributes.
@@ -340,6 +340,9 @@ class Converter:
340
340
  prompt_template=self._prompt_template_name,
341
341
  )
342
342
  self._prompt = prompt_engine.prompt
343
+ self._prompt = self._prompt.partial(
344
+ format_instructions=self._parser.get_format_instructions()
345
+ )
343
346
 
344
347
  @run_if_changed("_db_path", "_db_config")
345
348
  def _load_vectorizer(self) -> None:
@@ -445,6 +448,15 @@ class Converter:
445
448
  except FileSizeError:
446
449
  log.warning("Current tile is too large for basic splitter, skipping")
447
450
  continue
451
+ except ValueError as e:
452
+ if str(e).startswith(
453
+ "Error raised by bedrock service"
454
+ ) and "maximum context length" in str(e):
455
+ log.warning(
456
+ "Input is too large for this model's context length, skipping"
457
+ )
458
+ continue
459
+ raise e
448
460
 
449
461
  # Don't attempt to write files for which translation failed
450
462
  if not out_block.translated:
@@ -599,7 +611,7 @@ class Converter:
599
611
  to the cube root of self.max_retries, so the total calls to the
600
612
  LLM will be roughly as expected (up to sqrt(self.max_retries) over)
601
613
  """
602
- self._parser.set_reference(block.original)
614
+ input = self._parser.parse_input(block.original)
603
615
 
604
616
  # Retries with just the output and the error
605
617
  n1 = round(self.max_prompts ** (1 / 2))
@@ -607,15 +619,12 @@ class Converter:
607
619
  # Retries with the input, output, and error
608
620
  n2 = round(self.max_prompts // n1)
609
621
 
610
- # Retries with just the input
611
622
  if not self.skip_context:
612
623
  self._make_prompt_additions(block)
613
624
  if not self.skip_refiner: # Make replacements in the prompt
614
625
  refine_output = RefinerParser(
615
626
  parser=self._parser,
616
- initial_prompt=self._prompt.format(
617
- **{"SOURCE_CODE": block.original.text}
618
- ),
627
+ initial_prompt=self._prompt.format(**{"SOURCE_CODE": input}),
619
628
  refiner=self._refiner,
620
629
  max_retries=n1,
621
630
  llm=self._llm,
@@ -626,13 +635,14 @@ class Converter:
626
635
  parser=self._parser,
627
636
  max_retries=n1,
628
637
  )
638
+
629
639
  completion_chain = self._prompt | self._llm
630
640
  chain = RunnableParallel(
631
641
  completion=completion_chain, prompt_value=self._prompt
632
642
  ) | RunnableLambda(lambda x: refine_output.parse_with_prompt(**x))
633
643
  for _ in range(n2):
634
644
  try:
635
- return chain.invoke({"SOURCE_CODE": block.original.text})
645
+ return chain.invoke({"SOURCE_CODE": input})
636
646
  except OutputParserException:
637
647
  pass
638
648
 
@@ -52,7 +52,7 @@ class DiagramGenerator(Documenter):
52
52
  self._load_diagram_prompt_engine()
53
53
 
54
54
  def _run_chain(self, block: TranslatedCodeBlock) -> str:
55
- self._parser.set_reference(block.original)
55
+ input = self._parser.parse_input(block.original)
56
56
  n1 = round(self.max_prompts ** (1 / 3))
57
57
 
58
58
  # Retries with the input, output, and error
@@ -67,7 +67,7 @@ class DiagramGenerator(Documenter):
67
67
  parser=self._diagram_parser,
68
68
  initial_prompt=self._diagram_prompt.format(
69
69
  **{
70
- "SOURCE_CODE": block.original.text,
70
+ "SOURCE_CODE": input,
71
71
  "DOCUMENTATION": documentation_text,
72
72
  "DIAGRAM_TYPE": self._diagram_type,
73
73
  }
@@ -81,7 +81,7 @@ class DiagramGenerator(Documenter):
81
81
  parser=self._diagram_parser,
82
82
  initial_prompt=self._diagram_prompt.format(
83
83
  **{
84
- "SOURCE_CODE": block.original.text,
84
+ "SOURCE_CODE": input,
85
85
  "DIAGRAM_TYPE": self._diagram_type,
86
86
  }
87
87
  ),
@@ -103,7 +103,7 @@ class DiagramGenerator(Documenter):
103
103
  if self._add_documentation:
104
104
  return chain.invoke(
105
105
  {
106
- "SOURCE_CODE": block.original.text,
106
+ "SOURCE_CODE": input,
107
107
  "DOCUMENTATION": documentation_text,
108
108
  "DIAGRAM_TYPE": self._diagram_type,
109
109
  }
@@ -111,7 +111,7 @@ class DiagramGenerator(Documenter):
111
111
  else:
112
112
  return chain.invoke(
113
113
  {
114
- "SOURCE_CODE": block.original.text,
114
+ "SOURCE_CODE": input,
115
115
  "DIAGRAM_TYPE": self._diagram_type,
116
116
  }
117
117
  )
janus/llm/models_info.py CHANGED
@@ -210,7 +210,9 @@ def get_available_model_names() -> list[str]:
210
210
  return avaialable_models
211
211
 
212
212
 
213
- def load_model(user_model_name: str) -> tuple[BaseLanguageModel, int, dict[str, float]]:
213
+ def load_model(
214
+ user_model_name: str,
215
+ ) -> tuple[BaseLanguageModel, str, int, dict[str, float]]:
214
216
  if not MODEL_CONFIG_DIR.exists():
215
217
  MODEL_CONFIG_DIR.mkdir(parents=True)
216
218
  model_config_file = MODEL_CONFIG_DIR / f"{user_model_name}.json"
@@ -1,11 +1,12 @@
1
1
  import unittest
2
2
 
3
- from janus.parsers.code_parser import CodeParser, JanusParser
3
+ from janus.parsers.code_parser import CodeParser
4
+ from janus.parsers.parser import GenericParser
4
5
 
5
6
 
6
7
  class TestJanusParser(unittest.TestCase):
7
8
  def setUp(self):
8
- self.parser = JanusParser()
9
+ self.parser = GenericParser()
9
10
 
10
11
  def test_parse_combined_output(self):
11
12
  text = "test text"
@@ -1,52 +1,20 @@
1
1
  import re
2
2
 
3
- from langchain.schema.output_parser import BaseOutputParser
4
3
  from langchain_core.exceptions import OutputParserException
5
4
  from langchain_core.messages import BaseMessage
6
- from langchain_core.output_parsers import StrOutputParser
7
5
 
8
- from janus.language.block import CodeBlock
6
+ from janus.parsers.parser import JanusParser
9
7
  from janus.utils.logger import create_logger
10
8
 
11
9
  log = create_logger(__name__)
12
10
 
13
11
 
14
- class JanusParser:
15
- def parse_combined_output(self, text: str) -> str:
16
- """Parse the output text from the LLM when multiple inputs are combined
17
-
18
- Arguments:
19
- text: The output text from the LLM
20
-
21
- Returns:
22
- A parsed version of the text
23
- """
24
- if isinstance(text, BaseMessage):
25
- text = text.content
26
- return text
27
-
28
- def parse_into_block(self, text: str, block: CodeBlock):
29
- if isinstance(text, BaseMessage):
30
- text = text.content
31
- block.text = text
32
-
33
- def set_reference(self, block: CodeBlock):
34
- pass
35
-
36
-
37
- class GenericParser(StrOutputParser, JanusParser):
38
- def parse(self, text: str) -> str:
39
- if isinstance(text, BaseMessage):
40
- return text.content
41
- return text
42
-
43
-
44
- class CodeParser(BaseOutputParser[str], JanusParser):
12
+ class CodeParser(JanusParser):
45
13
  language: str
46
14
 
47
- def parse(self, text: str) -> str:
15
+ def parse(self, text: str | BaseMessage) -> str:
48
16
  if isinstance(text, BaseMessage):
49
- text = text.content
17
+ text = str(text.content)
50
18
  pattern = rf"```[^\S\r\n]*(?:{self.language}[^\S\r\n]*)?\n?(.*?)\n*```"
51
19
  code = re.search(pattern, text, re.DOTALL)
52
20
  if code is None:
@@ -3,13 +3,12 @@ import re
3
3
 
4
4
  from langchain.output_parsers import PydanticOutputParser
5
5
  from langchain.output_parsers.json import parse_json_markdown
6
- from langchain.schema.output_parser import BaseOutputParser
7
6
  from langchain_core.exceptions import OutputParserException
8
- from langchain_core.messages import AIMessage
7
+ from langchain_core.messages import BaseMessage
9
8
  from langchain_core.pydantic_v1 import BaseModel, Field
10
9
 
11
10
  from janus.language.block import CodeBlock
12
- from janus.parsers.code_parser import JanusParser
11
+ from janus.parsers.parser import JanusParser
13
12
  from janus.utils.logger import create_logger
14
13
 
15
14
  log = create_logger(__name__)
@@ -32,18 +31,21 @@ class MultiDoc(BaseModel):
32
31
  )
33
32
 
34
33
 
35
- class MultiDocumentationParser(PydanticOutputParser, JanusParser):
34
+ class MultiDocumentationParser(JanusParser, PydanticOutputParser):
36
35
  block_name: str = ""
37
36
 
38
37
  def __init__(self):
39
38
  PydanticOutputParser.__init__(self, pydantic_object=MultiDoc)
40
39
 
41
- def set_reference(self, block: CodeBlock):
42
- self.block_name = block.name
40
+ def parse_input(self, block: CodeBlock) -> str:
41
+ text = super().parse_input(block)
42
+ self.block_name = str(block.name)
43
+ return text
44
+
45
+ def parse(self, text: str | BaseMessage) -> str:
46
+ if isinstance(text, BaseMessage):
47
+ text = str(text.content)
43
48
 
44
- def parse(self, text: str) -> str:
45
- if isinstance(text, AIMessage):
46
- text = text.content
47
49
  try:
48
50
  docs = json.loads(super().parse(text).json())
49
51
  except (OutputParserException, json.JSONDecodeError):
@@ -81,22 +83,25 @@ class MultiDocumentationParser(PydanticOutputParser, JanusParser):
81
83
 
82
84
  @property
83
85
  def _type(self) -> str:
84
- return self.__class__.name
86
+ return str(self.__class__.name)
85
87
 
86
88
 
87
- class MadlibsDocumentationParser(BaseOutputParser[str], JanusParser):
89
+ class MadlibsDocumentationParser(JanusParser):
88
90
  expected_keys: set[str]
89
91
 
90
92
  def __init__(self):
91
93
  super().__init__(expected_keys=[])
92
94
 
93
- def set_reference(self, block: CodeBlock):
94
- comment_ids = re.findall(r"<(?:BLOCK|INLINE)_COMMENT (\w{8})>", block.text)
95
+ def parse_input(self, block: CodeBlock):
96
+ # TODO: Perform comment stripping/placeholding here rather than in script
97
+ text = super().parse_input(block)
98
+ comment_ids = re.findall(r"<(?:BLOCK|INLINE)_COMMENT (\w{8})>", text)
95
99
  self.expected_keys = set(comment_ids)
96
100
 
97
- def parse(self, text: str) -> str:
98
- if isinstance(text, AIMessage):
99
- text = text.content
101
+ def parse(self, text: str | BaseMessage) -> str:
102
+ if isinstance(text, BaseMessage):
103
+ text = str(text.content)
104
+
100
105
  try:
101
106
  obj = parse_json_markdown(text)
102
107
  except json.JSONDecodeError as e:
@@ -166,4 +171,4 @@ class MadlibsDocumentationParser(BaseOutputParser[str], JanusParser):
166
171
 
167
172
  @property
168
173
  def _type(self) -> str:
169
- return self.__class__.name
174
+ return str(self.__class__.name)
@@ -1,9 +1,10 @@
1
1
  import json
2
2
 
3
3
  from langchain.output_parsers import PydanticOutputParser
4
+ from langchain_core.messages import BaseMessage
4
5
  from langchain_core.pydantic_v1 import BaseModel, Field, validator
5
6
 
6
- from janus.parsers.code_parser import JanusParser
7
+ from janus.parsers.parser import JanusParser
7
8
  from janus.utils.logger import create_logger
8
9
 
9
10
  log = create_logger(__name__)
@@ -28,7 +29,7 @@ class Eval(BaseModel):
28
29
 
29
30
  return v
30
31
 
31
- def __add__(self, other):
32
+ def __add__(self, other: "Eval"):
32
33
  if isinstance(other, int) and other == 0:
33
34
  return self.copy()
34
35
  return Eval.construct(
@@ -38,10 +39,10 @@ class Eval(BaseModel):
38
39
  completeness=self.completeness + other.completeness,
39
40
  )
40
41
 
41
- def __radd__(self, other):
42
+ def __radd__(self, other) -> "Eval":
42
43
  return self.__add__(other)
43
44
 
44
- def __truediv__(self, other):
45
+ def __truediv__(self, other) -> "Eval":
45
46
  if isinstance(other, int):
46
47
  return Eval.construct(
47
48
  syntax=self.syntax / other,
@@ -57,11 +58,13 @@ class Eval(BaseModel):
57
58
  )
58
59
 
59
60
 
60
- class EvaluationParser(PydanticOutputParser, JanusParser):
61
+ class EvaluationParser(JanusParser, PydanticOutputParser):
61
62
  def __init__(self):
62
63
  PydanticOutputParser.__init__(self, pydantic_object=Eval)
63
64
 
64
- def parse(self, text: str) -> str:
65
+ def parse(self, text: str | BaseMessage) -> str:
66
+ if isinstance(text, BaseMessage):
67
+ text = str(text.content)
65
68
  eval = super().parse(text)
66
69
  return json.dumps(eval.json())
67
70
 
@@ -75,6 +78,6 @@ class EvaluationParser(PydanticOutputParser, JanusParser):
75
78
  Returns:
76
79
  A parsed version of the text.
77
80
  """
78
- objs = [super().parse(line.strip()) for line in text.split("\n")]
79
- avg_obj = sum(objs) / len(objs)
81
+ objs: list[Eval] = [super().parse(line.strip()) for line in text.split("\n")]
82
+ avg_obj: Eval = sum(objs) / len(objs)
80
83
  return json.dumps(avg_obj.json())
@@ -0,0 +1,51 @@
1
+ from langchain.schema.output_parser import BaseOutputParser
2
+ from langchain_core.messages import BaseMessage
3
+ from langchain_core.output_parsers import StrOutputParser
4
+
5
+ from janus.language.block import CodeBlock
6
+ from janus.language.splitter import EmptyTreeError
7
+ from janus.utils.logger import create_logger
8
+
9
+ log = create_logger(__name__)
10
+
11
+
12
+ class JanusParser(BaseOutputParser[str]):
13
+ def parse_input(self, block: CodeBlock) -> str:
14
+ """Parse the input block into raw string input ready to be passed to
15
+ an LLM. Also perform any processing or saving of metadata.
16
+
17
+ Arguments:
18
+ block: The CodeBlock to be processed
19
+
20
+ Returns:
21
+ A parsed version of the input text
22
+ """
23
+ if block.text is None:
24
+ raise EmptyTreeError("No text in input CodeBlock!")
25
+ return block.text
26
+
27
+ def parse_combined_output(self, text: str) -> str:
28
+ """Parse the output text from the LLM when multiple inputs are combined
29
+
30
+ Arguments:
31
+ text: The output text from the LLM
32
+
33
+ Returns:
34
+ A parsed version of the text
35
+ """
36
+ return text
37
+
38
+ def parse_into_block(self, text: str | BaseMessage, block: CodeBlock):
39
+ if isinstance(text, BaseMessage):
40
+ text = str(text.content)
41
+ block.text = text
42
+
43
+
44
+ class GenericParser(JanusParser, StrOutputParser):
45
+ def parse(self, text: str | BaseMessage) -> str:
46
+ if isinstance(text, BaseMessage):
47
+ text = str(text.content)
48
+ return text
49
+
50
+ def get_format_instructions(self) -> str:
51
+ return "Output should be a string"
@@ -1,11 +1,13 @@
1
1
  from langchain_core.exceptions import OutputParserException
2
2
  from langchain_core.language_models import BaseLanguageModel
3
+ from langchain_core.messages import BaseMessage
3
4
  from langchain_core.output_parsers import BaseOutputParser
4
5
 
6
+ from janus.parsers.parser import JanusParser
5
7
  from janus.refiners.refiner import Refiner
6
8
 
7
9
 
8
- class RefinerParser(BaseOutputParser):
10
+ class RefinerParser(JanusParser):
9
11
  """Parser for performing refinement with a refiner
10
12
 
11
13
  Properties:
@@ -25,15 +27,7 @@ class RefinerParser(BaseOutputParser):
25
27
  refiner: Refiner
26
28
  max_retries: int
27
29
 
28
- def parse(self, text: str) -> str:
29
- """Parses the text using the refiner
30
-
31
- Arguments:
32
- text: text to parse
33
-
34
- Returns:
35
- Parsed text
36
- """
30
+ def parse(self, text: str | BaseMessage) -> str:
37
31
  last_prompt = self.initial_prompt
38
32
  for _ in range(self.max_retries):
39
33
  try:
@@ -46,6 +40,7 @@ class RefinerParser(BaseOutputParser):
46
40
  new_chain = new_prompt | self.llm
47
41
  text = new_chain.invoke(prompt_arguments)
48
42
  last_prompt = new_prompt.format(**prompt_arguments)
43
+
49
44
  raise OutputParserException(
50
45
  f"Error: unable to correct output after {self.max_retries} attempts"
51
46
  )
@@ -2,29 +2,28 @@ import json
2
2
  import re
3
3
 
4
4
  from langchain.output_parsers.json import parse_json_markdown
5
- from langchain.schema.output_parser import BaseOutputParser
6
5
  from langchain_core.exceptions import OutputParserException
7
- from langchain_core.messages import AIMessage
6
+ from langchain_core.messages import BaseMessage
8
7
 
9
- from janus.language.block import CodeBlock
10
- from janus.parsers.code_parser import JanusParser
8
+ from janus.parsers.parser import JanusParser
11
9
  from janus.utils.logger import create_logger
12
10
 
13
11
  log = create_logger(__name__)
14
12
 
15
13
 
16
- class RequirementsParser(BaseOutputParser[str], JanusParser):
17
- block_name: str = ""
14
+ class RequirementsParser(JanusParser):
15
+ expected_keys: set[str]
18
16
 
19
17
  def __init__(self):
20
18
  super().__init__(expected_keys=[])
21
19
 
22
- def set_reference(self, block: CodeBlock):
23
- self.block_name = block.name
20
+ def parse(self, text: str | BaseMessage) -> str:
21
+ if isinstance(text, BaseMessage):
22
+ text = str(text.content)
24
23
 
25
- def parse(self, text: str) -> str:
26
- if isinstance(text, AIMessage):
27
- text = text.content
24
+ # TODO: This is an incorrect implementation (lstrip and rstrip take character
25
+ # lists and strip any instances of those characters, not the full str)
26
+ # Should be replaced with a regex search, see CodeParser
28
27
  text = text.lstrip("```json")
29
28
  text = text.rstrip("```")
30
29
  try:
@@ -70,4 +69,4 @@ class RequirementsParser(BaseOutputParser[str], JanusParser):
70
69
 
71
70
  @property
72
71
  def _type(self) -> str:
73
- return self.__class__.name
72
+ return str(self.__class__.name)
janus/parsers/uml.py CHANGED
@@ -4,6 +4,7 @@ from pathlib import Path
4
4
  from typing import List, Tuple
5
5
 
6
6
  from langchain_core.exceptions import OutputParserException
7
+ from langchain_core.messages import BaseMessage
7
8
 
8
9
  from janus.parsers.code_parser import CodeParser
9
10
  from janus.utils.logger import create_logger
@@ -12,7 +13,7 @@ log = create_logger(__name__)
12
13
 
13
14
 
14
15
  class UMLSyntaxParser(CodeParser):
15
- def _get_uml_output(self, file: str) -> Tuple[str, str]:
16
+ def _get_uml_output(self, file: Path) -> Tuple[str, str]:
16
17
  # NOTE: running subprocess with shell=False, added nosec to label that we know
17
18
  # risk exists
18
19
  try:
@@ -33,7 +34,7 @@ class UMLSyntaxParser(CodeParser):
33
34
  def _get_errs(self, s: str) -> List[str]:
34
35
  return [x.group() for x in re.finditer(r"Error (.*)\n", s)]
35
36
 
36
- def parse(self, text: str) -> str:
37
+ def parse(self, text: str | BaseMessage) -> str:
37
38
  text = super().parse(text)
38
39
  janus_path = Path.home().expanduser() / Path(".janus")
39
40
  if not janus_path.exists():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: janus-llm
3
- Version: 3.4.2
3
+ Version: 3.4.3
4
4
  Summary: A transcoding library using LLMs.
5
5
  Home-page: https://github.com/janus-llm/janus-llm
6
6
  License: Apache 2.0
@@ -1,4 +1,4 @@
1
- janus/__init__.py,sha256=Vffzze6t42HK7UXCraaw1-fyYrzsT9Gh1EMdHFP54Vs,361
1
+ janus/__init__.py,sha256=HX3kYLkqXTi8C9sXb0P1mGki4DMJJzxHSQSxoilv7sA,361
2
2
  janus/__main__.py,sha256=lEkpNtLVPtFo8ySDZeXJ_NXDHb0GVdZFPWB4gD4RPS8,64
3
3
  janus/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  janus/_tests/conftest.py,sha256=V7uW-oq3YbFiRPvrq15YoVVrA1n_83pjgiyTZ-IUGW8,963
@@ -7,8 +7,8 @@ janus/cli.py,sha256=_92FvDV4qza0nSmyiXqacYxyo1gY6IPwD4gCm6kZfqI,33213
7
7
  janus/converter/__init__.py,sha256=U2EOMcCykiC0ZqhorNefOP_04hOF18qhYoPKrVp1Vrk,345
8
8
  janus/converter/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  janus/converter/_tests/test_translate.py,sha256=yzcFEGc_z8QmBBBmC9dZnfL9tT8CD1rkpc8Hz44Jp4c,5631
10
- janus/converter/converter.py,sha256=BoxzLUZtTXVI5eSrzmC_COMczTrMTm_rG03u6MHtjsI,27583
11
- janus/converter/diagram.py,sha256=5mo1H3Y1uIBPYdIsWz9kxluN5DNyuUMZrtcJmGF2Uw0,5335
10
+ janus/converter/converter.py,sha256=GL4moCOi5vvvsEjAf_7Vrn5GHq12nptH47AAP4soeQc,27956
11
+ janus/converter/diagram.py,sha256=AyxkoyfMoQ7jpuOqyJ3bIvYqHJSEhmR-gYrIsq-d8tk,5285
12
12
  janus/converter/document.py,sha256=hsW512veNjFWbdl5WriuUdNmMEqZy8ktRvqn9rRmA6E,4566
13
13
  janus/converter/evaluate.py,sha256=APWQUY3gjAXqkJkPzvj0UA4wPK3Cv9QSJLM-YK9t-ng,476
14
14
  janus/converter/requirements.py,sha256=9tvQ40FZJtG8niIFn45gPQCgKKHVPPoFLinBv6RAqO4,2027
@@ -57,7 +57,7 @@ janus/language/treesitter/_tests/test_treesitter.py,sha256=4S_UdH6AfJ0j6hyInZ2CF
57
57
  janus/language/treesitter/treesitter.py,sha256=FU86H8j2cfRLtwyNeEnf9A6gzZEvDwmnFCIrQymUJso,7541
58
58
  janus/llm/__init__.py,sha256=TKLYvnsWKWfxMucy-lCLQ-4bkN9ENotJZDywDEQmrKg,45
59
59
  janus/llm/model_callbacks.py,sha256=K7P5NY-rf7IYRAFHnZ3kzhrQWE6g_najx8uxlaSiz3E,7110
60
- janus/llm/models_info.py,sha256=FHyv9PKXAUxYCgO06bw4qzoniFsqYN21uD450BdpvyA,8358
60
+ janus/llm/models_info.py,sha256=26lY_w-LTiPvSFRlKdpqEQjVnsmd7ns7XBUl0wuxe00,8370
61
61
  janus/metrics/__init__.py,sha256=AsxtZJUzZiXJPr2ehPPltuYP-ddechjg6X85WZUO7mA,241
62
62
  janus/metrics/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
63
  janus/metrics/_tests/reference.py,sha256=hiaJPP9CXkvFBV_wL-gOe_BzELTw0nvB6uCxhxtIiE8,13
@@ -83,13 +83,14 @@ janus/metrics/similarity.py,sha256=NKd-m8hMB27i1_1CQkG5o7HrAK2wTr89B21Y36kqHiE,1
83
83
  janus/metrics/splitting.py,sha256=610ScHRvALwdkqA6YyGI-tr3a18_cUofldBxGYX0SwE,968
84
84
  janus/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
85
  janus/parsers/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
- janus/parsers/_tests/test_code_parser.py,sha256=RVgMmLvg8_57g0uJphfX-jZZsyBqOSuG9gZz0PXGI2s,892
87
- janus/parsers/code_parser.py,sha256=SZBsYThG4iszKlu4fHoWrs-6cbJiUFjWv4cLSr5bzDM,1790
88
- janus/parsers/doc_parser.py,sha256=bJiOE5M7npUZur_1MWJ14C2HZl7-yXExqRXiC5ZBJvI,5679
89
- janus/parsers/eval_parser.py,sha256=L1Lu2aNimcqUshe0FQee_9Zqj1rrqyZPXCgEAS05VJ4,2740
90
- janus/parsers/refiner_parser.py,sha256=5zGoPZyttfRw3kXYDKHId2nhVvAcv1QsvpDFRpe-Few,1680
91
- janus/parsers/reqs_parser.py,sha256=6YzpF63rjuDPqpKWfYvtjpsluWQ-UboWlsKoGrGQogA,2380
92
- janus/parsers/uml.py,sha256=ZRyGY8YxvYibacTd-WZEAAaW3XjmvJhPJE3o29f71t8,1825
86
+ janus/parsers/_tests/test_code_parser.py,sha256=3ay5QpUPcynX_EJ-YLl3PR28poutUkT7qvyWUSQ7Too,928
87
+ janus/parsers/code_parser.py,sha256=3l0HfzgrvJuiwk779s9ZsgUl3xbp1nE1qZxh8aDYRBI,873
88
+ janus/parsers/doc_parser.py,sha256=G7kDdJ3davHhEFXqwNYw7hOB26hKH_d_0XdpyyBHq_U,5835
89
+ janus/parsers/eval_parser.py,sha256=Gjh6aTZgpYd2ASJUEPMo4LpCL00cBmbOqc4KM3hy8x8,2922
90
+ janus/parsers/parser.py,sha256=y6VV64bgVidf-oEFla3I--_28tnJsPBc6QUD_SkbfSE,1614
91
+ janus/parsers/refiner_parser.py,sha256=W7ecDX7j6N-uWtRBYFD1EiEzDpDQws16nrVFzyArzf8,1632
92
+ janus/parsers/reqs_parser.py,sha256=uRQC41Iqp22GjIvakb5UKv70UWHkcOTbOVl_RDnipYw,2438
93
+ janus/parsers/uml.py,sha256=T9MzYbXz_gjlfgJlIMGSzgACcXLhoN3RnV9Y-5vYJ9A,1888
93
94
  janus/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
95
  janus/prompts/prompt.py,sha256=3796YXIzzIec9b0iUzd8VZlq-AdQbzq8qUGXLy4KH-0,10586
95
96
  janus/refiners/refiner.py,sha256=GkV4oUSCrLAhyDJY2aY_Jt8PRF3sC6-bv58YbL2PaNk,2227
@@ -100,8 +101,8 @@ janus/utils/_tests/test_progress.py,sha256=Rs_u5PiGjP-L-o6C1fhwfE1ig8jYu9Xo9s4p8
100
101
  janus/utils/enums.py,sha256=AoilbdiYyMvY2Mp0AM4xlbLSELfut2XMwhIM1S_msP4,27610
101
102
  janus/utils/logger.py,sha256=KZeuaMAnlSZCsj4yL0P6N-JzZwpxXygzACWfdZFeuek,2337
102
103
  janus/utils/progress.py,sha256=PIpcQec7SrhsfqB25LHj2CDDkfm9umZx90d9LZnAx6k,1469
103
- janus_llm-3.4.2.dist-info/LICENSE,sha256=_j0st0a-HB6MRbP3_BW3PUqpS16v54luyy-1zVyl8NU,10789
104
- janus_llm-3.4.2.dist-info/METADATA,sha256=lZQB-U_8-3qabtphDu0EfxZmsPwHEz7IUwAwSKYmVkI,4184
105
- janus_llm-3.4.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
106
- janus_llm-3.4.2.dist-info/entry_points.txt,sha256=OGhQwzj6pvXp79B0SaBD5apGekCu7Dwe9fZZT_TZ544,39
107
- janus_llm-3.4.2.dist-info/RECORD,,
104
+ janus_llm-3.4.3.dist-info/LICENSE,sha256=_j0st0a-HB6MRbP3_BW3PUqpS16v54luyy-1zVyl8NU,10789
105
+ janus_llm-3.4.3.dist-info/METADATA,sha256=rFGRSJIXyld0d04oeG6s7iC9HfQlyuN6I7b1UaCXXWo,4184
106
+ janus_llm-3.4.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
107
+ janus_llm-3.4.3.dist-info/entry_points.txt,sha256=OGhQwzj6pvXp79B0SaBD5apGekCu7Dwe9fZZT_TZ544,39
108
+ janus_llm-3.4.3.dist-info/RECORD,,