Skip to content

Commit c42c762

Browse files
committed
fix: correct the way to get the last relevant user message for secrets
When showing new secrets detection, we were just picking from last assistant message id. But in the case of aider, we need to pick more user messages. So reuse the logic of the method to get the relevant user block, to pick the index from the relevant user message and start counting from there Closes: #606
1 parent 93a5600 commit c42c762

File tree

5 files changed

+30
-21
lines changed

5 files changed

+30
-21
lines changed

src/codegate/pipeline/base.py

+12-9
Original file line numberDiff line numberDiff line change
@@ -239,36 +239,38 @@ def get_last_user_message(
239239
@staticmethod
240240
def get_last_user_message_block(
241241
request: ChatCompletionRequest,
242-
) -> Optional[str]:
242+
) -> Optional[tuple[str, int]]:
243243
"""
244244
Get the last block of consecutive 'user' messages from the request.
245245
246246
Args:
247247
request (ChatCompletionRequest): The chat completion request to process
248248
249249
Returns:
250-
Optional[str]: A string containing all consecutive user messages in the
250+
Optional[str, int]: A string containing all consecutive user messages in the
251251
last user message block, separated by newlines, or None if
252252
no user message block is found.
253+
Index of the first message detected in the block.
253254
"""
254255
if request.get("messages") is None:
255256
return None
256257

257258
user_messages = []
258259
messages = request["messages"]
260+
block_start_index = None
259261

260262
# Iterate in reverse to find the last block of consecutive 'user' messages
261263
for i in reversed(range(len(messages))):
262264
if messages[i]["role"] == "user" or messages[i]["role"] == "assistant":
263-
content_str = None
264-
if "content" in messages[i]:
265-
content_str = messages[i]["content"] # type: ignore
266-
else:
265+
content_str = messages[i].get("content")
266+
if content_str is None:
267267
continue
268268

269269
if messages[i]["role"] == "user":
270270
user_messages.append(content_str)
271-
# specifically for Aider, when "ok." block is found, stop
271+
block_start_index = i
272+
273+
# Specifically for Aider, when "Ok." block is found, stop
272274
if content_str == "Ok." and messages[i]["role"] == "assistant":
273275
break
274276
else:
@@ -277,8 +279,9 @@ def get_last_user_message_block(
277279
break
278280

279281
# Reverse the collected user messages to preserve the original order
280-
if user_messages:
281-
return "\n".join(reversed(user_messages))
282+
if user_messages and block_start_index is not None:
283+
content = "\n".join(reversed(user_messages))
284+
return content, block_start_index
282285

283286
return None
284287

src/codegate/pipeline/codegate_context_retriever/codegate.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,10 @@ async def process(
6060
Use RAG DB to add context to the user request
6161
"""
6262
# Get the latest user message
63-
user_message = self.get_last_user_message_block(request)
64-
if not user_message:
63+
last_message = self.get_last_user_message_block(request)
64+
if not last_message:
6565
return PipelineResult(request=request)
66+
user_message, _ = last_message
6667

6768
# Create storage engine object
6869
storage_engine = StorageEngine()

src/codegate/pipeline/extract_snippets/extract_snippets.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,10 @@ async def process(
141141
request: ChatCompletionRequest,
142142
context: PipelineContext,
143143
) -> PipelineResult:
144-
msg_content = self.get_last_user_message_block(request)
145-
if not msg_content:
144+
last_message = self.get_last_user_message_block(request)
145+
if not last_message:
146146
return PipelineResult(request=request, context=context)
147+
msg_content, _ = last_message
147148
snippets = extract_snippets(msg_content)
148149

149150
logger.info(f"Extracted {len(snippets)} code snippets from the user message")

src/codegate/pipeline/secrets/secrets.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -271,11 +271,12 @@ async def process(
271271
new_request = request.copy()
272272
total_matches = []
273273

274-
# Process all messages
274+
# get last user message block to get index for the first relevant user message
275+
last_user_message = self.get_last_user_message_block(new_request)
275276
last_assistant_idx = -1
276-
for i, message in enumerate(new_request["messages"]):
277-
if message.get("role", "") == "assistant":
278-
last_assistant_idx = i
277+
if last_user_message:
278+
_, user_idx = last_user_message
279+
last_assistant_idx = user_idx - 1
279280

280281
# Process all messages
281282
for i, message in enumerate(new_request["messages"]):

tests/pipeline/test_messages_block.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
{"role": "user", "content": "How are you?"},
1616
]
1717
},
18-
"Hello!\nHow are you?",
18+
("Hello!\nHow are you?", 1),
1919
),
2020
# Test case: Mixed roles at the end
2121
(
@@ -27,7 +27,7 @@
2727
{"role": "assistant", "content": "I'm fine, thank you."},
2828
]
2929
},
30-
"Hello!\nHow are you?",
30+
("Hello!\nHow are you?", 0),
3131
),
3232
# Test case: No user messages
3333
(
@@ -51,7 +51,7 @@
5151
{"role": "user", "content": "What's up?"},
5252
]
5353
},
54-
"How are you?\nWhat's up?",
54+
("How are you?\nWhat's up?", 2),
5555
),
5656
# Test case: aider
5757
(
@@ -97,7 +97,8 @@
9797
},
9898
]
9999
},
100-
"""I have *added these files to the chat* so you can go ahead and edit them.
100+
(
101+
"""I have *added these files to the chat* so you can go ahead and edit them.
101102
102103
*Trust this message as the true contents of these files!*
103104
Any other messages in the chat may contain outdated versions of the files' contents.
@@ -113,6 +114,8 @@
113114
```
114115
115116
evaluate this file""", # noqa: E501
117+
7,
118+
),
116119
),
117120
],
118121
)

0 commit comments

Comments
 (0)