Skip to content

Commit b0034a6

Browse files
shawn-yang-googlecopybara-github
authored andcommitted
feat: Support Developer Connect in AE
PiperOrigin-RevId: 832480435
1 parent 3eb38bf commit b0034a6

File tree

4 files changed

+194
-1
lines changed

4 files changed

+194
-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": {"config": 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",
@@ -1824,6 +1865,7 @@ def test_create_agent_engine_with_env_vars_dict(
18241865
labels=None,
18251866
class_methods=None,
18261867
source_packages=None,
1868+
developer_connect_source=None,
18271869
entrypoint_module=None,
18281870
entrypoint_object=None,
18291871
requirements_file=None,
@@ -1924,6 +1966,7 @@ def test_create_agent_engine_with_custom_service_account(
19241966
agent_server_mode=None,
19251967
class_methods=None,
19261968
source_packages=None,
1969+
developer_connect_source=None,
19271970
entrypoint_module=None,
19281971
entrypoint_object=None,
19291972
requirements_file=None,
@@ -2023,6 +2066,7 @@ def test_create_agent_engine_with_experimental_mode(
20232066
agent_server_mode=_genai_types.AgentServerMode.EXPERIMENTAL,
20242067
class_methods=None,
20252068
source_packages=None,
2069+
developer_connect_source=None,
20262070
entrypoint_module=None,
20272071
entrypoint_object=None,
20282072
requirements_file=None,
@@ -2191,6 +2235,7 @@ def test_create_agent_engine_with_class_methods(
21912235
agent_server_mode=None,
21922236
class_methods=_TEST_AGENT_ENGINE_CLASS_METHODS,
21932237
source_packages=None,
2238+
developer_connect_source=None,
21942239
entrypoint_module=None,
21952240
entrypoint_object=None,
21962241
requirements_file=None,
@@ -2284,6 +2329,7 @@ def test_create_agent_engine_with_agent_framework(
22842329
agent_server_mode=None,
22852330
class_methods=None,
22862331
source_packages=None,
2332+
developer_connect_source=None,
22872333
entrypoint_module=None,
22882334
entrypoint_object=None,
22892335
requirements_file=None,

vertexai/_genai/agent_engines.py

Lines changed: 24 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,
@@ -1005,6 +1009,9 @@ def _create_config(
10051009
agent_server_mode: Optional[types.AgentServerMode] = None,
10061010
class_methods: Optional[Sequence[dict[str, Any]]] = None,
10071011
source_packages: Optional[Sequence[str]] = None,
1012+
developer_connect_source: Optional[
1013+
types.ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict
1014+
] = None,
10081015
entrypoint_module: Optional[str] = None,
10091016
entrypoint_object: Optional[str] = None,
10101017
requirements_file: Optional[str] = None,
@@ -1054,6 +1061,12 @@ def _create_config(
10541061
"do not specify `agent` in `agent_engines.create()` or "
10551062
"`agent_engines.update()`."
10561063
)
1064+
if developer_connect_source is not None:
1065+
raise ValueError(
1066+
"If you have provided `developer_connect_source` in `config`, please "
1067+
"do not specify `agent` in `agent_engines.create()` or "
1068+
"`agent_engines.update()`."
1069+
)
10571070

10581071
project = self._api_client.project
10591072
if project is None:
@@ -1154,6 +1167,13 @@ def _create_config(
11541167
}
11551168
}
11561169

1170+
if developer_connect_source is not None:
1171+
update_masks.append("spec.source_code_spec.developer_connect_source")
1172+
source_code_spec = {
1173+
"developer_connect_source": {"config": developer_connect_source}
1174+
}
1175+
1176+
if source_packages is not None or developer_connect_source is not None:
11571177
update_masks.append("spec.source_code_spec.python_spec.version")
11581178
python_spec = {
11591179
"version": sys_version,
@@ -1195,7 +1215,6 @@ def _create_config(
11951215
for class_method_spec in class_methods_spec
11961216
],
11971217
}
1198-
11991218
if agent_engine_spec is not None:
12001219
if (
12011220
env_vars is not None
@@ -1445,6 +1464,9 @@ def update(
14451464
if context_spec is not None:
14461465
# Conversion to a dict for _create_config
14471466
context_spec = context_spec.model_dump()
1467+
developer_connect_source = config.developer_connect_source
1468+
if developer_connect_source is not None:
1469+
developer_connect_source = developer_connect_source.model_dump()
14481470
if agent and agent_engine:
14491471
raise ValueError("Please specify only one of `agent` or `agent_engine`.")
14501472
elif agent_engine:
@@ -1473,6 +1495,7 @@ def update(
14731495
labels=config.labels,
14741496
class_methods=config.class_methods,
14751497
source_packages=config.source_packages,
1498+
developer_connect_source=developer_connect_source,
14761499
entrypoint_module=config.entrypoint_module,
14771500
entrypoint_object=config.entrypoint_object,
14781501
requirements_file=config.requirements_file,

vertexai/_genai/types/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,12 @@
727727
from .common import ReasoningEngineSpecPackageSpecDict
728728
from .common import ReasoningEngineSpecPackageSpecOrDict
729729
from .common import ReasoningEngineSpecSourceCodeSpec
730+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig
731+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict
732+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigOrDict
733+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectSource
734+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceDict
735+
from .common import ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceOrDict
730736
from .common import ReasoningEngineSpecSourceCodeSpecDict
731737
from .common import ReasoningEngineSpecSourceCodeSpecInlineSource
732738
from .common import ReasoningEngineSpecSourceCodeSpecInlineSourceDict
@@ -1359,6 +1365,12 @@
13591365
"ReasoningEngineSpecPackageSpec",
13601366
"ReasoningEngineSpecPackageSpecDict",
13611367
"ReasoningEngineSpecPackageSpecOrDict",
1368+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig",
1369+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict",
1370+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigOrDict",
1371+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectSource",
1372+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceDict",
1373+
"ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceOrDict",
13621374
"ReasoningEngineSpecSourceCodeSpecInlineSource",
13631375
"ReasoningEngineSpecSourceCodeSpecInlineSourceDict",
13641376
"ReasoningEngineSpecSourceCodeSpecInlineSourceOrDict",

vertexai/_genai/types/common.py

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

@@ -4771,6 +4839,12 @@ class ReasoningEngineSpecSourceCodeSpecPythonSpecDict(TypedDict, total=False):
47714839
class ReasoningEngineSpecSourceCodeSpec(_common.BaseModel):
47724840
"""Specification for deploying from source code."""
47734841

4842+
developer_connect_source: Optional[
4843+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectSource
4844+
] = Field(
4845+
default=None,
4846+
description="""Source code is in a Git repository managed by Developer Connect.""",
4847+
)
47744848
inline_source: Optional[ReasoningEngineSpecSourceCodeSpecInlineSource] = Field(
47754849
default=None, description="""Source code is provided directly in the request."""
47764850
)
@@ -4782,6 +4856,11 @@ class ReasoningEngineSpecSourceCodeSpec(_common.BaseModel):
47824856
class ReasoningEngineSpecSourceCodeSpecDict(TypedDict, total=False):
47834857
"""Specification for deploying from source code."""
47844858

4859+
developer_connect_source: Optional[
4860+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceDict
4861+
]
4862+
"""Source code is in a Git repository managed by Developer Connect."""
4863+
47854864
inline_source: Optional[ReasoningEngineSpecSourceCodeSpecInlineSourceDict]
47864865
"""Source code is provided directly in the request."""
47874866

@@ -5440,6 +5519,12 @@ class CreateAgentEngineConfig(_common.BaseModel):
54405519
- class_methods (required)
54415520
""",
54425521
)
5522+
developer_connect_source: Optional[
5523+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig
5524+
] = Field(
5525+
default=None,
5526+
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.""",
5527+
)
54435528
entrypoint_module: Optional[str] = Field(
54445529
default=None,
54455530
description="""The entrypoint module to be used for the Agent Engine
@@ -5572,6 +5657,11 @@ class CreateAgentEngineConfigDict(TypedDict, total=False):
55725657
- class_methods (required)
55735658
"""
55745659

5660+
developer_connect_source: Optional[
5661+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict
5662+
]
5663+
"""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."""
5664+
55755665
entrypoint_module: Optional[str]
55765666
"""The entrypoint module to be used for the Agent Engine
55775667
This field only used when source_packages is specified."""
@@ -6200,6 +6290,12 @@ class UpdateAgentEngineConfig(_common.BaseModel):
62006290
- class_methods (required)
62016291
""",
62026292
)
6293+
developer_connect_source: Optional[
6294+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig
6295+
] = Field(
6296+
default=None,
6297+
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.""",
6298+
)
62036299
entrypoint_module: Optional[str] = Field(
62046300
default=None,
62056301
description="""The entrypoint module to be used for the Agent Engine
@@ -6337,6 +6433,11 @@ class UpdateAgentEngineConfigDict(TypedDict, total=False):
63376433
- class_methods (required)
63386434
"""
63396435

6436+
developer_connect_source: Optional[
6437+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict
6438+
]
6439+
"""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."""
6440+
63406441
entrypoint_module: Optional[str]
63416442
"""The entrypoint module to be used for the Agent Engine
63426443
This field only used when source_packages is specified."""
@@ -13582,6 +13683,12 @@ class AgentEngineConfig(_common.BaseModel):
1358213683
- class_methods (required)
1358313684
""",
1358413685
)
13686+
developer_connect_source: Optional[
13687+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfig
13688+
] = Field(
13689+
default=None,
13690+
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.""",
13691+
)
1358513692
entrypoint_module: Optional[str] = Field(
1358613693
default=None,
1358713694
description="""The entrypoint module to be used for the Agent Engine
@@ -13746,6 +13853,11 @@ class AgentEngineConfigDict(TypedDict, total=False):
1374613853
- class_methods (required)
1374713854
"""
1374813855

13856+
developer_connect_source: Optional[
13857+
ReasoningEngineSpecSourceCodeSpecDeveloperConnectConfigDict
13858+
]
13859+
"""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."""
13860+
1374913861
entrypoint_module: Optional[str]
1375013862
"""The entrypoint module to be used for the Agent Engine
1375113863
This field only used when source_packages is specified."""

0 commit comments

Comments
 (0)