lfx-nightly 0.1.13.dev7__py3-none-any.whl → 0.1.13.dev9__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.

Potentially problematic release.


This version of lfx-nightly might be problematic. Click here for more details.

@@ -1,4 +1,6 @@
1
1
  import asyncio
2
+ import json
3
+ from contextlib import suppress
2
4
  from typing import Any
3
5
  from urllib.parse import urljoin
4
6
 
@@ -8,11 +10,27 @@ from langchain_ollama import ChatOllama
8
10
  from lfx.base.models.model import LCModelComponent
9
11
  from lfx.field_typing import LanguageModel
10
12
  from lfx.field_typing.range_spec import RangeSpec
11
- from lfx.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SliderInput
13
+ from lfx.helpers.base_model import build_model_from_schema
14
+ from lfx.io import (
15
+ BoolInput,
16
+ DictInput,
17
+ DropdownInput,
18
+ FloatInput,
19
+ IntInput,
20
+ MessageTextInput,
21
+ Output,
22
+ SecretStrInput,
23
+ SliderInput,
24
+ TableInput,
25
+ )
12
26
  from lfx.log.logger import logger
27
+ from lfx.schema.data import Data
28
+ from lfx.schema.dataframe import DataFrame
29
+ from lfx.schema.table import EditMode
13
30
  from lfx.utils.util import transform_localhost_url
14
31
 
15
32
  HTTP_STATUS_OK = 200
33
+ TABLE_ROW_PLACEHOLDER = {"name": "field", "description": "description of field", "type": "str", "multiple": "False"}
16
34
 
17
35
 
18
36
  class ChatOllamaComponent(LCModelComponent):
@@ -28,11 +46,51 @@ class ChatOllamaComponent(LCModelComponent):
28
46
  DESIRED_CAPABILITY = "completion"
29
47
  TOOL_CALLING_CAPABILITY = "tools"
30
48
 
49
+ # Define the table schema for the format input
50
+ TABLE_SCHEMA = [
51
+ {
52
+ "name": "name",
53
+ "display_name": "Name",
54
+ "type": "str",
55
+ "description": "Specify the name of the output field.",
56
+ "default": "field",
57
+ "edit_mode": EditMode.INLINE,
58
+ },
59
+ {
60
+ "name": "description",
61
+ "display_name": "Description",
62
+ "type": "str",
63
+ "description": "Describe the purpose of the output field.",
64
+ "default": "description of field",
65
+ "edit_mode": EditMode.POPOVER,
66
+ },
67
+ {
68
+ "name": "type",
69
+ "display_name": "Type",
70
+ "type": "str",
71
+ "edit_mode": EditMode.INLINE,
72
+ "description": ("Indicate the data type of the output field (e.g., str, int, float, bool, dict)."),
73
+ "options": ["str", "int", "float", "bool", "dict"],
74
+ "default": "str",
75
+ },
76
+ {
77
+ "name": "multiple",
78
+ "display_name": "As List",
79
+ "type": "boolean",
80
+ "description": "Set to True if this output field should be a list of the specified type.",
81
+ "edit_mode": EditMode.INLINE,
82
+ "options": ["True", "False"],
83
+ "default": "False",
84
+ },
85
+ ]
86
+ default_table_row = {row["name"]: row.get("default", None) for row in TABLE_SCHEMA}
87
+ default_table_row_schema = build_model_from_schema([default_table_row]).model_json_schema()
88
+
31
89
  inputs = [
32
90
  MessageTextInput(
33
91
  name="base_url",
34
- display_name="Base URL",
35
- info="Endpoint of the Ollama API. Defaults to http://localhost:11434 .",
92
+ display_name="Ollama API URL",
93
+ info="Endpoint of the Ollama API. Defaults to http://localhost:11434.",
36
94
  value="http://localhost:11434",
37
95
  real_time_refresh=True,
38
96
  ),
@@ -44,6 +102,15 @@ class ChatOllamaComponent(LCModelComponent):
44
102
  refresh_button=True,
45
103
  real_time_refresh=True,
46
104
  ),
