Skip to main content
Open In ColabOpen on GitHub

Agentql

AgentQL 工具提供了使用 AgentQL 查询 或自然语言提示从任意网页进行网络交互和结构化数据提取的功能。无论网页的语言或内容如何变化,AgentQL 都可以在多个页面上跨语言使用而不会失效。

概览

AgentQL 提供了以下三种工具:

  • ExtractWebDataTool 根据给定的 URL 从网页中提取结构化数据为 JSON 格式,可以使用 AgentQL 查询 或自然语言对数据的描述。

The following two tools are also bundled as AgentQLBrowserToolkit and must be used with a Playwright browser or a remote browser instance via Chrome DevTools Protocal (CDP):

  • ExtractWebDataBrowserTool 在浏览器中从活动网页提取结构化数据作为JSON格式,可以使用AgentQL查询或自然语言描述。

  • GetWebElementBrowserTool 使用自然语言描述在浏览器中找到活动页面上的网页元素,并返回其CSS选择器以进行进一步交互。

集成细节

Class序列化JS支持Package 最新版本
AgentQLlangchain-agentql1.0.0

Tool features

工具Web 数据提取网页元素提取在本地浏览器中使用
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()

Credentials

要使用AgentQL工具,您需要从AgentQL开发门户获取自己的API密钥,并设置AgentQL环境变量。

import os

os.environ["AGENTQL_API_KEY"] = "YOUR_AGENTQL_API_KEY"

Instantiation

ExtractWebDataTool

您可以使用以下参数实例化ExtractWebDataTool:

  • api_key: 您的 AgentQL API密钥,来自dev.agentql.comOptional
  • 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)

Invocation

ExtractWebDataTool

此工具幕后使用了AgentQL的REST API,将公开可用的网页URL发送到AgentQL的端点。这不适用于私有页面或登录会话。对于这些用例,请使用ExtractWebDataBrowserTool

  • url: 您想要提取数据的网页的URL。
  • query: 需要执行的AgentQL查询。如果您希望提取精确结构化的数据,请使用AgentQL查询。如需了解如何编写AgentQL查询,请参阅文档或在AgentQL Playground中尝试一下。
  • prompt: 从页面中提取的数据的自然语言描述。AgentQL 将根据您的提示推断数据的结构。如果您希望提取由自由文本语言定义而无需定义特定结构的数据,请使用 prompt

注意: 您必须定义一个queryprompt以使用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

注意: 您必须定义一个queryprompt以使用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"})
API 参考:NavigateTool
'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: 🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨
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}
)
API 参考:ClickTool
"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工具串联在一起使用,首先将其绑定到一个工具调用模型,然后进行调用:

实例化大语言模型

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")
API 参考:init_chat_model

执行工具链

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')]}

使用于代理

您可以用AgentQLBrowserToolkit与AI代理一起使用AgentQL工具。此工具包包括ExtractDataBrowserToolGetWebElementBrowserTool。以下是一个结合了AgentQL工具包和Playwright工具的代理浏览器操作示例。

Instantiate Toolkit

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()
================================ Human Message =================================


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.

================================== Ai Message ==================================
Tool Calls:
navigate_browser (call_3eY5a0BRwyYj7kaNpAxkquTD)
Call ID: call_3eY5a0BRwyYj7kaNpAxkquTD
Args:
url: https://news.ycombinator.com/
================================= Tool Message =================================
Name: navigate_browser

Navigating to https://news.ycombinator.com/ returned status code 200
================================== Ai Message ==================================
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: 🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨
warnings.warn(
``````output
================================= Tool Message =================================
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?"}]}
================================== Ai Message ==================================
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: 🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨
warnings.warn(
``````output
================================= Tool Message =================================
Name: extract_web_data_from_browser

{"current_page_url": "https://news.ycombinator.com/news"}
================================== Ai Message ==================================
Tool Calls:
click_element (call_NLGIW1lLutkZ6k0vqkfGbOD7)
Call ID: call_NLGIW1lLutkZ6k0vqkfGbOD7
Args:
selector: [tf623_id='944']
================================= Tool Message =================================
Name: click_element

Clicked element '[tf623_id='944']'
================================== Ai Message ==================================
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: 🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨
warnings.warn(
``````output
================================= Tool Message =================================
Name: extract_web_data_from_browser

{"current_page_url": "https://news.ycombinator.com/news?p=2"}
================================== Ai Message ==================================
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: 🚨 The function get_data_by_prompt_experimental is experimental and may not work as expected 🚨
warnings.warn(
``````output
================================= Tool Message =================================
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"}]}
================================== Ai Message ==================================

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 仓库langchain 集成文档