From 6bd33a6ae30d814bce9decd909028b0fd66c78d5 Mon Sep 17 00:00:00 2001 From: Slipstream Date: Wed, 30 Apr 2025 21:05:13 -0600 Subject: [PATCH] aa --- gurt/api.py | 4 +-- print_vertex_schema.py | 80 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 print_vertex_schema.py diff --git a/gurt/api.py b/gurt/api.py index 6b23f5a..36f3f6e 100644 --- a/gurt/api.py +++ b/gurt/api.py @@ -1096,8 +1096,8 @@ async def get_ai_response(cog: 'GurtCog', message: discord.Message, model_name: # Start with base config (which now includes system_instruction) final_gen_config_dict = base_generation_config_dict.copy() final_gen_config_dict.update({ - "response_mime_type": "application/json", - "response_schema": processed_response_schema, + # "response_mime_type": "application/json", + # "response_schema": processed_response_schema, # Explicitly exclude tools/tool_config for final JSON generation "tools": None, "tool_config": None, diff --git a/print_vertex_schema.py b/print_vertex_schema.py new file mode 100644 index 0000000..8bcd7eb --- /dev/null +++ b/print_vertex_schema.py @@ -0,0 +1,80 @@ +import copy +import json +from typing import Dict, Any + +# --- Schema Preprocessing Helper --- +# Copied from discordbot/gurt/api.py +def _preprocess_schema_for_vertex(schema: Dict[str, Any]) -> Dict[str, Any]: + """ + Recursively preprocesses a JSON schema dictionary to replace list types + (like ["string", "null"]) with the first non-null type, making it + compatible with Vertex AI's GenerationConfig schema requirements. + + Args: + schema: The JSON schema dictionary to preprocess. + + Returns: + A new, preprocessed schema dictionary. + """ + if not isinstance(schema, dict): + return schema # Return non-dict elements as is + + processed_schema = copy.deepcopy(schema) # Work on a copy + + for key, value in processed_schema.items(): + if key == "type" and isinstance(value, list): + # Find the first non-"null" type in the list + first_valid_type = next((t for t in value if isinstance(t, str) and t.lower() != "null"), None) + if first_valid_type: + processed_schema[key] = first_valid_type + else: + # Fallback if only "null" or invalid types are present (shouldn't happen in valid schemas) + processed_schema[key] = "object" # Or handle as error + print(f"Warning: Schema preprocessing found list type '{value}' with no valid non-null string type. Falling back to 'object'.") + elif isinstance(value, dict): + processed_schema[key] = _preprocess_schema_for_vertex(value) # Recurse for nested objects + elif isinstance(value, list): + # Recurse for items within arrays (e.g., in 'properties' of array items) + processed_schema[key] = [_preprocess_schema_for_vertex(item) if isinstance(item, dict) else item for item in value] + # Handle 'properties' specifically + elif key == "properties" and isinstance(value, dict): + processed_schema[key] = {prop_key: _preprocess_schema_for_vertex(prop_value) for prop_key, prop_value in value.items()} + # Handle 'items' specifically if it's a schema object + elif key == "items" and isinstance(value, dict): + processed_schema[key] = _preprocess_schema_for_vertex(value) + + return processed_schema + +# --- Response Schema --- +# Copied from discordbot/gurt/config.py +RESPONSE_SCHEMA = { + "name": "gurt_response", + "description": "The structured response from Gurt.", + "schema": { + "type": "object", + "properties": { + "should_respond": { + "type": "boolean", + "description": "Whether the bot should send a text message in response." + }, + "content": { + "type": "string", + "description": "The text content of the bot's response. Can be empty if only reacting." + }, + "react_with_emoji": { + "type": ["string", "null"], + "description": "Optional: A standard Discord emoji to react with, or null/empty if no reaction." + }, + "reply_to_message_id": { + "type": ["string", "null"], + "description": "Optional: The ID of the message this response should reply to. Null or omit for a regular message." + } + # Note: tool_requests is handled by Vertex AI's function calling mechanism + }, + "required": ["should_respond", "content"] + } +} + +if __name__ == "__main__": + processed = _preprocess_schema_for_vertex(RESPONSE_SCHEMA['schema']) + print(json.dumps(processed, indent=2))