janus-llm 2.0.1__py3-none-any.whl → 2.1.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. janus/__init__.py +1 -1
  2. janus/cli.py +1 -2
  3. janus/converter.py +3 -0
  4. janus/embedding/_tests/test_collections.py +2 -2
  5. janus/language/_tests/test_splitter.py +1 -1
  6. janus/language/alc/__init__.py +1 -0
  7. janus/language/alc/_tests/__init__.py +0 -0
  8. janus/language/alc/_tests/test_alc.py +28 -0
  9. janus/language/alc/alc.py +87 -0
  10. janus/language/block.py +3 -1
  11. janus/language/mumps/mumps.py +2 -3
  12. janus/language/naive/__init__.py +1 -1
  13. janus/language/naive/basic_splitter.py +4 -4
  14. janus/language/naive/chunk_splitter.py +4 -4
  15. janus/language/naive/registry.py +1 -1
  16. janus/language/naive/simple_ast.py +23 -12
  17. janus/language/naive/tag_splitter.py +4 -4
  18. janus/language/splitter.py +10 -4
  19. janus/language/treesitter/treesitter.py +6 -7
  20. janus/llm/model_callbacks.py +1 -1
  21. janus/llm/models_info.py +2 -3
  22. janus/metrics/_tests/test_llm.py +2 -3
  23. janus/metrics/_tests/test_rouge_score.py +1 -1
  24. janus/metrics/_tests/test_similarity_score.py +1 -1
  25. janus/metrics/complexity_metrics.py +3 -4
  26. janus/metrics/metric.py +3 -4
  27. janus/parsers/reqs_parser.py +4 -3
  28. janus/prompts/prompt.py +34 -0
  29. janus/translate.py +12 -6
  30. janus/utils/enums.py +6 -5
  31. {janus_llm-2.0.1.dist-info → janus_llm-2.1.0.dist-info}/METADATA +1 -1
  32. {janus_llm-2.0.1.dist-info → janus_llm-2.1.0.dist-info}/RECORD +35 -31
  33. {janus_llm-2.0.1.dist-info → janus_llm-2.1.0.dist-info}/LICENSE +0 -0
  34. {janus_llm-2.0.1.dist-info → janus_llm-2.1.0.dist-info}/WHEEL +0 -0
  35. {janus_llm-2.0.1.dist-info → janus_llm-2.1.0.dist-info}/entry_points.txt +0 -0
janus/__init__.py CHANGED
@@ -5,7 +5,7 @@ from langchain_core._api.deprecation import LangChainDeprecationWarning
5
5
  from .metrics import * # noqa: F403
6
6
  from .translate import Translator
7
7
 
8
- __version__ = "2.0.1"
8
+ __version__ = "2.1.0"
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)
janus/cli.py CHANGED
@@ -12,8 +12,6 @@ from rich.console import Console
12
12
  from rich.prompt import Confirm
13
13
  from typing_extensions import Annotated
14
14
 
15
- from janus.language.naive.registry import CUSTOM_SPLITTERS
16
-
17
15
  from .embedding.collections import Collections
18
16
  from .embedding.database import ChromaEmbeddingDatabase
