Source code for langchain_community.embeddings.edenai
from typing import Any, Dict, List, Optional
from langchain_core.embeddings import Embeddings
from langchain_core.pydantic_v1 import (
BaseModel,
Extra,
Field,
SecretStr,
root_validator,
)
from langchain_core.utils import convert_to_secret_str, get_from_dict_or_env
from langchain_community.utilities.requests import Requests
[docs]class EdenAiEmbeddings(BaseModel, Embeddings):
"""EdenAI嵌入。
环境变量``EDENAI_API_KEY``设置为您的API密钥,或作为命名参数传递。"""
edenai_api_key: Optional[SecretStr] = Field(None, description="EdenAI API Token")
provider: str = "openai"
"""使用的嵌入提供程序(例如:openai、google等)。"""
model: Optional[str] = None
"""上述提供商的模型名称(例如:'gpt-3.5-turbo-instruct' 适用于 openai)
可用模型显示在 https://docs.edenai.co/ 的 'available providers' 下。"""
class Config:
"""此pydantic对象的配置。"""
extra = Extra.forbid
@root_validator()
def validate_environment(cls, values: Dict) -> Dict:
"""验证环境中是否存在API密钥。"""
values["edenai_api_key"] = convert_to_secret_str(
get_from_dict_or_env(values, "edenai_api_key", "EDENAI_API_KEY")
)
return values
[docs] @staticmethod
def get_user_agent() -> str:
from langchain_community import __version__
return f"langchain/{__version__}"
def _generate_embeddings(self, texts: List[str]) -> List[List[float]]:
"""使用EdenAi API计算嵌入。"""
url = "https://api.edenai.run/v2/text/embeddings"
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": f"Bearer {self.edenai_api_key.get_secret_value()}", # type: ignore[union-attr]
"User-Agent": self.get_user_agent(),
}
payload: Dict[str, Any] = {"texts": texts, "providers": self.provider}
if self.model is not None:
payload["settings"] = {self.provider: self.model}
request = Requests(headers=headers)
response = request.post(url=url, data=payload)
if response.status_code >= 500:
raise Exception(f"EdenAI Server: Error {response.status_code}")
elif response.status_code >= 400:
raise ValueError(f"EdenAI received an invalid payload: {response.text}")
elif response.status_code != 200:
raise Exception(
f"EdenAI returned an unexpected response with status "
f"{response.status_code}: {response.text}"
)
temp = response.json()
provider_response = temp[self.provider]
if provider_response.get("status") == "fail":
err_msg = provider_response.get("error", {}).get("message")
raise Exception(err_msg)
embeddings = []
for embed_item in temp[self.provider]["items"]:
embedding = embed_item["embedding"]
embeddings.append(embedding)
return embeddings
[docs] def embed_documents(self, texts: List[str]) -> List[List[float]]:
"""使用EdenAI嵌入文档列表。
参数:
texts:要嵌入的文本列表。
返回:
每个文本的嵌入列表。
"""
return self._generate_embeddings(texts)
[docs] def embed_query(self, text: str) -> List[float]:
"""嵌入一个查询使用EdenAI。
参数:
text: 要嵌入的文本。
返回:
文本的嵌入。
"""
return self._generate_embeddings([text])[0]