mirror of
https://github.com/RYDE-WORK/Langchain-Chatchat.git
synced 2026-01-22 23:11:05 +08:00
## 🛠 新增功能 - 支持百川在线模型 (@hzg0601 @liunux4odoo in #1623) - 支持 Azure OpenAI 与 claude 等 Langchain 自带模型 (@zRzRzRzRzRzRzR in #1808) - Agent 功能大量更新,支持更多的工具、更换提示词、检索知识库 (@zRzRzRzRzRzRzR in #1626 #1666 #1785) - 加长 32k 模型的历史记录 (@zRzRzRzRzRzRzR in #1629 #1630) - *_chat 接口支持 max_tokens 参数 (@liunux4odoo in #1744) - 实现 API 和 WebUI 的前后端分离 (@liunux4odoo in #1772) - 支持 zlilliz 向量库 (@zRzRzRzRzRzRzR in #1785) - 支持 metaphor 搜索引擎 (@liunux4odoo in #1792) - 支持 p-tuning 模型 (@hzg0601 in #1810) - 更新完善文档和 Wiki (@imClumsyPanda @zRzRzRzRzRzRzR @glide-the in #1680 #1811) ## 🐞 问题修复 - 修复 bge-* 模型匹配超过 1 的问题 (@zRzRzRzRzRzRzR in #1652) - 修复系统代理为空的问题 (@glide-the in #1654) - 修复重建知识库时 `d == self.d assert error` (@liunux4odoo in #1766) - 修复对话历史消息错误 (@liunux4odoo in #1801) - 修复 OpenAI 无法调用的 bug (@zRzRzRzRzRzRzR in #1808) - 修复 windows下 BIND_HOST=0.0.0.0 时对话出错的问题 (@hzg0601 in #1810)
119 lines
4.6 KiB
Python
119 lines
4.6 KiB
Python
from fastapi import Body
|
||
from configs import logger, log_verbose, LLM_MODEL, HTTPX_DEFAULT_TIMEOUT,LANGCHAIN_LLM_MODEL
|
||
from server.utils import (BaseResponse, fschat_controller_address, list_config_llm_models,
|
||
get_httpx_client, get_model_worker_config)
|
||
|
||
|
||
def list_running_models(
|
||
controller_address: str = Body(None, description="Fastchat controller服务器地址", examples=[fschat_controller_address()]),
|
||
placeholder: str = Body(None, description="该参数未使用,占位用"),
|
||
) -> BaseResponse:
|
||
'''
|
||
从fastchat controller获取已加载模型列表及其配置项
|
||
'''
|
||
try:
|
||
controller_address = controller_address or fschat_controller_address()
|
||
with get_httpx_client() as client:
|
||
r = client.post(controller_address + "/list_models")
|
||
models = r.json()["models"]
|
||
data = {m: get_model_config(m).data for m in models}
|
||
return BaseResponse(data=data)
|
||
except Exception as e:
|
||
logger.error(f'{e.__class__.__name__}: {e}',
|
||
exc_info=e if log_verbose else None)
|
||
return BaseResponse(
|
||
code=500,
|
||
data={},
|
||
msg=f"failed to get available models from controller: {controller_address}。错误信息是: {e}")
|
||
|
||
|
||
def list_config_models() -> BaseResponse:
|
||
'''
|
||
从本地获取configs中配置的模型列表
|
||
'''
|
||
configs = list_config_llm_models()
|
||
# 删除ONLINE_MODEL配置中的敏感信息
|
||
for config in configs["online"].values():
|
||
del_keys = set(["worker_class"])
|
||
for k in config:
|
||
if "key" in k.lower() or "secret" in k.lower():
|
||
del_keys.add(k)
|
||
for k in del_keys:
|
||
config.pop(k, None)
|
||
|
||
return BaseResponse(data=configs)
|
||
|
||
|
||
def get_model_config(
|
||
model_name: str = Body(description="配置中LLM模型的名称"),
|
||
placeholder: str = Body(description="占位用,无实际效果")
|
||
) -> BaseResponse:
|
||
'''
|
||
获取LLM模型配置项(合并后的)
|
||
'''
|
||
config = get_model_worker_config(model_name=model_name)
|
||
# 删除ONLINE_MODEL配置中的敏感信息
|
||
del_keys = set(["worker_class"])
|
||
for k in config:
|
||
if "key" in k.lower() or "secret" in k.lower():
|
||
del_keys.add(k)
|
||
for k in del_keys:
|
||
config.pop(k, None)
|
||
|
||
return BaseResponse(data=config)
|
||
|
||
|
||
def stop_llm_model(
|
||
model_name: str = Body(..., description="要停止的LLM模型名称", examples=[LLM_MODEL]),
|
||
controller_address: str = Body(None, description="Fastchat controller服务器地址", examples=[fschat_controller_address()])
|
||
) -> BaseResponse:
|
||
'''
|
||
向fastchat controller请求停止某个LLM模型。
|
||
注意:由于Fastchat的实现方式,实际上是把LLM模型所在的model_worker停掉。
|
||
'''
|
||
try:
|
||
controller_address = controller_address or fschat_controller_address()
|
||
with get_httpx_client() as client:
|
||
r = client.post(
|
||
controller_address + "/release_worker",
|
||
json={"model_name": model_name},
|
||
)
|
||
return r.json()
|
||
except Exception as e:
|
||
logger.error(f'{e.__class__.__name__}: {e}',
|
||
exc_info=e if log_verbose else None)
|
||
return BaseResponse(
|
||
code=500,
|
||
msg=f"failed to stop LLM model {model_name} from controller: {controller_address}。错误信息是: {e}")
|
||
|
||
|
||
def change_llm_model(
|
||
model_name: str = Body(..., description="当前运行模型", examples=[LLM_MODEL]),
|
||
new_model_name: str = Body(..., description="要切换的新模型", examples=[LLM_MODEL]),
|
||
controller_address: str = Body(None, description="Fastchat controller服务器地址", examples=[fschat_controller_address()])
|
||
):
|
||
'''
|
||
向fastchat controller请求切换LLM模型。
|
||
'''
|
||
try:
|
||
controller_address = controller_address or fschat_controller_address()
|
||
with get_httpx_client() as client:
|
||
r = client.post(
|
||
controller_address + "/release_worker",
|
||
json={"model_name": model_name, "new_model_name": new_model_name},
|
||
timeout=HTTPX_DEFAULT_TIMEOUT, # wait for new worker_model
|
||
)
|
||
return r.json()
|
||
except Exception as e:
|
||
logger.error(f'{e.__class__.__name__}: {e}',
|
||
exc_info=e if log_verbose else None)
|
||
return BaseResponse(
|
||
code=500,
|
||
msg=f"failed to switch LLM model from controller: {controller_address}。错误信息是: {e}")
|
||
|
||
|
||
def list_search_engines() -> BaseResponse:
|
||
from server.chat.search_engine_chat import SEARCH_ENGINES
|
||
|
||
return BaseResponse(data=list(SEARCH_ENGINES))
|