19
17
  from .embedding.embedding_models_info import (
@@ -25,6 +23,7 @@ from .embedding.embedding_models_info import (
25
23
  from .embedding.vectorize import ChromaDBVectorizer
26
24
  from .language.binary import BinarySplitter
27
25
  from .language.mumps import MumpsSplitter
26
+ from .language.naive.registry import CUSTOM_SPLITTERS
28
27
  from .language.treesitter import TreeSitterSplitter
29
28
  from .llm.model_callbacks import COST_PER_1K_TOKENS
30
29
  from .llm.models_info import MODEL_CONFIG_DIR, MODEL_TYPE_CONSTRUCTORS, TOKEN_LIMITS
janus/converter.py CHANGED
@@ -3,6 +3,7 @@ from typing import Any
3
3
 
4
4
  from langchain.schema.language_model import BaseLanguageModel
5
5
 
6
+ from .language.alc.alc import AlcSplitter
6
7
  from .language.binary import BinarySplitter
7
8
  from .language.mumps import MumpsSplitter
8
9
  from .language.splitter import Splitter
@@ -152,6 +153,8 @@ class Converter:
152
153
  if self._source_language in CUSTOM_SPLITTERS:
153
154
  if self._source_language == "mumps":
154
155
  self._splitter = MumpsSplitter(**kwargs)
156
+ elif self._source_language == "ibmhlasm":
157
+ self._splitter = AlcSplitter(**kwargs)
155
158
  elif self._source_language == "binary":
156
159
  self._splitter = BinarySplitter(**kwargs)
157
160
  else:
@@ -4,8 +4,8 @@ from unittest.mock import MagicMock
4
4
 
5
5
  import pytest
6
6
 
7
- from janus.embedding.collections import Collections
8
- from janus.utils.enums import EmbeddingType
7
+ from ...utils.enums import EmbeddingType
8
+ from ..collections import Collections
9
9
 
10
10
 
11
11
  class TestCollections(unittest.TestCase):
@@ -1,6 +1,6 @@
1
1
  import unittest
2
2
 
3
- from janus.language.splitter import Splitter
3
+ from ..splitter import Splitter
4
4
 
5
5
 
6
6
  class TestSplitter(unittest.TestCase):
@@ -0,0 +1 @@
1
+ from .alc import AlcCombiner, AlcSplitter
File without changes
@@ -0,0 +1,28 @@
1
+ import unittest
2
+ from pathlib import Path
3
+
4
+ from ....llm import load_model
5
+ from ...combine import Combiner
6
+ from ..alc import AlcSplitter
7
+
8
+
9
+ class TestAlcSplitter(unittest.TestCase):
10
+ """Tests for the Splitter class."""
11
+
12
+ def setUp(self):
13
+ """Set up the tests."""
14
+ model_name = "gpt-3.5-turbo-0125"
15
+ llm, _, _ = load_model(model_name)
16
+ self.splitter = AlcSplitter(model=llm)
17
+ self.combiner = Combiner(language="ibmhlasm")
18
+ self.test_file = Path("janus/language/alc/_tests/alc.asm")
19
+
20
+ def test_split(self):
21
+ """Test the split method."""
22
+ tree_root = self.splitter.split(self.test_file)
23
+ self.assertEqual(tree_root.n_descendents, 34)
24
+ self.assertLessEqual(tree_root.max_tokens, self.splitter.max_tokens)
25
+ self.assertFalse(tree_root.complete)
26
+ self.combiner.combine_children(tree_root)
27
+ self.assertTrue(tree_root.complete)
28
+ self.assertEqual(tree_root.complete_text, self.test_file.read_text())
@@ -0,0 +1,87 @@
1
+ from langchain.schema.language_model import BaseLanguageModel
2
+
3
+ from ...utils.logger import create_logger
4
+ from ..block import CodeBlock
5
+ from ..combine import Combiner
6
+ from ..node import NodeType
7
+ from ..treesitter import TreeSitterSplitter
8
+
9
+ log = create_logger(__name__)
10
+
11
+
12
+ class AlcCombiner(Combiner):
13
+ """A class that combines code blocks into ALC files."""
14
+
15
+ def __init__(self) -> None:
16
+ """Initialize a AlcCombiner instance."""
17
+ super().__init__("ibmhlasm")
18
+
19
+
20
+ class AlcSplitter(TreeSitterSplitter):
21
+ """A class for splitting ALC code into functional blocks to prompt
22
+ with for transcoding.
23
+ """
24
+
25
+ def __init__(
26
+ self,
27
+ model: None | BaseLanguageModel = None,
28
+ max_tokens: int = 4096,
29
+ protected_node_types: tuple[str, ...] = (),
30
+ prune_node_types: tuple[str, ...] = (),
31
+ prune_unprotected: bool = False,
32
+ ):
33
+ """Initialize a AlcSplitter instance.
34
+
35
+ Arguments:
36
+ max_tokens: The maximum number of tokens supported by the model
37
+ """
38
+ super().__init__(
39
+ language="ibmhlasm",
40
+ model=model,
41
+ max_tokens=max_tokens,
42
+ protected_node_types=protected_node_types,
43
+ prune_node_types=prune_node_types,
44
+ prune_unprotected=prune_unprotected,
45
+ )
46
+
47
+ def _get_ast(self, code: str) -> CodeBlock:
48
+ root = super()._get_ast(code)
49
+
50
+ # Current treesitter implementation does not nest csects and dsects
51
+ # The loop below nests nodes following csect/dsect instructions into
52
+ # the children of that instruction
53
+ sect_types = {"csect_instruction", "dsect_instruction"}
54
+ queue: list[CodeBlock] = [root]
55
+ while queue:
56
+ block = queue.pop(0)
57
+
58
+ # Search this children for csects and dsects. Create a list of groups
59
+ # where each group is a csect or dsect, starting with the csect/dsect
60
+ # instruction and containing all the subsequent nodes up until the
61
+ # next csect or dsect instruction
62
+ sects: list[list[CodeBlock]] = [[]]
63
+ for c in block.children:
64
+ if c.node_type in sect_types:
65
+ sects.append([c])
66
+ else:
67
+ sects[-1].append(c)
68
+
69
+ sects = [s for s in sects if s]
70
+
71
+ # Restructure the tree, making the head of each group the parent
72
+ # of all the remaining nodes in that group
73
+ if len(sects) > 1:
74
+ block.children = []
75
+ for sect in sects:
76
+ if sect[0].node_type in sect_types:
77
+ sect_node = self.merge_nodes(sect)
78
+ sect_node.children = sect
79
+ sect_node.node_type = NodeType(str(sect[0].node_type)[:5])
80
+ block.children.append(sect_node)
81
+ else:
82
+ block.children.extend(sect)
83
+
84
+ # Push the children onto the queue
85
+ queue.extend(block.children)
86
+
87
+ return root
janus/language/block.py CHANGED
@@ -152,9 +152,11 @@ class CodeBlock:
152
152
  Returns:
153
153
  A string representation of the tree with this block as the root
154
154
  """
155
+ tokens = self.tokens
155
156
  identifier = self.id
156
157
  if self.text is None:
157
158
  identifier = f"({identifier})"
159
+ tokens = self.total_tokens
158
160
  elif not self.complete:
159
161
  identifier += "*"
160
162
  if self.start_point is not None and self.end_point is not None:
@@ -165,7 +167,7 @@ class CodeBlock:
165
167
  seg = ""
166
168
  return "\n".join(
167
169
  [
168
- f"{'| '*depth}{identifier}{seg}",
170
+ f"{'| '*depth}{identifier}{seg} ({tokens:,d} tokens)",
169
171
  *[c.tree_str(depth + 1) for c in self.children],
170
172
  ]
171
173
  )
@@ -48,6 +48,7 @@ class MumpsSplitter(Splitter):
48
48
  max_tokens: int = 4096,
49
49
  protected_node_types: tuple[str] = ("routine_definition",),
50
50
  prune_node_types: tuple[str] = (),
51
+ prune_unprotected: bool = False,
51
52
  ):
52
53
  """Initialize a MumpsSplitter instance.
53
54
 
@@ -60,11 +61,9 @@ class MumpsSplitter(Splitter):
60
61
  max_tokens=max_tokens,
61
62
  protected_node_types=protected_node_types,
62
63
  prune_node_types=prune_node_types,
64
+ prune_unprotected=prune_unprotected,
63
65
  )
64
66
 
65
- # MUMPS code tends to take about 2/3 the space of Python
66
- self.max_tokens: int = int(max_tokens * 2 / 5)
67
-
68
67
  def _set_identifiers(self, root: CodeBlock, name: str):
69
68
  stack = [root]
70
69
  while stack:
@@ -1,4 +1,4 @@
1
1
  from .basic_splitter import FileSplitter
2
2
  from .chunk_splitter import ChunkSplitter
3
- from .simple_ast import FlexibleTreeSitterSplitter, StrictTreeSitterSplitter
3
+ from .simple_ast import get_flexible_ast, get_strict_ast
4
4
  from .tag_splitter import TagSplitter
@@ -1,7 +1,7 @@
1
- from janus.language.block import CodeBlock
2
- from janus.language.naive.chunk_splitter import ChunkSplitter
3
- from janus.language.naive.registry import register_splitter
4
- from janus.language.splitter import FileSizeError
1
+ from ..block import CodeBlock
2
+ from ..naive.chunk_splitter import ChunkSplitter
3
+ from ..naive.registry import register_splitter
4
+ from ..splitter import FileSizeError
5
5
 
6
6
 
7
7
  @register_splitter("file")
@@ -1,7 +1,7 @@
1
- from janus.language.block import CodeBlock
2
- from janus.language.naive.registry import register_splitter
3
- from janus.language.node import NodeType
4
- from janus.language.splitter import Splitter
1
+ from ..block import CodeBlock
2
+ from ..node import NodeType
3
+ from ..splitter import Splitter
4
+ from .registry import register_splitter
5
5
 
6
6
 
7
7
  @register_splitter("chunk")
@@ -1,6 +1,6 @@
1
1
  from typing import Callable, Dict
2
2
 
3
- from janus.language.splitter import Splitter
3
+ from ..splitter import Splitter
4
4
 
5
5
  CUSTOM_SPLITTERS: Dict[str, Callable[..., Splitter]] = dict()
6
6
 
@@ -1,18 +1,29 @@
1
- from janus.language.naive.registry import register_splitter
2
- from janus.language.treesitter import TreeSitterSplitter
3
- from janus.utils.enums import LANGUAGES
1
+ from ...utils.enums import LANGUAGES
2
+ from ..alc.alc import AlcSplitter
3
+ from ..mumps.mumps import MumpsSplitter
4
+ from ..treesitter import TreeSitterSplitter
5
+ from .registry import register_splitter
4
6
 
5
7
 
6
8
  @register_splitter("ast-flex")
7
- class FlexibleTreeSitterSplitter(TreeSitterSplitter):
8
- pass
9
+ def get_flexible_ast(language: str, **kwargs):
10
+ if language == "ibmhlasm":
11
+ return AlcSplitter(**kwargs)
12
+ elif language == "mumps":
13
+ return MumpsSplitter(**kwargs)
14
+ else:
15
+ return TreeSitterSplitter(language=language, **kwargs)
9
16
 
10
17
 
11
18
  @register_splitter("ast-strict")
12
- class StrictTreeSitterSplitter(TreeSitterSplitter):
13
- def __init__(self, language: str, **kwargs):
14
- kwargs.update(
15
- protected_node_types=(LANGUAGES[language]["functional_node_type"],),
16
- prune_unprotected=True,
17
- )
18
- super().__init__(language=language, **kwargs)
19
+ def get_strict_ast(language: str, **kwargs):
20
+ kwargs.update(
21
+ protected_node_types=LANGUAGES[language]["functional_node_types"],
22
+ prune_unprotected=True,
23
+ )
24
+ if language == "ibmhlasm":
25
+ return AlcSplitter(**kwargs)
26
+ elif language == "mumps":
27
+ return MumpsSplitter(**kwargs)
28
+ else:
29
+ return TreeSitterSplitter(language=language, **kwargs)
@@ -1,7 +1,7 @@
1
- from janus.language.block import CodeBlock
2
- from janus.language.naive.registry import register_splitter
3
- from janus.language.node import NodeType
4
- from janus.language.splitter import Splitter
1
+ from ..block import CodeBlock
2
+ from ..node import NodeType
3
+ from ..splitter import Splitter
4
+ from .registry import register_splitter
5
5
 
6
6
 
7
7
  @register_splitter("tag")
@@ -47,8 +47,8 @@ class Splitter(FileManager):
47
47
  model: None | BaseLanguageModel = None,
48
48
  max_tokens: int = 4096,
49
49
  skip_merge: bool = False,
50
- protected_node_types: tuple[str] = (),
51
- prune_node_types: tuple[str] = (),
50
+ protected_node_types: tuple[str, ...] = (),
51
+ prune_node_types: tuple[str, ...] = (),
52
52
  prune_unprotected: bool = False,
53
53
  ):
