kodit 0.1.15__py3-none-any.whl → 0.1.17__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 kodit might be problematic. Click here for more details.

@@ -1,12 +1,12 @@
1
1
  kodit/.gitignore,sha256=ztkjgRwL9Uud1OEi36hGQeDGk3OLK1NfDEO8YqGYy8o,11
2
2
  kodit/__init__.py,sha256=aEKHYninUq1yh6jaNfvJBYg-6fenpN132nJt1UU6Jxs,59
3
- kodit/_version.py,sha256=OX-WIjJlMaFvqRmCfLtOYEOYoiov9NdOA089N36rG-g,513
3
+ kodit/_version.py,sha256=02_IA72k4pYar3Dp1g66WmynC3vl-jdmnf6lQF8QpE4,513
4
4
  kodit/app.py,sha256=Mr5BFHOHx5zppwjC4XPWVvHjwgl1yrKbUjTWXKubJQM,891
5
- kodit/cli.py,sha256=wAaMZQs-h6hyashWB3DBR2GIf496vfHmepcXhpa7-eM,8085
5
+ kodit/cli.py,sha256=i7eEt0FdIQGEfXKFte-8fBcZZGE8BPXBp40aGwJDQGI,11323
6
6
  kodit/config.py,sha256=2W2u5J8j-Mbt-C4xzOuK-PeuDCx0S_rnCXPhBwvfLT4,4353
7
7
  kodit/database.py,sha256=WB1KpVxUYPgiJGU0gJa2hqytYB8wJEJ5z3WayhWzNMU,2403
8
8
  kodit/log.py,sha256=HU1OmuxO4FcVw61k4WW7Y4WM7BrDaeplw1PcBHhuIZY,5434
9
- kodit/mcp.py,sha256=HA3R7YG0Al1A6MjSCSIi0hEGXG3WP7tix-N5AROasCM,5278
9
+ kodit/mcp.py,sha256=QruyPskWB0_x59pkfj5BBeXuR13GMny5TAZEa2j4U9s,5752
10
10
  kodit/middleware.py,sha256=I6FOkqG9-8RH5kR1-0ZoQWfE4qLCB8lZYv8H_OCH29o,2714
11
11
  kodit/bm25/__init__.py,sha256=j8zyriNWhbwE5Lbybzg1hQAhANlU9mKHWw4beeUR6og,19
12
12
  kodit/bm25/keyword_search_factory.py,sha256=rp-wx3DJsc2KlELK1V337EyeYvmwnMQwUqOo1WVPSmg,631
@@ -14,21 +14,29 @@ kodit/bm25/keyword_search_service.py,sha256=aBbWQKgQmi2re3EIHdXFS00n7Wj3b2D0pZsL
14
14
  kodit/bm25/local_bm25.py,sha256=AAbFhbQDqyL3d7jsPL7W4HsLxdoYctaDsREUXOLy6jM,3260
15
15
  kodit/bm25/vectorchord_bm25.py,sha256=_nGrkUReYLLV-L8RIuIVLwjuhSYZl9T532n5OVf0kWs,6393
16
16
  kodit/embedding/__init__.py,sha256=h9NXzDA1r-K23nvBajBV-RJzHJN0p3UJ7UQsmdnOoRw,24
17
- kodit/embedding/embedding_factory.py,sha256=qzoxBS3scR-ABd-u9215uGES7c6clYy2DiKcSDQivnA,1603
17
+ kodit/embedding/embedding_factory.py,sha256=UGnFRyyQXazSUOwyW4Hg7Vq2-kfAoDj9lD4CTLu8x04,1630
18
18
  kodit/embedding/embedding_models.py,sha256=rN90vSs86dYiqoawcp8E9jtwY31JoJXYfaDlsJK7uqc,656
19
19
  kodit/embedding/embedding_repository.py,sha256=-ux3scpBzel8c0pMH9fNOEsSXFIzl-IfgaWrkTb1szo,6907
