Update app/main.py
Browse files- app/main.py +52 -49
app/main.py
CHANGED
@@ -579,7 +579,31 @@ Ready for your request."""
|
|
579 |
)
|
580 |
]
|
581 |
|
582 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
583 |
new_messages = []
|
584 |
|
585 |
# Add a system message with instructions at the beginning
|
@@ -588,74 +612,53 @@ Ready for your request."""
|
|
588 |
# Add pre-messages
|
589 |
new_messages.extend(pre_messages)
|
590 |
|
591 |
-
# Process all
|
592 |
for i, message in enumerate(messages):
|
593 |
-
|
594 |
-
# Pass system messages through as is
|
595 |
-
new_messages.append(message)
|
596 |
|
597 |
-
|
598 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
599 |
if isinstance(message.content, str):
|
600 |
new_messages.append(OpenAIMessage(
|
601 |
role=message.role,
|
602 |
content=urllib.parse.quote(message.content)
|
603 |
))
|
604 |
elif isinstance(message.content, list):
|
605 |
-
#
|
606 |
encoded_parts = []
|
607 |
for part in message.content:
|
608 |
if isinstance(part, dict) and part.get('type') == 'text':
|
609 |
-
# URL encode text parts
|
610 |
encoded_parts.append({
|
611 |
'type': 'text',
|
612 |
'text': urllib.parse.quote(part.get('text', ''))
|
613 |
})
|
614 |
-
|
615 |
-
|
616 |
-
|
617 |
-
|
|
|
|
|
|
|
|
|
618 |
new_messages.append(OpenAIMessage(
|
619 |
role=message.role,
|
620 |
content=encoded_parts
|
621 |
))
|
622 |
-
else:
|
623 |
-
# For assistant messages
|
624 |
-
# Check if this is the last assistant message in the conversation
|
625 |
-
is_last_assistant = True
|
626 |
-
for remaining_msg in messages[i+1:]:
|
627 |
-
if remaining_msg.role != "user":
|
628 |
-
is_last_assistant = False
|
629 |
-
break
|
630 |
-
|
631 |
-
if is_last_assistant:
|
632 |
-
# URL encode the last assistant message content
|
633 |
-
if isinstance(message.content, str):
|
634 |
-
new_messages.append(OpenAIMessage(
|
635 |
-
role=message.role,
|
636 |
-
content=urllib.parse.quote(message.content)
|
637 |
-
))
|
638 |
-
elif isinstance(message.content, list):
|
639 |
-
# Handle list content similar to user messages
|
640 |
-
encoded_parts = []
|
641 |
-
for part in message.content:
|
642 |
-
if isinstance(part, dict) and part.get('type') == 'text':
|
643 |
-
encoded_parts.append({
|
644 |
-
'type': 'text',
|
645 |
-
'text': urllib.parse.quote(part.get('text', ''))
|
646 |
-
})
|
647 |
-
else:
|
648 |
-
encoded_parts.append(part)
|
649 |
-
|
650 |
-
new_messages.append(OpenAIMessage(
|
651 |
-
role=message.role,
|
652 |
-
content=encoded_parts
|
653 |
-
))
|
654 |
-
else:
|
655 |
-
# For non-string/list content, keep as is
|
656 |
-
new_messages.append(message)
|
657 |
else:
|
658 |
-
# For
|
|
|
659 |
new_messages.append(message)
|
660 |
|
661 |
print(f"Created encrypted prompt with {len(new_messages)} messages")
|
|
|
579 |
)
|
580 |
]
|
581 |
|
582 |
+
# --- Find the index of the single assistant message to encrypt ---
|
583 |
+
target_assistant_index = -1
|
584 |
+
num_messages = len(messages)
|
585 |
+
for i in range(num_messages - 1, -1, -1): # Iterate backwards
|
586 |
+
if messages[i].role == 'assistant':
|
587 |
+
# Condition 1: Is assistant message - met.
|
588 |
+
# Condition 2: Not the last message overall?
|
589 |
+
is_last_overall = (i == num_messages - 1)
|
590 |
+
if is_last_overall:
|
591 |
+
continue # Cannot be the target if it's the last message
|
592 |
+
|
593 |
+
# Condition 3: Has a user/system message after it?
|
594 |
+
has_user_system_after = False
|
595 |
+
for k in range(i + 1, num_messages):
|
596 |
+
if messages[k].role in ['user', 'system']:
|
597 |
+
has_user_system_after = True
|
598 |
+
break
|
599 |
+
|
600 |
+
if has_user_system_after:
|
601 |
+
# This is the last assistant message meeting all criteria
|
602 |
+
target_assistant_index = i
|
603 |
+
print(f"DEBUG: Identified target assistant message for encoding at index {target_assistant_index}")
|
604 |
+
break # Found the target, stop searching
|
605 |
+
|
606 |
+
# --- Create the new message list with specific encoding ---
|
607 |
new_messages = []
|
608 |
|
609 |
# Add a system message with instructions at the beginning
|
|
|
612 |
# Add pre-messages
|
613 |
new_messages.extend(pre_messages)
|
614 |
|
615 |
+
# Process all original messages
|
616 |
for i, message in enumerate(messages):
|
617 |
+
encode_this_message = False
|
|
|
|
|
618 |
|
619 |
+
if message.role == "user":
|
620 |
+
encode_this_message = True
|
621 |
+
print(f"DEBUG: Encoding user message (index {i})")
|
622 |
+
elif message.role == "assistant" and i == target_assistant_index:
|
623 |
+
encode_this_message = True
|
624 |
+
print(f"DEBUG: Encoding target assistant message (index {i})")
|
625 |
+
else:
|
626 |
+
# Keep system, other assistant, tool messages as is
|
627 |
+
print(f"DEBUG: Passing through message (index {i}, role {message.role}) without encoding")
|
628 |
+
new_messages.append(message)
|
629 |
+
continue # Skip encoding logic below for this message
|
630 |
+
|
631 |
+
# Apply encoding if needed
|
632 |
+
if encode_this_message:
|
633 |
if isinstance(message.content, str):
|
634 |
new_messages.append(OpenAIMessage(
|
635 |
role=message.role,
|
636 |
content=urllib.parse.quote(message.content)
|
637 |
))
|
638 |
elif isinstance(message.content, list):
|
639 |
+
# Handle list content (encode text parts, pass others)
|
640 |
encoded_parts = []
|
641 |
for part in message.content:
|
642 |
if isinstance(part, dict) and part.get('type') == 'text':
|
|
|
643 |
encoded_parts.append({
|
644 |
'type': 'text',
|
645 |
'text': urllib.parse.quote(part.get('text', ''))
|
646 |
})
|
647 |
+
# Pass through non-text parts (like images) as is
|
648 |
+
elif isinstance(part, dict) and part.get('type') == 'image_url':
|
649 |
+
encoded_parts.append(part)
|
650 |
+
elif isinstance(part, ContentPartImage): # Handle Pydantic model case
|
651 |
+
encoded_parts.append(part)
|
652 |
+
# Add other potential non-text part types if necessary
|
653 |
+
else: # Pass through any other unknown part types
|
654 |
+
encoded_parts.append(part)
|
655 |
new_messages.append(OpenAIMessage(
|
656 |
role=message.role,
|
657 |
content=encoded_parts
|
658 |
))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
659 |
else:
|
660 |
+
# For non-string/list content, keep as is (shouldn't be encoded)
|
661 |
+
print(f"DEBUG: Passing through non-string/list content for message index {i} without encoding")
|
662 |
new_messages.append(message)
|
663 |
|
664 |
print(f"Created encrypted prompt with {len(new_messages)} messages")
|