54
54
  """
@@ -340,7 +340,10 @@ class Splitter(FileManager):
340
340
  # Double check length (in theory this should never be an issue)
341
341
  tokens = self._count_tokens(text)
342
342
  if tokens > self.max_tokens:
343
- log.error(f"Merged node ({name}) too long for context!")
343
+ log.error(
344
+ f"Merged node ({name}) too long for context!"
345
+ f" ({tokens} > {self.max_tokens})"
346
+ )
344
347
 
345
348
  return CodeBlock(
346
349
  text=text,
@@ -420,7 +423,10 @@ class Splitter(FileManager):
420
423
  name = f"{node.name}-L#{node_line}"
421
424
  tokens = self._count_tokens(line)
422
425
  if tokens > self.max_tokens:
423
- raise TokenLimitError(r"Irreducible node too large for context!")
426
+ raise TokenLimitError(
427
+ "Irreducible node too large for context!"
428
+ f" ({tokens} > {self.max_tokens})"
429
+ )
424
430
 
425
431
  node.children.append(
426
432
  CodeBlock(
@@ -26,8 +26,8 @@ class TreeSitterSplitter(Splitter):
26
26
  language: str,
27
27
  model: None | BaseLanguageModel = None,
28
28
  max_tokens: int = 4096,
29
- protected_node_types: tuple[str] = (),
30
- prune_node_types: tuple[str] = (),
29
+ protected_node_types: tuple[str, ...] = (),
30
+ prune_node_types: tuple[str, ...] = (),
31
31
  prune_unprotected: bool = False,
32
32
  ) -> None:
33
33
  """Initialize a TreeSitterSplitter instance.
@@ -48,10 +48,10 @@ class TreeSitterSplitter(Splitter):
48
48
  self._load_parser()
49
49
 
50
50
  def _get_ast(self, code: str) -> CodeBlock:
51
- code = bytes(code, "utf-8")
52
- tree = self.parser.parse(code)
51
+ code_bytes = bytes(code, "utf-8")
52
+ tree = self.parser.parse(code_bytes)
53
53
  root = tree.walk().node
54
- root = self._node_to_block(root, code)
54
+ root = self._node_to_block(root, code_bytes)
55
55
  return root
56
56
 
57
57
  # Recursively print tree to view parsed output (dev helper function)
@@ -98,7 +98,7 @@ class TreeSitterSplitter(Splitter):
98
98
 
99
99
  text = node.text.decode()
