feat: make identities many to many (#1085)

This commit is contained in:
cthomas
2025-02-20 16:33:24 -08:00
committed by GitHub
parent afbb5af30b
commit 31130a6d28
13 changed files with 243 additions and 83 deletions

View File

@@ -1,3 +1,4 @@
import traceback
from datetime import datetime
from typing import Annotated, List, Optional
@@ -51,7 +52,7 @@ def list_agents(
project_id: Optional[str] = Query(None, description="Search agents by project id"),
template_id: Optional[str] = Query(None, description="Search agents by template id"),
base_template_id: Optional[str] = Query(None, description="Search agents by base template id"),
identifier_key: Optional[str] = Query(None, description="Search agents by identifier key"),
identifier_keys: Optional[List[str]] = Query(None, description="Search agents by identifier keys"),
):
"""
List all agents associated with a given user.
@@ -67,7 +68,6 @@ def list_agents(
"project_id": project_id,
"template_id": template_id,
"base_template_id": base_template_id,
"identifier_key": identifier_key,
}.items()
if value is not None
}
@@ -81,6 +81,7 @@ def list_agents(
query_text=query_text,
tags=tags,
match_all_tags=match_all_tags,
identifier_keys=identifier_keys,
**kwargs,
)
return agents
@@ -119,8 +120,12 @@ def create_agent(
"""
Create a new agent with the specified configuration.
"""
actor = server.user_manager.get_user_or_default(user_id=user_id)
return server.create_agent(agent, actor=actor)
try:
actor = server.user_manager.get_user_or_default(user_id=user_id)
return server.create_agent(agent, actor=actor)
except Exception as e:
traceback.print_exc()
raise HTTPException(status_code=500, detail=str(e))
@router.patch("/{agent_id}", response_model=AgentState, operation_id="modify_agent")

View File

@@ -16,6 +16,7 @@ router = APIRouter(prefix="/identities", tags=["identities"])
def list_identities(
name: Optional[str] = Query(None),
project_id: Optional[str] = Query(None),
identifier_key: Optional[str] = Query(None),
identity_type: Optional[IdentityType] = Query(None),
before: Optional[str] = Query(None),
after: Optional[str] = Query(None),
@@ -30,7 +31,14 @@ def list_identities(
actor = server.user_manager.get_user_or_default(user_id=user_id)
identities = server.identity_manager.list_identities(
name=name, project_id=project_id, identity_type=identity_type, before=before, after=after, limit=limit, actor=actor
name=name,
project_id=project_id,
identifier_key=identifier_key,
identity_type=identity_type,
before=before,
after=after,
limit=limit,
actor=actor,
)
except HTTPException:
raise
@@ -39,13 +47,13 @@ def list_identities(
return identities
@router.get("/{identifier_key}", tags=["identities"], response_model=Identity, operation_id="get_identity_from_identifier_key")
@router.get("/{identity_id}", tags=["identities"], response_model=Identity, operation_id="retrieve_identity")
def retrieve_identity(
identifier_key: str,
identity_id: str,
server: "SyncServer" = Depends(get_letta_server),
):
try:
return server.identity_manager.get_identity_from_identifier_key(identifier_key=identifier_key)
return server.identity_manager.get_identity(identity_id=identity_id)
except NoResultFound as e:
raise HTTPException(status_code=404, detail=str(e))
@@ -82,25 +90,25 @@ def upsert_identity(
raise HTTPException(status_code=500, detail=f"{e}")
@router.patch("/{identifier_key}", tags=["identities"], response_model=Identity, operation_id="update_identity")
@router.patch("/{identity_id}", tags=["identities"], response_model=Identity, operation_id="update_identity")
def modify_identity(
identifier_key: str,
identity_id: str,
identity: IdentityUpdate = Body(...),
server: "SyncServer" = Depends(get_letta_server),
user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
):
try:
actor = server.user_manager.get_user_or_default(user_id=user_id)
return server.identity_manager.update_identity_by_key(identifier_key=identifier_key, identity=identity, actor=actor)
return server.identity_manager.update_identity(identity_id=identity_id, identity=identity, actor=actor)
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=f"{e}")
@router.delete("/{identifier_key}", tags=["identities"], operation_id="delete_identity")
@router.delete("/{identity_id}", tags=["identities"], operation_id="delete_identity")
def delete_identity(
identifier_key: str,
identity_id: str,
server: "SyncServer" = Depends(get_letta_server),
user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
):
@@ -108,4 +116,4 @@ def delete_identity(
Delete an identity by its identifier key
"""
actor = server.user_manager.get_user_or_default(user_id=user_id)
server.identity_manager.delete_identity_by_key(identifier_key=identifier_key, actor=actor)
server.identity_manager.delete_identity(identity_id=identity_id, actor=actor)