ibm-watsonx-orchestrate 1.10.0b0__py3-none-any.whl → 1.11.0b0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. ibm_watsonx_orchestrate/__init__.py +1 -3
  2. ibm_watsonx_orchestrate/agent_builder/connections/__init__.py +1 -1
  3. ibm_watsonx_orchestrate/agent_builder/connections/connections.py +1 -1
  4. ibm_watsonx_orchestrate/agent_builder/connections/types.py +68 -17
  5. ibm_watsonx_orchestrate/agent_builder/knowledge_bases/types.py +47 -3
  6. ibm_watsonx_orchestrate/agent_builder/toolkits/types.py +18 -15
  7. ibm_watsonx_orchestrate/agent_builder/tools/types.py +1 -1
  8. ibm_watsonx_orchestrate/cli/commands/connections/connections_command.py +40 -11
  9. ibm_watsonx_orchestrate/cli/commands/connections/connections_controller.py +96 -30
  10. ibm_watsonx_orchestrate/cli/commands/knowledge_bases/knowledge_bases_controller.py +32 -10
  11. ibm_watsonx_orchestrate/cli/commands/server/server_command.py +95 -17
  12. ibm_watsonx_orchestrate/cli/commands/server/types.py +14 -6
  13. ibm_watsonx_orchestrate/cli/commands/toolkit/toolkit_command.py +43 -10
  14. ibm_watsonx_orchestrate/cli/commands/toolkit/toolkit_controller.py +52 -25
  15. ibm_watsonx_orchestrate/client/connections/connections_client.py +4 -3
  16. ibm_watsonx_orchestrate/client/knowledge_bases/knowledge_base_client.py +4 -4
  17. ibm_watsonx_orchestrate/docker/compose-lite.yml +52 -13
  18. ibm_watsonx_orchestrate/docker/default.env +21 -14
  19. ibm_watsonx_orchestrate/flow_builder/data_map.py +4 -1
  20. ibm_watsonx_orchestrate/flow_builder/flows/__init__.py +2 -0
  21. ibm_watsonx_orchestrate/flow_builder/flows/flow.py +204 -17
  22. ibm_watsonx_orchestrate/flow_builder/node.py +114 -19
  23. ibm_watsonx_orchestrate/flow_builder/types.py +206 -34
  24. ibm_watsonx_orchestrate/run/connections.py +2 -2
  25. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.11.0b0.dist-info}/METADATA +1 -1
  26. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.11.0b0.dist-info}/RECORD +29 -29
  27. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.11.0b0.dist-info}/WHEEL +0 -0
  28. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.11.0b0.dist-info}/entry_points.txt +0 -0
  29. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.11.0b0.dist-info}/licenses/LICENSE +0 -0
@@ -5,9 +5,7 @@
5
5
 
6
6
  pkg_name = "ibm-watsonx-orchestrate"
7
7
 
8
- __version__ = "1.10.0b0"
9
-
10
-
8
+ __version__ = "1.11.0b0"
11
9
 
12
10
 
13
11
  from ibm_watsonx_orchestrate.utils.logging.logger import setup_logging
