LamiaYT commited on
Commit
72146a4
Β·
1 Parent(s): 0fda38b

Fix LLM conflicts and environment issues

Browse files
Files changed (2) hide show
  1. agent/local_llm.py +49 -18
  2. app.py +63 -23
agent/local_llm.py CHANGED
@@ -1,4 +1,3 @@
1
- # File: agent/local_llm.py
2
  try:
3
  from transformers import AutoModelForCausalLM, AutoTokenizer
4
  from llama_index.llms.huggingface import HuggingFaceLLM
@@ -9,8 +8,8 @@ except ImportError as e:
9
 
10
  class LocalLLM:
11
  def __init__(self):
12
- # Use smaller model that works reliably
13
- self.model_name = "microsoft/DialoGPT-medium"
14
  print(f"Initializing LocalLLM with model: {self.model_name}")
15
  self.llm = self._create_llama_index_llm()
16
 
@@ -31,15 +30,19 @@ class LocalLLM:
31
  )
32
 
33
  print("Creating LlamaIndex LLM...")
 
34
  llm = HuggingFaceLLM(
35
  model=model,
36
  tokenizer=tokenizer,
 
37
  generate_kwargs={
38
  "do_sample": True,
39
  "temperature": 0.7,
40
- "max_new_tokens": 256,
41
  "pad_token_id": tokenizer.eos_token_id
42
- }
 
 
 
43
  )
44
 
45
  print("LLM created successfully!")
@@ -54,21 +57,49 @@ class LocalLLM:
54
  """Fallback to a very basic model"""
55
  print("Using fallback model: gpt2")
56
  model_name = "gpt2"
57
- tokenizer = AutoTokenizer.from_pretrained(model_name)
58
- tokenizer.pad_token = tokenizer.eos_token
59
 
60
- model = AutoModelForCausalLM.from_pretrained(model_name)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
- return HuggingFaceLLM(
63
- model=model,
64
- tokenizer=tokenizer,
65
- generate_kwargs={
66
- "do_sample": True,
67
- "temperature": 0.7,
68
- "max_new_tokens": 256,
69
- "pad_token_id": tokenizer.eos_token_id
70
- }
71
- )
72
 
73
  def get_llm(self):
74
  """Return the LlamaIndex LLM instance"""
 
 
1
  try:
2
  from transformers import AutoModelForCausalLM, AutoTokenizer
3
  from llama_index.llms.huggingface import HuggingFaceLLM
 
8
 
9
  class LocalLLM:
10
  def __init__(self):
11
+ # Use a simple, reliable model that works well with LlamaIndex
12
+ self.model_name = "microsoft/DialoGPT-small" # Changed to smaller model
13
  print(f"Initializing LocalLLM with model: {self.model_name}")
14
  self.llm = self._create_llama_index_llm()
15
 
 
30
  )
31
 
32
  print("Creating LlamaIndex LLM...")
33
+ # Fix the generate_kwargs to avoid conflicts
34
  llm = HuggingFaceLLM(
35
  model=model,
36
  tokenizer=tokenizer,
37
+ # Simplified generate_kwargs to avoid conflicts
38
  generate_kwargs={
39
  "do_sample": True,
40
  "temperature": 0.7,
 
41
  "pad_token_id": tokenizer.eos_token_id
42
+ },
43
+ # Set these parameters at the LLM level instead
44
+ max_new_tokens=256,
45
+ device_map="auto" if torch.cuda.is_available() else None
46
  )
47
 
48
  print("LLM created successfully!")
 
57
  """Fallback to a very basic model"""
58
  print("Using fallback model: gpt2")
59
  model_name = "gpt2"
 
 
60
 
