chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
from typing import Optional, List, Literal, Union
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
from open_chatcaht._constants import MAX_TOKENS, LLM_MODEL, TEMPERATURE, SCORE_THRESHOLD, VECTOR_SEARCH_TOP_K
|
||||
from open_chatcaht.api_client import ApiClient
|
||||
from open_chatcaht.types.chat.chat_feedback_param import ChatFeedbackParam
|
||||
from open_chatcaht.types.chat.chat_message import ChatMessage
|
||||
from open_chatcaht.types.chat.file_chat_param import FileChatParam
|
||||
from open_chatcaht.types.chat.kb_chat_param import KbChatParam
|
||||
|
||||
API_URI_CHAT_FEEDBACK = "/chat/feedback"
|
||||
API_URI_FILE_CHAT = "/chat/file_chat"
|
||||
API_URI_KB_CHAT = "/chat/kb_chat"
|
||||
|
||||
|
||||
class ChatClient(ApiClient):
|
||||
|
||||
def chat_feedback(self,
|
||||
message_id: str,
|
||||
score: int = 100,
|
||||
reason: str = ""):
|
||||
data = ChatFeedbackParam(
|
||||
message_id=message_id,
|
||||
score=score,
|
||||
reason=reason,
|
||||
).dict()
|
||||
resp = self._post(API_URI_CHAT_FEEDBACK, json=data)
|
||||
return self._get_response_value(resp, as_json=True)
|
||||
|
||||
def kb_chat(self,
|
||||
query: str,
|
||||
mode: Literal["local_kb", "temp_kb", "search_engine"] = "local_kb",
|
||||
kb_name: str = "",
|
||||
top_k: int = VECTOR_SEARCH_TOP_K,
|
||||
score_threshold: float = SCORE_THRESHOLD,
|
||||
history: List[Union[ChatMessage, dict]] = [],
|
||||
stream: bool = True,
|
||||
model: str = LLM_MODEL,
|
||||
temperature: float = TEMPERATURE,
|
||||
max_tokens: Optional[int] = MAX_TOKENS,
|
||||
prompt_name: str = "default",
|
||||
return_direct: bool = False,
|
||||
):
|
||||
kb_chat_param = KbChatParam(
|
||||
query=query,
|
||||
mode=mode,
|
||||
kb_name=kb_name,
|
||||
top_k=top_k,
|
||||
score_threshold=score_threshold,
|
||||
history=history,
|
||||
stream=stream,
|
||||
model=model,
|
||||
temperature=temperature,
|
||||
max_tokens=max_tokens,
|
||||
prompt_name=prompt_name,
|
||||
return_direct=return_direct,
|
||||
).dict()
|
||||
response = self._post(API_URI_KB_CHAT, json=kb_chat_param, stream=True)
|
||||
return self._httpx_stream2generator(response, as_json=True)
|
||||
|
||||
def file_chat(self,
|
||||
query: str,
|
||||
knowledge_id: str,
|
||||
top_k: int = VECTOR_SEARCH_TOP_K,
|
||||
score_threshold: float = SCORE_THRESHOLD,
|
||||
history: List[Union[dict, ChatMessage]] = [],
|
||||
stream: bool = True,
|
||||
model_name: str = LLM_MODEL,
|
||||
temperature: float = 0.01,
|
||||
max_tokens: Optional[int] = MAX_TOKENS,
|
||||
prompt_name: str = "default",
|
||||
):
|
||||
file_chat_param = FileChatParam(
|
||||
query=query,
|
||||
knowledge_id=knowledge_id,
|
||||
top_k=top_k,
|
||||
score_threshold=score_threshold,
|
||||
history=history,
|
||||
stream=stream,
|
||||
model_name=model_name,
|
||||
temperature=temperature,
|
||||
max_tokens=max_tokens,
|
||||
prompt_name=prompt_name,
|
||||
).dict()
|
||||
response = self._post(API_URI_FILE_CHAT, json=file_chat_param, stream=True)
|
||||
return self._httpx_stream2generator(response, as_json=True)
|
||||
@@ -0,0 +1,321 @@
|
||||
from pydantic import Field
|
||||
|
||||
from open_chatcaht._constants import EMBEDDING_MODEL, VS_TYPE, VECTOR_SEARCH_TOP_K, SCORE_THRESHOLD, CHUNK_SIZE, \
|
||||
OVERLAP_SIZE, ZH_TITLE_ENHANCE, LLM_MODEL
|
||||
from open_chatcaht.api_client import ApiClient, post
|
||||
from open_chatcaht.types.knowledge_base.create_knowledge_base_param import CreateKnowledgeBaseParam
|
||||
import json
|
||||
import os
|
||||
from io import BytesIO
|
||||
from pathlib import Path
|
||||
from typing import *
|
||||
|
||||
from open_chatcaht.types.knowledge_base.delete_knowledge_base_param import DeleteKnowledgeBaseParam
|
||||
from open_chatcaht.types.knowledge_base.doc.delete_kb_docs_param import DeleteKbDocsParam
|
||||
from open_chatcaht.types.knowledge_base.doc.download_kb_doc_param import DownloadKbDocParam
|
||||
from open_chatcaht.types.knowledge_base.doc.search_kb_docs_param import SearchKbDocsParam
|
||||
from open_chatcaht.types.knowledge_base.doc.search_temp_docs_param import SearchTempDocsParam
|
||||
from open_chatcaht.types.knowledge_base.doc.upload_kb_docs_param import UploadKbDocsParam
|
||||
from open_chatcaht.types.knowledge_base.doc.upload_temp_docs_param import UploadTempDocsParam
|
||||
from open_chatcaht.types.knowledge_base.recreate_vector_store_param import RecreateVectorStoreParam
|
||||
from open_chatcaht.types.knowledge_base.summary.recreate_summary_vector_store_param import \
|
||||
RecreateSummaryVectorStoreParam
|
||||
from open_chatcaht.types.knowledge_base.summary.summary_doc_ids_to_vector_store_param import \
|
||||
SummaryDocIdsToVectorStoreParam
|
||||
from open_chatcaht.types.knowledge_base.summary.summary_file_to_vector_store_param import SummaryFileToVectorStoreParam
|
||||
from open_chatcaht.types.knowledge_base.update_kb_info_param import UpdateKbInfoParam
|
||||
from open_chatcaht.types.response.base import BaseResponse
|
||||
from open_chatcaht.utils import convert_file
|
||||
|
||||
API_URI_CREATE_KB = "/knowledge_base/create_knowledge_base"
|
||||
API_URI_DELETE_KB = "/knowledge_base/delete_knowledge_base"
|
||||
API_URI_KB_UPDATE_INFO = "/knowledge_base/update_info"
|
||||
API_URI_LIST_KB = "/knowledge_base/list_knowledge_bases"
|
||||
|
||||
API_URI_URI_LIST_KB_FILE = "/knowledge_base/list_files"
|
||||
API_URI_SEARCH_KB_DOCS = "/knowledge_base/search_docs"
|
||||
|
||||
API_URI_KB_UPLOAD_DOCS = "/knowledge_base/upload_docs"
|
||||
API_URI_KB_DOWNLOAD_DOC = "/knowledge_base/download_doc"
|
||||
API_URI_DELETE_KB_DOCS = "/knowledge_base/delete_docs"
|
||||
API_URI_KB_RECREATE_VECTOR_STORE = "/knowledge_base/recreate_vector_store"
|
||||
API_URI_KB_SEARCH_TEMP_DOCS = "/knowledge_base/search_temp_docs"
|
||||
API_URI_KB_UPLOAD_TEMP_DOCS = "/knowledge_base/upload_temp_docs"
|
||||
|
||||
API_URI_KB_SUMMARY_FILE_TO_VECTOR_STORE = "/knowledge_base/kb_summary_api/summary_file_to_vector_store"
|
||||
API_URI_KB_SUMMARY_DOC_IDS_TO_VECTOR_STORE = "/knowledge_base/kb_summary_api/summary_doc_ids_to_vector_store"
|
||||
API_URI_KB_SUMMARY_RECREATE_VECTOR_STORE = "/knowledge_base/kb_summary_api/recreate_summary_vector_store"
|
||||
|
||||
|
||||
class KbClient(ApiClient):
|
||||
|
||||
@post(url=API_URI_CREATE_KB
|
||||
, body_model=CreateKnowledgeBaseParam)
|
||||
def create_kb(
|
||||
self,
|
||||
knowledge_base_name: str,
|
||||
kb_info: str = "",
|
||||
vector_store_type: str = VS_TYPE,
|
||||
embed_model: str = EMBEDDING_MODEL,
|
||||
) -> BaseResponse:
|
||||
...
|
||||
|
||||
# def create_knowledge_base(
|
||||
# self,
|
||||
# knowledge_base_name: str,
|
||||
# kb_info: str = "",
|
||||
# vector_store_type: str = VS_TYPE,
|
||||
# embed_model: str = EMBEDDING_MODEL,
|
||||
# ):
|
||||
# data = CreateKnowledgeBaseParam(
|
||||
# knowledge_base_name=knowledge_base_name,
|
||||
# kb_info=kb_info,
|
||||
# vector_store_type=vector_store_type,
|
||||
# embed_model=embed_model,
|
||||
# ).dict()
|
||||
# response = self.post(API_URI_CREATE_KB, json=data)
|
||||
# return self._get_response_value(response, as_json=True)
|
||||
|
||||
def delete_kb(
|
||||
self,
|
||||
knowledge_base_name: str,
|
||||
):
|
||||
response = self._post(API_URI_DELETE_KB, json=knowledge_base_name)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def list_kb(self):
|
||||
response = self._get(API_URI_LIST_KB)
|
||||
return self._get_response_value(response, as_json=True, value_func=lambda r: r.get("data", []))
|
||||
|
||||
def list_kb_docs_file(
|
||||
self,
|
||||
knowledge_base_name: str,
|
||||
):
|
||||
params = DeleteKnowledgeBaseParam(knowledge_base_name=knowledge_base_name).dict()
|
||||
response = self._get(API_URI_URI_LIST_KB_FILE, params=params)
|
||||
return self._get_response_value(response, as_json=True, value_func=lambda r: r.get("data", []))
|
||||
|
||||
def search_kb_docs(
|
||||
self,
|
||||
knowledge_base_name: str,
|
||||
query: str = "",
|
||||
top_k: int = VECTOR_SEARCH_TOP_K,
|
||||
score_threshold: float = SCORE_THRESHOLD,
|
||||
file_name: str = "",
|
||||
metadata: dict = {},
|
||||
) -> List:
|
||||
data = SearchKbDocsParam(
|
||||
query=query,
|
||||
knowledge_base_name=knowledge_base_name,
|
||||
top_k=top_k,
|
||||
score_threshold=score_threshold,
|
||||
file_name=file_name,
|
||||
metadata=metadata,
|
||||
).dict()
|
||||
response = self._post(API_URI_SEARCH_KB_DOCS, json=data)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def upload_kb_docs(
|
||||
self,
|
||||
files: List[Union[str, Path, bytes]],
|
||||
knowledge_base_name: str,
|
||||
override: bool = False,
|
||||
to_vector_store: bool = True,
|
||||
chunk_size=CHUNK_SIZE,
|
||||
chunk_overlap=OVERLAP_SIZE,
|
||||
zh_title_enhance=ZH_TITLE_ENHANCE,
|
||||
docs: Dict = {},
|
||||
not_refresh_vs_cache: bool = False,
|
||||
):
|
||||
files = [convert_file(file) for file in files]
|
||||
data = UploadKbDocsParam(
|
||||
knowledge_base_name=knowledge_base_name,
|
||||
override=override,
|
||||
to_vector_store=to_vector_store,
|
||||
chunk_size=chunk_size,
|
||||
chunk_overlap=chunk_overlap,
|
||||
zh_title_enhance=zh_title_enhance,
|
||||
docs=json.dumps(docs, ensure_ascii=False),
|
||||
not_refresh_vs_cache=not_refresh_vs_cache,
|
||||
).dict()
|
||||
response = self._post(API_URI_KB_UPLOAD_DOCS, data=data,
|
||||
files=[("files", (filename, file)) for filename, file in files])
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def delete_kb_docs(
|
||||
self,
|
||||
knowledge_base_name: str,
|
||||
file_names: List[str],
|
||||
delete_content: bool = False,
|
||||
not_refresh_vs_cache: bool = False,
|
||||
):
|
||||
data = DeleteKbDocsParam(
|
||||
knowledge_base_name=knowledge_base_name,
|
||||
file_names=file_names,
|
||||
delete_content=delete_content,
|
||||
not_refresh_vs_cache=not_refresh_vs_cache,
|
||||
).dict()
|
||||
response = self._post(API_URI_DELETE_KB_DOCS, json=data)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def update_kb_info(self, knowledge_base_name, kb_info):
|
||||
data = UpdateKbInfoParam(
|
||||
knowledge_base_name=knowledge_base_name,
|
||||
kb_info=kb_info,
|
||||
).dict()
|
||||
response = self._post(API_URI_KB_UPDATE_INFO, json=data)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def recreate_vector_store(
|
||||
self,
|
||||
knowledge_base_name: str,
|
||||
allow_empty_kb: bool = True,
|
||||
vs_type: str = VS_TYPE,
|
||||
embed_model: str = EMBEDDING_MODEL,
|
||||
chunk_size=CHUNK_SIZE,
|
||||
chunk_overlap=OVERLAP_SIZE,
|
||||
zh_title_enhance=ZH_TITLE_ENHANCE,
|
||||
):
|
||||
data = RecreateVectorStoreParam(
|
||||
knowledge_base_name=knowledge_base_name,
|
||||
allow_empty_kb=allow_empty_kb,
|
||||
vs_type=vs_type,
|
||||
embed_model=embed_model,
|
||||
chunk_size=chunk_size,
|
||||
chunk_overlap=chunk_overlap,
|
||||
zh_title_enhance=zh_title_enhance,
|
||||
).dict()
|
||||
response = self._post(API_URI_KB_RECREATE_VECTOR_STORE, json=data, stream=True, timeout=None)
|
||||
return self._httpx_stream2generator(response, as_json=True)
|
||||
|
||||
# def recreate_summary_vector_store(self,
|
||||
# knowledge_base_name: str,
|
||||
# allow_empty_kb: bool = True,
|
||||
# vs_type: str = VS_TYPE,
|
||||
# embed_model: str = EMBEDDING_MODEL,
|
||||
# file_description: str = "",
|
||||
# model_name: str = None,
|
||||
# temperature: float = 0.01,
|
||||
# max_tokens: Optional[int] = None):
|
||||
# data = RecreateSummaryVectorStoreParam(
|
||||
# knowledge_base_name=knowledge_base_name,
|
||||
# allow_empty_kb=allow_empty_kb,
|
||||
# vs_type=vs_type,
|
||||
# embed_model=embed_model,
|
||||
# file_description=file_description,
|
||||
# model_name=model_name,
|
||||
# temperature=temperature,
|
||||
# max_tokens=max_tokens).dict()
|
||||
# response = self._post(API_URI_KB_SUMMARY_RECREATE_VECTOR_STORE, json=data)
|
||||
# return self._get_response_value(response, as_json=True)
|
||||
#
|
||||
# def summary_doc_ids_to_vector_store(self,
|
||||
# knowledge_base_name: str,
|
||||
# doc_ids: List = [],
|
||||
# vs_type: str = VS_TYPE,
|
||||
# embed_model: str = EMBEDDING_MODEL,
|
||||
# file_description: str = "",
|
||||
# model_name: str = None,
|
||||
# temperature: float = 0.01,
|
||||
# max_tokens: Optional[int] = None,
|
||||
# ):
|
||||
# data = SummaryDocIdsToVectorStoreParam(
|
||||
# knowledge_base_name=knowledge_base_name,
|
||||
# doc_ids=doc_ids,
|
||||
# vs_type=vs_type,
|
||||
# embed_model=embed_model,
|
||||
# file_description=file_description,
|
||||
# model_name=model_name,
|
||||
# temperature=temperature,
|
||||
# max_tokens=max_tokens,
|
||||
# ).dict()
|
||||
# response = self._post(API_URI_KB_SUMMARY_DOC_IDS_TO_VECTOR_STORE, json=data)
|
||||
# return self._get_response_value(response, as_json=True)
|
||||
#
|
||||
# def summary_file_to_vector_store(self, knowledge_base_name: str,
|
||||
# file_name: str,
|
||||
# allow_empty_kb: bool = True,
|
||||
# vs_type: str = VS_TYPE,
|
||||
# embed_model: str = EMBEDDING_MODEL,
|
||||
# file_description: str = "",
|
||||
# model_name: str = LLM_MODEL,
|
||||
# temperature: float = 0.01,
|
||||
# max_tokens: Optional[int] = 1000):
|
||||
# data = SummaryFileToVectorStoreParam(
|
||||
# knowledge_base_name=knowledge_base_name,
|
||||
# file_name=file_name,
|
||||
# allow_empty_kb=allow_empty_kb,
|
||||
# vs_type=vs_type,
|
||||
# embed_model=embed_model,
|
||||
# file_description=file_description,
|
||||
# model_name=model_name,
|
||||
# temperature=temperature,
|
||||
# max_tokens=max_tokens,
|
||||
# ).dict()
|
||||
# response = self._post(API_URI_KB_SUMMARY_FILE_TO_VECTOR_STORE, json=data,stream=True)
|
||||
# return self._httpx_stream2generator(response, as_json=True)
|
||||
|
||||
def upload_temp_docs(self,
|
||||
files: List[Union[str, Path, bytes]],
|
||||
knowledge_id: str = None,
|
||||
chunk_size: int = CHUNK_SIZE,
|
||||
chunk_overlap: int = OVERLAP_SIZE,
|
||||
zh_title_enhance: bool = ZH_TITLE_ENHANCE,
|
||||
):
|
||||
data = UploadTempDocsParam(
|
||||
prev_id=knowledge_id,
|
||||
chunk_size=chunk_size,
|
||||
chunk_overlap=chunk_overlap,
|
||||
zh_title_enhance=zh_title_enhance
|
||||
).dict()
|
||||
_files = [convert_file(file) for file in files]
|
||||
response = self._post(
|
||||
"/knowledge_base/upload_temp_docs",
|
||||
data=data,
|
||||
files=[("files", (filename, file)) for filename, file in _files],
|
||||
)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
# _files = [convert_file(file) for file in files]
|
||||
# response = self._post(API_URI_KB_UPLOAD_TEMP_DOCS, data=data,
|
||||
# files=[("files", (filename, file)) for filename, file in _files])
|
||||
# return self._get_response_value(response, as_json=True)
|
||||
|
||||
def search_temp_kb_docs(
|
||||
self,
|
||||
knowledge_id: str,
|
||||
query: str,
|
||||
top_k: int = VECTOR_SEARCH_TOP_K,
|
||||
score_threshold: float = SCORE_THRESHOLD,
|
||||
) -> List:
|
||||
data = SearchTempDocsParam(
|
||||
knowledge_id=knowledge_id,
|
||||
query=query,
|
||||
top_k=top_k,
|
||||
score_threshold=score_threshold,
|
||||
).dict()
|
||||
response = self._post(API_URI_KB_SEARCH_TEMP_DOCS, json=data)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def download_kb_doc_file(self, knowledge_base_name: str, file_name: str, file_path: Optional[str] = None):
|
||||
params = DownloadKbDocParam(
|
||||
knowledge_base_name=knowledge_base_name,
|
||||
file_name=file_name,
|
||||
preview=False
|
||||
).dict()
|
||||
response = self._get(API_URI_KB_DOWNLOAD_DOC, params=params)
|
||||
file_content = self._get_response_value(response, as_json=False, value_func=lambda r: r.content)
|
||||
if file_path is None:
|
||||
file_path = file_name
|
||||
with open(file_path, 'wb') as file:
|
||||
file.write(file_content)
|
||||
return file_path
|
||||
|
||||
def kb_doc_file_content(self, knowledge_base_name: str, file_name: str):
|
||||
params = DownloadKbDocParam(
|
||||
knowledge_base_name=knowledge_base_name,
|
||||
file_name=file_name,
|
||||
preview=True
|
||||
).dict()
|
||||
response = self._get(API_URI_KB_DOWNLOAD_DOC, params=params)
|
||||
file_content = self._get_response_value(response, as_json=False, value_func=lambda r: r.content)
|
||||
return file_content.decode('utf-8')
|
||||
@@ -0,0 +1,23 @@
|
||||
from open_chatcaht.api_client import ApiClient
|
||||
|
||||
API_URI_GET_SERVER_CONFIGS = "/server/configs"
|
||||
API_URI_GET_PROMPT_TEMPLATE = "/server/get_prompt_template"
|
||||
|
||||
|
||||
class ServerClient(ApiClient):
|
||||
# 服务器信息
|
||||
def get_server_configs(self) -> dict:
|
||||
response = self._post(API_URI_GET_SERVER_CONFIGS)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def get_prompt_template(
|
||||
self,
|
||||
_type: str = "knowledge_base_chat",
|
||||
name: str = "default",
|
||||
) -> str:
|
||||
data = {
|
||||
"type": _type, # 模板类型
|
||||
"name": name # 模板名称
|
||||
}
|
||||
response = self._post(API_URI_GET_PROMPT_TEMPLATE, json=data)
|
||||
return self._get_response_value(response, value_func=lambda r: r.text)
|
||||
@@ -0,0 +1,116 @@
|
||||
from typing import Dict, List
|
||||
|
||||
from open_chatcaht.api_client import ApiClient, get
|
||||
from open_chatcaht.types.standard_openai.audio_speech_input import OpenAIAudioSpeechInput
|
||||
from open_chatcaht.types.standard_openai.audio_transcriptions_input import OpenAIAudioTranscriptionsInput
|
||||
from open_chatcaht.types.standard_openai.audio_translations_input import OpenAIAudioTranslationsInput
|
||||
from open_chatcaht.types.standard_openai.chat_input import OpenAIChatInput
|
||||
from open_chatcaht.types.standard_openai.embeddings_Input import OpenAIEmbeddingsInput
|
||||
from open_chatcaht.types.standard_openai.image_edits_input import OpenAIImageEditsInput
|
||||
from open_chatcaht.types.standard_openai.image_generations_input import OpenAIImageGenerationsInput
|
||||
from open_chatcaht.types.standard_openai.image_variations_input import OpenAIImageVariationsInput
|
||||
|
||||
API_UTI_STANDARD_OPENAI_LIST_MODELS = "/v1/models"
|
||||
API_UTI_STANDARD_OPENAI_CHAT_COMPLETIONS = "/v1/chat/completions"
|
||||
API_UTI_STANDARD_OPENAI_COMPLETIONS = "/v1/chat/completions"
|
||||
API_UTI_STANDARD_OPENAI_EMBEDDINGS = "/v1/embeddings"
|
||||
|
||||
API_UTI_STANDARD_OPENAI_IMAGE_GENERATIONS = "/v1//images/generations"
|
||||
API_UTI_STANDARD_OPENAI_IMAGE_VARIATIONS = "/v1//images/variations"
|
||||
API_UTI_STANDARD_OPENAI_IMAGE_EDIT = "/v1//images/edit"
|
||||
|
||||
API_UTI_STANDARD_OPENAI_AUDIO_TRANSLATIONS = "/v1//audio/translations"
|
||||
API_UTI_STANDARD_OPENAI_AUDIO_TRANSCRIPTIONS = "/v1//audio/transcriptions"
|
||||
API_UTI_STANDARD_OPENAI_AUDIO_SPEECH = "/v1/audio/speech"
|
||||
|
||||
API_UTI_STANDARD_OPENAI_FILES = "/v1/files"
|
||||
API_UTI_STANDARD_OPENAI_LIST_FILES = "/v1/list_files"
|
||||
API_UTI_STANDARD_OPENAI_RETRIEVE_FILE = "/v1//files/{file_id}"
|
||||
API_UTI_STANDARD_OPENAI_RETRIEVE_FILE_CONTENT = "/v1//files/{file_id}/content"
|
||||
API_UTI_STANDARD_OPENAI_DELETE_FILE = "/v1//files/{file_id}"
|
||||
|
||||
|
||||
class StandardOpenaiClient(ApiClient):
|
||||
|
||||
def list_models(self) -> dict:
|
||||
response = self._get(API_UTI_STANDARD_OPENAI_LIST_MODELS)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def chat_completions(self, chat_input: OpenAIChatInput) -> dict:
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_CHAT_COMPLETIONS, json=chat_input.dict(), stream=True)
|
||||
return self._httpx_stream2generator(response, as_json=True)
|
||||
|
||||
def completions(self, chat_input: OpenAIChatInput) -> dict:
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_COMPLETIONS, json=chat_input.dict(), stream=True)
|
||||
return self._httpx_stream2generator(response, as_json=True)
|
||||
|
||||
def embeddings(self, embeddings_input: OpenAIEmbeddingsInput):
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_EMBEDDINGS, json=embeddings_input.dict())
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def image_generations(
|
||||
self,
|
||||
data: OpenAIImageGenerationsInput,
|
||||
):
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_IMAGE_GENERATIONS, json=data.dict())
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def image_variations(
|
||||
self,
|
||||
data: OpenAIImageVariationsInput,
|
||||
):
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_IMAGE_VARIATIONS, json=data.dict())
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def image_edit(
|
||||
self,
|
||||
data: OpenAIImageEditsInput,
|
||||
):
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_IMAGE_EDIT, json=data.dict())
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def audio_translations(
|
||||
self,
|
||||
data: OpenAIAudioTranslationsInput,
|
||||
):
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_AUDIO_TRANSLATIONS, json=data.dict())
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def audio_transcriptions(
|
||||
self,
|
||||
data: OpenAIAudioTranscriptionsInput,
|
||||
):
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_AUDIO_TRANSCRIPTIONS, json=data.dict())
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def audio_speech(
|
||||
self,
|
||||
data: OpenAIAudioSpeechInput,
|
||||
):
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_AUDIO_SPEECH, json=data.dict())
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
# todo 待完成
|
||||
async def files(
|
||||
self,
|
||||
file: str,
|
||||
purpose: str = "assistants",
|
||||
) -> Dict:
|
||||
response = self._post(API_UTI_STANDARD_OPENAI_FILES)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def list_files(self, purpose: str) -> Dict[str, List[Dict]]:
|
||||
response = self._get(API_UTI_STANDARD_OPENAI_LIST_FILES)
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def retrieve_file(self, file_id: str) -> Dict:
|
||||
response = self._get(API_UTI_STANDARD_OPENAI_RETRIEVE_FILE.format(file_id=file_id))
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def retrieve_file_content(self, file_id: str) -> Dict:
|
||||
response = self._get(API_UTI_STANDARD_OPENAI_RETRIEVE_FILE_CONTENT.format(file_id=file_id))
|
||||
return self._get_response_value(response, as_json=True)
|
||||
|
||||
def delete_file(self, file_id: str) -> Dict:
|
||||
response = self._delete(API_UTI_STANDARD_OPENAI_DELETE_FILE.format(file_id=file_id))
|
||||
return self._get_response_value(response, as_json=True)
|
||||
@@ -0,0 +1,26 @@
|
||||
from open_chatcaht.api_client import ApiClient
|
||||
from open_chatcaht.types.tools.call_tool_param import CallToolParam
|
||||
|
||||
API_URI_TOOL_CALL = "/tools/call"
|
||||
API_URI_TOOL_LIST = "/tools"
|
||||
|
||||
|
||||
class ToolClient(ApiClient):
|
||||
def list(self) -> dict:
|
||||
"""
|
||||
列出所有工具
|
||||
"""
|
||||
resp = self._get(API_URI_TOOL_LIST)
|
||||
return self._get_response_value(resp, as_json=True, value_func=lambda r: r.get("data", {}))
|
||||
|
||||
def call(
|
||||
self,
|
||||
name: str,
|
||||
tool_input: dict = {},
|
||||
):
|
||||
"""
|
||||
调用工具
|
||||
"""
|
||||
data = CallToolParam(name=name, tool_input=tool_input).dict()
|
||||
resp = self._post(API_URI_TOOL_CALL, json=data)
|
||||
return self._get_response_value(resp, as_json=True, value_func=lambda r: r.get("data"))
|
||||
Reference in New Issue
Block a user