flock-core 0.3.11__py3-none-any.whl → 0.3.14__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 flock-core might be problematic. Click here for more details.

@@ -1,21 +1,33 @@
1
- """Memory module implementation for Flock agents."""
2
-
3
1
  import json
4
2
  import uuid
5
3
  from datetime import datetime
6
- from typing import Any
4
+ from typing import Any, Literal
7
5
 
8
6
  from pydantic import Field
7
+ from tqdm import tqdm
9
8
 
10
9
  from flock.core import FlockAgent, FlockModule, FlockModuleConfig
11
10
  from flock.core.logging.logging import get_logger
12
11
  from flock.modules.memory.memory_parser import MemoryMappingParser
13
12
  from flock.modules.memory.memory_storage import FlockMemoryStore, MemoryEntry
14
13
 
14
+ logger = get_logger("memory")
15
+
15
16
 
16
17
  class MemoryModuleConfig(FlockModuleConfig):
17
- """Configuration for the memory module."""
18
+ """Configuration for the MemoryModule.
18
19
 
20
+ This class defines the configuration for the MemoryModule.
21
+ """
22
+
23
+ folder_path: str = Field(
24
+ default="concept_memory/",
25
+ description="Directory where memory file and concept graph will be saved",
26
+ )
27
+ concept_graph_file: str = Field(
28
+ default="concept_graph.png",
29
+ description="Base filename for the concept graph image",
30
+ )
19
31
  file_path: str | None = Field(
20
32
  default="agent_memory.json", description="Path to save memory file"
21
33
  )
@@ -25,26 +37,25 @@ class MemoryModuleConfig(FlockModuleConfig):
25
37
  similarity_threshold: float = Field(
26
38
  default=0.5, description="Threshold for semantic similarity"
27
39
  )
28
- context_window: int = Field(
29
- default=3, description="Number of memory entries to return"
30
- )
31
40
  max_length: int = Field(
32
41
  default=1000, description="Max length of memory entry before splitting"
33
42
  )
34
43
  save_after_update: bool = Field(
35
44
  default=True, description="Whether to save memory after each update"
36
45
  )
37
-
38
-
39
- logger = get_logger("memory")
46
+ splitting_mode: Literal["summary", "semantic", "characters", "none"] = (
47
+ Field(default="none", description="Mode to split memory content")
48
+ )
49
+ enable_read_only_mode: bool = Field(
50
+ default=False, description="Whether to enable read only mode"
51
+ )
52
+ number_of_concepts_to_extract: int = Field(
53
+ default=3, description="Number of concepts to extract from the memory"
54
+ )
40
55
 
41
56
 
42
57
  class MemoryModule(FlockModule):
43
- """Module that adds memory capabilities to a Flock agent.
44
-
45
- This module encapsulates all memory-related functionality that was previously
46
- hardcoded into FlockAgent.
47
- """
58
+ """Module that adds memory capabilities to a Flock agent."""
48
59
 
49
60
  name: str = "memory"
50
61
  config: MemoryModuleConfig = Field(
@@ -52,31 +63,34 @@ class MemoryModule(FlockModule):
52
63
  description="Memory module configuration",
53
64
  )
54
65
  memory_store: FlockMemoryStore | None = None
55
- memory_ops: list = []
66
+ memory_ops: list[Any] = []
67
+
68
+ def __init__(self, name: str, config: MemoryModuleConfig):
69
+ super().__init__(name=name, config=config)
70
+ self.memory_store = FlockMemoryStore.load_from_file(
71
+ self.get_memory_filename(name)
72
+ )
73
+ self.memory_ops = (
74
+ MemoryMappingParser().parse(self.config.memory_mapping)
75
+ if self.config.memory_mapping
76
+ else [{"type": "semantic"}]
77
+ )
56
78
 