105
+ SecretStrInput(
106
+ name="api_key",
107
+ display_name="Ollama API Key",
108
+ info="Your Ollama API key.",
109
+ value=None,
110
+ required=False,
111
+ real_time_refresh=True,
112
+ advanced=True,
113
+ ),
47
114
  SliderInput(
48
115
  name="temperature",
49
116
  display_name="Temperature",
@@ -51,8 +118,13 @@ class ChatOllamaComponent(LCModelComponent):
51
118
  range_spec=RangeSpec(min=0, max=1, step=0.01),
52
119
  advanced=True,
53
120
  ),
54
- MessageTextInput(
55
- name="format", display_name="Format", info="Specify the format of the output (e.g., json).", advanced=True
121
+ TableInput(
122
+ name="format",
123
+ display_name="Format",
124
+ info="Specify the format of the output.",
125
+ advanced=False,
126
+ table_schema=TABLE_SCHEMA,
127
+ value=default_table_row,
56
128
  ),
57
129
  DictInput(name="metadata", display_name="Metadata", info="Metadata to add to the run trace.", advanced=True),
58
130
  DropdownInput(
@@ -112,7 +184,12 @@ class ChatOllamaComponent(LCModelComponent):
112
184
  name="top_k", display_name="Top K", info="Limits token selection to top K. (Default: 40)", advanced=True
113
185
  ),
114
186
  FloatInput(name="top_p", display_name="Top P", info="Works together with top-k. (Default: 0.9)", advanced=True),
115
- BoolInput(name="verbose", display_name="Verbose", info="Whether to print out response text.", advanced=True),
187
+ BoolInput(
188
+ name="enable_verbose_output",
189
+ display_name="Ollama Verbose Output",
190
+ info="Whether to print out response text.",
191
+ advanced=True,
192
+ ),
116
193
  MessageTextInput(
117
194
  name="tags",
118
195
  display_name="Tags",
@@ -141,15 +218,22 @@ class ChatOllamaComponent(LCModelComponent):
141
218
  *LCModelComponent.get_base_inputs(),
142
219
  ]
143
220
 
221
+ outputs = [
222
+ Output(display_name="Text", name="text_output", method="text_response"),
223
+ Output(display_name="Language Model", name="model_output", method="build_model"),
224
+ Output(display_name="Data", name="data_output", method="build_data_output"),
225
+ Output(display_name="DataFrame", name="dataframe_output", method="build_dataframe_output"),
226
+ ]
227
+
144
228
  def build_model(self) -> LanguageModel: # type: ignore[type-var]
145
229
  # Mapping mirostat settings to their corresponding values
146
230
  mirostat_options = {"Mirostat": 1, "Mirostat 2.0": 2}
147
231
 
148
- # Default to 0 for 'Disabled'
149
- mirostat_value = mirostat_options.get(self.mirostat, 0)
232
+ # Default to None for 'Disabled'
233
+ mirostat_value = mirostat_options.get(self.mirostat, None)
150
234
 
151
235
  # Set mirostat_eta and mirostat_tau to None if mirostat is disabled
152
- if mirostat_value == 0:
236
+ if mirostat_value is None:
153
237
  mirostat_eta = None
154
238
  mirostat_tau = None
155
239
  else:
@@ -169,12 +253,18 @@ class ChatOllamaComponent(LCModelComponent):
169
253
  "Learn more at https://docs.ollama.com/openai#openai-compatibility"
170
254
  )
171
255
 
256
+ try:
257
+ output_format = self._parse_format_field(self.format)
258
+ except Exception as e:
259
+ msg = f"Failed to parse the format field: {e}"
260
+ raise ValueError(msg) from e
261
+
172
262
  # Mapping system settings to their corresponding values
173
263
  llm_params = {
174
264
  "base_url": transformed_base_url,
175
265
  "model": self.model_name,
176
266
  "mirostat": mirostat_value,
177
- "format": self.format,
267
+ "format": output_format,
178
268
  "metadata": self.metadata,
179
269
  "tags": self.tags.split(",") if self.tags else None,
180
270
  "mirostat_eta": mirostat_eta,
@@ -191,9 +281,12 @@ class ChatOllamaComponent(LCModelComponent):
191
281
  "timeout": self.timeout or None,
192
282
  "top_k": self.top_k or None,
193
283
  "top_p": self.top_p or None,
194
- "verbose": self.verbose,
284
+ "verbose": self.enable_verbose_output or False,
195
285
  "template": self.template,
196
286
  }