20
20
  kodit/embedding/local_vector_search_service.py,sha256=hkF0qlfzjyGt400qIX9Mr6B7b7i8WvYIYWN2Z2C_pcs,1907
21
21
  kodit/embedding/vector_search_service.py,sha256=pQJ129QjGrAWOXzqkywmgtDRpy8_gtzYgkivyqF9Vrs,1009
22
- kodit/embedding/vectorchord_vector_search_service.py,sha256=OsVeM3gpoT8Ihzh-kEIzBm3xh_a4D-sErPvsQSKCME8,4732
22
+ kodit/embedding/vectorchord_vector_search_service.py,sha256=63Xf7_nAz3xWOwrmZibw8Q-xoRdCrPDDpdSA_WE7mrc,5131
23
23
  kodit/embedding/embedding_provider/__init__.py,sha256=h9NXzDA1r-K23nvBajBV-RJzHJN0p3UJ7UQsmdnOoRw,24
24
- kodit/embedding/embedding_provider/embedding_provider.py,sha256=NKs4nriup47R8xRciP07NE1-eZE9RPHklS7VH910UZ4,1537
24
+ kodit/embedding/embedding_provider/embedding_provider.py,sha256=Tf3bwUsUMzAgoyLFM5qBtOLqPp1qr03TzrwGczkDvy0,1835
25
25
  kodit/embedding/embedding_provider/hash_embedding_provider.py,sha256=nAhlhh8j8PqqCCbhVl26Y8ntFBm2vJBCtB4X04g5Wwg,2638
26
26
  kodit/embedding/embedding_provider/local_embedding_provider.py,sha256=4ER-UPq506Y0TWU6qcs0nUqw6bSKQkSrdog-DhNQWM8,1906
27
- kodit/embedding/embedding_provider/openai_embedding_provider.py,sha256=bmUpegDgaF5Qj9uWcj1az4ADA2cKHUjraaMjGGPr83U,2076
27
+ kodit/embedding/embedding_provider/openai_embedding_provider.py,sha256=V_jdUXiaGdslplwxMlfgFc4_hAVS2eaJXMTs2C7RiLI,2666
28
+ kodit/enrichment/__init__.py,sha256=vBEolHpKaHUhfINX0dSGyAPlvgpLNAer9YzFtdvCB24,18
29
+ kodit/enrichment/enrichment_factory.py,sha256=vKjkUTdhj74IW2S4GENDWdWMJx6BwUSZjJGDC0i7DSk,787
30
+ kodit/enrichment/enrichment_service.py,sha256=87Sd3gGbEMJYb_wVrHG8L1yGIZmQNR7foUS4_y94azI,977
31
+ kodit/enrichment/enrichment_provider/__init__.py,sha256=klf8iuLVWX4iRz-DZQauFFNAoJC5CByczh48TBZPW-o,27
32
+ kodit/enrichment/enrichment_provider/enrichment_provider.py,sha256=E0H5rq3OENM0yYbA8K_3nSnj5lUHCpoIOqpWLo-2MVU,413
33
+ kodit/enrichment/enrichment_provider/local_enrichment_provider.py,sha256=bR6HR1gH7wtZdMLOwaKdASjvllRo1FlNW9GyZC11zAM,2164
34
+ kodit/enrichment/enrichment_provider/openai_enrichment_provider.py,sha256=gYuFTAeIVdQNlCUvNSPgRoiRwCvRD0C8419h8ubyABA,2725
28
35
  kodit/indexing/__init__.py,sha256=cPyi2Iej3G1JFWlWr7X80_UrsMaTu5W5rBwgif1B3xo,75
36
+ kodit/indexing/fusion.py,sha256=TZb4fPAedXdEUXzwzOofW98QIOymdbclBOP1KOijuEk,1674
29
37
  kodit/indexing/indexing_models.py,sha256=6NX9HVcj6Pu9ePwHC7n-PWSyAgukpJq0nCNmUIigtbo,1282