57
- async def pre_initialize(
79
+ async def initialize(
58
80
  self, agent: FlockAgent, inputs: dict[str, Any]
59
81
  ) -> None:
60
82
  """Initialize memory store if needed."""
61
83
  if not self.memory_store:
62
84
  self.memory_store = FlockMemoryStore.load_from_file(
63
- self.config.file_path
85
+ self.get_memory_filename(self.name)
64
86
  )
65
-
66
- if not self.config.memory_mapping:
67
- self.memory_ops = []
68
- self.memory_ops.append({"type": "semantic"})
69
- else:
70
- self.memory_ops = MemoryMappingParser().parse(
71
- self.config.memory_mapping
72
- )
73
-
87
+ self.memory_ops = (
88
+ MemoryMappingParser().parse(self.config.memory_mapping)
89
+ if self.config.memory_mapping
90
+ else [{"type": "semantic"}]
91
+ )
74
92
  logger.debug(f"Initialized memory module for agent {agent.name}")
75
93
 
76
- async def post_initialize(self, agent: Any, inputs: dict[str, Any]) -> None:
77
- """No post-initialization needed."""
78
- pass
79
-
80
94
  async def pre_evaluate(
81
95
  self, agent: FlockAgent, inputs: dict[str, Any]
82
96
  ) -> dict[str, Any]:
@@ -85,12 +99,11 @@ class MemoryModule(FlockModule):
85
99
  return inputs
86
100
 
87
101
  try:
88
- # Convert input to embedding
89
102
  input_text = json.dumps(inputs)
90
103
  query_embedding = self.memory_store.compute_embedding(input_text)
91
-
92
- # Extract concepts
93
- concepts = await self._extract_concepts(agent, input_text)
104
+ concepts = await self._extract_concepts(
105
+ agent, input_text, self.config.number_of_concepts_to_extract
106
+ )
94
107
 
95
108
  memory_results = []
96
109
  for op in self.memory_ops:
@@ -101,7 +114,6 @@ class MemoryModule(FlockModule):
101
114
  similarity_threshold=self.config.similarity_threshold,
102
115
  )
103
116
  memory_results.extend(semantic_results)
104
-
105
117
  elif op["type"] == "exact":
106
118
  exact_results = self.memory_store.exact_match(inputs)
107
119
  memory_results.extend(exact_results)
@@ -116,120 +128,270 @@ class MemoryModule(FlockModule):
116
128
  return inputs
117
129
 
118
130
  except Exception as e:
119
- logger.warning(f"Memory retrieval failed: {e!s}", agent=agent.name)
131
+ logger.warning(f"Memory retrieval failed: {e}", agent=agent.name)
120
132
  return inputs
121
133
 
122
- async def post_evaluate(
123
- self, agent: FlockAgent, inputs: dict[str, Any], result: dict[str, Any]
124
- ) -> dict[str, Any]:
125
- """Store results in memory after evaluation."""
134
+ def get_memory_filename(self, module_name: str) -> str:
135
+ """Generate the full file path for the memory file."""
136
+ folder = self.config.folder_path
137
+ if not folder.endswith(("/", "\\")):
138
+ folder += "/"
139
+ import os
140
+
141
+ if not os.path.exists(folder):
142
+ os.makedirs(folder, exist_ok=True)
143
+ # Determine base filename and extension from file_path config
144
+ if self.config.file_path:
145
+ file_name = self.config.file_path.rsplit("/", 1)[-1].rsplit(
146
+ "\\", 1
147
+ )[-1]
148
+ if "." in file_name:
149
+ base, ext = file_name.rsplit(".", 1)
150
+ ext = f".{ext}"
151
+ else:
152
+ base, ext = file_name, ""
153
+ else:
154
+ base, ext = "agent_memory", ".json"
155
+ return f"{folder}{module_name}_{base}{ext}"
156
+
157
+ def get_concept_graph_filename(self, module_name: str) -> str:
158
+ """Generate the full file path for the concept graph image."""
159
+ folder = self.config.folder_path
160
+ if not folder.endswith(("/", "\\")):
161
+ folder += "/"
162
+ import os
163
+
164
+ if not os.path.exists(folder):
165
+ os.makedirs(folder, exist_ok=True)
166
+ # Use timestamp to create a unique filename
167
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
168
+ if self.config.concept_graph_file:
169
+ file_name = self.config.concept_graph_file.rsplit("/", 1)[
170
+ -1
171
+ ].rsplit("\\", 1)[-1]
172
+ if "." in file_name:
173
+ base, ext = file_name.rsplit(".", 1)
174
+ ext = f".{ext}"
175
+ else:
176
+ base, ext = file_name, ""
177
+ else:
178
+ base, ext = "concept_graph", ".png"
179
+ return f"{folder}{module_name}_{base}_{timestamp}{ext}"
180
+
181
+ async def search_memory(
182
+ self, agent: FlockAgent, query: dict[str, Any]
183
+ ) -> list[str]:
184
+ """Search memory for the query."""
126
185
  if not self.memory_store:
