LangGraph - API多種訪問方式

本文介紹了Langgraph服務的四種調用方式:

1. 通過LangGraph Studio UI界面手動測試;

2. 使用Python SDK進行同步/異步調用;

3. 通過REST API測試;

4. 使用JavaScript SDK接入。

Langgraph 服務端代碼?graph.py

from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agentllm = ChatOpenAI(model='qwq-32b',temperature=0.8,api_key='sk-****',streaming=True,base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",# extra_body={'chat_template_kwargs': {'enable_thinking': False}},
)
#
def get_weather(city: str) -> str:"""Get weather for a given city."""return f"在 {city},今天天氣不錯!"graph = create_react_agent(llm,tools=[get_weather],prompt="你是一個智能助手"
)

通過命令langgraph dev 啟動服務,可以看到控制臺返回的API地址

1.第一種訪問方式:LangGraph Studio

當啟動服務后,瀏覽器中會自動打開 Studio UI的地址,頁面如下

可手動輸入message,完成調用

2.第二種訪問方式:PythonSDK測試

先安裝依賴:pip install langgraph-sdk

1)異步測試

langgraph_async_test.py文件內容:

from langgraph_sdk import get_client
import asyncioclient = get_client(url="http://localhost:2024")async def main():async for chunk in client.runs.stream(None,  # Threadless run"agent", # Name of assistant. Defined in langgraph.json.input={"messages": [{"role": "human","content": "上海今天的天氣",}],},stream_mode="messages-tuple",):# print(f"Receiving new event of type: {chunk.event}...")# print(chunk.data)if isinstance(chunk.data,list) and 'type' in chunk.data[0] and chunk.data[0]['type'] == 'AIMessageChunk':print(chunk.data[0]['content'], end='', flush=True)asyncio.run(main())

運行結果:

2)同步測試

langgraph_sync_test.py文件內容:

from langgraph_sdk import  get_sync_clientclient = get_sync_client(url="http://localhost:2024")for chunk in client.runs.stream(None,  # Threadless run"agent", # Name of assistant. Defined in langgraph.json.input={"messages": [{"role": "human","content": "上海今天的天氣",}],},stream_mode="messages-tuple",):# print(f"Receiving new event of type: {chunk.event}...")# print(chunk.data)if isinstance(chunk.data,list) and 'type' in chunk.data[0] and chunk.data[0]['type'] == 'AIMessageChunk':print(chunk.data[0]['content'], end='', flush=True)

運行結果:

后面2種方式,可自動測試,參考如下

3.第三種訪問方式:REST API測試

curl -s --request POST \--url "http://localhost:2024/runs/stream" \--header 'Content-Type: application/json' \--data "{\"assistant_id\": \"agent\",\"input\": {\"messages\": [{\"role\": \"human\",\"content\": \"上海的天氣?\"}]},\"stream_mode\": \"messages-tuple\"}"

4.第四種訪問方式:JavaScript SDK測試

安裝 LangGraph JS SDK:npm install @langchain/langgraph-sdk

向LangGraph服務區發送消息:

const { Client } = await import("@langchain/langgraph-sdk");// only set the apiUrl if you changed the default port when calling langgraph dev
const client = new Client({ apiUrl: "http://localhost:2024"});const streamResponse = client.runs.stream(null, // Threadless run"agent", // Assistant ID{input: {"messages": [{ "role": "user", "content": "上海的天氣?"}]},streamMode: "messages-tuple",}
);for await (const chunk of streamResponse) {console.log(`Receiving new event of type: ${chunk.event}...`);console.log(JSON.stringify(chunk.data));console.log("\n\n");
}

graph.py中的get_weather方法可替找成工具

TAVILY_API_KEY='tvly-dev-***'def get_weather(city: str) -> str:"""Get real-time weather for a given city using Tavily search."""from langchain_community.tools import TavilySearchResultsimport re# 創建 Tavily 搜索工具實例search_tool = TavilySearchResults(max_results=1,search_depth="advanced",include_answer=True,api_key=TAVILY_API_KEY)# 構造搜索查詢query = f"{city} 當前天氣 溫度 濕度 風力 風向 天氣狀況"try:# 執行搜索results = search_tool.invoke({"query": query})# 解析結果if isinstance(results, list) and len(results) > 0:result = results[0]content = result.get('content', '暫無詳細信息')# 修復編碼問題的函數def fix_encoding(text):if not isinstance(text, str):return text# 嘗試多種編碼修復方法encodings_to_try = [('latin1', 'utf-8'),('cp1252', 'utf-8'),]for from_enc, to_enc in encodings_to_try:try:# 將字符串以from_enc編碼方式重新編碼,再以to_enc解碼return text.encode(from_enc).decode(to_enc)except (UnicodeEncodeError, UnicodeDecodeError):continue# 如果上面的方法都不行,嘗試直接使用raw_unicode_escapetry:return text.encode('raw_unicode_escape').decode('utf-8')except (UnicodeEncodeError, UnicodeDecodeError):pass# 如果所有方法都失敗,返回原始內容return text# 修復編碼fixed_content = fix_encoding(content)print(f"處理后內容: {fixed_content}")# 從修復后的內容中提取天氣信息def extract_weather_info(text):info = {}# 提取天氣狀況(如晴、多云、陰等)weather_conditions = ['晴', '多云', '陰', '雨', '雪', '霧', '霾', '雷陣雨', '小雨', '中雨', '大雨', '暴雨']for condition in weather_conditions:if condition in text:info['condition'] = conditionbreak# 如果沒找到中文天氣狀況,嘗試用正則表達式if 'condition' not in info:condition_match = re.search(r'天氣[:\s]*([^\s,,。\.]+)', text)if condition_match:info['condition'] = condition_match.group(1)# 提取溫度 (尋找數字+度/℃)temp_match = re.search(r'(\d+\.?\d*)[度℃]', text)if temp_match:info['temperature'] = temp_match.group(1) + "℃"# 提取濕度humidity_match = re.search(r'濕度[:\s]*([0-9]+\.?[0-9]*)[%%]', text)if humidity_match:info['humidity'] = humidity_match.group(1) + "%"# 提取風向wind_dir_match = re.search(r'風向[:\s]*([東南西北風]+)', text)if wind_dir_match:info['wind_direction'] = wind_dir_match.group(1)# 提取風力wind_speed_match = re.search(r'風力[:\s]*([0-9]+\.?[0-9]*[級m/s])', text)if wind_speed_match:info['wind_speed'] = wind_speed_match.group(1)return info# 提取天氣信息weather_info = extract_weather_info(fixed_content)# 構建最終輸出格式if weather_info:output_parts = [f"{city} 天氣"]if 'condition' in weather_info:output_parts.append(f"{weather_info['condition']}")output_parts.append("實時天氣情況")if 'temperature' in weather_info:output_parts.append(f"溫度{weather_info['temperature']}")if 'humidity' in weather_info:output_parts.append(f"濕度{weather_info['humidity']}")if 'wind_direction' in weather_info:output_parts.append(f"風向{weather_info['wind_direction']}")if 'wind_speed' in weather_info:output_parts.append(f"風力{weather_info['wind_speed']}")return " ".join(output_parts)else:# 如果無法提取結構化信息,則返回修復后的內容return f"{city}天氣信息: {fixed_content}"else:return f"無法獲取{city}的天氣信息"except Exception as e:# 異常處理return f"查詢{city}天氣時出現錯誤: {str(e)}"

替換后再次測試,結果如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94719.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94719.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94719.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HEI-612 HART/EtherNet/IPModbus TCP 網關:打通工業通信壁壘

在工業自動化領域,HART 協議設備的廣泛應用與以太網網絡的高效管理常面臨 “協議孤島” 難題 —— 老舊 HART 傳感器、變送器難以接入 EtherNet/IP 或 Modbus TCP 系統,數據雙向交互卡頓、調試復雜、兼容性差等問題,嚴重制約生產效率提升。上…

OSPF 的工作過程、Router ID 機制、報文結構

視頻版講解>>>>>>>>>>>>>>路由協議深度解析:從靜態路由到 OSPF 實戰 一、回顧靜態路由:拓撲與核心邏輯 我們先回到上周講解的拓撲圖,這張圖是理解靜態路由的核心載體 —— 路由器作為網段分割的…

Qt 6 與 Qt 5 存在的兼容性差異

之前有提到。我的是Qt5,我朋友的是Qt 6,由于版本不兼容問題,在遷移時會有問題。所以這一我們說說這兩個的區別。( 正文開始嘍! 總結來說:Qt5遷移至 Qt 6 需:1. 破壞性變更(必須修改…

本地windows電腦部署html網頁到互聯網:html+node.js+ngrok/natapp

目錄 核心概念:為什么不能直接分享HTML文件? 1,html文件修改 2,安裝設置node.js 3,路由器虛擬服務器 4,采用ngrok工具進行內網穿透(國外工具) 5,采用natapp工具進行…

electron離線開發核心環境變量npm_config_cache

npm_config_cache 這個環境變量。它在離線環境配置中扮演著核心角色。什么是 npm_config_cache?npm_config_cache 是一個環境變量,用于直接設置 npm 的緩存目錄的絕對路徑。npm 在安裝包時,會遵循一個特定的工作流程:檢查緩存&…

CTFshow系列——命令執行web57-60

本篇文章介紹命令執行的另一種情況,CTFshow的Web57-60關的講解解析;要想了解其它關卡可查看我以往的文章,感謝關注。 文章目錄Web57(新方法)Web58(POST型)不可用函數可用函數Web59第二種方法&am…

域名、ip、DSN、URL

目錄 1、ip 2、域名 3、DSN 4、URL 1、ip 每個連接到Internet上的主機都會分配一個IP地址,此ip是該計算機在互聯網上的邏輯地址的唯一標識,計算機之間的訪問就是通過IP地址來進行的。寫法:十進制的形式,用“.”分開&#xff0…

【JAVA實現websocket】

JAVA實現websocket背景依賴問題代碼實現測試背景 近期項目中需要用到websocket&#xff0c;實現即時通信。 依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></depen…

2.6 提示詞調優編碼實戰(一)

目錄 寫在前面 一,需求定義 二,簡單提示詞 2.1 代碼示例 2.2 輸出結果 三,提示詞模版 3.1 提示詞 3.1.1 任務描述 3.1.2 用戶輸入 3.1.3 模型輸出格式 3.1.4 Prompt模版 3.2 輸出結果 寫在前面 前面我們總結了提示詞對于模型的意義,接下來我們來通過向模型輸入…

使用Stone 3D快速制作第一人稱視角在線小游戲

首先得有個怪物模型&#xff0c;怪物帶有idle, attack動作 然后有個場景模型&#xff0c;把怪物&#xff08;如果模型較大&#xff0c;建議使用remote-mesh來加載&#xff09;擺放到想放的位置。 給相機加上fps-controls和character組件 給所有怪物加上character組件 可以在…

嵌入式第三十七課!!!TCP機制與HTTP協議

TCP的其他機制TCP頭部標志位SYN&#xff1a;請求建立連接標志位 ACK&#xff1a;響應報文標志位 PSH&#xff1a;攜帶數據標志位&#xff0c;通知接收方該從緩沖區讀數據 FIN&#xff1a; 請求斷開連接標志位 RST&#xff1a;復位標志位 URG: 緊急數據標志…

【測試】pytest測試環境搭建

使用pytest進行API測試&#xff0c;vscode運行 創建虛擬環境&#xff0c;安裝pytest&#xff0c;httpx&#xff0c;requests&#xff0c;dotenvvscode中ctrlshiftp&#xff0c;選擇python: Configure Tests&#xff0c;選擇pytest&#xff0c;目錄左側插件testing里面可以看到有…

javaweb開發筆記——微頭條項目開發

第八章 微頭條項目開發 一 項目簡介 1.1 微頭條業務簡介 微頭條新聞發布和瀏覽平臺,主要包含業務如下 用戶功能 注冊功能 登錄功能 頭條新聞 新聞的分頁瀏覽 通過標題關鍵字搜索新聞 查看新聞詳情 新聞的修改和刪除 權限控制 用戶只能修改和自己發布的頭條新聞 1.…

Linux(二十二)——服務器初始化指南

文章目錄前言一、配置國內 Yum 源&#xff08;加速軟件安裝&#xff09;二、更新系統與安裝必備工具三、網絡連接驗證四、配置主機名五、同步時間六、配置防火墻6.1 使用 iptables6.1.1 整體思路6.1.2 詳細步驟6.1.3 完整配置腳本示例6.1.4 常用管理命令6.2 使用 firewalld總結…

我用Photoshop Firefly+Blender,拯救被環境毀掉的人像大片

今日陽光正好。這樣的天氣對于攝影師來說是種饋贈&#xff0c;但也讓我想起了這個行業最普遍也最無奈的痛點&#xff1a;我們精心策劃了一場拍攝&#xff0c;模特的表現、光線的質感都近乎完美&#xff0c;但最終卻因為一個平淡的陰天、一處雜亂的背景&#xff0c;或是一個無法…

【線性代數】常見矩陣類型

目錄 1. 方陣(Square Matrix) 2. 對稱矩陣(Symmetric Matrix) 3. 反對稱矩陣 / 斜對稱矩陣(Skew-Symmetric Matrix) 4. 對角矩陣(Diagonal Matrix) 5. 三角矩陣 6. 正交矩陣(Orthogonal Matrix) 7. 冪等矩陣(Idempotent Matrix) 8. 正定矩陣 / 半正定矩陣 …

達夢數據庫統計信息收集

達夢數據庫統計信息收集 檢查統計信息收集情況 如何手動收集統計信息 查看統計信息收集結果 統計信息手動收集策略 統計信息的自動收集 檢查統計信息收集情況 檢查最近一次統計信息收集時間: --表的最近一次統計信息收集時間 SQL> select owner,table_name,last_analyzed…

【目標檢測】論文閱讀4

Fast and accurate object detector for autonomous driving based on improved YOLOv5 發表時間&#xff1a;2023年&#xff1b;期刊&#xff1a;scientific reports 論文地址 摘要 自動駕駛是人工智能的一個重要分支&#xff0c;實時準確的目標檢測是保證自動駕駛車輛安全穩…

wpf之DockPanel

前言 DockPanel是一個容器控件&#xff0c;容器中的子控件通過設置DockPanel.Dock屬性來調整位置 1、DockPanel.Dock DockPanel.Dock的值有Left、Right、Top、Bottom 1.1 Left 指示控件靠左停靠 1.2 Right 指示控件靠右停靠 1.3 Top 指示控件靠上停靠 1.4 Bottom 指示…

解決VSCode中Cline插件的Git鎖文件沖突問題

文章目錄 問題現象 錯誤分析 解決方案 方法一:手動刪除鎖文件(推薦) 方法二:檢查并終止Git進程 方法三:重置檢查點目錄 方法四:完全重新初始化 預防措施 總結 在使用VSCode進行開發時,許多開發者會選擇安裝Cline插件來提升工作效率。然而,在使用過程中,可能會遇到一些…