61
+ try:
62
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
63
+ tokenizer.pad_token = tokenizer.eos_token
64
+
65
+ model = AutoModelForCausalLM.from_pretrained(model_name)
66
+
67
+ return HuggingFaceLLM(
68
+ model=model,
69
+ tokenizer=tokenizer,
70
+ generate_kwargs={
71
+ "do_sample": True,
72
+ "temperature": 0.7,
73
+ "pad_token_id": tokenizer.eos_token_id
74
+ },
75
+ max_new_tokens=256
76
+ )
77
+ except Exception as e:
78
+ print(f"Even fallback model failed: {str(e)}")
79
+ # Return a mock LLM for testing
80
+ return self._create_mock_llm()
81
+
82
+ def _create_mock_llm(self):
83
+ """Create a mock LLM for testing when models fail"""
84
+ print("Creating mock LLM for testing...")
85
+
86
+ class MockLLM:
87
+ def chat(self, messages, **kwargs):
88
+ # Simple mock response
89
+ class MockResponse:
90
+ def __init__(self, text):
91
+ self.message = type('obj', (object,), {'content': text})
92
+
93
+ return MockResponse("This is a mock response. The actual LLM failed to load.")
94
+
95
+ def complete(self, prompt, **kwargs):
96
+ class MockCompletion:
97
+ def __init__(self, text):
98
+ self.text = text
99
+
100
+ return MockCompletion("Mock completion response.")
101
 
102
+ return MockLLM()
 
 
 
 
 
 
 
 
 
103
 
104
  def get_llm(self):
105
  """Return the LlamaIndex LLM instance"""
app.py CHANGED
@@ -5,25 +5,32 @@ import traceback
5
  from typing import List, Dict
6
 
7
  import gradio as gr
8
- import nltk
9
 
10
- # --- Environment variable setup to fix permission issues in Spaces or restricted envs ---
11
  os.environ["NLTK_DATA"] = "/tmp/nltk_data"
12
  os.environ["MPLCONFIGDIR"] = "/tmp/matplotlib"
13
- os.environ["TRANSFORMERS_CACHE"] = "/tmp/huggingface_cache"
 
14
 
15
- # Download required NLTK data upfront
16
- nltk.download('punkt', download_dir=os.environ["NLTK_DATA"])
 
 
 
 
 
 
17
 
18
  # Add current directory to path for local imports
19
  sys.path.append(os.path.dirname(os.path.abspath(__file__)))
20
 
21
- # Import GaiaAPI early
22
  from utils.gaia_api import GaiaAPI
23
 
24
  # Initialize global agent state
25
  AGENT_READY = False
26
  agent = None
 
27
 
28
  # Import agent-related modules and initialize
29
  try:
@@ -41,28 +48,38 @@ try:
41
 
42
  print("Creating ReAct Agent...")
43
  memory = ChatMemoryBuffer.from_defaults(token_limit=2000)
44
- agent = ReActAgent.from_tools(
45
- tools=gaia_tools,
46
- llm=llm,
47
- memory=memory,
48
- verbose=True,
49
- max_iterations=3
50
- )
51
-
52
- print("Agent initialized successfully!")
53
- AGENT_READY = True
 
 
 
 
 
 
54
 
55
  except Exception as e:
56
  print(f"Failed to initialize agent: {str(e)}")
57
  traceback.print_exc()
58
  AGENT_READY = False
59
  agent = None
 
60
 
61
 
62
  def process_single_question(question_text: str) -> str:
63
  """Process a single GAIA question through the agent"""
64
  if not AGENT_READY:
65
- return "❌ Agent not ready. Please check the logs for initialization errors."
 
 
 
66
 
67
  if not question_text.strip():
68
  return "❌ Please enter a question."
@@ -73,7 +90,16 @@ Answer the following question directly and concisely. Do not include "FINAL ANSW
73
 
74
  Question: {question_text}
