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.
- datacustomcode/client.py +99 -0
- datacustomcode/config.yaml +6 -0
- datacustomcode/deploy.py +7 -2
- datacustomcode/function/runtime.py +16 -0
- datacustomcode/named_credential/__init__.py +28 -0
- datacustomcode/named_credential/base.py +54 -0
- datacustomcode/named_credential/default.py +93 -0
- datacustomcode/named_credential/direct/__init__.py +19 -0
- datacustomcode/named_credential/direct/auth.py +191 -0
- datacustomcode/named_credential/direct/credentials.py +122 -0
- datacustomcode/named_credential/direct/transport.py +110 -0
- datacustomcode/named_credential/direct/url_resolver.py +112 -0
- datacustomcode/named_credential/errors.py +36 -0
- datacustomcode/named_credential/spark_base.py +93 -0
- datacustomcode/named_credential/spark_default.py +154 -0
- datacustomcode/named_credential/types/__init__.py +14 -0
- datacustomcode/named_credential/types/http_method.py +29 -0
- datacustomcode/named_credential/types/http_request.py +63 -0
- datacustomcode/named_credential/types/http_request_builder.py +88 -0
- datacustomcode/named_credential/types/http_response.py +43 -0
- datacustomcode/named_credential/types/http_response_builder.py +24 -0
- datacustomcode/named_credential_config.py +105 -0
- datacustomcode/run.py +7 -0
- datacustomcode/templates/function/example/chunking_with_external_callout/README.md +120 -0
- datacustomcode/templates/function/example/chunking_with_external_callout/config.json +3 -0
- datacustomcode/templates/function/example/chunking_with_external_callout/entrypoint.py +162 -0
- datacustomcode/templates/function/example/chunking_with_external_callout/external_callout_config.json +11 -0
- datacustomcode/templates/function/example/chunking_with_external_callout/tests/test.json +16 -0
- datacustomcode/templates/script/examples/external_callout/README.md +140 -0
- datacustomcode/templates/script/examples/external_callout/entrypoint.py +144 -0
- datacustomcode/templates/script/examples/external_callout/external_callout_config.json +11 -0
- {salesforce_data_customcode-6.1.0.dev5.dist-info → salesforce_data_customcode-6.1.0.dev7.dist-info}/METADATA +1 -1
- {salesforce_data_customcode-6.1.0.dev5.dist-info → salesforce_data_customcode-6.1.0.dev7.dist-info}/RECORD +36 -10
- {salesforce_data_customcode-6.1.0.dev5.dist-info → salesforce_data_customcode-6.1.0.dev7.dist-info}/WHEEL +0 -0
- {salesforce_data_customcode-6.1.0.dev5.dist-info → salesforce_data_customcode-6.1.0.dev7.dist-info}/entry_points.txt +0 -0
- {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()
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
100
|
-
salesforce_data_customcode-6.1.0.
|
|
101
|
-
salesforce_data_customcode-6.1.0.
|
|
102
|
-
salesforce_data_customcode-6.1.0.
|
|
103
|
-
salesforce_data_customcode-6.1.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|