Nelly-43 commited on
Commit
15ee6a2
Β·
verified Β·
1 Parent(s): a760fd7

Update app_web.py

Browse files
Files changed (1) hide show
  1. app_web.py +115 -94
app_web.py CHANGED
@@ -16,8 +16,26 @@ snapshot_download(repo_id="CGIAR/weai-kb",
16
  token=os.getenv('HF_TOKEN'),
17
  local_dir="./"
18
  )
19
- # ── Session initialisation ───────────────────────────────────────────────────
20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  def init_session():
22
  """Initialise st.session_state with messages list, cfg, and last_retrieval."""
23
  if "messages" not in st.session_state:
@@ -45,101 +63,104 @@ def render_sidebar():
45
  cfg = st.session_state.cfg
46
 
47
  with st.sidebar:
48
- st.header("Settings")
49
-
50
- # --- Provider dropdown ---
51
- providers = ["openai", "anthropic", "gemini", "meta-llama"]
52
- current_provider = cfg.get("llm", {}).get("provider", "openai")
53
- provider_index = providers.index(current_provider) if current_provider in providers else 0
54
-
55
- provider = st.selectbox(
56
- "LLM Provider",
57
- providers,
58
- index=provider_index,
59
- key="sidebar_provider",
60
- )
61
-
62
- # Update cfg in session when provider changes
63
- if provider != cfg.get("llm", {}).get("provider"):
64
- cfg.setdefault("llm", {})["provider"] = provider
65
-
66
- # --- Model dropdown (cached per provider) ---
67
- # Invalidate model cache if provider changed
68
- prev_provider_key = "prev_provider"
69
- if st.session_state.get(prev_provider_key) != provider:
70
- for p in providers:
71
- st.session_state.pop(f"models_{p}", None)
72
- st.session_state[prev_provider_key] = provider
73
-
74
- models_cache_key = f"models_{provider}"
75
- if models_cache_key not in st.session_state:
76
- api_key = get_api_key(cfg, provider)
77
- if api_key:
78
- try:
79
- st.session_state[models_cache_key] = list_models(provider, api_key)
80
- except Exception:
 
 
 
81
  st.session_state[models_cache_key] = []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  else:
83
- st.session_state[models_cache_key] = []
84
-
85
- available_models = st.session_state[models_cache_key]
86
- current_model = cfg.get("llm", {}).get("model", "")
87
-
88
- if available_models:
89
- model_index = (
90
- available_models.index(current_model)
91
- if current_model in available_models
92
- else 0
93
- )
94
- model = st.selectbox(
95
- "Model",
96
- available_models,
97
- index=model_index,
98
- key="sidebar_model",
99
- )
100
- else:
101
- model = st.text_input(
102
- "Model",
103
- value=current_model,
104
- key="sidebar_model_text",
105
- )
106
-
107
- # Update cfg in session when model changes
108
- if model != cfg.get("llm", {}).get("model"):
109
- cfg.setdefault("llm", {})["model"] = model
110
-
111
- # --- Web search toggle ---
112
- web_enabled = cfg.get("web_search", {}).get("enabled", False)
113
- web_toggle = st.toggle("Web search", value=web_enabled, key="sidebar_web_search")
114
- cfg.setdefault("web_search", {})["enabled"] = web_toggle
115
-
116
- st.divider()
117
-
118
- # --- Knowledge base stats ---
119
- st.subheader("Knowledge Base")
120
- try:
121
- collection = get_chroma_collection(cfg)
122
- chunk_count = collection.count()
123
- st.metric("Chunks indexed", chunk_count)
124
- except Exception as e:
125
- st.warning(f"Could not read knowledge base: {e}")
126
- chunk_count = 0
127
-
128
- # --- Re-ingest button ---
129
- if st.button("Re-ingest documents", use_container_width=True):
130
- st.info("Ingestion may take a few minutes for large document collections...")
131
- with st.spinner("Ingesting documents..."):
132
- try:
133
- count = ingest_documents(cfg)
134
- clear_collection_cache()
135
- st.success(f"Ingested {count} chunks.")
136
- # Clear cached data so it refreshes after re-ingest
137
- st.session_state.pop("kb_welcome_summary", None)
138
- st.rerun()
139
- except Exception as e:
140
- st.error(f"Ingestion failed: {e}")
141
-
142
-
143
  # ── Chat interface ───────────────────────────────────────────────────────────
144
 
145
  def render_chat():
 
16
  token=os.getenv('HF_TOKEN'),
17
  local_dir="./"
18
  )
 
19
 
