@@ -108,7 +108,7 @@ def format_node_with_context_limit(
108
108
# Update summary with final info
109
109
if node .type == FileSystemNodeType .DIRECTORY :
110
110
# Count how many files were actually included
111
- included_files = len ([line for line in optimized_content .split ('\n ' ) if line .startswith ('=' * 48 )])
111
+ included_files = len ([line for line in optimized_content .split ('\n ' ) if line .startswith ('=' * 48 )]) / 2
112
112
summary += f"Files included: { included_files } (optimized for { max_tokens :,} tokens)\n "
113
113
elif node .type == FileSystemNodeType .FILE :
114
114
summary += f"File: { node .name } \n "
@@ -325,11 +325,17 @@ def _optimize_content_with_knapsack(node: FileSystemNode, max_tokens: int) -> st
325
325
if not file_items :
326
326
return "[No files found]"
327
327
328
- # Calculate value/cost ratio for each file and sort by it
329
- for item in file_items :
330
- relevance_score = max (item ['relevance' ], 1 ) # Avoid division by zero
331
- file_type_multiplier = _get_file_type_multiplier (item ['path' ])
328
+ # Filter out files with 0 relevance (not AI-selected)
329
+ relevant_items = [item for item in file_items if item ['relevance' ] > 0 ]
330
+
331
+ if not relevant_items :
332
+ return "[No relevant files found - all files have 0 AI relevance score]"
333
+
334
+ # Calculate value/cost ratio for each relevant file
335
+ for item in relevant_items :
336
+ relevance_score = item ['relevance' ] # Already > 0, no need for max()
332
337
338
+ file_type_multiplier = _get_file_type_multiplier (item ['path' ])
333
339
# Value = relevance * type_multiplier * content_quality
334
340
content_quality = _estimate_content_quality (item ['content' ])
335
341
value = relevance_score * file_type_multiplier * content_quality
@@ -341,7 +347,7 @@ def _optimize_content_with_knapsack(node: FileSystemNode, max_tokens: int) -> st
341
347
item ['ratio' ] = value / max (cost , 1 )
342
348
343
349
# Sort by ratio (descending - best value first)
344
- sorted_items = sorted (file_items , key = lambda x : x ['ratio' ], reverse = True )
350
+ sorted_items = sorted (relevant_items , key = lambda x : x ['ratio' ], reverse = True )
345
351
346
352
# Greedy selection: pick highest ratio items that fit
347
353
selected_items = []
@@ -363,7 +369,7 @@ def _optimize_content_with_knapsack(node: FileSystemNode, max_tokens: int) -> st
363
369
result = "\n " .join (content_parts )
364
370
365
371
logger .info (
366
- f"Knapsack optimization: selected { len (selected_items )} /{ len (file_items )} files, "
372
+ f"Knapsack optimization: selected { len (selected_items )} /{ len (relevant_items )} files, "
367
373
f"using { total_tokens } /{ max_tokens } tokens"
368
374
)
369
375
0 commit comments