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-importtime
...
256660 | gptme.tools.mcp_adapter
263888 | gptme.chat
381223 | gptme.prompts
661839 | gptme.cli
715590 | gptme
real 0m1.575s
user 0m1.372s
sys 0m0.217s
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.07 s (541.1 files/s, 149907.4 lines/s)
---------------------------------------------------------------------------------
File blank comment code
---------------------------------------------------------------------------------
gptme/config.py 135 92 471
gptme/llm/llm_openai.py 107 58 447
gptme/llm/llm_anthropic.py 93 75 424
gptme/llm/models.py 69 52 409
gptme/util/context.py 113 171 376
gptme/tools/base.py 90 80 361
gptme/logmanager.py 75 62 340
gptme/cli.py 54 53 315
gptme/chat.py 70 71 312
gptme/prompts.py 84 101 306
gptme/util/cli.py 82 49 296
gptme/util/prompt.py 76 98 296
gptme/commands.py 77 43 288
gptme/llm/__init__.py 68 66 263
gptme/util/sound.py 69 56 253
gptme/message.py 60 65 242
gptme/ncurses.py 39 5 238
gptme/util/ask_execute.py 53 46 203
gptme/tools/__init__.py 56 34 166
gptme/telemetry.py 57 32 158
gptme/util/__init__.py 35 21 154
gptme/llm/llm_openai_models.py 2 10 142
gptme/codeblock.py 26 33 92
gptme/util/export.py 17 25 86
gptme/init.py 24 16 81
gptme/util/reduce.py 24 32 75
gptme/util/generate_name.py 5 6 69
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/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: 1788 1567 7173
---------------------------------------------------------------------------------
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 (264.8 files/s, 121002.3 lines/s)
---------------------------------------------------------------------------------
File blank comment code
---------------------------------------------------------------------------------
gptme/llm/llm_openai.py 107 58 447
gptme/llm/llm_anthropic.py 93 75 424
gptme/llm/models.py 69 52 409
gptme/llm/__init__.py 68 66 263
gptme/llm/llm_openai_models.py 2 10 142
---------------------------------------------------------------------------------
SUM: 339 261 1685
---------------------------------------------------------------------------------
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.04 s (546.7 files/s, 142714.8 lines/s)
-------------------------------------------------------------------------------------
File blank comment code
-------------------------------------------------------------------------------------
gptme/tools/computer.py 150 218 436
gptme/tools/shell.py 96 92 420
gptme/tools/base.py 90 80 361
gptme/tools/tts.py 104 120 247
gptme/tools/_browser_playwright.py 75 26 224
gptme/tools/tmux.py 52 72 211
gptme/tools/save.py 44 43 205
gptme/tools/patch.py 46 61 200
gptme/tools/morph.py 44 55 175
gptme/tools/python.py 56 49 172
gptme/tools/__init__.py 56 34 166
gptme/tools/mcp_adapter.py 31 23 155
gptme/tools/chats.py 43 49 142
gptme/tools/rag.py 63 75 141
gptme/tools/subagent.py 37 29 105
gptme/tools/_browser_thread.py 20 3 97
gptme/tools/browser.py 37 78 75
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: 1116 1174 3714
-------------------------------------------------------------------------------------
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 (473.5 files/s, 149481.6 lines/s)
------------------------------------------------------------------------------------------
File blank comment code
------------------------------------------------------------------------------------------
gptme/server/tasks_api.py 165 104 586
gptme/server/api_v2_sessions.py 133 109 529
gptme/server/openapi_docs.py 175 139 448
gptme/server/api.py 84 79 338
gptme/server/static/main.js 35 45 316
gptme/server/api_v2.py 59 36 264
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/static/style.css 27 4 143
gptme/server/api_v2_agents.py 32 23 138
gptme/server/static/computer.html 1 1 90
gptme/server/cli.py 19 8 79
gptme/server/api_v2_common.py 45 23 64
gptme/server/__init__.py 2 3 3
gptme/server/__main__.py 1 0 3
------------------------------------------------------------------------------------------
SUM: 886 644 3521
------------------------------------------------------------------------------------------
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.04 s (934.1 files/s, 130952.2 lines/s)
--------------------------------------------------------------------------------------------
File blank comment code
--------------------------------------------------------------------------------------------
tests/test_config.py 80 188 316
tests/test_cli.py 81 48 312
tests/test_llm_openai.py 28 0 244
tests/test_server_v2.py 68 33 231
tests/test_llm_anthropic.py 26 0 221
tests/conftest.py 57 31 183
tests/test_mcp.py 33 24 143
tests/test_tool_use.py 8 18 132
tests/test_prompt.py 35 36 120
tests/test_shell.py 35 68 108
tests/test_util_cli.py 34 28 106
tests/test_tools_computer.py 36 27 91
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_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_codeblock.py 32 61 61
tests/test_tools_tts.py 29 37 60
tests/test_context.py 18 13 58
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-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_chat.py 18 28 34
tests/test_chat_config.py 8 7 26
tests/test_tools_python.py 19 1 26
tests/test_browser.py 14 10 24
tests/test_prompts.py 8 4 19
tests/test_logmanager.py 8 5 18
tests/test_tools_chats.py 2 0 15
tests/test_tools_shell.py 9 11 13
tests/test_tools_subagent.py 7 10 11
--------------------------------------------------------------------------------------------
SUM: 970 988 3369
--------------------------------------------------------------------------------------------
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 (602.0 files/s, 79620.6 lines/s)
-------------------------------------------------------------------------------------
File blank comment code
-------------------------------------------------------------------------------------
gptme/eval/main.py 55 22 359
gptme/eval/run.py 48 32 279
gptme/eval/agents.py 13 6 60
gptme/eval/execenv.py 10 14 55
gptme/eval/filestore.py 5 2 32
gptme/eval/types.py 13 12 32
gptme/eval/__init__.py 1 0 4
gptme/eval/__main__.py 1 0 3
-------------------------------------------------------------------------------------
SUM: 146 88 824
-------------------------------------------------------------------------------------
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/mcp/__init__.py gptme/mcp/client.py gptme/config.py gptme/llm/llm_openai_models.py gptme/llm/models.py gptme/llm/__init__.py gptme/llm/llm_openai.py gptme/llm/llm_anthropic.py gptme/ncurses.py gptme/commands.py gptme/server/api_v2_agents.py gptme/server/tasks_api.py gptme/server/api.py gptme/server/workspace_api.py gptme/server/openapi_docs.py gptme/server/api_v2_common.py gptme/server/__init__.py gptme/server/api_v2.py gptme/server/__main__.py gptme/server/api_v2_sessions.py gptme/server/cli.py gptme/message.py gptme/eval/agents.py gptme/eval/main.py gptme/eval/suites/basic.py gptme/eval/suites/browser.py gptme/eval/suites/init_projects.py gptme/eval/suites/__init__.py gptme/eval/execenv.py gptme/eval/filestore.py gptme/eval/run.py gptme/eval/types.py gptme/eval/__init__.py gptme/eval/__main__.py gptme/dirs.py gptme/tools/browser.py gptme/tools/base.py gptme/tools/rag.py gptme/tools/tts.py gptme/tools/_browser_thread.py gptme/tools/save.py gptme/tools/vision.py gptme/tools/screenshot.py gptme/tools/youtube.py gptme/tools/_browser_playwright.py gptme/tools/computer.py gptme/tools/shell.py gptme/tools/morph.py gptme/tools/tmux.py gptme/tools/chats.py gptme/tools/_browser_lynx.py gptme/tools/__init__.py gptme/tools/python.py gptme/tools/mcp_adapter.py gptme/tools/read.py gptme/tools/gh.py gptme/tools/subagent.py gptme/tools/patch.py gptme/logmanager.py gptme/codeblock.py gptme/init.py gptme/__init__.py gptme/prompts.py gptme/__main__.py gptme/wut.py gptme/cli.py gptme/constants.py gptme/telemetry.py gptme/chat.py gptme/__version__.py gptme/util/generate_name.py gptme/util/useredit.py gptme/util/prompt.py gptme/util/interrupt.py gptme/util/ask_execute.py gptme/util/terminal.py gptme/util/context.py gptme/util/reduce.py gptme/util/sound.py gptme/util/export.py gptme/util/clipboard.py gptme/util/__init__.py gptme/util/cost.py gptme/util/cli.py tests/test_mcp.py tests/test_tool_use.py tests/test_server_v2.py tests/test_llm_openai.py tests/test_chat_config.py tests/test_config.py tests/test_util.py tests/test_reduce.py tests/test_prompt.py tests/test_util_cli.py tests/test_browser.py tests/test_tools_rag.py tests/test_message.py tests/test_server_v2_sse.py tests/test_tools_save.py tests/test_llm_anthropic.py tests/test_codeblock.py tests/test_tools_shell.py tests/test_server_v2_tool_confirmation.py tests/test_server.py tests/test_prompt_tools.py tests/test_tools_subagent.py tests/test_cli.py tests/test_tools.py tests/test_tools_tts.py tests/test_logmanager.py tests/test_tools_chats.py tests/test_tools_patch.py tests/test_shell.py tests/test_server_v2_auto_stepping.py tests/conftest.py tests/test_chat.py tests/test_prompts.py tests/test_context.py tests/test_eval.py tests/test_tools_python.py tests/test_tools_computer.py scripts/shorten_details.py scripts/gpt_todoer.py scripts/reduce_context.py scripts/check_rst_formatting.py scripts/treeofthoughts.py scripts/summarize_project.py scripts/convert_convo.py scripts/auto_rename_logs.py scripts/gh-pr-view-with-pr-comments.py scripts/describe_api.py scripts/list_user_messages.py scripts/train/collect.py --by-file
github.com/AlDanial/cloc v 1.98 T=0.18 s (721.4 files/s, 153970.1 lines/s)
--------------------------------------------------------------------------------------------
File blank comment code
--------------------------------------------------------------------------------------------
gptme/server/tasks_api.py 165 104 586
gptme/server/api_v2_sessions.py 133 109 529
gptme/config.py 135 92 471
gptme/server/openapi_docs.py 175 139 448
gptme/llm/llm_openai.py 107 58 447
gptme/tools/computer.py 150 218 436
gptme/llm/llm_anthropic.py 93 75 424
gptme/tools/shell.py 96 92 420
gptme/llm/models.py 69 52 409
gptme/util/context.py 113 171 376
gptme/tools/base.py 90 80 361
gptme/eval/main.py 55 22 359
gptme/logmanager.py 75 62 340
gptme/server/api.py 84 79 338
tests/test_config.py 80 188 316
gptme/cli.py 54 53 315
gptme/chat.py 70 71 312
tests/test_cli.py 81 48 312
gptme/prompts.py 84 101 306
scripts/gh-pr-view-with-pr-comments.py 54 36 297
gptme/util/cli.py 82 49 296
gptme/util/prompt.py 76 98 296
gptme/commands.py 77 43 288
gptme/eval/run.py 48 32 279
gptme/server/api_v2.py 59 36 264
gptme/llm/__init__.py 68 66 263
gptme/util/sound.py 69 56 253
gptme/tools/tts.py 104 120 247
tests/test_llm_openai.py 28 0 244
gptme/message.py 60 65 242
gptme/ncurses.py 39 5 238
tests/test_server_v2.py 68 33 231
gptme/tools/_browser_playwright.py 75 26 224
tests/test_llm_anthropic.py 26 0 221
gptme/tools/tmux.py 52 72 211
gptme/tools/save.py 44 43 205
gptme/util/ask_execute.py 53 46 203
gptme/tools/patch.py 46 61 200
tests/conftest.py 57 31 183
scripts/reduce_context.py 59 72 177
gptme/tools/morph.py 44 55 175
gptme/tools/python.py 56 49 172
gptme/server/workspace_api.py 57 55 170
gptme/tools/__init__.py 56 34 166
gptme/telemetry.py 57 32 158
gptme/tools/mcp_adapter.py 31 23 155
gptme/util/__init__.py 35 21 154
scripts/check_rst_formatting.py 41 52 147
tests/test_mcp.py 33 24 143
gptme/llm/llm_openai_models.py 2 10 142
gptme/tools/chats.py 43 49 142
gptme/tools/rag.py 63 75 141
gptme/server/api_v2_agents.py 32 23 138
tests/test_tool_use.py 8 18 132
tests/test_prompt.py 35 36 120
scripts/auto_rename_logs.py 33 23 114
tests/test_shell.py 35 68 108
scripts/gpt_todoer.py 47 25 107
tests/test_util_cli.py 34 28 106
gptme/tools/subagent.py 37 29 105
gptme/mcp/client.py 26 9 104
scripts/train/collect.py 34 52 103
gptme/tools/_browser_thread.py 20 3 97
scripts/treeofthoughts.py 33 35 97
gptme/codeblock.py 26 33 92
tests/test_tools_computer.py 36 27 91
gptme/util/export.py 17 25 86
tests/test_tools_patch.py 47 111 82
gptme/init.py 24 16 81
scripts/convert_convo.py 33 54 81
gptme/server/cli.py 19 8 79
tests/test_server.py 26 10 79
tests/test_prompt_tools.py 4 4 77
gptme/tools/browser.py 37 78 75
gptme/util/reduce.py 24 32 75
tests/test_server_v2_auto_stepping.py 17 11 74
tests/test_tools.py 44 5 74
gptme/util/generate_name.py 5 6 69
tests/test_tools_save.py 16 10 65
gptme/server/api_v2_common.py 45 23 64
tests/test_codeblock.py 32 61 61
gptme/eval/agents.py 13 6 60
tests/test_tools_tts.py 29 37 60
tests/test_context.py 18 13 58
gptme/dirs.py 27 14 55
gptme/eval/execenv.py 10 14 55
gptme/eval/suites/basic.py 15 1 55
gptme/eval/suites/init_projects.py 21 1 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
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
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
tests/test_chat.py 18 28 34
scripts/shorten_details.py 11 6 33
gptme/eval/filestore.py 5 2 32
gptme/eval/types.py 13 12 32
scripts/list_user_messages.py 10 9 32
gptme/wut.py 13 12 31
gptme/tools/_browser_lynx.py 9 13 30
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
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 4 19
tests/test_logmanager.py 8 5 18
gptme/eval/suites/browser.py 5 0 16
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_shell.py 9 11 13
tests/test_tools_subagent.py 7 10 11
gptme/__init__.py 1 1 8
gptme/eval/__init__.py 1 0 4
gptme/__main__.py 1 0 3
gptme/eval/__main__.py 1 0 3
gptme/server/__init__.py 2 3 3
gptme/server/__main__.py 1 0 3
gptme/mcp/__init__.py 1 0 2
--------------------------------------------------------------------------------------------
SUM: 5089 4647 18651
--------------------------------------------------------------------------------------------
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: 137
Total blocks: 1094
Average complexity: 4.313528336380256
Most Complex Functions (D+):
gptme/config.py
M 517:4 Config.mcp - D
gptme/llm/__init__.py
F 120:0 _reply_stream - D
gptme/llm/llm_openai.py
F 207:0 stream - D
gptme/llm/llm_anthropic.py
F 170:0 stream - D
gptme/server/api_v2_agents.py
F 43:0 api_agents_put - D
gptme/server/tasks_api.py
F 351:0 get_git_status - D
gptme/server/openapi_docs.py
F 512:0 _convert_to_openapi_nullable - D
gptme/server/api_v2_sessions.py
F 170:0 step - D
gptme/eval/main.py
F 199:0 main - D
gptme/tools/computer.py
F 433:0 computer - D
gptme/tools/tmux.py
F 160:0 execute_tmux - D
gptme/cli.py
F 146:0 main - D
gptme/util/ask_execute.py
F 87:0 ask_execute - D
F 206:0 execute_with_confirmation - D
gptme/util/context.py
F 575:0 _resource_to_codeblock - D
tests/test_config.py
F 498:0 test_project_config_loaded_from_toml - D
F 526:0 test_project_config_loaded_from_json - D
tests/test_server_v2_auto_stepping.py
F 15:0 test_auto_stepping - D
scripts/check_rst_formatting.py
F 26:0 check_file - E
scripts/auto_rename_logs.py
F 30:0 auto_rename_logs - D
scripts/gh-pr-view-with-pr-comments.py
M 173:4 PRViewer.get_comments - D
Largest Files (>300 SLOC):
586 gptme/server/tasks_api.py
529 gptme/server/api_v2_sessions.py
492 gptme/tools/computer.py
484 tests/test_config.py
473 gptme/config.py
472 gptme/server/openapi_docs.py
463 gptme/tools/shell.py
448 gptme/llm/llm_openai.py
424 gptme/llm/llm_anthropic.py
421 gptme/llm/models.py
416 gptme/util/context.py
367 gptme/tools/base.py
361 gptme/eval/main.py
345 gptme/prompts.py
343 gptme/logmanager.py
339 gptme/server/api.py
321 tests/test_cli.py
321 gptme/cli.py
316 gptme/util/prompt.py
312 gptme/chat.py
Most Duplicated Files:
npm warn exec The following package was not found and will be installed: jscpd@4.0.5
Clone found (python):
- gptme/tools/tts.py [325:13 - 335:37] (10 lines, 135 tokens)
gptme/util/sound.py [280:9 - 290:36]
Clone found (python):
- gptme/tools/tmux.py [88:8 - 100:30] (12 lines, 85 tokens)
gptme/tools/tmux.py [65:7 - 77:19]
Clone found (python):
- gptme/server/tasks_api.py [264:17 - 276:7] (12 lines, 105 tokens)
gptme/server/tasks_api.py [209:13 - 221:3]
Clone found (python):
- gptme/server/api_v2_sessions.py [729:17 - 742:27] (13 lines, 92 tokens)
gptme/server/api_v2_sessions.py [625:19 - 638:30]
Clone found (python):
- gptme/server/api_v2.py [196:21 - 207:19] (11 lines, 84 tokens)
gptme/server/api_v2_sessions.py [625:19 - 636:11]
Clone found (python):
- gptme/server/api.py [168:5 - 178:43] (10 lines, 83 tokens)
gptme/server/api_v2.py [146:5 - 156:4]
Clone found (python):
- gptme/server/api.py [179:5 - 187:2] (8 lines, 94 tokens)
gptme/server/api_v2.py [156:5 - 164:2]
Clone found (python):
- gptme/llm/llm_anthropic.py [174:5 - 188:5] (14 lines, 109 tokens)
gptme/llm/llm_anthropic.py [124:5 - 138:9]
Clone found (python):
- gptme/llm/llm_anthropic.py [188:7 - 201:3] (13 lines, 108 tokens)
gptme/llm/llm_anthropic.py [138:7 - 152:8]
Clone found (python):
- gptme/llm/llm_anthropic.py [282:2 - 322:8] (40 lines, 273 tokens)
gptme/llm/llm_openai.py [304:2 - 345:11]
Clone found (python):
- gptme/llm/llm_anthropic.py [361:4 - 379:88] (18 lines, 98 tokens)
gptme/llm/llm_openai.py [431:32 - 449:23]
Clone found (python):
- gptme/llm/llm_anthropic.py [477:1 - 496:2] (19 lines, 148 tokens)
gptme/llm/llm_openai.py [488:1 - 505:6]
┌────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐
│ Format │ Files analyzed │ Total lines │ Total tokens │ Clones found │ Duplicated lines │ Duplicated tokens │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ python │ 98 │ 24041 │ 164643 │ 12 │ 180 (0.75%) │ 1414 (0.86%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ 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 │ 3 │ 334 │ 2390 │ 0 │ 0 (0%) │ 0 (0%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ bash │ 8 │ 313 │ 1491 │ 0 │ 0 (0%) │ 0 (0%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ url │ 1 │ 2 │ 16 │ 0 │ 0 (0%) │ 0 (0%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ Total: │ 114 │ 25522 │ 175082 │ 12 │ 180 (0.71%) │ 1414 (0.81%) │
└────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘
Found 12 clones.
Detection time:: 1.782s
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