aider-ce 0.87.2.dev9__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.

Potentially problematic release.


This version of aider-ce might be problematic. Click here for more details.

Files changed (264) hide show
  1. aider/__init__.py +20 -0
  2. aider/__main__.py +4 -0
  3. aider/_version.py +34 -0
  4. aider/analytics.py +258 -0
  5. aider/args.py +1014 -0
  6. aider/args_formatter.py +228 -0
  7. aider/change_tracker.py +133 -0
  8. aider/coders/__init__.py +36 -0
  9. aider/coders/architect_coder.py +48 -0
  10. aider/coders/architect_prompts.py +40 -0
  11. aider/coders/ask_coder.py +9 -0
  12. aider/coders/ask_prompts.py +35 -0
  13. aider/coders/base_coder.py +3013 -0
  14. aider/coders/base_prompts.py +87 -0
  15. aider/coders/chat_chunks.py +64 -0
  16. aider/coders/context_coder.py +53 -0
  17. aider/coders/context_prompts.py +75 -0
  18. aider/coders/editblock_coder.py +657 -0
  19. aider/coders/editblock_fenced_coder.py +10 -0
  20. aider/coders/editblock_fenced_prompts.py +143 -0
  21. aider/coders/editblock_func_coder.py +141 -0
  22. aider/coders/editblock_func_prompts.py +27 -0
  23. aider/coders/editblock_prompts.py +177 -0
  24. aider/coders/editor_diff_fenced_coder.py +9 -0
  25. aider/coders/editor_diff_fenced_prompts.py +11 -0
  26. aider/coders/editor_editblock_coder.py +9 -0
  27. aider/coders/editor_editblock_prompts.py +21 -0
  28. aider/coders/editor_whole_coder.py +9 -0
  29. aider/coders/editor_whole_prompts.py +12 -0
  30. aider/coders/help_coder.py +16 -0
  31. aider/coders/help_prompts.py +46 -0
  32. aider/coders/navigator_coder.py +2711 -0
  33. aider/coders/navigator_legacy_prompts.py +338 -0
  34. aider/coders/navigator_prompts.py +530 -0
  35. aider/coders/patch_coder.py +706 -0
  36. aider/coders/patch_prompts.py +161 -0
  37. aider/coders/search_replace.py +757 -0
  38. aider/coders/shell.py +37 -0
  39. aider/coders/single_wholefile_func_coder.py +102 -0
  40. aider/coders/single_wholefile_func_prompts.py +27 -0
  41. aider/coders/udiff_coder.py +429 -0
  42. aider/coders/udiff_prompts.py +117 -0
  43. aider/coders/udiff_simple.py +14 -0
  44. aider/coders/udiff_simple_prompts.py +25 -0
  45. aider/coders/wholefile_coder.py +144 -0
  46. aider/coders/wholefile_func_coder.py +134 -0
  47. aider/coders/wholefile_func_prompts.py +27 -0
  48. aider/coders/wholefile_prompts.py +70 -0
  49. aider/commands.py +1946 -0
  50. aider/copypaste.py +72 -0
  51. aider/deprecated.py +126 -0
  52. aider/diffs.py +128 -0
  53. aider/dump.py +29 -0
  54. aider/editor.py +147 -0
  55. aider/exceptions.py +107 -0
  56. aider/format_settings.py +26 -0
  57. aider/gui.py +545 -0
  58. aider/help.py +163 -0
  59. aider/help_pats.py +19 -0
  60. aider/history.py +178 -0
  61. aider/io.py +1257 -0
  62. aider/linter.py +304 -0
  63. aider/llm.py +47 -0
  64. aider/main.py +1297 -0
  65. aider/mcp/__init__.py +94 -0
  66. aider/mcp/server.py +119 -0
  67. aider/mdstream.py +243 -0
  68. aider/models.py +1344 -0
  69. aider/onboarding.py +428 -0
  70. aider/openrouter.py +129 -0
  71. aider/prompts.py +56 -0
  72. aider/queries/tree-sitter-language-pack/README.md +7 -0
  73. aider/queries/tree-sitter-language-pack/arduino-tags.scm +5 -0
  74. aider/queries/tree-sitter-language-pack/c-tags.scm +9 -0
  75. aider/queries/tree-sitter-language-pack/chatito-tags.scm +16 -0
  76. aider/queries/tree-sitter-language-pack/clojure-tags.scm +7 -0
  77. aider/queries/tree-sitter-language-pack/commonlisp-tags.scm +122 -0
  78. aider/queries/tree-sitter-language-pack/cpp-tags.scm +15 -0
  79. aider/queries/tree-sitter-language-pack/csharp-tags.scm +26 -0
  80. aider/queries/tree-sitter-language-pack/d-tags.scm +26 -0
  81. aider/queries/tree-sitter-language-pack/dart-tags.scm +92 -0
  82. aider/queries/tree-sitter-language-pack/elisp-tags.scm +5 -0
  83. aider/queries/tree-sitter-language-pack/elixir-tags.scm +54 -0
  84. aider/queries/tree-sitter-language-pack/elm-tags.scm +19 -0
  85. aider/queries/tree-sitter-language-pack/gleam-tags.scm +41 -0
  86. aider/queries/tree-sitter-language-pack/go-tags.scm +42 -0
  87. aider/queries/tree-sitter-language-pack/java-tags.scm +20 -0
  88. aider/queries/tree-sitter-language-pack/javascript-tags.scm +88 -0
  89. aider/queries/tree-sitter-language-pack/lua-tags.scm +34 -0
  90. aider/queries/tree-sitter-language-pack/matlab-tags.scm +10 -0
  91. aider/queries/tree-sitter-language-pack/ocaml-tags.scm +115 -0
  92. aider/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +98 -0
  93. aider/queries/tree-sitter-language-pack/pony-tags.scm +39 -0
  94. aider/queries/tree-sitter-language-pack/properties-tags.scm +5 -0
  95. aider/queries/tree-sitter-language-pack/python-tags.scm +14 -0
  96. aider/queries/tree-sitter-language-pack/r-tags.scm +21 -0
  97. aider/queries/tree-sitter-language-pack/racket-tags.scm +12 -0
  98. aider/queries/tree-sitter-language-pack/ruby-tags.scm +64 -0
  99. aider/queries/tree-sitter-language-pack/rust-tags.scm +60 -0
  100. aider/queries/tree-sitter-language-pack/solidity-tags.scm +43 -0
  101. aider/queries/tree-sitter-language-pack/swift-tags.scm +51 -0
  102. aider/queries/tree-sitter-language-pack/udev-tags.scm +20 -0
  103. aider/queries/tree-sitter-languages/README.md +23 -0
  104. aider/queries/tree-sitter-languages/c-tags.scm +9 -0
  105. aider/queries/tree-sitter-languages/c_sharp-tags.scm +46 -0
  106. aider/queries/tree-sitter-languages/cpp-tags.scm +15 -0
  107. aider/queries/tree-sitter-languages/dart-tags.scm +91 -0
  108. aider/queries/tree-sitter-languages/elisp-tags.scm +8 -0
  109. aider/queries/tree-sitter-languages/elixir-tags.scm +54 -0
  110. aider/queries/tree-sitter-languages/elm-tags.scm +19 -0
  111. aider/queries/tree-sitter-languages/go-tags.scm +30 -0
  112. aider/queries/tree-sitter-languages/hcl-tags.scm +77 -0
  113. aider/queries/tree-sitter-languages/java-tags.scm +20 -0
  114. aider/queries/tree-sitter-languages/javascript-tags.scm +88 -0
  115. aider/queries/tree-sitter-languages/kotlin-tags.scm +27 -0
  116. aider/queries/tree-sitter-languages/matlab-tags.scm +10 -0
  117. aider/queries/tree-sitter-languages/ocaml-tags.scm +115 -0
  118. aider/queries/tree-sitter-languages/ocaml_interface-tags.scm +98 -0
  119. aider/queries/tree-sitter-languages/php-tags.scm +26 -0
  120. aider/queries/tree-sitter-languages/python-tags.scm +12 -0
  121. aider/queries/tree-sitter-languages/ql-tags.scm +26 -0
  122. aider/queries/tree-sitter-languages/ruby-tags.scm +64 -0
  123. aider/queries/tree-sitter-languages/rust-tags.scm +60 -0
  124. aider/queries/tree-sitter-languages/scala-tags.scm +65 -0
  125. aider/queries/tree-sitter-languages/typescript-tags.scm +41 -0
  126. aider/reasoning_tags.py +82 -0
  127. aider/repo.py +621 -0
  128. aider/repomap.py +988 -0
  129. aider/report.py +200 -0
  130. aider/resources/__init__.py +3 -0
  131. aider/resources/model-metadata.json +699 -0
  132. aider/resources/model-settings.yml +2046 -0
  133. aider/run_cmd.py +132 -0
  134. aider/scrape.py +284 -0
  135. aider/sendchat.py +61 -0
  136. aider/special.py +203 -0
  137. aider/tools/__init__.py +26 -0
  138. aider/tools/command.py +58 -0
  139. aider/tools/command_interactive.py +53 -0
  140. aider/tools/delete_block.py +120 -0
  141. aider/tools/delete_line.py +112 -0
  142. aider/tools/delete_lines.py +137 -0
  143. aider/tools/extract_lines.py +276 -0
  144. aider/tools/grep.py +171 -0
  145. aider/tools/indent_lines.py +155 -0
  146. aider/tools/insert_block.py +211 -0
  147. aider/tools/list_changes.py +51 -0
  148. aider/tools/ls.py +49 -0
  149. aider/tools/make_editable.py +46 -0
  150. aider/tools/make_readonly.py +29 -0
  151. aider/tools/remove.py +48 -0
  152. aider/tools/replace_all.py +77 -0
  153. aider/tools/replace_line.py +125 -0
  154. aider/tools/replace_lines.py +160 -0
  155. aider/tools/replace_text.py +125 -0
  156. aider/tools/show_numbered_context.py +101 -0
  157. aider/tools/tool_utils.py +313 -0
  158. aider/tools/undo_change.py +60 -0
  159. aider/tools/view.py +13 -0
  160. aider/tools/view_files_at_glob.py +65 -0
  161. aider/tools/view_files_matching.py +103 -0
  162. aider/tools/view_files_with_symbol.py +121 -0
  163. aider/urls.py +17 -0
  164. aider/utils.py +454 -0
  165. aider/versioncheck.py +113 -0
  166. aider/voice.py +187 -0
  167. aider/waiting.py +221 -0
  168. aider/watch.py +318 -0
  169. aider/watch_prompts.py +12 -0
  170. aider/website/Gemfile +8 -0
  171. aider/website/_includes/blame.md +162 -0
  172. aider/website/_includes/get-started.md +22 -0
  173. aider/website/_includes/help-tip.md +5 -0
  174. aider/website/_includes/help.md +24 -0
  175. aider/website/_includes/install.md +5 -0
  176. aider/website/_includes/keys.md +4 -0
  177. aider/website/_includes/model-warnings.md +67 -0
  178. aider/website/_includes/multi-line.md +22 -0
  179. aider/website/_includes/python-m-aider.md +5 -0
  180. aider/website/_includes/recording.css +228 -0
  181. aider/website/_includes/recording.md +34 -0
  182. aider/website/_includes/replit-pipx.md +9 -0
  183. aider/website/_includes/works-best.md +1 -0
  184. aider/website/_sass/custom/custom.scss +103 -0
  185. aider/website/docs/config/adv-model-settings.md +2260 -0
  186. aider/website/docs/config/aider_conf.md +548 -0
  187. aider/website/docs/config/api-keys.md +90 -0
  188. aider/website/docs/config/dotenv.md +493 -0
  189. aider/website/docs/config/editor.md +127 -0
  190. aider/website/docs/config/mcp.md +95 -0
  191. aider/website/docs/config/model-aliases.md +104 -0
  192. aider/website/docs/config/options.md +890 -0
  193. aider/website/docs/config/reasoning.md +210 -0
  194. aider/website/docs/config.md +44 -0
  195. aider/website/docs/faq.md +384 -0
  196. aider/website/docs/git.md +76 -0
  197. aider/website/docs/index.md +47 -0
  198. aider/website/docs/install/codespaces.md +39 -0
  199. aider/website/docs/install/docker.md +57 -0
  200. aider/website/docs/install/optional.md +100 -0
  201. aider/website/docs/install/replit.md +8 -0
  202. aider/website/docs/install.md +115 -0
  203. aider/website/docs/languages.md +264 -0
  204. aider/website/docs/legal/contributor-agreement.md +111 -0
  205. aider/website/docs/legal/privacy.md +104 -0
  206. aider/website/docs/llms/anthropic.md +77 -0
  207. aider/website/docs/llms/azure.md +48 -0
  208. aider/website/docs/llms/bedrock.md +132 -0
  209. aider/website/docs/llms/cohere.md +34 -0
  210. aider/website/docs/llms/deepseek.md +32 -0
  211. aider/website/docs/llms/gemini.md +49 -0
  212. aider/website/docs/llms/github.md +111 -0
  213. aider/website/docs/llms/groq.md +36 -0
  214. aider/website/docs/llms/lm-studio.md +39 -0
  215. aider/website/docs/llms/ollama.md +75 -0
  216. aider/website/docs/llms/openai-compat.md +39 -0
  217. aider/website/docs/llms/openai.md +58 -0
  218. aider/website/docs/llms/openrouter.md +78 -0
  219. aider/website/docs/llms/other.md +111 -0
  220. aider/website/docs/llms/vertex.md +50 -0
  221. aider/website/docs/llms/warnings.md +10 -0
  222. aider/website/docs/llms/xai.md +53 -0
  223. aider/website/docs/llms.md +54 -0
  224. aider/website/docs/more/analytics.md +127 -0
  225. aider/website/docs/more/edit-formats.md +116 -0
  226. aider/website/docs/more/infinite-output.md +159 -0
  227. aider/website/docs/more-info.md +8 -0
  228. aider/website/docs/recordings/auto-accept-architect.md +31 -0
  229. aider/website/docs/recordings/dont-drop-original-read-files.md +35 -0
  230. aider/website/docs/recordings/index.md +21 -0
  231. aider/website/docs/recordings/model-accepts-settings.md +69 -0
  232. aider/website/docs/recordings/tree-sitter-language-pack.md +80 -0
  233. aider/website/docs/repomap.md +112 -0
  234. aider/website/docs/scripting.md +100 -0
  235. aider/website/docs/troubleshooting/aider-not-found.md +24 -0
  236. aider/website/docs/troubleshooting/edit-errors.md +76 -0
  237. aider/website/docs/troubleshooting/imports.md +62 -0
  238. aider/website/docs/troubleshooting/models-and-keys.md +54 -0
  239. aider/website/docs/troubleshooting/support.md +79 -0
  240. aider/website/docs/troubleshooting/token-limits.md +96 -0
  241. aider/website/docs/troubleshooting/warnings.md +12 -0
  242. aider/website/docs/troubleshooting.md +11 -0
  243. aider/website/docs/usage/browser.md +57 -0
  244. aider/website/docs/usage/caching.md +49 -0
  245. aider/website/docs/usage/commands.md +133 -0
  246. aider/website/docs/usage/conventions.md +119 -0
  247. aider/website/docs/usage/copypaste.md +121 -0
  248. aider/website/docs/usage/images-urls.md +48 -0
  249. aider/website/docs/usage/lint-test.md +118 -0
  250. aider/website/docs/usage/modes.md +211 -0
  251. aider/website/docs/usage/not-code.md +179 -0
  252. aider/website/docs/usage/notifications.md +87 -0
  253. aider/website/docs/usage/tips.md +79 -0
  254. aider/website/docs/usage/tutorials.md +30 -0
  255. aider/website/docs/usage/voice.md +121 -0
  256. aider/website/docs/usage/watch.md +294 -0
  257. aider/website/docs/usage.md +102 -0
  258. aider/website/share/index.md +101 -0
  259. aider_ce-0.87.2.dev9.dist-info/METADATA +543 -0
  260. aider_ce-0.87.2.dev9.dist-info/RECORD +264 -0
  261. aider_ce-0.87.2.dev9.dist-info/WHEEL +5 -0
  262. aider_ce-0.87.2.dev9.dist-info/entry_points.txt +3 -0
  263. aider_ce-0.87.2.dev9.dist-info/licenses/LICENSE.txt +202 -0
  264. aider_ce-0.87.2.dev9.dist-info/top_level.txt +1 -0