@@ -18,7 +18,7 @@ from .types import (
18
18
  OAuth2AuthCodeCredentials,
19
19
  OAuth2ClientCredentials,
20
20
  # OAuth2ImplicitCredentials,
21
- # OAuth2PasswordCredentials,
21
+ OAuth2PasswordCredentials,
22
22
  OAuthOnBehalfOfCredentials,
23
23
  KeyValueConnectionCredentials,
24
24
  CONNECTION_KIND_SCHEME_MAPPING,
@@ -37,7 +37,7 @@ connection_type_security_schema_map = {
37
37
  ConnectionType.OAUTH2_CLIENT_CREDS: ConnectionSecurityScheme.OAUTH2,
38
38
  ConnectionType.OAUTH_ON_BEHALF_OF_FLOW: ConnectionSecurityScheme.OAUTH2,
39
39
  # ConnectionType.OAUTH2_IMPLICIT: ConnectionSecurityScheme.OAUTH2,
40
- # ConnectionType.OAUTH2_PASSWORD: ConnectionSecurityScheme.OAUTH2
40
+ ConnectionType.OAUTH2_PASSWORD: ConnectionSecurityScheme.OAUTH2
41
41
  }
42
42
 
43
43
  def _clean_env_vars(vars: dict[str:str], requirements: List[str], app_id: str) -> dict[str,str]:
@@ -8,7 +8,7 @@ class ConnectionKind(str, Enum):
8
8
  api_key = 'api_key'
9
9
  oauth_auth_code_flow = 'oauth_auth_code_flow'
10
10
  # oauth_auth_implicit_flow = 'oauth_auth_implicit_flow'
11
- # oauth_auth_password_flow = 'oauth_auth_password_flow'
11
+ oauth_auth_password_flow = 'oauth_auth_password_flow'
12
12
  oauth_auth_client_credentials_flow = 'oauth_auth_client_credentials_flow'
13
13
  oauth_auth_on_behalf_of_flow = 'oauth_auth_on_behalf_of_flow'
14
14
  key_value = 'key_value'
@@ -34,7 +34,7 @@ class ConnectionPreference(str, Enum):
34
34
  class ConnectionAuthType(str, Enum):
35
35
  OAUTH2_AUTH_CODE = 'oauth2_auth_code'
36
36
  # OAUTH2_IMPLICIT = 'oauth2_implicit'
37
- # OAUTH2_PASSWORD = 'oauth2_password'
37
+ OAUTH2_PASSWORD = 'oauth2_password'
38
38
  OAUTH2_CLIENT_CREDS = 'oauth2_client_creds'
39
39
  OAUTH_ON_BEHALF_OF_FLOW = 'oauth_on_behalf_of_flow'
40
40
 
@@ -65,7 +65,7 @@ class ConnectionType(str, Enum):
65
65
  API_KEY_AUTH = ConnectionSecurityScheme.API_KEY_AUTH.value
66
66
  OAUTH2_AUTH_CODE = ConnectionAuthType.OAUTH2_AUTH_CODE.value
67
67
  # OAUTH2_IMPLICIT = ConnectionAuthType.OAUTH2_IMPLICIT.value
68
- # OAUTH2_PASSWORD = ConnectionAuthType.OAUTH2_PASSWORD.value
68
+ OAUTH2_PASSWORD = ConnectionAuthType.OAUTH2_PASSWORD.value
69
69
  OAUTH2_CLIENT_CREDS = ConnectionAuthType.OAUTH2_CLIENT_CREDS.value
70
70
  OAUTH_ON_BEHALF_OF_FLOW = ConnectionAuthType.OAUTH_ON_BEHALF_OF_FLOW.value
71
71
  KEY_VALUE = ConnectionSecurityScheme.KEY_VALUE.value
@@ -90,7 +90,7 @@ OAUTH_CONNECTION_TYPES = {
90
90
  ConnectionType.OAUTH2_AUTH_CODE,
91
91
  ConnectionType.OAUTH2_CLIENT_CREDS,
92
92
  # ConnectionType.OAUTH2_IMPLICIT,
93
- # ConnectionType.OAUTH2_PASSWORD,
93
+ ConnectionType.OAUTH2_PASSWORD,
94
94
  ConnectionType.OAUTH_ON_BEHALF_OF_FLOW,
95
95
  }
96
96
 
@@ -165,6 +165,53 @@ class ConnectionConfiguration(BaseModel):
165
165
  raise ValueError("Connection of type 'key_value' cannot be configured at the 'member' level. Key value connections must be of type 'team'")
166
166
  return self
167
167
 
168
+ class ConnectionCredentialsEntryLocation(str, Enum):
169
+ BODY = 'body'
170
+ HEADER = 'header',
171
+ QUERY = 'query'
172
+
173
+ def __str__(self):
174
+ return self.value
175
+
176
+ class ConnectionCredentialsEntry(BaseModel):
177
+ key: str
178
+ value: str
179
+ location: ConnectionCredentialsEntryLocation
180
+
181
+ def __str__(self):
182
+ return f"<ConnectionCredentialsEntry: {self.location}:{self.key}={self.value}>"
183
+
184
+ class BaseOAuthCredentials(BaseModel):
185
+ custom_token_query: Optional[dict] = None
186
+ custom_token_header: Optional[dict] = None
187
+ custom_token_body: Optional[dict] = None
188
+ custom_auth_query: Optional[dict] = None
189
+
190
+ class ConnectionCredentialsCustomFields(BaseOAuthCredentials):
191
+ def add_field(self, entry: ConnectionCredentialsEntry, is_token:bool=True) -> None:
192
+ match entry.location:
193
+ case ConnectionCredentialsEntryLocation.HEADER:
194
+ if not is_token:
195
+ return
196
+ attribute = "custom_token_header"
197
+ case ConnectionCredentialsEntryLocation.BODY:
198
+ if not is_token:
199
+ return
200
+ attribute = "custom_token_body"
201
+ case ConnectionCredentialsEntryLocation.QUERY:
202
+ if is_token:
203
+ attribute = "custom_token_query"
204
+ else:
205
+ attribute = "custom_auth_query"
206
+ case _:
207
+ return
208
+
209
+ fields = getattr(self, attribute)
210
+ if not fields:
211
+ setattr(self, attribute, {})
212
+ fields = getattr(self, attribute)
213
+ fields[entry.key] = entry.value
214
+
168
215
  class BasicAuthCredentials(BaseModel):
169
216
  username: str
170
217
  password: str
@@ -182,7 +229,7 @@ class OAuth2TokenCredentials(BaseModel):
182
229
  access_token: str
183
230
  url: Optional[str] = None
184
231
 
185
- class OAuth2AuthCodeCredentials(BaseModel):
232
+ class OAuth2AuthCodeCredentials(BaseOAuthCredentials):
186
233
  client_id: str
187
234
  client_secret: str
188
235
  token_url: str
@@ -193,13 +240,17 @@ class OAuth2AuthCodeCredentials(BaseModel):
193
240
  # client_id: str
194
241
  # authorization_url: str
195
242
 
196
- # class OAuth2PasswordCredentials(BaseModel):
197
- # client_id: str
198
- # client_secret: str
199
- # token_url: str
200
- # authorization_url: str
243
+ class OAuth2PasswordCredentials(BaseOAuthCredentials):
244
+ username: str
245
+ password: str
246
+ client_id: str
247
+ client_secret: str
248
+ token_url: str
249
+ scope: Optional[str] = None
250
+ grant_type: str = "password"
251
+
201
252
 
202
- class OAuth2ClientCredentials(BaseModel):
253
+ class OAuth2ClientCredentials(BaseOAuthCredentials):
203
254
  client_id: str
204
255
  client_secret: str
205
256
  token_url: str
@@ -207,7 +258,7 @@ class OAuth2ClientCredentials(BaseModel):
207
258
  send_via: ConnectionSendVia = ConnectionSendVia.HEADER
208
259
  grant_type: str = "client_credentials"
209
260
 
210
- class OAuthOnBehalfOfCredentials(BaseModel):
261
+ class OAuthOnBehalfOfCredentials(BaseOAuthCredentials):
211
262
  client_id: str
212
263
  access_token_url: str
213
264
  grant_type: str
@@ -226,7 +277,7 @@ CREDENTIALS_SET = Union[
226
277
  APIKeyAuthCredentials,
227
278
  OAuth2AuthCodeCredentials,
228
279
  # OAuth2ImplicitCredentials,
229
- # OAuth2PasswordCredentials,
280
+ OAuth2PasswordCredentials,
230
281
  OAuth2ClientCredentials,
231
282
  OAuthOnBehalfOfCredentials,
232
283
  KeyValueConnectionCredentials
@@ -240,7 +291,7 @@ CONNECTION_KIND_SCHEME_MAPPING = {
240
291
  ConnectionKind.api_key: ConnectionSecurityScheme.API_KEY_AUTH,
241
292
  ConnectionKind.oauth_auth_code_flow: ConnectionSecurityScheme.OAUTH2,
242
293
  # ConnectionKind.oauth_auth_implicit_flow: ConnectionSecurityScheme.OAUTH2,
243
- # ConnectionKind.oauth_auth_password_flow: ConnectionSecurityScheme.OAUTH2,
294
+ ConnectionKind.oauth_auth_password_flow: ConnectionSecurityScheme.OAUTH2,
244
295
  ConnectionKind.oauth_auth_client_credentials_flow: ConnectionSecurityScheme.OAUTH2,
245
296
  ConnectionKind.oauth_auth_on_behalf_of_flow: ConnectionSecurityScheme.OAUTH2,
246
297
  ConnectionKind.key_value: ConnectionSecurityScheme.KEY_VALUE,
@@ -250,7 +301,7 @@ CONNECTION_KIND_SCHEME_MAPPING = {
250
301
  CONNECTION_KIND_OAUTH_TYPE_MAPPING = {
251
302
  ConnectionKind.oauth_auth_code_flow: ConnectionAuthType.OAUTH2_AUTH_CODE,
252
303
  # ConnectionKind.oauth_auth_implicit_flow: ConnectionAuthType.OAUTH2_IMPLICIT,
253
- # ConnectionKind.oauth_auth_password_flow: ConnectionAuthType.OAUTH2_PASSWORD,
304
+ ConnectionKind.oauth_auth_password_flow: ConnectionAuthType.OAUTH2_PASSWORD,
254
305
  ConnectionKind.oauth_auth_client_credentials_flow: ConnectionAuthType.OAUTH2_CLIENT_CREDS,
255
306
  ConnectionKind.oauth_auth_on_behalf_of_flow: ConnectionAuthType.OAUTH_ON_BEHALF_OF_FLOW,
256
307
  }
@@ -263,7 +314,7 @@ CONNECTION_TYPE_CREDENTIAL_MAPPING = {
263
314
  ConnectionSecurityScheme.KEY_VALUE: KeyValueConnectionCredentials,
264
315
  }
265
316
 
266
- class IdentityProviderCredentials(BaseModel):
317
+ class IdentityProviderCredentials(BaseOAuthCredentials):
267
318
  idp_url: str = Field(validation_alias=AliasChoices('idp_url', 'url'), serialization_alias='idp_url')
268
319
  client_id: str
269
320
  client_secret: str
@@ -272,4 +323,4 @@ class IdentityProviderCredentials(BaseModel):
272
323
 
273
324
  class ExpectedCredentials(BaseModel):
274
325
  app_id: str
275
- type: ConnectionType | List[ConnectionType]
326
+ type: ConnectionType | List[ConnectionType]
@@ -11,6 +11,7 @@ class SpecVersion(str, Enum):
11
11
  class KnowledgeBaseKind(str, Enum):
12
12
  KNOWLEDGE_BASE = "knowledge_base"
13
13
  class RetrievalConfidenceThreshold(str, Enum):
14
+ Off = "Off"
14
15
  Lowest = "Lowest"
15
16
  Low = "Low"
16
17
  High = "High"
@@ -24,6 +25,7 @@ class GeneratedResponseLength(str, Enum):
24
25
 
25
26
 
26
27
  class ResponseConfidenceThreshold(str, Enum):
28
+ Off = "Off"
27
29
  Lowest = "Lowest"
28
30
  Low = "Low"
29
31
  High = "High"
@@ -86,6 +88,8 @@ class GenerationConfiguration(BaseModel):
86
88
  {
87
89
  "model_id": "meta-llama/llama-3-1-70b-instruct",
88
90
  "prompt_instruction": "When the documents are in different languages, you should respond in english.",
91
+ "max_docs_passed_to_llm": 10,
92
+ "retrieval_confidence_threshold": "Lowest",
89
93
  "generated_response_length": "Moderate",
90
94
  "display_text_no_results_found": "no docs found",
91
95
  "display_text_connectivity_issue": "conn failed",
@@ -95,6 +99,7 @@ class GenerationConfiguration(BaseModel):
95
99
 
96
100
  model_id: Optional[str] = None
97
101
  prompt_instruction: Optional[str] = None
102
+ max_docs_passed_to_llm: Optional[int] = None
98
103
  generated_response_length: Optional[GeneratedResponseLength] = None
99
104
  display_text_no_results_found: Optional[str] = None
100
105
  display_text_connectivity_issue: Optional[str] = None
@@ -134,12 +139,13 @@ class MilvusConnection(BaseModel):
134
139
  }
135
140
  """
136
141
  grpc_host: Optional[str] = None
142
+ grpc_port: Optional[str] = None
143
+ server_cert: Optional[str] = None
137
144
  database: Optional[str] = None
138
145
  collection: Optional[str] = None
139
146
  index: Optional[str] = None
140
147
  embedding_model_id: Optional[str] = None
141
148
  limit : Optional[int] = None
142
- grpc_port: Optional[str] = None
143
149
  filter: Optional[str] = None
144
150
  field_mapping: Optional[FieldMapping] = None
145
151
 
@@ -197,12 +203,46 @@ class CustomSearchConnection(BaseModel):
197
203
  filter: Optional[str] = None
198
204
  metadata: Optional[dict] = None
199
205
 
206
+ class AstraDBConnection(BaseModel):
207
+ """
208
+ example:
209
+ {
210
+ "api_endpoint": "https://xxx-us-east-2.apps.astra.datastax.com",
211
+ "key_space": "default_keyspace",
212
+ "collection": "search_wa_docs",
213
+ "embedding_model_id": "sentence-transformers/all-minilm-l12-v2",
214
+ "port": "443",
215
+ "filter": "productType: \"boots\"",
216
+ "limit": 5,
217
+ "field_mapping": {
218
+ "title": "title",
219
+ "body": "text",
220
+ "url": "some-url"
221
+ }
222
+ }
223
+ """
224
+ api_endpoint: str
225
+ port: Optional[str] = None
226
+ server_cert: Optional[str] = None
227
+ keyspace: Optional[str]
228
+ data_type: str
229
+ collection: Optional[str]
230
+ table: Optional[str]
231
+ index_column: Optional[str]
232
+ embedding_mode: str
233
+ embedding_model_id: Optional[str]
234
+ credentials: dict
235
+ search_mode: str
236
+ limit: Optional[int] = 5
237
+ filter: Optional[str] = None
238
+ field_mapping: Optional[FieldMapping] = None
239
+
200
240
  class IndexConnection(BaseModel):
201
241
  connection_id: Optional[str] = None
202
242
  milvus: Optional[MilvusConnection] = None
203
243
  elastic_search: Optional[ElasticSearchConnection] = None
204
244
  custom_search: Optional[CustomSearchConnection] = None
205
-
245
+ astradb: Optional[AstraDBConnection] = None
206
246
 
207
247
  class ConversationalSearchConfig(BaseModel):
208
248
  language: Optional[str] = None
@@ -218,6 +258,10 @@ class KnowledgeBaseBuiltInVectorIndexConfig(BaseModel):
218
258
  chunk_size: Optional[int] = None
219
259
  chunk_overlap: Optional[int] = None
220
260
  limit: Optional[int] = None
261
+
262
+ class FileUpload(BaseModel):
263
+ path: str
264
+ url: Optional[str] = None
221
265
 
222
266
  class KnowledgeBaseSpec(BaseModel):
223
267
  """Schema for a complete knowledge-base."""
@@ -236,4 +280,4 @@ class KnowledgeBaseSpec(BaseModel):
236
280
  created_on: Optional[datetime] = None
237
281
  updated_at: Optional[datetime] = None
238
282
  # For import/update
239
- documents: list[str] = None
283
+ documents: list[str] | list[FileUpload] = None
@@ -1,27 +1,36 @@
1
- from typing import List, Dict, Optional
1
+ from typing import List, Dict, Optional, Union
2
2
  from enum import Enum
3
- from pydantic import BaseModel, model_validator
3
+ from pydantic import BaseModel
4
4
 
5
5
  class ToolkitKind(str, Enum):
6
6
  MCP = "mcp"
7
7
 
8
- class Language(str, Enum):
9
- NODE = "node"
10
- PYTHON ="python"
11
-
12
8
  class ToolkitSource(str, Enum):
13
9
  FILES = "files"
14
10
  PUBLIC_REGISTRY = "public-registry"
15
11
 
12
+ class ToolkitTransportKind(str, Enum):
13
+ STREAMABLE_HTTP = "streamable_http"
14
+ SSE = "sse"
16
15
 
16
+ class Language(str, Enum):
17
+ NODE = "node"
18
+ PYTHON ="python"
17
19
 
18
- class McpModel(BaseModel):
19
- source: str
20
+ class LocalMcpModel(BaseModel):
21
+ source: ToolkitSource
20
22
  command: str
21
23
  args: List[str]
22
24
  tools: List[str]
23
25
  connections: Dict[str, str]
24
26
 
27
+ class RemoteMcpModel(BaseModel):
28
+ server_url: str
29
+ transport: ToolkitTransportKind
30
+ tools: List[str]
31
+ connections: Dict[str, str]
32
+
33
+ McpModel = Union[LocalMcpModel, RemoteMcpModel]
25
34
 
26
35
  class ToolkitSpec(BaseModel):
27
36
  id: str
@@ -33,10 +42,4 @@ class ToolkitSpec(BaseModel):
33
42
  created_by: str
34
43
  created_by_username: str
35
44
  tools: List[str] | None
36
- mcp: McpModel
37
-
38
- @model_validator(mode='after')
39
- def validate_tools_and_mcp(self) -> 'ToolkitSpec':
40
- if self.mcp.source not in {"files", "public-registry"}:
41
- raise ValueError("MCP source must be either 'files' or 'public-registry'.")
42
- return self
45
+ mcp: McpModel
@@ -152,7 +152,7 @@ class ClientSideToolBinding(BaseModel):
152
152
 
153
153
  class McpToolBinding(BaseModel):
154
154
  server_url: Optional[str] = None
155
- source: str
155
+ source: str | None
156
156
  connections: Dict[str, str] | None
157
157
 
158
158
  class FlowToolBinding(BaseModel):
@@ -1,6 +1,6 @@
1
1
  import typer
2
2
  from typing_extensions import Annotated, List
3
- from ibm_watsonx_orchestrate.agent_builder.connections.types import ConnectionEnvironment, ConnectionPreference, ConnectionKind
3
+ from ibm_watsonx_orchestrate.agent_builder.connections.types import ConnectionEnvironment, ConnectionPreference, ConnectionKind, ConnectionCredentialsEntry
4
4
  from ibm_watsonx_orchestrate.cli.commands.connections.connections_controller import (
5
5
  add_connection,
6
6
  remove_connection,
@@ -8,7 +8,9 @@ from ibm_watsonx_orchestrate.cli.commands.connections.connections_controller imp
8
8
  import_connection,
9
9
  configure_connection,
10
10
  set_credentials_connection,
11
- set_identity_provider_connection
11
+ set_identity_provider_connection,
12
+ token_entry_connection_credentials_parse,
13
+ auth_entry_connection_credentials_parse
12
14
  )
13
15
 
14
16
  connections_app = typer.Typer(no_args_is_help=True)
@@ -160,7 +162,7 @@ def set_credentials_connection_command(
160
162
  typer.Option(
161
163
  '--username',
162
164
  '-u',
163
- help='For basic auth, the username to login with'
165
+ help='For basic auth and oauth_auth_password_flow, the username to login with'
164
166
  )
165
167
  ] = None,
166
168
  password: Annotated[
@@ -168,7 +170,7 @@ def set_credentials_connection_command(
168
170
  typer.Option(
169
171
  '--password',
170
172
  '-p',
171
- help='For basic auth, the password to login with'
173
+ help='For basic auth and oauth_auth_password_flow, the password to login with'
172
174
  )
173
175
  ] = None,
174
176
  token: Annotated[
@@ -191,14 +193,14 @@ def set_credentials_connection_command(
191
193
  typer.Option(
192
194
  '--client-id',
193
195
  # help='For oauth_auth_on_behalf_of_flow, oauth_auth_code_flow, oauth_auth_implicit_flow, oauth_auth_password_flow and oauth_auth_client_credentials_flow, the client_id to authenticate against the application token server'
194
- help='For oauth_auth_on_behalf_of_flow and oauth_auth_client_credentials_flow, the client_id to authenticate against the application token server'
196
+ help='For oauth_auth_on_behalf_of_flow, oauth_auth_password_flow and oauth_auth_client_credentials_flow, the client_id to authenticate against the application token server'
195
197
  )
196
198
  ] = None,
197
199
  client_secret: Annotated[
198
200
  str,
199
201
  typer.Option(
200
202
  '--client-secret',
201
- help='For oauth_auth_client_credentials_flow, the client_secret to authenticate with'
203
+ help='For oauth_auth_client_credentials_flow and oauth_auth_password_flow, the client_secret to authenticate with'
202
204
  )
203
205
  ] = None,
204
206
  send_via: Annotated[
@@ -213,7 +215,7 @@ def set_credentials_connection_command(
213
215
  typer.Option(
214
216
  '--token-url',
215
217
  # help='For oauth_auth_on_behalf_of_flow, oauth_auth_code_flow, oauth_auth_password_flow and oauth_auth_client_credentials_flow, the url of the application token server'
216
- help='For oauth_auth_on_behalf_of_flow and oauth_auth_client_credentials_flow, the url of the application token server'
218
+ help='For oauth_auth_on_behalf_of_flow, oauth_auth_password_flow and oauth_auth_client_credentials_flow, the url of the application token server'
217
219
  )
218
220
  ] = None,
219
221
  auth_url: Annotated[
@@ -227,14 +229,14 @@ def set_credentials_connection_command(
227
229
  str,
228
230
  typer.Option(
229
231
  '--grant-type',
230
- help='For oauth_auth_on_behalf_of_flow and oauth_auth_client_credentials_flow, the grant type used by the application token server'
232
+ help='For oauth_auth_on_behalf_of_flow, oauth_auth_password_flow and oauth_auth_client_credentials_flow, the grant type used by the application token server'
231
233
  )
232
234
  ] = None,
233
235
  scope: Annotated[
234
236
  str,
235
237
  typer.Option(
236
238
  '--scope',
237
- help='For oauth_auth_code_flow and oauth_auth_client_credentials_flow, the optional scopes used by the application token server. Should be in the form of a space seperated string.'
239
+ help='For oauth_auth_code_flow, oauth_auth_password_flow and oauth_auth_client_credentials_flow, the optional scopes used by the application token server. Should be in the form of a space seperated string.'
238
240
  )
239
241
  ] = None,
240
242
  entries: Annotated[
@@ -244,6 +246,22 @@ def set_credentials_connection_command(
244
246
  help="For key_value, a key value pair in the form '<key>=<value>'. Multiple values can be passed using `-e key1=value1 -e key2=value2`"
245
247
  )
246
248
  ] = None,
249
+ token_entries: Annotated[
250
+ List[ConnectionCredentialsEntry],
251
+ typer.Option(
252
+ '--token-entries', "-t",
253
+ parser=token_entry_connection_credentials_parse,
254
+ help="Custom field options for oauth types token request, a key value location option in the form 'location:<key>=<value>' or '<key>=<value>' with location defaulting to 'header'. Multiple values can be passed using `-t key1=value1 -t location:key2=value2`"
255
+ )
256
+ ] = None,
257
+ auth_entries: Annotated[
258
+ List[ConnectionCredentialsEntry],
259
+ typer.Option(
260
+ '--auth-entries',
261
+ parser=auth_entry_connection_credentials_parse,
262
+ help="Custom field options for oauth_auth_code_flow auth server request, a key value location option in the form 'location:<key>=<value>' or '<key>=<value>' with location defaulting to 'query'. Note only 'query' is a valid location. Multiple values can be passed using `--auth-entries key1=value1 --auth-entries location:key2=value2`"
263
+ )
264
+ ] = None,
247
265
  ):
248
266
  set_credentials_connection(
249
267
  app_id=app_id,
@@ -259,7 +277,9 @@ def set_credentials_connection_command(
259
277
  auth_url=auth_url,
260
278
  grant_type=grant_type,
261
279
  scope=scope,
262
- entries=entries
280
+ entries=entries,
281
+ token_entries=token_entries,
282
+ auth_entries=auth_entries
263
283
  )
264
284
 
265
285
  @connections_app.command(name="set-identity-provider")
@@ -311,6 +331,14 @@ def set_identity_provider_connection_command(
311
331
  help='The grant-type of the the identity provider'
312
332
  )
313
333
  ],
334
+ token_entries: Annotated[
335
+ List[ConnectionCredentialsEntry],
336
+ typer.Option(
337
+ '--token-entries', "-t",
338
+ parser=token_entry_connection_credentials_parse,
339
+ help="Custom field options for oauth types token request, a key value location option in the form 'location:<key>=<value>' or '<key>=<value>' with location defaulting to 'header'. Multiple values can be passed using `-t key1=value1 -t location:key2=value2`"
340
+ )
341
+ ] = None,
314
342
  ):
315
343
  set_identity_provider_connection(
316
344
  app_id=app_id,
@@ -319,5 +347,6 @@ def set_identity_provider_connection_command(
319
347
  client_id=client_id,
320
348
  client_secret=client_secret,
321
349
  scope=scope,
322
- grant_type=grant_type
350
+ grant_type=grant_type,
351
+ token_entries=token_entries
323
352
  )