quachtiensinh27 commited on
Commit
e00943e
·
1 Parent(s): 7fee926

feat: implement core tool infrastructure, Redis integration, and comprehensive test suite for agent functionality

Browse files
Files changed (5) hide show
  1. config.py +24 -3
  2. llm.py +17 -0
  3. tools/base.py +14 -3
  4. tools/summarizer.py +4 -0
  5. tools/utils.py +1 -0
config.py CHANGED
@@ -3,7 +3,28 @@ from dotenv import load_dotenv
3
 
4
  load_dotenv()
5
 
6
- ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY", "")
7
- OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")
8
- DEFAULT_MODEL = os.getenv("DEFAULT_MODEL", "claude-sonnet-4-20250514")
9
  LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  load_dotenv()
5
 
6
+ # Common
 
 
7
  LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
8
+
9
+ # Anthropic (Legacy)
10
+ ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY", "")
11
+
12
+ # Google Gemini
13
+ GEMINI_API_KEY = os.getenv("GEMINI_API_KEY", "")
14
+ DEFAULT_MODEL = os.getenv("DEFAULT_MODEL", "gemini-1.5-flash")
15
+
16
+ # Qwen API
17
+ QWEN_API_KEY = os.getenv("QWEN_API_KEY", "")
18
+ QWEN_BASE_URL = os.getenv("QWEN_BASE_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1")
19
+ QWEN_MODEL = os.getenv("QWEN_MODEL", "qwen-plus")
20
+
21
+ # Local LLM config
22
+ USE_LOCAL_LLM = os.getenv("USE_LOCAL_LLM", "false").lower() == "true"
23
+ LOCAL_MODEL_ID = os.getenv("LOCAL_MODEL_ID", "Qwen/Qwen2.5-0.5B-Instruct")
24
+
25
+ # Redis
26
+ REDIS_HOST = os.getenv("REDIS_HOST", "localhost")
27
+ REDIS_PORT = int(os.getenv("REDIS_PORT", 6379))
28
+ REDIS_DB = int(os.getenv("REDIS_DB", 0))
29
+ REDIS_PASSWORD = os.getenv("REDIS_PASSWORD", None)
30
+ REDIS_KEY_PREFIX = os.getenv("REDIS_KEY_PREFIX", "chat")
llm.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain_google_genai import ChatGoogleGenerativeAI
2
+ from src.config import GEMINI_API_KEY, DEFAULT_MODEL
3
+
4
+ llm = ChatGoogleGenerativeAI(
5
+ model=DEFAULT_MODEL,
6
+ temperature=0,
7
+ top_p=1,
8
+ top_k=1,
9
+ max_tokens=None,
10
+ timeout=None,
11
+ max_retries=2,
12
+ google_api_key=GEMINI_API_KEY
13
+ )
14
+
15
+ if __name__ == "__main__":
16
+ response = llm.invoke("Hello World là gì?").content
17
+ print(response)
tools/base.py CHANGED
@@ -9,10 +9,11 @@ from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
9
  from langchain_core.tools import Tool
10
  from langchain_openai import ChatOpenAI
11
  from langchain_huggingface import HuggingFacePipeline
 
12
  try:
13
- from ..config import QWEN_API_KEY, QWEN_BASE_URL, QWEN_MODEL, LOG_LEVEL, USE_LOCAL_LLM, LOCAL_MODEL_ID
14
  except (ImportError, ValueError):
15
- from config import QWEN_API_KEY, QWEN_BASE_URL, QWEN_MODEL, LOG_LEVEL, USE_LOCAL_LLM, LOCAL_MODEL_ID
16
 
17
  logger = logging.getLogger(__name__)
18
 
@@ -35,8 +36,18 @@ def register_tool(name: str, description: str, parameters: list):
35
 
36
  def get_llm():
37
  """
38
- Initialize and return the LLM based on configuration (Local vs Cloud).
39
  """
 
 
 
 
 
 
 
 
 
 
40
  if USE_LOCAL_LLM:
41
  logger.info(f"Loading Local LLM: {LOCAL_MODEL_ID}...")
42
  try:
 
9
  from langchain_core.tools import Tool
10
  from langchain_openai import ChatOpenAI
11
  from langchain_huggingface import HuggingFacePipeline
12
+ from langchain_google_genai import ChatGoogleGenerativeAI
13
  try:
14
+ from ..config import QWEN_API_KEY, QWEN_BASE_URL, QWEN_MODEL, LOG_LEVEL, USE_LOCAL_LLM, LOCAL_MODEL_ID, GEMINI_API_KEY
15
  except (ImportError, ValueError):
16
+ from config import QWEN_API_KEY, QWEN_BASE_URL, QWEN_MODEL, LOG_LEVEL, USE_LOCAL_LLM, LOCAL_MODEL_ID, GEMINI_API_KEY
17
 
18
  logger = logging.getLogger(__name__)
19
 
 
36
 
37
  def get_llm():
38
  """
39
+ Initialize and return the LLM based on configuration (Gemini > Local > Cloud Qwen).
40
  """
41
+ # 1. Prioritize Gemini if API key is present
42
+ if GEMINI_API_KEY and not GEMINI_API_KEY.startswith("your-"):
43
+ logger.info("Initializing Google Gemini LLM...")
44
+ return ChatGoogleGenerativeAI(
45
+ model="gemini-2.0-flash", # or from config
46
+ google_api_key=GEMINI_API_KEY,
47
+ temperature=0.1,
48
+ )
49
+
50
+ # 2. Local LLM
51
  if USE_LOCAL_LLM:
52
  logger.info(f"Loading Local LLM: {LOCAL_MODEL_ID}...")
53
  try:
tools/summarizer.py CHANGED
@@ -11,6 +11,10 @@ from langchain_core.prompts import ChatPromptTemplate
11
 
12
  from .base import register_tool, get_llm
13
  from .utils import preprocess_messages, extract_metadata_from_messages
 
 
 
 
14
 
15
  # --- Pydantic Schemas ---
16
  class ThreadSummary(BaseModel):
 
11
 
12
  from .base import register_tool, get_llm
13
  from .utils import preprocess_messages, extract_metadata_from_messages
14
+ try:
15
+ from ..redis_client import redis_client
16
+ except (ImportError, ValueError):
17
+ from redis_client import redis_client
18
 
19
  # --- Pydantic Schemas ---
20
  class ThreadSummary(BaseModel):
tools/utils.py CHANGED
@@ -1,5 +1,6 @@
1
  import re
2
  import json
 
3
 
4
  def extract_metadata_from_messages(messages: list[dict]) -> dict:
5
  """
 
1
  import re
2
  import json
3
+ from collections import defaultdict
4
 
5
  def extract_metadata_from_messages(messages: list[dict]) -> dict:
6
  """