peekabook-api / app /tools /tools.py
lael
feat: initial deploy
3960e2b
Raw
History Blame Contribute Delete
15.9 kB
import os
import requests
from datetime import datetime, timedelta
from dotenv import load_dotenv
from langchain_core.tools import tool
load_dotenv()
DATA4LIBRARY_KEY = os.getenv("LIBRARY_API_KEY", "")
NAVER_CLIENT_ID = os.getenv("NAVER_CLIENT_ID", "")
NAVER_CLIENT_SECRET = os.getenv("NAVER_CLIENT_SECRET", "")
@tool
def search_library(district_name: str) -> str:
"""
์‚ฌ์šฉ์ž๊ฐ€ ๋„์„œ๊ด€ ์œ„์น˜๋ฅผ ๋ฌผ์–ด๋ณผ ๋•Œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ฃผ์˜: ๋ฐ˜๋“œ์‹œ ์„œ์šธ์˜ '๊ตฌ' ๋‹จ์œ„ ์ด๋ฆ„(์˜ˆ: ๊ฐ•๋‚จ๊ตฌ, ์„œ์ดˆ๊ตฌ, ๋งˆํฌ๊ตฌ)์„ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ '์‚ผ์„ฑ๋™'์ฒ˜๋Ÿผ '๋™' ๋‹จ์œ„๋ฅผ ๋ฌผ์–ด๋ณด๋ฉด, ๋‹น์‹ (AI)์ด ํ•ด๋‹น ๋™์ด ์†ํ•œ '๊ตฌ'๋ฅผ ์œ ์ถ”ํ•ด์„œ ์ž…๋ ฅํ•˜์„ธ์š”. (์˜ˆ: ์‚ผ์„ฑ๋™ -> ๊ฐ•๋‚จ๊ตฌ)
"""
region_codes = {
"์ข…๋กœ๊ตฌ": "11010", "์ค‘๊ตฌ": "11020", "์šฉ์‚ฐ๊ตฌ": "11030", "์„ฑ๋™๊ตฌ": "11040",
"๊ด‘์ง„๊ตฌ": "11050", "๋™๋Œ€๋ฌธ๊ตฌ": "11060", "์ค‘๋ž‘๊ตฌ": "11070", "์„ฑ๋ถ๊ตฌ": "11080",
"๊ฐ•๋ถ๊ตฌ": "11090", "๋„๋ด‰๊ตฌ": "11100", "๋…ธ์›๊ตฌ": "11110", "์€ํ‰๊ตฌ": "11120",
"์„œ๋Œ€๋ฌธ๊ตฌ": "11130", "๋งˆํฌ๊ตฌ": "11140", "์–‘์ฒœ๊ตฌ": "11150", "๊ฐ•์„œ๊ตฌ": "11160",
"๊ตฌ๋กœ๊ตฌ": "11170", "๊ธˆ์ฒœ๊ตฌ": "11180", "์˜๋“ฑํฌ๊ตฌ": "11190", "๋™์ž‘๊ตฌ": "11200",
"๊ด€์•…๊ตฌ": "11210", "์„œ์ดˆ๊ตฌ": "11220", "๊ฐ•๋‚จ๊ตฌ": "11230", "์†กํŒŒ๊ตฌ": "11240",
"๊ฐ•๋™๊ตฌ": "11250"
}
dtl_region = region_codes.get(district_name)
if not dtl_region:
return f"'{district_name}'์— ๋Œ€ํ•œ ์ง€์—ญ ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ์šธ์˜ '๊ตฌ' ๋‹จ์œ„๋กœ ์ •ํ™•ํžˆ ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”."
url = "http://data4library.kr/api/libSrch"
params = {
"authKey": DATA4LIBRARY_KEY,
"region": "11",
"dtl_region": dtl_region,
"pageSize": 3,
"format": "json"
}
try:
response = requests.get(url, params=params)
print("\n" + "โ–ผ"*50)
print("๐Ÿ“ก [๋„์„œ๊ด€ ๋ชฉ๋ก ์กฐํšŒ API ํ†ต์‹  ๋กœ๊ทธ]")
print(f"๐Ÿ‘‰ ์‹ค์ œ ํ˜ธ์ถœ๋œ URL: {response.url}")
print("โ–ฒ"*50 + "\n")
data = response.json()
libs = data.get('response', {}).get('libs', [])
if not libs:
return f"{district_name} ๊ทผ์ฒ˜์˜ ๋„์„œ๊ด€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
result = []
for item in libs:
lib = item['lib']
name = lib.get('libName', '์ด๋ฆ„ ์—†์Œ')
lib_code = lib.get('libCode', '์ฝ”๋“œ ์—†์Œ')
address = lib.get('address', '์ฃผ์†Œ ์—†์Œ')
operating_time = lib.get('operatingTime', '์šด์˜์‹œ๊ฐ„ ์ •๋ณด ์—†์Œ')
result.append(f"- {name} (๋„์„œ๊ด€ ์ฝ”๋“œ: {lib_code})\n ์ฃผ์†Œ: {address}\n ์šด์˜์‹œ๊ฐ„: {operating_time}")
return "\n\n".join(result)
except Exception as e:
return f"API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
@tool
def check_book_availability(lib_code: str, isbn13: str) -> str:
"""
์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋„์„œ๊ด€์—์„œ ํŠน์ • ์ฑ…์„ '์ง€๊ธˆ ๋นŒ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€', '๋Œ€์ถœ ๊ฐ€๋Šฅํ•œ์ง€' ๋ฌผ์–ด๋ณผ ๋•Œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ฃผ์˜: ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ๋Œ€์ƒ ๋„์„œ๊ด€์˜ ์ฝ”๋“œ(lib_code)์™€ ์ฑ…์˜ ISBN(isbn13)์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
"""
url = "http://data4library.kr/api/bookExist"
params = {
"authKey": DATA4LIBRARY_KEY,
"libCode": lib_code,
"isbn13": isbn13,
"format": "json"
}
try:
response = requests.get(url, params=params)
print("\n" + "โ–ผ"*50)
print("๐Ÿ“ก [๋Œ€์ถœ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ์กฐํšŒ API ํ†ต์‹  ๋กœ๊ทธ]")
print(f"๐Ÿ‘‰ ์‹ค์ œ ํ˜ธ์ถœ๋œ URL: {response.url}")
print("โ–ฒ"*50 + "\n")
data = response.json()
result_data = data.get('response', {}).get('result', {})
has_book = result_data.get('hasBook')
loan_available = result_data.get('loanAvailable')
if has_book == "N":
return "ํ•ด๋‹น ๋„์„œ๊ด€์—๋Š” ์ด ์ฑ…์ด ์†Œ์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค."
elif has_book == "Y" and loan_available == "Y":
return "ํ˜„์žฌ ๋Œ€์ถœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค! (์ „์ผ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ ๋ฐฉ๋ฌธ ์ „ ํ™•์ธ ๊ถŒ์žฅ)"
elif has_book == "Y" and loan_available == "N":
return "์†Œ์žฅ ์ค‘์ด๋‚˜ ํ˜„์žฌ ๋ˆ„๊ตฐ๊ฐ€ ๋Œ€์ถœ ์ค‘์ž…๋‹ˆ๋‹ค. ์˜ˆ์•ฝ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
else:
return "์ƒํƒœ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
except Exception as e:
return f"๋Œ€์ถœ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
@tool
def check_book_availability_in_district(district_name: str, isbn13: str) -> str:
"""
ํŠน์ • ๊ตฌ(์˜ˆ: ๊ฐ•๋‚จ๊ตฌ)์˜ ๋„์„œ๊ด€๋“ค์—์„œ ํŠน์ • ์ฑ…์˜ ๋Œ€์ถœ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ•œ ๋ฒˆ์— ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
district_name์€ ์„œ์šธ์˜ '๊ตฌ' ๋‹จ์œ„(์˜ˆ: ๊ฐ•๋‚จ๊ตฌ, ๋งˆํฌ๊ตฌ), isbn13์€ ์ฑ…์˜ 13์ž๋ฆฌ ISBN์ž…๋‹ˆ๋‹ค.
"""
region_codes = {
"์ข…๋กœ๊ตฌ": "11010", "์ค‘๊ตฌ": "11020", "์šฉ์‚ฐ๊ตฌ": "11030", "์„ฑ๋™๊ตฌ": "11040",
"๊ด‘์ง„๊ตฌ": "11050", "๋™๋Œ€๋ฌธ๊ตฌ": "11060", "์ค‘๋ž‘๊ตฌ": "11070", "์„ฑ๋ถ๊ตฌ": "11080",
"๊ฐ•๋ถ๊ตฌ": "11090", "๋„๋ด‰๊ตฌ": "11100", "๋…ธ์›๊ตฌ": "11110", "์€ํ‰๊ตฌ": "11120",
"์„œ๋Œ€๋ฌธ๊ตฌ": "11130", "๋งˆํฌ๊ตฌ": "11140", "์–‘์ฒœ๊ตฌ": "11150", "๊ฐ•์„œ๊ตฌ": "11160",
"๊ตฌ๋กœ๊ตฌ": "11170", "๊ธˆ์ฒœ๊ตฌ": "11180", "์˜๋“ฑํฌ๊ตฌ": "11190", "๋™์ž‘๊ตฌ": "11200",
"๊ด€์•…๊ตฌ": "11210", "์„œ์ดˆ๊ตฌ": "11220", "๊ฐ•๋‚จ๊ตฌ": "11230", "์†กํŒŒ๊ตฌ": "11240",
"๊ฐ•๋™๊ตฌ": "11250"
}
dtl_region = region_codes.get(district_name)
if not dtl_region:
return f"'{district_name}'์— ๋Œ€ํ•œ ์ง€์—ญ ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
# โ”€โ”€ 1. ๋„์„œ๊ด€ ๋ชฉ๋ก ์กฐํšŒ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
try:
lib_resp = requests.get("http://data4library.kr/api/libSrch", params={
"authKey": DATA4LIBRARY_KEY,
"region": "11",
"dtl_region": dtl_region,
"pageSize": 3,
"format": "json",
})
print("\n" + "โ–ผ"*50)
print("๐Ÿ“ก [๋„์„œ๊ด€ ๋ชฉ๋ก ์กฐํšŒ API]")
print(f"๐Ÿ‘‰ URL: {lib_resp.url}")
print("โ–ฒ"*50 + "\n")
libs = lib_resp.json().get("response", {}).get("libs", [])
except Exception as e:
return f"๋„์„œ๊ด€ ๋ชฉ๋ก ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜: {e}"
if not libs:
return f"{district_name} ๊ทผ์ฒ˜์˜ ๋„์„œ๊ด€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
# โ”€โ”€ 2. ๊ฐ ๋„์„œ๊ด€๋ณ„ ๋Œ€์ถœ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
results = []
for item in libs:
lib = item["lib"]
lib_name = lib.get("libName", "์ด๋ฆ„ ์—†์Œ")
lib_code = lib.get("libCode", "")
try:
avail_resp = requests.get("http://data4library.kr/api/bookExist", params={
"authKey": DATA4LIBRARY_KEY,
"libCode": lib_code,
"isbn13": isbn13,
"format": "json",
})
print("\n" + "โ–ผ"*50)
print(f"๐Ÿ“ก [๋Œ€์ถœ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ์กฐํšŒ API] {lib_name}")
print(f"๐Ÿ‘‰ URL: {avail_resp.url}")
print("โ–ฒ"*50 + "\n")
result_data = avail_resp.json().get("response", {}).get("result", {})
has_book = result_data.get("hasBook")
loan_available = result_data.get("loanAvailable")
if has_book == "N":
status = "๋ฏธ์†Œ์žฅ"
elif has_book == "Y" and loan_available == "Y":
status = "๋Œ€์ถœ ๊ฐ€๋Šฅ"
elif has_book == "Y" and loan_available == "N":
status = "๋Œ€์ถœ ์ค‘ (์˜ˆ์•ฝ ํ•„์š”)"
else:
status = "ํ™•์ธ ๋ถˆ๊ฐ€"
except Exception as e:
status = f"์˜ค๋ฅ˜: {e}"
results.append(f"- {lib_name}: {status}")
return "\n".join(results)
@tool
def get_popular_books(age: str = None, gender: str = None) -> str:
"""
์‚ฌ์šฉ์ž๊ฐ€ '์š”์ฆ˜ ์ธ๊ธฐ ์žˆ๋Š” ์ฑ…', '๋ฒ ์ŠคํŠธ์…€๋Ÿฌ', '๋งŽ์ด ์ฝ๋Š” ์ฑ…' ๋“ฑ์„ ์ถ”์ฒœํ•ด๋‹ฌ๋ผ๊ณ  ํ•  ๋•Œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์งˆ๋ฌธ์—์„œ ์—ฐ๋ น๋Œ€๋‚˜ ์„ฑ๋ณ„์ด ํŒŒ์•…๋œ๋‹ค๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ธ์ž(ํŒŒ๋ผ๋ฏธํ„ฐ)๋กœ ๋ฐ˜๋“œ์‹œ ๋„˜๊ฒจ์ฃผ์„ธ์š”.
- age: "0"(์˜์œ ์•„), "6"(์œ ์•„), "8"(์ดˆ๋“ฑ), "14"(์ฒญ์†Œ๋…„), "20"(20๋Œ€), "30"(30๋Œ€), "40"(40๋Œ€), "50"(50๋Œ€), "60"(60์„ธ ์ด์ƒ)
- gender: "0"(๋‚จ์„ฑ), "1"(์—ฌ์„ฑ)
"""
url = "http://data4library.kr/api/loanItemSrch"
params = {
"authKey": DATA4LIBRARY_KEY,
"format": "json",
"pageSize": 5
}
if age:
params["age"] = age
if gender:
params["gender"] = gender
try:
response = requests.get(url, params=params)
print("\n" + "โ–ผ"*50)
print("๐Ÿ“ก [์ธ๊ธฐ ๋Œ€์ถœ ๋„์„œ ์กฐํšŒ API ํ†ต์‹  ๋กœ๊ทธ]")
print(f"๐Ÿ‘‰ ์‹ค์ œ ํ˜ธ์ถœ๋œ URL: {response.url}")
print("โ–ฒ"*50 + "\n")
data = response.json()
docs = data.get('response', {}).get('docs', [])
if not docs:
return "์กฐ๊ฑด์— ๋งž๋Š” ์ธ๊ธฐ ๋„์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
result = []
for item in docs:
doc = item['doc']
ranking = doc.get('ranking', '์ˆœ์œ„ ์—†์Œ')
bookname = doc.get('bookname', '์ œ๋ชฉ ์—†์Œ')
authors = doc.get('authors', '์ €์ž ๋ฏธ์ƒ')
publisher = doc.get('publisher', '์ถœํŒ์‚ฌ ๋ฏธ์ƒ')
loan_count = doc.get('loan_count', '0')
result.append(f"{ranking}์œ„. {bookname}\n - ์ €์ž: {authors}\n - ์ถœํŒ์‚ฌ: {publisher}\n - ๋ˆ„์  ๋Œ€์ถœ๊ฑด์ˆ˜: {loan_count}๊ฑด")
condition_text = "์ „์ฒด ์ด์šฉ์ž"
if age or gender:
condition_text = f"์„ ํƒ๋œ ์กฐ๊ฑด(์—ฐ๋ น:{age if age else '์ „์ฒด'}, ์„ฑ๋ณ„:{gender if gender else '์ „์ฒด'})์˜"
return f"[{condition_text} ์ธ๊ธฐ ๋Œ€์ถœ ๋„์„œ ์ƒ์œ„ 5๊ถŒ]\n\n" + "\n\n".join(result)
except Exception as e:
return f"์ธ๊ธฐ ๋„์„œ API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
@tool
def get_trending_books(search_date: str = None) -> str:
"""
์‚ฌ์šฉ์ž๊ฐ€ '์š”์ฆ˜ ๊ฐ‘์ž๊ธฐ ๋œจ๋Š” ์ฑ…', '์—ญ์ฃผํ–‰ ๋ฒ ์ŠคํŠธ์…€๋Ÿฌ', '๋Œ€์ถœ ๊ธ‰์ƒ์Šน ๋„์„œ', '์ตœ๊ทผ ํŠธ๋ Œ๋“œ'๋ฅผ ๋ฌผ์–ด๋ณผ ๋•Œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
- search_date: 'YYYY-MM-DD' ํ˜•์‹์˜ ๋‚ ์งœ.
๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋‚ ์งœ๋ฅผ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋น„์›Œ๋‘์„ธ์š”(None). ์ฝ”๋“œ๊ฐ€ ์•Œ์•„์„œ ์ตœ๊ทผ ๋‚ ์งœ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
"""
if not search_date:
yesterday = datetime.now() - timedelta(days=1)
search_date = yesterday.strftime("%Y-%m-%d")
url = "http://data4library.kr/api/hotTrend"
params = {
"authKey": DATA4LIBRARY_KEY,
"searchDt": search_date,
"format": "json"
}
try:
response = requests.get(url, params=params)
print("\n" + "โ–ผ"*50)
print("๐Ÿ“ก [๊ธ‰์ƒ์Šน ๋„์„œ ์กฐํšŒ API ํ†ต์‹  ๋กœ๊ทธ]")
print(f"๐Ÿ‘‰ ์‹ค์ œ ํ˜ธ์ถœ๋œ URL: {response.url}")
print("โ–ฒ"*50 + "\n")
data = response.json()
results = data.get('response', {}).get('results', [])
if not results:
return f"{search_date} ๊ธฐ์ค€ ๊ธ‰์ƒ์Šน ๋„์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
target_date_data = results[0]['result']
actual_date = target_date_data.get('date', search_date)
docs = target_date_data.get('docs', [])
if not docs:
return f"{actual_date} ๊ธฐ์ค€ ๊ธ‰์ƒ์Šน ๋„์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."
formatted_result = []
for item in docs:
doc = item['doc']
no = doc.get('no', '0')
bookname = doc.get('bookname', '์ œ๋ชฉ ์—†์Œ')
authors = doc.get('authors', '์ €์ž ๋ฏธ์ƒ')
difference = doc.get('difference', '0')
formatted_result.append(f"{no}์œ„. {bookname} (์ €์ž: {authors}) \n ๐Ÿ”ฅ ๋ฌด๋ ค {difference}๊ณ„๋‹จ ๋Œ€์ถœ ์ˆœ์œ„ ์ƒ์Šน!")
return f"[{actual_date} ๊ธฐ์ค€ ๋Œ€์ถœ ๊ธ‰์ƒ์Šน ๋„์„œ TOP 5]\n\n" + "\n\n".join(formatted_result)
except Exception as e:
return f"๊ธ‰์ƒ์Šน ๋„์„œ API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
@tool
def get_book_recommendations(isbn13: str) -> str:
"""
์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ฑ…(์˜ˆ: ์ฑ„์‹์ฃผ์˜์ž, ์†Œ๋…„์ด ์˜จ๋‹ค ๋“ฑ)์„ ์–ธ๊ธ‰ํ•˜๋ฉฐ '๋น„์Šทํ•œ ์ฑ…', '๊ฐ™์ด ์ฝ๊ธฐ ์ข‹์€ ์ฑ…', '์ด ์ฑ…์„ ์ฝ์€ ์‚ฌ๋žŒ๋“ค์ด ์ข‹์•„ํ•˜๋Š” ์ฑ…'์„ ์ถ”์ฒœํ•ด๋‹ฌ๋ผ๊ณ  ํ•  ๋•Œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ฃผ์˜: ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ์ฑ…์˜ 13์ž๋ฆฌ ISBN ๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ISBN์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ฑ… ๊ฒ€์ƒ‰ ๋„๊ตฌ๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•ด์„œ ISBN์„ ์•Œ์•„๋‚ธ ๋’ค ์ด ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”.
"""
url = "http://data4library.kr/api/usageAnalysisList"
params = {
"authKey": DATA4LIBRARY_KEY,
"isbn13": isbn13,
"format": "json"
}
try:
response = requests.get(url, params=params)
print("\n" + "โ–ผ"*50)
print("๐Ÿ“ก [์—ฐ๊ด€ ๋„์„œ ์ถ”์ฒœ API ํ†ต์‹  ๋กœ๊ทธ]")
print(f"๐Ÿ‘‰ ์‹ค์ œ ํ˜ธ์ถœ๋œ URL: {response.url}")
print("โ–ฒ"*50 + "\n")
data = response.json()
response_data = data.get('response', {})
co_loan_books = response_data.get('coLoanBooks', [])
mania_rec_books = response_data.get('maniaRecBooks', [])
if not co_loan_books and not mania_rec_books:
return "ํ•ด๋‹น ๋„์„œ์™€ ์—ฐ๊ด€๋œ ์ถ”์ฒœ ๋„์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
result_text = []
if co_loan_books:
result_text.append("๐Ÿ“– [์ด ์ฑ…์„ ๋นŒ๋ฆฐ ์‚ฌ๋žŒ๋“ค์ด ํ•จ๊ป˜ ๋นŒ๋ฆฐ ์ฑ…]")
for i, item in enumerate(co_loan_books[:3]):
book = item['book']
result_text.append(f" {i+1}. {book.get('bookname', '์ œ๋ชฉ ์—†์Œ')} (์ €์ž: {book.get('authors', '์ €์ž ๋ฏธ์ƒ')})")
if mania_rec_books:
result_text.append("\n๐Ÿ’ก [์ด ์ฑ…์˜ ๋งˆ๋‹ˆ์•„๋“ค์„ ์œ„ํ•œ ๋งž์ถค ์ถ”์ฒœ]")
for i, item in enumerate(mania_rec_books[:3]):
book = item['book']
result_text.append(f" {i+1}. {book.get('bookname', '์ œ๋ชฉ ์—†์Œ')} (์ €์ž: {book.get('authors', '์ €์ž ๋ฏธ์ƒ')})")
return "\n".join(result_text)
except Exception as e:
return f"์—ฐ๊ด€ ๋„์„œ ์ถ”์ฒœ API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
@tool
def get_book_isbn(book_title: str) -> str:
"""
์‚ฌ์šฉ์ž๊ฐ€ ์–ธ๊ธ‰ํ•œ ์ฑ… ์ œ๋ชฉ์œผ๋กœ 13์ž๋ฆฌ ISBN ๋ฒˆํ˜ธ์™€ ํ‘œ์ง€ ์ด๋ฏธ์ง€ ๋งํฌ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
๋„ค์ด๋ฒ„ ์ฑ… ๊ฒ€์ƒ‰ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œตํ†ต์„ฑ ์žˆ๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์˜ต๋‹ˆ๋‹ค.
"""
url = "https://openapi.naver.com/v1/search/book.json"
headers = {
"X-Naver-Client-Id": NAVER_CLIENT_ID,
"X-Naver-Client-Secret": NAVER_CLIENT_SECRET,
}
params = {"query": book_title, "display": 1}
try:
response = requests.get(url, headers=headers, params=params)
print("\n" + "โ–ผ"*50)
print("๐Ÿ“ก [ISBN + ํ‘œ์ง€ URL ๊ฒ€์ƒ‰ API ํ†ต์‹  ๋กœ๊ทธ]")
print(f"๐Ÿ‘‰ ์‹ค์ œ ํ˜ธ์ถœ๋œ URL: {response.url}")
print("โ–ฒ"*50 + "\n")
data = response.json()
items = data.get('items', [])
if not items:
return f"'{book_title}'์— ๋Œ€ํ•œ ์ฑ… ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
isbn_raw = items[0].get('isbn', '')
isbn13 = isbn_raw.split()[-1] if isbn_raw else ""
full_title = items[0].get('title', book_title)
author = items[0].get('author', '์ €์ž ๋ฏธ์ƒ')
image_url = items[0].get('image', '')
return f"์ฑ… '{full_title}' (์ €์ž: {author})์˜ ์ •ํ™•ํ•œ ISBN13 ๋ฒˆํ˜ธ๋Š” '{isbn13}' ์ด๋ฉฐ, ํ‘œ์ง€ ์ด๋ฏธ์ง€ ๋งํฌ๋Š” '{image_url}' ์ž…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ์‹œ ์ด ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜๋“œ์‹œ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ๋ณด์—ฌ์ฃผ์„ธ์š”."
except Exception as e:
return f"๋„ค์ด๋ฒ„ ISBN ๊ฒ€์ƒ‰ API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"