Song commited on
Commit
0b05f45
·
1 Parent(s): feab1c7
Files changed (2) hide show
  1. app.py +14 -10
  2. requirements.txt +1 -1
app.py CHANGED
@@ -20,7 +20,7 @@ from linebot.v3.webhook import WebhookParser
20
  from linebot.v3.exceptions import InvalidSignatureError
21
  # --------------------------------------------------------------
22
  from openai import OpenAI
23
- from ddgs import DDGS
24
 
25
  # ==== CONFIG (從環境變數載入,或使用預設值) ====
26
  def _require_env(var: str) -> str:
@@ -33,6 +33,9 @@ def _require_env(var: str) -> str:
33
  CHANNEL_SECRET = _require_env("CHANNEL_SECRET")
34
  CHANNEL_ACCESS_TOKEN = _require_env("CHANNEL_ACCESS_TOKEN")
35
 
 
 
 
36
  # LLM API 設定
37
  LLM_API_CONFIG = {
38
  "base_url": os.getenv("LLM_BASE_URL", "https://litellm-ekkks8gsocw.dgx-coolify.apmic.ai/"),
@@ -76,22 +79,23 @@ def split_text_for_line(text: str, max_length: int = 4800) -> List[str]:
76
  text = text[split_pos:].lstrip()
77
  return chunks
78
 
79
- # ---------- 網路搜尋函數(新增 log/print 檢索過程) ----------
80
  def perform_web_search(query: str, max_results: int = 5) -> str:
81
- """使用 DuckDuckGo 進行網路搜尋,並返回摘要結果。同時 log/print 檢索過程。"""
82
  print(f"開始網路搜尋:查詢詞 = '{query}',最大結果數 = {max_results}")
83
  try:
84
- with DDGS() as ddgs:
85
- results = [r for r in ddgs.text(query, max_results=max_results)]
86
- if not results:
87
  print("搜尋完成:沒有找到相關結果。")
88
  return "沒有找到相關的網路搜尋結果。"
89
 
90
  search_summary = "以下是相關的網路搜尋結果摘要:\n"
91
- for i, result in enumerate(results, 1):
92
- print(f"結果 {i}: 標題 = '{result['title']}',摘要 = '{result['body'][:200]}...',來源 = '{result['href']}'")
93
- search_summary += f"{i}. {result['title']}: {result['body'][:200]}... (來源: {result['href']})\n"
94
- print("搜尋完成:總結果數 = {len(results)}")
 
95
  return search_summary
96
  except Exception as e:
97
  print(f"網路搜尋錯誤:{e}")
 
20
  from linebot.v3.exceptions import InvalidSignatureError
21
  # --------------------------------------------------------------
22
  from openai import OpenAI
23
+ from tavily import TavilyClient # 新增 Tavily 客戶端
24
 
25
  # ==== CONFIG (從環境變數載入,或使用預設值) ====
26
  def _require_env(var: str) -> str:
 
33
  CHANNEL_SECRET = _require_env("CHANNEL_SECRET")
34
  CHANNEL_ACCESS_TOKEN = _require_env("CHANNEL_ACCESS_TOKEN")
35
 
36
+ # 新增 Tavily API Key (免費版使用)
37
+ TAVILY_API_KEY = "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"
38
+
39
  # LLM API 設定
40
  LLM_API_CONFIG = {
41
  "base_url": os.getenv("LLM_BASE_URL", "https://litellm-ekkks8gsocw.dgx-coolify.apmic.ai/"),
 
79
  text = text[split_pos:].lstrip()
80
  return chunks
81
 
82
+ # ---------- 網路搜尋函數(改用 Tavily API,支援免費版) ----------
83
  def perform_web_search(query: str, max_results: int = 5) -> str:
84
+ """使用 Tavily 進行網路搜尋,並返回摘要結果。同時 log/print 檢索過程。"""
85
  print(f"開始網路搜尋:查詢詞 = '{query}',最大結果數 = {max_results}")
86
  try:
87
+ client = TavilyClient(api_key=TAVILY_API_KEY)
88
+ response = client.search(query, max_results=max_results, include_answer=True)
89
+ if not response['results']:
90
  print("搜尋完成:沒有找到相關結果。")
91
  return "沒有找到相關的網路搜尋結果。"
92
 
93
  search_summary = "以下是相關的網路搜尋結果摘要:\n"
94
+ search_summary += f"AI總結:{response.get('answer', '無總結可用')}\n\n"
95
+ for i, result in enumerate(response['results'], 1):
96
+ print(f"結果 {i}: 標題 = '{result['title']}',內容 = '{result['content'][:200]}...',來源 = '{result['url']}'")
97
+ search_summary += f"{i}. {result['title']}: {result['content'][:200]}... (來源: {result['url']})\n"
98
+ print(f"搜尋完成:總結果數 = {len(response['results'])}")
99
  return search_summary
100
  except Exception as e:
101
  print(f"網路搜尋錯誤:{e}")
requirements.txt CHANGED
@@ -2,4 +2,4 @@ fastapi
2
  uvicorn
3
  line-bot-sdk
4
  openai
5
- ddgs
 
2
  uvicorn
3
  line-bot-sdk
4
  openai
5
+ tavily-python