-
Notifications
You must be signed in to change notification settings - Fork 44.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feature(backend): Add ability to execute store agents without agent ownership #9179
base: dev
Are you sure you want to change the base?
Changes from 8 commits
4465994
6b9580b
6df94aa
a7e0af0
c6daeef
4f861e3
797f9ed
bb8e562
f051266
37e8b51
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -6,8 +6,14 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||
from typing import Any, Literal, Optional, Type | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
import prisma | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from prisma.models import AgentGraph, AgentGraphExecution, AgentNode, AgentNodeLink | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from prisma.types import AgentGraphWhereInput | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from prisma.models import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
AgentGraph, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
AgentGraphExecution, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
AgentNode, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
AgentNodeLink, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
StoreListing, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from prisma.types import AgentGraphWhereInput, StoreListingWhereInput | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from pydantic.fields import computed_field | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
from backend.blocks.agent import AgentExecutorBlock | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -529,7 +535,6 @@ async def get_execution(user_id: str, execution_id: str) -> GraphExecution | Non | |||||||||||||||||||||||||||||||||||||||||||||||||||
async def get_graph( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
graph_id: str, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
version: int | None = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
template: bool = False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
user_id: str | None = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
for_export: bool = False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
) -> GraphModel | None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -543,20 +548,38 @@ async def get_graph( | |||||||||||||||||||||||||||||||||||||||||||||||||||
where_clause: AgentGraphWhereInput = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"id": graph_id, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if version is not None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
where_clause["version"] = version | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Swiftyos marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
elif not template: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
where_clause["isActive"] = True | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
# TODO: Fix hack workaround to get adding store agents to work | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if user_id is not None and not template: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
where_clause["userId"] = user_id | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
graph = await AgentGraph.prisma().find_first( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
where=where_clause, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
include=AGENT_GRAPH_INCLUDE, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
order={"version": "desc"}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if not graph: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return None | ||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we already have this, we can remove |
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if graph.userId == user_id: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return GraphModel.from_db(graph, for_export) if graph else None | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
# If the graph is not owned by the user, we need to check if it's a store listing. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if not version: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
version = graph.version | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
store_listing_where: StoreListingWhereInput = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"agentId": graph_id, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"agentVersion": version, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
store_listing = await StoreListing.prisma().find_first(where=store_listing_where) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
# If it does not belong to the user nor is not a store listing, return None | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if not store_listing: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return None | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
# If it is a store listing, return the graph model | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+566
to
+584
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
I think a concise form is easier to understand. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Btw don't we put model queries for StoreListing in store/db.py? can we put this function there? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also ["agentId", "agentVersion"] has to be indexed. We can replace the index from:
to
Or even further, why do we need ID for StoreListing, StoreListingVersion ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also does that mean the query has to filter the |
||||||||||||||||||||||||||||||||||||||||||||||||||||
return GraphModel.from_db(graph, for_export) if graph else None | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -611,9 +634,7 @@ async def create_graph(graph: Graph, user_id: str) -> GraphModel: | |||||||||||||||||||||||||||||||||||||||||||||||||||
async with transaction() as tx: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
await __create_graph(tx, graph, user_id) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if created_graph := await get_graph( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
graph.id, graph.version, graph.is_template, user_id=user_id | ||||||||||||||||||||||||||||||||||||||||||||||||||||
): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if created_graph := await get_graph(graph.id, graph.version, user_id=user_id): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return created_graph | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError(f"Created graph {graph.id} v{graph.version} is not in DB") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The
user_id
meaning is no longer a filter here but a security requirement, I think we need to make this mandatory.The template is deprecated, right?