20
+ def cg_admin()
21
+ headers = st.context.headers
22
+ if "X-Forwarded-User" in headers:
23
+ username = headers.get("X-Forwarded-User")
24
+ token = headers.get("X-Forwarded-Access-Token")
25
+ userinfo_url = "https://huggingface.co/oauth/userinfo"
26
+ response = requests.get(userinfo_url, headers={"Authorization": f"Bearer {token}"})
27
+
28
+ if response.status_code == 200:
29
+ user_data = response.json()
30
+
31
+ # 3. Extract and display the list of organizations
32
+ # The 'orgs' list contains objects with organization details (name, role, etc.)
33
+ orgs = user_data.get("orgs", [])
34
+
35
+ if "CGIAR" in [org.get("name") for org in orgs]:
36
+ return True
37
+
38
+ # ── Session initialisation ───────────────────────────────────────────────────
39
  def init_session():
40
  """Initialise st.session_state with messages list, cfg, and last_retrieval."""
41
  if "messages" not in st.session_state:
 
63
  cfg = st.session_state.cfg
64
 
65
  with st.sidebar:
66
+ if cg_admin():
67
+ st.header("Settings")
68
+
69
+ # --- Provider dropdown ---
70
+ providers = ["openai", "anthropic", "gemini", "meta-llama"]
71
+ current_provider = cfg.get("llm", {}).get("provider", "openai")
72
+ provider_index = providers.index(current_provider) if current_provider in providers else 0
73
+
74
+ provider = st.selectbox(
75
+ "LLM Provider",
76
+ providers,
77
+ index=provider_index,
78
+ key="sidebar_provider",
79
+ )
80
+
81
+ # Update cfg in session when provider changes
82
+ if provider != cfg.get("llm", {}).get("provider"):
83
+ cfg.setdefault("llm", {})["provider"] = provider
84
+
85
+ # --- Model dropdown (cached per provider) ---
86
+ # Invalidate model cache if provider changed
87
+ prev_provider_key = "prev_provider"
88
+ if st.session_state.get(prev_provider_key) != provider:
89
+ for p in providers:
90
+ st.session_state.pop(f"models_{p}", None)
91
+ st.session_state[prev_provider_key] = provider
92
+
93
+ models_cache_key = f"models_{provider}"
94
+ if models_cache_key not in st.session_state:
95
+ api_key = get_api_key(cfg, provider)
96
+ if api_key:
97
+ try:
98
+ st.session_state[models_cache_key] = list_models(provider, api_key)
99
+ except Exception:
100
+ st.session_state[models_cache_key] = []
101
+ else:
102
  st.session_state[models_cache_key] = []
103
+
104
+ available_models = st.session_state[models_cache_key]
105
+ current_model = cfg.get("llm", {}).get("model", "")
106
+
107
+ if available_models:
108
+ model_index = (
109
+ available_models.index(current_model)
110
+ if current_model in available_models
111
+ else 0
112
+ )
113
+ model = st.selectbox(
114
+ "Model",
115
+ available_models,
116
+ index=model_index,
117
+ key="sidebar_model",
118
+ )
119
  else:
120
+ model = st.text_input(
121
+ "Model",
122
+ value=current_model,
123
+ key="sidebar_model_text",
124
+ )
125
+
126
+ # Update cfg in session when model changes
127
+ if model != cfg.get("llm", {}).get("model"):
128
+ cfg.setdefault("llm", {})["model"] = model
129
+
130
+ # --- Web search toggle ---
131
+ web_enabled = cfg.get("web_search", {}).get("enabled", False)
132
+ web_toggle = st.toggle("Web search", value=web_enabled, key="sidebar_web_search")
133
+ cfg.setdefault("web_search", {})["enabled"] = web_toggle
134
+
135
+ st.divider()
136
+
137
+ # --- Knowledge base stats ---
138
+ st.subheader("Knowledge Base")
139
+ try:
140
+ collection = get_chroma_collection(cfg)
141
+ chunk_count = collection.count()
142
+ st.metric("Chunks indexed", chunk_count)
143
+ except Exception as e:
144
+ st.warning(f"Could not read knowledge base: {e}")
145
+ chunk_count = 0
146
+
147
+ # --- Re-ingest button ---
148
+ if st.button("Re-ingest documents", use_container_width=True):
149
+ st.info("Ingestion may take a few minutes for large document collections...")
150
+ with st.spinner("Ingesting documents..."):
151
+ try:
152
+ count = ingest_documents(cfg)
153
+ clear_collection_cache()
154
+ st.success(f"Ingested {count} chunks.")
155
+ # Clear cached data so it refreshes after re-ingest
156
+ st.session_state.pop("kb_welcome_summary", None)
157
+ st.rerun()
158
+ except Exception as e:
159
+ st.error(f"Ingestion failed: {e}")
160
+
161
+
162
+ st.header("Upload Documents")
163
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  # ── Chat interface ───────────────────────────────────────────────────────────
165
 
166
  def render_chat():