127
- return result
186
+ return []
128
187
 
129
188
  try:
130
- # Extract information chunks
131
- chunks = await self._extract_information(agent, inputs, result)
132
- chunk_concepts = await self._extract_concepts(agent, chunks)
133
-
134
- # Create memory entry
135
- entry = MemoryEntry(
136
- id=str(uuid.uuid4()),
137
- content=chunks,
138
- embedding=self.memory_store.compute_embedding(chunks).tolist(),
139
- concepts=chunk_concepts,
140
- timestamp=datetime.now(),
189
+ input_text = json.dumps(query)
190
+ query_embedding = self.memory_store.compute_embedding(input_text)
191
+ concepts = await self._extract_concepts(
192
+ agent, input_text, self.config.number_of_concepts_to_extract
141
193
  )
142
194
 
143
- # Add to memory store
144
- self.memory_store.add_entry(entry)
195
+ memory_results = []
196
+ for op in self.memory_ops:
197
+ if op["type"] == "semantic":
198
+ semantic_results = self.memory_store.retrieve(
199
+ query_embedding,
200
+ concepts,
201
+ similarity_threshold=self.config.similarity_threshold,
202
+ )
203
+ memory_results.extend(semantic_results)
204
+ elif op["type"] == "exact":
205
+ exact_results = self.memory_store.exact_match(query)
206
+ memory_results.extend(exact_results)
207
+
208
+ if memory_results:
209
+ logger.debug(
210
+ f"Found {len(memory_results)} relevant memories",
211
+ agent=agent.name,
212
+ )
213
+ query["memory_results"] = memory_results
145
214
 
146
- if self.config.save_after_update:
147
- self.save_memory()
215
+ return query
148
216
 
149
- logger.debug(
150
- "Stored interaction in memory",
151
- agent=agent.name,
152
- entry_id=entry.id,
153
- concepts=chunk_concepts,
154
- )
217
+ except Exception as e:
218
+ logger.warning(f"Memory retrieval failed: {e}", agent=agent.name)
219
+ return query
155
220
 
221
+ async def add_to_memory(
222
+ self, agent: FlockAgent, data: dict[str, Any]
223
+ ) -> None:
224
+ """Add data to memory."""
225
+ if not self.memory_store:
226
+ return
227
+
228
+ try:
229
+ chunks = await self._get_chunks(agent, data, None)
230
+ await self._store_chunks(agent, chunks)
156
231
  except Exception as e:
157
- logger.warning(f"Memory storage failed: {e!s}", agent=agent.name)
232
+ logger.warning(f"Memory storage failed: {e}", agent=agent.name)
158
233
 
159
- return result
234
+ async def post_evaluate(
235
+ self, agent: FlockAgent, inputs: dict[str, Any], result: dict[str, Any]
236
+ ) -> dict[str, Any]:
237
+ """Store results in memory after evaluation."""
238
+ if not self.memory_store:
239
+ return result
160
240
 
161
- async def pre_terminate(
162
- self, agent: Any, inputs: dict[str, Any], result: dict[str, Any]
163
- ) -> None:
164
- """No pre-termination needed."""
165
- pass
241
+ try:
242
+ chunks = await self._get_chunks(agent, inputs, result)
243
+ await self._store_chunks(agent, chunks)
244
+ except Exception as e:
245
+ logger.warning(f"Memory storage failed: {e}", agent=agent.name)
166
246
 
167
- async def post_terminate(
247
+ return result
248
+
249
+ async def terminate(
168
250
  self, agent: Any, inputs: dict[str, Any], result: dict[str, Any]
169
251
  ) -> None:
170
252
  """Save memory store if configured."""
171
253
  if self.config.save_after_update and self.memory_store:
172
254
  self.save_memory()
173
255
 
174
- async def _extract_concepts(self, agent: FlockAgent, text: str) -> set[str]:
175
- """Extract concepts using agent's LLM capabilities."""
176
- existing_concepts = None
177
- if self.memory_store.concept_graph:
256
+ async def _extract_concepts(
257
+ self, agent: FlockAgent, text: str, number_of_concepts: int = 3
258
+ ) -> set[str]:
259
+ """Extract concepts using the agent's LLM capabilities."""
260
+ existing_concepts = set()
261
+ if self.memory_store and self.memory_store.concept_graph:
178
262
  existing_concepts = set(
179
263
  self.memory_store.concept_graph.graph.nodes()
180
264
  )
181
265
 
182
- input = "text: str | Text to analyze"
266
+ input_signature = "text: str | Text to analyze"
183
267
  if existing_concepts:
184
- input += ", existing_concepts: list[str] | Already known concepts that might apply"
268
+ input_signature += ", existing_concepts: list[str] | Already known concepts that might apply"
185
269
 
186
- # Create signature for concept extraction using agent's capabilities
187
270
  concept_signature = agent.create_dspy_signature_class(
188
271
  f"{agent.name}_concept_extractor",
189
272
  "Extract key concepts from text",
190
- f"{input} -> concepts: list[str] | Max five key concepts all lower case",
273
+ f"{input_signature} -> concepts: list[str] | Max {number_of_concepts} key concepts all lower case",
191
274
  )
192
275
 
193
- # Configure and run the predictor
194
- agent._configure_language_model()
276
+ agent._configure_language_model(agent.model, True, 0.0, 8192)
195
277
  predictor = agent._select_task(concept_signature, "Completion")
196
- result = predictor(
278
+ result_obj = predictor(
197
279
  text=text,
198
280
  existing_concepts=list(existing_concepts)
199
281
  if existing_concepts
200
282
  else None,
201
283
  )
202
-
203
- concept_list = result.concepts if hasattr(result, "concepts") else []
284
+ concept_list = getattr(result_obj, "concepts", [])
204
285
  return set(concept_list)
205
286
 
206
- async def _extract_information(
287
+ async def _summarize_mode(
207
288
  self, agent: FlockAgent, inputs: dict[str, Any], result: dict[str, Any]
208
289
  ) -> str:
209
- """Extract information chunks from interaction."""
210
- # Create splitter signature using agent's capabilities
290
+ """Extract information chunks using summary mode."""
211
291
  split_signature = agent.create_dspy_signature_class(
212
292
  f"{agent.name}_splitter",
213
293
  "Extract a list of potentially needed data and information for future reference",
214
294
  """
215
295
  content: str | The content to split
216
- -> chunks: list[str] | list of data and information for future reference
296
+ -> chunks: list[str] | List of data and information for future reference
217
297
  """,
218
298
  )
219
-
220
- # Configure and run the predictor
221
- agent._configure_language_model()
299
+ agent._configure_language_model(agent.model, True, 0.0, 8192)
222
300
  splitter = agent._select_task(split_signature, "Completion")
223
-
224
- # Get the content to split
225
301
  full_text = json.dumps(inputs) + json.dumps(result)
226
302
  split_result = splitter(content=full_text)
227
-
228
303
  return "\n".join(split_result.chunks)
229
304
 
305
+ async def _semantic_splitter_mode(
306
+ self, agent: FlockAgent, inputs: dict[str, Any], result: dict[str, Any]
307
+ ) -> str | list[dict[str, str]]:
308
+ """Extract information chunks using semantic mode."""
309
+ split_signature = agent.create_dspy_signature_class(
310
+ f"{self.name}_splitter",
311
+ "Split content into meaningful, self-contained chunks",
312
+ """
313
+ content: str | The content to split
314
+ -> chunks: list[dict[str,str]] | List of chunks as key-value pairs - keys are a short title and values are the chunk content
315
+ """,
316
+ )
317
+ agent._configure_language_model(agent.model, True, 0.0, 8192)
318
+ splitter = agent._select_task(split_signature, "Completion")
319
+ full_text = json.dumps(inputs) + (json.dumps(result) if result else "")
320
+ split_result = splitter(content=full_text)
321
+ return split_result.chunks
322
+
323
+ async def _character_splitter_mode(
324
+ self, agent: FlockAgent, inputs: dict[str, Any], result: dict[str, Any]
325
+ ) -> list[str]:
326
+ """Extract information chunks by splitting text into fixed character lengths."""
327
+ full_text = json.dumps(inputs) + (json.dumps(result) if result else "")
328
+ return [
329
+ full_text[i : i + self.config.max_length]
330
+ for i in range(0, len(full_text), self.config.max_length)
331
+ ]
332
+
333
+ async def _get_chunks(
334
+ self,
335
+ agent: FlockAgent,
336
+ inputs: dict[str, Any],
337
+ result: dict[str, Any] | None,
338
+ ) -> str | list[str]:
339
+ """Get memory chunks based on the configured splitting mode."""
340
+ mode = self.config.splitting_mode
341
+ if mode == "semantic":
342
+ return await self._semantic_splitter_mode(agent, inputs, result)
343
+ elif mode == "summary":
344
+ return await self._summarize_mode(agent, inputs, result)
345
+ elif mode == "characters":
346
+ return await self._character_splitter_mode(agent, inputs, result)
347
+ elif mode == "none":
348
+ return (
349
+ json.dumps(inputs) + json.dumps(result)
350
+ if result
351
+ else json.dumps(inputs)
352
+ )
353
+ else:
354
+ raise ValueError(f"Unknown splitting mode: {mode}")
355
+
356
+ async def _store_chunk(self, agent: FlockAgent, chunk: str) -> None:
357
+ """Store a single chunk in memory."""
358
+ chunk_concepts = await self._extract_concepts(
359
+ agent, chunk, self.config.number_of_concepts_to_extract
360
+ )
361
+ entry = MemoryEntry(
362
+ id=str(uuid.uuid4()),
363
+ content=chunk,
364
+ embedding=self.memory_store.compute_embedding(chunk).tolist(),
365
+ concepts=chunk_concepts,
366
+ timestamp=datetime.now(),
367
+ )
368
+ self.memory_store.add_entry(entry)
369
+ if self.config.save_after_update:
370
+ self.save_memory()
371
+ logger.debug(
372
+ "Stored interaction in memory",
373
+ agent=agent.name,
374
+ entry_id=entry.id,
375
+ concepts=chunk_concepts,
376
+ )
377
+
378
+ async def _store_chunks(
379
+ self, agent: FlockAgent, chunks: str | list[str]
380
+ ) -> None:
381
+ """Store chunks (single or multiple) in memory."""
382
+ if isinstance(chunks, str):
383
+ await self._store_chunk(agent, chunks)
384
+ elif isinstance(chunks, list):
385
+ for chunk in tqdm(chunks, desc="Storing chunks in memory"):
386
+ await self._store_chunk(agent, chunk)
387
+
230
388
  def save_memory(self) -> None:
231
389
  """Save memory store to file."""
232
390
  if self.memory_store and self.config.file_path:
233
391
  json_str = self.memory_store.model_dump_json()
234
- with open(self.config.file_path, "w") as file:
392
+ filename = self.get_memory_filename(self.name)
393
+ with open(filename, "w") as file:
235
394
  file.write(json_str)
395
+ self.memory_store.concept_graph.save_as_image(
396
+ self.get_concept_graph_filename(self.name)
397
+ )
@@ -3,7 +3,7 @@
3
3
  import re
4
4
  from typing import Any
5
5
 
6
- from flock.core.memory.memory_storage import (
6
+ from flock.modules.memory.memory_storage import (
7
7
  CombineOperation,
8
8
  EnrichOperation,
9
9
  ExactOperation,
@@ -54,6 +54,10 @@ class OutputModuleConfig(FlockModuleConfig):
54
54
  default_factory=dict,
55
55
  description="Custom formatters for specific output types",
56
56
  )
57
+ no_output: bool = Field(
58
+ default=False,
59
+ description="Whether to suppress output",
60
+ )
57
61
 
58
62
 
59
63
  class OutputModule(FlockModule):
@@ -159,6 +163,8 @@ class OutputModule(FlockModule):
159
163
  ) -> dict[str, Any]:
160
164
  """Format and display the output."""
161
165
  logger.debug("Formatting and displaying output")
166
+ if self.config.no_output:
167
+ return result
162
168
  # Display the result using the formatter
163
169
  self._formatter.display_result(result, agent.name)
164
170
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flock-core
3
- Version: 0.3.11
3
+ Version: 0.3.14
4
4
  Summary: Declarative LLM Orchestration at Scale
5
5
  Author-email: Andre Ratzenberger <andre.ratzenberger@whiteduck.de>
6
6
  License-File: LICENSE
@@ -8,6 +8,7 @@ Classifier: License :: OSI Approved :: MIT License
8
8
  Classifier: Operating System :: OS Independent
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Requires-Python: >=3.10
11
+ Requires-Dist: chromadb>=0.6.3
11
12
  Requires-Dist: cloudpickle>=3.1.1
12
13
  Requires-Dist: devtools>=0.12.2
13
14
  Requires-Dist: dspy==2.5.42
@@ -10,9 +10,9 @@ flock/cli/load_release_notes.py,sha256=qFcgUrMddAE_TP6x1P-6ZywTUjTknfhTDW5LTxtg1
10
10
  flock/cli/settings.py,sha256=DkeLUlrb7rGx3nZ04aADU9HXXu5mZTf_DBwT0xhzIv4,7
11
11
  flock/cli/assets/release_notes.md,sha256=-RuE-G9Sn8z1LWEdr9iqjuQN7N1K_JMaCzHYoyLR42U,4793
12
12
  flock/core/__init__.py,sha256=mPlvKc0SxC2qCvSlgYeP_7EyV8ptmdn24NO8mlQoCSo,559
13
- flock/core/flock.py,sha256=Qch-6Z8XgLGzl-u5dbcXOOZYCqj40LjcAT0o22KrRE4,19263
14
- flock/core/flock_agent.py,sha256=MydN_A-oXKPJIJArHS61XSQnUjDktZovPkRuZOBokN4,11857
15
- flock/core/flock_api.py,sha256=SKQVKgFCaNCqHtwvIcksnpqG6ajHodVhs3oaKUw-d8c,7192
13
+ flock/core/flock.py,sha256=IURlcuNvdsnqKkvgXtX4v_pGWQ8Lfb60X--MT0zvxHo,19881
14
+ flock/core/flock_agent.py,sha256=qG6j-aSxSTEcvv5tjMyw3RTCaBooIGF7IVhAUOrhPOo,11946
15
+ flock/core/flock_api.py,sha256=2rHnmEdtT5KPZYwGesRT7LqwbrgKClODHT-O56u7pcQ,7140
16
16
  flock/core/flock_evaluator.py,sha256=j7riJj_KsWoBnKmLiGp-U0CRhxDyJbgEdLGN26tfKm8,1588
17
17
  flock/core/flock_factory.py,sha256=nh0tK5UzEPWP5EmFrRvhsAeaZEvaPG5e0tkYkHpTjy0,2606
18
18
  flock/core/flock_module.py,sha256=3DmxOc39gQS-tiJcgUCjMaLr8QDDJR4acV_M76Xcf6I,2602
@@ -24,7 +24,7 @@ flock/core/execution/local_executor.py,sha256=rnIQvaJOs6zZORUcR3vvyS6LPREDJTjayg
24
24
  flock/core/execution/temporal_executor.py,sha256=OF_uXgQsoUGp6U1ZkcuaidAEKyH7XDtbfrtdF10XQ_4,1675
25
25
  flock/core/interpreter/python_interpreter.py,sha256=RaUMZuufsKBNQ4FAeSaOgUuxzs8VYu5TgUUs-xwaxxM,26376
26
26
  flock/core/logging/__init__.py,sha256=Q8hp9-1ilPIUIV0jLgJ3_cP7COrea32cVwL7dicPnlM,82
27
- flock/core/logging/logging.py,sha256=RigZwiu5gsLMqHwhplGkGrmw74xe8M-5KLGIBSsjouY,7620
27
+ flock/core/logging/logging.py,sha256=uWtUZnQI_sdtzLfXo61JPENSNNwplvEuGMPIhsYd-gQ,12448
28
28
  flock/core/logging/telemetry.py,sha256=3E9Tyj6AUR6A5RlIufcdCdWm5BAA7tbOsCa7lHoUQaU,5404
29
29
  flock/core/logging/trace_and_logged.py,sha256=5vNrK1kxuPMoPJ0-QjQg-EDJL1oiEzvU6UNi6X8FiMs,2117
30
30
  flock/core/logging/formatters/enum_builder.py,sha256=LgEYXUv84wK5vwHflZ5h8HBGgvLH3sByvUQe8tZiyY0,981
@@ -40,19 +40,22 @@ flock/core/mixin/prompt_parser.py,sha256=eOqI-FK3y17gVqpc_y5GF-WmK1Jv8mFlkZxTcgw
40
40
  flock/core/registry/agent_registry.py,sha256=TUClh9e3eA6YzZC1CMTlsTPvQeqb9jYHewi-zPpcWM8,4987
41
41
  flock/core/serialization/secure_serializer.py,sha256=n5-zRvvXddgJv1FFHsaQ2wuYdL3WUSGPvG_LGaffEJo,6144
42
42
  flock/core/serialization/serializable.py,sha256=SymJ0YrjBx48mOBItYSqoRpKuzIc4vKWRS6ScTzre7s,2573
43
- flock/core/tools/basic_tools.py,sha256=fI9r81_ktRiRhNLwT-jSJ9rkjl28LC1ZfL-njnno2iw,4761
43
+ flock/core/tools/basic_tools.py,sha256=idomjqvphTKIhuEkVS9CCJaigx_j_rv4jHqeDwp8sQY,5037
44
+ flock/core/tools/llm_tools.py,sha256=Bdt4Dpur5dGpxd2KFEQyxjfZazvW1HCDKY6ydMj6UgQ,21811
45
+ flock/core/tools/markdown_tools.py,sha256=W6fGM48yGHbifVlaOk1jOtVcybfRbRmf20VbDOZv8S4,6031
44
46
  flock/core/tools/dev_tools/github.py,sha256=a2OTPXS7kWOVA4zrZHynQDcsmEi4Pac5MfSjQOLePzA,5308
45
47
  flock/core/util/cli_helper.py,sha256=QSpP10WRNcjXzVFwpTQA8lSBy7707Qlv7uCit1XjUms,49808
46
48
  flock/core/util/hydrator.py,sha256=6qNwOwCZB7r6y25BZ--0PGofrAlfMaXbDKFQeP5NLts,11196
47
49
  flock/core/util/input_resolver.py,sha256=g9vDPdY4OH-G7qjas5ksGEHueokHGFPMoLOvC-ngeLo,5984
48
50
  flock/evaluators/declarative/declarative_evaluator.py,sha256=f8ldgZZp94zC4CoGzBufKvbvtckCGBe9EHTOoAZfZK0,1695
51
+ flock/evaluators/memory/memory_evaluator.py,sha256=SmerXyNaqm8DTV0yw-WqWkn9DXIf6x-nPG1eyTV6NY8,3452
49
52
  flock/evaluators/natural_language/natural_language_evaluator.py,sha256=6nVEeh8_uwv_h-d3FWlA0GbzDzRtdhvxCGKirHtyvOU,2012
50
53
  flock/evaluators/zep/zep_evaluator.py,sha256=9NOELl7JAuUcx_FQrxY6b-_vN3MjwDyW7ZppPIGeCFc,1954
51
54
  flock/modules/callback/callback_module.py,sha256=hCCw-HNYjK4aHnUQfvw26ZP1Q_jdlKb9kDh3BHzbCQA,2916
52
- flock/modules/memory/memory_module.py,sha256=2grdmvw7FJWZvz0IjgASbDPCfyS1w4gWkRzOWtK7BFM,8214
53
- flock/modules/memory/memory_parser.py,sha256=2S7CmVEsm22gD7-MiFj4318FTg8wd_jB-RKMwXI14WM,4369
55
+ flock/modules/memory/memory_module.py,sha256=z0MfMNpIsjL9NEXdfVofQ99z1ZaULQ1Fk3gp3SxEhd8,15246
56
+ flock/modules/memory/memory_parser.py,sha256=FLH7GL8XThvHiCMfX3eQH7Sz-f62fzhAUmO6_gaDI7U,4372
54
57
  flock/modules/memory/memory_storage.py,sha256=CNcLDMmvv0x7Z3YMKr6VveS_VCa7rKPw8l2d-XgqokA,27246
55
- flock/modules/output/output_module.py,sha256=_Hid4ycGEl14m7GEsVGE9wp88SYkQ3eq_x4avUQcTWI,6985
58
+ flock/modules/output/output_module.py,sha256=ygk553PxKulmoGlRL0F_iP_FMiDteEtAcz9zUfYYTdI,7153
56
59
  flock/modules/performance/metrics_module.py,sha256=JsLIVs-2PZ_A8GyYLNVBsNXdSFyrVid3YGd0fu4HXyM,16404
57
60
  flock/modules/zep/zep_module.py,sha256=BIJ5K-hg2bLeJmGKoDcVY1rVN7_0yYETiSaVrO-gtMI,5830
58
61
  flock/platform/docker_tools.py,sha256=fpA7-6rJBjPOUBLdQP4ny2QPgJ_042nmqRn5GtKnoYw,1445
@@ -406,8 +409,8 @@ flock/workflow/activities.py,sha256=JDfcmn99k5UTN3QNm5hAdn_eRjWRYhWSIw1U0kMOAh4,
406
409
  flock/workflow/agent_activities.py,sha256=NhBZscflEf2IMfSRa_pBM_TRP7uVEF_O0ROvWZ33eDc,963
407
410
  flock/workflow/temporal_setup.py,sha256=VWBgmBgfTBjwM5ruS_dVpA5AVxx6EZ7oFPGw4j3m0l0,1091
408
411
  flock/workflow/workflow.py,sha256=I9MryXW_bqYVTHx-nl2epbTqeRy27CAWHHA7ZZA0nAk,1696
409
- flock_core-0.3.11.dist-info/METADATA,sha256=wgf_Y0msbblc7iVau5wGgYLqgHcwY9ap5fSXiponIRQ,20471
410
- flock_core-0.3.11.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
411
- flock_core-0.3.11.dist-info/entry_points.txt,sha256=rWaS5KSpkTmWySURGFZk6PhbJ87TmvcFQDi2uzjlagQ,37
412
- flock_core-0.3.11.dist-info/licenses/LICENSE,sha256=iYEqWy0wjULzM9GAERaybP4LBiPeu7Z1NEliLUdJKSc,1072
413
- flock_core-0.3.11.dist-info/RECORD,,
412
+ flock_core-0.3.14.dist-info/METADATA,sha256=-baOqTXylWNerDitHki7cJoYtHFFS9x3k8VWf1S6-SI,20502
413
+ flock_core-0.3.14.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
414
+ flock_core-0.3.14.dist-info/entry_points.txt,sha256=rWaS5KSpkTmWySURGFZk6PhbJ87TmvcFQDi2uzjlagQ,37
415
+ flock_core-0.3.14.dist-info/licenses/LICENSE,sha256=iYEqWy0wjULzM9GAERaybP4LBiPeu7Z1NEliLUdJKSc,1072
416
+ flock_core-0.3.14.dist-info/RECORD,,