mini-swe-agent 1.17.2__py3-none-any.whl → 1.17.4__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mini-swe-agent
3
- Version: 1.17.2
3
+ Version: 1.17.4
4
4
  Summary: Nano SWE Agent - A simple AI software engineering agent
5
5
  Author-email: Kilian Lieret <kilian.lieret@posteo.de>, "Carlos E. Jimenez" <carlosej@princeton.edu>
6
6
  License: MIT License
@@ -1,9 +1,9 @@
1
- mini_swe_agent-1.17.2.dist-info/licenses/LICENSE.md,sha256=D3luWPkdHAe7LBsdD4vzqDAXw6Xewb3G-uczss0uh1s,1094
2
- minisweagent/__init__.py,sha256=gEojonoOcUfOhgUFORuSn5xcgV412ZMFH8KV1tGoGbM,2016
1
+ mini_swe_agent-1.17.4.dist-info/licenses/LICENSE.md,sha256=D3luWPkdHAe7LBsdD4vzqDAXw6Xewb3G-uczss0uh1s,1094
2
+ minisweagent/__init__.py,sha256=bAZaIxK-PtytnRtOlmfeZfnffq2QYpPUlweJ_dTMpqU,2621
3
3
  minisweagent/__main__.py,sha256=FIyAOiw--c3FQ2g240FOM1FdL0lk_PxSpixu0pQ7WFo,194
4
4
  minisweagent/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  minisweagent/agents/__init__.py,sha256=cpjJLzg1IGxLM-tZpoMJV9S33ye13XtdBO0x7DU_Lrk,48
6
- minisweagent/agents/default.py,sha256=6XQEf4bawQL-J2r4ClsDsO_1uQ-VM7WrW3hGaHxKcQE,5657
6
+ minisweagent/agents/default.py,sha256=No2GmsgUuWzqxUswFKICJNViVDx3GSjecAgK6NP0Tu4,6176
7
7
  minisweagent/agents/interactive.py,sha256=NBeNamRuqww9ZRhOg1q8xPO9ziUw2gpAVV6hCPbpBxU,7470
8
8
  minisweagent/agents/interactive_textual.py,sha256=yUDMkuvhhnZAP8LtiBWmt5J5WzfWBeR0zNlJbdbEGa0,18153
9
9
  minisweagent/config/README.md,sha256=ZGH5KbFHpkwYOwoZgwP1dHOikuvU11dIG_TqyI73dik,355
@@ -25,12 +25,12 @@ minisweagent/environments/extra/bubblewrap.py,sha256=G12Dm63N30qByfLb1SKNsI4G4gL
25
25
  minisweagent/environments/extra/swerex_docker.py,sha256=WPYbohT_vqTHkde9cxpbV6chLXCpLl0PDAcgMbZsV0M,1707
26
26
  minisweagent/models/__init__.py,sha256=RGJgMPeF8W2Ix8_xwvHjjDCD9I6ygirz4v8Ps1KG6dI,4435
27
27
  minisweagent/models/anthropic.py,sha256=4p-LxQ_RYQUX1rBsffAj3T1bBb2uMRhA4IyKfDcMpgo,1517
28
- minisweagent/models/litellm_model.py,sha256=hunhw6lpizmdtmrt3PeY5-eFxlf6pZjeE0F7FmfzweM,4372
29
- minisweagent/models/litellm_response_api_model.py,sha256=FF-Xab6xBvkxh_E6VoMx-Km1owRpHrkSIfgXZ31hCsU,2946
30
- minisweagent/models/openrouter_model.py,sha256=7iw_yozhiVk3IwEEvS2jN2Ig_7-aTo-qeWYUEq2Hl2g,4774
31
- minisweagent/models/portkey_model.py,sha256=ziX36Kzv9zCEz8wDIuNjUnqEmAW0eCmb7VjRZzKpVKE,7285
32
- minisweagent/models/portkey_response_api_model.py,sha256=muHiiRpm7nXP1jylZovE4Ttr_JwFt1b9-YZgRCthTbk,2938
33
- minisweagent/models/requesty_model.py,sha256=9f7T3tzafTZhyc5DkXK8Pl9n8a9-SzMqDn6Di-BQlFU,3843
28
+ minisweagent/models/litellm_model.py,sha256=0HBnb53GdeqSAwNcJuu8hXrd3XqqIm4BHS1WkwK3ZGE,4394
29
+ minisweagent/models/litellm_response_api_model.py,sha256=Niq4HepQm_dlCkGdXsg9_7zNNRxJlnwWK-JJE0lP9Qg,3150
30
+ minisweagent/models/openrouter_model.py,sha256=YgML8_p9gHMjoBcxszmgyrIr5DLRX2vZiBwHC47N5mg,4796
31
+ minisweagent/models/portkey_model.py,sha256=_eK8maRm2kwombWYbYtH7MXj8rhd18ZE7tGer2YXvws,7307
32
+ minisweagent/models/portkey_response_api_model.py,sha256=JcODu40mYsqWnwWntTSjRUMTzifLUZZpFL5sF3FUk3s,2960
33
+ minisweagent/models/requesty_model.py,sha256=t4iQD7mH61UlldQmydcGYmoj-dAG8K_2347DBjl-4vo,3865
34
34
  minisweagent/models/test_models.py,sha256=ItCA6ddntzkYA7dzSuUEaLMV-AE8TBuXBFP8CzpiO3U,1351
