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

Commit cd5331d

Browse files
committed
Removed some leftovers.
1 parent d10d732 commit cd5331d

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,6 +1,6 @@
11
import itertools
22
from abc import abstractmethod
3-
from typing import List, Optional, Tuple
3+
from typing import Any, List, Optional, Tuple
44

55
import regex as re
66

@@ -19,14 +19,6 @@
1919
from codegate.pipeline.output import OutputPipelineContext, OutputPipelineStep
2020
from codegate.pipeline.secrets.manager import SecretsManager
2121
from codegate.pipeline.secrets.signatures import CodegateSignatures, Match
22-
from codegate.pipeline.systemmsg import add_or_update_system_message
23-
from codegate.types.common import (
24-
ChatCompletionRequest,
25-
ChatCompletionSystemMessage,
26-
Delta,
27-
ModelResponse,
28-
StreamingChoices,
29-
)
3022

3123

3224
logger = structlog.get_logger("codegate")
@@ -280,7 +272,7 @@ def _redact_text(
280272
return text_encryptor.obfuscate(text, snippet)
281273

282274
async def process(
283-
self, request: ChatCompletionRequest, context: PipelineContext
275+
self, reques: Any, context: PipelineContext
284276
) -> PipelineResult:
285277
"""
286278
Process the request to find and protect secrets in all messages.
@@ -293,68 +285,34 @@ async def process(
293285
PipelineResult containing the processed request and context with redaction metadata
294286
"""
295287

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

340-
new_request = request.copy()
341295
total_matches = []
342296

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

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

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

417368

@@ -449,10 +400,10 @@ def _find_complete_redaction(self, text: str) -> tuple[Optional[re.Match[str]],
449400

450401
async def process_chunk(
451402
self,
452-
chunk: ModelResponse,
403+
chunk: Any,
453404
context: OutputPipelineContext,
454405
input_context: Optional[PipelineContext] = None,
455-
) -> list[ModelResponse]:
406+
) -> list[Any]:
456407
"""Process a single chunk of the stream"""
457408
if not input_context:
458409
raise ValueError("Input context not found")
@@ -461,9 +412,6 @@ async def process_chunk(
461412
if input_context.sensitive.session_id == "":
462413
raise ValueError("Session ID not found in input context")
463414

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

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

546477
async def process_chunk(
547478
self,
548-
chunk: ModelResponse,
479+
chunk: Any,
549480
context: OutputPipelineContext,
550481
input_context: Optional[PipelineContext] = None,
551-
) -> list[ModelResponse]:
482+
) -> list[Any]:
552483
"""Process a single chunk of the stream"""
553484
if (
554485
not input_context
@@ -568,20 +499,21 @@ async def process_chunk(
568499
)
569500

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