287
+ headers = self.headers
288
+ if headers is not None:
289
+ llm_params["client_kwargs"] = {"headers": headers}
197
290
 
198
291
  # Remove parameters with None values
199
292
  llm_params = {k: v for k, v in llm_params.items() if v is not None}
@@ -219,7 +312,9 @@ class ChatOllamaComponent(LCModelComponent):
219
312
  url = url.rstrip("/").removesuffix("/v1")
220
313
  if not url.endswith("/"):
221
314
  url = url + "/"
222
- return (await client.get(urljoin(url, "api/tags"))).status_code == HTTP_STATUS_OK
315
+ return (
316
+ await client.get(url=urljoin(url, "api/tags"), headers=self.headers)
317
+ ).status_code == HTTP_STATUS_OK
223
318
  except httpx.RequestError:
224
319
  return False
225
320
 
@@ -292,8 +387,9 @@ class ChatOllamaComponent(LCModelComponent):
292
387
  show_url = urljoin(base_url, "api/show")
293
388
 
294
389
  async with httpx.AsyncClient() as client:
390
+ headers = self.headers
295
391
  # Fetch available models
296
- tags_response = await client.get(tags_url)
392
+ tags_response = await client.get(url=tags_url, headers=headers)
297
393
  tags_response.raise_for_status()
298
394
  models = tags_response.json()
299
395
  if asyncio.iscoroutine(models):
@@ -307,11 +403,12 @@ class ChatOllamaComponent(LCModelComponent):
307
403
  await logger.adebug(f"Checking model: {model_name}")
308
404
 
309
405
  payload = {"model": model_name}
310
- show_response = await client.post(show_url, json=payload)
406
+ show_response = await client.post(url=show_url, json=payload, headers=headers)
311
407
  show_response.raise_for_status()
312
408
  json_data = show_response.json()
313
409
  if asyncio.iscoroutine(json_data):
314
410
  json_data = await json_data
411
+
315
412
  capabilities = json_data.get(self.JSON_CAPABILITIES_KEY, [])
316
413
  await logger.adebug(f"Model: {model_name}, Capabilities: {capabilities}")
317
414
 
@@ -325,3 +422,113 @@ class ChatOllamaComponent(LCModelComponent):
325
422
  raise ValueError(msg) from e
326
423
 
327
424
  return model_ids
