salesforce-data-customcode 6.0.2.dev1__tar.gz → 6.0.3.dev1__tar.gz
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.
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/PKG-INFO +1 -2
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/README.md +0 -1
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/pyproject.toml +1 -1
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/client.py +3 -13
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/__init__.py +2 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/default.py +0 -2
- salesforce_data_customcode-6.0.3.dev1/src/datacustomcode/llm_gateway/errors.py +36 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/spark_base.py +0 -2
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/spark_default.py +14 -8
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/types/generate_text_request.py +0 -7
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/types/generate_text_request_builder.py +0 -6
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/payload/entrypoint.py +1 -2
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/LICENSE.txt +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/auth.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/cli.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/cmd.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/common_config.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/config.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/config.yaml +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/constants.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/credentials.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/deploy.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/einstein_platform_client.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/einstein_platform_config.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/einstein_predictions/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/einstein_predictions/base.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/einstein_predictions/impl/default.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/einstein_predictions/types.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/einstein_predictions_config.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/file/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/file/base.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/file/path/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/file/path/default.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/function/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/function/base.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/function/feature_types/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/function/feature_types/chunking.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/function/runtime.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/function_utils.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/base.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/reader/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/reader/base.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/reader/query_api.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/reader/sf_cli.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/reader/utils.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/writer/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/writer/base.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/writer/csv.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/io/writer/print.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/base.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/types/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/types/generate_text_response.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway/types/generate_text_response_builder.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/llm_gateway_config.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/mixin.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/py.typed +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/run.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/scan.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/spark/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/spark/base.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/spark/default.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/template.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/__init__.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/.devcontainer/devcontainer.json +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/Dockerfile.dependencies +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/README.md +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/build_native_dependencies.sh +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/chunking/payload/config.json +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/chunking/payload/entrypoint.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/chunking/requirements.txt +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/example/chunking_with_llm/config.json +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/example/chunking_with_llm/entrypoint.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/example/chunking_with_llm/files/chunking_prompt.txt +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/example/chunking_with_llm/tests/test.json +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/example/chunking_with_prediction/config.json +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/example/chunking_with_prediction/entrypoint.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/example/chunking_with_prediction/tests/test.json +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/payload/config.json +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/payload/entrypoint.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/requirements-dev.txt +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/function/requirements.txt +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/.devcontainer/devcontainer.json +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/Dockerfile +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/Dockerfile.dependencies +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/README.md +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/account.ipynb +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/build_native_dependencies.sh +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/examples/employee_hierarchy/employee_data.csv +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/examples/employee_hierarchy/entrypoint.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/jupyterlab.sh +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/payload/config.json +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/requirements-dev.txt +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/templates/script/requirements.txt +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/token_provider.py +0 -0
- {salesforce_data_customcode-6.0.2.dev1 → salesforce_data_customcode-6.0.3.dev1}/src/datacustomcode/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: salesforce-data-customcode
|
|
3
|
-
Version: 6.0.
|
|
3
|
+
Version: 6.0.3.dev1
|
|
4
4
|
Summary: Data Cloud Custom Code SDK
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
License-File: LICENSE.txt
|
|
@@ -347,7 +347,6 @@ def main():
|
|
|
347
347
|
"In one sentence, greet {name} from {city}.",
|
|
348
348
|
{"name": col("name__c"), "city": col("homecity__c")},
|
|
349
349
|
model_id="sfdc_ai__DefaultGPT4Omni", # An AI model in your org
|
|
350
|
-
max_tokens=100,
|
|
351
350
|
),
|
|
352
351
|
)
|
|
353
352
|
|
|
@@ -59,7 +59,6 @@ def llm_gateway_generate_text_col(
|
|
|
59
59
|
template: str,
|
|
60
60
|
values: Union[Dict[str, "Column"], "Column"],
|
|
61
61
|
model_id: Optional[str] = None,
|
|
62
|
-
max_tokens: Optional[int] = None,
|
|
63
62
|
) -> "Column":
|
|
64
63
|
"""Build a Spark Column that runs the LLM Gateway per row.
|
|
65
64
|
|
|
@@ -71,7 +70,6 @@ def llm_gateway_generate_text_col(
|
|
|
71
70
|
... "In one sentence, greet {name} from {city}.",
|
|
72
71
|
... {"name": col("name__c"), "city": col("homecity__c")},
|
|
73
72
|
... model_id="sfdc_ai__DefaultGPT4Omni",
|
|
74
|
-
... max_tokens=100,
|
|
75
73
|
... ),
|
|
76
74
|
... )
|
|
77
75
|
|
|
@@ -81,15 +79,12 @@ def llm_gateway_generate_text_col(
|
|
|
81
79
|
values: Either a mapping from placeholder name to Spark ``Column``, or
|
|
82
80
|
a single ``Column`` whose value is already a struct.
|
|
83
81
|
model_id: LLM model id. Defaults to ``sfdc_ai__DefaultGPT4Omni``.
|
|
84
|
-
max_tokens: Maximum tokens to generate. Defaults to 200.
|
|
85
82
|
|
|
86
83
|
Returns:
|
|
87
84
|
A Spark ``Column`` that, when evaluated, produces the generated text.
|
|
88
85
|
"""
|
|
89
86
|
gateway = Client()._get_spark_llm_gateway()
|
|
90
|
-
return gateway.llm_gateway_generate_text_col(
|
|
91
|
-
template, values, model_id=model_id, max_tokens=max_tokens
|
|
92
|
-
)
|
|
87
|
+
return gateway.llm_gateway_generate_text_col(template, values, model_id=model_id)
|
|
93
88
|
|
|
94
89
|
|
|
95
90
|
class DataCloudObjectType(Enum):
|
|
@@ -150,9 +145,7 @@ class Client:
|
|
|
150
145
|
finder: Find a file path
|
|
151
146
|
reader: A custom reader to use for reading Data Cloud objects.
|
|
152
147
|
writer: A custom writer to use for writing Data Cloud objects.
|
|
153
|
-
spark_llm_gateway: Optional custom :class:`SparkLLMGateway`.
|
|
154
|
-
omitted, the gateway is lazily resolved from
|
|
155
|
-
``spark_llm_gateway_config``.
|
|
148
|
+
spark_llm_gateway: Optional custom :class:`SparkLLMGateway`.
|
|
156
149
|
|
|
157
150
|
Example:
|
|
158
151
|
>>> client = Client()
|
|
@@ -292,7 +285,6 @@ class Client:
|
|
|
292
285
|
self,
|
|
293
286
|
prompt: str,
|
|
294
287
|
model_id: Optional[str] = None,
|
|
295
|
-
max_tokens: Optional[int] = None,
|
|
296
288
|
) -> str:
|
|
297
289
|
"""Issue a one-shot LLM Gateway call. This is the scalar counterpart to
|
|
298
290
|
:func:`llm_gateway_generate_text_col`: it runs **once** — not per row.
|
|
@@ -310,15 +302,13 @@ class Client:
|
|
|
310
302
|
``{field}`` substitution is performed on this string.
|
|
311
303
|
model_id: LLM model id to target. Defaults to
|
|
312
304
|
``sfdc_ai__DefaultGPT4Omni`` when ``None``.
|
|
313
|
-
max_tokens: Hard upper bound on the number of tokens the model
|
|
314
|
-
may generate. Defaults to 200 when ``None``.
|
|
315
305
|
|
|
316
306
|
Returns:
|
|
317
307
|
The generated text as a plain Python ``str``; empty when the
|
|
318
308
|
gateway response carries no generated text.
|
|
319
309
|
"""
|
|
320
310
|
return self._get_spark_llm_gateway().llm_gateway_generate_text(
|
|
321
|
-
prompt, model_id=model_id
|
|
311
|
+
prompt, model_id=model_id
|
|
322
312
|
)
|
|
323
313
|
|
|
324
314
|
def _get_spark_llm_gateway(self) -> SparkLLMGateway:
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
from datacustomcode.llm_gateway.base import LLMGateway
|
|
17
17
|
from datacustomcode.llm_gateway.default import DefaultLLMGateway
|
|
18
|
+
from datacustomcode.llm_gateway.errors import LLMGatewayCallError
|
|
18
19
|
from datacustomcode.llm_gateway.spark_base import SparkLLMGateway
|
|
19
20
|
from datacustomcode.llm_gateway.spark_default import DefaultSparkLLMGateway
|
|
20
21
|
|
|
@@ -22,5 +23,6 @@ __all__ = [
|
|
|
22
23
|
"DefaultLLMGateway",
|
|
23
24
|
"DefaultSparkLLMGateway",
|
|
24
25
|
"LLMGateway",
|
|
26
|
+
"LLMGatewayCallError",
|
|
25
27
|
"SparkLLMGateway",
|
|
26
28
|
]
|
|
@@ -34,8 +34,6 @@ class DefaultLLMGateway(EinsteinPlatformClient, LLMGateway):
|
|
|
34
34
|
|
|
35
35
|
payload: Dict[str, Any] = {"prompt": request.prompt}
|
|
36
36
|
|
|
37
|
-
if request.max_tokens is not None:
|
|
38
|
-
payload["max_tokens"] = request.max_tokens
|
|
39
37
|
if request.localization:
|
|
40
38
|
payload["localization"] = request.localization
|
|
41
39
|
if request.tags:
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Copyright (c) 2025, Salesforce, Inc.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
"""Exceptions raised by LLM Gateway implementations."""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Optional
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class LLMGatewayCallError(RuntimeError):
|
|
23
|
+
"""Raised when an LLM Gateway call returns an error."""
|
|
24
|
+
|
|
25
|
+
def __init__(
|
|
26
|
+
self,
|
|
27
|
+
message: str,
|
|
28
|
+
*,
|
|
29
|
+
status: Optional[object] = None,
|
|
30
|
+
error_code: Optional[str] = None,
|
|
31
|
+
error_message: Optional[str] = None,
|
|
32
|
+
) -> None:
|
|
33
|
+
super().__init__(message)
|
|
34
|
+
self.status = status
|
|
35
|
+
self.error_code = error_code
|
|
36
|
+
self.error_message = error_message
|
|
@@ -40,7 +40,6 @@ class SparkLLMGateway(ABC, UserExtendableNamedConfigMixin):
|
|
|
40
40
|
self,
|
|
41
41
|
prompt: str,
|
|
42
42
|
model_id: Optional[str] = None,
|
|
43
|
-
max_tokens: Optional[int] = None,
|
|
44
43
|
) -> str:
|
|
45
44
|
"""Issue a one-shot LLM Gateway call and return the generated text."""
|
|
46
45
|
|
|
@@ -50,6 +49,5 @@ class SparkLLMGateway(ABC, UserExtendableNamedConfigMixin):
|
|
|
50
49
|
template: str,
|
|
51
50
|
values: Union[Dict[str, "Column"], "Column"],
|
|
52
51
|
model_id: Optional[str] = None,
|
|
53
|
-
max_tokens: Optional[int] = None,
|
|
54
52
|
) -> "Column":
|
|
55
53
|
"""Build a Spark ``Column`` that invokes the LLM Gateway per row."""
|
|
@@ -31,7 +31,6 @@ if TYPE_CHECKING:
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
_DEFAULT_LLM_MODEL_ID = "sfdc_ai__DefaultGPT4Omni"
|
|
34
|
-
_DEFAULT_LLM_MAX_TOKENS = 200
|
|
35
34
|
|
|
36
35
|
|
|
37
36
|
class DefaultSparkLLMGateway(SparkLLMGateway):
|
|
@@ -52,16 +51,14 @@ class DefaultSparkLLMGateway(SparkLLMGateway):
|
|
|
52
51
|
self,
|
|
53
52
|
prompt: str,
|
|
54
53
|
model_id: Optional[str] = None,
|
|
55
|
-
max_tokens: Optional[int] = None,
|
|
56
54
|
) -> str:
|
|
57
|
-
return _invoke_llm_gateway(self._llm_gateway, prompt, model_id
|
|
55
|
+
return _invoke_llm_gateway(self._llm_gateway, prompt, model_id)
|
|
58
56
|
|
|
59
57
|
def llm_gateway_generate_text_col(
|
|
60
58
|
self,
|
|
61
59
|
template: str,
|
|
62
60
|
values: Union[Dict[str, "Column"], "Column"],
|
|
63
61
|
model_id: Optional[str] = None,
|
|
64
|
-
max_tokens: Optional[int] = None,
|
|
65
62
|
) -> "Column":
|
|
66
63
|
|
|
67
64
|
from pyspark.sql.functions import struct, udf
|
|
@@ -83,7 +80,7 @@ class DefaultSparkLLMGateway(SparkLLMGateway):
|
|
|
83
80
|
else dict(values_row)
|
|
84
81
|
)
|
|
85
82
|
prompt = template.format(**subs)
|
|
86
|
-
return _invoke_llm_gateway(gateway, prompt, model_id
|
|
83
|
+
return _invoke_llm_gateway(gateway, prompt, model_id)
|
|
87
84
|
|
|
88
85
|
return udf(_generate, StringType())(values_col)
|
|
89
86
|
|
|
@@ -104,8 +101,8 @@ def _invoke_llm_gateway(
|
|
|
104
101
|
gateway: "LLMGateway",
|
|
105
102
|
prompt: str,
|
|
106
103
|
model_id: Optional[str],
|
|
107
|
-
max_tokens: Optional[int],
|
|
108
104
|
) -> str:
|
|
105
|
+
from datacustomcode.llm_gateway.errors import LLMGatewayCallError
|
|
109
106
|
from datacustomcode.llm_gateway.types.generate_text_request_builder import (
|
|
110
107
|
GenerateTextRequestBuilder,
|
|
111
108
|
)
|
|
@@ -114,6 +111,15 @@ def _invoke_llm_gateway(
|
|
|
114
111
|
GenerateTextRequestBuilder()
|
|
115
112
|
.set_prompt(prompt)
|
|
116
113
|
.set_model(model_id or _DEFAULT_LLM_MODEL_ID)
|
|
117
|
-
.set_max_tokens(max_tokens or _DEFAULT_LLM_MAX_TOKENS)
|
|
118
114
|
)
|
|
119
|
-
|
|
115
|
+
response = gateway.generate_text(builder.build())
|
|
116
|
+
if response.is_error:
|
|
117
|
+
raise LLMGatewayCallError(
|
|
118
|
+
f"LLM Gateway call failed: status_code={response.status_code}, "
|
|
119
|
+
f"error_code={response.error_code!r}, "
|
|
120
|
+
f"message={response.data!r}",
|
|
121
|
+
status=response.status_code,
|
|
122
|
+
error_code=response.error_code or None,
|
|
123
|
+
error_message=str(response.data) if response.data else None,
|
|
124
|
+
)
|
|
125
|
+
return response.text
|
|
@@ -40,13 +40,6 @@ class GenerateTextRequest(BaseModel):
|
|
|
40
40
|
)
|
|
41
41
|
model_name: str = Field(..., min_length=1, description="Name of the model to use")
|
|
42
42
|
prompt: str = Field(..., description="Input prompt")
|
|
43
|
-
max_tokens: Optional[int] = Field(
|
|
44
|
-
default=None,
|
|
45
|
-
ge=1,
|
|
46
|
-
description=(
|
|
47
|
-
"Maximum number of tokens to generate. If None, server default applies."
|
|
48
|
-
),
|
|
49
|
-
)
|
|
50
43
|
localization: Optional[Dict[str, Any]] = Field(
|
|
51
44
|
default=None, description="Localization settings"
|
|
52
45
|
)
|
|
@@ -26,7 +26,6 @@ class GenerateTextRequestBuilder:
|
|
|
26
26
|
def __init__(self) -> None:
|
|
27
27
|
self._prompt = ""
|
|
28
28
|
self._model_name = ""
|
|
29
|
-
self._max_tokens: Optional[int] = None
|
|
30
29
|
self._localization: Optional[Dict[str, Any]] = None
|
|
31
30
|
self._tags: Optional[Dict[str, Any]] = None
|
|
32
31
|
|
|
@@ -38,10 +37,6 @@ class GenerateTextRequestBuilder:
|
|
|
38
37
|
self._model_name = model_name
|
|
39
38
|
return self
|
|
40
39
|
|
|
41
|
-
def set_max_tokens(self, max_tokens: int) -> "GenerateTextRequestBuilder":
|
|
42
|
-
self._max_tokens = max_tokens
|
|
43
|
-
return self
|
|
44
|
-
|
|
45
40
|
def set_localization(
|
|
46
41
|
self,
|
|
47
42
|
localization: Optional[Dict[str, Any]] = None,
|
|
@@ -80,7 +75,6 @@ class GenerateTextRequestBuilder:
|
|
|
80
75
|
request = GenerateTextRequest(
|
|
81
76
|
prompt=self._prompt,
|
|
82
77
|
model_name=self._model_name,
|
|
83
|
-
max_tokens=self._max_tokens,
|
|
84
78
|
localization=self._localization,
|
|
85
79
|
tags=self._tags,
|
|
86
80
|
)
|
|
@@ -25,7 +25,6 @@ def main():
|
|
|
25
25
|
... "In one sentence, greet {name} from {city}.",
|
|
26
26
|
... {"name": col("name__c"), "city": col("homecity__c")},
|
|
27
27
|
... model_id="sfdc_ai__DefaultGPT4Omni",
|
|
28
|
-
... max_tokens=100,
|
|
29
28
|
... ),
|
|
30
29
|
... )
|
|
31
30
|
|
|
@@ -35,7 +34,7 @@ def main():
|
|
|
35
34
|
Example:
|
|
36
35
|
|
|
37
36
|
>>> generated_text = client.llm_gateway_generate_text(
|
|
38
|
-
... prompt, model_id
|
|
37
|
+
... prompt, model_id
|
|
39
38
|
... )
|
|
40
39
|
"""
|
|
41
40
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|