35
35
  minisweagent/models/extra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  minisweagent/models/extra/roulette.py,sha256=idteU0pGvmmipNr0s-42GAbVkmKE20hY2LTFxbkAgoI,2048
@@ -42,7 +42,7 @@ minisweagent/run/__init__.py,sha256=WIoYgHVl7iZF2YncrfV3IttupG6P5KogroKHKECka3A,
42
42
  minisweagent/run/github_issue.py,sha256=35mZoPLc4JV6XXJKRv55lnuKbXf5lDftd51N89-x9J0,3192
43
43
  minisweagent/run/hello_world.py,sha256=erLnEwNmPFLxq3-8zyv66Vy1kIqMqQf97vISX7LrQXg,959
44
44
  minisweagent/run/inspector.py,sha256=P86kOmzySWdK4tx0DHAOfSF1h-s1vHboSsaRD3_0OKQ,7109
45
- minisweagent/run/mini.py,sha256=N3ZvTQmKHNJ9bEaiz5YHjJT4Arg0WtjxGLBTtj8-T0E,4922
45
+ minisweagent/run/mini.py,sha256=08uKeYc_tcAgbi1nbvqmVto-_RhG0NIp5pycvZsk_DM,4930
46
46
  minisweagent/run/mini_extra.py,sha256=ecA1PnTWElpO60G9RktvVLtUOf3bZ_ESmnSttS6izhQ,1465
47
47
  minisweagent/run/extra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  minisweagent/run/extra/config.py,sha256=KDMwg6eQCxbwI6P1phosCwaLQhJQXB4ti65M_HoxU-g,3892
@@ -54,8 +54,8 @@ minisweagent/run/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
54
54
  minisweagent/run/utils/save.py,sha256=bokvblZ1SaIvCXimkRQqgvERKmVM0jn8SF7UoHBeerQ,2546
55
55
  minisweagent/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  minisweagent/utils/log.py,sha256=ruDMNKMrVC9NPvCeHwO3QYz5jsVNUGQB2dRAEAPAWp8,996
57
- mini_swe_agent-1.17.2.dist-info/METADATA,sha256=wN_7BqZ2HOwKTRNQo8tb14Y8P3f769l0_6Vqh9_kpqI,14836
58
- mini_swe_agent-1.17.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
59
- mini_swe_agent-1.17.2.dist-info/entry_points.txt,sha256=d1_yRbTaGjs1UXHa6JQK0sKDGBIVGm8oeW0k2kfbJgQ,182
60
- mini_swe_agent-1.17.2.dist-info/top_level.txt,sha256=zKF4t8bFpV87fdVABZt2Da-vnb4Vkh_CxkwQx5YT4Ew,13
61
- mini_swe_agent-1.17.2.dist-info/RECORD,,
57
+ mini_swe_agent-1.17.4.dist-info/METADATA,sha256=ajzH5SfOJUO640aWiQ1lJhdOjjW8ETZb8q4BWeiiP9g,14836
58
+ mini_swe_agent-1.17.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
59
+ mini_swe_agent-1.17.4.dist-info/entry_points.txt,sha256=d1_yRbTaGjs1UXHa6JQK0sKDGBIVGm8oeW0k2kfbJgQ,182
60
+ mini_swe_agent-1.17.4.dist-info/top_level.txt,sha256=zKF4t8bFpV87fdVABZt2Da-vnb4Vkh_CxkwQx5YT4Ew,13
61
+ mini_swe_agent-1.17.4.dist-info/RECORD,,
minisweagent/__init__.py CHANGED
@@ -8,7 +8,7 @@ This file provides:
8
8
  unless you want the static type checking.