425
+
426
+ def _parse_format_field(self, format_value: Any) -> Any:
427
+ """Parse the format field to handle both string and dict inputs.
428
+
429
+ The format field can be:
430
+ - A simple string like "json" (backward compatibility)
431
+ - A JSON string from NestedDictInput that needs parsing
432
+ - A dict/JSON schema (already parsed)
433
+ - None or empty
434
+
435
+ Args:
436
+ format_value: The raw format value from the input field
437
+
438
+ Returns:
439
+ Parsed format value as string, dict, or None
440
+ """
441
+ if not format_value:
442
+ return None
443
+
444
+ schema = format_value
445
+ if isinstance(format_value, list):
446
+ schema = build_model_from_schema(format_value).model_json_schema()
447
+ if schema == self.default_table_row_schema:
448
+ return None # the rows are generic placeholder rows
449
+ elif isinstance(format_value, str): # parse as json if string
450
+ with suppress(json.JSONDecodeError): # e.g., literal "json" is valid for format field
451
+ schema = json.loads(format_value)
452
+
453
+ return schema or None
454
+
455
+ async def _parse_json_response(self) -> Any:
456
+ """Parse the JSON response from the model.
457
+
458
+ This method gets the text response and attempts to parse it as JSON.
459
+ Works with models that have format='json' or a JSON schema set.
460
+
461
+ Returns:
462
+ Parsed JSON (dict, list, or primitive type)
463
+
464
+ Raises:
465
+ ValueError: If the response is not valid JSON
466
+ """
467
+ message = await self.text_response()
468
+ text = message.text if hasattr(message, "text") else str(message)
469
+
470
+ if not text:
471
+ msg = "No response from model"
472
+ raise ValueError(msg)
473
+
474
+ try:
475
+ return json.loads(text)
476
+ except json.JSONDecodeError as e:
477
+ msg = f"Invalid JSON response. Ensure model supports JSON output. Error: {e}"
478
+ raise ValueError(msg) from e
479
+
480
+ async def build_data_output(self) -> Data:
481
+ """Build a Data output from the model's JSON response.
482
+
483
+ Returns:
484
+ Data: A Data object containing the parsed JSON response
485
+ """
486
+ parsed = await self._parse_json_response()
487
+
488
+ # If the response is already a dict, wrap it in Data
489
+ if isinstance(parsed, dict):
490
+ return Data(data=parsed)
491
+
492
+ # If it's a list, wrap in a results container
493
+ if isinstance(parsed, list):
494
+ if len(parsed) == 1:
495
+ return Data(data=parsed[0])
496
+ return Data(data={"results": parsed})
497
+
498
+ # For primitive types, wrap in a value container
499
+ return Data(data={"value": parsed})
500
+
501
+ async def build_dataframe_output(self) -> DataFrame:
502
+ """Build a DataFrame output from the model's JSON response.
503
+
504
+ Returns:
505
+ DataFrame: A DataFrame containing the parsed JSON response
506
+
507
+ Raises:
508
+ ValueError: If the response cannot be converted to a DataFrame
509
+ """
510
+ parsed = await self._parse_json_response()
511
+
512
+ # If it's a list of dicts, convert directly to DataFrame
513
+ if isinstance(parsed, list):
514
+ if not parsed:
515
+ return DataFrame()
516
+ # Ensure all items are dicts for proper DataFrame conversion
517
+ if all(isinstance(item, dict) for item in parsed):
518
+ return DataFrame(parsed)
519
+ msg = "List items must be dictionaries to convert to DataFrame"
520
+ raise ValueError(msg)
521
+
522
+ # If it's a single dict, wrap in a list to create a single-row DataFrame
523
+ if isinstance(parsed, dict):
524
+ return DataFrame([parsed])
525
+
526
+ # For primitive types, create a single-column DataFrame
527
+ return DataFrame([{"value": parsed}])
528
+
529
+ @property
530
+ def headers(self) -> dict[str, str] | None:
531
+ """Get the headers for the Ollama API."""
532
+ if self.api_key and self.api_key.strip():
533
+ return {"Authorization": f"Bearer {self.api_key}"}
534
+ return None
lfx/schema/schema.py CHANGED
@@ -149,6 +149,11 @@ class InputValueRequest(BaseModel):
149
149
  description="Defines on which components the input value should be applied. "
150
150
  "'any' applies to all input components.",
151
151
  )
152
+ client_request_time: int | None = Field(
153
+ None,
154
+ description="Client-side timestamp in milliseconds when the request was initiated. "
155
+ "Used to calculate accurate end-to-end duration.",
156
+ )
152
157
 
153
158
  # add an example