30
- kodit/indexing/indexing_repository.py,sha256=4RJ3zY8p6QxHrYW7dDjru_w94Eu19v2gQ4mdlTgcXvY,6331
31
- kodit/indexing/indexing_service.py,sha256=T_dxOzNW_0OCpR4Fha1hHuNkmtLcDMZwL6t5xeu5VXQ,6613
38
+ kodit/indexing/indexing_repository.py,sha256=dqOS0pxKM6bUjMXWqYukAK8XdiD36OnskFASgZRXRQM,6955
39
+ kodit/indexing/indexing_service.py,sha256=_uhoqBic3_zXNJOsKt_w-TgX5ebf7OBwbqMdO9zectM,10779
32
40
  kodit/migrations/README,sha256=ISVtAOvqvKk_5ThM5ioJE-lMkvf9IbknFUFVU_vPma4,58
33
41
  kodit/migrations/__init__.py,sha256=lP5MuwlyWRMO6UcDWnQcQ3G-GYHcFb6rl9gYPHJ1sjo,40
34
42
  kodit/migrations/env.py,sha256=w1M7OZh-ZeR2dPHS0ByXAUxQjfZQ8xIzMseWuzLDTWw,2469
@@ -36,23 +44,22 @@ kodit/migrations/script.py.mako,sha256=zWziKtiwYKEWuwPV_HBNHwa9LCT45_bi01-uSNFaO
36
44
  kodit/migrations/versions/7c3bbc2ab32b_add_embeddings_table.py,sha256=-61qol9PfQKILCDQRA5jEaats9aGZs9Wdtp-j-38SF4,1644
37
45
  kodit/migrations/versions/85155663351e_initial.py,sha256=Cg7zlF871o9ShV5rQMQ1v7hRV7fI59veDY9cjtTrs-8,3306
38
46
  kodit/migrations/versions/__init__.py,sha256=9-lHzptItTzq_fomdIRBegQNm4Znx6pVjwD4MiqRIdo,36
39
- kodit/search/__init__.py,sha256=4QbdjbrlhNKMovmuKHxJnUeZT7KNjTTFU0GdnuwUHdQ,36
40
- kodit/search/search_repository.py,sha256=6q0k7JMTM_7hPK2TSA30CykGbc5N16kCL7HTjlbai0w,1563
41
- kodit/search/search_service.py,sha256=-XlbP_50e1dKFJ5jBvex5FjLnffW43LcwQV_SeYNFB0,3944
47
+ kodit/migrations/versions/c3f5137d30f5_index_all_the_things.py,sha256=rI8LmjF-I2OMxZ2nOIF_NRmqOLXe45hL_iz_nx97DTQ,1680
42
48
  kodit/snippets/__init__.py,sha256=-2coNoCRjTixU9KcP6alpmt7zqf37tCRWH3D7FPJ8dg,48
43
49
  kodit/snippets/method_snippets.py,sha256=EVHhSNWahAC5nSXv9fWVFJY2yq25goHdCSCuENC07F8,4145
44
50
  kodit/snippets/snippets.py,sha256=mwN0bM1Msu8ZeEsUHyQ7tx3Hj3vZsm8G7Wu4eWSkLY8,1539
45
51
  kodit/snippets/languages/__init__.py,sha256=Bj5KKZSls2MQ8ZY1S_nHg447MgGZW-2WZM-oq6vjwwA,1187
46
52
  kodit/snippets/languages/csharp.scm,sha256=gbBN4RiV1FBuTJF6orSnDFi8H9JwTw-d4piLJYsWUsc,222
53
+ kodit/snippets/languages/go.scm,sha256=SEX9mTOrhP2KiQW7oflDKkd21u5dK56QbJ4LvTDxY8A,533
47
54
  kodit/snippets/languages/python.scm,sha256=ee85R9PBzwye3IMTE7-iVoKWd_ViU3EJISTyrFGrVeo,429
48
55
  kodit/source/__init__.py,sha256=1NTZyPdjThVQpZO1Mp1ColVsS7sqYanOVLqnoqV9Ipo,83
