Mayank2027 commited on
Commit
3da2e7d
·
verified ·
1 Parent(s): 3a64b9b

Update llm_client.py

Browse files
Files changed (1) hide show
  1. llm_client.py +24 -35
llm_client.py CHANGED
@@ -1,4 +1,4 @@
1
- # llm_client.py – Primary: OpenRouter, Fallback: Groq, with severe truncation
2
 
3
  import json
4
  import re
@@ -23,13 +23,13 @@ class LLMClient:
23
  cls,
24
  messages: List[Dict[str, str]],
25
  temperature: float = 0.1,
26
- max_tokens: int = 2048, # reduced
27
  response_format: Optional[str] = None,
28
  task_type: str = "default",
29
  track_metrics: bool = True
30
  ) -> Tuple[str, Dict[str, Any]]:
31
- # First, truncate messages aggressively
32
- truncated_messages = cls._truncate_messages(messages, max_tokens=2000)
33
 
34
  metadata = {
35
  "model": "openrouter",
@@ -39,20 +39,19 @@ class LLMClient:
39
  "success": False,
40
  }
41
 
42
- # Try OpenRouter first (higher limits)
43
  try:
44
- result = await cls._call_openrouter(truncated_messages, temperature, max_tokens)
45
  metadata["success"] = True
46
  metadata["provider"] = "openrouter"
47
  return result, metadata
48
  except Exception as e:
49
  logger.warning(f"OpenRouter failed: {e}")
50
 
51
- # Fallback to Groq with smaller model and even smaller context
52
  try:
53
- # Further truncate for Groq's TPM
54
- groq_messages = cls._truncate_messages(messages, max_tokens=1500)
55
- result = await cls._call_groq(groq_messages, temperature, min(max_tokens, 1024), response_format)
56
  metadata["success"] = True
57
  metadata["provider"] = "groq"
58
  metadata["fallback"] = True
@@ -68,41 +67,31 @@ class LLMClient:
68
  return result, metadata
69
 
70
  @classmethod
71
- def _truncate_messages(cls, messages, max_tokens=2000):
72
- """Aggressively truncate messages to stay under token limit."""
73
  new_messages = []
74
  for m in messages:
75
- if m["role"] == "system":
76
- # Shorten system prompt to essential instructions
77
- content = m["content"]
78
- # Keep only first 300 chars of system prompt
79
- if len(content) > 300:
80
- content = content[:300] + "... (truncated)"
81
- new_messages.append({"role": "system", "content": content})
82
- elif m["role"] == "user":
83
- # User messages: keep only last one, truncate to 500 chars
84
- # But we keep all user messages but truncate each
85
- content = m["content"]
86
  if len(content) > 500:
87
- content = content[:500] + "\n... (truncated)"
88
- new_messages.append({"role": "user", "content": content})
 
 
 
 
 
89
  else:
90
  new_messages.append(m)
91
- # Ensure total length is roughly within max_tokens (chars/4)
92
- total_chars = sum(len(m.get("content", "")) for m in new_messages)
93
  if total_chars / 4 > max_tokens:
94
- # Remove some user messages (keep only last one)
95
  user_msgs = [m for m in new_messages if m["role"] == "user"]
96
  if len(user_msgs) > 1:
97
  # Keep only the last user message
98
  new_messages = [m for m in new_messages if m["role"] != "user"] + [user_msgs[-1]]
99
- # Re-check
100
- total_chars = sum(len(m.get("content", "")) for m in new_messages)
101
- if total_chars / 4 > max_tokens:
102
- # Further truncate the last user message
103
- last_user = new_messages[-1]
104
- if len(last_user["content"]) > 300:
105
- last_user["content"] = last_user["content"][:300] + "\n... (truncated)"
106
  return new_messages
107
 
108
  @classmethod
 
1
+ # llm_client.py – Primary: OpenRouter, Fallback: Groq, with aggressive truncation
2
 
3
  import json
4
  import re
 
23
  cls,
24
  messages: List[Dict[str, str]],
25
  temperature: float = 0.1,
26
+ max_tokens: int = 2048,
27
  response_format: Optional[str] = None,
28
  task_type: str = "default",
29
  track_metrics: bool = True
30
  ) -> Tuple[str, Dict[str, Any]]:
31
+ # Aggressively truncate to fit token limits
32
+ truncated = cls._truncate_messages(messages, max_tokens=2500)
33
 
34
  metadata = {
35
  "model": "openrouter",
 
39
  "success": False,
40
  }
41
 
42
+ # Try OpenRouter (higher limits)
43
  try:
44
+ result = await cls._call_openrouter(truncated, temperature, max_tokens)
45
  metadata["success"] = True
46
  metadata["provider"] = "openrouter"
47
  return result, metadata
48
  except Exception as e:
49
  logger.warning(f"OpenRouter failed: {e}")
50
 
51
+ # Fallback to Groq with even smaller context
52
  try:
53
+ groq_msgs = cls._truncate_messages(messages, max_tokens=1500)
54
+ result = await cls._call_groq(groq_msgs, temperature, min(max_tokens, 1024), response_format)
 
55
  metadata["success"] = True
56
  metadata["provider"] = "groq"
57
  metadata["fallback"] = True
 
67
  return result, metadata
68
 
69
  @classmethod
70
+ def _truncate_messages(cls, messages, max_tokens=2500):
71
+ """Truncate messages to stay under token limit."""
72
  new_messages = []
73
  for m in messages:
74
+ role = m["role"]
75
+ content = m["content"]
76
+ if role == "system":
77
+ # Keep only first 500 chars of system prompt
 
 
 
 
 
 
 
78
  if len(content) > 500:
79
+ content = content[:500] + "... (truncated)"
80
+ new_messages.append({"role": role, "content": content})
81
+ elif role == "user":
82
+ # Truncate user message to 800 chars
83
+ if len(content) > 800:
84
+ content = content[:800] + "\n... (truncated)"
85
+ new_messages.append({"role": role, "content": content})
86
  else:
87
  new_messages.append(m)
88
+ # If still too long, remove older user messages (keep only last one)
89
+ total_chars = sum(len(m["content"]) for m in new_messages)
90
  if total_chars / 4 > max_tokens:
 
91
  user_msgs = [m for m in new_messages if m["role"] == "user"]
92
  if len(user_msgs) > 1:
93
  # Keep only the last user message
94
  new_messages = [m for m in new_messages if m["role"] != "user"] + [user_msgs[-1]]
 
 
 
 
 
 
 
95
  return new_messages
96
 
97
  @classmethod