Gradio Agents & MCP 黑客马拉松
获奖者Gradio Agents & MCP 黑客马拉松
获奖者到目前为止,我们假设你的演示是无状态的:它们不会在单个函数调用之外持久化信息。如果你想根据之前与演示的交互来修改演示的行为怎么办?Gradio 中有两种方法:全局状态和会话状态。
如果状态应该对所有函数调用和所有用户都可访问,你可以在函数调用外部创建一个变量并在函数内部访问它。例如,你可以在函数外部加载一个大型模型并在函数内部使用它,这样每个函数调用就不需要重新加载模型。
import gradio as gr
scores = []
def track_score(score):
scores.append(score)
top_scores = sorted(scores, reverse=True)[:3]
return top_scores
demo = gr.Interface(
track_score,
gr.Number(label="Score"),
gr.JSON(label="Top Scores")
)
demo.launch()
在上面的代码中,`scores` 数组在所有用户之间共享。如果有多个用户访问此演示,他们的分数都将添加到同一个列表中,并且返回的前 3 个分数将从这个共享引用中收集。
Gradio 支持的另一种数据持久化类型是会话状态,其中数据在单个页面会话内的多次提交之间保持持久。但是,数据*不会*在模型的不同用户之间共享。要将会话状态中的数据存储起来,你需要做三件事:
这是一个演示会话状态的简单应用——这个应用只是存储用户之前的提交并将其显示给用户
import gradio as gr
def store_message(message: str, history: list[str]):
output = {
"Current messages": message,
"Previous messages": history[::-1]
}
history.append(message)
return output, history
demo = gr.Interface(fn=store_message,
inputs=["textbox", gr.State(value=[])],
outputs=["json", gr.State()])
demo.launch()
请注意,状态在每个页面内的提交之间保持持久,但如果你在另一个标签页中加载此演示(或刷新页面),演示将不会共享聊天历史。在这里,我们不能将提交历史存储在全局变量中,否则提交历史将在不同用户之间混淆。
默认情况下,`State` 的初始值为 `None`。如果你向 `gr.State()` 的 `value` 参数传递一个参数,它将替代作为状态的默认值。
注意:`Interface` 类只支持单个会话状态变量(尽管它可能是一个包含多个元素的列表)。对于更复杂的用例,你可以使用 Blocks,它支持多个 `State` 变量。或者,如果你正在构建一个维护用户状态的聊天机器人,请考虑使用 `ChatInterface` 抽象,它会自动管理状态。