AgentQL
AgentQL 工具提供網頁互動和從任何網頁提取結構化數據的功能,使用 AgentQL 查詢 或自然語言提示。 AgentQL 可以跨多種語言和網頁使用,不會隨著時間和變更而失效。
概述
AgentQL 提供以下三種工具
ExtractWebDataTool
使用 AgentQL 查詢 或數據的自然語言描述,從給定 URL 的網頁中提取結構化數據為 JSON。
以下兩種工具也捆綁為 AgentQLBrowserToolkit
,並且必須與 Playwright
瀏覽器或通過 Chrome DevTools Protocal (CDP) 的遠程瀏覽器實例一起使用
-
ExtractWebDataBrowserTool
使用 AgentQL 查詢 或自然語言描述,從瀏覽器中的活動網頁中提取結構化數據為 JSON。 -
GetWebElementBrowserTool
使用自然語言描述在瀏覽器中的活動網頁上查找網頁元素,並返回其 CSS 選擇器以進行進一步互動。
整合詳細資訊
類別 | 套件 | 可序列化 | JS 支援 | 最新套件 |
---|---|---|---|---|
AgentQL | langchain-agentql | ❌ | ❌ | 1.0.0 |
工具功能
工具 | 網頁數據提取 | 網頁元素提取 | 與本地瀏覽器一起使用 |
---|---|---|---|
ExtractWebDataTool | ✅ | ❌ | ❌ |
ExtractWebDataBrowserTool | ✅ | ❌ | ✅ |
GetWebElementBrowserTool | ❌ | ✅ | ✅ |
設定
%pip install --quiet -U langchain_agentql
要執行此筆記本,請安裝 Playwright
瀏覽器並配置 Jupyter Notebook 的 asyncio
迴圈。
!playwright install
# This import is required only for jupyter notebooks, since they have their own eventloop
import nest_asyncio
nest_asyncio.apply()
憑證
要使用 AgentQL 工具,您需要從 AgentQL 開發者入口網站 取得您自己的 API 金鑰,並設定 AgentQL 環境變數。
import os
os.environ["AGENTQL_API_KEY"] = "YOUR_AGENTQL_API_KEY"
實例化
ExtractWebDataTool
您可以使用以下參數實例化 ExtractWebDataTool
api_key
:您從 dev.agentql.com 取得的 AgentQL API 金鑰。可選
。timeout
:請求超時前等待的秒數。如果數據提取超時,請增加此值。預設為900
。is_stealth_mode_enabled
:是否啟用實驗性反機器人規避策略。此功能可能不適用於所有網站的所有時間。啟用此模式後,數據提取可能需要更長的時間才能完成。預設為False
。wait_for
:在提取數據之前等待頁面加載的秒數。預設為0
。is_scroll_to_bottom_enabled
:是否在提取數據之前滾動到頁面底部。預設為False
。mode
:"standard"
使用深度數據分析,而"fast"
則以犧牲一些分析深度來換取速度,並且足以應付大多數用例。在此指南中了解有關模式的更多資訊。 預設為"fast"
。is_screenshot_enabled
:是否在提取數據之前截取螢幕截圖。以 Base64 字串形式在「metadata」中返回。預設為False
。
ExtractWebDataTool
是使用 AgentQL 的 REST API 實作的,您可以在 API 參考文檔 中查看有關參數的更多詳細資訊。
from langchain_agentql.tools import ExtractWebDataTool
extract_web_data_tool = ExtractWebDataTool()
ExtractWebDataBrowserTool
要實例化 ExtractWebDataBrowserTool,您需要將工具連接到瀏覽器實例。
您可以設定以下參數
timeout
:請求超時前等待的秒數。如果數據提取超時,請增加此值。預設為900
。wait_for_network_idle
:是否等到網路達到完全閒置狀態後再執行。預設為True
。include_hidden
:是否將頁面上視覺上隱藏的元素納入考量。預設為True
。mode
:"standard"
使用深度數據分析,而"fast"
則以犧牲一些分析深度來換取速度,並且足以應付大多數用例。在此指南中了解有關模式的更多資訊。 預設為"fast"
。
ExtractWebDataBrowserTool
是使用 AgentQL 的 SDK 實作的。您可以在 AgentQL 的 API 參考文檔 中找到有關參數和功能的更多詳細資訊。
from langchain_agentql.tools import ExtractWebDataBrowserTool
from langchain_agentql.utils import create_async_playwright_browser
async_browser = await create_async_playwright_browser()
extract_web_data_browser_tool = ExtractWebDataBrowserTool(async_browser=async_browser)
GetWebElementBrowserTool
要實例化 GetWebElementBrowserTool,您需要將工具連接到瀏覽器實例。
您可以設定以下參數
timeout
:請求超時前等待的秒數。如果數據提取超時,請增加此值。預設為900
。wait_for_network_idle
:是否等到網路達到完全閒置狀態後再執行。預設為True
。include_hidden
:是否將頁面上視覺上隱藏的元素納入考量。預設為False
。mode
:"standard"
使用深度數據分析,而"fast"
則以犧牲一些分析深度來換取速度,並且足以應付大多數用例。在此指南中了解有關模式的更多資訊。 預設為"fast"
。
GetWebElementBrowserTool
是使用 AgentQL 的 SDK 實作的。您可以在 AgentQL 的 API 參考文檔 中找到有關參數和功能的更多詳細資訊。`
from langchain_agentql.tools import GetWebElementBrowserTool
extract_web_element_tool = GetWebElementBrowserTool(async_browser=async_browser)
調用
ExtractWebDataTool
此工具在底層使用 AgentQL 的 REST API,將公開可用的網頁 URL 發送到 AgentQL 的端點。這不適用於私人頁面或已登錄的會話。對於這些用例,請使用 ExtractWebDataBrowserTool
。
url
:您要從中提取數據的網頁 URL。query
:要執行的 AgentQL 查詢。如果您想提取精確結構化的數據,請使用 AgentQL 查詢。了解更多關於 如何在文檔中編寫 AgentQL 查詢 或在 AgentQL Playground 中測試一個。prompt
:從頁面提取數據的自然語言描述。 AgentQL 將從您的提示推斷數據的結構。如果您想提取由自由形式語言定義的數據,而無需定義特定結構,請使用prompt
。
注意: 您必須定義 query
或 prompt
才能使用 AgentQL。
# You can invoke the tool with either a query or a prompt
# extract_web_data_tool.invoke(
# {
# "url": "https://www.agentql.com/blog",
# "prompt": "the blog posts with title, url, date of post and author",
# }
# )
extract_web_data_tool.invoke(
{
"url": "https://www.agentql.com/blog",
"query": "{ posts[] { title url date author } }",
},
)
{'data': {'posts': [{'title': 'Launch Week Recap—make the web AI-ready',
'url': 'https://www.agentql.com/blog/2024-launch-week-recap',
'date': 'Nov 18, 2024',
'author': 'Rachel-Lee Nabors'},
{'title': 'Accurate data extraction from PDFs and images with AgentQL',
'url': 'https://www.agentql.com/blog/accurate-data-extraction-pdfs-images',
'date': 'Feb 1, 2025',
'author': 'Rachel-Lee Nabors'},
{'title': 'Introducing Scheduled Scraping Workflows',
'url': 'https://www.agentql.com/blog/scheduling',
'date': 'Dec 2, 2024',
'author': 'Rachel-Lee Nabors'},
{'title': 'Updates to Our Pricing Model',
'url': 'https://www.agentql.com/blog/2024-pricing-update',
'date': 'Nov 19, 2024',
'author': 'Rachel-Lee Nabors'},
{'title': 'Get data from any page: AgentQL’s REST API Endpoint—Launch week day 5',
'url': 'https://www.agentql.com/blog/data-rest-api',
'date': 'Nov 15, 2024',
'author': 'Rachel-Lee Nabors'}]},
'metadata': {'request_id': '0dc1f89c-1b6a-46fe-8089-6cd0f082f094',
'generated_query': None,
'screenshot': None}}
ExtractWebDataBrowserTool
query
:要執行的 AgentQL 查詢。如果您想提取精確結構化的數據,請使用 AgentQL 查詢。了解更多關於 如何在文檔中編寫 AgentQL 查詢 或在 AgentQL Playground 中測試一個。prompt
:從頁面提取數據的自然語言描述。 AgentQL 將從您的提示推斷數據的結構。如果您想提取由自由形式語言定義的數據,而無需定義特定結構,請使用prompt
。
注意: 您必須定義 query
或 prompt
才能使用 AgentQL。
要提取數據,首先您必須使用 LangChain 的 Playwright 工具導航到網頁。
from langchain_community.tools.playwright import NavigateTool
navigate_tool = NavigateTool(async_browser=async_browser)
await navigate_tool.ainvoke({"url": "https://www.agentql.com/blog"})
'Navigating to https://www.agentql.com/blog returned status code 200'
# You can invoke the tool with either a query or a prompt
# await extract_web_data_browser_tool.ainvoke(
# {'query': '{ blogs[] { title url date author } }'}
# )
await extract_web_data_browser_tool.ainvoke(
{"prompt": "the blog posts with title, url, date of post and author"}
)
/usr/local/lib/python3.11/dist-packages/agentql/_core/_utils.py:167: UserWarning: [31m🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨[0m
warnings.warn(
{'blog_posts': [{'title': 'Launch Week Recap—make the web AI-ready',
'url': 'https://www.agentql.com/blog/2024-launch-week-recap',
'date': 'Nov 18, 2024',
'author': 'Rachel-Lee Nabors'},
{'title': 'Accurate data extraction from PDFs and images with AgentQL',
'url': 'https://www.agentql.com/blog/accurate-data-extraction-pdfs-images',
'date': 'Feb 1, 2025',
'author': 'Rachel-Lee Nabors'},
{'title': 'Introducing Scheduled Scraping Workflows',
'url': 'https://www.agentql.com/blog/scheduling',
'date': 'Dec 2, 2024',
'author': 'Rachel-Lee Nabors'},
{'title': 'Updates to Our Pricing Model',
'url': 'https://www.agentql.com/blog/2024-pricing-update',
'date': 'Nov 19, 2024',
'author': 'Rachel-Lee Nabors'},
{'title': 'Get data from any page: AgentQL’s REST API Endpoint—Launch week day 5',
'url': 'https://www.agentql.com/blog/data-rest-api',
'date': 'Nov 15, 2024',
'author': 'Rachel-Lee Nabors'}]}
GetWebElementBrowserTool
prompt
:要查找頁面上網頁元素的自然語言描述。
selector = await extract_web_element_tool.ainvoke({"prompt": "Next page button"})
selector
"[tf623_id='194']"
from langchain_community.tools.playwright import ClickTool
# Disabling 'visible_only' will allow us to click on elements that are not visible on the page
await ClickTool(async_browser=async_browser, visible_only=False).ainvoke(
{"selector": selector}
)
"Clicked element '[tf623_id='194']'"
from langchain_community.tools.playwright import CurrentWebPageTool
await CurrentWebPageTool(async_browser=async_browser).ainvoke({})
'https://www.agentql.com/blog/page/2'
鏈接
您可以通過首先將 AgentQL 工具綁定到 工具調用模型,然後調用它,在鏈中使用 AgentQL 工具
實例化 LLM
import os
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
from langchain.chat_models import init_chat_model
llm = init_chat_model(model="gpt-4o", model_provider="openai")
執行工具鏈
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableConfig, chain
prompt = ChatPromptTemplate(
[
("system", "You are a helpful assistant in extracting data from website."),
("human", "{user_input}"),
("placeholder", "{messages}"),
]
)
# specifying tool_choice will force the model to call this tool.
llm_with_tools = llm.bind_tools(
[extract_web_data_tool], tool_choice="extract_web_data_with_rest_api"
)
llm_chain = prompt | llm_with_tools
@chain
def tool_chain(user_input: str, config: RunnableConfig):
input_ = {"user_input": user_input}
ai_msg = llm_chain.invoke(input_, config=config)
tool_msgs = extract_web_data_tool.batch(ai_msg.tool_calls, config=config)
return {"messages": tool_msgs}
tool_chain.invoke(
"Extract data from https://www.agentql.com/blog using the following agentql query: { posts[] { title url date author } }"
)
{'messages': [ToolMessage(content='{"data": {"posts": [{"title": "Launch Week Recap—make the web AI-ready", "url": "https://www.agentql.com/blog/2024-launch-week-recap", "date": "Nov 18, 2024", "author": "Rachel-Lee Nabors"}, {"title": "Accurate data extraction from PDFs and images with AgentQL", "url": "https://www.agentql.com/blog/accurate-data-extraction-pdfs-images", "date": "Feb 1, 2025", "author": "Rachel-Lee Nabors"}, {"title": "Introducing Scheduled Scraping Workflows", "url": "https://www.agentql.com/blog/scheduling", "date": "Dec 2, 2024", "author": "Rachel-Lee Nabors"}, {"title": "Updates to Our Pricing Model", "url": "https://www.agentql.com/blog/2024-pricing-update", "date": "Nov 19, 2024", "author": "Rachel-Lee Nabors"}, {"title": "Get data from any page: AgentQL’s REST API Endpoint—Launch week day 5", "url": "https://www.agentql.com/blog/data-rest-api", "date": "Nov 15, 2024", "author": "Rachel-Lee Nabors"}]}, "metadata": {"request_id": "1a84ed12-d02a-497d-b09d-21fe49342fa3", "generated_query": null, "screenshot": null}}', name='extract_web_data_with_rest_api', tool_call_id='call_z4Rl1MpjJZNcbLlq1OCneoMF')]}
在代理程式中使用
您可以將 AgentQL 工具與 AI 代理程式一起使用 AgentQLBrowserToolkit
。此工具包包括 ExtractDataBrowserTool
和 GetWebElementBrowserTool
。以下是代理瀏覽器操作的範例,它將 AgentQL 的工具包與 Playwright 工具結合在一起。
實例化工具包
from langchain_agentql.utils import create_async_playwright_browser
async_agent_browser = await create_async_playwright_browser()
from langchain_agentql import AgentQLBrowserToolkit
agentql_toolkit = AgentQLBrowserToolkit(async_browser=async_agent_browser)
agentql_toolkit.get_tools()
[ExtractWebDataBrowserTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/root/.cache/ms-playwright/chromium-1155/chrome-linux/chrome> version=133.0.6943.16>),
GetWebElementBrowserTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/root/.cache/ms-playwright/chromium-1155/chrome-linux/chrome> version=133.0.6943.16>)]
from langchain_community.tools.playwright import ClickTool, NavigateTool
# we hand pick the following tools to allow more precise agentic browser actions
playwright_toolkit = [
NavigateTool(async_browser=async_agent_browser),
ClickTool(async_browser=async_agent_browser, visible_only=False),
]
playwright_toolkit
[NavigateTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/root/.cache/ms-playwright/chromium-1155/chrome-linux/chrome> version=133.0.6943.16>),
ClickTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/root/.cache/ms-playwright/chromium-1155/chrome-linux/chrome> version=133.0.6943.16>, visible_only=False)]
與 ReAct 代理程式一起使用
%pip install --quiet -U langgraph
from langgraph.prebuilt import create_react_agent
# You need to set up an llm, please refer to the chaining section
agent_executor = create_react_agent(
llm, agentql_toolkit.get_tools() + playwright_toolkit
)
prompt = """
Navigate to https://news.ycombinator.com/,
extract the news titles on the current page,
show the current page url,
find the button on the webpage that direct to the next page,
click on the button,
show the current page url,
extract the news title on the current page
extract the news titles that mention "AI" from the two pages.
"""
events = agent_executor.astream(
{"messages": [("user", prompt)]},
stream_mode="values",
)
async for event in events:
event["messages"][-1].pretty_print()
================================[1m Human Message [0m=================================
Navigate to https://news.ycombinator.com/,
extract the news titles on the current page,
show the current page url,
find the button on the webpage that direct to the next page,
click on the button,
show the current page url,
extract the news title on the current page
extract the news titles that mention "AI" from the two pages.
==================================[1m Ai Message [0m==================================
Tool Calls:
navigate_browser (call_3eY5a0BRwyYj7kaNpAxkquTD)
Call ID: call_3eY5a0BRwyYj7kaNpAxkquTD
Args:
url: https://news.ycombinator.com/
=================================[1m Tool Message [0m=================================
Name: navigate_browser
Navigating to https://news.ycombinator.com/ returned status code 200
==================================[1m Ai Message [0m==================================
Tool Calls:
extract_web_data_from_browser (call_WvRrZKGGo8mq3JewRlaIS5xx)
Call ID: call_WvRrZKGGo8mq3JewRlaIS5xx
Args:
prompt: Extract all the news titles from this page.
``````output
/usr/local/lib/python3.11/dist-packages/agentql/_core/_utils.py:167: UserWarning: [31m🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨[0m
warnings.warn(
``````output
=================================[1m Tool Message [0m=================================
Name: extract_web_data_from_browser
{"news_item": [{"title": "I Went to SQL Injection Court"}, {"title": "Framework's first desktop is a strange–but unique–mini ITX gaming PC"}, {"title": "Hyperspace"}, {"title": "The XB-70 (2019)"}, {"title": "How core Git developers configure Git"}, {"title": "Emergent Misalignment: Narrow finetuning can produce broadly misaligned LLMs [pdf]"}, {"title": "Hard problems that reduce to document ranking"}, {"title": "Ggwave: Tiny Data-over-Sound Library"}, {"title": "Bald eagles are thriving again after near extinction"}, {"title": "Forum with 2.6M posts being deleted due to UK Online Safety Act"}, {"title": "Launch HN: Browser Use (YC W25) – open-source web agents"}, {"title": "Part two of Grant Sanderson's video with Terry Tao on the cosmic distance ladder"}, {"title": "New maps of the chaotic space-time inside black holes"}, {"title": "Knitting Your Parachute"}, {"title": "Chicory: A JVM native WebAssembly runtime"}, {"title": "Low Overhead Allocation Sampling with VMProf in PyPy's GC"}, {"title": "Sigma BF Camera"}, {"title": "DeepSearcher: A local open-source Deep Research"}, {"title": "Xonsh – A Python-powered shell"}, {"title": "A possible future of Python in the browser"}, {"title": "Show HN: GoatDB – A lightweight, offline-first, realtime NoDB for Deno and React"}, {"title": "Embedding Python in Elixir, it's fine"}, {"title": "The Deep Research problem"}, {"title": "Why are QR Codes with capital letters smaller than QR codes with lower case?"}, {"title": "Show HN: My new wiki for Silicon Graphics stuff"}, {"title": "AI is blurring the line between PMs and engineers?"}, {"title": "I recreated Shazam's algorithm with Go [video]"}, {"title": "Dogs may have domesticated themselves because they liked snacks, model suggests"}, {"title": "Show HN: Txtl – Fast static website of text utilities"}, {"title": "Have we been wrong about why Mars is red?"}]}
==================================[1m Ai Message [0m==================================
Tool Calls:
get_web_element_from_browser (call_B6jn5ItasceNW7eeb640UhQQ)
Call ID: call_B6jn5ItasceNW7eeb640UhQQ
Args:
prompt: button or link to go to the next page
extract_web_data_from_browser (call_Wyh2VH76bzrlDozp7gpkVBl7)
Call ID: call_Wyh2VH76bzrlDozp7gpkVBl7
Args:
prompt: Extract the current page URL
``````output
/usr/local/lib/python3.11/dist-packages/agentql/_core/_utils.py:167: UserWarning: [31m🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨[0m
warnings.warn(
``````output
=================================[1m Tool Message [0m=================================
Name: extract_web_data_from_browser
{"current_page_url": "https://news.ycombinator.com/news"}
==================================[1m Ai Message [0m==================================
Tool Calls:
click_element (call_NLGIW1lLutkZ6k0vqkfGbOD7)
Call ID: call_NLGIW1lLutkZ6k0vqkfGbOD7
Args:
selector: [tf623_id='944']
=================================[1m Tool Message [0m=================================
Name: click_element
Clicked element '[tf623_id='944']'
==================================[1m Ai Message [0m==================================
Tool Calls:
extract_web_data_from_browser (call_QPt8R2hqiSgytUvLcWUUORKF)
Call ID: call_QPt8R2hqiSgytUvLcWUUORKF
Args:
prompt: Extract the current page URL
``````output
/usr/local/lib/python3.11/dist-packages/agentql/_core/_utils.py:167: UserWarning: [31m🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨[0m
warnings.warn(
``````output
=================================[1m Tool Message [0m=================================
Name: extract_web_data_from_browser
{"current_page_url": "https://news.ycombinator.com/news?p=2"}
==================================[1m Ai Message [0m==================================
Tool Calls:
extract_web_data_from_browser (call_ZZOPrIfVaVQ1A26j8EGE913W)
Call ID: call_ZZOPrIfVaVQ1A26j8EGE913W
Args:
prompt: Extract all the news titles from this page.
``````output
/usr/local/lib/python3.11/dist-packages/agentql/_core/_utils.py:167: UserWarning: [31m🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨[0m
warnings.warn(
``````output
=================================[1m Tool Message [0m=================================
Name: extract_web_data_from_browser
{"news_item": [{"title": "'Hey Number 17 '"}, {"title": "Building and operating a pretty big storage system called S3 (2023)"}, {"title": "Ghost House – software for automatic inbetweens"}, {"title": "Ask HN: Former devs who can't get a job, what did you end up doing for work?"}, {"title": "DeepSeek open source DeepEP – library for MoE training and Inference"}, {"title": "SETI's hard steps and how to resolve them"}, {"title": "A Defense of Weird Research"}, {"title": "DigiCert: Threat of legal action to stifle Bugzilla discourse"}, {"title": "Show HN: Tach – Visualize and untangle your Python codebase"}, {"title": "Ask HN: A retrofitted C dialect?"}, {"title": "“The closer to the train station, the worse the kebab” – a “study”"}, {"title": "Brewing Clean Water: The metal-remediating benefits of tea preparation"}, {"title": "Invoker Commands (Explainer)"}, {"title": "Freelancing: How I found clients, part 1"}, {"title": "Claude 3.7 Sonnet and Claude Code"}, {"title": "Clean Code vs. A Philosophy Of Software Design"}, {"title": "Show HN: While the world builds AI Agents, I'm just building calculators"}, {"title": "History of CAD"}, {"title": "Fans are better than tech at organizing information online (2019)"}, {"title": "Some Programming Language Ideas"}, {"title": "The independent researcher (2018)"}, {"title": "The best way to use text embeddings portably is with Parquet and Polars"}, {"title": "Show HN: Prioritize Anything with Stacks"}, {"title": "Ashby (YC W19) Is Hiring Principal Product Engineers"}, {"title": "GibberLink [AI-AI Communication]"}, {"title": "Show HN: I made a site to tell the time in corporate"}, {"title": "It’s still worth blogging in the age of AI"}, {"title": "What would happen if we didn't use TCP or UDP?"}, {"title": "Closing the “green gap”: energy savings from the math of the landscape function"}, {"title": "Larry Ellison's half-billion-dollar quest to change farming"}]}
==================================[1m Ai Message [0m==================================
Here's a summary of the actions and results:
### Page 1
- **URL:** [https://news.ycombinator.com/news](https://news.ycombinator.com/news)
- **News Titles:**
1. I Went to SQL Injection Court
2. Framework's first desktop is a strange–but unique–mini ITX gaming PC
3. Hyperspace
4. The XB-70 (2019)
5. How core Git developers configure Git
6. Emergent Misalignment: Narrow finetuning can produce broadly misaligned LLMs [pdf]
7. Hard problems that reduce to document ranking
8. Ggwave: Tiny Data-over-Sound Library
9. Bald eagles are thriving again after near extinction
10. Forum with 2.6M posts being deleted due to UK Online Safety Act
11. Launch HN: Browser Use (YC W25) – open-source web agents
12. Part two of Grant Sanderson's video with Terry Tao on the cosmic distance ladder
13. New maps of the chaotic space-time inside black holes
14. Knitting Your Parachute
15. Chicory: A JVM native WebAssembly runtime
16. Low Overhead Allocation Sampling with VMProf in PyPy's GC
17. Sigma BF Camera
18. DeepSearcher: A local open-source Deep Research
19. Xonsh – A Python-powered shell
20. A possible future of Python in the browser
21. Show HN: GoatDB – A lightweight, offline-first, realtime NoDB for Deno and React
22. Embedding Python in Elixir, it's fine
23. The Deep Research problem
24. Why are QR Codes with capital letters smaller than QR codes with lower case?
25. Show HN: My new wiki for Silicon Graphics stuff
26. **AI is blurring the line between PMs and engineers?**
27. I recreated Shazam's algorithm with Go [video]
28. Dogs may have domesticated themselves because they liked snacks, model suggests
29. Show HN: Txtl – Fast static website of text utilities
30. Have we been wrong about why Mars is red?
### Page 2
- **URL:** [https://news.ycombinator.com/news?p=2](https://news.ycombinator.com/news?p=2)
- **News Titles:**
1. 'Hey Number 17'
2. Building and operating a pretty big storage system called S3 (2023)
3. Ghost House – software for automatic inbetweens
4. Ask HN: Former devs who can't get a job, what did you end up doing for work?
5. DeepSeek open source DeepEP – library for MoE training and Inference
6. SETI's hard steps and how to resolve them
7. A Defense of Weird Research
8. DigiCert: Threat of legal action to stifle Bugzilla discourse
9. Show HN: Tach – Visualize and untangle your Python codebase
10. Ask HN: A retrofitted C dialect?
11. “The closer to the train station, the worse the kebab” – a “study”
12. Brewing Clean Water: The metal-remediating benefits of tea preparation
13. Invoker Commands (Explainer)
14. Freelancing: How I found clients, part 1
15. Claude 3.7 Sonnet and Claude Code
16. Clean Code vs. A Philosophy Of Software Design
17. **Show HN: While the world builds AI Agents, I'm just building calculators**
18. History of CAD
19. Fans are better than tech at organizing information online (2019)
20. Some Programming Language Ideas
21. The independent researcher (2018)
22. The best way to use text embeddings portably is with Parquet and Polars
23. Show HN: Prioritize Anything with Stacks
24. Ashby (YC W19) Is Hiring Principal Product Engineers
25. **GibberLink [AI-AI Communication]**
26. Show HN: I made a site to tell the time in corporate
27. **It’s still worth blogging in the age of AI**
28. What would happen if we didn't use TCP or UDP?
29. Closing the “green gap”: energy savings from the math of the landscape function
30. Larry Ellison's half-billion-dollar quest to change farming
### News Titles Mentioning "AI":
1. Page 1: **AI is blurring the line between PMs and engineers?**
2. Page 2:
- **Show HN: While the world builds AI Agents, I'm just building calculators**
- **GibberLink [AI-AI Communication]**
- **It’s still worth blogging in the age of AI**
API 參考文檔
如需瞭解如何使用此整合的更多資訊,請參閱git repo或langchain 整合文件