75
  """
76
- response = agent.query(enhanced_prompt)
 
 
 
 
 
 
 
 
 
77
  answer = str(response).strip()
78
 
79
  # Remove common prefixes from the answer
@@ -84,7 +110,7 @@ Question: {question_text}
84
  return answer
85
 
86
  except Exception as e:
87
- return f"❌ Error: {str(e)}\n\n{traceback.format_exc()}"
88
 
89
 
90
  def process_all_questions() -> str:
@@ -108,6 +134,7 @@ def process_all_questions() -> str:
108
  json.dump(processed_answers, f, indent=2)
109
 
110
  summary = f"βœ… Processed {len(processed_answers)} questions.\n"
 
111
  summary += "First 3 answers:\n"
112
  for ans in processed_answers[:3]:
113
  summary += f"- {ans['task_id']}: {ans['submitted_answer'][:50]}...\n"
@@ -115,7 +142,7 @@ def process_all_questions() -> str:
115
  return summary
116
 
117
  except Exception as e:
118
- return f"❌ Error: {str(e)}\n\n{traceback.format_exc()}"
119
 
120
 
121
  def submit_to_gaia(username: str, code_url: str) -> str:
@@ -152,13 +179,14 @@ def get_sample_question() -> str:
152
 
153
 
154
  # ---------- Gradio UI ----------
155
- with gr.Blocks(title="πŸ¦™ GAIA LlamaIndex Agent") as demo:
156
  gr.Markdown(f"""
157
  # πŸ¦™ GAIA Benchmark Agent with LlamaIndex
158
 
159
  This agent uses LlamaIndex with a local LLM to tackle GAIA benchmark questions.
160
 
161
  **Status:** {"βœ… Ready" if AGENT_READY else "❌ Not Ready"}
 
162
  """)
163
 
164
  with gr.Tab("πŸ”¬ Test Single Question"):
@@ -219,13 +247,25 @@ Submit your processed answers to the GAIA benchmark for official scoring.
219
 
220
  This agent uses:
221
  - **LlamaIndex** (ReAct Agent + Tools)
222
- - **Local LLM** (e.g., DialoGPT or fallback GPT2)
223
  - **GAIA Tools** (question fetch, file reader, math, etc.)
224
 
225
  ## Current Status
226
  - Agent Ready: {"βœ… Yes" if AGENT_READY else "❌ No"}
227
  - Tools Loaded: {len(gaia_tools) if 'gaia_tools' in globals() else 0}
 
 
 
 
 
 
 
 
 
 
 
 
228
  """)
229
 
230
  if __name__ == "__main__":
231
- demo.launch(server_name="0.0.0.0", server_port=7860, show_error=True)
 
5
  from typing import List, Dict
6
 
7
  import gradio as gr
 
8
 
9
+ # --- Environment variable setup to fix permission issues ---
10
  os.environ["NLTK_DATA"] = "/tmp/nltk_data"
11
  os.environ["MPLCONFIGDIR"] = "/tmp/matplotlib"
12
+ os.environ["HF_HOME"] = "/tmp/huggingface_cache" # Updated from TRANSFORMERS_CACHE
13
+ os.environ["TORCH_HOME"] = "/tmp/torch_cache"
14
 
15
+ # Import nltk AFTER setting environment variables
16
+ try:
17
+ import nltk
18
+ # Download required NLTK data upfront
19
+ nltk.download('punkt', download_dir=os.environ["NLTK_DATA"], quiet=True)
20
+ nltk.download('stopwords', download_dir=os.environ["NLTK_DATA"], quiet=True)
21
+ except Exception as e:
22
+ print(f"NLTK setup warning: {e}")
23
 
24
  # Add current directory to path for local imports
25
  sys.path.append(os.path.dirname(os.path.abspath(__file__)))
26
 
27
+ # Import GaiaAPI early (this fixes the undefined error)
28
  from utils.gaia_api import GaiaAPI
29
 
30
  # Initialize global agent state
31
  AGENT_READY = False
32
  agent = None
33
+ initialization_error = None
34
 
35
  # Import agent-related modules and initialize
36
  try:
 
48
 
49
  print("Creating ReAct Agent...")
50
  memory = ChatMemoryBuffer.from_defaults(token_limit=2000)
51
+
52
+ # Only create ReAct agent if we have a proper LLM
53
+ if hasattr(llm, 'chat') and not llm.__class__.__name__ == 'MockLLM':
54
+ agent = ReActAgent.from_tools(
55
+ tools=gaia_tools,
56
+ llm=llm,
57
+ memory=memory,
58
+ verbose=True,
59
+ max_iterations=3
60
+ )
61
+ print("Agent initialized successfully!")
62
+ AGENT_READY = True
63
+ else:
64
+ print("Using mock mode - agent partially ready")
65
+ agent = llm # Use the mock LLM directly
66
+ AGENT_READY = True
67
 
