Files

1 line
22 KiB
JSON

{"repo": "acidicsoil/pyai", "files": {".cursor/tools/llm_api.py": {"fd7880e0d22135894e721713775172a7ef46d4cf": {"t": 1785745428.3480387, "n": 10398, "h": "8a5656c386313b5d", "c": "#!/usr/bin/env /workspace/tmp_windsurf/venv/bin/python3\n\nimport google.generativeai as genai\nfrom openai import OpenAI, AzureOpenAI\nfrom anthropic import Anthropic\nimport argparse\nimport os\nfrom dotenv import load_dotenv\nfrom pathlib import Path\nimport sys\nimport base64\nfrom typing import Optional, Union, List\nimport mimetypes\n\ndef load_environment():\n \"\"\"Load environment variables from .env files in order of precedence\"\"\"\n # Order of precedence:\n # 1. System environment variables (already loaded)\n # 2. .env.local (user-specific overrides)\n # 3. .env (project defaults)\n # 4. .env.example (example configuration)\n \n env_files = ['.env.local', '.env', '.env.example']\n env_loaded = False\n \n print(\"Current working directory:\", Path('.').absolute(), file=sys.stderr)\n print(\"Looking for environment files:\", env_files, file=sys.stderr)\n \n for env_file in env_files:\n env_path = Path('.') / env_file\n print(f\"Checking {env_path.absolute()}\", file=sys.stderr)\n if env_path.exists():\n print(f\"Found {env_file}, loading variables...\", file=sys.stderr)\n load_dotenv(dotenv_path=env_path)\n env_loaded = True\n print(f\"Loaded environment variables from {env_file}\", file=sys.stderr)\n # Print loaded keys (but not values for security)\n with open(env_path) as f:\n keys = [line.split('=')[0].strip() for line in f if '=' in line and not line.startswith('#')]\n print(f\"Keys loaded from {env_file}: {keys}\", file=sys.stderr)\n \n if not env_loaded:\n print(\"Warning: No .env files found. Using system environment variables only.\", file=sys.stderr)\n print(\"Available system environment variables:\", list(os.environ.keys()), file=sys.stderr)\n\n# Load environment variables at module import\nload_environment()\n\ndef encode_image_file(image_path: str) -> tuple[str, str]:\n \"\"\"\n Encode an image file to base64 and determine its MIME type.\n \n Args:\n image_path (str): Path to the image file\n \n Returns:\n tuple: (base64_encoded_string, mime_type)\n \"\"\"\n mime_type, _ = mimetypes.guess_type(image_path)\n if not mime_type:\n mime_type = 'image/png' # Default to PNG if type cannot be determined\n \n with open(image_path, \"rb\") as image_file:\n encoded_string = base64.b64encode(image_file.read()).decode('utf-8')\n \n return encoded_string, mime_type\n\ndef create_llm_client(provider=\"openai\"):\n if provider == \"openai\":\n api_key = os.getenv('OPENAI_API_KEY')\n if not api_key:\n raise ValueError(\"OPENAI_API_KEY not found in environment variables\")\n return OpenAI(\n api_key=api_key\n )\n elif provider == \"azure\":\n api_key = os.getenv('AZURE_OPENAI_API_KEY')\n if not api_key:\n raise ValueError(\"AZURE_OPENAI_API_KEY not found in environment variables\")\n return AzureOpenAI(\n api_key=api_key,\n api_version=\"2024-08-01-preview\",\n azure_endpoint=\"https://msopenai.openai.azure.com\"\n )\n elif provider == \"deepseek\":\n api_key = os.getenv('DEEPSEEK_API_KEY')\n if not api_key:\n raise ValueError(\"DEEPSEEK_API_KEY not found in environment variables\")\n return OpenAI(\n api_key=api_key,\n base_url=\"https://api.deepseek.com/v1\",\n )\n elif provider == \"siliconflow\":\n api_key = os.getenv('SILICONFLOW_API_KEY')\n if not api_key:\n raise ValueError(\"SILICONFLOW_API_KEY not found in environment variables\")\n return OpenAI(\n api_key=api_key,\n base_url=\"https://api.siliconflow.cn/v1\"\n )\n elif provider == \"anthropic\":\n api_key = os.getenv('ANTHROPIC_API_KEY')\n if not api_key:\n raise ValueError(\"ANTHROPIC_API_KEY not found in environment variables\")\n return Anthropic(\n api_key=api_key\n )\n elif provider == \"gemini\":\n api_key = os.getenv('GOOGLE_API_KEY')\n if not api_key:\n raise ValueError(\"GOOGLE_API_KEY not found in environment variables\")\n genai.configure(api_key=api_key)\n return genai\n elif provider == \"local\":\n return OpenAI(\n base_url=\"http://192.168.180.137:8006/v1\",\n api_key=\"not-needed\"\n )\n else:\n raise ValueError(f\"Unsupported provider: {provider}\")\n\ndef query_llm(prompt: str, client=None, model=None, provider=\"openai\", image_path: Optional[str] = None) -> Optional[str]:\n \"\"\"\n Query an LLM with a prompt and optional image attachment.\n \n Args:\n prompt (str): The text prompt to send\n client: The LLM client instance\n model (str, optional): The model to use\n provider (str): The API provider to use\n image_path (str, optional): Path to an image file to attach\n \n Returns:\n Optional[str]: The LLM's response or None if there was an error\n \"\"\"\n if client is None:\n client = create_llm_client(provider)\n \n try:\n # Set default model\n if model is None:\n if provider == \"openai\":\n model = \"gpt-4o\"\n elif provider == \"azure\":\n model = os.getenv('AZURE_OPENAI_MODEL_DEPLOYMENT', 'gpt-4o-ms') # Get from env with fallback\n elif provider == \"deepseek\":\n model = \"deepseek-chat\"\n elif provider == \"siliconflow\":\n model = \"deepseek-ai/DeepSeek-R1\"\n elif provider == \"anthropic\":\n model = \"claude-3-7-sonnet-20250219\"\n elif provider == \"gemini\":\n model = \"gemini-2.0-flash-exp\"\n elif provider == \"local\":\n model = \"Qwen/Qwen2.5-32B-Instruct-AWQ\"\n \n if provider in [\"openai\", \"local\", \"deepseek\", \"azure\", \"siliconflow\"]:\n messages = [{\"role\": \"user\", \"content\": []}]\n \n # Add text content\n messages[0][\"content\"].append({\n \"type\": \"text\",\n \"text\": prompt\n })\n \n # Add image content if provided\n if image_path:\n if provider == \"openai\":\n encoded_image, mime_type = encode_image_file(image_path)\n messages[0][\"content\"] = [\n {\"type\": \"text\", \"text\": prompt},\n {\"type\": \"image_url\", \"image_url\": {\"url\": f\"data:{mime_type};base64,{encoded_image}\"}}\n ]\n \n kwargs = {\n \"model\": model,\n \"messages\": messages,\n \"temperature\": 0.7,\n }\n \n # Add o1-specific parameters\n if model == \"o1\":\n kwargs[\"response_format\"] = {\"type\": \"text\"}\n kwargs[\"reasoning_effort\"] = \"low\"\n del kwargs[\"temperature\"]\n \n response = client.chat.completions.create(**kwargs)\n return response.choices[0].message.content\n \n elif provider == \"anthropic\":\n messages = [{\"role\": \"user\", \"content\": []}]\n \n # Add text content\n messages[0][\"content\"].append({\n \"type\": \"text\",\n \"text\": prompt\n })\n \n # Add image content if provided\n if image_path:\n encoded_image, mime_type = encode_image_file(image_path)\n messages[0][\"content\"].append({\n \"type\": \"image\",\n \"source\": {\n \"type\": \"base64\",\n \"media_type\": mime_type,\n \"data\": encoded_image\n }\n })\n \n response = client.messages.create(\n model=model,\n max_tokens=1000,\n messages=messages\n )\n return response.content[0].text\n \n elif provider == \"gemini\":\n model = client.GenerativeModel(model)\n if image_path:\n file = genai.upload_file(image_path, mime_type=\"image/png\")\n chat_session = model.start_chat(\n history=[{\n \"role\": \"user\",\n \"parts\": [file, prompt]\n }]\n )\n else:\n chat_session = model.start_chat(\n history=[{\n \"role\": \"user\",\n \"parts\": [prompt]\n }]\n )\n response = chat_session.send_message(prompt)\n return response.text\n \n except Exception as e:\n print(f\"Error querying LLM: {e}\", file=sys.stderr)\n return None\n\ndef main():\n parser = argparse.ArgumentParser(description='Query an LLM with a prompt')\n parser.add_argument('--prompt', type=str, help='The prompt to send to the LLM', required=True)\n parser.add_argument('--provider', choices=['openai','anthropic','gemini','local','deepseek','azure','siliconflow'], default='openai', help='The API provider to use')\n parser.add_argument('--model', type=str, help='The model to use (default depends on provider)')\n parser.add_argument('--image', type=str, help='Path to an image file to attach to the prompt')\n args = parser.parse_args()\n\n if not args.model:\n if args.provider == 'openai':\n args.model = \"gpt-4o\" \n elif args.provider == \"deepseek\":\n args.model = \"deepseek-chat\"\n elif args.provider == \"siliconflow\":\n args.model = \"deepseek-ai/DeepSeek-R1\"\n elif args.provider == 'anthropic':\n args.model = \"claude-3-7-sonnet-20250219\"\n elif args.provider == 'gemini':\n args.model = \"gemini-2.0-flash-exp\"\n elif args.provider == 'azure':\n args.model = os.getenv('AZURE_OPENAI_MODEL_DEPLOYMENT', 'gpt-4o-ms') # Get from env with fallback\n\n client = create_llm_client(args.provider)\n response = query_llm(args.prompt, client, model=args.model, provider=args.provider, image_path=args.image)\n if response:\n print(response)\n else:\n print(\"Failed to get response from LLM\")\n\nif __name__ == \"__main__\":\n main()"}, "1110040682cc08d32e02e2b8a3aec4b434c82583": {"t": 1785753087.4618852, "n": 10398, "h": "8a5656c386313b5d", "c": "#!/usr/bin/env /workspace/tmp_windsurf/venv/bin/python3\n\nimport google.generativeai as genai\nfrom openai import OpenAI, AzureOpenAI\nfrom anthropic import Anthropic\nimport argparse\nimport os\nfrom dotenv import load_dotenv\nfrom pathlib import Path\nimport sys\nimport base64\nfrom typing import Optional, Union, List\nimport mimetypes\n\ndef load_environment():\n \"\"\"Load environment variables from .env files in order of precedence\"\"\"\n # Order of precedence:\n # 1. System environment variables (already loaded)\n # 2. .env.local (user-specific overrides)\n # 3. .env (project defaults)\n # 4. .env.example (example configuration)\n \n env_files = ['.env.local', '.env', '.env.example']\n env_loaded = False\n \n print(\"Current working directory:\", Path('.').absolute(), file=sys.stderr)\n print(\"Looking for environment files:\", env_files, file=sys.stderr)\n \n for env_file in env_files:\n env_path = Path('.') / env_file\n print(f\"Checking {env_path.absolute()}\", file=sys.stderr)\n if env_path.exists():\n print(f\"Found {env_file}, loading variables...\", file=sys.stderr)\n load_dotenv(dotenv_path=env_path)\n env_loaded = True\n print(f\"Loaded environment variables from {env_file}\", file=sys.stderr)\n # Print loaded keys (but not values for security)\n with open(env_path) as f:\n keys = [line.split('=')[0].strip() for line in f if '=' in line and not line.startswith('#')]\n print(f\"Keys loaded from {env_file}: {keys}\", file=sys.stderr)\n \n if not env_loaded:\n print(\"Warning: No .env files found. Using system environment variables only.\", file=sys.stderr)\n print(\"Available system environment variables:\", list(os.environ.keys()), file=sys.stderr)\n\n# Load environment variables at module import\nload_environment()\n\ndef encode_image_file(image_path: str) -> tuple[str, str]:\n \"\"\"\n Encode an image file to base64 and determine its MIME type.\n \n Args:\n image_path (str): Path to the image file\n \n Returns:\n tuple: (base64_encoded_string, mime_type)\n \"\"\"\n mime_type, _ = mimetypes.guess_type(image_path)\n if not mime_type:\n mime_type = 'image/png' # Default to PNG if type cannot be determined\n \n with open(image_path, \"rb\") as image_file:\n encoded_string = base64.b64encode(image_file.read()).decode('utf-8')\n \n return encoded_string, mime_type\n\ndef create_llm_client(provider=\"openai\"):\n if provider == \"openai\":\n api_key = os.getenv('OPENAI_API_KEY')\n if not api_key:\n raise ValueError(\"OPENAI_API_KEY not found in environment variables\")\n return OpenAI(\n api_key=api_key\n )\n elif provider == \"azure\":\n api_key = os.getenv('AZURE_OPENAI_API_KEY')\n if not api_key:\n raise ValueError(\"AZURE_OPENAI_API_KEY not found in environment variables\")\n return AzureOpenAI(\n api_key=api_key,\n api_version=\"2024-08-01-preview\",\n azure_endpoint=\"https://msopenai.openai.azure.com\"\n )\n elif provider == \"deepseek\":\n api_key = os.getenv('DEEPSEEK_API_KEY')\n if not api_key:\n raise ValueError(\"DEEPSEEK_API_KEY not found in environment variables\")\n return OpenAI(\n api_key=api_key,\n base_url=\"https://api.deepseek.com/v1\",\n )\n elif provider == \"siliconflow\":\n api_key = os.getenv('SILICONFLOW_API_KEY')\n if not api_key:\n raise ValueError(\"SILICONFLOW_API_KEY not found in environment variables\")\n return OpenAI(\n api_key=api_key,\n base_url=\"https://api.siliconflow.cn/v1\"\n )\n elif provider == \"anthropic\":\n api_key = os.getenv('ANTHROPIC_API_KEY')\n if not api_key:\n raise ValueError(\"ANTHROPIC_API_KEY not found in environment variables\")\n return Anthropic(\n api_key=api_key\n )\n elif provider == \"gemini\":\n api_key = os.getenv('GOOGLE_API_KEY')\n if not api_key:\n raise ValueError(\"GOOGLE_API_KEY not found in environment variables\")\n genai.configure(api_key=api_key)\n return genai\n elif provider == \"local\":\n return OpenAI(\n base_url=\"http://192.168.180.137:8006/v1\",\n api_key=\"not-needed\"\n )\n else:\n raise ValueError(f\"Unsupported provider: {provider}\")\n\ndef query_llm(prompt: str, client=None, model=None, provider=\"openai\", image_path: Optional[str] = None) -> Optional[str]:\n \"\"\"\n Query an LLM with a prompt and optional image attachment.\n \n Args:\n prompt (str): The text prompt to send\n client: The LLM client instance\n model (str, optional): The model to use\n provider (str): The API provider to use\n image_path (str, optional): Path to an image file to attach\n \n Returns:\n Optional[str]: The LLM's response or None if there was an error\n \"\"\"\n if client is None:\n client = create_llm_client(provider)\n \n try:\n # Set default model\n if model is None:\n if provider == \"openai\":\n model = \"gpt-4o\"\n elif provider == \"azure\":\n model = os.getenv('AZURE_OPENAI_MODEL_DEPLOYMENT', 'gpt-4o-ms') # Get from env with fallback\n elif provider == \"deepseek\":\n model = \"deepseek-chat\"\n elif provider == \"siliconflow\":\n model = \"deepseek-ai/DeepSeek-R1\"\n elif provider == \"anthropic\":\n model = \"claude-3-7-sonnet-20250219\"\n elif provider == \"gemini\":\n model = \"gemini-2.0-flash-exp\"\n elif provider == \"local\":\n model = \"Qwen/Qwen2.5-32B-Instruct-AWQ\"\n \n if provider in [\"openai\", \"local\", \"deepseek\", \"azure\", \"siliconflow\"]:\n messages = [{\"role\": \"user\", \"content\": []}]\n \n # Add text content\n messages[0][\"content\"].append({\n \"type\": \"text\",\n \"text\": prompt\n })\n \n # Add image content if provided\n if image_path:\n if provider == \"openai\":\n encoded_image, mime_type = encode_image_file(image_path)\n messages[0][\"content\"] = [\n {\"type\": \"text\", \"text\": prompt},\n {\"type\": \"image_url\", \"image_url\": {\"url\": f\"data:{mime_type};base64,{encoded_image}\"}}\n ]\n \n kwargs = {\n \"model\": model,\n \"messages\": messages,\n \"temperature\": 0.7,\n }\n \n # Add o1-specific parameters\n if model == \"o1\":\n kwargs[\"response_format\"] = {\"type\": \"text\"}\n kwargs[\"reasoning_effort\"] = \"low\"\n del kwargs[\"temperature\"]\n \n response = client.chat.completions.create(**kwargs)\n return response.choices[0].message.content\n \n elif provider == \"anthropic\":\n messages = [{\"role\": \"user\", \"content\": []}]\n \n # Add text content\n messages[0][\"content\"].append({\n \"type\": \"text\",\n \"text\": prompt\n })\n \n # Add image content if provided\n if image_path:\n encoded_image, mime_type = encode_image_file(image_path)\n messages[0][\"content\"].append({\n \"type\": \"image\",\n \"source\": {\n \"type\": \"base64\",\n \"media_type\": mime_type,\n \"data\": encoded_image\n }\n })\n \n response = client.messages.create(\n model=model,\n max_tokens=1000,\n messages=messages\n )\n return response.content[0].text\n \n elif provider == \"gemini\":\n model = client.GenerativeModel(model)\n if image_path:\n file = genai.upload_file(image_path, mime_type=\"image/png\")\n chat_session = model.start_chat(\n history=[{\n \"role\": \"user\",\n \"parts\": [file, prompt]\n }]\n )\n else:\n chat_session = model.start_chat(\n history=[{\n \"role\": \"user\",\n \"parts\": [prompt]\n }]\n )\n response = chat_session.send_message(prompt)\n return response.text\n \n except Exception as e:\n print(f\"Error querying LLM: {e}\", file=sys.stderr)\n return None\n\ndef main():\n parser = argparse.ArgumentParser(description='Query an LLM with a prompt')\n parser.add_argument('--prompt', type=str, help='The prompt to send to the LLM', required=True)\n parser.add_argument('--provider', choices=['openai','anthropic','gemini','local','deepseek','azure','siliconflow'], default='openai', help='The API provider to use')\n parser.add_argument('--model', type=str, help='The model to use (default depends on provider)')\n parser.add_argument('--image', type=str, help='Path to an image file to attach to the prompt')\n args = parser.parse_args()\n\n if not args.model:\n if args.provider == 'openai':\n args.model = \"gpt-4o\" \n elif args.provider == \"deepseek\":\n args.model = \"deepseek-chat\"\n elif args.provider == \"siliconflow\":\n args.model = \"deepseek-ai/DeepSeek-R1\"\n elif args.provider == 'anthropic':\n args.model = \"claude-3-7-sonnet-20250219\"\n elif args.provider == 'gemini':\n args.model = \"gemini-2.0-flash-exp\"\n elif args.provider == 'azure':\n args.model = os.getenv('AZURE_OPENAI_MODEL_DEPLOYMENT', 'gpt-4o-ms') # Get from env with fallback\n\n client = create_llm_client(args.provider)\n response = query_llm(args.prompt, client, model=args.model, provider=args.provider, image_path=args.image)\n if response:\n print(response)\n else:\n print(\"Failed to get response from LLM\")\n\nif __name__ == \"__main__\":\n main()"}}}}