janus-llm 3.5.3__py3-none-any.whl → 4.0.0__py3-none-any.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.
janus/metrics/metric.py CHANGED
@@ -8,6 +8,7 @@ import typer
8
8
  from typing_extensions import Annotated
9
9
 
10
10
  from janus.llm import load_model
11
+ from janus.llm.model_callbacks import COST_PER_1K_TOKENS
11
12
  from janus.metrics.cli import evaluate
12
13
  from janus.metrics.file_pairing import FILE_PAIRING_METHODS
13
14
  from janus.metrics.splitting import SPLITTING_METHODS
@@ -135,7 +136,7 @@ def metric(
135
136
  **kwargs,
136
137
  ):
137
138
  out = []
138
- llm, _, token_limit, model_cost = load_model(llm_name)
139
+ llm = load_model(llm_name)
139
140
  if json_file_name is not None:
140
141
  with open(json_file_name, "r") as f:
141
142
  json_obj = json.load(f)
@@ -171,8 +172,8 @@ def metric(
171
172
  out_file=out_file,
172
173
  lang=language,
173
174
  llm=llm,
174
- token_limit=token_limit,
175
- model_cost=model_cost,
175
+ token_limit=llm.token_limit,
176
+ model_cost=COST_PER_1K_TOKENS[llm.model_id],
176
177
  )
177
178
  else:
