Song
commited on
Commit
·
0b05f45
1
Parent(s):
feab1c7
0917
Browse files- app.py +14 -10
- 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
|
| 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 |
-
# ----------
|
| 80 |
def perform_web_search(query: str, max_results: int = 5) -> str:
|
| 81 |
-
"""使用
|
| 82 |
print(f"開始網路搜尋:查詢詞 = '{query}',最大結果數 = {max_results}")
|
| 83 |
try:
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
if not results:
|
| 87 |
print("搜尋完成:沒有找到相關結果。")
|
| 88 |
return "沒有找到相關的網路搜尋結果。"
|
| 89 |
|
| 90 |
search_summary = "以下是相關的網路搜尋結果摘要:\n"
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
|
|
|
| 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 |
-
|
|
|
|
| 2 |
uvicorn
|
| 3 |
line-bot-sdk
|
| 4 |
openai
|
| 5 |
+
tavily-python
|