Files

187 lines
6.4 KiB
Python

import os
import sys
import google.generativeai as genai
from dotenv import load_dotenv
from ollama import Client
from openai import OpenAI
import anthropic
from prompt_toolkit.shortcuts import input_dialog
class Config:
"""
Configuration class for managing settings.
Attributes:
verbose (bool): Flag indicating whether verbose mode is enabled.
openai_api_key (str): API key for OpenAI.
google_api_key (str): API key for Google.
ollama_host (str): url to ollama running remotely.
"""
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(Config, cls).__new__(cls)
# Put any initialization here
return cls._instance
def __init__(self):
load_dotenv()
self.verbose = False
self.openai_api_key = (
None # instance variables are backups in case saving to a `.env` fails
)
self.google_api_key = (
None # instance variables are backups in case saving to a `.env` fails
)
self.ollama_host = (
None # instance variables are backups in case savint to a `.env` fails
)
self.anthropic_api_key = (
None # instance variables are backups in case saving to a `.env` fails
)
self.qwen_api_key = (
None # instance variables are backups in case saving to a `.env` fails
)
def initialize_openai(self):
if self.verbose:
print("[Config][initialize_openai]")
if self.openai_api_key:
if self.verbose:
print("[Config][initialize_openai] using cached openai_api_key")
api_key = self.openai_api_key
else:
if self.verbose:
print(
"[Config][initialize_openai] no cached openai_api_key, try to get from env."
)
api_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(
api_key=api_key,
)
client.api_key = api_key
client.base_url = os.getenv("OPENAI_API_BASE_URL", client.base_url)
return client
def initialize_qwen(self):
if self.verbose:
print("[Config][initialize_qwen]")
if self.qwen_api_key:
if self.verbose:
print("[Config][initialize_qwen] using cached qwen_api_key")
api_key = self.qwen_api_key
else:
if self.verbose:
print(
"[Config][initialize_qwen] no cached qwen_api_key, try to get from env."
)
api_key = os.getenv("QWEN_API_KEY")
client = OpenAI(
api_key=api_key,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
client.api_key = api_key
client.base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
return client
def initialize_google(self):
if self.google_api_key:
if self.verbose:
print("[Config][initialize_google] using cached google_api_key")
api_key = self.google_api_key
else:
if self.verbose:
print(
"[Config][initialize_google] no cached google_api_key, try to get from env."
)
api_key = os.getenv("GOOGLE_API_KEY")
genai.configure(api_key=api_key, transport="rest")
model = genai.GenerativeModel("gemini-pro-vision")
return model
def initialize_ollama(self):
if self.ollama_host:
if self.verbose:
print("[Config][initialize_ollama] using cached ollama host")
else:
if self.verbose:
print(
"[Config][initialize_ollama] no cached ollama host. Assuming ollama running locally."
)
self.ollama_host = os.getenv("OLLAMA_HOST", None)
model = Client(host=self.ollama_host)
return model
def initialize_anthropic(self):
if self.anthropic_api_key:
api_key = self.anthropic_api_key
else:
api_key = os.getenv("ANTHROPIC_API_KEY")
return anthropic.Anthropic(api_key=api_key)
def validation(self, model, voice_mode):
"""
Validate the input parameters for the dialog operation.
"""
self.require_api_key(
"OPENAI_API_KEY",
"OpenAI API key",
model == "gpt-4"
or voice_mode
or model == "gpt-4-with-som"
or model == "gpt-4-with-ocr"
or model == "o1-with-ocr",
)
self.require_api_key(
"GOOGLE_API_KEY", "Google API key", model == "gemini-pro-vision"
)
self.require_api_key(
"ANTHROPIC_API_KEY", "Anthropic API key", model == "claude-3"
)
self.require_api_key("QWEN_API_KEY", "Qwen API key", model == "qwen-vl")
def require_api_key(self, key_name, key_description, is_required):
key_exists = bool(os.environ.get(key_name))
if self.verbose:
print("[Config] require_api_key")
print("[Config] key_name", key_name)
print("[Config] key_description", key_description)
print("[Config] key_exists", key_exists)
if is_required and not key_exists:
self.prompt_and_save_api_key(key_name, key_description)
def prompt_and_save_api_key(self, key_name, key_description):
key_value = input_dialog(
title="API Key Required", text=f"Please enter your {key_description}:"
).run()
if key_value is None: # User pressed cancel or closed the dialog
sys.exit("Operation cancelled by user.")
if key_value:
if key_name == "OPENAI_API_KEY":
self.openai_api_key = key_value
elif key_name == "GOOGLE_API_KEY":
self.google_api_key = key_value
elif key_name == "ANTHROPIC_API_KEY":
self.anthropic_api_key = key_value
elif key_name == "QWEN_API_KEY":
self.qwen_api_key = key_value
self.save_api_key_to_env(key_name, key_value)
load_dotenv() # Reload environment variables
# Update the instance attribute with the new key
@staticmethod
def save_api_key_to_env(key_name, key_value):
with open(".env", "a") as file:
file.write(f"\n{key_name}='{key_value}'")