178
179
  raise ValueError(
@@ -187,8 +188,8 @@ def metric(
187
188
  progress,
188
189
  language,
189
190
  llm,
190
- token_limit,
191
- model_cost,
191
+ llm.token_limit,
192
+ COST_PER_1K_TOKENS[llm.model_id],
192
193
  *args,
193
194
  **kwargs,
194
195
  )
@@ -199,8 +200,8 @@ def metric(
199
200
  progress,
200
201
  language,
201
202
  llm,
202
- token_limit,
203
- model_cost,
203
+ llm.token_limit,
204
+ COST_PER_1K_TOKENS[llm.model_id],
204
205
  *args,
205
206
  **kwargs,
206
207
  )
@@ -296,7 +297,7 @@ def metric(
296
297
  *args,
297
298
  **kwargs,
298
299
  ):
299
- llm, _, token_limit, model_cost = load_model(llm_name)
300
+ llm = load_model(llm_name)
300
301
  if json_file_name is not None:
301
302
  with open(json_file_name, "r") as f:
302
303
  json_obj = json.load(f)
@@ -328,8 +329,8 @@ def metric(
328
329
  out_file=out_file,
329
330
  lang=language,
330
331
  llm=llm,
331
- token_limit=token_limit,
332
- model_cost=model_cost,
332
+ token_limit=llm.token_limit,
333
+ model_cost=COST_PER_1K_TOKENS[llm.model_id],
333
334
  )
334
335
  else:
335
336
  raise ValueError(
@@ -344,8 +345,8 @@ def metric(
344
345
  progress,
345
346
  language,
346
347
  llm,
347
- token_limit,
348
- model_cost,
348
+ llm.token_limit,
349
+ COST_PER_1K_TOKENS[llm.model_id],
349
350
  *args,
350
351
  **kwargs,
351
352
  )
@@ -356,8 +357,8 @@ def metric(
356
357
  progress,
357
358
  language,
358
359
  llm,
359
- token_limit,
360
- model_cost,
360
+ llm.token_limit,
361
+ COST_PER_1K_TOKENS[llm.model_id],
361
362
  *args,
362
363
  **kwargs,
363
364
  )
janus/parsers/uml.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import re
2
2
  import subprocess # nosec
3
3
  from pathlib import Path
4
- from typing import List, Tuple
4
+ from tempfile import NamedTemporaryFile
5
5
 
6
6
  from langchain_core.exceptions import OutputParserException
7
7
  from langchain_core.messages import BaseMessage
@@ -13,39 +13,76 @@ log = create_logger(__name__)
13
13
 
14
14
 
15
15
  class UMLSyntaxParser(CodeParser):
16
- def _get_uml_output(self, file: Path) -> Tuple[str, str]:
17
- # NOTE: running subprocess with shell=False, added nosec to label that we know
18
- # risk exists
16
+ def _check_plantuml(self, text: str) -> None:
17
+ # Leading newlines can break the parser, remove them
18
+ text = text.replace("\\n", "\n").strip()
19
+
20
+ # Write the text to a temporary file (automatically deleted)
21
+ file = NamedTemporaryFile()
22
+ fname = file.name
23
+ with open(fname, "w") as fin:
24
+ fin.write(text)
25
+
19
26
  try:
20
27
  plantuml_path = Path.home().expanduser() / ".janus/lib/plantuml.jar"
28
+ # NOTE: running subprocess with shell=False, added nosec to
29
+ # label that we know risk exists
21
30
  res = subprocess.run(
22
- ["java", "-jar", plantuml_path, file],
31
+ ["java", "-jar", plantuml_path, fname],
23
32
  stdout=subprocess.PIPE,
24
33
  stderr=subprocess.PIPE,
25
34
  ) # nosec
26
35
  stdout = res.stdout.decode("utf-8")
27
36
  stderr = res.stderr.decode("utf-8")
28
37
  except FileNotFoundError:
29
- log.warning("Plant UML executable not found, skipping syntax check")
30
- stdout = ""
31
- stderr = ""
32
- return stdout, stderr
38
+ err_txt = (
39
+ "Plant UML executable not found. Either choose a different parser"
40
+ " or install with `bash scripts/install_plantuml.sh`. Java and"
41
+ " graphviz are dependencies for the tool, they must also be installed."
42
+ )
43
+ log.error(err_txt)
44
+ raise Exception(err_txt)
45
+
46
+ # Check for bad outputs, raise OutputParserExceptions if so
47
+ if "Error" in stderr or "Error" in stdout:
48
+ err_txt = "Recieved UML parsing error(s)."
49
+
50
+ line_nos = self._get_error_lines(stderr) + self._get_error_lines(stdout)
51
+ lines = text.split("\n")
52
+ for i in line_nos:
53
+ i0 = max(0, i - 3)
54
+ i1 = min(len(lines) - 1, i + 2)
55
+ err_lines = [
56
+ f"> {lines[j]}" if j == i - 1 else f" {lines[j]}"
57
+ for j in range(i0, i1)
58
+ ]
59
+ if i0:
60
+ err_lines.insert(0, " ...")
61
+ if i1 < (len(lines) - 1):
62
+ err_lines.append(" ...")
33
63
 
34
- def _get_errs(self, s: str) -> List[str]:
35
- return [x.group() for x in re.finditer(r"Error (.*)\n", s)]
64
+ err_txt += f"\nError located at line {i} must be fixed:\n"
65
+ err_txt += "\n".join(err_lines)
66
+ log.warning(err_txt)
67
+ raise OutputParserException(err_txt)
68
+
69
+ if "Warning" in stdout or "Warning" in stderr:
70
+ err_txt = "Recieved UML parsing warning (often due to missing PLANTUML)."
71
+ if stderr:
72
+ err_txt += f"\nSTDERR:\n```\n{stderr.strip()}\n```\n"
73
+ if stdout:
74
+ err_txt += f"\nSTDOUT:\n```\n{stdout.strip()}\n```\n"
75
+
76
+ log.warning(err_txt)
77
+ raise OutputParserException(err_txt)
78
+
79
+ def _get_error_lines(self, s: str) -> list[int]:
80
+ return [int(x.group(1)) for x in re.finditer(r"Error line (\d+) in file:", s)]
81
+
82
+ def _get_warns(self, s: str) -> list[str]:
83
+ return [x.group() for x in re.finditer(r"Warning: (.*)\n", s)]
36
84
 
37
85
  def parse(self, text: str | BaseMessage) -> str:
38
86
  text = super().parse(text)
39
- janus_path = Path.home().expanduser() / Path(".janus")
40
- if not janus_path.exists():
41
- janus_path.mkdir()
42
- temp_file_path = janus_path / "tmp.txt"
43
- with open(temp_file_path, "w") as f:
44
- f.write(text)
45
- uml_std_out, uml_std_err = self._get_uml_output(temp_file_path)
46
- uml_errs = self._get_errs(uml_std_out) + self._get_errs(uml_std_err)
47
- if len(uml_errs) > 0:
48
- raise OutputParserException(
49
- "Error: Received UML Errors:\n" + "\n".join(uml_errs)
50
- )
87
+ self._check_plantuml(text)
51
88
  return text
janus/refiners/refiner.py CHANGED
@@ -1,73 +1,115 @@
1
- from langchain_core.prompts import ChatPromptTemplate
1
+ from typing import Any
2
2
 
3
- from janus.llm.models_info import MODEL_PROMPT_ENGINES
3
+ from langchain.output_parsers import RetryWithErrorOutputParser
4
+ from langchain_core.output_parsers import StrOutputParser
5
+ from langchain_core.prompt_values import PromptValue
6
+ from langchain_core.runnables import RunnableSerializable
4
7
 
8
+ from janus.llm.models_info import MODEL_PROMPT_ENGINES, JanusModel
9
+ from janus.parsers.parser import JanusParser
10
+ from janus.utils.logger import create_logger
5
11
 
6
- class Refiner:
7
- def refine(
8
- self,
9
- original_prompt: str,
10
- previous_prompt: str,
11
- previous_output: str,
12
- errors: str,
13
- **kwargs,
14
- ) -> tuple[ChatPromptTemplate, dict[str, str]]:
15
- """Creates a new prompt based on feedback from original results
16
-
17
- Arguments:
18
- original_prompt: original prompt used to produce output
19
- original_output: origial output of llm
20
- errors: list of errors detected by parser
21
-
22
- Returns:
23
- Tuple of new prompt and prompt arguments
24
- """
12
+ log = create_logger(__name__)
13
+
14
+
15
+ class JanusRefiner(JanusParser):
16
+ parser: JanusParser
17
+
18
+ def parse_runnable(self, input: dict[str, Any]) -> Any:
19
+ return self.parse_completion(**input)
20
+
21
+ def parse_completion(self, completion: str, **kwargs) -> Any:
22
+ return self.parser.parse(completion)
23
+
24
+ def parse(self, text: str) -> str:
25
25
  raise NotImplementedError
26
26
 
27
27
 
28
- class BasicRefiner(Refiner):
28
+ class FixParserExceptions(JanusRefiner, RetryWithErrorOutputParser):
29
+ def __init__(self, llm: JanusModel, parser: JanusParser, max_retries: int):
30
+ retry_prompt = MODEL_PROMPT_ENGINES[llm.model_id](
31
+ source_language="text",
32
+ prompt_template="refinement/fix_exceptions",
33
+ ).prompt
34
+ chain = retry_prompt | llm | StrOutputParser()
35
+ RetryWithErrorOutputParser.__init__(
36
+ self, parser=parser, retry_chain=chain, max_retries=max_retries
37
+ )
38
+
39
+ def parse_completion(
40
+ self, completion: str, prompt_value: PromptValue, **kwargs
41
+ ) -> Any:
42
+ return self.parse_with_prompt(completion, prompt_value=prompt_value)
43
+
44
+
45
+ class ReflectionRefiner(JanusRefiner):
46
+ max_retries: int
47
+ reflection_chain: RunnableSerializable
48
+ revision_chain: RunnableSerializable
49
+
29
50
  def __init__(
30
51
  self,
31
- prompt_name: str,
32
- model_id: str,
33
- source_language: str,
34
- ) -> None:
35
- """Basic refiner, asks llm to fix output of previous prompt given errors
36
-
37
- Arguments:
38
- prompt_name: refinement prompt name to use
39
- model_id: ID of the llm to use. Found in models_info.py
40
- source_language: source_langauge to use
41
- """
42
- self._prompt_name = prompt_name
43
- self._model_id = model_id
44
- self._source_language = source_language
45
-
46
- def refine(
47
- self,
48
- original_prompt: str,
49
- previous_prompt: str,
50
- previous_output: str,
51
- errors: str,
52
- **kwargs,
53
- ) -> tuple[ChatPromptTemplate, dict[str, str]]:
54
- """Creates a new prompt based on feedback from original results
55
-
56
- Arguments:
57
- original_prompt: original prompt used to produce output
58
- original_output: origial output of llm
59
- errors: list of errors detected by parser
60
-
61
- Returns:
62
- Tuple of new prompt and prompt arguments
63
- """
64
- prompt_engine = MODEL_PROMPT_ENGINES[self._model_id](
65
- prompt_template=self._prompt_name,
66
- source_language=self._source_language,
52
+ llm: JanusModel,
53
+ parser: JanusParser,
54
+ max_retries: int,
55
+ prompt_template_name: str = "refinement/reflection",
56
+ ):
57
+ reflection_prompt = MODEL_PROMPT_ENGINES[llm.model_id](
58
+ source_language="text",
59
+ prompt_template=prompt_template_name,
60
+ ).prompt
61
+ revision_prompt = MODEL_PROMPT_ENGINES[llm.model_id](
62
+ source_language="text",
63
+ prompt_template="refinement/revision",
64
+ ).prompt
65
+
66
+ reflection_chain = reflection_prompt | llm | StrOutputParser()
67
+ revision_chain = revision_prompt | llm | StrOutputParser()
68
+ super().__init__(
69
+ reflection_chain=reflection_chain,
70
+ revision_chain=revision_chain,
71
+ parser=parser,
72
+ max_retries=max_retries,
73
+ )
74
+
75
+ def parse_completion(
76
+ self, completion: str, prompt_value: PromptValue, **kwargs
77
+ ) -> Any:
78
+ for retry_number in range(self.max_retries):
79
+ reflection = self.reflection_chain.invoke(
80
+ dict(
81
+ prompt=prompt_value.to_string(),
82
+ completion=completion,
83
+ )
84
+ )
85
+ if reflection.strip() == "LGTM":
86
+ return self.parser.parse(completion)
87
+ if not retry_number:
88
+ log.info(f"Completion:\n{completion}")
89
+ log.info(f"Reflection:\n{reflection}")
90
+ completion = self.revision_chain.invoke(
91
+ dict(
92
+ prompt=prompt_value.to_string(),
93
+ completion=completion,
94
+ reflection=reflection,
95
+ )
96
+ )
97
+ log.info(f"Revision:\n{completion}")
98
+
99
+ return self.parser.parse(completion)
100
+
101
+
102
+ class HallucinationRefiner(ReflectionRefiner):
103
+ def __init__(self, **kwargs):
104
+ super().__init__(
105
+ prompt_template_name="refinement/hallucination",
106
+ **kwargs,
67
107
  )
68
- prompt_arguments = {
69
- "ORIGINAL_PROMPT": original_prompt,
70
- "OUTPUT": previous_output,
71
- "ERRORS": errors,
72
- }
73
- return prompt_engine.prompt, prompt_arguments
108
+
109
+
110
+ REFINERS = dict(
111
+ none=JanusRefiner,
112
+ parser=FixParserExceptions,
113
+ reflection=ReflectionRefiner,
114
+ hallucination=HallucinationRefiner,
115
+ )
@@ -0,0 +1,42 @@
1
+ from langchain_core.retrievers import BaseRetriever
2
+ from langchain_core.runnables import Runnable, RunnableConfig
3
+
4
+ from janus.language.block import CodeBlock
5
+
6
+
7
+ class JanusRetriever(Runnable):
8
+ def __init__(self) -> None:
9
+ super().__init__()
10
+
11
+ def invoke(
12
+ self, input: CodeBlock, config: RunnableConfig | None = None, **kwargs
13
+ ) -> dict:
14
+ kwargs.update(context=self.get_context(input))
15
+ return kwargs
16
+
17
+ def get_context(self, code_block: CodeBlock) -> str:
18
+ return ""
19
+
20
+
21
+ class ActiveUsingsRetriever(JanusRetriever):
22
+ def get_context(self, code_block: CodeBlock) -> str:
23
+ context = "\n".join(
24
+ f"{context_tag}: {context}"
25
+ for context_tag, context in code_block.context_tags.items()
26
+ )
27
+ return f"You may use the following additional context: {context}"
28
+
29
+
30
+ class TextSearchRetriever(JanusRetriever):
31
+ retriever: BaseRetriever
32
+
33
+ def __init__(self, retriever: BaseRetriever):
34
+ super().__init__()
35
+ self.retriever = retriever
36
+
37
+ def get_context(self, code_block: CodeBlock) -> str:
38
+ if code_block.text is None:
39
+ return ""
40
+ docs = self.retriever.invoke(code_block.text)
41
+ context = "\n\n".join(doc.page_content for doc in docs)
42
+ return f"You may use the following additional context: {context}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: janus-llm
3
- Version: 3.5.3
3
+ Version: 4.0.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,19 +1,19 @@
1
- janus/__init__.py,sha256=7OGST6n7Xx5q_ty0BF_UaZ2cjaepl2HSiPRJXY7XZcQ,361
1
+ janus/__init__.py,sha256=gL7W9Io7zembI938nQAbVjAY107vRS0acvWfDDrEVyg,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
5
5
  janus/_tests/test_cli.py,sha256=6ef7h11bg4i7Q6L1-r0ZdcY7YrH4n472kvDiA03T4c8,4275
6
- janus/cli.py,sha256=RuXaM9rWKW4bvy4ML_epcygDIMSAERM9Os7giO-Ivbk,37810
6
+ janus/cli.py,sha256=lX8GzLOXan8nqjy_dx-3EF4qaLOVTsyDqp0OLBZctw0,38177
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
10
  janus/converter/aggregator.py,sha256=MuAXMKmq6PuUo_w6ljyiuDn81Gk2dN-Ci7FVeLc6vhs,1966
11
- janus/converter/converter.py,sha256=GL4moCOi5vvvsEjAf_7Vrn5GHq12nptH47AAP4soeQc,27956
12
- janus/converter/diagram.py,sha256=sqztG_8T_gQ4njk5V7tg1QCgT6gFbL3CUy7t2l0X5i4,5283
11
+ janus/converter/converter.py,sha256=HWw-a4j-Qq0AWDyyk6cMVOwYjJeXxa3bvs9OOlKo_KI,25965
12
+ janus/converter/diagram.py,sha256=-wktVBPrSBgNIQfHIfa2bJNg6L9CYJQgrr9-xU8DFPw,1646
13
13
  janus/converter/document.py,sha256=qNt2UncMheUBadXCFHGq74tqCrvZub5DCgZpd3Qa54o,4564
14
14
  janus/converter/evaluate.py,sha256=APWQUY3gjAXqkJkPzvj0UA4wPK3Cv9QSJLM-YK9t-ng,476
15
15
  janus/converter/requirements.py,sha256=9tvQ40FZJtG8niIFn45gPQCgKKHVPPoFLinBv6RAqO4,2027
16
- janus/converter/translate.py,sha256=0brQTlSfBYmXtoM8QYIOiyr0LrTr0S1n68Du-BR7_WQ,4236
16
+ janus/converter/translate.py,sha256=S1DPZdmX9Vrn_sJPcobvXmhmS8U53yl5cRXjsmXPtas,4246
17
17
  janus/embedding/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  janus/embedding/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  janus/embedding/_tests/test_collections.py,sha256=llg-JSuRRFhKkHFiWWSHEWV3iaT6Lwue0lp2tEml9io,2668
@@ -29,20 +29,20 @@ janus/language/_tests/test_combine.py,sha256=sjVVPUg4LYkAmazXGUw_S1xPrzWm67_0tCx
29
29
  janus/language/_tests/test_splitter.py,sha256=Hqexa39LLEXlK3ZUw7Zot4PUIACvye2vkq0Jaox0T10,373
30
30
  janus/language/alc/__init__.py,sha256=j7vOMGhT1Vri6p8dsjSaY-fkO5uFn0sJ0nrNGGvcizM,42
31
31
  janus/language/alc/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- janus/language/alc/_tests/test_alc.py,sha256=NgVeOctm9zf-S328DdUNn9et_-lK1t5O0O2FKElb91Q,1027
33
- janus/language/alc/alc.py,sha256=hiHpS-odevqbOS6TkJJgghiGXKU1ObwrNzAI66DNsP8,6598
32
+ janus/language/alc/_tests/test_alc.py,sha256=jrvZCsz3uvbq6pqTKmymWNDgb20HHs69tj9TRbx69aM,1018
33
+ janus/language/alc/alc.py,sha256=fKZDtbeLXiJ2e8t-eWSjeAW6WCMCTn2Fw7_jxvMPdNc,6863
34
34
  janus/language/binary/__init__.py,sha256=AlNAe12ZA366kcGSrQ1FJyOdbwxFqGBFkYR2K6yL818,51
35
35
  janus/language/binary/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- janus/language/binary/_tests/test_binary.py,sha256=SDdI6tsQj9yXle7wBsksHuKULLMHv7mNgUkDx1nCvpw,1733
37
- janus/language/binary/binary.py,sha256=jcc-LZx8Ss-g4j0a691U2yVJV6JGV_zpE_6y_aDq4Cw,6579
36
+ janus/language/binary/_tests/test_binary.py,sha256=cIKIxjj6kIY3rcxLwqUPESP9bxWrHqMHx9TNuICgfeQ,1724
37
+ janus/language/binary/binary.py,sha256=PHsVa8jcM7sW9aTboGRWXj6ewQznz0kVPNWtP4B9YPU,6555
38
38
  janus/language/binary/reveng/decompile_script.py,sha256=veW51oJzuO-4UD3Er062jXZ_FYtTFo9OCkl82Z2xr6A,2182
39
39
  janus/language/block.py,sha256=2rjAYUosHFfWRgLnzf50uAgTMST4Md9Kx6JrlUfEfX4,9398
40
40
  janus/language/combine.py,sha256=Wtve06fa-_Wjv_V5RIf1Nfmg0UxcOEtFNj4vVHpSNbo,2940
41
41
  janus/language/file.py,sha256=jy-cReAoI6F97TXR5bbhPyt8XyUZCdFYnVboubDA_y4,571
42
42
  janus/language/mumps/__init__.py,sha256=-Ou_wJ-JgHezfp1dub2_qCYNiK9wO-zo2MlqxM9qiwE,48
43
43
  janus/language/mumps/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- janus/language/mumps/_tests/test_mumps.py,sha256=dl-87kuWUFu_sZZl-vZYgKB-HTQjQhDuxU1cT2hTAX4,1019
45
- janus/language/mumps/mumps.py,sha256=gBxk6Dhf4HqhU6ymweQuZqwEp-AME2t2JHjmzPNKIqc,7406
44
+ janus/language/mumps/_tests/test_mumps.py,sha256=YxnQkobM9VR_Zow2oLaZxZs8bPipvbFWSza4zlWbMi8,1010
45
+ janus/language/mumps/mumps.py,sha256=-eyafFN9IeUQMU7yEsICJDrDb5tkYV_EydqFCjcuM_o,7381
46
46
  janus/language/mumps/patterns.py,sha256=fLbgEnPYYggfqTnBwXf0XbnlU3g_bM4tsmO1YHYv5Jw,2313
47
47
  janus/language/naive/__init__.py,sha256=_Gq4inONyVYxe8WLB59d_69kqGbtF40BGKoJPnK4tZ0,258
48
48
  janus/language/naive/basic_splitter.py,sha256=RM9pJK2YkHfb6_EFEV-dh_rLqkjS6v0cn3ASPf8A6Fg,459
@@ -51,14 +51,14 @@ janus/language/naive/registry.py,sha256=8YQX1q0IdAm7t69-oC_00I-vfkdRnHuX-OD3KEjE
51
51
  janus/language/naive/simple_ast.py,sha256=YzeUJomVsnttJc8tI9eDROb2Hx9Vm9XKmOnLEp3TkzI,3112
52
52
  janus/language/naive/tag_splitter.py,sha256=IXWMn9tBVUGAtzvQi89GhoZ6g7fPXk5MzO0kMCr2mb0,2045
53
53
  janus/language/node.py,sha256=baoYFtapwBQqBtUN6EvHFYRkbR-EcEw1b3fQvH9zIAM,204
54
- janus/language/splitter.py,sha256=ckrNgN2G3c2cp7AJeZmem21H2FF2pYZtOivqwyLIb6M,17029
54
+ janus/language/splitter.py,sha256=pYvDhGAYDDP7E4CZeNn76I6zVnHMNj6gTFUegKXyRPk,17005
55
55
  janus/language/treesitter/__init__.py,sha256=mUliw7ZJLZ8NkJKyUQMSoUV82hYXE0HvLHrEdGPJF4Q,43
56
56
  janus/language/treesitter/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
- janus/language/treesitter/_tests/test_treesitter.py,sha256=4S_UdH6AfJ0j6hyInZ2CFLRqLXb0Bq-AMYd7A8-Y3iU,2188
58
- janus/language/treesitter/treesitter.py,sha256=FU86H8j2cfRLtwyNeEnf9A6gzZEvDwmnFCIrQymUJso,7541
57
+ janus/language/treesitter/_tests/test_treesitter.py,sha256=fmr_mFSja7vaCVu0TVyLDua3A94jMjY4AqSC5NqnOdQ,2179
58
+ janus/language/treesitter/treesitter.py,sha256=q7fqfFxt7QsqM6tE39uqutRMsOfEgBd3omv7zVZSEOc,7517
59
59
  janus/llm/__init__.py,sha256=TKLYvnsWKWfxMucy-lCLQ-4bkN9ENotJZDywDEQmrKg,45
60
- janus/llm/model_callbacks.py,sha256=K7P5NY-rf7IYRAFHnZ3kzhrQWE6g_najx8uxlaSiz3E,7110
61
- janus/llm/models_info.py,sha256=mSY0lnMN7hg5-Gtbz207-Y4EZiCzB8GDU9KV2jMCKYE,8668
60
+ janus/llm/model_callbacks.py,sha256=iaLsnHt2LcMgHPW4ouQdot9ahOHUOBCtydpVaag1Zak,7564
61
+ janus/llm/models_info.py,sha256=GxAr7iwjcvM7RWUe1I6AuOqiYA-Wnc4Mr8DEVBq91KA,9662
62
62
  janus/metrics/__init__.py,sha256=AsxtZJUzZiXJPr2ehPPltuYP-ddechjg6X85WZUO7mA,241
63
63
  janus/metrics/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
64
  janus/metrics/_tests/reference.py,sha256=hiaJPP9CXkvFBV_wL-gOe_BzELTw0nvB6uCxhxtIiE8,13
@@ -77,7 +77,7 @@ janus/metrics/cli.py,sha256=Duuw2RF47Z-t1pal0cg3L_-N_91rx29krirqtIwjYLY,157
77
77
  janus/metrics/complexity_metrics.py,sha256=9sHxa9tY9IgdFC4grCmDSuu8Nkphm_FWbTecxgW78go,6574
78
78
  janus/metrics/file_pairing.py,sha256=b0848gbDTqKVge-uGiujtHdsgcbkpJ04nWF2ul_gbCw,3749
79
79
  janus/metrics/llm_metrics.py,sha256=nzzJMSnoZfgtzzltjoCu1l4-Qwuycd-V3z17AtStYdY,5700
80
- janus/metrics/metric.py,sha256=nZJQY-_AdiRFz6Af38t6TOam1I_yCns89-aOHwPRIos,17011
80
+ janus/metrics/metric.py,sha256=ZQXz2LLXA3_WW6BluF8Q2LdJKYVWZLYmhO4Ai116ZPY,17168
81
81
  janus/metrics/reading.py,sha256=RyOSebENWPGD1m_-QfKM9v2vfNAQVkiZ2Oyynb2HrVI,3253
82
82
  janus/metrics/rouge_score.py,sha256=XnA2ABAceIzzA_9rIYDaMtyD4pphHxXVwxaYvMcqZWE,2878
83
83
  janus/metrics/similarity.py,sha256=NKd-m8hMB27i1_1CQkG5o7HrAK2wTr89B21Y36kqHiE,1630
@@ -89,12 +89,12 @@ janus/parsers/code_parser.py,sha256=3l0HfzgrvJuiwk779s9ZsgUl3xbp1nE1qZxh8aDYRBI,
89
89
  janus/parsers/doc_parser.py,sha256=0pUsNZ9hKQLjIi8L8BgkOBHQZ_EGoFLHrBQ4hoDkjSw,5862
90
90
  janus/parsers/eval_parser.py,sha256=Gjh6aTZgpYd2ASJUEPMo4LpCL00cBmbOqc4KM3hy8x8,2922
91
91
  janus/parsers/parser.py,sha256=y6VV64bgVidf-oEFla3I--_28tnJsPBc6QUD_SkbfSE,1614
92
- janus/parsers/refiner_parser.py,sha256=W7ecDX7j6N-uWtRBYFD1EiEzDpDQws16nrVFzyArzf8,1632
93
92
  janus/parsers/reqs_parser.py,sha256=uRQC41Iqp22GjIvakb5UKv70UWHkcOTbOVl_RDnipYw,2438
94
- janus/parsers/uml.py,sha256=T9MzYbXz_gjlfgJlIMGSzgACcXLhoN3RnV9Y-5vYJ9A,1888
93
+ janus/parsers/uml.py,sha256=SwaoG9QrHKQP8rSxlf3qu_rp7OMQqYSmLgDYBapOa9M,3379
95
94
  janus/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
95
  janus/prompts/prompt.py,sha256=3796YXIzzIec9b0iUzd8VZlq-AdQbzq8qUGXLy4KH-0,10586
97
- janus/refiners/refiner.py,sha256=GkV4oUSCrLAhyDJY2aY_Jt8PRF3sC6-bv58YbL2PaNk,2227
96
+ janus/refiners/refiner.py,sha256=lKAVS9Nszx8aO7hLB0xzdMmUNfhX7K5SaXwcit2QBHs,3774
97
+ janus/retrievers/retriever.py,sha256=WzsYn329GbyJfmJ9KyU9yiYdhLkuS6WPKTKoHx5fBYQ,1339
98
98
  janus/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
99
  janus/utils/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
100
  janus/utils/_tests/test_logger.py,sha256=jkkvrCTKwsFCsZtmyuvc-WJ0rC7LJi2Z91sIe4IiKzA,2209
@@ -102,8 +102,8 @@ janus/utils/_tests/test_progress.py,sha256=Rs_u5PiGjP-L-o6C1fhwfE1ig8jYu9Xo9s4p8
102
102
  janus/utils/enums.py,sha256=AoilbdiYyMvY2Mp0AM4xlbLSELfut2XMwhIM1S_msP4,27610
103
103
  janus/utils/logger.py,sha256=KZeuaMAnlSZCsj4yL0P6N-JzZwpxXygzACWfdZFeuek,2337
104
104
  janus/utils/progress.py,sha256=PIpcQec7SrhsfqB25LHj2CDDkfm9umZx90d9LZnAx6k,1469
105
- janus_llm-3.5.3.dist-info/LICENSE,sha256=_j0st0a-HB6MRbP3_BW3PUqpS16v54luyy-1zVyl8NU,10789
106
- janus_llm-3.5.3.dist-info/METADATA,sha256=tNfk-v8PG8wfl1Fj1MIa3vWJcHNZkxmUIOKsbvb_5WQ,4184
107
- janus_llm-3.5.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
108
- janus_llm-3.5.3.dist-info/entry_points.txt,sha256=OGhQwzj6pvXp79B0SaBD5apGekCu7Dwe9fZZT_TZ544,39
109
- janus_llm-3.5.3.dist-info/RECORD,,
105
+ janus_llm-4.0.0.dist-info/LICENSE,sha256=_j0st0a-HB6MRbP3_BW3PUqpS16v54luyy-1zVyl8NU,10789
106
+ janus_llm-4.0.0.dist-info/METADATA,sha256=LiMK2QiE9nzhufdK43eDYll_CbSThm2Wjit7bpG3XdE,4184
107
+ janus_llm-4.0.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
108
+ janus_llm-4.0.0.dist-info/entry_points.txt,sha256=OGhQwzj6pvXp79B0SaBD5apGekCu7Dwe9fZZT_TZ544,39
109
+ janus_llm-4.0.0.dist-info/RECORD,,
@@ -1,46 +0,0 @@
1
- from langchain_core.exceptions import OutputParserException
2
- from langchain_core.language_models import BaseLanguageModel
3
- from langchain_core.messages import BaseMessage
4
- from langchain_core.output_parsers import BaseOutputParser
5
-
6
- from janus.parsers.parser import JanusParser
7
- from janus.refiners.refiner import Refiner
8
-
9
-
10
- class RefinerParser(JanusParser):
11
- """Parser for performing refinement with a refiner
12
-
13
- Properties:
14
- llm: the language model to use
15
- parser: the parser to use for parsing llm output
16
- initial_prompt: initial prompt used to generate output
17
- refiner: refiner that gives new subsequent prompts
18
- max_retires: maximum number of times to attempt refining
19
- """
20
-
21
- class Config:
22
- arbitrary_types_allowed = True
23
-
24
- llm: BaseLanguageModel
25
- parser: BaseOutputParser
26
- initial_prompt: str
27
- refiner: Refiner
28
- max_retries: int
29
-
30
- def parse(self, text: str | BaseMessage) -> str:
31
- last_prompt = self.initial_prompt
32
- for _ in range(self.max_retries):
33
- try:
34
- return self.parser.parse(text)
35
- except OutputParserException as oe:
36
- err = str(oe)
37
- new_prompt, prompt_arguments = self.refiner.refine(
38
- self.initial_prompt, last_prompt, text, err
39
- )
40
- new_chain = new_prompt | self.llm
41
- text = new_chain.invoke(prompt_arguments)
42
- last_prompt = new_prompt.format(**prompt_arguments)
43
-
44
- raise OutputParserException(
45
- f"Error: unable to correct output after {self.max_retries} attempts"
46
- )