100
100
  children = [self._node_to_block(child, original_text) for child in node.children]
101
- node = CodeBlock(
101
+ return CodeBlock(
102
102
  id=node.id,
103
103
  name=str(node.id),
104
104
  text=text,
@@ -112,7 +112,6 @@ class TreeSitterSplitter(Splitter):
112
112
  language=self.language,
113
113
  tokens=self._count_tokens(text),
114
114
  )
115
- return node
116
115
 
117
116
  def _load_parser(self) -> None:
118
117
  """Load the parser for the given language.
@@ -8,7 +8,7 @@ from langchain_core.messages import AIMessage
8
8
  from langchain_core.outputs import ChatGeneration, LLMResult
9
9
  from langchain_core.tracers.context import register_configure_hook
10
10
 
11
- from janus.utils.logger import create_logger
11
+ from ..utils.logger import create_logger
12
12
 
13
13
  log = create_logger(__name__)
14
14
 
janus/llm/models_info.py CHANGED
@@ -8,8 +8,7 @@ from langchain_community.llms import HuggingFaceTextGenInference
8
8
  from langchain_core.language_models import BaseLanguageModel
9
9
  from langchain_openai import ChatOpenAI
10
10
 
11
- from janus.llm.model_callbacks import COST_PER_1K_TOKENS
12
- from janus.prompts.prompt import (
11
+ from ..prompts.prompt import (
13
12
  ChatGptPromptEngine,
14
13
  ClaudePromptEngine,
15
14
  CoherePromptEngine,
@@ -18,8 +17,8 @@ from janus.prompts.prompt import (
18
17
  PromptEngine,
19
18
  TitanPromptEngine,
20
19
  )
21
-
22
20
  from ..utils.logger import create_logger
21
+ from .model_callbacks import COST_PER_1K_TOKENS
23
22
 
24
23
  log = create_logger(__name__)
25
24
 
@@ -3,8 +3,7 @@ from unittest.mock import patch
3
3
 
4
4
  import pytest
5
5
 
6
- from janus.llm.models_info import load_model
7
-
6
+ from ...llm.models_info import load_model
8
7
  from ..llm_metrics import llm_evaluate_option, llm_evaluate_ref_option
9
8
 
10
9
 
@@ -40,7 +39,7 @@ class TestLLMMetrics(unittest.TestCase):
40
39
  print("'Hello, world!")
41
40
  """
42
41
 
43
- @patch("janus.llm.models_info.load_model")
42
+ @patch(".llm.models_info.load_model")
44
43
  @patch("janus.metrics.llm_metrics.llm_evaluate")
45
44
  @pytest.mark.llm_eval
46
45
  def test_llm_self_eval_quality(self, mock_llm_evaluate, mock_load_model):
@@ -1,6 +1,6 @@
1
1
  import unittest
2
2
 
3
- from janus.metrics.rouge_score import rouge
3
+ from ..rouge_score import rouge
4
4
 
5
5
 
6
6
  class TestRouge(unittest.TestCase):
@@ -1,6 +1,6 @@
1
1
  import unittest
2
2
 
3
- from janus.metrics.similarity import similarity_score
3
+ from ..similarity import similarity_score
4
4
 
5
5
 
6
6
  class TestSimilarityScore(unittest.TestCase):
@@ -1,10 +1,9 @@
1
1
  import math
2
2
  from typing import List, Optional
3
3
 
4
- from janus.language.block import CodeBlock
5
- from janus.language.treesitter.treesitter import TreeSitterSplitter
6
- from janus.utils.enums import LANGUAGES
7
-
4
+ from ..language.block import CodeBlock
5
+ from ..language.treesitter.treesitter import TreeSitterSplitter
6
+ from ..utils.enums import LANGUAGES
8
7
  from .metric import metric
9
8
 
10
9
 
janus/metrics/metric.py CHANGED
@@ -7,10 +7,9 @@ import click
7
7
  import typer
8
8
  from typing_extensions import Annotated
9
9
 
10
- from janus.llm import load_model
11
- from janus.utils.enums import LANGUAGES
12
- from janus.utils.logger import create_logger
13
-
10
+ from ..llm import load_model
11
+ from ..utils.enums import LANGUAGES
12
+ from ..utils.logger import create_logger
14
13
  from ..utils.progress import track
15
14
  from .cli import evaluate
16
15
  from .file_pairing import FILE_PAIRING_METHODS
@@ -62,9 +62,10 @@ class RequirementsParser(BaseOutputParser[str], JanusParser):
62
62
  The format instructions for the LLM.
63
63
  """
64
64
  return (
65
- "Output must contain an ieee style requirements specification "
66
- "all in a json-formatted string, including the following field: "
67
- '"requirements".'
65
+ "Output must contain a requirements specification "
66
+ "in a JSON-formatted string. The only key should be "
67
+ "'requirements' and its value should be a JSON-formatted list "
68
+ "containing the requirements."
68
69
  )
69
70
 
70
71
  @property
janus/prompts/prompt.py CHANGED
@@ -34,6 +34,40 @@ HUMAN_PROMPT_TEMPLATE_FILENAME = "human.txt"
34
34
  PROMPT_VARIABLES_FILENAME = "variables.json"
35
35
 
36
36
 
37
+ retry_with_output_prompt_text = """Instructions:
38
+ --------------
39
+ {instructions}
40
+ --------------
41
+ Completion:
42
+ --------------
43
+ {input}
44
+ --------------
45
+
46
+ Above, the Completion did not satisfy the constraints given in the Instructions.
47
+ Error:
48
+ --------------
49
+ {error}
50
+ --------------
51
+
52
+ Please try again. Please only respond with an answer that satisfies the
53
+ constraints laid out in the Instructions:"""
54
+
55
+
56
+ retry_with_error_and_output_prompt_text = """Prompt:
57
+ {prompt}
58
+ Completion:
59
+ {input}
60
+
61
+ Above, the Completion did not satisfy the constraints given in the Prompt.
62
+ Details: {error}
63
+ Please try again:"""
64
+
65
+ retry_with_output_prompt = PromptTemplate.from_template(retry_with_output_prompt_text)
66
+ retry_with_error_and_output_prompt = PromptTemplate.from_template(
67
+ retry_with_error_and_output_prompt_text
68
+ )
69
+
70
+
37
71
  class PromptEngine(ABC):
38
72
  """A class defining prompting schemes for the LLM."""
39
73
 
janus/translate.py CHANGED
@@ -16,12 +16,11 @@ from langchain_core.runnables import RunnableLambda, RunnableParallel
16
16
  from openai import BadRequestError, RateLimitError
17
17
  from text_generation.errors import ValidationError
18
18
 
19
- from janus.language.naive.registry import CUSTOM_SPLITTERS
20
-
21
19
  from .converter import Converter, run_if_changed
22
20
  from .embedding.vectorize import ChromaDBVectorizer
23
21
  from .language.block import CodeBlock, TranslatedCodeBlock
24
22
  from .language.combine import ChunkCombiner, Combiner, JsonCombiner
23
+ from .language.naive.registry import CUSTOM_SPLITTERS
25
24
  from .language.splitter import EmptyTreeError, FileSizeError, TokenLimitError
26
25
  from .llm import load_model
27
26
  from .llm.model_callbacks import get_model_callback
@@ -30,7 +29,12 @@ from .parsers.code_parser import CodeParser, GenericParser
30
29
  from .parsers.doc_parser import MadlibsDocumentationParser, MultiDocumentationParser
31
30
  from .parsers.eval_parser import EvaluationParser
32
31
  from .parsers.reqs_parser import RequirementsParser
33
- from .prompts.prompt import SAME_OUTPUT, TEXT_OUTPUT
32
+ from .prompts.prompt import (
33
+ SAME_OUTPUT,
34
+ TEXT_OUTPUT,
35
+ retry_with_error_and_output_prompt,
36
+ retry_with_output_prompt,
37
+ )
34
38
  from .utils.enums import LANGUAGES
35
39
  from .utils.logger import create_logger
36
40
 
@@ -407,10 +411,10 @@ class Translator(Converter):
407
411
  """
408
412
  self._parser.set_reference(block.original)
409
413
 
410
- # Retries with just the output and the error
414
+ # Retries with just the format instructions, the output, and the error
411
415
  n1 = round(self.max_prompts ** (1 / 3))
412
416
 
413
- # Retries with the input, output, and error
417
+ # Retries with the input, the output, and the error
414
418
  n2 = round((self.max_prompts // n1) ** (1 / 2))
415
419
 
416
420
  # Retries with just the input
@@ -420,11 +424,13 @@ class Translator(Converter):
420
424
  llm=self._llm,
421
425
  parser=self._parser,
422
426
  max_retries=n1,
427
+ prompt=retry_with_output_prompt,
423
428
  )
424
429
  retry = RetryWithErrorOutputParser.from_llm(
425
430
  llm=self._llm,
426
431
  parser=fix_format,
427
432
  max_retries=n2,
433
+ prompt=retry_with_error_and_output_prompt,
428
434
  )
429
435
 
430
436
  completion_chain = self._prompt | self._llm
@@ -949,7 +955,7 @@ class RequirementsDocumenter(Documenter):
949
955
 
950
956
  def __init__(self, **kwargs):
951
957
  super().__init__(**kwargs)
952
- self.set_prompt("chunk_requirements")
958
+ self.set_prompt("requirements")
953
959
  self.set_target_language("json", None)
954
960
  self.set_parser_type("requirements")
955
961
 
janus/utils/enums.py CHANGED
@@ -10,7 +10,7 @@ class EmbeddingType(Enum):
10
10
  TARGET = 5 # placeholder embeddings, are these useful for analysis?
11
11
 
12
12
 
13
- CUSTOM_SPLITTERS: Set[str] = {"mumps", "binary"}
13
+ CUSTOM_SPLITTERS: Set[str] = {"mumps", "binary", "ibmhlasm"}
14
14
 
15
15
  LANGUAGES: Dict[str, Dict[str, Any]] = {
16
16
  "ada": {
@@ -63,7 +63,7 @@ LANGUAGES: Dict[str, Dict[str, Any]] = {
63
63
  '#include <stdio.h>\n\nint main() {\n printf("Hello, World!\\n");\n'
64
64
  " return 0;\n}\n"
65
65
  ),
66
- "functional_node_type": "function_definition",
66
+ "functional_node_types": ["function_definition"],
67
67
  "comment_node_type": "comment",
68
68
  },
69
69
  "capnp": {
@@ -206,7 +206,7 @@ LANGUAGES: Dict[str, Dict[str, Any]] = {
206
206
  "example": (
207
207
  "program HelloWorld\n print *, 'Hello, World!'\nend program HelloWorld\n"
208
208
  ),
209
- "functional_node_type": "function",
209
+ "functional_node_types": ["function"],
210
210
  "comment_node_type": "comment",
211
211
  },
212
212
  "gitattributes": {
@@ -300,6 +300,7 @@ LANGUAGES: Dict[str, Dict[str, Any]] = {
300
300
  END HELLO
301
301
  """
302
302
  ),
303
+ "functional_node_types": ["csect", "dsect"],
303
304
  "branch_node_types": ["branch_instruction"],
304
305
  "operation_node_types": ["operation", "branch_operation"],
305
306
  "operand_node_types": ["operands"],
@@ -420,7 +421,7 @@ LANGUAGES: Dict[str, Dict[str, Any]] = {
420
421
  "suffix": "m",
421
422
  "url": "https://github.com/janus-llm/tree-sitter-mumps",
422
423
  "example": 'WRITE "Hello, World!"',
423
- "functional_node_type": "routine_definition",
424
+ "functional_node_types": ["routine_definition"],
424
425
  "comment_node_type": "comment",
425
426
  "branch_node_types": ["if_statement"],
426
427
  "operation_node_types": [
@@ -512,7 +513,7 @@ LANGUAGES: Dict[str, Dict[str, Any]] = {
512
513
  "suffix": "py",
513
514
  "url": "https://github.com/tree-sitter/tree-sitter-python",
514
515
  "example": "# Hello, World!\nprint('Hello, World!')\n",
515
- "functional_node_type": "function_definition",
516
+ "functional_node_types": ["function_definition"],
516
517
  "comment_node_type": "comment",
517
518
  },
518
519
  "qmljs": {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: janus-llm
3
- Version: 2.0.1
3
+ Version: 2.1.0
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,14 +1,14 @@
1
- janus/__init__.py,sha256=CLhLBI_jy4pPKw-ZfpgACv8QHFZMnZml-GjPpBcSYMg,341
1
+ janus/__init__.py,sha256=BDely1z7CW0_cUz6BOjQbE3ZTFvMNAfp2WD5ZkVDF4U,341
2
2
  janus/__main__.py,sha256=Qd-f8z2Q2vpiEP2x6PBFsJrpACWDVxFKQk820MhFmHo,59
3
3
  janus/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  janus/_tests/conftest.py,sha256=V7uW-oq3YbFiRPvrq15YoVVrA1n_83pjgiyTZ-IUGW8,963
5
5
  janus/_tests/test_cli.py,sha256=oP-WOM-ai4jZLDGqjLzI6kCtfXWpoeUR8TynP5p6cVg,4254
6
6
  janus/_tests/test_translate.py,sha256=71oRTTfdSVFOBvUhuOavgl3TuimTz1K6eG-04pUGpfE,16439
7
- janus/cli.py,sha256=X_7HXQGeQEYUkIF3AHbbc04lUEUjKegZ7tUFwmKjf10,29549
8
- janus/converter.py,sha256=ge7nJA1DlOrHW_uB9P0dguc48Au8g7bqCERNqMIqfxs,5941
7
+ janus/cli.py,sha256=ASM9OtdQ2S-KZa-23prrympPbMzKBjSNIclv_w81MSs,29543
8
+ janus/converter.py,sha256=Kxd8eq03XNHbZZI-fU8NUNJR6N2yDxPHTc6QENC8Bqo,6092
9
9
  janus/embedding/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  janus/embedding/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- janus/embedding/_tests/test_collections.py,sha256=llg-JSuRRFhKkHFiWWSHEWV3iaT6Lwue0lp2tEml9io,2668
11
+ janus/embedding/_tests/test_collections.py,sha256=eT0cYv-qmPrHJRjDZqWPFTkqVzFDRoPrRKR__FPiz58,2651
12
12
  janus/embedding/_tests/test_database.py,sha256=uqI2Jgj8DEIlciqiwiZx_n0osjcspIPrHOSSN1NRZSk,1019
13
13
  janus/embedding/_tests/test_vectorize.py,sha256=NnJLHBwgMVycAProRJxuLVSByxrpJ35eaZCFca52gNY,1964
14
14
  janus/embedding/collections.py,sha256=ZE8QGYQ82DCLqhV0m1y7PiqpuHjEfxHPcS5SCKU0LAw,5411
@@ -18,35 +18,39 @@ janus/embedding/vectorize.py,sha256=ap3e6ZMai8U3M5vdpLc_st4Sw31xyqoaqEno0IJlVOU,
18
18
  janus/language/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  janus/language/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  janus/language/_tests/test_combine.py,sha256=ydCYNbTxvaxT-5axiEBzPQLn6s4arSyZ5Tx2SYKLpJY,1830
21
- janus/language/_tests/test_splitter.py,sha256=Hqexa39LLEXlK3ZUw7Zot4PUIACvye2vkq0Jaox0T10,373
21
+ janus/language/_tests/test_splitter.py,sha256=VK48eqp5PYJfjdhD_x7IkeAjbF1KC3AyNnICfK8XnUQ,360
22
+ janus/language/alc/__init__.py,sha256=j7vOMGhT1Vri6p8dsjSaY-fkO5uFn0sJ0nrNGGvcizM,42
23
+ janus/language/alc/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ janus/language/alc/_tests/test_alc.py,sha256=DttXpouP9Vkdlf23_a0qFalKdGtadGv6oXTsmN1pk8Q,994
25
+ janus/language/alc/alc.py,sha256=n8KVHTb6FFILw50N8UM3gfT60gLVvkTjk37easwluWs,3061
22
26
  janus/language/binary/__init__.py,sha256=AlNAe12ZA366kcGSrQ1FJyOdbwxFqGBFkYR2K6yL818,51
23
27
  janus/language/binary/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
28
  janus/language/binary/_tests/test_binary.py,sha256=a-8RSfKA23UrJC9c1xPQK792XZCz8npCHI7isN2dAP8,1727
25
29
  janus/language/binary/binary.py,sha256=CS1RAieN8klSsCeXQEFYKUWioatUX-sOPXKQr5S6NzE,6534
26
30
  janus/language/binary/reveng/decompile_script.py,sha256=veW51oJzuO-4UD3Er062jXZ_FYtTFo9OCkl82Z2xr6A,2182
27
- janus/language/block.py,sha256=4f8e3YYSS2p-0fXjjl2erbbXDOHcBxiLzDHALKlPTg4,9188
31
+ janus/language/block.py,sha256=DVbnnthFWLQ2JjvS09kFqNmeCx7SGtYkBnFjtPdW8mM,9278
28
32
  janus/language/combine.py,sha256=hSEc1dHLcOELks-ZGsRKHOgYBXAronKus6BTmb1u42k,2940
29
33
  janus/language/file.py,sha256=X2MYcAMlCABK77uhMdI_J2foXLrqEdinapYRfLPyKB8,563
30
34
  janus/language/mumps/__init__.py,sha256=-Ou_wJ-JgHezfp1dub2_qCYNiK9wO-zo2MlqxM9qiwE,48
31
35
  janus/language/mumps/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
36
  janus/language/mumps/_tests/test_mumps.py,sha256=6l7q14lPnKf231iWwMdRbf-dg9QuHa26YMS7-K7yC4A,1001
33
- janus/language/mumps/mumps.py,sha256=J8ewuLDh7y9GeyCcGNYqCGJ9HOwrEWypc2HNxClZ8is,7382
37
+ janus/language/mumps/mumps.py,sha256=MkF_TZB1SOIj3JQfGKYow1Hh2Bja0EglUlpd4aAY5Iw,7351
34
38
  janus/language/mumps/patterns.py,sha256=FW5T6Nt5kBO2UKgSL1KLVDbYRgMaJAzDvEmvBkxHppA,2310
35
- janus/language/naive/__init__.py,sha256=6P5rDAZtoHTObkFbZkiEdd-PVRA_9VTQogUjwvRMKK8,198
36
- janus/language/naive/basic_splitter.py,sha256=RM9pJK2YkHfb6_EFEV-dh_rLqkjS6v0cn3ASPf8A6Fg,459
37
- janus/language/naive/chunk_splitter.py,sha256=ebRSbaJhDW-Hyr5__ukbdmAl6kQ1WWFqrq_SfCgHo6k,772
38
- janus/language/naive/registry.py,sha256=8YQX1q0IdAm7t69-oC_00I-vfkdRnHuX-OD3KEjEIuU,294
39
- janus/language/naive/simple_ast.py,sha256=gix_fh864sHZ5KeXoOZIVdKdQeCN_4Qwq4Ox-haZ6sY,593
40
- janus/language/naive/tag_splitter.py,sha256=IXWMn9tBVUGAtzvQi89GhoZ6g7fPXk5MzO0kMCr2mb0,2045
39
+ janus/language/naive/__init__.py,sha256=gsdC543qsIX8y_RxblCBIgyW0tfucljFms6v2WTrEz0,178
40
+ janus/language/naive/basic_splitter.py,sha256=NFW3TvMFQwEmcj5r4jvQXBJCzgNcSZI-3Arjb191gAo,407
41
+ janus/language/naive/chunk_splitter.py,sha256=g1nqbhvaOZ31SjO-smIwAg6lHGTy2rPOOnQ-m6fIKAA,713
42
+ janus/language/naive/registry.py,sha256=CDUkMIgscdPBV_qu49u9TGnOIgr9mRasinPRwViTWz8,281
43
+ janus/language/naive/simple_ast.py,sha256=boX_pJ8x52_MxiM6hJ-0oa6MR75Fu4pyebBEtYJJZUc,907
44
+ janus/language/naive/tag_splitter.py,sha256=6DHBJdM3IllcVV-MrAyj8KPg5zXTiRdeD42CYrmEFHk,1986
41
45
  janus/language/node.py,sha256=-ymv--oILEYLVO2KSOrzOlzL2cZHNQpQJYwE1cKA-pY,200
42
- janus/language/splitter.py,sha256=Ep8RxWrnuih3MAcdkkbtAsSLrPmyQcjnk0IzbRC-460,16741
46
+ janus/language/splitter.py,sha256=4XAe0hXka7njS30UHGCngJzDgHxn3lygUjikSHuV7Xo,16924
43
47
  janus/language/treesitter/__init__.py,sha256=mUliw7ZJLZ8NkJKyUQMSoUV82hYXE0HvLHrEdGPJF4Q,43
44
48
  janus/language/treesitter/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
49
  janus/language/treesitter/_tests/test_treesitter.py,sha256=nsavUV0aI6cpT9FkQve58eTTehLyQG6qJJBGlNa_bIw,2170
46
- janus/language/treesitter/treesitter.py,sha256=9hbP7eBuSEKSZm6OD4C9q2tbjzrEidaCAKw74aO4lEM,6855
50
+ janus/language/treesitter/treesitter.py,sha256=bWimG5yNxweb-W6xGnl4Bbpsd9lJn9WGuYZla_lWdxQ,6863
47
51
  janus/llm/__init__.py,sha256=8Pzn3Jdx867PzDc4xmwm8wvJDGzWSIhpN0NCEYFe0LQ,36
48
- janus/llm/model_callbacks.py,sha256=zMCbMgniKrzKf-sU9SxOcfoOvc3xz7y0VxIxfdlS5tA,6766
49
- janus/llm/models_info.py,sha256=jNTp7mg7MVSS-Anp9Z-wMTz8odiE-1xXeyi8ngpJi1E,7151
52
+ janus/llm/model_callbacks.py,sha256=cQb0Gmy__Mh27b1UdTZkdCN3747bEi3DN_Wxb6gnI7Q,6762
53
+ janus/llm/models_info.py,sha256=_roSyd9oQX6QMshkyW880qgWt2pEm5Jby-U4XhkMjSg,7137
50
54
  janus/metrics/__init__.py,sha256=AsxtZJUzZiXJPr2ehPPltuYP-ddechjg6X85WZUO7mA,241
51
55
  janus/metrics/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
56
  janus/metrics/_tests/reference.py,sha256=hiaJPP9CXkvFBV_wL-gOe_BzELTw0nvB6uCxhxtIiE8,13
@@ -54,18 +58,18 @@ janus/metrics/_tests/target.py,sha256=hiaJPP9CXkvFBV_wL-gOe_BzELTw0nvB6uCxhxtIiE
54
58
  janus/metrics/_tests/test_bleu.py,sha256=TcSnNGpMh00Nkkk1zq5wDfdCANMUq9eXscU_hcBRU8A,1640
55
59
  janus/metrics/_tests/test_chrf.py,sha256=O4v1Cj513H8NYffJILpSI7CuR_dnm7F8CeB3C7sZYr0,2202
56
60
  janus/metrics/_tests/test_file_pairing.py,sha256=A4Qy6JIesFXUcaig45Ze6LiViuHQS7MFSQzDHQP3j9w,1880
57
- janus/metrics/_tests/test_llm.py,sha256=IYsLwX5zC2WcaaPeSlHuQVmU2sB55-dsOXnmQPhcKps,3007
61
+ janus/metrics/_tests/test_llm.py,sha256=dGXrdd79v-ix_560t6Q8RJEx-6mgZ-pkzJgm-O2ZBwA,2998
58
62
  janus/metrics/_tests/test_reading.py,sha256=NDLFyjmOpM5gWf1LLTjGIw3aUR8Qf22zTt9hwe7NABs,840
59
- janus/metrics/_tests/test_rouge_score.py,sha256=dnP99nry-U5wyE-CiC0eQwm78IyScnmGQH3BeIEdmLY,2032
60
- janus/metrics/_tests/test_similarity_score.py,sha256=tdzH_8hYb2h7fKxpd_a75di-GPnU_frZ0zn2aeYzkso,811
63
+ janus/metrics/_tests/test_rouge_score.py,sha256=rcHmrpy55cW507PnTnGQnp9Tsn5rk7JEyXmusY7la3Q,2020
64
+ janus/metrics/_tests/test_similarity_score.py,sha256=jc3r0lWW5Iqm6AMKc36ewz5rboKwVw29fliBHClkzIg,799
61
65
  janus/metrics/_tests/test_treesitter_metrics.py,sha256=tqpAg9LY811gfQ3n2ypRqBJesAFQodMf6Gz7dvOsqp4,4337
62
66
  janus/metrics/bleu.py,sha256=eRoHIQulPp5mezJzHCNkwUB_89tAj4PqV2pF9eV9HfI,1746
63
67
  janus/metrics/chrf.py,sha256=zNGWZ40CPMgj8rctnmwkbf25_PvSOLPbOjv-iN2cGXM,1472
64
68
  janus/metrics/cli.py,sha256=Duuw2RF47Z-t1pal0cg3L_-N_91rx29krirqtIwjYLY,157
65
- janus/metrics/complexity_metrics.py,sha256=kJh_TyZttMP716MXGfl-WbaS4beR_DaQWGYVg6MurSU,6573
69
+ janus/metrics/complexity_metrics.py,sha256=1Z9n0o_CrILqayk40wRkjR1f7yvHIsJG38DxAbqj614,6560
66
70
  janus/metrics/file_pairing.py,sha256=WNHRV1D8GOJMq8Pla5SPkTDAT7yVaS4-UU0XIGKvEVs,3729
67
71
  janus/metrics/llm_metrics.py,sha256=3677S6GYcoVcokpmAN-fwvNu-lYWAKd7M5mebiE6RZc,5687
68
- janus/metrics/metric.py,sha256=QRzLCkHY2g4pWDIiVLNaxNiEMF4gXw_eUrjecH5CdwA,16987
72
+ janus/metrics/metric.py,sha256=Lgdtq87oJ-kWC_6jdPQ6-d1MqoeTnhkRszo6IZJV6c0,16974
69
73
  janus/metrics/reading.py,sha256=KYuWjKnk0ALRU5S7mCNNZtaNgK02l0fdIGsaNvxLMO4,1690
70
74
  janus/metrics/rouge_score.py,sha256=HfUJwUWI-yq5pOjML2ee4QTOMl0NQahnqEY2Mt8Dtnw,2865
71
75
  janus/metrics/similarity.py,sha256=9pjWWpLKCsk0QfFfSgQNdPXiisqi7WJYOOHaiT8S0iY,1613
@@ -76,19 +80,19 @@ janus/parsers/_tests/test_code_parser.py,sha256=G39i6fIsTxjcxBVaKyMAWgUcFslni9z9
76
80
  janus/parsers/code_parser.py,sha256=XwCoOYwnx2tpqluIdXWg-GWOOkooSDYmJHvqDrxgf48,1782
77
81
  janus/parsers/doc_parser.py,sha256=X8eCb1QXbL6sVWLEFGjsPyxrpJ9XnOPg7G4KZSo9A9E,5658
78
82
  janus/parsers/eval_parser.py,sha256=HB5-zY_Jpmkj6FDbuNCCVCRxwmzhViSAjPKbyyC0Ebc,2723
79
- janus/parsers/reqs_parser.py,sha256=mOMC-7IK3huVS0oOb7m3ZHOCXUFMgTfRg6XXTowir9A,2294
83
+ janus/parsers/reqs_parser.py,sha256=MFBvtR3otpyPZlkZxu0dVH1YeEJhvhNzhaGKGHaQVHA,2359
80
84
  janus/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- janus/prompts/prompt.py,sha256=GMQ9EqwtIhB_x8MgfoeTeb4OkLaySYdGd3wVbpDMZXA,8911
82
- janus/translate.py,sha256=UxdRNXJRVYBoJ74Tis82qYeG9aWRmQqg13lTuuyLbII,38753
85
+ janus/prompts/prompt.py,sha256=FPjqCtWla9BW4AdgrcuY8JXo5rYBSJ4b0PDDw6i1AKs,9701
86
+ janus/translate.py,sha256=bIrvyFBXUH1Cf8M-h-qSybFe0NQwuCA38heiV2toP8w,38958
83
87
  janus/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
88
  janus/utils/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
89
  janus/utils/_tests/test_logger.py,sha256=4jZFm8LX828Dt9lOjiFHZIPbxYy_hHaswyrMPkscgdM,2199
86
90
  janus/utils/_tests/test_progress.py,sha256=Yh5NDNq-24n2nhHHbJm39pENAH70PYnh9ymwdcn0_UU,481
87
- janus/utils/enums.py,sha256=SlZKHojLPYOSjuekQGirSHem5Etcgy57txCtVCej2Ag,27533
91
+ janus/utils/enums.py,sha256=AoilbdiYyMvY2Mp0AM4xlbLSELfut2XMwhIM1S_msP4,27610
88
92
  janus/utils/logger.py,sha256=KZeuaMAnlSZCsj4yL0P6N-JzZwpxXygzACWfdZFeuek,2337
89
93
  janus/utils/progress.py,sha256=pKcCzO9JOU9fSD7qTmLWcqY5smc8mujqQMXoPgqNysE,1458
90
- janus_llm-2.0.1.dist-info/LICENSE,sha256=_j0st0a-HB6MRbP3_BW3PUqpS16v54luyy-1zVyl8NU,10789
91
- janus_llm-2.0.1.dist-info/METADATA,sha256=ygOJ_vhFnBbZj_-B398EH_FRdjLjW2Qh1cVzn4CsRlQ,4184
92
- janus_llm-2.0.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
93
- janus_llm-2.0.1.dist-info/entry_points.txt,sha256=OGhQwzj6pvXp79B0SaBD5apGekCu7Dwe9fZZT_TZ544,39
94
- janus_llm-2.0.1.dist-info/RECORD,,
94
+ janus_llm-2.1.0.dist-info/LICENSE,sha256=_j0st0a-HB6MRbP3_BW3PUqpS16v54luyy-1zVyl8NU,10789
95
+ janus_llm-2.1.0.dist-info/METADATA,sha256=a7PmWYKoHGa6ynFGQJvOVLMtBYkVa8foj6zpJgN1Sfs,4184
96
+ janus_llm-2.1.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
97
+ janus_llm-2.1.0.dist-info/entry_points.txt,sha256=OGhQwzj6pvXp79B0SaBD5apGekCu7Dwe9fZZT_TZ544,39
98
+ janus_llm-2.1.0.dist-info/RECORD,,