steamship-langchain
steamship-langchain 是连接 LangChain 框架与 Steamship 部署平台的桥梁,旨在帮助开发者轻松将语言 AI 应用从原型转化为生产级服务。它解决了开发者在模型落地时面临的诸多难题,如 API 接口搭建、系统横向扩展、状态持久化存储、身份认证授权以及多租户支持等,让用户无需重复造轮子即可拥有企业级的基础设施能力。
这款工具主要面向使用 LangChain 进行开发的 AI 工程师和软件开发者。其核心技术亮点在于提供了一套丰富的适配器,无缝集成了大模型调用缓存、日志回调处理、向量数据库存储以及多种数据加载器(支持 GitHub 仓库、YouTube 视频、Sphinx 文档等来源)。特别值得一提的是,它还内置了基于抽象语法树(AST)的 Python 代码分割器,能更智能地处理代码上下文。通过简单的 pip 安装,开发者即可利用 Steamship 的生态能力,快速构建具备自动扩缩容、完整监控日志及与其他技能(如音频转录)协同工作的全生命周期 AI 应用,极大提升了从实验到上线的效率。
使用场景
一家初创团队正在开发基于 LangChain 的智能代码助手,需要快速将本地原型转化为支持多用户、可持久化存储的生产级服务。
没有 steamship-langchain 时
- 开发者需手动搭建 API 网关和处理并发请求,部署流程繁琐且容易出错。
- 对话历史和向量索引存储在本地内存中,服务重启后数据丢失,无法实现多租户隔离。
- 缺乏统一的日志和监控体系,排查线上问题时难以追踪具体的 LLM 调用链和错误信息。
- 集成音频转录等额外功能时,需要单独寻找并对接第三方服务,增加了架构复杂度。
- 代码分割仅按字符数机械切分,导致函数上下文断裂,降低了代码问答的准确性。
使用 steamship-langchain 后
- 直接利用内置适配器一键部署生产级 API 端点,自动获得横向扩展能力,无需操心基础设施。
- 通过
SteamshipVectorStore和ChatMessageHistory实现状态持久化与多租户支持,确保数据安全隔离。 - 集成
LoggingCallbackHandler后可通过ship logs实时查看详细的运行日志和用量指标,运维透明高效。 - 无缝调用 Steamship 生态中的音频转录等技能,轻松构建多模态交互流程。
- 采用基于 AST 的
PythonCodeSplitter智能切割代码,保留父类上下文,显著提升了代码理解效果。
steamship-langchain 让开发者从繁琐的基础设施建设中解放出来,专注于核心业务逻辑,极速完成从原型到生产环境的跨越。
运行环境要求
- 未说明
未说明
未说明

