Skip to content

Commit d92e7c9

Browse files
speedstorm1copybara-github
authored andcommitted
feat: Adding Slack and Jira data connector for RAG to SDK
PiperOrigin-RevId: 658175136
1 parent e3fc77f commit d92e7c9

File tree

6 files changed

+391
-36
lines changed

6 files changed

+391
-36
lines changed

tests/unit/vertex_rag/test_rag_constants.py

+115-11
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,25 @@
1515
# limitations under the License.
1616
#
1717

18-
from vertexai.preview.rag.utils.resources import (
19-
EmbeddingModelConfig,
20-
RagCorpus,
21-
RagFile,
22-
RagResource,
23-
)
18+
2419
from google.cloud import aiplatform
20+
21+
from vertexai.preview import rag
2522
from google.cloud.aiplatform_v1beta1 import (
2623
GoogleDriveSource,
2724
RagFileChunkingConfig,
2825
ImportRagFilesConfig,
2926
ImportRagFilesRequest,
3027
ImportRagFilesResponse,
28+
JiraSource as GapicJiraSource,
3129
RagCorpus as GapicRagCorpus,
3230
RagFile as GapicRagFile,
31+
SlackSource as GapicSlackSource,
3332
RagContexts,
3433
RetrieveContextsResponse,
3534
)
35+
from google.cloud.aiplatform_v1beta1.types import api_auth
36+
from google.protobuf import timestamp_pb2
3637

3738