9
9
  """
10
10
 
11
- __version__ = "1.17.2"
11
+ __version__ = "1.17.4"
12
12
 
13
13
  import os
14
14
  from pathlib import Path
@@ -17,6 +17,7 @@ from typing import Any, Protocol
17
17
  import dotenv
18
18
  from platformdirs import user_config_dir
19
19
  from rich.console import Console
20
+ from rich.panel import Panel
20
21
 
21
22
  from minisweagent.utils.log import logger
22
23
 
@@ -27,7 +28,21 @@ global_config_dir.mkdir(parents=True, exist_ok=True)
27
28
  global_config_file = Path(global_config_dir) / ".env"
28
29
 
29
30
  if not os.getenv("MSWEA_SILENT_STARTUP"):
30
- Console().print(
31
+ console = Console()
32
+ console.print(
33
+ Panel(
34
+ "[bold]mini-swe-agent v2.0 is coming soon.[/bold]\n\n"
35
+ "It will be even more flexible, extensible and performant. "
36
+ "However, [bold]breaking changes[/bold] were necessary.\n\n"
37
+ "To stay with the current major version for now, you can pin your dependency: "
38
+ "[bold white]mini-swe-agent~=1.0[/bold white]",
39
+ border_style="bold red",
40
+ title="BREAKING CHANGES AHEAD",
41
+ title_align="left",
42
+ expand=False,
43
+ )
44
+ )
45
+ console.print(
31
46
  f"👋 This is [bold green]mini-swe-agent[/bold green] version [bold green]{__version__}[/bold green].\n"
32
47
  f"Loading global config from [bold green]'{global_config_file}'[/bold green]"
33
48
  )
@@ -20,7 +20,15 @@ class AgentConfig:
20
20
  )
21
21
  timeout_template: str = (
22
22
  "The last command <command>{{action['action']}}</command> timed out and has been killed.\n"
23
- "The output of the command was:\n <output>\n{{output}}\n</output>\n"
23
+ "The output of the command was:\n"
24
+ "{% if output | length < 10000 -%}\n"
25
+ "<output>\n{{output}}\n</output>\n"
26
+ "{%- else -%}\n"
27
+ "<warning>Output was too long and has been truncated.</warning>\n"
28
+ "<output_head>\n{{ output[:5000] }}\n</output_head>\n"
29
+ "<elided_chars>{{ output | length - 10000 }} characters elided</elided_chars>\n"
30
+ "<output_tail>\n{{ output[-5000:] }}\n</output_tail>\n"
31
+ "{%- endif %}\n"
24
32
  "Please try another command and make sure to avoid those requiring interactive input."
25
33
  )
26
34
  format_error_template: str = "Please always provide EXACTLY ONE action in triple backticks."
@@ -127,4 +135,6 @@ class DefaultAgent:
127
135
  """Raises Submitted exception with final output if the agent has finished its task."""
128
136
  lines = output.get("output", "").lstrip().splitlines(keepends=True)
129
137
  if lines and lines[0].strip() in ["MINI_SWE_AGENT_FINAL_OUTPUT", "COMPLETE_TASK_AND_SUBMIT_FINAL_OUTPUT"]:
138
+ if output.get("returncode", 0) != 0:
139
+ return # Command failed - let agent see error and retry
130
140
  raise Submitted("".join(lines[1:]))
@@ -41,6 +41,7 @@ class LitellmModel:
41
41
  litellm.utils.register_model(json.loads(Path(self.config.litellm_model_registry).read_text()))
42
42
 
43
43
  @retry(
44
+ reraise=True,
44
45
  stop=stop_after_attempt(int(os.getenv("MSWEA_MODEL_RETRY_STOP_AFTER_ATTEMPT", "10"))),
45
46
  wait=wait_exponential(multiplier=1, min=4, max=60),
46
47
  before_sleep=before_sleep_log(logger, logging.WARNING),
@@ -28,6 +28,7 @@ class LitellmResponseAPIModel(LitellmModel):
28
28
  self._previous_response_id: str | None = None
29
29
 
30
30
  @retry(
31
+ reraise=True,
31
32
  stop=stop_after_attempt(10),
32
33
  wait=wait_exponential(multiplier=1, min=4, max=60),
33
34
  before_sleep=before_sleep_log(logger, logging.WARNING),
@@ -45,9 +46,11 @@ class LitellmResponseAPIModel(LitellmModel):
45
46
  )
46
47
  def _query(self, messages: list[dict[str, str]], **kwargs):
47
48
  try:
49
+ # Remove 'timestamp' field added by agent - not supported by OpenAI responses API
50
+ clean_messages = [{"role": msg["role"], "content": msg["content"]} for msg in messages]
48
51
  resp = litellm.responses(
49
52
  model=self.config.model_name,
50
- input=messages if self._previous_response_id is None else messages[-1:],
53
+ input=clean_messages if self._previous_response_id is None else clean_messages[-1:],
51
54
  previous_response_id=self._previous_response_id,
52
55
  **(self.config.model_kwargs | kwargs),
53
56
  )
@@ -59,7 +62,6 @@ class LitellmResponseAPIModel(LitellmModel):
59
62
 
60
63
  def query(self, messages: list[dict[str, str]], **kwargs) -> dict:
61
64
  response = self._query(messages, **kwargs)
62
- print(response)
63
65
  text = coerce_responses_text(response)
64
66
  try:
65
67
  cost = litellm.cost_calculator.completion_cost(response, model=self.config.model_name)
@@ -56,6 +56,7 @@ class OpenRouterModel:
56
56
  self._api_key = os.getenv("OPENROUTER_API_KEY", "")
57
57
 
58
58
  @retry(
59
+ reraise=True,
59
60
  stop=stop_after_attempt(int(os.getenv("MSWEA_MODEL_RETRY_STOP_AFTER_ATTEMPT", "10"))),
60
61
  wait=wait_exponential(multiplier=1, min=4, max=60),
61
62
  before_sleep=before_sleep_log(logger, logging.WARNING),
@@ -74,6 +74,7 @@ class PortkeyModel:
74
74
  self.client = Portkey(**client_kwargs)
75
75
 
76
76
  @retry(
77
+ reraise=True,
77
78
  stop=stop_after_attempt(int(os.getenv("MSWEA_MODEL_RETRY_STOP_AFTER_ATTEMPT", "10"))),
78
79
  wait=wait_exponential(multiplier=1, min=4, max=60),
79
80
  before_sleep=before_sleep_log(logger, logging.WARNING),
@@ -30,6 +30,7 @@ class PortkeyResponseAPIModel(PortkeyModel):
30
30
  self._previous_response_id: str | None = None
31
31
 
32
32
  @retry(
33
+ reraise=True,
33
34
  stop=stop_after_attempt(int(os.getenv("MSWEA_MODEL_RETRY_STOP_AFTER_ATTEMPT", "10"))),
34
35
  wait=wait_exponential(multiplier=1, min=4, max=60),
35
36
  before_sleep=before_sleep_log(logger, logging.WARNING),
@@ -51,6 +51,7 @@ class RequestyModel:
51
51
  self._api_key = os.getenv("REQUESTY_API_KEY", "")
52
52
 
53
53
  @retry(
54
+ reraise=True,
54
55
  stop=stop_after_attempt(10),
55
56
  wait=wait_exponential(multiplier=1, min=4, max=60),
56
57
  before_sleep=before_sleep_log(logger, logging.WARNING),
minisweagent/run/mini.py CHANGED
@@ -84,7 +84,7 @@ def main(
84
84
  if model_class is not None:
85
85
  config.setdefault("model", {})["model_class"] = model_class
86
86
  model = get_model(model_name, config.get("model", {}))
87
- env = LocalEnvironment(**config.get("env", {}))
87
+ env = LocalEnvironment(**config.get("environment", {}))
88
88
 
89
89
  # Both visual flag and the MSWEA_VISUAL_MODE_DEFAULT flip the mode, so it's essentially a XOR
90
90
  agent_class = InteractiveAgent