Skip to content
This repository was archived by the owner on Jun 5, 2025. It is now read-only.

Commit 706454c

Browse files
committed
Removed some leftovers.
1 parent b75c950 commit 706454c

File tree

4 files changed

+46
-193
lines changed

4 files changed

+46
-193
lines changed

src/codegate/pipeline/output.py

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -182,25 +182,16 @@ async def process_stream(
182182
# Process any remaining content in buffer when stream ends
183183
if self._context.buffer:
184184
final_content = "".join(self._context.buffer)
185-
logger.error("Context buffer was not empty, it should have been!", content=final_content)
186-
# chunk = ModelResponse(
187-
# id=self._buffered_chunk.id,
188-
# choices=[
189-
# StreamingChoices(
190-
# finish_reason=None,
191-
# # we just put one choice in the buffer, so 0 is fine
192-
# index=0,
193-
# delta=Delta(content=final_content, role="assistant"),
194-
# # umm..is this correct?
195-
# logprobs=self._buffered_chunk.choices[0].logprobs,
196-
# )
197-
# ],
198-
# created=self._buffered_chunk.created,
199-
# model=self._buffered_chunk.model,
200-
# object="chat.completion.chunk",
201-
# )
202-
# self._input_context.add_output(chunk)
203-
# yield chunk
185+
logger.error(
186+
"Context buffer was not empty, it should have been!",
187+
content=final_content,
188+
len=len(self._context.buffer),
189+
)
190+
# NOTE: Original code created chunks for all remaining
191+
# messages in `self._context.buffer`, but it looks
192+
# like it was defensive code. We should instead ensure
193+
# that no messages remain there at each step of the
194+
# pipeline in some way.
204195
self._context.buffer.clear()
205196

206197
if finish_stream:

src/codegate/pipeline/secrets/secrets.py

Lines changed: 30 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import itertools
22
import re
33
from abc import abstractmethod
4-
from typing import List, Optional, Tuple
4+
from typing import Any, List, Optional, Tuple
55

66
import pydantic
77
import structlog
@@ -18,14 +18,6 @@
1818
from codegate.pipeline.output import OutputPipelineContext, OutputPipelineStep
1919
from codegate.pipeline.secrets.manager import SecretsManager
2020
from codegate.pipeline.secrets.signatures import CodegateSignatures, Match
21-
from codegate.pipeline.systemmsg import add_or_update_system_message
22-
from codegate.types.common import (
23-
ChatCompletionRequest,
24-
ChatCompletionSystemMessage,
25-
Delta,
26-
ModelResponse,
27-
StreamingChoices,
28-
)
2921

3022

3123
logger = structlog.get_logger("codegate")
@@ -279,7 +271,7 @@ def _redact_text(
279271
return text_encryptor.obfuscate(text, snippet)
280272

281273
async def process(
282-
self, request: ChatCompletionRequest, context: PipelineContext
274+
self, reques: Any, context: PipelineContext
283275
) -> PipelineResult:
284276
"""
285277
Process the request to find and protect secrets in all messages.
@@ -292,68 +284,34 @@ async def process(
292284
PipelineResult containing the processed request and context with redaction metadata
293285
"""
294286

295-
##### NEW CODE PATH #####
296-
297-
if type(request) != ChatCompletionRequest:
298-
secrets_manager = context.sensitive.manager
299-
if not secrets_manager or not isinstance(secrets_manager, SecretsManager):
300-
raise ValueError("Secrets manager not found in context")
301-
session_id = context.sensitive.session_id
302-
if not session_id:
303-
raise ValueError("Session ID not found in context")
304-
305-
total_matches = []
306-
307-
# get last user message block to get index for the first relevant user message
308-
last_user_message = self.get_last_user_message_block(request, context.client)
309-
last_assistant_idx = last_user_message[1] - 1 if last_user_message else -1
310-
311-
# Process all messages
312-
for i, message in enumerate(request.get_messages()):
313-
for content in message.get_content():
314-
txt = content.get_text()
315-
if txt is not None:
316-
redacted_content, secrets_matched = self._redact_message_content(
317-
"".join(txt for txt in content.get_text()), secrets_manager, session_id, context
318-
)
319-
content.set_text(redacted_content)
320-
if i > last_assistant_idx:
321-
total_matches += secrets_matched
322-
323-
# Not count repeated secret matches
324-
request = self._finalize_redaction(context, total_matches, request)
325-
return PipelineResult(request=request, context=context)
326-
327-
##### OLD CODE PATH #####
328-
329-
if "messages" not in request:
330-
return PipelineResult(request=request, context=context)
331-
332287
secrets_manager = context.sensitive.manager
333288
if not secrets_manager or not isinstance(secrets_manager, SecretsManager):
334289
raise ValueError("Secrets manager not found in context")
335290
session_id = context.sensitive.session_id
336291
if not session_id:
337292
raise ValueError("Session ID not found in context")
338293

339-
new_request = request.copy()
340294
total_matches = []
341295

342296
# get last user message block to get index for the first relevant user message
343-
last_user_message = self.get_last_user_message_block(new_request, context.client)
297+
last_user_message = self.get_last_user_message_block(request, context.client)
344298
last_assistant_idx = last_user_message[1] - 1 if last_user_message else -1
345299

346300
# Process all messages
347-
for i, message in enumerate(new_request["messages"]):
348-
if "content" in message and message["content"]:
349-
redacted_content, secrets_matched = self._redact_message_content(
350-
message["content"], secrets_manager, session_id, context
351-
)
352-
new_request["messages"][i]["content"] = redacted_content
353-
if i > last_assistant_idx:
354-
total_matches += secrets_matched
355-
new_request = self._finalize_redaction(context, total_matches, new_request)
356-
return PipelineResult(request=new_request, context=context)
301+
for i, message in enumerate(request.get_messages()):
302+
for content in message.get_content():
303+
txt = content.get_text()
304+
if txt is not None:
305+
redacted_content, secrets_matched = self._redact_message_content(
306+
"".join(txt for txt in content.get_text()), secrets_manager, session_id, context
307+
)
308+
content.set_text(redacted_content)
309+
if i > last_assistant_idx:
310+
total_matches += secrets_matched
311+
312+
# Not count repeated secret matches
313+
request = self._finalize_redaction(context, total_matches, request)
314+
return PipelineResult(request=request, context=context)
357315

358316
def _redact_message_content(self, message_content, secrets_manager, session_id, context):
359317
# Extract any code snippets
@@ -403,14 +361,7 @@ def _finalize_redaction(self, context, total_matches, new_request):
403361
logger.info(f"Total secrets redacted since last assistant message: {total_redacted}")
404362
context.metadata["redacted_secrets_count"] = total_redacted
405363
if total_redacted > 0:
406-
if isinstance(new_request, pydantic.BaseModel):
407-
new_request.add_system_prompt(Config.get_config().prompts.secrets_redacted)
408-
return new_request
409-
system_message = ChatCompletionSystemMessage(
410-
content=Config.get_config().prompts.secrets_redacted,
411-
role="system",
412-
)
413-
return add_or_update_system_message(new_request, system_message, context)
364+
new_request.add_system_prompt(Config.get_config().prompts.secrets_redacted)
414365
return new_request
415366

416367

@@ -448,10 +399,10 @@ def _find_complete_redaction(self, text: str) -> tuple[Optional[re.Match[str]],
448399

449400
async def process_chunk(
450401
self,
451-
chunk: ModelResponse,
402+
chunk: Any,
452403
context: OutputPipelineContext,
453404
input_context: Optional[PipelineContext] = None,
454-
) -> list[ModelResponse]:
405+
) -> list[Any]:
455406
"""Process a single chunk of the stream"""
456407
if not input_context:
457408
raise ValueError("Input context not found")
@@ -460,9 +411,6 @@ async def process_chunk(
460411
if input_context.sensitive.session_id == "":
461412
raise ValueError("Session ID not found in input context")
462413

463-
# if len(chunk.choices) == 0 or not chunk.choices[0].delta.content:
464-
# return [chunk]
465-
466414
for content in chunk.get_content():
467415
# Check the buffered content
468416
buffered_content = "".join(context.buffer)
@@ -517,37 +465,20 @@ class SecretRedactionNotifier(OutputPipelineStep):
517465
def name(self) -> str:
518466
return "secret-redaction-notifier"
519467

520-
def _create_chunk(self, original_chunk: ModelResponse, content: str) -> ModelResponse:
468+
def _create_chunk(self, original_chunk: Any, content: str) -> Any:
521469
"""
522470
Creates a new chunk with the given content, preserving the original chunk's metadata
523471
"""
524-
if isinstance(original_chunk, ModelResponse):
525-
return ModelResponse(
526-
id=original_chunk.id,
527-
choices=[
528-
StreamingChoices(
529-
finish_reason=None,
530-
index=0,
531-
delta=Delta(content=content, role="assistant"),
532-
logprobs=None,
533-
)
534-
],
535-
created=original_chunk.created,
536-
model=original_chunk.model,
537-
object="chat.completion.chunk",
538-
)
539-
else:
540-
# TODO verify if deep-copy is necessary
541-
copy = original_chunk.model_copy(deep=True)
542-
copy.set_text(content)
543-
return copy
472+
copy = original_chunk.model_copy(deep=True)
473+
copy.set_text(content)
474+
return copy
544475

545476
async def process_chunk(
546477
self,
547-
chunk: ModelResponse,
478+
chunk: Any,
548479
context: OutputPipelineContext,
549480
input_context: Optional[PipelineContext] = None,
550-
) -> list[ModelResponse]:
481+
) -> list[Any]:
551482
"""Process a single chunk of the stream"""
552483
if (
553484
not input_context
@@ -567,20 +498,21 @@ async def process_chunk(
567498
)
568499

569500
# Check if this is the first chunk (delta role will be present, others will not)
570-
# if len(chunk.choices) > 0 and chunk.choices[0].delta.role:
571501
for _ in itertools.takewhile(lambda x: x[0] == 1, enumerate(chunk.get_content())):
572502
redacted_count = input_context.metadata["redacted_secrets_count"]
573503
secret_text = "secret" if redacted_count == 1 else "secrets"
574504
# Create notification chunk
575505
if tool_name in ["cline", "kodu"]:
506+
# NOTE: Original code was ensuring that role was
507+
# "assistant" here, we might have to do that as well,
508+
# but I believe it was defensive programming or
509+
# leftover of some refactoring.
576510
notification_chunk = self._create_chunk(
577511
chunk,
578512
f"<thinking>\n🛡️ [CodeGate prevented {redacted_count} {secret_text}]"
579513
f"(http://localhost:9090/?search=codegate-secrets) from being leaked "
580514
f"by redacting them.</thinking>\n\n",
581515
)
582-
# TODO fix this
583-
# notification_chunk.choices[0].delta.role = "assistant"
584516
else:
585517
notification_chunk = self._create_chunk(
586518
chunk,

src/codegate/pipeline/system_prompt/codegate.py

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -92,38 +92,10 @@ async def process(
9292
if not should_add_codegate_sys_prompt and not wrksp_custom_instructions:
9393
return PipelineResult(request=request, context=context)
9494

95-
96-
##### NEW CODE PATH #####
97-
98-
if type(request) != ChatCompletionRequest:
99-
request_system_message = {}
100-
req_sys_prompt = ""
101-
for sysprompt in request.get_system_prompt():
102-
req_sys_prompt = sysprompt
103-
104-
system_prompt = await self._construct_system_prompt(
105-
context.client,
106-
wrksp_custom_instructions,
107-
req_sys_prompt,
108-
should_add_codegate_sys_prompt,
109-
)
110-
context.add_alert(self.name, trigger_string=system_prompt)
111-
request.set_system_prompt(system_prompt)
112-
113-
return PipelineResult(request=request, context=context)
114-
115-
##### OLD CODE PATH #####
116-
117-
new_request = request.copy()
118-
119-
if "messages" not in new_request:
120-
new_request["messages"] = []
121-
12295
request_system_message = {}
123-
for message in new_request["messages"]:
124-
if message["role"] == "system":
125-
request_system_message = message
126-
req_sys_prompt = request_system_message.get("content")
96+
req_sys_prompt = ""
97+
for sysprompt in request.get_system_prompt():
98+
req_sys_prompt = sysprompt
12799

128100
system_prompt = await self._construct_system_prompt(
129101
context.client,
@@ -132,12 +104,6 @@ async def process(
132104
should_add_codegate_sys_prompt,
133105
)
134106
context.add_alert(self.name, trigger_string=system_prompt)
135-
if not request_system_message:
136-
# Insert the system prompt at the beginning of the messages
137-
sytem_message = ChatCompletionSystemMessage(content=system_prompt, role="system")
138-
new_request["messages"].insert(0, sytem_message)
139-
else:
140-
# Update the existing system prompt
141-
request_system_message["content"] = system_prompt
142-
143-
return PipelineResult(request=new_request, context=context)
107+
request.set_system_prompt(system_prompt)
108+
109+
return PipelineResult(request=request, context=context)

src/codegate/providers/ollama/adapter.py

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -104,39 +104,3 @@ async def __anext__(self):
104104
return chunk
105105
except StopAsyncIteration:
106106
raise StopAsyncIteration
107-
108-
109-
class ModelToOllama(AsyncIterator[ChatResponse]):
110-
111-
def __init__(self, normalized_reply: AsyncIterator[ModelResponse]):
112-
self.normalized_reply = normalized_reply
113-
self._aiter = normalized_reply.__aiter__()
114-
115-
def __aiter__(self):
116-
return self
117-
118-
async def __anext__(self) -> Union[ChatResponse]:
119-
try:
120-
chunk = await self._aiter.__anext__()
121-
if not isinstance(chunk, ModelResponse):
122-
return chunk
123-
# Convert the timestamp to a datetime object
124-
datetime_obj = datetime.fromtimestamp(chunk.created, tz=timezone.utc)
125-
created_at = datetime_obj.isoformat()
126-
127-
message = chunk.choices[0].delta.content
128-
done = False
129-
if chunk.choices[0].finish_reason == "stop":
130-
done = True
131-
message = ""
132-
133-
# Convert the model response to an Ollama response
134-
ollama_response = ChatResponse(
135-
model=chunk.model,
136-
created_at=created_at,
137-
done=done,
138-
message=Message(content=message, role="assistant"),
139-
)
140-
return ollama_response
141-
except StopAsyncIteration:
142-
raise StopAsyncIteration

0 commit comments

Comments
 (0)