68
  except Exception as e:
69
  print(f"Failed to initialize agent: {str(e)}")
70
  traceback.print_exc()
71
  AGENT_READY = False
72
  agent = None
73
+ initialization_error = str(e)
74
 
75
 
76
  def process_single_question(question_text: str) -> str:
77
  """Process a single GAIA question through the agent"""
78
  if not AGENT_READY:
79
+ error_msg = "❌ Agent not ready. "
80
+ if initialization_error:
81
+ error_msg += f"Error: {initialization_error}"
82
+ return error_msg
83
 
84
  if not question_text.strip():
85
  return "❌ Please enter a question."
 
90
 
91
  Question: {question_text}
92
  """
93
+
94
+ # Handle both ReAct agent and mock LLM
95
+ if hasattr(agent, 'query'):
96
+ response = agent.query(enhanced_prompt)
97
+ elif hasattr(agent, 'chat'):
98
+ response = agent.chat([{"role": "user", "content": enhanced_prompt}])
99
+ response = response.message.content if hasattr(response, 'message') else str(response)
100
+ else:
101
+ response = "Mock response: I would analyze this question and provide an answer."
102
+
103
  answer = str(response).strip()
104
 
105
  # Remove common prefixes from the answer
 
110
  return answer
111
 
112
  except Exception as e:
113
+ return f"❌ Error: {str(e)}"
114
 
115
 
116
  def process_all_questions() -> str:
 
134
  json.dump(processed_answers, f, indent=2)
135
 
136
  summary = f"βœ… Processed {len(processed_answers)} questions.\n"
137
+ summary += "Answers saved to gaia_answers.json\n"
138
  summary += "First 3 answers:\n"
139
  for ans in processed_answers[:3]:
140
  summary += f"- {ans['task_id']}: {ans['submitted_answer'][:50]}...\n"
 
142
  return summary
143
 
144
  except Exception as e:
145
+ return f"❌ Error: {str(e)}"
146
 
147
 
148
  def submit_to_gaia(username: str, code_url: str) -> str:
 
179
 
180
 
181
  # ---------- Gradio UI ----------
182
+ with gr.Blocks(title="πŸ¦™ GAIA LlamaIndex Agent", theme=gr.themes.Soft()) as demo:
183
  gr.Markdown(f"""
184
  # πŸ¦™ GAIA Benchmark Agent with LlamaIndex
185
 
186
  This agent uses LlamaIndex with a local LLM to tackle GAIA benchmark questions.
187
 
188
  **Status:** {"βœ… Ready" if AGENT_READY else "❌ Not Ready"}
189
+ {f"**Error:** {initialization_error}" if initialization_error else ""}
190
  """)
191
 
192
  with gr.Tab("πŸ”¬ Test Single Question"):
 
247
 
248
  This agent uses:
249
  - **LlamaIndex** (ReAct Agent + Tools)
250
+ - **Local LLM** (DialoGPT-small with fallback to GPT2 or mock)
251
  - **GAIA Tools** (question fetch, file reader, math, etc.)
252
 
253
  ## Current Status
254
  - Agent Ready: {"βœ… Yes" if AGENT_READY else "❌ No"}
255
  - Tools Loaded: {len(gaia_tools) if 'gaia_tools' in globals() else 0}
256
+ - Initialization Error: {initialization_error or "None"}
257
+
258
+ ## Environment Variables Set
259
+ - NLTK_DATA: {os.environ.get('NLTK_DATA', 'Not set')}
260
+ - HF_HOME: {os.environ.get('HF_HOME', 'Not set')}
261
+ - MPLCONFIGDIR: {os.environ.get('MPLCONFIGDIR', 'Not set')}
262
+
263
+ ## Usage Tips
264
+ 1. Start with the "Test Single Question" tab
265
+ 2. Try the sample question first
266
+ 3. If agent works, proceed to "Full Evaluation"
267
+ 4. Submit to GAIA when ready
268
  """)
269
 
270
  if __name__ == "__main__":
271
+ demo.launch(server_name="0.0.0.0", server_port=7860, show_error=True)