Are we tiny?#

gptme is intended to be small and simple, and focus on doing the right thing in the right way, rather than all the things in all the ways.

The benefits of this approach are many:

  • It is easier to understand and maintain.

  • It is easier to contribute to.

  • It is easier to learn.

  • It is easier to extend.

  • It is more fun to work on.

Being aggressive about keeping things small and simple is a way to keep the project maintainable and fun to work on. The fastest way to kill a project is to make it too big and complex, and suffer burnout as a result.

Another major benefit of keeping things small and simple is that it makes it easier for AI to understand and work with the codebase. This is a major goal of the project, and it is important to keep in mind that the simpler the codebase is, the easier it will be for AI to work with it:

“The simpler your API is, the more effectively the AI can harness it when generating code.”

Kenneth Reitz (and many others)

To that end, in this document we will present some statistics about the current state of the project, trying to be mindful to keep an eye on this page and make sure we are not growing too much.

Startup time#

$ make bench-import
make[2]: Entering directory '/home/runner/work/gptme/gptme'
Benchmarking import time for gptme
time poetry run python -X importtime -m gptme --model openai --non-interactive 2>&1 | grep "import time" | cut -d'|' -f 2- | sort -n | tail -n 10
     346042 |               mcp.types
     346273 |             gptme.mcp.client
     346393 |           gptme.mcp
     346423 |         gptme.mcp.client
     346619 |       gptme.tools.mcp_adapter
     408751 |   openai.types
     469536 |     gptme.prompts
     551732 | openai
     902411 |   gptme.cli
     957310 | gptme

real	0m2.927s
user	0m2.555s
sys	0m0.390s
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
$ make bench-startup
make[2]: Entering directory '/home/runner/work/gptme/gptme'
Benchmarking startup time for gptme
hyperfine "poetry run gptme '/exit'" -M 5 || poetry run gptme '/exit' || exit 1
Benchmark 1: poetry run gptme '/exit'
  Time (mean ± σ):      2.634 s ±  0.026 s    [User: 2.303 s, System: 0.326 s]
  Range (min … max):    2.607 s …  2.675 s    5 runs
 
make[2]: Leaving directory '/home/runner/work/gptme/gptme'

Lines of code#

LoC Core#