154
159
  model_config = ConfigDict(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lfx-nightly
3
- Version: 0.1.13.dev7
3
+ Version: 0.1.13.dev9
4
4
  Summary: Langflow Executor - A lightweight CLI tool for executing and serving Langflow AI flows
5
5
  Author-email: Gabriel Luiz Freitas Almeida <gabriel@langflow.org>
6
6
  Requires-Python: <3.14,>=3.10
@@ -4,11 +4,11 @@ lfx/constants.py,sha256=Ert_SpwXhutgcTKEvtDArtkONXgyE5x68opMoQfukMA,203
4
4
  lfx/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  lfx/settings.py,sha256=wnx4zkOLQ8mvampYsnnvVV9GvEnRUuWQpKFSbFTCIp4,181
6
6
  lfx/type_extraction.py,sha256=eCZNl9nAQivKdaPv_9BK71N0JV9Rtr--veAht0dnQ4A,2921
7
- lfx/_assets/component_index.json,sha256=dSsilN_6Ez3PhJ1Huk9IQwlQVqIPaXGMyh7ncigMqeE,3558286
7
+ lfx/_assets/component_index.json,sha256=G1dvQ4NRtFCXk3_Hgphhc3Ox-CC4uggtcQnKRy4_jGQ,3572328
8
8
  lfx/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  lfx/base/constants.py,sha256=v9vo0Ifg8RxDu__XqgGzIXHlsnUFyWM-SSux0uHHoz8,1187
10
10
  lfx/base/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- lfx/base/agents/agent.py,sha256=daiAVaVCSsg3VC3HMVUUrOaLTi6BkZNv5xRB6OIG_4k,12695
11
+ lfx/base/agents/agent.py,sha256=RwUGi1GLua6VEt57Xks6cZygSd9MPoOddsa42FNaB_g,14108
12
12
  lfx/base/agents/callback.py,sha256=mjlT9ukBMVrfjYrHsJowqpY4g9hVGBVBIYhncLWr3tQ,3692
13
13
  lfx/base/agents/context.py,sha256=u0wboX1aRR22Ia8gY14WF12RjhE0Rxv9hPBiixT9DtQ,3916
14
14
  lfx/base/agents/default_prompts.py,sha256=tUjfczwt4D5R1KozNOl1uSL2V2rSCZeUMS-cfV4Gwn0,955
@@ -69,11 +69,11 @@ lfx/base/models/google_generative_ai_constants.py,sha256=EuFd77ZrrSr6YtSKtmEaq0N
69
69
  lfx/base/models/google_generative_ai_model.py,sha256=wEIyBkTZcZD3akUiAKTGxazTJnOQeh80WHMKiHdK1wo,1839
70
70
  lfx/base/models/groq_constants.py,sha256=WOMpYRwJVrZavsi7zGJwRHJX8ZBvdtILUOmBFv0QIPQ,5536
71
71
  lfx/base/models/model.py,sha256=nJgExAvMJ5WMxCqC__Jc1GdkgJag4yrwC9nFtPEVupM,15324
72
- lfx/base/models/model_input_constants.py,sha256=WrnkAmMTk4cMjjLgBzRffJDzow7LWRpfc5GsgdRxvU4,10748
72
+ lfx/base/models/model_input_constants.py,sha256=XDG0xYKmPbxUWUXCtj5b7-5w2b3Wupez4mY-jAr_coI,12893
73
73
  lfx/base/models/model_metadata.py,sha256=tNFPiRqBJ0WPKdNEqBxuoKk0n8H_h0J--bCV5pk9k4o,1325
74
74
  lfx/base/models/model_utils.py,sha256=RwXUSIw5gdRakQ-VGbLI1iT0CeeWrVSNTgUQIrrc6uE,474
75
75
  lfx/base/models/novita_constants.py,sha256=_mgBYGwpddUw4CLhLKJl-psOUzA_SQGHrfZJUNes6aI,1247
76
- lfx/base/models/ollama_constants.py,sha256=FM0BPEtuEmIoH2K1t6tTh5h_H2bK7-YSXe0x4-F4Mik,973
76
+ lfx/base/models/ollama_constants.py,sha256=NixN5DIrmZdz4WqGA2li_PLHYDuWl2D90zWCHxavWaM,1021
77
77
  lfx/base/models/openai_constants.py,sha256=DSlnUjmtb6KXQNDifxop4VVQPvB1Y9vftK6ZmFiudf4,4798
78
78
  lfx/base/models/sambanova_constants.py,sha256=mYPF7vUbMow9l4jQ2OJrIkAJhGs3fGWTCVNfG3oQZTc,519
79
79
  lfx/base/models/watsonx_constants.py,sha256=lR0hOxcrQwHSMTH_49fmYlGJJb6KEeeyoUeXK8PUBf4,792
@@ -116,10 +116,10 @@ lfx/components/Notion/update_page_property.py,sha256=tgmPMbD1eX58dQQNXv1w5FzDec7
116
116
  lfx/components/agentql/__init__.py,sha256=Erl669Dzsk-SegsDPWTtkKbprMXVuv8UTCo5REzZGTc,56
117
117
  lfx/components/agentql/agentql_api.py,sha256=N94yEK7ZuQCIsFBlr_8dqrJY-K1-KNb6QEEYfDIsDME,5569
118
118
  lfx/components/agents/__init__.py,sha256=O5ng90Dn9mSlpCdeGPXM4tvdWYVfEMv_7PGDKShyBKg,1294
119
- lfx/components/agents/agent.py,sha256=-pGSOYS-2pHoYq5VyNdDCnkQVzVz52as4hdF_BB1hVI,26993
119
+ lfx/components/agents/agent.py,sha256=rfczlpKAoTuGDIhJWDQU7GZSXrT1uJbjD-540TakFKU,28103
120
120
  lfx/components/agents/altk_agent.py,sha256=D_ChOwqYao0QZBfiLpiMVoMOgCwzcb_q0MIPDULLHW8,15939
121
121
  lfx/components/agents/cuga_agent.py,sha256=JNi4MsSziTJQI3z_0KGzNWxm5RDaMk_W9zcTW2KcTtI,44499
122
- lfx/components/agents/mcp_component.py,sha256=I8xAV7qGy67uV_4R6lrM4f6EOa9cFPQZDIcP3tiMuYk,26208
122
+ lfx/components/agents/mcp_component.py,sha256=gbEzi-hZMqVmIGO5DjJDOlmpisPkylOSZSGgaDjiQLY,26809
123
123
  lfx/components/aiml/__init__.py,sha256=DNKB-HMFGFYmsdkON-s8557ttgBXVXADmS-BcuSQiIQ,1087
124
124
  lfx/components/aiml/aiml.py,sha256=23Ineg1ajlCoqXgWgp50I20OnQbaleRNsw1c6IzPu3A,3877
125
125
  lfx/components/aiml/aiml_embeddings.py,sha256=2uNwORuj55mxn2SfLbh7oAIfjuXwHbsnOqRjfMtQRqc,1095
@@ -338,7 +338,7 @@ lfx/components/huggingface/__init__.py,sha256=b8NFo5-9zbBY4f9UVMzzQ9GdnSGqHYRKSW
338
338
  lfx/components/huggingface/huggingface.py,sha256=up18KIWd__v1wjKe6Ee4jzFZ3pzYao6RIRRICTFXlEc,7621
339
339
  lfx/components/huggingface/huggingface_inference_api.py,sha256=rwVGZYl0uE-AEeSwMOmnBqc1i-973atZCr2IhX-yVY4,4243
340
340
  lfx/components/ibm/__init__.py,sha256=Jz5-Fc7fG2rW5qeHEJ1z9KfFkItpuINKBu-D4HaT-uc,1094
341
- lfx/components/ibm/watsonx.py,sha256=hcJJOSFM8U6SkNznBqXfBdn4wIS6PWhEYC1ke7xpw98,7732
341
+ lfx/components/ibm/watsonx.py,sha256=M2Ai4KDSJFy2VI9evLTr5fYn67eyMxJQpXl64xedQp0,7940
342
342
  lfx/components/ibm/watsonx_embeddings.py,sha256=_97UE-qQDCjkWfX3NFWNCti4TUXxO1LO0FIBQnFW4Co,4824
343
343
  lfx/components/icosacomputing/__init__.py,sha256=NByWM-IMPf7N1lOeZDet8CvIa8A25kG3yKircYwS52w,120
344
344
  lfx/components/icosacomputing/combinatorial_reasoner.py,sha256=SFVwR_8jGHVDaGO81jj2vzzeKh892h1nMGxCDljbvNY,2766
@@ -435,7 +435,7 @@ lfx/components/nvidia/system_assist.py,sha256=G8cgsLQxRBBnUt49_Uzxt7cdTNplVAzUlD
435
435
  lfx/components/olivya/__init__.py,sha256=ilZR88huL3vnQHO27g4jsUkyIYSgN7RPOq8Corbi6xA,67
436
436
  lfx/components/olivya/olivya.py,sha256=PDmsn8dBdSwAZUM2QGTyTwxGWsINCKaYR4yTjE-4lIQ,4192
437
437
  lfx/components/ollama/__init__.py,sha256=fau8QcWs_eHO2MmtQ4coiKj9CzFA9X4hqFf541ekgXk,1068
438
- lfx/components/ollama/ollama.py,sha256=KSaBAdgyh1xmkIvVcBHRVwFwzBtR7wPkH4j3dlJnPC4,13946
438
+ lfx/components/ollama/ollama.py,sha256=1yhL2dDoeOEikhP2bjx6jc8p4B-uCGFQiyyhSk40Ruk,21238
439
439
  lfx/components/ollama/ollama_embeddings.py,sha256=nvg-JQvue6j7tcrbbPeq1U_-LUj1MKawWbXxnnvJlWM,3976
440
440
  lfx/components/openai/__init__.py,sha256=G4Fgw4pmmDohdIOmzaeSCGijzKjyqFXNJPLwlcUDZ3w,1113
441
441
  lfx/components/openai/openai.py,sha256=imWO1tTJ0tTLqax1v5bNBPCRINTj2f2wN8j5G-a07GI,4505
@@ -658,7 +658,7 @@ lfx/schema/log.py,sha256=TISQa44D4pL_-AOw9p0nOPV-7s6Phl-0yrpuZihhEsU,1981
658
658
  lfx/schema/message.py,sha256=U4vtgkC6lNciJbfwtrIquyB3-UdPieHAjuegGk8416E,18506
659
659
  lfx/schema/openai_responses_schemas.py,sha256=drMCAlliefHfGRojBTMepPwk4DyEGh67naWvMPD10Sw,2596
660
660
  lfx/schema/properties.py,sha256=ZRY6FUDfqpc5wQ-bi-ZuUUrusF9t-pt9fQa_FNPpia0,1356
661
- lfx/schema/schema.py,sha256=XbIuvD64EdVljP1V32tsEL-ETXOQSFipMDaiMGzYttM,5079
661
+ lfx/schema/schema.py,sha256=WkwdKNbtnHlh4GhQANXuxHRyS9SAXnTPd7KFhsGIoiU,5296
662
662
  lfx/schema/serialize.py,sha256=Y7aL91w3BW4ZYkgdIHosUYdpIJUDku-SoqYoIQtwtGM,252
663
663
  lfx/schema/table.py,sha256=1RdMmk1vbzmPFW0JEGhP7WDDRtvUKH9lkDw5v-JWhSw,4668
664
664
  lfx/schema/validators.py,sha256=1CC4jU3sFmPnauie_U_Xb_QpcnsBf3XT7oWphr5Lt8U,4023
@@ -730,7 +730,7 @@ lfx/utils/schemas.py,sha256=NbOtVQBrn4d0BAu-0H_eCTZI2CXkKZlRY37XCSmuJwc,3865
730
730
  lfx/utils/util.py,sha256=Ww85wbr1-vjh2pXVtmTqoUVr6MXAW8S7eDx_Ys6HpE8,20696
731
731
  lfx/utils/util_strings.py,sha256=nU_IcdphNaj6bAPbjeL-c1cInQPfTBit8mp5Y57lwQk,1686
732
732
  lfx/utils/version.py,sha256=cHpbO0OJD2JQAvVaTH_6ibYeFbHJV0QDHs_YXXZ-bT8,671
733
- lfx_nightly-0.1.13.dev7.dist-info/METADATA,sha256=bl6Wzs3EwJJ9crsxG58N8NMIpRf95C6a4VRs1O5rDvA,8289
734
- lfx_nightly-0.1.13.dev7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
735
- lfx_nightly-0.1.13.dev7.dist-info/entry_points.txt,sha256=1724p3RHDQRT2CKx_QRzEIa7sFuSVO0Ux70YfXfoMT4,42
736
- lfx_nightly-0.1.13.dev7.dist-info/RECORD,,
733
+ lfx_nightly-0.1.13.dev9.dist-info/METADATA,sha256=zT2mu9Kd1fxFLKHjFAbb27fdhn9i4defm2zEVhYw1Yc,8289
734
+ lfx_nightly-0.1.13.dev9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
735
+ lfx_nightly-0.1.13.dev9.dist-info/entry_points.txt,sha256=1724p3RHDQRT2CKx_QRzEIa7sFuSVO0Ux70YfXfoMT4,42
736
+ lfx_nightly-0.1.13.dev9.dist-info/RECORD,,