salesforce-data-customcode 6.1.0.dev5__py3-none-any.whl → 6.1.0.dev7__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 (36) hide show
  1. datacustomcode/client.py +99 -0
  2. datacustomcode/config.yaml +6 -0
  3. datacustomcode/deploy.py +7 -2
  4. datacustomcode/function/runtime.py +16 -0
  5. datacustomcode/named_credential/__init__.py +28 -0
  6. datacustomcode/named_credential/base.py +54 -0
  7. datacustomcode/named_credential/default.py +93 -0
  8. datacustomcode/named_credential/direct/__init__.py +19 -0
  9. datacustomcode/named_credential/direct/auth.py +191 -0
  10. datacustomcode/named_credential/direct/credentials.py +122 -0
  11. datacustomcode/named_credential/direct/transport.py +110 -0
  12. datacustomcode/named_credential/direct/url_resolver.py +112 -0
  13. datacustomcode/named_credential/errors.py +36 -0
  14. datacustomcode/named_credential/spark_base.py +93 -0
  15. datacustomcode/named_credential/spark_default.py +154 -0
  16. datacustomcode/named_credential/types/__init__.py +14 -0
  17. datacustomcode/named_credential/types/http_method.py +29 -0
  18. datacustomcode/named_credential/types/http_request.py +63 -0
  19. datacustomcode/named_credential/types/http_request_builder.py +88 -0
  20. datacustomcode/named_credential/types/http_response.py +43 -0
  21. datacustomcode/named_credential/types/http_response_builder.py +24 -0
  22. datacustomcode/named_credential_config.py +105 -0
  23. datacustomcode/run.py +7 -0
  24. datacustomcode/templates/function/example/chunking_with_external_callout/README.md +120 -0
  25. datacustomcode/templates/function/example/chunking_with_external_callout/config.json +3 -0
  26. datacustomcode/templates/function/example/chunking_with_external_callout/entrypoint.py +162 -0
  27. datacustomcode/templates/function/example/chunking_with_external_callout/external_callout_config.json +11 -0
  28. datacustomcode/templates/function/example/chunking_with_external_callout/tests/test.json +16 -0
  29. datacustomcode/templates/script/examples/external_callout/README.md +140 -0
  30. datacustomcode/templates/script/examples/external_callout/entrypoint.py +144 -0
  31. datacustomcode/templates/script/examples/external_callout/external_callout_config.json +11 -0
  32. {salesforce_data_customcode-6.1.0.dev5.dist-info → salesforce_data_customcode-6.1.0.dev7.dist-info}/METADATA +1 -1
  33. {salesforce_data_customcode-6.1.0.dev5.dist-info → salesforce_data_customcode-6.1.0.dev7.dist-info}/RECORD +36 -10
  34. {salesforce_data_customcode-6.1.0.dev5.dist-info → salesforce_data_customcode-6.1.0.dev7.dist-info}/WHEEL +0 -0
  35. {salesforce_data_customcode-6.1.0.dev5.dist-info → salesforce_data_customcode-6.1.0.dev7.dist-info}/entry_points.txt +0 -0
  36. {salesforce_data_customcode-6.1.0.dev5.dist-info → salesforce_data_customcode-6.1.0.dev7.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,140 @@
1
+ # Transform with a Gemini Named Credential Callout
2
+
3
+ The **transform** calls Google's **Gemini** `generateContent` API to summarize text, and
4
+ write the result back to a DLO. Gemini is reached through a **Named Credential**
5
+ (`callout:gemini`), so this code never handles the endpoint URL or the API key.
6
+
7
+ It shows **both** callout paths against the same Named Credential.
8
+
9
+ ## Shared request template
10
+
11
+ ```python
12
+ from datacustomcode.client import Client, named_credential_request_col
13
+
14
+ # URL, method and headers apply to every callout on this template.
15
+ request = (
16
+ HTTPRequestBuilder()
17
+ .set_url("callout:gemini") # callout:<NC name>[/<path>]
18
+ .set_method(HTTPMethod.POST)
19
+ .set_headers({"Content-Type": "application/json"})
20
+ .set_response_timeout_seconds(60) # optional: per-callout timeout (seconds)
21
+ .build()
22
+ )
23
+ ```
24
+
25
+ ## Driver path — one-shot on the driver
26
+
27
+ `Client.named_credential_request` runs the callout **once** on the driver and
28
+ returns an `HTTPResponse` (`.status_code`, `.body`, `.headers`, `.is_success`).
29
+ Use it for a lookup or a shared value you reuse across the job.
30
+
31
+ ```python
32
+ response = client.named_credential_request(request, body=json.dumps(payload))
33
+ if response.is_success:
34
+ envelope = json.loads(response.body)
35
+ text = envelope["candidates"][0]["content"]["parts"][0]["text"]
36
+ ```
37
+
38
+ ## Per-row path — fan out across the DataFrame
39
+
40
+ `named_credential_request_col` dispatches one callout per row; only the body
41
+ Column varies.
42
+
43
+ ```python
44
+ # One callout per row; body is a Column built from the row's data.
45
+ df = df.withColumn("_callout", named_credential_request_col(request, body=body_col))
46
+ ```
47
+
48
+ It returns a struct Column:
49
+
50
+ ```
51
+ {status, response: {status_code, body, headers}, error_code, error_message}
52
+ ```
53
+
54
+ - A non-2xx response is still `status = "SUCCESS"` with the HTTP code in
55
+ `response.status_code` — extracting the model text just yields null for that row.
56
+ - A transport failure sets `status = "ERROR"`; the row survives, the job does not
57
+ abort. Pull the model text out of `response.body` with `get_json_object(...)`.
58
+
59
+ Both paths resolve the same Named Credential and read auth from the same local
60
+ `external_callout_config.json`.
61
+
62
+ The `gemini` Named Credential's URL already includes the full
63
+ `/v1beta/models/<model>:generateContent` path, so the callout is just
64
+ `callout:gemini` with **no path suffix** (anything after the name is appended to
65
+ the credential's URL).
66
+
67
+ ## Configure the Named Credential
68
+
69
+ 1. Create an **External Credential** (e.g. `google_api_key`) that injects your
70
+ Gemini API key as the `X-goog-api-key` header.
71
+ 2. Create a **Named Credential** named `gemini`:
72
+ - **URL**: `https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent`
73
+ - **Enabled for Callouts** + **Generate Authorization Header**: on
74
+ - **External Credential**: `google_api_key`
75
+
76
+ ## Test locally
77
+
78
+ Copy `entrypoint.py` into your `payload/` folder (or point the run at it), then:
79
+
80
+ ```bash
81
+ DATACUSTOMCODE_EXTERNAL_CALLOUT_CONFIG=/abs/path/to/external_callout_config.json \
82
+ sf data-code-extension script run --entrypoint entrypoint.py --target-org <your-org-alias>
83
+ ```
84
+
85
+ With `----target-org` the SDK fetches only the **URL** from the org's Named
86
+ Credential; **auth is always taken from `external_callout_config.json`** locally
87
+ (the org's External Credential is used only in the Data Cloud runtime). So the
88
+ `X-goog-api-key` must be in the local config for a local test. Omit
89
+ `--target-org` to run fully offline using `target_url`.
90
+
91
+ ```json
92
+ {
93
+ "credentials": {
94
+ "callout:gemini": {
95
+ "auth_type": "Custom",
96
+ "custom_headers": { "X-goog-api-key": "YOUR_GEMINI_API_KEY" },
97
+ "target_url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent"
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ Place `external_callout_config.json` in the **parent of your payload folder** (or
104
+ point `DATACUSTOMCODE_EXTERNAL_CALLOUT_CONFIG` at it). It is never packaged into
105
+ the deployment zip. Get a key from [Google AI Studio](https://aistudio.google.com/apikey);
106
+ **do not commit it.**
107
+
108
+ ## What it reads / writes
109
+
110
+ `config.json` declares the DLO permissions for deployment:
111
+
112
+ | | DLO | Notes |
113
+ | ------ | ------------------- | --------------------------------------------- |
114
+ | read | `Account_std__dll` | source rows; `description__c` is summarized |
115
+ | write | `Account_std_copy__dll` | adds `summary__c`, `callout_status__c`, `callout_http_code__c` |
116
+
117
+ Adjust `_TEXT_COLUMN`, `_SOURCE_DLO` and `_TARGET_DLO` in `entrypoint.py` (and the
118
+ matching entries in `config.json`) to point at your own DLOs.
119
+
120
+ ## Auth types
121
+
122
+ `auth_type` selects how auth is injected for local testing. It should mirror the
123
+ External Credential your Named Credential uses in the org, so local and deployed
124
+ runs behave the same. This example uses `Custom` (Gemini's `X-goog-api-key`);
125
+ all supported types:
126
+
127
+ | `auth_type` | Fields read | Header sent |
128
+ | ----------- | ------------------------------- | --------------------------------------- |
129
+ | `Basic` | `username`, `password` | `Authorization: Basic <base64 user:pw>` |
130
+ | `Custom` | `custom_headers` (sent verbatim)| the headers you list |
131
+ | `OAuth` | `access_token` or `token` | `Authorization: Bearer <token>` |
132
+ | `Jwt` | `access_token` or `token` | `Authorization: Bearer <token>` |
133
+ | `AwsSv4` | `aws_access_key_id`, `aws_secret_access_key`, `aws_region`, `aws_service`, optional `aws_session_token` | `Authorization: AWS4-HMAC-SHA256 ...` plus `x-amz-date` / `x-amz-content-sha256` (and `x-amz-security-token` when a session token is set) |
134
+
135
+ `OAuth`/`Jwt` take a token you supply for the local run — the SDK does not fetch
136
+ or refresh it. In the Data Cloud runtime the Named Credential handles token
137
+ acquisition; this local config only stands in for that during testing.
138
+
139
+ `AwsSv4` signs the request with AWS Signature Version 4 using the keys you
140
+ supply, mirroring an AWS Signature Version 4 External Credential in the org.
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright (c) 2025, Salesforce, Inc.
3
+ # SPDX-License-Identifier: Apache-2
4
+
5
+ """
6
+ Data Transform with a Gemini Named Credential Callout
7
+
8
+ This is a batch transform: read a DLO, enrich it via Google's Gemini ``generateContent``
9
+ API, and write the result back to a DLO.
10
+
11
+ It shows **both** callout paths against the same Named Credential
12
+ (``callout:gemini``); the request template (URL, method, headers) is shared and
13
+ only the body differs:
14
+
15
+ - **Driver path** — :meth:`Client.named_credential_request` runs **once** on the
16
+ driver and returns an :class:`HTTPResponse`. Use it for a single job-level
17
+ callout whose result you reuse across the job.
18
+ - **Per-row path** — :func:`datacustomcode.client.named_credential_request_col`
19
+ fans the callout out across the DataFrame, one call per row, returning a struct
20
+ Column ``{status, response, error_code, error_message}`` where ``response`` is
21
+ itself ``{status_code, body, headers}``. A non-2xx response is still
22
+ ``SUCCESS`` with its code in ``response.status_code``; a transport failure sets
23
+ ``status`` to ``ERROR`` without aborting the whole Spark job.
24
+ """
25
+
26
+ import json
27
+ import logging
28
+
29
+ from pyspark.sql import Column
30
+ from pyspark.sql.functions import (
31
+ array,
32
+ col,
33
+ concat,
34
+ get_json_object,
35
+ lit,
36
+ struct,
37
+ to_json,
38
+ )
39
+
40
+ from datacustomcode.client import Client, named_credential_request_col
41
+ from datacustomcode.io.writer.base import WriteMode
42
+ from datacustomcode.named_credential.types.http_method import HTTPMethod
43
+ from datacustomcode.named_credential.types.http_request_builder import (
44
+ HTTPRequestBuilder,
45
+ )
46
+
47
+ logger = logging.getLogger(__name__)
48
+ logging.basicConfig(level=logging.INFO)
49
+
50
+ CALLOUT_URL = "callout:gemini"
51
+
52
+ _TEXT_COLUMN = "Description__c"
53
+ _SOURCE_DLO = "Account_std__dll"
54
+ _TARGET_DLO = "Account_std_copy__dll"
55
+
56
+ _PROMPT = (
57
+ "Summarize the following text in one sentence. Respond with the summary "
58
+ "only, no preamble.\n\nText:\n"
59
+ )
60
+
61
+ _REQUEST = (
62
+ HTTPRequestBuilder()
63
+ .set_url(CALLOUT_URL)
64
+ .set_method(HTTPMethod.POST)
65
+ .set_headers({"Content-Type": "application/json", "Accept": "application/json"})
66
+ .set_response_timeout_seconds(60)
67
+ .build()
68
+ )
69
+
70
+
71
+ def _gemini_body_col(text_col: Column) -> Column:
72
+ """Build a per-row Gemini ``generateContent`` request body as a JSON string.
73
+
74
+ Using ``to_json(struct(...))`` keeps the row text properly escaped inside the
75
+ JSON payload rather than string-concatenating it.
76
+ """
77
+ prompt = concat(lit(_PROMPT), text_col)
78
+ contents = array(struct(array(struct(prompt.alias("text"))).alias("parts")))
79
+ return to_json(struct(contents.alias("contents")))
80
+
81
+
82
+ def _gemini_body(text: str) -> str:
83
+ """Build a Gemini ``generateContent`` request body as a JSON string (driver)."""
84
+ return json.dumps({"contents": [{"parts": [{"text": _PROMPT + text}]}]})
85
+
86
+
87
+ def _summarize_on_driver(client: Client, text: str) -> str:
88
+ """One-shot driver callout: summarize a single string once, not per row.
89
+
90
+ The scalar counterpart to the per-row column path — same request template,
91
+ but dispatched once on the driver and returning an ``HTTPResponse``.
92
+ """
93
+ response = client.named_credential_request(_REQUEST, body=_gemini_body(text))
94
+
95
+ # Don't raise: a failed driver callout shouldn't abort the whole job.
96
+ if not response.is_success:
97
+ logger.error(f"Driver Gemini callout failed: HTTP {response.status_code}")
98
+ return ""
99
+
100
+ envelope = json.loads(response.body) if response.body else {}
101
+ try:
102
+ return str(envelope["candidates"][0]["content"]["parts"][0]["text"])
103
+ except (KeyError, IndexError, TypeError):
104
+ return ""
105
+
106
+
107
+ def main():
108
+ client = Client()
109
+
110
+ df = client.read_dlo(_SOURCE_DLO)
111
+
112
+ # Driver path: one callout on the driver over a single representative row.
113
+ sample = df.select(_TEXT_COLUMN).first()
114
+ if sample and sample[0]:
115
+ driver_summary = _summarize_on_driver(client, sample[0])
116
+ logger.info(f"Driver-path sample summary: {driver_summary}")
117
+
118
+ # Per-row path: one Gemini callout per row; the result struct is a column.
119
+ callout = named_credential_request_col(
120
+ _REQUEST, body=_gemini_body_col(col(_TEXT_COLUMN))
121
+ )
122
+ df = df.withColumn("_callout", callout)
123
+
124
+ # Pull the model's text out of the response body. A row whose callout failed
125
+ # (non-2xx or transport error) yields null here rather than failing the job.
126
+ summary = get_json_object(
127
+ col("_callout")["response"]["body"],
128
+ "$.candidates[0].content.parts[0].text",
129
+ )
130
+
131
+ df = df.select(
132
+ col("id__c").alias("id__c"),
133
+ col("Description__c").alias("description__c"),
134
+ col("kq_id__c").alias("kq_id__c"),
135
+ summary.alias("summary__c"),
136
+ col("_callout")["status"].alias("callout_status__c"),
137
+ col("_callout")["response"]["status_code"].alias("callout_http_code__c"),
138
+ )
139
+
140
+ client.write_to_dlo(_TARGET_DLO, df, write_mode=WriteMode.APPEND)
141
+
142
+
143
+ if __name__ == "__main__":
144
+ main()
@@ -0,0 +1,11 @@
1
+ {
2
+ "credentials": {
3
+ "callout:gemini": {
4
+ "auth_type": "Custom",
5
+ "custom_headers": {
6
+ "X-goog-api-key": "YOUR_API_KEY"
7
+ },
8
+ "target_url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent"
9
+ }
10
+ }
11
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: salesforce-data-customcode
3
- Version: 6.1.0.dev5
3
+ Version: 6.1.0.dev7
4
4
  Summary: Data Cloud Custom Code SDK
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE.txt
@@ -1,14 +1,14 @@
1
1
  datacustomcode/__init__.py,sha256=5vvWRk5gb2mZIaVZ9BSPRL45uKSUwmSerxhLp6A4Q-4,2815
2
2
  datacustomcode/auth.py,sha256=fpSjhIBdv9trC8yq2vuljAix_Euu-4Ah7HDCGhYjOxI,8309
3
3
  datacustomcode/cli.py,sha256=K4LHL5xrb7-erXbjYz7pT4Kg4jG6Wf81c9wl_8tLabE,14162
4
- datacustomcode/client.py,sha256=1vX41y2KvKC-qvs48Vrp0ylpQovytECXS4LrsAdMCC4,26568
4
+ datacustomcode/client.py,sha256=UoOqBBLGVBhznTp5eZR8aqA8bDkYTuZz04n_A0R9j_A,30905
5
5
  datacustomcode/cmd.py,sha256=ZMs46aydJw2EaU26JgCtZmnqESQFHvvaJz10hnjZTBk,3537
6
6
  datacustomcode/common_config.py,sha256=SAUnxj3kqmOeWwPmFoYq4tuxokMgURVm4QwcGi-avL4,1928
7
7
  datacustomcode/config.py,sha256=lqed3jcWfoIweikSFZelaAoyBa0cXXScL8O6vaqdeRU,4372
8
- datacustomcode/config.yaml,sha256=ldssmQYPghmYSSPaelm3F2mC99njavhrWsINRSzWymM,933
8
+ datacustomcode/config.yaml,sha256=LqpbkZhzN0nZOPEPnaz2qOCbchp8fxC4GHamT_b56D0,1082
9
9
  datacustomcode/constants.py,sha256=NCGptcql30En5N7WAH96TYD_DTzHFYdh1sZZ5f327cs,1686
10
10
  datacustomcode/credentials.py,sha256=D-7Zd3Nh_wStdj8_wUy5cnC8M_mdbfBijhIAi-2EbXs,9467
11
- datacustomcode/deploy.py,sha256=HvKoXcUfBwBRsTWCDp22Qg3fJV1qRZ-TFNQ-Od8AATE,23441
11
+ datacustomcode/deploy.py,sha256=kyd8QqvWrw_thHvGWEnjbeNVgAyjpoqR8TKqjcIriGA,23678
12
12
  datacustomcode/einstein_platform_client.py,sha256=ON2B_m--vdbCVVMVcLc81T-BRZ5-UuxVCer8E6OEQPA,4083
13
13
  datacustomcode/einstein_platform_config.py,sha256=6lb_FRbEzdt5a8-2cR15f13ZKw674uvRJ4Xq0o_pQXE,1490
14
14
  datacustomcode/einstein_predictions/__init__.py,sha256=_RIDTqcEHDRu6AsCsj9lRBykNkHI8Ch8JBILL1ioPtA,1237
@@ -27,7 +27,7 @@ datacustomcode/function/__init__.py,sha256=oag8FevDxbx1vR0tFhtxPd5SvmUEYDj8esRo4
27
27
  datacustomcode/function/base.py,sha256=H_i80GcsFScvHJJ6bYLry5phTpsEU1KubpR8D3qnsjo,691
28
28
  datacustomcode/function/feature_types/__init__.py,sha256=gamfOD1VnAtEslRBpqh-yKiVjkG_wYWYdSatGIfsN-w,621
29
29
  datacustomcode/function/feature_types/chunking.py,sha256=_tCCHj7slD59-aLLEZUFRPOX37q_MEKkL4thi9CNwMw,7180
30
- datacustomcode/function/runtime.py,sha256=jUduf-pve-0JAv0Lg0HPyLCZ9_Hgcxe25dI7t-DgX9o,3696
30
+ datacustomcode/function/runtime.py,sha256=Q6h-vcW1TNhOh3q1rlmQ24zs-OloNkJexdtbFyIxt4o,4437
31
31
  datacustomcode/function_utils.py,sha256=y6vaoSSaJ9CeHhjLCNyqzJT4vx6yCePWRxNLz38ddjQ,12920
32
32
  datacustomcode/io/__init__.py,sha256=gamfOD1VnAtEslRBpqh-yKiVjkG_wYWYdSatGIfsN-w,621
33
33
  datacustomcode/io/base.py,sha256=gbwZWWVUbCbGR4jIg_4h4qOz8tOMjE4RDTleD23WFKo,973
@@ -53,8 +53,26 @@ datacustomcode/llm_gateway/types/generate_text_response.py,sha256=NSvj6nvzR4cZ0c
53
53
  datacustomcode/llm_gateway/types/generate_text_response_builder.py,sha256=6MV6JZuTyHUId3Slw9k7m0KBgjj-5S9HI4qtd94Jl2A,1272
54
54
  datacustomcode/llm_gateway_config.py,sha256=ECm9CFqOFOaLHwenvVFAjiRSzG9Eg9fY4pb8nHbQ34c,3312
55
55
  datacustomcode/mixin.py,sha256=ZtROqO1W1_D7MV8lw4cw6zzcchJLoZS0aAiXrolYR4k,4914
56
+ datacustomcode/named_credential/__init__.py,sha256=XD_UI8ggOkFvkqCOZI_3dP1AkviqPIZFOt3RI1_RDe4,1163
57
+ datacustomcode/named_credential/base.py,sha256=-LMskZkKNoaFg-Zc80M_4IPLF7ru5pfnbkfLI7YXrFc,1816
58
+ datacustomcode/named_credential/default.py,sha256=z03B0daZvTPiTmJWGAtDCICB1srelESg7QmPH2iRK5o,3339
59
+ datacustomcode/named_credential/direct/__init__.py,sha256=zqErMI1GqEhseLnYkrWtq3WipRi_dP153c8wwLvgI-o,799
60
+ datacustomcode/named_credential/direct/auth.py,sha256=I1vdB8zVxdREwABDnjY7qwpTZFhT9OHJTsgpxPIuT84,6837
61
+ datacustomcode/named_credential/direct/credentials.py,sha256=B1UpqwRXnzkjycUi50KfxJA5ZeAhR33gElRMzNOit4M,4560
62
+ datacustomcode/named_credential/direct/transport.py,sha256=UL5eJJsyoAjr8ovJDQKQY3O20DivvbWFPGRyM8Y2or4,4078
63
+ datacustomcode/named_credential/direct/url_resolver.py,sha256=KItv12Az0qoxnVacCTcM9t9AY7qB9_tqPWMgiP-7Y6s,3823
64
+ datacustomcode/named_credential/errors.py,sha256=zyMEgljTf85digXrLrlR9HBh5Un4WtG0WsZx0K4EWt0,1212
65
+ datacustomcode/named_credential/spark_base.py,sha256=w34B-Pg6m_hcUqUbjmB2b6zUme_MSgg6VeghbMMYYN4,3288
66
+ datacustomcode/named_credential/spark_default.py,sha256=DY_STX9-1le8cS5M_vGqB3VUtQ2XCZZYDAmKId7YekA,5219
67
+ datacustomcode/named_credential/types/__init__.py,sha256=gamfOD1VnAtEslRBpqh-yKiVjkG_wYWYdSatGIfsN-w,621
68
+ datacustomcode/named_credential/types/http_method.py,sha256=NFf8emmW_Y73q8q2pseWHqOQ-1SoFwKp2vCMr1OdmEU,952
69
+ datacustomcode/named_credential/types/http_request.py,sha256=LXW4EcvUfyOJHf8-VtFSRWy6JsTJJsd0N4-X6WxxFnA,2170
70
+ datacustomcode/named_credential/types/http_request_builder.py,sha256=O2rcqHiiKwaqQQRWC3BQ054WMwVfRmGTnX4lOfc7xeA,3117
71
+ datacustomcode/named_credential/types/http_response.py,sha256=ZqX52RMjSdn8OpHSDkKJo9730QRx8o4_ZT-1noSMRe8,1480
72
+ datacustomcode/named_credential/types/http_response_builder.py,sha256=MoUjpT-P5W2uT1-h1rIfKpBQHpMj_ZA_nUmn-FyBdbQ,896
73
+ datacustomcode/named_credential_config.py,sha256=M07-oWzYj0KTrfA0fqvk3BQvaaDaw7C6nxbR0s3lOUk,3645
56
74
  datacustomcode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
- datacustomcode/run.py,sha256=Ky58Di6Nh7gk6Ic-5Jxt3Y4xB3vRNmzlUcoSlK-OLvo,8169
75
+ datacustomcode/run.py,sha256=G0b5PCU0nucOFGX578LlYjmCpmgAASADnf2rh8NmccI,8485
58
76
  datacustomcode/scan.py,sha256=9rq1Wae_tYACJykaOmBOv1covYvOSdky8w13exnmyJ0,19170
59
77
  datacustomcode/spark/__init__.py,sha256=12drVVlRiczCxOQw-EzuGtLsikCM8baBXvDEgwvelCI,860
60
78
  datacustomcode/spark/base.py,sha256=tlGqM4LxuLoDa7OxJF5nVeb7phO5uvD1DHBQeH7NMMs,1036
@@ -68,6 +86,11 @@ datacustomcode/templates/function/build_native_dependencies.sh,sha256=dk9vhzlObd
68
86
  datacustomcode/templates/function/chunking/payload/config.json,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
69
87
  datacustomcode/templates/function/chunking/payload/entrypoint.py,sha256=tzpQJjODulwzLilOoKdOo8GjpdIlCDByjnawpHIQYQA,4517
70
88
  datacustomcode/templates/function/chunking/requirements.txt,sha256=Ih0KsVdiTdo7KuIsqFB_AJMRT2r0ao_xDEb3hiDmf48,46
89
+ datacustomcode/templates/function/example/chunking_with_external_callout/README.md,sha256=iXegln2W0FlGrgWHi1StBSIAxzQHwKv_l4DL7PmoHdA,4796
90
+ datacustomcode/templates/function/example/chunking_with_external_callout/config.json,sha256=EvjuOVssRg2SjcUb5F50RRMGDqag_f69bv8AOflaK1g,38
91
+ datacustomcode/templates/function/example/chunking_with_external_callout/entrypoint.py,sha256=TwT7TKMV7Shg5inkN-B4U2wSXGXAJYZZh8wrXyePRAo,5338
92
+ datacustomcode/templates/function/example/chunking_with_external_callout/external_callout_config.json,sha256=PUCmw_humbVoCyswFneuGYx0INbqSTPOumDqtGOztiM,320
93
+ datacustomcode/templates/function/example/chunking_with_external_callout/tests/test.json,sha256=ZqUthCT9F9HoyT493tXg4nFDSbEAeaFHY1iHo-9Qx7g,2703
71
94
  datacustomcode/templates/function/example/chunking_with_llm/config.json,sha256=EvjuOVssRg2SjcUb5F50RRMGDqag_f69bv8AOflaK1g,38
72
95
  datacustomcode/templates/function/example/chunking_with_llm/entrypoint.py,sha256=6AMVf_busCCDALktG8vkCtjnzJheMgM-OOLML5iLKOg,3437
73
96
  datacustomcode/templates/function/example/chunking_with_llm/files/chunking_prompt.txt,sha256=w_gSYNXwZmbMTMjZ_YYwm1IpMsVpI3hyC3ew60zqs_0,446
@@ -88,6 +111,9 @@ datacustomcode/templates/script/account.ipynb,sha256=LIbxgiVxflNASdspF2lfpMKkKAT
88
111
  datacustomcode/templates/script/build_native_dependencies.sh,sha256=ICRrp4f1ATBwPaUiuVGjY-MwiubFswNJLf8gMGU6YNg,197
89
112
  datacustomcode/templates/script/examples/employee_hierarchy/employee_data.csv,sha256=C7ggLBfoyi3M2BdMLNyOeKqF-5OO-Da76lkwgWg2cVQ,302
90
113
  datacustomcode/templates/script/examples/employee_hierarchy/entrypoint.py,sha256=Mfm3iQtEHTQRW6cmZTwRKdTh3IeGWR-teXrd6x-YLSY,2223
114
+ datacustomcode/templates/script/examples/external_callout/README.md,sha256=CNLPSS6anLxRQyZ6hxAXUuvUPH09HMv2GPoQQMsuT94,6056
115
+ datacustomcode/templates/script/examples/external_callout/entrypoint.py,sha256=KgSAmkpJ1On7R3Lr4_Slf9rTHgLr3TjC43QSFbaIzUY,5005
116
+ datacustomcode/templates/script/examples/external_callout/external_callout_config.json,sha256=PUCmw_humbVoCyswFneuGYx0INbqSTPOumDqtGOztiM,320
91
117
  datacustomcode/templates/script/examples/streaming_deltas/entrypoint.py,sha256=UQr1EhJURFFGI5626efvv-MxGHltzcpJcEJVmz5ZQdo,2333
92
118
  datacustomcode/templates/script/jupyterlab.sh,sha256=0O_rPZ8w2DM1hxPo9Wig9j-ymhS2dRzVO2PlFClWdlA,2786
93
119
  datacustomcode/templates/script/payload/config.json,sha256=0d2mEMt4NHIeOUTsgiPMuRKdOLIQxmh-Wq-IfEqU-gc,28
@@ -96,8 +122,8 @@ datacustomcode/templates/script/requirements-dev.txt,sha256=OWwuy1awesqOZOS3Zizm
96
122
  datacustomcode/templates/script/requirements.txt,sha256=qJbqzs5z0Hrx590U3T7dHq_m8UQEx2TdhgrJSz-QHIQ,40
97
123
  datacustomcode/token_provider.py,sha256=qA_e4vqSXnxn0MccFFPULWO8ZeUOEAu5QpBnoYCg-fc,6839
98
124
  datacustomcode/version.py,sha256=9LlbVrzwBvut1L308QbwNBgxdQk5CrghH39JARVSxms,989
99
- salesforce_data_customcode-6.1.0.dev5.dist-info/METADATA,sha256=VCspB8hb-Qia1FvP5047hBU8M8uEO-VcuNP-6Wf_7nc,27417
100
- salesforce_data_customcode-6.1.0.dev5.dist-info/WHEEL,sha256=eY7nduwzv-ldUxpzbRlxwvC693Hg6PX8bWDjEHjZ_dk,88
101
- salesforce_data_customcode-6.1.0.dev5.dist-info/entry_points.txt,sha256=WpQ94UB7UuRCYGOLtJV3vAgm1tl7iVf43VYRWIuNu5Y,74
102
- salesforce_data_customcode-6.1.0.dev5.dist-info/licenses/LICENSE.txt,sha256=iOi8EmQpfkFhMENi7VYtkl2EqS14pEOccoXHiW2dyPU,11443
103
- salesforce_data_customcode-6.1.0.dev5.dist-info/RECORD,,
125
+ salesforce_data_customcode-6.1.0.dev7.dist-info/METADATA,sha256=jzc55cJlMHH-nGsNSzIrLu-GhN4nlmIOfK9fj8nZ1u4,27417
126
+ salesforce_data_customcode-6.1.0.dev7.dist-info/WHEEL,sha256=eY7nduwzv-ldUxpzbRlxwvC693Hg6PX8bWDjEHjZ_dk,88
127
+ salesforce_data_customcode-6.1.0.dev7.dist-info/entry_points.txt,sha256=WpQ94UB7UuRCYGOLtJV3vAgm1tl7iVf43VYRWIuNu5Y,74
128
+ salesforce_data_customcode-6.1.0.dev7.dist-info/licenses/LICENSE.txt,sha256=iOi8EmQpfkFhMENi7VYtkl2EqS14pEOccoXHiW2dyPU,11443
129
+ salesforce_data_customcode-6.1.0.dev7.dist-info/RECORD,,