115 lines
4.3 KiB
Python
115 lines
4.3 KiB
Python
"""AI providers setup component for API key manager."""
|
|
|
|
from typing import Dict, Any
|
|
from loguru import logger
|
|
import streamlit as st
|
|
import os
|
|
import sys
|
|
|
|
def render_ai_providers_setup(api_key_manager) -> Dict[str, Any]:
|
|
"""
|
|
Render the AI providers setup component.
|
|
|
|
Args:
|
|
api_key_manager: API key manager instance
|
|
|
|
Returns:
|
|
Dict[str, Any]: Component state
|
|
"""
|
|
try:
|
|
logger.info("[render_ai_providers_setup] Rendering AI providers setup")
|
|
|
|
# Display section header
|
|
st.header("Step 1: Select AI Providers")
|
|
st.markdown("""
|
|
Configure your AI providers to enable advanced content generation capabilities.
|
|
Choose and set up the AI services you want to use.
|
|
""")
|
|
|
|
# Create columns for different providers
|
|
col1, col2 = st.columns(2)
|
|
|
|
with col1:
|
|
st.subheader("OpenAI")
|
|
st.markdown("""
|
|
OpenAI's GPT models provide powerful natural language processing capabilities.
|
|
|
|
Get your API key from: [OpenAI Dashboard](https://platform.openai.com/account/api-keys)
|
|
""")
|
|
|
|
openai_key = api_key_manager.get_api_key("openai")
|
|
openai_input = st.text_input(
|
|
"OpenAI API Key",
|
|
value=openai_key if openai_key else "",
|
|
type="password",
|
|
key="openai_key_input"
|
|
)
|
|
|
|
with col2:
|
|
st.subheader("Google Gemini")
|
|
st.markdown("""
|
|
Google's Gemini models offer advanced AI capabilities.
|
|
|
|
Get your API key from: [Google AI Studio](https://makersuite.google.com/app/apikey)
|
|
""")
|
|
|
|
gemini_key = api_key_manager.get_api_key("gemini")
|
|
gemini_input = st.text_input(
|
|
"Gemini API Key",
|
|
value=gemini_key if gemini_key else "",
|
|
type="password",
|
|
key="gemini_key_input"
|
|
)
|
|
|
|
# Optional AI Provider
|
|
st.subheader("Additional AI Provider (Optional)")
|
|
col1, col2 = st.columns(2)
|
|
|
|
with col1:
|
|
st.markdown("""
|
|
Mistral AI provides an alternative model for content generation.
|
|
|
|
Get your API key from: [Mistral Platform](https://console.mistral.ai/api-keys/)
|
|
""")
|
|
|
|
mistral_key = api_key_manager.get_api_key("mistral")
|
|
mistral_input = st.text_input(
|
|
"Mistral API Key (Optional)",
|
|
value=mistral_key if mistral_key else "",
|
|
type="password",
|
|
key="mistral_key_input"
|
|
)
|
|
|
|
# Add a note about saving
|
|
st.info("""
|
|
Note: At least one AI provider (OpenAI or Google Gemini) is required.
|
|
Click Continue to save your keys and proceed.
|
|
""")
|
|
|
|
# Save keys if they've changed when proceeding to next step
|
|
if st.session_state.get('wizard_current_step', 1) > 1:
|
|
if openai_input != openai_key:
|
|
api_key_manager.save_api_key("openai", openai_input)
|
|
logger.info("[render_ai_providers_setup] OpenAI API key saved")
|
|
|
|
if gemini_input != gemini_key:
|
|
api_key_manager.save_api_key("gemini", gemini_input)
|
|
logger.info("[render_ai_providers_setup] Gemini API key saved")
|
|
|
|
if mistral_input != mistral_key:
|
|
api_key_manager.save_api_key("mistral", mistral_input)
|
|
logger.info("[render_ai_providers_setup] Mistral API key saved")
|
|
|
|
# Validate that at least one required provider is configured
|
|
if not (openai_input or gemini_input):
|
|
st.error("Please configure at least one AI provider (OpenAI or Google Gemini) to proceed.")
|
|
return {"current_step": 1, "can_proceed": False}
|
|
|
|
return {"current_step": 1, "can_proceed": bool(openai_input or gemini_input)}
|
|
|
|
except Exception as e:
|
|
error_msg = f"Error in AI providers setup: {str(e)}"
|
|
logger.error(f"[render_ai_providers_setup] {error_msg}")
|
|
st.error(error_msg)
|
|
return {"current_step": 1, "error": error_msg}
|