$ make cloc-core
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/*.py gptme/llm/*.py gptme/util/*.py gptme/tools/__init__.py gptme/tools/base.py --by-file
github.com/AlDanial/cloc v 1.98  T=0.10 s (476.2 files/s, 136145.3 lines/s)
-----------------------------------------------------------------------------------
File                                            blank        comment           code
-----------------------------------------------------------------------------------
gptme/config.py                                   139            112            506
gptme/llm/llm_openai.py                           112             62            480
gptme/llm/models.py                                74             59            478
gptme/setup.py                                    107             55            462
gptme/tools/base.py                               107            102            429
gptme/llm/llm_anthropic.py                         88             73            418
gptme/util/cli.py                                 114             55            388
gptme/commands.py                                  99             67            383
gptme/prompts.py                                  114            133            380
gptme/logmanager.py                                82             68            363
gptme/chat.py                                      71             75            342
gptme/util/context.py                              86            124            337
gptme/cli.py                                       49             37            302
gptme/util/prompt.py                               76             98            296
gptme/llm/__init__.py                              62             53            246
gptme/message.py                                   60             65            243
gptme/telemetry.py                                 71             31            240
gptme/util/gh.py                                   50             57            239
gptme/ncurses.py                                   39              5            238
gptme/util/_sound_sounddevice.py                   52             52            208
gptme/util/ask_execute.py                          53             46            203
gptme/util/sound.py                                65             72            200
gptme/util/_telemetry.py                           44             28            184
gptme/tools/__init__.py                            60             38            181
gptme/hooks.py                                     58             50            172
gptme/llm/llm_openai_models.py                      2             11            169
gptme/util/__init__.py                             35             21            154
gptme/codeblock.py                                 30             57            122
gptme/util/auto_naming.py                          44             38            119
gptme/llm/utils.py                                 38             48            103
gptme/util/tree.py                                 21             13             91
gptme/util/export.py                               17             25             86
gptme/util/reduce.py                               24             32             75
gptme/util/generate_name.py                         5              6             69
gptme/init.py                                      20              8             68
gptme/util/_sound_cmd.py                           22             17             64
gptme/dirs.py                                      27             14             55
gptme/__version__.py                                9              7             45
gptme/util/cost.py                                 12             20             43
gptme/util/clipboard.py                             8              2             35
gptme/util/terminal.py                             23             21             34
gptme/wut.py                                       13             12             31
gptme/util/content.py                              12             14             24
gptme/util/useredit.py                             12             13             21
gptme/util/interrupt.py                            13             14             20
gptme/constants.py                                  9             11             15
gptme/__init__.py                                   1              1              8
gptme/__main__.py                                   1              0              3
-----------------------------------------------------------------------------------
SUM:                                             2330           2022           9372
-----------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'

LoC LLM#

$ make cloc-llm
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/llm/*.py --by-file
github.com/AlDanial/cloc v 1.98  T=0.02 s (280.8 files/s, 120566.1 lines/s)
---------------------------------------------------------------------------------
File                                          blank        comment           code
---------------------------------------------------------------------------------
gptme/llm/llm_openai.py                         112             62            480
gptme/llm/models.py                              74             59            478
gptme/llm/llm_anthropic.py                       88             73            418
gptme/llm/__init__.py                            62             53            246
gptme/llm/llm_openai_models.py                    2             11            169
gptme/llm/utils.py                               38             48            103
---------------------------------------------------------------------------------
SUM:                                            376            306           1894
---------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'

LoC Tools#

$ make cloc-tools
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/tools/*.py --by-file
github.com/AlDanial/cloc v 1.98  T=0.06 s (542.7 files/s, 149188.6 lines/s)
-------------------------------------------------------------------------------------
File                                              blank        comment           code
-------------------------------------------------------------------------------------
gptme/tools/shell.py                                142            145            614
gptme/tools/computer.py                             150            218            436
gptme/tools/base.py                                 107            102            429
gptme/tools/_browser_playwright.py                   89             29            259
gptme/tools/save.py                                  55             53            244
gptme/tools/tts.py                                  103            118            239
gptme/tools/autocompact.py                           85             84            238
gptme/tools/todo.py                                  85             95            211
gptme/tools/patch.py                                 46             61            200
gptme/tools/tmux.py                                  54             73            198
gptme/tools/__init__.py                              60             38            181
gptme/tools/precommit.py                             62             88            181
gptme/tools/morph.py                                 43             42            178
gptme/tools/python.py                                56             49            172
gptme/tools/mcp_adapter.py                           31             23            155
gptme/tools/chats.py                                 43             49            142
gptme/tools/rag.py                                   63             75            141
gptme/tools/_browser_thread.py                       23              4            117
gptme/tools/subagent.py                              37             29            105
gptme/tools/choice.py                                30             25            103
gptme/tools/complete.py                              29             31             85
gptme/tools/browser.py                               40             87             84
gptme/tools/autocommit.py                            36             61             70
gptme/tools/_browser_perplexity.py                   20             18             58
gptme/tools/vision.py                                19             12             53
gptme/tools/screenshot.py                            14             12             44
gptme/tools/_browser_lynx.py                          9             13             30
gptme/tools/youtube.py                               10              1             26
gptme/tools/gh.py                                    14             21             16
gptme/tools/read.py                                   6              8             13
-------------------------------------------------------------------------------------
SUM:                                               1561           1664           5022
-------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'

LoC Server#

$ make cloc-server
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/server --by-file
github.com/AlDanial/cloc v 1.98  T=0.03 s (469.7 files/s, 151735.0 lines/s)
------------------------------------------------------------------------------------------
File                                                   blank        comment           code
------------------------------------------------------------------------------------------
gptme/server/tasks_api.py                                171            110            580
gptme/server/api_v2_sessions.py                          138            112            542
gptme/server/openapi_docs.py                             176            140            455
gptme/server/api.py                                       84             79            337
gptme/server/static/main.js                               35             45            316
gptme/server/api_v2.py                                    68             45            301
gptme/server/server-api-improvements.md                   40              0            202
gptme/server/workspace_api.py                             57             55            170
gptme/server/static/index.html                            11             15            148
gptme/server/api_v2_agents.py                             37             28            147
gptme/server/static/style.css                             27              4            143
gptme/server/static/computer.html                          1              1             90
gptme/server/cli.py                                       19              8             79
gptme/server/api_v2_common.py                             48             24             69
gptme/server/__init__.py                                   2              3              3
gptme/server/__main__.py                                   1              0              3
------------------------------------------------------------------------------------------
SUM:                                                     915            669           3585
------------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'

LoC Tests#

$ make cloc-tests
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc tests --by-file
github.com/AlDanial/cloc v 1.98  T=0.06 s (876.3 files/s, 144597.3 lines/s)
--------------------------------------------------------------------------------------------
File                                                     blank        comment           code
--------------------------------------------------------------------------------------------
tests/test_config.py                                        92            203            388
tests/test_cli.py                                           85             52            319
tests/test_tools_shell.py                                   95            172            319
tests/test_llm_openai.py                                    28              0            244
tests/test_server_v2.py                                     67             33            228
tests/test_llm_anthropic.py                                 26              0            221
tests/test_codeblock.py                                    125            292            189
tests/conftest.py                                           57             33            185
tests/test_mcp.py                                           40             30            161
tests/test_hooks.py                                         89             23            153
tests/test_context.py                                       67             42            149
tests/test_tree.py                                          53             29            142
tests/test_dspy_integration.py                              55             33            137
tests/test_dspy_basic.py                                    49             31            132
tests/test_tool_use.py                                       8             18            132
tests/test_prompt.py                                        35             36            120
tests/test_tools_todo.py                                    53             46            117
tests/test_util_cli.py                                      34             28            105
tests/test_auto_naming.py                                   35             23            101
tests/test_tools_computer.py                                36             27             91
tests/test_auto_compact.py                                  39             29             89
tests/test_tools_patch.py                                   47            111             82
tests/test_server.py                                        26             10             79
tests/test_prompt_tools.py                                   4              4             77
tests/test_llm_models.py                                    27             14             75
tests/test_server_v2_auto_stepping.py                       17             11             74
tests/test_tools.py                                         44              5             74
tests/test_tools_save.py                                    16             10             65
tests/test_tools_tts.py                                     29             37             60
tests/test_server_v2_tool_confirmation.py                   16             14             55
tests/test_eval.py                                           8              9             49
tests/test_server_v2_sse.py                                 15             13             49
tests/test_chat_history.py                                  17             10             45
tests/test-integration.sh                                   22             36             43
tests/test_message.py                                       10             17             39
tests/test_reduce.py                                        10              2             39
tests/test_util.py                                          28             51             37
tests/test_tools_rag.py                                     14              7             35
tests/test_dspy_gepa.py                                     13              9             31
tests/test_chat.py                                          16             28             28
tests/test_telemetry.py                                     20             15             28
tests/test_chat_config.py                                    8              7             26
tests/test_tools_python.py                                  19              1             26
tests/data/example-patch-codeblock.txt                       4              0             25
tests/data/example-interrupted.txt                           8              0             24
tests/test_browser.py                                       14             10             24
tests/test_prompts.py                                        8              5             19
tests/test_logmanager.py                                     8              5             18
tests/test_tools_chats.py                                    2              0             15
tests/test_tools_subagent.py                                 7             10             11
--------------------------------------------------------------------------------------------
SUM:                                                      1645           1631           4974
--------------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'

LoC Eval#

$ make cloc-eval
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/eval/**.py --by-file
github.com/AlDanial/cloc v 1.98  T=0.01 s (594.8 files/s, 82824.4 lines/s)
-------------------------------------------------------------------------------------
File                                   blank        comment           code
-------------------------------------------------------------------------------------
gptme/eval/main.py                        55             22            365
gptme/eval/run.py                         48             32            296
gptme/eval/agents.py                      16              6             84
gptme/eval/execenv.py                     10             14             55
gptme/eval/types.py                       14             12             37
gptme/eval/filestore.py                    5              2             32
gptme/eval/__init__.py                     1              0              4
gptme/eval/__main__.py                     1              0              3
-------------------------------------------------------------------------------------
SUM:                                     150             88            876
-------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'

LoC Total#

$ make cloc-total
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/eval/types.py gptme/eval/suites/basic.py gptme/eval/suites/browser.py gptme/eval/suites/__init__.py gptme/eval/suites/init_projects.py gptme/eval/execenv.py gptme/eval/main.py gptme/eval/filestore.py gptme/eval/agents.py gptme/eval/dspy/metrics.py gptme/eval/dspy/prompt_optimizer.py gptme/eval/dspy/signatures.py gptme/eval/dspy/cli.py gptme/eval/dspy/tasks.py gptme/eval/dspy/experiments.py gptme/eval/dspy/__main__.py gptme/eval/dspy/__init__.py gptme/eval/__main__.py gptme/eval/__init__.py gptme/eval/run.py gptme/mcp/client.py gptme/mcp/__init__.py gptme/setup.py gptme/llm/utils.py gptme/llm/llm_openai.py gptme/llm/llm_anthropic.py gptme/llm/llm_openai_models.py gptme/llm/__init__.py gptme/llm/models.py gptme/commands.py gptme/wut.py gptme/init.py gptme/server/api_v2_sessions.py gptme/server/workspace_api.py gptme/server/openapi_docs.py gptme/server/cli.py gptme/server/tasks_api.py gptme/server/api_v2_common.py gptme/server/api_v2_agents.py gptme/server/api_v2.py gptme/server/api.py gptme/server/__main__.py gptme/server/__init__.py gptme/ncurses.py gptme/cli.py gptme/constants.py gptme/chat.py gptme/codeblock.py gptme/prompts.py gptme/tools/subagent.py gptme/tools/save.py gptme/tools/_browser_playwright.py gptme/tools/patch.py gptme/tools/_browser_thread.py gptme/tools/todo.py gptme/tools/autocompact.py gptme/tools/_browser_perplexity.py gptme/tools/tts.py gptme/tools/youtube.py gptme/tools/morph.py gptme/tools/tmux.py gptme/tools/chats.py gptme/tools/rag.py gptme/tools/python.py gptme/tools/computer.py gptme/tools/mcp_adapter.py gptme/tools/complete.py gptme/tools/choice.py gptme/tools/gh.py gptme/tools/autocommit.py gptme/tools/vision.py gptme/tools/shell.py gptme/tools/browser.py gptme/tools/read.py gptme/tools/_browser_lynx.py gptme/tools/__init__.py gptme/tools/precommit.py gptme/tools/screenshot.py gptme/tools/base.py gptme/__version__.py gptme/message.py gptme/telemetry.py gptme/__main__.py gptme/logmanager.py gptme/config.py gptme/dirs.py gptme/__init__.py gptme/hooks.py gptme/util/context.py gptme/util/terminal.py gptme/util/interrupt.py gptme/util/cost.py gptme/util/export.py gptme/util/ask_execute.py gptme/util/_telemetry.py gptme/util/cli.py gptme/util/generate_name.py gptme/util/useredit.py gptme/util/reduce.py gptme/util/_sound_cmd.py gptme/util/prompt.py gptme/util/auto_naming.py gptme/util/tree.py gptme/util/sound.py gptme/util/clipboard.py gptme/util/gh.py gptme/util/_sound_sounddevice.py gptme/util/content.py gptme/util/__init__.py tests/test_tools_rag.py tests/test_tools.py tests/test_dspy_gepa.py tests/test_eval.py tests/test_llm_models.py tests/test_cli.py tests/test_auto_compact.py tests/test_tool_use.py tests/test_server_v2_tool_confirmation.py tests/test_llm_anthropic.py tests/test_chat_config.py tests/test_tools_computer.py tests/test_prompt.py tests/test_server_v2_auto_stepping.py tests/test_server_v2_sse.py tests/test_server.py tests/test_telemetry.py tests/test_util_cli.py tests/test_auto_naming.py tests/test_codeblock.py tests/test_browser.py tests/test_logmanager.py tests/test_tools_chats.py tests/test_config.py tests/test_prompts.py tests/test_reduce.py tests/test_tools_shell.py tests/test_llm_openai.py tests/test_tools_save.py tests/test_tools_tts.py tests/test_tools_subagent.py tests/test_tools_python.py tests/test_dspy_integration.py tests/test_hooks.py tests/test_context.py tests/test_tools_todo.py tests/test_tree.py tests/test_mcp.py tests/test_server_v2.py tests/conftest.py tests/test_message.py tests/test_chat.py tests/test_prompt_tools.py tests/test_util.py tests/test_dspy_basic.py tests/test_chat_history.py tests/test_tools_patch.py scripts/convert_convo.py scripts/auto_rename_logs.py scripts/list_user_messages.py scripts/check_rst_formatting.py scripts/gh-pr-view-with-pr-comments.py scripts/train/collect.py scripts/treeofthoughts.py scripts/gpt_todoer.py scripts/summarize_project.py scripts/reduce_context.py scripts/describe_api.py scripts/shorten_details.py  --by-file
github.com/AlDanial/cloc v 1.98  T=0.25 s (681.7 files/s, 159085.6 lines/s)
--------------------------------------------------------------------------------------------
File                                                     blank        comment           code
--------------------------------------------------------------------------------------------
gptme/tools/shell.py                                       142            145            614
gptme/server/tasks_api.py                                  171            110            580
gptme/server/api_v2_sessions.py                            138            112            542
gptme/config.py                                            139            112            506
gptme/llm/llm_openai.py                                    112             62            480
gptme/llm/models.py                                         74             59            478
gptme/setup.py                                             107             55            462
gptme/server/openapi_docs.py                               176            140            455
gptme/tools/computer.py                                    150            218            436
gptme/tools/base.py                                        107            102            429
gptme/llm/llm_anthropic.py                                  88             73            418
gptme/util/cli.py                                          114             55            388
tests/test_config.py                                        92            203            388
gptme/commands.py                                           99             67            383
gptme/prompts.py                                           114            133            380
gptme/eval/main.py                                          55             22            365
gptme/logmanager.py                                         82             68            363
gptme/eval/dspy/experiments.py                              94             60            351
gptme/chat.py                                               71             75            342
gptme/eval/dspy/metrics.py                                  97             98            342
gptme/eval/dspy/cli.py                                      70             57            341
gptme/server/api.py                                         84             79            337
gptme/util/context.py                                       86            124            337
tests/test_cli.py                                           85             52            319
tests/test_tools_shell.py                                   95            172            319
gptme/cli.py                                                49             37            302
gptme/server/api_v2.py                                      68             45            301
scripts/gh-pr-view-with-pr-comments.py                      55             36            298
gptme/eval/run.py                                           48             32            296
gptme/util/prompt.py                                        76             98            296
gptme/eval/dspy/prompt_optimizer.py                         66             40            290
gptme/tools/_browser_playwright.py                          89             29            259
gptme/eval/dspy/tasks.py                                    66             58            251
gptme/llm/__init__.py                                       62             53            246
gptme/tools/save.py                                         55             53            244
tests/test_llm_openai.py                                    28              0            244
gptme/message.py                                            60             65            243
gptme/telemetry.py                                          71             31            240
gptme/tools/tts.py                                         103            118            239
gptme/util/gh.py                                            50             57            239
gptme/ncurses.py                                            39              5            238
gptme/tools/autocompact.py                                  85             84            238
tests/test_server_v2.py                                     67             33            228
tests/test_llm_anthropic.py                                 26              0            221
gptme/tools/todo.py                                         85             95            211
gptme/util/_sound_sounddevice.py                            52             52            208
gptme/util/ask_execute.py                                   53             46            203
gptme/tools/patch.py                                        46             61            200
gptme/util/sound.py                                         65             72            200
gptme/tools/tmux.py                                         54             73            198
tests/test_codeblock.py                                    125            292            189
tests/conftest.py                                           57             33            185
gptme/util/_telemetry.py                                    44             28            184
gptme/tools/__init__.py                                     60             38            181
gptme/tools/precommit.py                                    62             88            181
gptme/tools/morph.py                                        43             42            178
scripts/reduce_context.py                                   59             72            177
gptme/hooks.py                                              58             50            172
gptme/tools/python.py                                       56             49            172
gptme/server/workspace_api.py                               57             55            170
gptme/llm/llm_openai_models.py                               2             11            169
tests/test_mcp.py                                           40             30            161
gptme/tools/mcp_adapter.py                                  31             23            155
gptme/util/__init__.py                                      35             21            154
tests/test_hooks.py                                         89             23            153
tests/test_context.py                                       67             42            149
gptme/server/api_v2_agents.py                               37             28            147
scripts/check_rst_formatting.py                             41             52            147
gptme/tools/chats.py                                        43             49            142
tests/test_tree.py                                          53             29            142
gptme/tools/rag.py                                          63             75            141
tests/test_dspy_integration.py                              55             33            137
gptme/mcp/client.py                                         32             11            136
tests/test_dspy_basic.py                                    49             31            132
tests/test_tool_use.py                                       8             18            132
gptme/codeblock.py                                          30             57            122
tests/test_prompt.py                                        35             36            120
gptme/util/auto_naming.py                                   44             38            119
gptme/tools/_browser_thread.py                              23              4            117
tests/test_tools_todo.py                                    53             46            117
scripts/auto_rename_logs.py                                 33             23            114
scripts/gpt_todoer.py                                       47             25            107
gptme/tools/subagent.py                                     37             29            105
tests/test_util_cli.py                                      34             28            105
gptme/llm/utils.py                                          38             48            103
gptme/tools/choice.py                                       30             25            103
scripts/train/collect.py                                    34             52            103
tests/test_auto_naming.py                                   35             23            101
scripts/treeofthoughts.py                                   33             35             97
gptme/util/tree.py                                          21             13             91
tests/test_tools_computer.py                                36             27             91
tests/test_auto_compact.py                                  39             29             89
gptme/util/export.py                                        17             25             86
gptme/tools/complete.py                                     29             31             85
gptme/eval/agents.py                                        16              6             84
gptme/tools/browser.py                                      40             87             84
scripts/convert_convo.py                                    34             54             82
tests/test_tools_patch.py                                   47            111             82
gptme/server/cli.py                                         19              8             79
tests/test_server.py                                        26             10             79
tests/test_prompt_tools.py                                   4              4             77
gptme/util/reduce.py                                        24             32             75
tests/test_llm_models.py                                    27             14             75
tests/test_server_v2_auto_stepping.py                       17             11             74
tests/test_tools.py                                         44              5             74
gptme/tools/autocommit.py                                   36             61             70
gptme/eval/suites/basic.py                                  17              0             69
gptme/server/api_v2_common.py                               48             24             69
gptme/util/generate_name.py                                  5              6             69
gptme/init.py                                               20              8             68
tests/test_tools_save.py                                    16             10             65
gptme/util/_sound_cmd.py                                    22             17             64
gptme/eval/suites/init_projects.py                          21              1             62
tests/test_tools_tts.py                                     29             37             60
gptme/tools/_browser_perplexity.py                          20             18             58
gptme/eval/dspy/signatures.py                               19             21             56
gptme/dirs.py                                               27             14             55
gptme/eval/execenv.py                                       10             14             55
tests/test_server_v2_tool_confirmation.py                   16             14             55
scripts/describe_api.py                                     28             25             54
gptme/tools/vision.py                                       19             12             53
tests/test_eval.py                                           8              9             49
tests/test_server_v2_sse.py                                 15             13             49
gptme/__version__.py                                         9              7             45
tests/test_chat_history.py                                  17             10             45
gptme/tools/screenshot.py                                   14             12             44
gptme/util/cost.py                                          12             20             43
tests/test_message.py                                       10             17             39
tests/test_reduce.py                                        10              2             39
gptme/eval/types.py                                         14             12             37
tests/test_util.py                                          28             51             37
gptme/util/clipboard.py                                      8              2             35
tests/test_tools_rag.py                                     14              7             35
gptme/util/terminal.py                                      23             21             34
scripts/shorten_details.py                                  11              6             33
gptme/eval/filestore.py                                      5              2             32
scripts/list_user_messages.py                               10              9             32
gptme/wut.py                                                13             12             31
tests/test_dspy_gepa.py                                     13              9             31
gptme/tools/_browser_lynx.py                                 9             13             30
tests/test_chat.py                                          16             28             28
tests/test_telemetry.py                                     20             15             28
gptme/tools/youtube.py                                      10              1             26
scripts/summarize_project.py                                11              1             26
tests/test_chat_config.py                                    8              7             26
tests/test_tools_python.py                                  19              1             26
gptme/util/content.py                                       12             14             24
tests/test_browser.py                                       14             10             24
gptme/util/useredit.py                                      12             13             21
gptme/util/interrupt.py                                     13             14             20
gptme/eval/suites/__init__.py                                3              0             19
tests/test_prompts.py                                        8              5             19
tests/test_logmanager.py                                     8              5             18
gptme/eval/suites/browser.py                                 5              0             17
gptme/tools/gh.py                                           14             21             16
gptme/constants.py                                           9             11             15
tests/test_tools_chats.py                                    2              0             15
gptme/tools/read.py                                          6              8             13
tests/test_tools_subagent.py                                 7             10             11
gptme/__init__.py                                            1              1              8
gptme/eval/dspy/__init__.py                                  6              6              7
gptme/eval/__init__.py                                       1              0              4
gptme/__main__.py                                            1              0              3
gptme/eval/__main__.py                                       1              0              3
gptme/eval/dspy/__main__.py                                  3              5              3
gptme/server/__init__.py                                     2              3              3
gptme/server/__main__.py                                     1              0              3
gptme/mcp/__init__.py                                        1              0              2
--------------------------------------------------------------------------------------------
SUM:                                                      7182           6580          25444
--------------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'

Code Metrics#

$ make metrics
make[2]: Entering directory '/home/runner/work/gptme/gptme'
=== Code Metrics Summary ===

Project Overview:
  Files: 172
  Total blocks: 1441
  Average complexity: 4.454545454545454

Most Complex Functions (D+):
  gptme/eval/main.py
      F 199:0 main - D
  gptme/llm/llm_openai.py
      F 268:0 stream - D
      F 66:0 init - D
  gptme/llm/llm_anthropic.py
      F 471:0 _prepare_messages_for_api - D
      F 214:0 stream - D
  gptme/llm/__init__.py
      F 128:0 _reply_stream - D
  gptme/server/api_v2_sessions.py
      F 182:0 step - D
  gptme/server/openapi_docs.py
      F 521:0 _convert_to_openapi_nullable - D
  gptme/server/tasks_api.py
      F 357:0 get_git_status - D
  gptme/server/api_v2_agents.py
      F 56:0 api_agents_put - D
  gptme/cli.py
      F 143:0 main - D
  gptme/codeblock.py
      F 70:0 _extract_codeblocks - D
  gptme/prompts.py
      F 353:0 prompt_workspace - D
      F 492:0 prompt_chat_history - D
  gptme/tools/tmux.py
      F 150:0 execute_tmux - D
  gptme/tools/computer.py
      F 433:0 computer - D
  gptme/tools/shell.py
      M 255:4 ShellSession._run - E
  gptme/telemetry.py
      F 213:0 record_llm_request - D
  gptme/config.py
      F 658:0 setup_config_from_cli - D
      M 540:4 Config.mcp - D
  gptme/util/context.py
      F 443:0 _resource_to_codeblock - D
  gptme/util/ask_execute.py
      F 87:0 ask_execute - D
      F 206:0 execute_with_confirmation - D
  gptme/util/gh.py
      F 184:0 get_github_pr_content - D
  tests/test_server_v2_auto_stepping.py
      F 15:0 test_auto_stepping - D
  tests/test_config.py
      F 501:0 test_project_config_loaded_from_toml - D
      F 529:0 test_project_config_loaded_from_json - D
  scripts/auto_rename_logs.py
      F 30:0 auto_rename_logs - D
  scripts/check_rst_formatting.py
      F 26:0 check_file - E
  scripts/gh-pr-view-with-pr-comments.py
      M 175:4 PRViewer.get_comments - D

Largest Files (>300 SLOC):
   657 gptme/tools/shell.py
   580 gptme/server/tasks_api.py
   564 tests/test_config.py
   542 gptme/server/api_v2_sessions.py
   508 gptme/config.py
   492 gptme/tools/computer.py
   489 gptme/llm/models.py
   481 gptme/llm/llm_openai.py
   479 gptme/server/openapi_docs.py
   471 gptme/setup.py
   454 tests/test_tools_shell.py
   435 gptme/tools/base.py
   427 gptme/prompts.py
   418 gptme/llm/llm_anthropic.py
   390 gptme/util/cli.py
   386 gptme/commands.py
   367 gptme/eval/main.py
   366 gptme/logmanager.py
   365 tests/test_codeblock.py
   359 gptme/util/context.py
   356 gptme/eval/dspy/experiments.py
   347 gptme/eval/dspy/metrics.py
   342 gptme/chat.py
   341 gptme/eval/dspy/cli.py
   338 gptme/server/api.py
   328 tests/test_cli.py
   316 gptme/util/prompt.py
   308 gptme/cli.py
   301 gptme/server/api_v2.py

make[3]: Entering directory '/home/runner/work/gptme/gptme'
Most Duplicated Files:
npm warn exec The following package was not found and will be installed: jscpd@4.0.5
Clone found (python):
 - gptme/util/_sound_sounddevice.py [95:5 - 106:67] (11 lines, 101 tokens)
   gptme/util/_sound_sounddevice.py [55:5 - 66:27]

Clone found (python):
 - gptme/server/api.py [169:5 - 179:43] (10 lines, 83 tokens)
   gptme/server/api_v2.py [154:5 - 164:4]

Clone found (python):
 - gptme/server/api.py [180:5 - 186:2] (6 lines, 90 tokens)
   gptme/server/api_v2.py [164:5 - 170:2]

Clone found (python):
 - gptme/mcp/client.py [102:13 - 109:3] (7 lines, 75 tokens)
   gptme/mcp/client.py [68:13 - 73:21]

Clone found (python):
 - gptme/llm/llm_openai.py [271:5 - 287:15] (16 lines, 119 tokens)
   gptme/llm/llm_openai.py [191:5 - 206:5]

Clone found (python):
 - gptme/llm/llm_anthropic.py [232:7 - 245:3] (13 lines, 108 tokens)
   gptme/llm/llm_anthropic.py [182:7 - 196:8]

Clone found (python):
 - gptme/eval/dspy/cli.py [293:31 - 308:49] (15 lines, 104 tokens)
   gptme/eval/dspy/cli.py [77:1 - 92:7]

Clone found (python):
 - gptme/eval/dspy/cli.py [400:12 - 416:46] (16 lines, 93 tokens)
   gptme/eval/dspy/cli.py [143:9 - 159:41]

Clone found (python):
 - gptme/eval/dspy/cli.py [427:13 - 433:15] (6 lines, 84 tokens)
   gptme/eval/dspy/cli.py [170:13 - 175:17]

Clone found (python):
 - scripts/generate_sounds.py [165:2 - 173:13] (8 lines, 81 tokens)
   scripts/generate_sounds.py [91:2 - 99:11]

Clone found (python):
 - gptme/telemetry.py [306:5 - 317:11] (11 lines, 90 tokens)
   gptme/telemetry.py [72:9 - 83:10]

┌────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐
│ Format     │ Files analyzed │ Total lines │ Total tokens │ Clones found │ Duplicated lines │ Duplicated tokens │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ python     │ 123            │ 32297       │ 220249       │ 11           │ 119 (0.37%)      │ 1028 (0.47%)      │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ css        │ 1              │ 173         │ 1045         │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ javascript │ 1              │ 395         │ 3314         │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ markup     │ 2              │ 264         │ 2183         │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ markdown   │ 4              │ 861         │ 5685         │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ bash       │ 8              │ 313         │ 1491         │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ url        │ 1              │ 2           │ 16           │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ Total:     │ 140            │ 34305       │ 233983       │ 11           │ 119 (0.35%)      │ 1028 (0.44%)      │
└────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘
Found 11 clones.
Detection time:: 2.353s
make[3]: Leaving directory '/home/runner/work/gptme/gptme'
make[2]: Leaving directory '/home/runner/work/gptme/gptme'

The metrics above show:

  • Project Overview: Basic stats about the codebase size and complexity

  • Complex Functions: Functions rated D+ (high complexity, should be refactored)

  • Large Files: Files over 300 SLOC (should be split into smaller modules)

  • Duplicated Files: Using jscpd to find duplicated code

We should aim to:

  • Keep average complexity below 4.0

  • Have no E-rated functions (extremely complex)

  • Have few D-rated functions (very complex)

  • Keep files under 300 SLOC where possible