aider/__init__.py ADDED
@@ -0,0 +1,20 @@
1
+ from packaging import version
2
+
3
+ __version__ = "0.87.2.dev"
4
+ safe_version = __version__
5
+
6
+ try:
7
+ from aider._version import __version__
8
+ except Exception:
9
+ __version__ = safe_version + "+import"
10
+
11
+ if type(__version__) is not str:
12
+ __version__ = safe_version + "+type"
13
+ else:
14
+ try:
15
+ if version.parse(__version__) < version.parse(safe_version):
16
+ __version__ = safe_version + "+less"
17
+ except Exception:
18
+ __version__ = safe_version + "+parse"
19
+
20
+ __all__ = [__version__]
aider/__main__.py ADDED
@@ -0,0 +1,4 @@
1
+ from .main import main
2
+
3
+ if __name__ == "__main__":
4
+ main()
aider/_version.py ADDED
@@ -0,0 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '0.87.2.dev9'
32
+ __version_tuple__ = version_tuple = (0, 87, 2, 'dev9')
33
+
34
+ __commit_id__ = commit_id = None
aider/analytics.py ADDED
@@ -0,0 +1,258 @@
1
+ import json
2
+ import platform
3
+ import sys
4
+ import time
5
+ import uuid
6
+ from pathlib import Path
7
+
8
+ from mixpanel import MixpanelException
9
+ from posthog import Posthog
10
+
11
+ from aider import __version__
12
+ from aider.dump import dump # noqa: F401
13
+ from aider.models import model_info_manager
14
+
15
+ PERCENT = 10
16
+
17
+
18
+ def compute_hex_threshold(percent):
19
+ """Convert percentage to 6-digit hex threshold.
20
+
21
+ Args:
22
+ percent: Percentage threshold (0-100)
23
+
24
+ Returns:
25
+ str: 6-digit hex threshold
26
+ """
27
+ return format(int(0xFFFFFF * percent / 100), "06x")
28
+
29
+
30
+ def is_uuid_in_percentage(uuid_str, percent):
31
+ """Check if a UUID string falls within the first X percent of the UUID space.
32
+
33
+ Args:
34
+ uuid_str: UUID string to test
35
+ percent: Percentage threshold (0-100)
36
+
37
+ Returns:
38
+ bool: True if UUID falls within the first X percent
39
+ """
40
+ if not (0 <= percent <= 100):
41
+ raise ValueError("Percentage must be between 0 and 100")
42
+
43
+ if not uuid_str:
44
+ return False
45
+
46
+ # Convert percentage to hex threshold (1% = "04...", 10% = "1a...", etc)
47
+ # Using first 6 hex digits
48
+ if percent == 0:
49
+ return False
50
+
51
+ threshold = compute_hex_threshold(percent)
52
+ return uuid_str[:6] <= threshold
53
+
54
+
55
+ mixpanel_project_token = "6da9a43058a5d1b9f3353153921fb04d"
56
+ posthog_project_api_key = "phc_99T7muzafUMMZX15H8XePbMSreEUzahHbtWjy3l5Qbv"
57
+ posthog_host = "https://us.i.posthog.com"
58
+
59
+
60
+ class Analytics:
61
+ # providers
62
+ mp = None
63
+ ph = None
64
+
65
+ # saved
66
+ user_id = None
67
+ permanently_disable = None
68
+ asked_opt_in = None
69
+
70
+ # ephemeral
71
+ logfile = None
72
+
73
+ def __init__(
74
+ self,
75
+ logfile=None,
76
+ permanently_disable=False,
77
+ posthog_host=None,
78
+ posthog_project_api_key=None,
79
+ ):
80
+ self.logfile = logfile
81
+ self.get_or_create_uuid()
82
+ self.custom_posthog_host = posthog_host
83
+ self.custom_posthog_project_api_key = posthog_project_api_key
84
+
85
+ if self.permanently_disable or permanently_disable or not self.asked_opt_in:
86
+ self.disable(permanently_disable)
87
+
88
+ def enable(self):
89
+ if not self.user_id:
90
+ self.disable(False)
91
+ return
92
+
93
+ if self.permanently_disable:
94
+ self.disable(True)
95
+ return
96
+
97
+ if not self.asked_opt_in:
98
+ self.disable(False)
99
+ return
100
+
101
+ # self.mp = Mixpanel(mixpanel_project_token)
102
+ self.ph = Posthog(
103
+ project_api_key=self.custom_posthog_project_api_key or posthog_project_api_key,
104
+ host=self.custom_posthog_host or posthog_host,
105
+ on_error=self.posthog_error,
106
+ enable_exception_autocapture=True,
107
+ super_properties=self.get_system_info(), # Add system info to all events
108
+ )
109
+
110
+ def disable(self, permanently):
111
+ self.mp = None
112
+ self.ph = None
113
+
114
+ if permanently:
115
+ self.asked_opt_in = True
116
+ self.permanently_disable = True
117
+ self.save_data()
118
+
119
+ def need_to_ask(self, args_analytics):
120
+ if args_analytics is False:
121
+ return False
122
+
123
+ could_ask = not self.asked_opt_in and not self.permanently_disable
124
+ if not could_ask:
125
+ return False
126
+
127
+ if args_analytics is True:
128
+ return True
129
+
130
+ assert args_analytics is None, args_analytics
131
+
132
+ if not self.user_id:
133
+ return False
134
+
135
+ return is_uuid_in_percentage(self.user_id, PERCENT)
136
+
137
+ def get_data_file_path(self):
138
+ try:
139
+ data_file = Path.home() / ".aider" / "analytics.json"
140
+ data_file.parent.mkdir(parents=True, exist_ok=True)
141
+ return data_file
142
+ except OSError:
143
+ # If we can't create/access the directory, just disable analytics
144
+ self.disable(permanently=False)
145
+ return None
146
+
147
+ def get_or_create_uuid(self):
148
+ self.load_data()
149
+ if self.user_id:
150
+ return
151
+
152
+ self.user_id = str(uuid.uuid4())
153
+ self.save_data()
154
+
155
+ def load_data(self):
156
+ data_file = self.get_data_file_path()
157
+ if not data_file:
158
+ return
159
+
160
+ if data_file.exists():
161
+ try:
162
+ data = json.loads(data_file.read_text())
163
+ self.permanently_disable = data.get("permanently_disable")
164
+ self.user_id = data.get("uuid")
165
+ self.asked_opt_in = data.get("asked_opt_in", False)
166
+ except (json.decoder.JSONDecodeError, OSError):
167
+ self.disable(permanently=False)
168
+
169
+ def save_data(self):
170
+ data_file = self.get_data_file_path()
171
+ if not data_file:
172
+ return
173
+
174
+ data = dict(
175
+ uuid=self.user_id,
176
+ permanently_disable=self.permanently_disable,
177
+ asked_opt_in=self.asked_opt_in,
178
+ )
179
+
180
+ try:
181
+ data_file.write_text(json.dumps(data, indent=4))
182
+ except OSError:
183
+ # If we can't write the file, just disable analytics
184
+ self.disable(permanently=False)
185
+
186
+ def get_system_info(self):
187
+ return {
188
+ "python_version": sys.version.split()[0],
189
+ "os_platform": platform.system(),
190
+ "os_release": platform.release(),
191
+ "machine": platform.machine(),
192
+ "aider_version": __version__,
193
+ }
194
+
195
+ def _redact_model_name(self, model):
196
+ if not model:
197
+ return None
198
+
199
+ info = model_info_manager.get_model_from_cached_json_db(model.name)
200
+ if info:
201
+ return model.name
202
+ elif "/" in model.name:
203
+ return model.name.split("/")[0] + "/REDACTED"
204
+ return None
205
+
206
+ def posthog_error(self):
207
+ """disable posthog if we get an error"""
208
+ print("X" * 100)
209
+ # https://github.com/PostHog/posthog-python/blob/9e1bb8c58afaa229da24c4fb576c08bb88a75752/posthog/consumer.py#L86
210
+ # https://github.com/Aider-AI/aider/issues/2532
211
+ self.ph = None
212
+
213
+ def event(self, event_name, main_model=None, **kwargs):
214
+ if not self.mp and not self.ph and not self.logfile:
215
+ return
216
+
217
+ properties = {}
218
+
219
+ if main_model:
220
+ properties["main_model"] = self._redact_model_name(main_model)
221
+ properties["weak_model"] = self._redact_model_name(main_model.weak_model)
222
+ properties["editor_model"] = self._redact_model_name(main_model.editor_model)
223
+
224
+ properties.update(kwargs)
225
+
226
+ # Handle numeric values
227
+ for key, value in properties.items():
228
+ if isinstance(value, (int, float)):
229
+ properties[key] = value
230
+ else:
231
+ properties[key] = str(value)
232
+
233
+ if self.mp:
234
+ try:
235
+ self.mp.track(self.user_id, event_name, dict(properties))
236
+ except MixpanelException:
237
+ self.mp = None # Disable mixpanel on connection errors
238
+
239
+ if self.ph:
240
+ self.ph.capture(event_name, distinct_id=self.user_id, properties=dict(properties))
241
+
242
+ if self.logfile:
243
+ log_entry = {
244
+ "event": event_name,
245
+ "properties": properties,
246
+ "user_id": self.user_id,
247
+ "time": int(time.time()),
248
+ }
249
+ try:
250
+ with open(self.logfile, "a") as f:
251
+ json.dump(log_entry, f)
252
+ f.write("\n")
253
+ except OSError:
254
+ pass # Ignore OS errors when writing to logfile
255
+
256
+
257
+ if __name__ == "__main__":
258
+ dump(compute_hex_threshold(PERCENT))