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")
|