44
55import structlog
66
7+ from ai_server .analyzer ._embedding_step import (
8+ EmbeddingStepError ,
9+ chunk_embed_and_upsert ,
10+ )
711from ai_server .analyzer .sources .github_repo import (
812 GitHubRepoSourceExtractor ,
913 RepositoryFetchError ,
1014)
1115from ai_server .chain .document_analysis_chain import DocumentAnalyzer
1216from ai_server .core .client import CoreClient , CoreTokenError
17+ from ai_server .rag .chunker import MarkdownChunker
18+ from ai_server .rag .embedder import EmbeddingProvider
1319from ai_server .storage .base import ObjectStorage
1420
1521log = structlog .get_logger (__name__ )
@@ -28,10 +34,10 @@ class RepositoryAnalysisResult:
2834 summary : str
2935 tech_stack : list [str ]
3036 document_path : str
37+ embedding_chunk_count : int
3138
3239
33- # 코어서버에서 토큰 받아오고 레포 가져온다
34- # 이후 LLM 분석하고 마크다운 저장
40+ # Core에서 사용자별 GitHub token 수령 → 레포 fetch → LLM 분석 → 마크다운 저장 → 청킹·임베딩
3541class RepositoryAnalyzer :
3642 def __init__ (
3743 self ,
@@ -40,12 +46,16 @@ def __init__(
4046 core_client : CoreClient ,
4147 chain : DocumentAnalyzer ,
4248 storage : ObjectStorage ,
49+ chunker : MarkdownChunker ,
50+ embedder : EmbeddingProvider ,
4351 analyzed_key_template : str ,
4452 ) -> None :
4553 self ._extractor = extractor
4654 self ._core_client = core_client
4755 self ._chain = chain
4856 self ._storage = storage
57+ self ._chunker = chunker
58+ self ._embedder = embedder
4959 self ._analyzed_key_template = analyzed_key_template
5060
5161 async def analyze (
@@ -55,6 +65,7 @@ async def analyze(
5565 repo_full_name : str ,
5666 default_branch : str = "main" ,
5767 user_id : int | None ,
68+ analyzed_document_id : int ,
5869 ) -> RepositoryAnalysisResult :
5970 if user_id is None :
6071 raise RepositoryAnalyzeError (
@@ -72,9 +83,7 @@ async def analyze(
7283 access_token = await self ._core_client .fetch_github_token (user_id )
7384 except CoreTokenError as err :
7485 raise RepositoryAnalyzeError (
75- code = err .code ,
76- message = err .message ,
77- retriable = err .retriable ,
86+ code = err .code , message = err .message , retriable = err .retriable
7887 ) from err
7988
8089 log .info (
@@ -90,9 +99,7 @@ async def analyze(
9099 )
91100 except RepositoryFetchError as err :
92101 raise RepositoryAnalyzeError (
93- code = err .code ,
94- message = err .message ,
95- retriable = err .retriable ,
102+ code = err .code , message = err .message , retriable = err .retriable
96103 ) from err
97104
98105 if not source .text .strip ():
@@ -121,8 +128,23 @@ async def analyze(
121128 md_chars = len (analysis .markdown ),
122129 )
123130
131+ try :
132+ chunk_count = await chunk_embed_and_upsert (
133+ document_id = analyzed_document_id ,
134+ markdown = analysis .markdown ,
135+ chunker = self ._chunker ,
136+ embedder = self ._embedder ,
137+ core_client = self ._core_client ,
138+ log_prefix = "repository" ,
139+ )
140+ except EmbeddingStepError as err :
141+ raise RepositoryAnalyzeError (
142+ code = err .code , message = err .message , retriable = err .retriable
143+ ) from err
144+
124145 return RepositoryAnalysisResult (
125146 summary = analysis .summary ,
126147 tech_stack = list (analysis .tech_stack ),
127148 document_path = out_key ,
149+ embedding_chunk_count = chunk_count ,
128150 )
0 commit comments