3333
3434 from datacustomcode .io .reader .base import BaseDataCloudReader
3535 from datacustomcode .io .writer .base import BaseDataCloudWriter , WriteMode
36+ from datacustomcode .proxy .client .base import BaseProxyClient
3637 from datacustomcode .spark .base import BaseSparkSessionProvider
3738
3839
@@ -106,17 +107,20 @@ class Client:
106107 _reader : BaseDataCloudReader
107108 _writer : BaseDataCloudWriter
108109 _file : DefaultFindFilePath
110+ _proxy : BaseProxyClient
109111 _data_layer_history : dict [DataCloudObjectType , set [str ]]
110112
111113 def __new__ (
112114 cls ,
113115 reader : Optional [BaseDataCloudReader ] = None ,
114116 writer : Optional ["BaseDataCloudWriter" ] = None ,
117+ proxy : Optional [BaseProxyClient ] = None ,
115118 spark_provider : Optional ["BaseSparkSessionProvider" ] = None ,
116119 ) -> Client :
117120 if cls ._instance is None :
118121 cls ._instance = super ().__new__ (cls )
119122
123+ spark = None
120124 # Initialize Readers and Writers from config
121125 # and/or provided reader and writer
122126 if reader is None or writer is None :
@@ -135,6 +139,22 @@ def __new__(
135139 provider = DefaultSparkSessionProvider ()
136140
137141 spark = provider .get_session (config .spark_config )
142+ elif (
143+ proxy is None
144+ and config .proxy_config is not None
145+ and config .spark_config is not None
146+ ):
147+ # Both reader and writer provided; we still need spark for proxy init
148+ provider = (
149+ spark_provider
150+ if spark_provider is not None
151+ else (
152+ config .spark_provider_config .to_object ()
153+ if config .spark_provider_config is not None
154+ else DefaultSparkSessionProvider ()
155+ )
156+ )
157+ spark = provider .get_session (config .spark_config )
138158
139159 if config .reader_config is None and reader is None :
140160 raise ValueError (
@@ -143,22 +163,44 @@ def __new__(
143163 elif reader is None or (
144164 config .reader_config is not None and config .reader_config .force
145165 ):
146- reader_init = config .reader_config .to_object (spark ) # type: ignore
166+ if config .proxy_config is None :
167+ raise ValueError (
168+ "Proxy config is required when reader is built from config"
169+ )
170+ assert (
171+ spark is not None
172+ ) # set in "reader is None or writer is None" branch
173+ assert config .reader_config is not None # ensured by branch condition
174+ proxy_init = config .proxy_config .to_object (spark )
175+
176+ reader_init = config .reader_config .to_object (spark )
147177 else :
148178 reader_init = reader
179+ if proxy is not None :
180+ proxy_init = proxy
181+ elif config .proxy_config is None :
182+ raise ValueError ("Proxy config is required when reader is provided" )
183+ else :
184+ assert (
185+ spark is not None
186+ ) # set in "both provided; proxy from config" branch
187+ proxy_init = config .proxy_config .to_object (spark )
149188 if config .writer_config is None and writer is None :
150189 raise ValueError (
151190 "Writer config is required when writer is not provided"
152191 )
153192 elif writer is None or (
154193 config .writer_config is not None and config .writer_config .force
155194 ):
156- writer_init = config .writer_config .to_object (spark ) # type: ignore
195+ assert spark is not None # set when reader or writer from config
196+ assert config .writer_config is not None # ensured by branch condition
197+ writer_init = config .writer_config .to_object (spark )
157198 else :
158199 writer_init = writer
159200 cls ._instance ._reader = reader_init
160201 cls ._instance ._writer = writer_init
161202 cls ._instance ._file = DefaultFindFilePath ()
203+ cls ._instance ._proxy = proxy_init
162204 cls ._instance ._data_layer_history = {
163205 DataCloudObjectType .DLO : set (),
164206 DataCloudObjectType .DMO : set (),
@@ -217,6 +259,9 @@ def write_to_dmo(
217259 self ._validate_data_layer_history_does_not_contain (DataCloudObjectType .DLO )
218260 return self ._writer .write_to_dmo (name , dataframe , write_mode , ** kwargs )
219261
262+ def call_llm_gateway (self , LLM_MODEL_ID : str , prompt : str , maxTokens : int ) -> str :
263+ return self ._proxy .call_llm_gateway (LLM_MODEL_ID , prompt , maxTokens )
264+
220265 def find_file_path (self , file_name : str ) -> Path :
221266 """Return a file path"""
222267
0 commit comments