49
- kodit/source/source_models.py,sha256=xb42CaNDO1CUB8SIW-xXMrB6Ji8cFw-yeJ550xBEg9Q,2398
56
+ kodit/source/source_models.py,sha256=kcC59XPSDDMth2mOYK3FakqTN0jxKFaTDch0ejyD9Sw,2446
50
57
  kodit/source/source_repository.py,sha256=0EksMpoLzdkfe8S4eeCm4Sf7TuxsOzOzaF4BBsMYo-4,3163
51
58
  kodit/source/source_service.py,sha256=u_GaH07ewakThQJRfT8O_yZ54A52qLtJuM1bF3xUT2A,9633
52
59
  kodit/util/__init__.py,sha256=bPu6CtqDWCRGU7VgW2_aiQrCBi8G89FS6k1PjvDajJ0,37
53
60
  kodit/util/spinner.py,sha256=R9bzrHtBiIH6IfLbmsIVHL53s8vg-tqW4lwGGALu4dw,1932
54
- kodit-0.1.15.dist-info/METADATA,sha256=8E-bw8L-Df5Hdt16R5IWkyw7uUAr13CwYfcEyFExaPw,2380
55
- kodit-0.1.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
56
- kodit-0.1.15.dist-info/entry_points.txt,sha256=hoTn-1aKyTItjnY91fnO-rV5uaWQLQ-Vi7V5et2IbHY,40
57
- kodit-0.1.15.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
58
- kodit-0.1.15.dist-info/RECORD,,
61
+ kodit-0.1.17.dist-info/METADATA,sha256=MvKNOh3LfOOuviJBzZVqPaP0__Z-_DdoUzgfc2lUBFE,5822
62
+ kodit-0.1.17.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
63
+ kodit-0.1.17.dist-info/entry_points.txt,sha256=hoTn-1aKyTItjnY91fnO-rV5uaWQLQ-Vi7V5et2IbHY,40
64
+ kodit-0.1.17.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
65
+ kodit-0.1.17.dist-info/RECORD,,
kodit/search/__init__.py DELETED
@@ -1 +0,0 @@
1
- """Search for relevant snippets."""
@@ -1,57 +0,0 @@
1
- """Repository for searching for relevant snippets."""
2
-
3
- from typing import TypeVar
4
-
5
- from sqlalchemy import (
6
- select,
7
- )
8
- from sqlalchemy.ext.asyncio import AsyncSession
9
-
10
- from kodit.indexing.indexing_models import Snippet
11
- from kodit.source.source_models import File
12
-
13
- T = TypeVar("T")
14
-
15
-
16
- class SearchRepository:
17
- """Repository for searching for relevant snippets."""
18
-
19
- def __init__(self, session: AsyncSession) -> None:
20
- """Initialize the search repository.
21
-
22
- Args:
23
- session: The SQLAlchemy async session to use for database operations.
24
-
25
- """
26
- self.session = session
27
-
28
- async def list_snippet_ids(self) -> list[int]:
29
- """List all snippet IDs.
30
-
31
- Returns:
32
- A list of all snippets.
33
-
34
- """
35
- query = select(Snippet.id)
36
- rows = await self.session.execute(query)
37
- return list(rows.scalars().all())
38
-
39
- async def list_snippets_by_ids(self, ids: list[int]) -> list[tuple[File, Snippet]]:
40
- """List snippets by IDs.
41
-
42
- Returns:
43
- A list of snippets in the same order as the input IDs.
44
-
45
- """
46
- query = (
47
- select(Snippet, File)
48
- .where(Snippet.id.in_(ids))
49
- .join(File, Snippet.file_id == File.id)
50
- )
51
- rows = await self.session.execute(query)
52
-
53
- # Create a dictionary for O(1) lookup of results by ID
54
- id_to_result = {snippet.id: (file, snippet) for snippet, file in rows.all()}
55
-
56
- # Return results in the same order as input IDs
57
- return [id_to_result[i] for i in ids]
@@ -1,135 +0,0 @@
1
- """Search service."""
2
-
3
- import pydantic
4
- import structlog
5
-
6
- from kodit.bm25.keyword_search_service import BM25Result, KeywordSearchProvider
7
- from kodit.embedding.vector_search_service import VectorSearchService
8
- from kodit.search.search_repository import SearchRepository
9
-
10
-
11
- class SearchRequest(pydantic.BaseModel):
12
- """Request for a search."""
13
-
14
- code_query: str | None = None
15
- keywords: list[str] | None = None
16
- top_k: int = 10
17
-
18
-
19
- class SearchResult(pydantic.BaseModel):
20
- """Data transfer object for search results.
21
-
22
- This model represents a single search result, containing both the file path
23
- and the matching snippet content.
24
- """
25
-
26
- id: int
27
- uri: str
28
- content: str
29
-
30
-
31
- class Snippet(pydantic.BaseModel):
32
- """Snippet model."""
33
-
34
- content: str
35
- file_path: str
36
-
37
-
38
- class SearchService:
39
- """Service for searching for relevant data."""
40
-
41
- def __init__(
42
- self,
43
- repository: SearchRepository,
44
- keyword_search_provider: KeywordSearchProvider,
45
- embedding_service: VectorSearchService,
46
- ) -> None:
47
- """Initialize the search service."""
48
- self.repository = repository
49
- self.log = structlog.get_logger(__name__)
50
- self.keyword_search_provider = keyword_search_provider
51
- self.code_embedding_service = embedding_service
52
-
53
- async def search(self, request: SearchRequest) -> list[SearchResult]:
54
- """Search for relevant data."""
55
- fusion_list = []
56
- if request.keywords:
57
- # Gather results for each keyword
58
- result_ids: list[BM25Result] = []
59
- for keyword in request.keywords:
60
- results = await self.keyword_search_provider.retrieve(
61
- keyword, request.top_k
62
- )
63
- result_ids.extend(results)
64
-
65
- # Sort results by score
66
- result_ids.sort(key=lambda x: x[1], reverse=True)
67
-
68
- self.log.debug("Search results (BM25)", results=result_ids)
69
-
70
- bm25_results = [x[0] for x in result_ids]
71
- fusion_list.append(bm25_results)
72
-
73
- # Compute embedding for semantic query
74
- semantic_results = []
75
- if request.code_query:
76
- query_embedding = await self.code_embedding_service.retrieve(
77
- request.code_query, top_k=request.top_k
78
- )
79
- semantic_results = [x.snippet_id for x in query_embedding]
80
- fusion_list.append(semantic_results)
81
-
82
- if len(fusion_list) == 0:
83
- return []
84
-
85
- # Combine all results together with RFF if required
86
- final_results = reciprocal_rank_fusion(fusion_list, k=60)
87
-
88
- # Extract ids from final results
89
- final_ids = [x[0] for x in final_results]
90
-
91
- # Get snippets from database (up to top_k)
92
- search_results = await self.repository.list_snippets_by_ids(
93
- final_ids[: request.top_k]
94
- )
95
-
96
- return [
97
- SearchResult(
98
- id=snippet.id,
99
- uri=file.uri,
100
- content=snippet.content,
101
- )
102
- for file, snippet in search_results
103
- ]
104
-
105
-
106
- def reciprocal_rank_fusion(
107
- rankings: list[list[int]], k: float = 60
108
- ) -> list[tuple[int, float]]:
109
- """RRF prioritises results that are present in all results.
110
-
111
- Args:
112
- rankings: List of rankers, each containing a list of document ids. Top of the
113
- list is considered to be the best result.
114
- k: Parameter for RRF.
115
-
116
- Returns:
117
- Dictionary of ids and their scores.
118
-
119
- """
120
- scores = {}
121
- for ranker in rankings:
122
- for rank in ranker:
123
- scores[rank] = float(0)
124
-
125
- for ranker in rankings:
126
- for i, rank in enumerate(ranker):
127
- scores[rank] += 1.0 / (k + i)
128
-
129
- # Create a list of tuples of ids and their scores
130
- results = [(rank, scores[rank]) for rank in scores]
131
-
132
- # Sort results by score
133
- results.sort(key=lambda x: x[1], reverse=True)
134
-
135
- return results
@@ -1,89 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: kodit
3
- Version: 0.1.15
4
- Summary: Code indexing for better AI code generation
5
- Project-URL: Homepage, https://docs.helixml.tech/kodit/
6
- Project-URL: Documentation, https://docs.helixml.tech/kodit/
7
- Project-URL: Repository, https://github.com/helixml/kodit.git
8
- Project-URL: Issues, https://github.com/helixml/kodit/issues
9
- Project-URL: Changelog, https://github.com/helixml/kodit/releases
10
- Author-email: "Helix.ML" <founders@helix.ml>
11
- Maintainer-email: "Helix.ML" <founders@helix.ml>
12
- License-Expression: Apache-2.0
13
- License-File: LICENSE
14
- Keywords: ai,indexing,mcp,rag
15
- Classifier: Development Status :: 2 - Pre-Alpha
16
- Classifier: Intended Audience :: Developers
17
- Classifier: Programming Language :: Python :: 3.12
18
- Classifier: Topic :: Software Development :: Code Generators
19
- Requires-Python: >=3.12
20
- Requires-Dist: aiofiles>=24.1.0
21
- Requires-Dist: aiosqlite>=0.20.0
22
- Requires-Dist: alembic>=1.15.2
23
- Requires-Dist: asgi-correlation-id>=4.3.4
24
- Requires-Dist: asyncpg>=0.30.0
25
- Requires-Dist: better-exceptions>=0.3.3
26
- Requires-Dist: bm25s[core]>=0.2.12
27
- Requires-Dist: click>=8.1.8
28
- Requires-Dist: colorama>=0.4.6
29
- Requires-Dist: dotenv>=0.9.9
30
- Requires-Dist: fastapi[standard]>=0.115.12
31
- Requires-Dist: fastmcp>=2.3.3
32
- Requires-Dist: gitpython>=3.1.44
33
- Requires-Dist: hf-xet>=1.1.2
34
- Requires-Dist: httpx-retries>=0.3.2
35
- Requires-Dist: httpx>=0.28.1
36
- Requires-Dist: openai>=1.82.0
37
- Requires-Dist: posthog>=4.0.1
38
- Requires-Dist: pydantic-settings>=2.9.1
39
- Requires-Dist: pytable-formatter>=0.1.1
40
- Requires-Dist: sentence-transformers>=4.1.0
41
- Requires-Dist: sqlalchemy[asyncio]>=2.0.40
42
- Requires-Dist: structlog>=25.3.0
43
- Requires-Dist: tdqm>=0.0.1
44
- Requires-Dist: tiktoken>=0.9.0
45
- Requires-Dist: tree-sitter-language-pack>=0.7.3
46
- Requires-Dist: tree-sitter>=0.24.0
47
- Requires-Dist: uritools>=5.0.0
48
- Description-Content-Type: text/markdown
49
-
50
- # kodit
51
-
52
- ## Installation
53
-
54
- Please choose your preferred installation method. They all ultimately install the kodit
55
- cli, which contains the kodit MCP server and other tools to manage your data sources.
56
-
57
- ### Docker
58
-
59
- ```sh
60
- docker run -it --rm registry.helix.ml/helix/kodit:latest
61
- ```
62
-
63
- Always replace latest with a specific version.
64
-
65
- ### pipx
66
-
67
- ```sh
68
- pipx install kodit
69
- ```
70
-
71
- ### homebrew
72
-
73
- ```sh
74
- brew install helixml/kodit/kodit
75
- ```
76
-
77
- ### uv
78
-
79
- ```sh
80
- uv tool install kodit
81
- ```
82
-
83
- ### pip
84
-
85
- Use this if you want to use kodit as a python library:
86
-
87
- ```sh
88
- pip install kodit
89
- ```
File without changes