You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
importasynciofromtypingimportAnnotatedfromtyping_extensionsimportTypedDictfromlanggraph.graph.messageimportadd_messagesfromlangchain_core.toolsimporttoolfromlanggraph.prebuiltimportToolNodefromlangchain_openaiimportChatOpenAIfromlangchain_core.runnablesimportRunnableConfigfromlanggraph.graphimportEND, START, StateGraphfromlangchain_core.messagesimportAIMessageChunk, HumanMessage, SystemMessage, AnyMessage"""This script build an agent by langgraph and stream LLM tokenspip install langchain==0.2.16pip install langgraph==0.2.34pip install langchain_openai==0.1.9"""classState(TypedDict):
messages: Annotated[list, add_messages]
@tooldefsearch(query: str):
"""Call to surf the web."""return ["Cloudy with a chance of hail."]
tools= [search]
model=ChatOpenAI(
temperature=0,
# model="glm-4",model="GLM-4-Flash",
openai_api_key="[You Key]",
# openai_api_base="https://open.bigmodel.cn/api/paas/v4/", #使用智谱官方提供的是正常流式输出openai_api_base="You url by glm_server.py ",
streaming=True
)
classAgent:
def__init__(self, model, tools, system=""):
self.system=systemworkflow=StateGraph(State)
workflow.add_node("agent", self.call_model)
workflow.add_node("tools", ToolNode(tools))
workflow.add_edge(START, "agent")
workflow.add_conditional_edges(
# First, we define the start node. We use `agent`.# This means these are the edges taken after the `agent` node is called."agent",
# Next, we pass in the function that will determine which node is called next.self.should_continue,
# Next we pass in the path map - all the nodes this edge could go to
["tools", END],
)
workflow.add_edge("tools", "agent")
self.model=model.bind_tools(tools)
self.app=workflow.compile()
defshould_continue(self, state: State):
messages=state["messages"]
last_message=messages[-1]
# If there is no function call, then we finishifnotlast_message.tool_calls:
returnEND# Otherwise if there is, we continueelse:
return"tools"asyncdefcall_model(self, state: State, config: RunnableConfig):
messages=state["messages"]
ifself.system:
messages= [SystemMessage(content=self.system)] +messagesresponse=awaitself.model.ainvoke(messages, config)
# We return a list, because this will get added to the existing listreturn {"messages": response}
asyncdefquery(self, user_input: str):
inputs= [HumanMessage(content=user_input)]
first=Trueasyncformsg, metadatainself.app.astream({"messages": inputs}, stream_mode="messages"):
ifmsg.contentandnotisinstance(msg, HumanMessage):
# 这里可以看出是否正常流式输出print(msg.content, end="|", flush=True)
ifisinstance(msg, AIMessageChunk):
iffirst:
gathered=msgfirst=Falseelse:
gathered=gathered+msgifmsg.tool_call_chunks:
print('tool_call_chunks...', gathered.tool_calls)
if__name__=='__main__':
input="what is the weather in sf"prompt=""" You are smart research assistant. Use the search engine ... """agent=Agent(model, tools, prompt)
asyncio.run(agent.query(input))
Expected behavior / 期待表现
使用tool时可以正常流式输出大模型的回答
The text was updated successfully, but these errors were encountered:
jurnea
added a commit
to jurnea/GLM-4
that referenced
this issue
Oct 30, 2024
System Info / 系統信息
pip install langchain==0.2.16
pip install langgraph==0.2.34
pip install langchain_openai==0.1.9
Who can help? / 谁可以帮助到您?
前提:
使用glm_server.py作为大模型聊天服务端
问题描述:
构建agent智能体,传递tools,非流式输出无问题,流式输出时,在确定工具后,让大模型总结时不是流式输出,会将最终结果一次性返回。
注意:使用智谱官方提供的api(https://open.bigmodel.cn/api/paas/v4/)是正常的,可以流式输出。
原因分析:
在将工具的回答传入给大模型时:
在
predict_stream
方法内只要传输了tools,这里会一直continue,直到大模型问答完整后一次性返回,没有流式输出效果。
Information / 问题信息
Reproduction / 复现过程
使用如下代码即可复现(注意智谱官方提供api是正常的)
Expected behavior / 期待表现
使用tool时可以正常流式输出大模型的回答
The text was updated successfully, but these errors were encountered: