Spaces:
Running
Running
Commit
·
c6ec446
1
Parent(s):
49d295e
added claude api login page
Browse files- streamlit-client/app.py +38 -8
streamlit-client/app.py
CHANGED
|
@@ -334,6 +334,8 @@ def save_chat_history(messages: list, workflow_type: str, metadata: dict = None)
|
|
| 334 |
|
| 335 |
if "api_key" not in st.session_state:
|
| 336 |
st.session_state.api_key = os.getenv("GEMINI_API_KEY") or os.getenv("OPENAI_API_KEY") or ""
|
|
|
|
|
|
|
| 337 |
if "default_model" not in st.session_state:
|
| 338 |
st.session_state.default_model = os.getenv(
|
| 339 |
"SCIEVO_DEFAULT_MODEL", "gemini/gemini-2.5-flash-lite"
|
|
@@ -342,8 +344,9 @@ if "default_model" not in st.session_state:
|
|
| 342 |
if not st.session_state.api_key:
|
| 343 |
st.title("SciEvo Research Assistant")
|
| 344 |
st.warning("API Key Required")
|
| 345 |
-
st.markdown("Please provide
|
| 346 |
|
|
|
|
| 347 |
col1, col2 = st.columns(2)
|
| 348 |
with col1:
|
| 349 |
model_option = st.selectbox(
|
|
@@ -354,19 +357,39 @@ if not st.session_state.api_key:
|
|
| 354 |
|
| 355 |
with col2:
|
| 356 |
api_key_input = st.text_input(
|
| 357 |
-
"API Key",
|
|
|
|
|
|
|
|
|
|
|
|
|
| 358 |
)
|
| 359 |
|
| 360 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 361 |
if api_key_input:
|
| 362 |
st.session_state.api_key = api_key_input
|
| 363 |
if model_option == "Gemini":
|
| 364 |
st.session_state.default_model = "gemini/gemini-2.5-flash-lite"
|
| 365 |
else:
|
| 366 |
st.session_state.default_model = "gpt-4o-mini"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 367 |
st.rerun()
|
| 368 |
else:
|
| 369 |
-
st.error("Please enter a valid API key")
|
| 370 |
st.stop()
|
| 371 |
|
| 372 |
col_title, col_reset = st.columns([5, 1])
|
|
@@ -383,6 +406,7 @@ with col_reset:
|
|
| 383 |
]
|
| 384 |
if "selected_workflow" in st.session_state:
|
| 385 |
st.session_state.selected_workflow = None
|
|
|
|
| 386 |
st.rerun()
|
| 387 |
|
| 388 |
if "initialized" not in st.session_state:
|
|
@@ -403,10 +427,16 @@ if "initialized" not in st.session_state:
|
|
| 403 |
|
| 404 |
# Ensure ANTHROPIC_API_KEY is available for Claude Agent SDK
|
| 405 |
if not os.getenv("ANTHROPIC_API_KEY"):
|
| 406 |
-
#
|
| 407 |
-
|
| 408 |
-
if
|
| 409 |
-
os.environ["ANTHROPIC_API_KEY"] =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 410 |
|
| 411 |
if not os.getenv("BRAIN_DIR"):
|
| 412 |
os.environ["BRAIN_DIR"] = str(Path.cwd() / "tmp_brain")
|
|
|
|
| 334 |
|
| 335 |
if "api_key" not in st.session_state:
|
| 336 |
st.session_state.api_key = os.getenv("GEMINI_API_KEY") or os.getenv("OPENAI_API_KEY") or ""
|
| 337 |
+
if "anthropic_api_key" not in st.session_state:
|
| 338 |
+
st.session_state.anthropic_api_key = os.getenv("ANTHROPIC_API_KEY") or ""
|
| 339 |
if "default_model" not in st.session_state:
|
| 340 |
st.session_state.default_model = os.getenv(
|
| 341 |
"SCIEVO_DEFAULT_MODEL", "gemini/gemini-2.5-flash-lite"
|
|
|
|
| 344 |
if not st.session_state.api_key:
|
| 345 |
st.title("SciEvo Research Assistant")
|
| 346 |
st.warning("API Key Required")
|
| 347 |
+
st.markdown("Please provide API keys to use the SciEvo Research Assistant.")
|
| 348 |
|
| 349 |
+
# Model provider selection
|
| 350 |
col1, col2 = st.columns(2)
|
| 351 |
with col1:
|
| 352 |
model_option = st.selectbox(
|
|
|
|
| 357 |
|
| 358 |
with col2:
|
| 359 |
api_key_input = st.text_input(
|
| 360 |
+
f"{model_option} API Key",
|
| 361 |
+
type="password",
|
| 362 |
+
placeholder=f"Enter your {model_option} API key here",
|
| 363 |
+
value="",
|
| 364 |
+
help=f"Required for {model_option} models used in data analysis and ideation",
|
| 365 |
)
|
| 366 |
|
| 367 |
+
# Claude API Key input (separate, always shown)
|
| 368 |
+
st.divider()
|
| 369 |
+
anthropic_api_key_input = st.text_input(
|
| 370 |
+
"Anthropic (Claude) API Key",
|
| 371 |
+
type="password",
|
| 372 |
+
placeholder="Enter your Anthropic API key here (optional but recommended)",
|
| 373 |
+
value=st.session_state.anthropic_api_key,
|
| 374 |
+
help="Required for Claude Agent SDK (coding agent v3). Used for code generation tasks.",
|
| 375 |
+
)
|
| 376 |
+
|
| 377 |
+
if st.button("Save API Keys", type="primary"):
|
| 378 |
if api_key_input:
|
| 379 |
st.session_state.api_key = api_key_input
|
| 380 |
if model_option == "Gemini":
|
| 381 |
st.session_state.default_model = "gemini/gemini-2.5-flash-lite"
|
| 382 |
else:
|
| 383 |
st.session_state.default_model = "gpt-4o-mini"
|
| 384 |
+
|
| 385 |
+
# Save Anthropic API key if provided
|
| 386 |
+
if anthropic_api_key_input:
|
| 387 |
+
st.session_state.anthropic_api_key = anthropic_api_key_input
|
| 388 |
+
os.environ["ANTHROPIC_API_KEY"] = anthropic_api_key_input
|
| 389 |
+
|
| 390 |
st.rerun()
|
| 391 |
else:
|
| 392 |
+
st.error("Please enter a valid API key for the selected model provider")
|
| 393 |
st.stop()
|
| 394 |
|
| 395 |
col_title, col_reset = st.columns([5, 1])
|
|
|
|
| 406 |
]
|
| 407 |
if "selected_workflow" in st.session_state:
|
| 408 |
st.session_state.selected_workflow = None
|
| 409 |
+
# Note: API keys are preserved on reset (user doesn't need to re-enter them)
|
| 410 |
st.rerun()
|
| 411 |
|
| 412 |
if "initialized" not in st.session_state:
|
|
|
|
| 427 |
|
| 428 |
# Ensure ANTHROPIC_API_KEY is available for Claude Agent SDK
|
| 429 |
if not os.getenv("ANTHROPIC_API_KEY"):
|
| 430 |
+
# First try to get from session state (user input)
|
| 431 |
+
anthropic_key = st.session_state.get("anthropic_api_key", "")
|
| 432 |
+
if anthropic_key:
|
| 433 |
+
os.environ["ANTHROPIC_API_KEY"] = anthropic_key
|
| 434 |
+
else:
|
| 435 |
+
# Fallback: try to get from user's main API key if it's an Anthropic key
|
| 436 |
+
user_key = st.session_state.get("api_key", "")
|
| 437 |
+
if user_key and ("anthropic" in user_key.lower() or user_key.startswith("sk-ant-")):
|
| 438 |
+
os.environ["ANTHROPIC_API_KEY"] = user_key
|
| 439 |
+
st.session_state.anthropic_api_key = user_key
|
| 440 |
|
| 441 |
if not os.getenv("BRAIN_DIR"):
|
| 442 |
os.environ["BRAIN_DIR"] = str(Path.cwd() / "tmp_brain")
|