3839
TEST_PROJECT = "test-project"
@@ -55,10 +56,10 @@
5556
TEST_PROJECT, TEST_REGION
5657
)
5758
)
58-
TEST_EMBEDDING_MODEL_CONFIG = EmbeddingModelConfig(
59+
TEST_EMBEDDING_MODEL_CONFIG = rag.EmbeddingModelConfig(
5960
publisher_model="publishers/google/models/textembedding-gecko",
6061
)
61-
TEST_RAG_CORPUS = RagCorpus(
62+
TEST_RAG_CORPUS = rag.RagCorpus(
6263
name=TEST_RAG_CORPUS_RESOURCE_NAME,
6364
display_name=TEST_CORPUS_DISPLAY_NAME,
6465
description=TEST_CORPUS_DISCRIPTION,
@@ -144,11 +145,114 @@
144145
display_name=TEST_FILE_DISPLAY_NAME,
145146
description=TEST_FILE_DESCRIPTION,
146147
)
147-
TEST_RAG_FILE = RagFile(
148+
TEST_RAG_FILE = rag.RagFile(
148149
name=TEST_RAG_FILE_RESOURCE_NAME,
149150
display_name=TEST_FILE_DISPLAY_NAME,
150151
description=TEST_FILE_DESCRIPTION,
151152
)
153+
# Slack sources
154+
TEST_SLACK_CHANNEL_ID = "123"
155+
TEST_SLACK_CHANNEL_ID_2 = "456"
156+
TEST_SLACK_START_TIME = timestamp_pb2.Timestamp()
157+
TEST_SLACK_START_TIME.GetCurrentTime()
158+
TEST_SLACK_END_TIME = timestamp_pb2.Timestamp()
159+
TEST_SLACK_END_TIME.GetCurrentTime()
160+
TEST_SLACK_API_KEY_SECRET_VERSION = (
161+
"projects/test-project/secrets/test-secret/versions/1"
162+
)
163+
TEST_SLACK_API_KEY_SECRET_VERSION_2 = (
164+
"projects/test-project/secrets/test-secret/versions/2"
165+
)
166+
TEST_SLACK_SOURCE = rag.SlackChannelsSource(
167+
channels=[
168+
rag.SlackChannel(
169+
channel_id=TEST_SLACK_CHANNEL_ID,
170+
api_key=TEST_SLACK_API_KEY_SECRET_VERSION,
171+
start_time=TEST_SLACK_START_TIME,
172+
end_time=TEST_SLACK_END_TIME,
173+
),
174+
rag.SlackChannel(
175+
channel_id=TEST_SLACK_CHANNEL_ID_2,
176+
api_key=TEST_SLACK_API_KEY_SECRET_VERSION_2,
177+
),
178+
],
179+
)
180+
TEST_IMPORT_FILES_CONFIG_SLACK_SOURCE = ImportRagFilesConfig(
181+
rag_file_chunking_config=RagFileChunkingConfig(
182+
chunk_size=TEST_CHUNK_SIZE,
183+
chunk_overlap=TEST_CHUNK_OVERLAP,
184+
)
185+
)
186+
TEST_IMPORT_FILES_CONFIG_SLACK_SOURCE.slack_source.channels = [
187+
GapicSlackSource.SlackChannels(
188+
channels=[
189+
GapicSlackSource.SlackChannels.SlackChannel(
190+
channel_id=TEST_SLACK_CHANNEL_ID,
191+
start_time=TEST_SLACK_START_TIME,
192+
end_time=TEST_SLACK_END_TIME,
193+
),
194+
],
195+
api_key_config=api_auth.ApiAuth.ApiKeyConfig(
196+
api_key_secret_version=TEST_SLACK_API_KEY_SECRET_VERSION
197+
),
198+
),
199+
GapicSlackSource.SlackChannels(
200+
channels=[
201+
GapicSlackSource.SlackChannels.SlackChannel(
202+
channel_id=TEST_SLACK_CHANNEL_ID_2,
203+
start_time=None,
204+
end_time=None,
205+
),
206+
],
207+
api_key_config=api_auth.ApiAuth.ApiKeyConfig(
208+
api_key_secret_version=TEST_SLACK_API_KEY_SECRET_VERSION_2
209+
),
210+
),
211+
]
212+
TEST_IMPORT_REQUEST_SLACK_SOURCE = ImportRagFilesRequest(
213+
parent=TEST_RAG_CORPUS_RESOURCE_NAME,
214+
import_rag_files_config=TEST_IMPORT_FILES_CONFIG_SLACK_SOURCE,
215+
)
216+
# Jira sources
217+
TEST_JIRA_EMAIL = "[email protected]"
218+
TEST_JIRA_PROJECT = "test-project"
219+
TEST_JIRA_CUSTOM_QUERY = "test-custom-query"
220+
TEST_JIRA_SERVER_URI = "test.atlassian.net"
221+
TEST_JIRA_API_KEY_SECRET_VERSION = (
222+
"projects/test-project/secrets/test-secret/versions/1"
223+
)
224+
TEST_JIRA_SOURCE = rag.JiraSource(
225+
queries=[
226+
rag.JiraQuery(
227+
email=TEST_JIRA_EMAIL,
228+
jira_projects=[TEST_JIRA_PROJECT],
229+
custom_queries=[TEST_JIRA_CUSTOM_QUERY],
230+
api_key=TEST_JIRA_API_KEY_SECRET_VERSION,
231+
server_uri=TEST_JIRA_SERVER_URI,
232+
)
233+
],
234+
)
235+
TEST_IMPORT_FILES_CONFIG_JIRA_SOURCE = ImportRagFilesConfig(
236+
rag_file_chunking_config=RagFileChunkingConfig(
237+
chunk_size=TEST_CHUNK_SIZE,
238+
chunk_overlap=TEST_CHUNK_OVERLAP,
239+
)
240+
)
241+
TEST_IMPORT_FILES_CONFIG_JIRA_SOURCE.jira_source.jira_queries = [
242+
GapicJiraSource.JiraQueries(
243+
custom_queries=[TEST_JIRA_CUSTOM_QUERY],
244+
projects=[TEST_JIRA_PROJECT],
245+
email=TEST_JIRA_EMAIL,
246+
server_uri=TEST_JIRA_SERVER_URI,
247+
api_key_config=api_auth.ApiAuth.ApiKeyConfig(
248+
api_key_secret_version=TEST_JIRA_API_KEY_SECRET_VERSION
249+
),
250+
)
251+
]
252+
TEST_IMPORT_REQUEST_JIRA_SOURCE = ImportRagFilesRequest(
253+
parent=TEST_RAG_CORPUS_RESOURCE_NAME,
254+
import_rag_files_config=TEST_IMPORT_FILES_CONFIG_JIRA_SOURCE,
255+
)
152256

153257
# Retrieval
154258
TEST_QUERY_TEXT = "What happen to the fox and the dog?"
@@ -162,11 +266,11 @@
162266
]
163267
)
164268
TEST_RETRIEVAL_RESPONSE = RetrieveContextsResponse(contexts=TEST_CONTEXTS)
165-
TEST_RAG_RESOURCE = RagResource(
269+
TEST_RAG_RESOURCE = rag.RagResource(
166270
rag_corpus=TEST_RAG_CORPUS_RESOURCE_NAME,
167271
rag_file_ids=[TEST_RAG_FILE_ID],
168272
)
169-
TEST_RAG_RESOURCE_INVALID_NAME = RagResource(
273+
TEST_RAG_RESOURCE_INVALID_NAME = rag.RagResource(
170274
rag_corpus="213lkj-1/23jkl/",
171275
rag_file_ids=[TEST_RAG_FILE_ID],
172276
)

tests/unit/vertex_rag/test_rag_data.py

+26
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,14 @@ def import_files_request_eq(returned_request, expected_request):
158158
returned_request.import_rag_files_config.google_drive_source.resource_ids
159159
== expected_request.import_rag_files_config.google_drive_source.resource_ids
160160
)
161+
assert (
162+
returned_request.import_rag_files_config.slack_source.channels
163+
== expected_request.import_rag_files_config.slack_source.channels
164+
)
165+
assert (
166+
returned_request.import_rag_files_config.jira_source.jira_queries
167+
== expected_request.import_rag_files_config.jira_source.jira_queries
168+
)
161169

162170

163171
@pytest.mark.usefixtures("google_auth_mock")
@@ -421,6 +429,24 @@ def test_prepare_import_files_request_invalid_path(self):
421429
)
422430
e.match("path must be a Google Cloud Storage uri or a Google Drive url")
423431

432+
def test_prepare_import_files_request_slack_source(self):
433+
request = prepare_import_files_request(
434+
corpus_name=tc.TEST_RAG_CORPUS_RESOURCE_NAME,
435+
source=tc.TEST_SLACK_SOURCE,
436+
chunk_size=tc.TEST_CHUNK_SIZE,
437+
chunk_overlap=tc.TEST_CHUNK_OVERLAP,
438+
)
439+
import_files_request_eq(request, tc.TEST_IMPORT_REQUEST_SLACK_SOURCE)
440+
441+
def test_prepare_import_files_request_jira_source(self):
442+
request = prepare_import_files_request(
443+
corpus_name=tc.TEST_RAG_CORPUS_RESOURCE_NAME,
444+
source=tc.TEST_JIRA_SOURCE,
445+
chunk_size=tc.TEST_CHUNK_SIZE,
446+
chunk_overlap=tc.TEST_CHUNK_OVERLAP,
447+
)
448+
import_files_request_eq(request, tc.TEST_IMPORT_REQUEST_JIRA_SOURCE)
449+
424450
def test_set_embedding_model_config_set_both_error(self):
425451
embedding_model_config = rag.EmbeddingModelConfig(
426452
publisher_model="whatever",

vertexai/preview/rag/__init__.py

+12
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,13 @@
3838
)
3939
from vertexai.preview.rag.utils.resources import (
4040
EmbeddingModelConfig,
41+
JiraSource,
42+
JiraQuery,
43+
RagCorpus,
44+
RagFile,
4145
RagResource,
46+
SlackChannel,
47+
SlackChannelsSource,
4248
)
4349

4450

@@ -58,4 +64,10 @@
5864
"Retrieval",
5965
"VertexRagStore",
6066
"RagResource",
67+
"RagFile",
68+
"RagCorpus",
69+
"JiraSource",
70+
"JiraQuery",
71+
"SlackChannel",
72+
"SlackChannelsSource",
6173
)

0 commit comments

Comments
 (0)