Skip to content

Commit b7e3738

Browse files
shawn-yang-googlecopybara-github
authored andcommitted
feat: Support Developer Connect in AE
PiperOrigin-RevId: 832480435
1 parent 46285bf commit b7e3738

File tree

4 files changed

+186
-1
lines changed

4 files changed

+186
-1
lines changed

tests/unit/vertexai/genai/test_agent_engines.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,47 @@ def test_create_agent_engine_config_with_source_packages(
10621062
== _TEST_AGENT_ENGINE_IDENTITY_TYPE_SERVICE_ACCOUNT
10631063
)
10641064

1065+
def test_create_agent_engine_config_with_developer_connect_source(self):
1066+
with tempfile.TemporaryDirectory() as tmpdir:
1067+
requirements_file_path = os.path.join(tmpdir, "requirements.txt")
1068+
with open(requirements_file_path, "w") as f:
1069+
f.write("requests==2.0.0")
1070+
developer_connect_source = {
1071+
"git_repository_link": "projects/test-project/locations/us-central1/connections/test-connection/gitRepositoryLinks/test-repo",
1072+
"revision": "main",
1073+
"dir": "agent",
1074+
}
1075+
config = self.client.agent_engines._create_config(
1076+
mode="create",
1077+
display_name=_TEST_AGENT_ENGINE_DISPLAY_NAME,
1078+
description=_TEST_AGENT_ENGINE_DESCRIPTION,
1079+
developer_connect_source=developer_connect_source,
1080+
entrypoint_module="main",
1081+
entrypoint_object="app",
1082+
requirements_file=requirements_file_path,
1083+
class_methods=_TEST_AGENT_ENGINE_CLASS_METHODS,
1084+
agent_framework=_TEST_AGENT_FRAMEWORK,
1085+
identity_type=_TEST_AGENT_ENGINE_IDENTITY_TYPE_SERVICE_ACCOUNT,
1086+
python_version=_TEST_PYTHON_VERSION_OVERRIDE,
1087+
)
1088+
assert config["display_name"] == _TEST_AGENT_ENGINE_DISPLAY_NAME
1089+
assert config["description"] == _TEST_AGENT_ENGINE_DESCRIPTION
1090+
assert config["spec"]["agent_framework"] == _TEST_AGENT_FRAMEWORK
1091+
assert config["spec"]["source_code_spec"] == {
1092+
"developer_connect_source": developer_connect_source,
1093+
"python_spec": {
1094+
"version": _TEST_PYTHON_VERSION_OVERRIDE,
1095+
"entrypoint_module": "main",
1096+
"entrypoint_object": "app",
1097+
"requirements_file": requirements_file_path,
1098+
},
1099+
}
1100+
assert config["spec"]["class_methods"] == _TEST_AGENT_ENGINE_CLASS_METHODS
1101+
assert (
1102+
config["spec"]["identity_type"]
1103+
== _TEST_AGENT_ENGINE_IDENTITY_TYPE_SERVICE_ACCOUNT
1104+
)
1105+
10651106
@mock.patch.object(
10661107
_agent_engines_utils,
10671108
"_create_base64_encoded_tarball",
@@ -1718,6 +1759,7 @@ def test_create_agent_engine_with_env_vars_dict(
17181759
labels=None,
17191760
class_methods=None,
17201761
source_packages=None,
1762+
developer_connect_source=None,
17211763
entrypoint_module=None,
17221764
entrypoint_object=None,
17231765
requirements_file=None,
@@ -1812,6 +1854,7 @@ def test_create_agent_engine_with_custom_service_account(
18121854
agent_server_mode=None,
18131855
class_methods=None,
18141856
source_packages=None,
1857+
developer_connect_source=None,
18151858
entrypoint_module=None,
18161859
entrypoint_object=None,
18171860
requirements_file=None,
@@ -1905,6 +1948,7 @@ def test_create_agent_engine_with_experimental_mode(
19051948
agent_server_mode=_genai_types.AgentServerMode.EXPERIMENTAL,
19061949
class_methods=None,
19071950
source_packages=None,
1951+
developer_connect_source=None,
19081952
entrypoint_module=None,
19091953
entrypoint_object=None,
19101954
requirements_file=None,
@@ -2061,6 +2105,7 @@ def test_create_agent_engine_with_class_methods(
20612105
agent_server_mode=None,
20622106
class_methods=_TEST_AGENT_ENGINE_CLASS_METHODS,
20632107
source_packages=None,
2108+
developer_connect_source=None,
20642109
entrypoint_module=None,
20652110
entrypoint_object=None,
20662111
requirements_file=None,
@@ -2148,6 +2193,7 @@ def test_create_agent_engine_with_agent_framework(
21482193
agent_server_mode=None,
21492194
class_methods=None,
21502195
source_packages=None,
2196+
developer_connect_source=None,
21512197
entrypoint_module=None,
21522198
entrypoint_object=None,
21532199
requirements_file=None,

vertexai/_genai/agent_engines.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,9 @@ def create(
903903
if context_spec is not None:
904904
# Conversion to a dict for _create_config
905905
context_spec = context_spec.model_dump()
906+
developer_connect_source = config.developer_connect_source
907+
if developer_connect_source is not None:
908+
developer_connect_source = developer_connect_source.model_dump()
906909
if agent and agent_engine:
907910
raise ValueError("Please specify only one of `agent` or `agent_engine`.")
908911
elif agent_engine:
@@ -933,6 +936,7 @@ def create(
933936
labels=config.labels,
934937
class_methods=config.class_methods,
935938
source_packages=config.source_packages,
939+
developer_connect_source=developer_connect_source,
936940
entrypoint_module=config.entrypoint_module,
937941
entrypoint_object=config.entrypoint_object,
938942
requirements_file=config.requirements_file,
@@ -1000,6 +1004,9 @@ def _create_config(
10001004
agent_server_mode: Optional[types.AgentServerMode] = None,
10011005
class_methods: Optional[Sequence[dict[str, Any]]] = None,
10021006
source_packages: Optional[Sequence[str]] = None,
1007+
developer_connect_source: Optional[
1008+
types.ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceDict
1009+
] = None,
10031010
entrypoint_module: Optional[str] = None,
10041011
entrypoint_object: Optional[str] = None,
10051012
requirements_file: Optional[str] = None,
@@ -1049,6 +1056,12 @@ def _create_config(
10491056
"do not specify `agent` in `agent_engines.create()` or "
10501057
"`agent_engines.update()`."
10511058
)
1059+
if developer_connect_source is not None:
1060+
raise ValueError(
1061+
"If you have provided `developer_connect_source` in `config`, please "
1062+
"do not specify `agent` in `agent_engines.create()` or "
1063+
"`agent_engines.update()`."
1064+
)
10521065

10531066
project = self._api_client.project
10541067
if project is None:
@@ -1149,6 +1162,11 @@ def _create_config(
11491162
}
11501163
}
11511164

1165+
if developer_connect_source is not None:
1166+
update_masks.append("spec.source_code_spec.developer_connect_source")
1167+
source_code_spec = {"developer_connect_source": developer_connect_source}
1168+
1169+
if source_packages is not None or developer_connect_source is not None:
11521170
update_masks.append("spec.source_code_spec.python_spec.version")
11531171
python_spec = {
11541172
"version": sys_version,
@@ -1190,7 +1208,6 @@ def _create_config(
11901208
for class_method_spec in class_methods_spec
11911209
],
11921210
}
1193-
11941211
if agent_engine_spec is not None:
11951212
if (
11961213
env_vars is not None
@@ -1440,6 +1457,9 @@ def update(
14401457
if context_spec is not None:
14411458
# Conversion to a dict for _create_config
14421459
context_spec = context_spec.model_dump()
1460+
developer_connect_source = config.developer_connect_source
1461+
if developer_connect_source is not None:
1462+
developer_connect_source = developer_connect_source.model_dump()
14431463
if agent and agent_engine:
14441464
raise ValueError("Please specify only one of `agent` or `agent_engine`.")
14451465
elif agent_engine:
@@ -1468,6 +1488,7 @@ def update(
14681488
labels=config.labels,
14691489
class_methods=config.class_methods,
14701490
source_packages=config.source_packages,
1491+
developer_connect_source=developer_connect_source,
14711492
entrypoint_module=config.entrypoint_module,
14721493
entrypoint_object=config.entrypoint_object,
14731494
requirements_file=config.requirements_file,

vertexai/_genai/types/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,12 @@
717717
from .common import ReasoningEngineSpecPackageSpecDict
718718
from .common import ReasoningEngineSpecPackageSpecOrDict
719719
from .common import ReasoningEngineSpecSourceCodeSpec
720+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig
721+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict
722+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigOrDict
723+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectSource
724+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceDict
725+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceOrDict
720726
from .common import ReasoningEngineSpecSourceCodeSpecDict
721727
from .common import ReasoningEngineSpecSourceCodeSpecInlineSource
722728
from .common import ReasoningEngineSpecSourceCodeSpecInlineSourceDict
@@ -1349,6 +1355,12 @@
13491355
"ReasoningEngineSpecPackageSpec",
13501356
"ReasoningEngineSpecPackageSpecDict",
13511357
"ReasoningEngineSpecPackageSpecOrDict",
1358+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig",
1359+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict",
1360+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigOrDict",
1361+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectSource",
1362+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceDict",
1363+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceOrDict",
13521364
"ReasoningEngineSpecSourceCodeSpecInlineSource",
13531365
"ReasoningEngineSpecSourceCodeSpecInlineSourceDict",
13541366
"ReasoningEngineSpecSourceCodeSpecInlineSourceOrDict",

vertexai/_genai/types/common.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4703,6 +4703,68 @@ class ReasoningEngineSpecPackageSpecDict(TypedDict, total=False):
47034703
]
47044704

47054705

4706+
class ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig(_common.BaseModel):
4707+
"""Specifies the configuration for fetching source code from a Git repository that is managed by Developer Connect. This includes the repository, revision, and directory to use."""
4708+
4709+
dir: Optional[str] = Field(
4710+
default=None,
4711+
description="""Required. Directory, relative to the source root, in which to run the build.""",
4712+
)
4713+
git_repository_link: Optional[str] = Field(
4714+
default=None,
4715+
description="""Required. The Developer Connect Git repository link, formatted as `projects/*/locations/*/connections/*/gitRepositoryLink/*`.""",
4716+
)
4717+
revision: Optional[str] = Field(
4718+
default=None,
4719+
description="""Required. The revision to fetch from the Git repository such as a branch, a tag, a commit SHA, or any Git ref.""",
4720+
)
4721+
4722+
4723+
class ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict(
4724+
TypedDict, total=False
4725+
):
4726+
"""Specifies the configuration for fetching source code from a Git repository that is managed by Developer Connect. This includes the repository, revision, and directory to use."""
4727+
4728+
dir: Optional[str]
4729+
"""Required. Directory, relative to the source root, in which to run the build."""
4730+
4731+
git_repository_link: Optional[str]
4732+
"""Required. The Developer Connect Git repository link, formatted as `projects/*/locations/*/connections/*/gitRepositoryLink/*`."""
4733+
4734+
revision: Optional[str]
4735+
"""Required. The revision to fetch from the Git repository such as a branch, a tag, a commit SHA, or any Git ref."""
4736+
4737+
4738+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigOrDict = Union[
4739+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig,
4740+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict,
4741+
]
4742+
4743+
4744+
class ReasoningEngineSpecSourceCodeSpecDeveloperConnectSource(_common.BaseModel):
4745+
"""Specifies source code to be fetched from a Git repository managed through the Developer Connect service."""
4746+
4747+
config: Optional[ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig] = Field(
4748+
default=None,
4749+
description="""Required. The Developer Connect configuration thats defines the specific repository, revision, and directory to use as the source code root.""",
4750+
)
4751+
4752+
4753+
class ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceDict(
4754+
TypedDict, total=False
4755+
):
4756+
"""Specifies source code to be fetched from a Git repository managed through the Developer Connect service."""
4757+
4758+
config: Optional[ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict]
4759+
"""Required. The Developer Connect configuration thats defines the specific repository, revision, and directory to use as the source code root."""
4760+
4761+
4762+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceOrDict = Union[
4763+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectSource,
4764+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceDict,
4765+
]
4766+
4767+
47064768
class ReasoningEngineSpecSourceCodeSpecInlineSource(_common.BaseModel):
47074769
"""Specifies source code provided as a byte stream."""
47084770

@@ -4771,6 +4833,12 @@ class ReasoningEngineSpecSourceCodeSpecPythonSpecDict(TypedDict, total=False):
47714833
class ReasoningEngineSpecSourceCodeSpec(_common.BaseModel):
47724834
"""Specification for deploying from source code."""
47734835

4836+
developer_connect_source: Optional[
4837+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectSource
4838+
] = Field(
4839+
default=None,
4840+
description="""Source code is in a Git repository managed by Developer Connect.""",
4841+
)
47744842
inline_source: Optional[ReasoningEngineSpecSourceCodeSpecInlineSource] = Field(
47754843
default=None, description="""Source code is provided directly in the request."""
47764844
)
@@ -4782,6 +4850,11 @@ class ReasoningEngineSpecSourceCodeSpec(_common.BaseModel):
47824850
class ReasoningEngineSpecSourceCodeSpecDict(TypedDict, total=False):
47834851
"""Specification for deploying from source code."""
47844852

4853+
developer_connect_source: Optional[
4854+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceDict
4855+
]
4856+
"""Source code is in a Git repository managed by Developer Connect."""
4857+
47854858
inline_source: Optional[ReasoningEngineSpecSourceCodeSpecInlineSourceDict]
47864859
"""Source code is provided directly in the request."""
47874860

@@ -5440,6 +5513,12 @@ class CreateAgentEngineConfig(_common.BaseModel):
54405513
- class_methods (required)
54415514
""",
54425515
)
5516+
developer_connect_source: Optional[
5517+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig
5518+
] = Field(
5519+
default=None,
5520+
description="""Specifies the configuration for fetching source code from a Git repository that is managed by Developer Connect. This includes the repository, revision, and directory to use.""",
5521+
)
54435522
entrypoint_module: Optional[str] = Field(
54445523
default=None,
54455524
description="""The entrypoint module to be used for the Agent Engine
@@ -5572,6 +5651,11 @@ class CreateAgentEngineConfigDict(TypedDict, total=False):
55725651
- class_methods (required)
55735652
"""
55745653

5654+
developer_connect_source: Optional[
5655+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict
5656+
]
5657+
"""Specifies the configuration for fetching source code from a Git repository that is managed by Developer Connect. This includes the repository, revision, and directory to use."""
5658+
55755659
entrypoint_module: Optional[str]
55765660
"""The entrypoint module to be used for the Agent Engine
55775661
This field only used when source_packages is specified."""
@@ -6200,6 +6284,12 @@ class UpdateAgentEngineConfig(_common.BaseModel):
62006284
- class_methods (required)
62016285
""",
62026286
)
6287+
developer_connect_source: Optional[
6288+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig
6289+
] = Field(
6290+
default=None,
6291+
description="""Specifies the configuration for fetching source code from a Git repository that is managed by Developer Connect. This includes the repository, revision, and directory to use.""",
6292+
)
62036293
entrypoint_module: Optional[str] = Field(
62046294
default=None,
62056295
description="""The entrypoint module to be used for the Agent Engine
@@ -6337,6 +6427,11 @@ class UpdateAgentEngineConfigDict(TypedDict, total=False):
63376427
- class_methods (required)
63386428
"""
63396429

6430+
developer_connect_source: Optional[
6431+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict
6432+
]
6433+
"""Specifies the configuration for fetching source code from a Git repository that is managed by Developer Connect. This includes the repository, revision, and directory to use."""
6434+
63406435
entrypoint_module: Optional[str]
63416436
"""The entrypoint module to be used for the Agent Engine
63426437
This field only used when source_packages is specified."""
@@ -13446,6 +13541,12 @@ class AgentEngineConfig(_common.BaseModel):
1344613541
- class_methods (required)
1344713542
""",
1344813543
)
13544+
developer_connect_source: Optional[
13545+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig
13546+
] = Field(
13547+
default=None,
13548+
description="""Specifies the configuration for fetching source code from a Git repository that is managed by Developer Connect. This includes the repository, revision, and directory to use.""",
13549+
)
1344913550
entrypoint_module: Optional[str] = Field(
1345013551
default=None,
1345113552
description="""The entrypoint module to be used for the Agent Engine
@@ -13610,6 +13711,11 @@ class AgentEngineConfigDict(TypedDict, total=False):
1361013711
- class_methods (required)
1361113712
"""
1361213713

13714+
developer_connect_source: Optional[
13715+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict
13716+
]
13717+
"""Specifies the configuration for fetching source code from a Git repository that is managed by Developer Connect. This includes the repository, revision, and directory to use."""
13718+
1361313719
entrypoint_module: Optional[str]
1361413720
"""The entrypoint module to be used for the Agent Engine
1361513721
This field only used when source_packages is specified."""

0 commit comments

Comments
 (0)