Spaces:
Sleeping
Sleeping
Update src/streamlit_app.py
Browse files- src/streamlit_app.py +20 -10
src/streamlit_app.py
CHANGED
|
@@ -167,14 +167,13 @@ def cached_load_embeddings_and_index():
|
|
| 167 |
|
| 168 |
@st.cache_resource(ttl=3600)
|
| 169 |
def init_groq_llm():
|
| 170 |
-
# Проверка на наличие ключа Groq
|
| 171 |
-
if "GROQ_API_KEY" not in st.secrets:
|
| 172 |
-
st.error("Ошибка: API-ключ Groq не найден в secrets.toml.")
|
| 173 |
-
return None
|
| 174 |
-
|
| 175 |
-
os.environ["GROQ_API_KEY"] = st.secrets["GROQ_API_KEY"]
|
| 176 |
try:
|
|
|
|
|
|
|
| 177 |
return ChatGroq(model="deepseek-r1-distill-llama-70b", temperature=0, max_tokens=2000)
|
|
|
|
|
|
|
|
|
|
| 178 |
except Exception as e:
|
| 179 |
st.error(f"Ошибка инициализации Groq: {e}")
|
| 180 |
return None
|
|
@@ -239,7 +238,7 @@ def semantic_search(query, embedder, index, df, genre=None, year=None, country=N
|
|
| 239 |
if keyword_pattern:
|
| 240 |
res['has_keyword'] = res.apply(
|
| 241 |
lambda row: bool(re.search(keyword_pattern, str(row['tvshow_title']).lower())) or
|
| 242 |
-
|
| 243 |
axis=1
|
| 244 |
)
|
| 245 |
else:
|
|
@@ -307,6 +306,12 @@ def main():
|
|
| 307 |
st.set_page_config(page_title="Поиск фильмов и сериалов + Groq AI", layout="wide")
|
| 308 |
st.title("📽️ Семантический поиск фильмов и сериалов с AI")
|
| 309 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 310 |
if "df" not in st.session_state:
|
| 311 |
st.session_state.df = cached_load_data(CSV_PATH)
|
| 312 |
if "embedder" not in st.session_state:
|
|
@@ -314,8 +319,11 @@ def main():
|
|
| 314 |
if "embeddings_index" not in st.session_state:
|
| 315 |
with st.spinner("Загрузка эмбеддингов и индекса..."):
|
| 316 |
st.session_state.embeddings, st.session_state.index = cached_load_embeddings_and_index()
|
| 317 |
-
if "llm" not in st.session_state:
|
| 318 |
st.session_state.llm = init_groq_llm()
|
|
|
|
|
|
|
|
|
|
| 319 |
|
| 320 |
if 'last_query' not in st.session_state: st.session_state.last_query = ""
|
| 321 |
if 'results' not in st.session_state: st.session_state.results = pd.DataFrame()
|
|
@@ -437,13 +445,15 @@ def main():
|
|
| 437 |
if st.session_state.llm and not st.session_state.results.empty:
|
| 438 |
if st.button("AI: почему эти сериалы подходят и что ещё посмотреть", key="ai_button"):
|
| 439 |
st.session_state.ai_clicked = True
|
|
|
|
|
|
|
| 440 |
|
| 441 |
with ai_response_container:
|
| 442 |
-
if st.session_state.get("ai_clicked") and st.session_state.get("last_query"):
|
| 443 |
st.markdown("### Рекомендации AI:")
|
| 444 |
with st.spinner("Генерация ответа AI..."):
|
| 445 |
rag = generate_rag_response(st.session_state.last_query, st.session_state.results, llm)
|
| 446 |
-
|
| 447 |
|
| 448 |
st.sidebar.markdown("---")
|
| 449 |
st.sidebar.markdown("## Информация")
|
|
|
|
| 167 |
|
| 168 |
@st.cache_resource(ttl=3600)
|
| 169 |
def init_groq_llm():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 170 |
try:
|
| 171 |
+
groq_api_key = st.secrets["GROQ_API_KEY"]
|
| 172 |
+
os.environ["GROQ_API_KEY"] = groq_api_key
|
| 173 |
return ChatGroq(model="deepseek-r1-distill-llama-70b", temperature=0, max_tokens=2000)
|
| 174 |
+
except KeyError:
|
| 175 |
+
st.error("Ошибка: API-ключ Groq не найден в secrets.toml. Пожалуйста, добавьте его.")
|
| 176 |
+
return None
|
| 177 |
except Exception as e:
|
| 178 |
st.error(f"Ошибка инициализации Groq: {e}")
|
| 179 |
return None
|
|
|
|
| 238 |
if keyword_pattern:
|
| 239 |
res['has_keyword'] = res.apply(
|
| 240 |
lambda row: bool(re.search(keyword_pattern, str(row['tvshow_title']).lower())) or
|
| 241 |
+
bool(re.search(keyword_pattern, str(row['description']).lower())),
|
| 242 |
axis=1
|
| 243 |
)
|
| 244 |
else:
|
|
|
|
| 306 |
st.set_page_config(page_title="Поиск фильмов и сериалов + Groq AI", layout="wide")
|
| 307 |
st.title("📽️ Семантический поиск фильмов и сериалов с AI")
|
| 308 |
|
| 309 |
+
# Убедимся, что st.secrets доступен перед инициализацией LLM
|
| 310 |
+
try:
|
| 311 |
+
groq_api_key_exists = "GROQ_API_KEY" in st.secrets
|
| 312 |
+
except Exception:
|
| 313 |
+
groq_api_key_exists = False
|
| 314 |
+
|
| 315 |
if "df" not in st.session_state:
|
| 316 |
st.session_state.df = cached_load_data(CSV_PATH)
|
| 317 |
if "embedder" not in st.session_state:
|
|
|
|
| 319 |
if "embeddings_index" not in st.session_state:
|
| 320 |
with st.spinner("Загрузка эмбеддингов и индекса..."):
|
| 321 |
st.session_state.embeddings, st.session_state.index = cached_load_embeddings_and_index()
|
| 322 |
+
if "llm" not in st.session_state and groq_api_key_exists:
|
| 323 |
st.session_state.llm = init_groq_llm()
|
| 324 |
+
elif "llm" not in st.session_state:
|
| 325 |
+
st.session_state.llm = None
|
| 326 |
+
st.error("API-ключ Groq не настроен. Функции AI будут отключены.")
|
| 327 |
|
| 328 |
if 'last_query' not in st.session_state: st.session_state.last_query = ""
|
| 329 |
if 'results' not in st.session_state: st.session_state.results = pd.DataFrame()
|
|
|
|
| 445 |
if st.session_state.llm and not st.session_state.results.empty:
|
| 446 |
if st.button("AI: почему эти сериалы подходят и что ещё посмотреть", key="ai_button"):
|
| 447 |
st.session_state.ai_clicked = True
|
| 448 |
+
elif not st.session_state.llm and not st.session_state.results.empty:
|
| 449 |
+
st.warning("Чтобы получить рекомендации от AI, необходимо настроить API-ключ Groq.")
|
| 450 |
|
| 451 |
with ai_response_container:
|
| 452 |
+
if st.session_state.get("ai_clicked") and st.session_state.get("last_query") and st.session_state.llm:
|
| 453 |
st.markdown("### Рекомендации AI:")
|
| 454 |
with st.spinner("Генерация ответа AI..."):
|
| 455 |
rag = generate_rag_response(st.session_state.last_query, st.session_state.results, llm)
|
| 456 |
+
st.write(rag)
|
| 457 |
|
| 458 |
st.sidebar.markdown("---")
|
| 459 |
st.sidebar.markdown("## Информация")
|