2121import json
2222from typing import Any , List , Literal , Mapping , Tuple
2323
24- from bigframes import clients , dtypes , series
25- from bigframes .core import log_adapter
24+ import pandas as pd
25+
26+ from bigframes import clients , dtypes , series , session
27+ from bigframes .core import convert , log_adapter
2628from bigframes .operations import ai_ops
2729
2830
2931@log_adapter .method_logger (custom_base_name = "bigquery_ai" )
3032def generate_bool (
31- prompt : series .Series | List [str | series .Series ] | Tuple [str | series .Series , ...],
33+ prompt : series .Series
34+ | pd .Series
35+ | List [str | series .Series | pd .Series ]
36+ | Tuple [str | series .Series | pd .Series , ...],
3237 * ,
3338 connection_id : str | None = None ,
3439 endpoint : str | None = None ,
@@ -77,8 +82,9 @@ def generate_bool(
7782 Name: result, dtype: boolean
7883
7984 Args:
80- prompt (series.Series | List[str|series.Series] | Tuple[str|series.Series, ...]):
81- A mixture of Series and string literals that specifies the prompt to send to the model.
85+ prompt (Series | List[str|Series] | Tuple[str|Series, ...]):
86+ A mixture of Series and string literals that specifies the prompt to send to the model. The Series can be BigFrames Series
87+ or pandas Series.
8288 connection_id (str, optional):
8389 Specifies the connection to use to communicate with the model. For example, `myproject.us.myconnection`.
8490 If not provided, the connection from the current session will be used.
@@ -142,16 +148,17 @@ def _separate_context_and_series(
142148 prompt_context : List [str | None ] = []
143149 series_list : List [series .Series ] = []
144150
151+ session = None
145152 for item in prompt :
146153 if isinstance (item , str ):
147154 prompt_context .append (item )
148155
149- elif isinstance (item , series .Series ):
156+ elif isinstance (item , ( series .Series , pd . Series ) ):
150157 prompt_context .append (None )
151158
152- if item . dtype == dtypes . OBJ_REF_DTYPE :
153- # Multi-model support
154- item = item .blob . read_url ()
159+ if isinstance ( item , series . Series ) and session is None :
160+ # use the session from the first BigFrames session if possible
161+ session = item ._session
155162 series_list .append (item )
156163
157164 else :
@@ -160,9 +167,22 @@ def _separate_context_and_series(
160167 if not series_list :
161168 raise ValueError ("Please provide at least one Series in the prompt" )
162169
170+ series_list = [_convert_series (s , session ) for s in series_list ]
171+
163172 return prompt_context , series_list
164173
165174
175+ def _convert_series (
176+ s : series .Series | pd .Series , session : session .Session | None
177+ ) -> series .Series :
178+ result = convert .to_bf_series (s , default_index = None , session = session )
179+
180+ if result .dtype == dtypes .OBJ_REF_DTYPE :
181+ # Support multimodel
182+ return result .blob .read_url ()
183+ return result
184+
185+
166186def _resolve_connection_id (series : series .Series , connection_id : str | None ):
167187 return clients .get_canonical_bq_connection_id (
168188 connection_id or series ._session ._bq_connection ,
0 commit comments