快速开始
LangChain 的 Steamship Python 客户端库 (🦜️🔗)
Steamship 是构建、部署和使用全生命周期语言 AI 的最快方式。
本仓库包含用于 Steamship 的 LangChain 适配器,使 LangChain 开发者能够快速在 Steamship 上部署其应用,从而自动获得:
- 生产就绪的 API 端点
- 跨依赖项/后端的水平扩展
- 应用状态的持久化存储(包括缓存)
- 内置的身份验证与授权支持
- 多租户支持
- 与其他 Steamship 技能的无缝集成(例如音频转录)
- 使用情况指标与日志记录
- 以及更多……
有关 Steamship 和 LangChain 的更多信息,请访问我们的 网站。
安装
通过 pip 安装:
pip install steamship-langchain
适配器
目前提供以下初步支持(更多功能即将推出):
- LLM
- 提供了针对 Steamship OpenAI 集成的适配器 (
steamship_langchain.llms.OpenAI) - 提供了通过 Steamship 键值存储实现 LLM 调用缓存的适配器 (
SteamshipCache)
- 提供了针对 Steamship OpenAI 集成的适配器 (
- 回调
- 提供了一个使用 Python
logging模块记录事件的回调 (steamship_langchain.callbacks.LoggingCallbackHandler)。此回调可与ship logs配合使用,在部署时访问详细日志。
- 提供了一个使用 Python
- 文档加载器
- 提供了一个将 Steamship 文件导出为 LangChain 文档的适配器 (
steamship_langchain.document_loaders.SteamshipLoader)
- 提供了一个将 Steamship 文件导出为 LangChain 文档的适配器 (
- 工具
- 搜索:
- 提供了针对 Steamship SERPAPI 集成的适配器 (
SteamshipSERP)
- 提供了针对 Steamship SERPAPI 集成的适配器 (
- 搜索:
- 记忆
- 对话历史 (
steamship_langchain.memory.ChatMessageHistory)
- 对话历史 (
- 向量存储
- 提供了一个持久化向量存储的适配器 (
steamship_langchain.vectorstores.SteamshipVectorStore)
- 提供了一个持久化向量存储的适配器 (
- 文本分割器
- 提供了一个基于 AST 的 Python 代码分割器 (
steamship_langchain.python_splitter.PythonCodeSplitter)。该分割器在以函数定义为边界拆分代码的同时,还能为代码片段提供额外上下文信息(父类)。
- 提供了一个基于 AST 的 Python 代码分割器 (
- 其他实用工具
- 将数据导入 Steamship
- 为了充分利用 Steamship 的持久化存储能力,我们提供了一系列初始加载工具,适用于多种数据源,包括:
- 文本文件:
steamship_langchain.file_loaders.TextFileLoader - 目录:
steamship_langchain.file_loaders.DirectoryLoader - GitHub 仓库:
steamship_langchain.file_loaders.GitHubRepositoryLoader - Sphinx 文档站点:
steamship_langchain.file_loaders.SphinxSiteLoader(以及其他) - YouTube 视频:
steamship_langchain.file_loaders.YouTubeFileLoader - 各种文本和图像格式:
steamship_langchain.file_loaders.UnstructuredFileLoader
- 文本文件:
- 为了充分利用 Steamship 的持久化存储能力,我们提供了一系列初始加载工具,适用于多种数据源,包括:
- 将数据导入 Steamship
📖 文档
请参阅我们的 文档,了解关于以下内容的完整说明:
- 入门指南(安装、环境设置、简单示例)
- 操作示例(演示、集成、辅助函数)
示例用法
以下是几个在 Steamship 上使用 LangChain 的示例:
这些示例使用临时工作空间,以便在实验过程中进行完全清理。
工作空间 在 Steamship 中提供了租户隔离单元。
对于生产用途,可以通过 Steamship(workspace_handle="my_workspace") 创建并获取持久化工作空间。
注意 这些示例省略了
import语句。完整的源代码请参考examples/目录。
注意 客户端示例假定用户已拥有 Steamship API 密钥,并且该密钥已暴露于环境变量中(详见:API 密钥)。
基础提示
使用 Steamship LLM 集成的基本提示示例(完整源码:examples/greeting)
服务器片段
from steamship_langchain.llms import OpenAI
@post("greet")
def greet(self, user: str) -> str:
prompt = PromptTemplate(
input_variables=["user"],
template=
"为用户 {user} 创作一条欢迎消息。感谢他们使用 LangChain 在 Steamship 上运行应用。鼓励他们在准备就绪时通过 `ship it` 部署应用。",
)
llm = OpenAI(client=self.client, temperature=0.8)
return llm(prompt.format(user=user))
客户端片段
with Steamship.temporary_workspace() as client:
api = client.use("my-langchain-app")
while True:
name = input("姓名:")
print(f'{api.invoke("/greet", user=name).strip()}\n')
自我提问与搜索
使用 Steamship GPT 和 SERP Tool 插件执行 LangChain 的 self-ask-with-search 代理(完整源码:examples/self-ask-with-search)
服务器片段
from steamship_langchain.llms import OpenAI
@post("/self_ask_with_search")
def self_ask_with_search(self, query: str) -> str:
llm = OpenAI(client=self.client, temperature=0.0, cache=True)
serp_tool = SteamshipSERP(client=self.client, cache=True)
tools = [Tool(name="Intermediate Answer", func=serp_tool.search)]
self_ask_with_search = initialize_agent(tools, llm, agent="self-ask-with-search", verbose=False)
return self_ask_with_search.run(query)
客户端片段
with Steamship.temporary_workspace() as client:
api = client.use("my-langchain-app")
query = "双城队上一次赢得世界大赛时,谁是总统?"
print(f"查询:{query}")
print(f"答案:{api.invoke('/self_ask_with_search', query=query)}")
聊天机器人
在 Steamship 中使用 LangChain 实现一个基础的聊天机器人(类似于 ChatGPT)(完整源码:examples/chatbot)。
注意 整个聊天机器人的对话记录将在 Steamship 工作空间的生命周期内持续保存。
服务器片段
from langchain.memory import ConversationBufferWindowMemory
from steamship_langchain.llms import OpenAIChat
from steamship_langchain.memory import ChatMessageHistory
@post("/send_message")
def send_message(self, message: str, chat_history_handle: str) -> str:
chat_memory = ChatMessageHistory(client=self.client, key=chat_history_handle)
mem = ConversationBufferWindowMemory(chat_memory=chat_memory, k=2)
chatgpt = LLMChain(
llm=OpenAIChat(client=self.client, temperature=0),
prompt=CHATBOT_PROMPT,
memory=mem,
)
return chatgpt.predict(human_input=message)
客户端片段
with Steamship.temporary_workspace() as client:
api = client.use("my-langchain-app")
session_handle = "foo-user-session-1234"
while True:
msg = input("你:")
print(f"AI:{api.invoke('/send_message', message=msg,chat_history_handle=session_handle)}")
异步链式处理音频摘要
Steamship 目前尚未将音频转录支持视为完全成熟的生产环境。我们正在努力实现大规模音频转录的支持,但在尝试此功能时,您可能会遇到一些现有问题。
本示例展示了如何使用 LangChain 处理通过 Steamship 的语音转文本插件获取的音频转录内容(完整源码:examples/summarize-audio)。
该示例简要介绍了任务系统(以及用于链式调用的任务依赖关系)。这里我们使用了 task.wait() 风格的轮询方式,但也可以使用基于时间的 task.refresh() 等其他轮询方式。
服务器片段
from steamship_langchain.llms import OpenAI
@post("summarize_file")
def summarize_file(self, file_handle: str) -> str:
file = File.get(self.client, handle=file_handle)
text_splitter = CharacterTextSplitter()
texts = []
for block in file.blocks:
texts.extend(text_splitter.split_text(block.text))
docs = [Document(page_content=t) for t in texts]
llm = OpenAI(client=self.client, cache=True)
chain = load_summarize_chain(llm, chain_type="map_reduce")
return chain.run(docs)
@post("summarize_audio_file")
def summarize_audio_file(self, audio_file_handle: str) -> Task[str]:
transcriber = self.client.use_plugin("whisper-s2t-blockifier")
audio_file = File.get(self.client, handle=audio_file_handle)
transcribe_task = audio_file.blockify(plugin_instance=transcriber.handle)
return self.invoke_later("summarize_file", wait_on_tasks=[transcribe_task], arguments={"file_handle": audio_file.handle})
客户端片段
churchill_yt_url = "https://www.youtube.com/watch?v=MkTw3_PmKtc"
with Steamship.temporary_workspace() as client:
api = client.use("my-langchain-app")
yt_importer = client.use_plugin("youtube-file-importer")
import_task = File.create_with_plugin(client=client,
plugin_instance=yt_importer.handle,
url=churchill_yt_url)
import_task.wait()
audio_file = import_task.output
summarize_task_response = api.invoke("/summarize_audio_file", audio_file_handle=audio_file.handle)
summarize_task = Task(client=client, **summarize_task_response)
summarize_task.wait()
if summarize_task.state == TaskState.succeeded:
summary = base64.b64decode(summarize_task.output).decode("utf-8")
print(f"摘要:{summary.strip()}")
带来源的答案问答(嵌入)
提供了一个使用 Steamship 管理嵌入并为 LangChain 代理提供支持的基本示例,用于实现带来源的答案问答功能(完整源码:examples/qa_with_sources)
注意 嵌入将在工作区的生命周期内持续保存。
服务器代码片段
from steamship_langchain.llms import OpenAI
def __init__(self, **kwargs):
super().__init__(**kwargs)
langchain.llm_cache = SteamshipCache(self.client)
self.llm = OpenAI(client=self.client, temperature=0, cache=True, max_words=250)
# 创建一个持久化的嵌入存储
self.index = SteamshipVectorStore(
client=self.client, index_name="qa-demo", embedding="text-embedding-ada-002"
)
@post("index_file")
def index_file(self, file_handle: str) -> bool:
text_splitter = CharacterTextSplitter(chunk_size=250, chunk_overlap=0)
file = File.get(self.client, handle=file_handle)
texts = [text for block in file.blocks for text in text_splitter.split_text(block.text)]
metadatas = [{"source": f"{file.handle}-offset-{i * 250}"} for i, text in enumerate(texts)]
self.index.add_texts(texts=texts, metadatas=metadatas)
return True
@post("search_embeddings")
def search_embeddings(self, query: str, k: int) -> List[SearchResult]:
"""返回嵌入索引中最接近的 `k` 个条目。"""
search_results = self.index.search(query, k=k)
search_results.wait()
items = search_results.output.items
return items
@post("/qa_with_sources")
def qa_with_sources(self, query: str) -> Dict[str, Any]:
chain = VectorDBQAWithSourcesChain.from_chain_type(
OpenAI(client=self.client, temperature=0),
chain_type="map_reduce",
vectorstore=self.index,
)
return chain({"question": query}, return_only_outputs=False)
客户端代码片段
with Steamship.temporary_workspace() as client:
api = client.use("my-langchain-app")
# 上传国情咨文演讲稿
with open("state_of_the_union.txt") as f:
sotu_file = File.create(client, blocks=[Block(text=f.read())])
# 进行嵌入
api.invoke("/index_file", file_handle=sotu_file.handle)
# 发出查询
query = "总统对布雷耶大法官说了什么?"
response = api.invoke("/qa_with_sources", query=query)
print(f"答案:{response['result'].strip()}")
API 密钥
Steamship API 密钥可让您访问我们的 SDK,用于 AI 模型,包括 OpenAI、GPT、Cohere、Whisper 等。
在此处获取您的免费 API 密钥:https://steamship.com/account/api。
获得 API 密钥后,您可以:
- 设置客户端的环境变量
STEAMSHIP_API_KEY - 直接通过
Steamship(api_key=)或Steamship.tempory_workspace(api_key=)传递密钥。
或者,您也可以运行 ship login,它将指导您完成环境设置。
在 Steamship 上部署
在 Steamship 上部署 LangChain 应用非常简单:只需执行 ship it 命令即可。
从您的包目录(即 api.py 所在的目录)中,您可以运行 ship it 命令来生成清单文件,并将您的包推送到 Steamship。随后,您可以使用 Steamship SDK 根据需要在工作区中创建您的包实例。
有关部署和工作区的更多信息,请参阅我们的文档。
反馈与支持
您对本包或对 Steamship 整体有任何反馈吗?
我们非常期待您的意见。请联系我们:hello@steamship.com。
版本历史
0.0.262023/09/120.0.232023/06/050.0.222023/05/310.0.212023/05/120.0.202023/05/080.0.192023/04/280.0.182023/04/170.0.172023/04/140.0.162023/04/120.0.152023/03/200.0.142023/03/090.0.132023/02/270.0.122023/02/240.0.12-rc.02023/02/240.0.112023/02/230.0.102023/02/140.0.92023/02/08常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
