mirror of
https://github.com/hwchase17/langchain
synced 2024-11-06 03:20:49 +00:00
ed58eeb9c5
Moved the following modules to new package langchain-community in a backwards compatible fashion: ``` mv langchain/langchain/adapters community/langchain_community mv langchain/langchain/callbacks community/langchain_community/callbacks mv langchain/langchain/chat_loaders community/langchain_community mv langchain/langchain/chat_models community/langchain_community mv langchain/langchain/document_loaders community/langchain_community mv langchain/langchain/docstore community/langchain_community mv langchain/langchain/document_transformers community/langchain_community mv langchain/langchain/embeddings community/langchain_community mv langchain/langchain/graphs community/langchain_community mv langchain/langchain/llms community/langchain_community mv langchain/langchain/memory/chat_message_histories community/langchain_community mv langchain/langchain/retrievers community/langchain_community mv langchain/langchain/storage community/langchain_community mv langchain/langchain/tools community/langchain_community mv langchain/langchain/utilities community/langchain_community mv langchain/langchain/vectorstores community/langchain_community mv langchain/langchain/agents/agent_toolkits community/langchain_community mv langchain/langchain/cache.py community/langchain_community mv langchain/langchain/adapters community/langchain_community mv langchain/langchain/callbacks community/langchain_community/callbacks mv langchain/langchain/chat_loaders community/langchain_community mv langchain/langchain/chat_models community/langchain_community mv langchain/langchain/document_loaders community/langchain_community mv langchain/langchain/docstore community/langchain_community mv langchain/langchain/document_transformers community/langchain_community mv langchain/langchain/embeddings community/langchain_community mv langchain/langchain/graphs community/langchain_community mv langchain/langchain/llms community/langchain_community mv langchain/langchain/memory/chat_message_histories community/langchain_community mv langchain/langchain/retrievers community/langchain_community mv langchain/langchain/storage community/langchain_community mv langchain/langchain/tools community/langchain_community mv langchain/langchain/utilities community/langchain_community mv langchain/langchain/vectorstores community/langchain_community mv langchain/langchain/agents/agent_toolkits community/langchain_community mv langchain/langchain/cache.py community/langchain_community ``` Moved the following to core ``` mv langchain/langchain/utils/json_schema.py core/langchain_core/utils mv langchain/langchain/utils/html.py core/langchain_core/utils mv langchain/langchain/utils/strings.py core/langchain_core/utils cat langchain/langchain/utils/env.py >> core/langchain_core/utils/env.py rm langchain/langchain/utils/env.py ``` See .scripts/community_split/script_integrations.sh for all changes
116 lines
4.0 KiB
Python
116 lines
4.0 KiB
Python
import builtins
|
|
import json
|
|
from typing import List, Optional, Type, Union
|
|
|
|
from langchain_core.callbacks import AsyncCallbackManagerForToolRun
|
|
from langchain_core.pydantic_v1 import BaseModel, Field
|
|
|
|
from langchain_community.tools.ainetwork.base import AINBaseTool, OperationType
|
|
|
|
|
|
class RuleSchema(BaseModel):
|
|
"""Schema for owner operations."""
|
|
|
|
type: OperationType = Field(...)
|
|
path: str = Field(..., description="Blockchain reference path")
|
|
address: Optional[Union[str, List[str]]] = Field(
|
|
None, description="A single address or a list of addresses"
|
|
)
|
|
write_owner: Optional[bool] = Field(
|
|
False, description="Authority to edit the `owner` property of the path"
|
|
)
|
|
write_rule: Optional[bool] = Field(
|
|
False, description="Authority to edit `write rule` for the path"
|
|
)
|
|
write_function: Optional[bool] = Field(
|
|
False, description="Authority to `set function` for the path"
|
|
)
|
|
branch_owner: Optional[bool] = Field(
|
|
False, description="Authority to initialize `owner` of sub-paths"
|
|
)
|
|
|
|
|
|
class AINOwnerOps(AINBaseTool):
|
|
"""Tool for owner operations."""
|
|
|
|
name: str = "AINownerOps"
|
|
description: str = """
|
|
Rules for `owner` in AINetwork Blockchain database.
|
|
An address set as `owner` can modify permissions according to its granted authorities
|
|
|
|
## Path Rule
|
|
- (/[a-zA-Z_0-9]+)+
|
|
- Permission checks ascend from the most specific (child) path to broader (parent) paths until an `owner` is located.
|
|
|
|
## Address Rules
|
|
- 0x[0-9a-fA-F]{40}: 40-digit hexadecimal address
|
|
- *: All addresses permitted
|
|
- Defaults to the current session's address
|
|
|
|
## SET
|
|
- `SET` alters permissions for specific addresses, while other addresses remain unaffected.
|
|
- When removing an address of `owner`, set all authorities for that address to false.
|
|
- message `write_owner permission evaluated false` if fail
|
|
|
|
### Example
|
|
- type: SET
|
|
- path: /apps/langchain
|
|
- address: [<address 1>, <address 2>]
|
|
- write_owner: True
|
|
- write_rule: True
|
|
- write_function: True
|
|
- branch_owner: True
|
|
|
|
## GET
|
|
- Provides all addresses with `owner` permissions and their authorities in the path.
|
|
|
|
### Example
|
|
- type: GET
|
|
- path: /apps/langchain
|
|
""" # noqa: E501
|
|
args_schema: Type[BaseModel] = RuleSchema
|
|
|
|
async def _arun(
|
|
self,
|
|
type: OperationType,
|
|
path: str,
|
|
address: Optional[Union[str, List[str]]] = None,
|
|
write_owner: Optional[bool] = None,
|
|
write_rule: Optional[bool] = None,
|
|
write_function: Optional[bool] = None,
|
|
branch_owner: Optional[bool] = None,
|
|
run_manager: Optional[AsyncCallbackManagerForToolRun] = None,
|
|
) -> str:
|
|
from ain.types import ValueOnlyTransactionInput
|
|
|
|
try:
|
|
if type is OperationType.SET:
|
|
if address is None:
|
|
address = self.interface.wallet.defaultAccount.address
|
|
if isinstance(address, str):
|
|
address = [address]
|
|
res = await self.interface.db.ref(path).setOwner(
|
|
transactionInput=ValueOnlyTransactionInput(
|
|
value={
|
|
".owner": {
|
|
"owners": {
|
|
address: {
|
|
"write_owner": write_owner or False,
|
|
"write_rule": write_rule or False,
|
|
"write_function": write_function or False,
|
|
"branch_owner": branch_owner or False,
|
|
}
|
|
for address in address
|
|
}
|
|
}
|
|
}
|
|
)
|
|
)
|
|
elif type is OperationType.GET:
|
|
res = await self.interface.db.ref(path).getOwner()
|
|
else:
|
|
raise ValueError(f"Unsupported 'type': {type}.")
|
|
return json.dumps(res, ensure_ascii=False)
|
|
except Exception as e:
|
|
return f"{builtins.type(e).__name__}: {str(e)}"
|