gptdiff 0.1.16__py3-none-any.whl → 0.1.20__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.
- gptdiff/gptdiff.py +41 -11
- {gptdiff-0.1.16.dist-info → gptdiff-0.1.20.dist-info}/METADATA +1 -1
- gptdiff-0.1.20.dist-info/RECORD +9 -0
- gptdiff-0.1.16.dist-info/RECORD +0 -9
- {gptdiff-0.1.16.dist-info → gptdiff-0.1.20.dist-info}/LICENSE.txt +0 -0
- {gptdiff-0.1.16.dist-info → gptdiff-0.1.20.dist-info}/WHEEL +0 -0
- {gptdiff-0.1.16.dist-info → gptdiff-0.1.20.dist-info}/entry_points.txt +0 -0
- {gptdiff-0.1.16.dist-info → gptdiff-0.1.20.dist-info}/top_level.txt +0 -0
gptdiff/gptdiff.py
CHANGED
@@ -202,7 +202,7 @@ def call_llm_for_diff(system_prompt, user_prompt, files_content, model, temperat
|
|
202
202
|
tool_prompt = formatter.usage_prompt(toolbox)
|
203
203
|
system_prompt += "\n"+tool_prompt
|
204
204
|
|
205
|
-
if
|
205
|
+
if 'gemini' in model:
|
206
206
|
user_prompt = system_prompt+"\n"+user_prompt
|
207
207
|
|
208
208
|
messages = [
|
@@ -241,6 +241,9 @@ def call_llm_for_diff(system_prompt, user_prompt, files_content, model, temperat
|
|
241
241
|
cost = (prompt_tokens / 1_000_000 * cost_per_million_prompt_tokens) + (completion_tokens / 1_000_000 * cost_per_million_completion_tokens)
|
242
242
|
|
243
243
|
full_response = response.choices[0].message.content.strip()
|
244
|
+
full_response, reasoning = swallow_reasoning(full_response)
|
245
|
+
if reasoning and len(reasoning) > 0:
|
246
|
+
print("Swallowed reasoning", reasoning)
|
244
247
|
|
245
248
|
events = parser.parse(full_response)
|
246
249
|
for event in events:
|
@@ -643,6 +646,9 @@ def call_llm_for_apply_with_think_tool_available(file_path, original_content, fi
|
|
643
646
|
formatter = FlatXMLPromptFormatter(tag="think")
|
644
647
|
toolbox = create_think_toolbox()
|
645
648
|
full_response = call_llm_for_apply(file_path, original_content, file_diff, model, api_key=api_key, base_url=base_url, extra_prompt=extra_prompt, max_tokens=max_tokens)
|
649
|
+
full_response, reasoning = swallow_reasoning(full_response)
|
650
|
+
if reasoning and len(reasoning) > 0:
|
651
|
+
print("Swallowed reasoning", reasoning)
|
646
652
|
notool_response = ""
|
647
653
|
events = parser.parse(full_response)
|
648
654
|
is_in_tool = False
|
@@ -697,17 +703,17 @@ def call_llm_for_apply(file_path, original_content, file_diff, model, api_key=No
|
|
697
703
|
4. You must return the entire file. It overwrites the existing file."""
|
698
704
|
user_prompt = f"""File: {file_path}
|
699
705
|
File contents:
|
700
|
-
|
706
|
+
```
|
701
707
|
{original_content}
|
702
|
-
|
708
|
+
```
|
703
709
|
|
704
710
|
Diff to apply:
|
705
|
-
|
711
|
+
```diff
|
706
712
|
{file_diff}
|
707
|
-
|
713
|
+
```"""
|
708
714
|
if extra_prompt:
|
709
715
|
user_prompt += f"\n\n{extra_prompt}"
|
710
|
-
if
|
716
|
+
if 'gemini' in model:
|
711
717
|
user_prompt = system_prompt+"\n"+user_prompt
|
712
718
|
messages = [
|
713
719
|
{"role": "system", "content": system_prompt},
|
@@ -867,7 +873,7 @@ def main():
|
|
867
873
|
project_files.extend(load_project_files(additional_path, project_dir))
|
868
874
|
|
869
875
|
if args.prepend:
|
870
|
-
prepend = args.prepend
|
876
|
+
prepend = args.prepend+"\n"
|
871
877
|
else:
|
872
878
|
prepend = ""
|
873
879
|
|
@@ -885,10 +891,10 @@ def main():
|
|
885
891
|
# If the specified prepend path does not exist, treat the value as literal content.
|
886
892
|
prepend = prepend
|
887
893
|
|
888
|
-
if
|
889
|
-
|
890
|
-
|
891
|
-
|
894
|
+
if prepend != "":
|
895
|
+
prepend += "\n"
|
896
|
+
|
897
|
+
system_prompt = prepend + f"Output a git diff into a ```diff block"
|
892
898
|
|
893
899
|
files_content = ""
|
894
900
|
for file, content in project_files:
|
@@ -967,5 +973,29 @@ def main():
|
|
967
973
|
print(f"Total tokens: {total_tokens}")
|
968
974
|
#print(f"Total cost: ${cost:.4f}")
|
969
975
|
|
976
|
+
def swallow_reasoning(full_response: str) -> (str, str):
|
977
|
+
"""
|
978
|
+
Extracts and swallows the chain-of-thought reasoning section from the full LLM response.
|
979
|
+
Assumes the reasoning block starts with a line beginning with "> Reasoning"
|
980
|
+
and ends with a line matching 'Reasoned for <number> seconds'.
|
981
|
+
|
982
|
+
Returns:
|
983
|
+
A tuple (final_content, reasoning) where:
|
984
|
+
- final_content: The response with the reasoning block removed.
|
985
|
+
- reasoning: The extracted reasoning block, or an empty string if not found.
|
986
|
+
"""
|
987
|
+
pattern = re.compile(
|
988
|
+
r"(?P<reasoning>>\s*Reasoning.*?Reasoned for \d+\s*seconds)",
|
989
|
+
re.DOTALL
|
990
|
+
)
|
991
|
+
match = pattern.search(full_response)
|
992
|
+
if match:
|
993
|
+
reasoning = match.group("reasoning").strip()
|
994
|
+
final_content = full_response.replace(reasoning, "").strip()
|
995
|
+
else:
|
996
|
+
reasoning = ""
|
997
|
+
final_content = full_response.strip()
|
998
|
+
return final_content, reasoning
|
999
|
+
|
970
1000
|
if __name__ == "__main__":
|
971
1001
|
main()
|
@@ -0,0 +1,9 @@
|
|
1
|
+
gptdiff/__init__.py,sha256=o1hrK4GFvbfKcHPlLVArz4OunE3euIicEBYaLrdDo0k,198
|
2
|
+
gptdiff/gptdiff.py,sha256=LKBq_E9GanyDv-2FBbbWvP7JUl2Ignb6zvkD2GqmdPo,39074
|
3
|
+
gptdiff/gptpatch.py,sha256=Z8CWWIfIL2o7xPLVdhzN5GSyJq0vsK4XQRzu4hMWNQk,2194
|
4
|
+
gptdiff-0.1.20.dist-info/LICENSE.txt,sha256=zCJk7yUYpMjFvlipi1dKtaljF8WdZ2NASndBYYbU8BY,1228
|
5
|
+
gptdiff-0.1.20.dist-info/METADATA,sha256=v8-LTu-NVLikIexMY5RDEf2t2VTAh7t_3hch379VzFA,8785
|
6
|
+
gptdiff-0.1.20.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
7
|
+
gptdiff-0.1.20.dist-info/entry_points.txt,sha256=0VlVNr-gc04a3SZD5_qKIBbtg_L5P2x3xlKE5ftcdkc,82
|
8
|
+
gptdiff-0.1.20.dist-info/top_level.txt,sha256=XNkQkQGINaDndEwRxg8qToOrJ9coyfAb-EHrSUXzdCE,8
|
9
|
+
gptdiff-0.1.20.dist-info/RECORD,,
|
gptdiff-0.1.16.dist-info/RECORD
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
gptdiff/__init__.py,sha256=o1hrK4GFvbfKcHPlLVArz4OunE3euIicEBYaLrdDo0k,198
|
2
|
-
gptdiff/gptdiff.py,sha256=wvPbw_M4tXKpg6tTng4EsF4X5lBh1GM5KD6PJyRxoOc,37981
|
3
|
-
gptdiff/gptpatch.py,sha256=Z8CWWIfIL2o7xPLVdhzN5GSyJq0vsK4XQRzu4hMWNQk,2194
|
4
|
-
gptdiff-0.1.16.dist-info/LICENSE.txt,sha256=zCJk7yUYpMjFvlipi1dKtaljF8WdZ2NASndBYYbU8BY,1228
|
5
|
-
gptdiff-0.1.16.dist-info/METADATA,sha256=hhm98oDVM9WIzcNJ9IHcM6auJcGBf46XmLJ9JPLUe_E,8785
|
6
|
-
gptdiff-0.1.16.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
7
|
-
gptdiff-0.1.16.dist-info/entry_points.txt,sha256=0VlVNr-gc04a3SZD5_qKIBbtg_L5P2x3xlKE5ftcdkc,82
|
8
|
-
gptdiff-0.1.16.dist-info/top_level.txt,sha256=XNkQkQGINaDndEwRxg8qToOrJ9coyfAb-EHrSUXzdCE,8
|
9
|
-
gptdiff-0.1.16.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|