autonomous-app 0.3.39__tar.gz → 0.3.41__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.
Files changed (68) hide show
  1. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/PKG-INFO +1 -1
  2. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/__init__.py +1 -1
  3. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/ai/imageagent.py +1 -3
  4. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/ai/jsonagent.py +2 -4
  5. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/ai/models/local_model.py +62 -51
  6. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous_app.egg-info/PKG-INFO +1 -1
  7. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/README.md +0 -0
  8. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/pyproject.toml +0 -0
  9. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/requirements.txt +0 -0
  10. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/setup.cfg +0 -0
  11. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/setup.py +0 -0
  12. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/ai/__init__.py +0 -0
  13. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/ai/audioagent.py +0 -0
  14. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/ai/baseagent.py +0 -0
  15. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/ai/models/__init__.py +0 -0
  16. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/ai/models/gemini.py +0 -0
  17. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/ai/textagent.py +0 -0
  18. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/apis/version_control/GHCallbacks.py +0 -0
  19. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/apis/version_control/GHOrganization.py +0 -0
  20. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/apis/version_control/GHRepo.py +0 -0
  21. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/apis/version_control/GHVersionControl.py +0 -0
  22. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/apis/version_control/__init__.py +0 -0
  23. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/auth/__init__.py +0 -0
  24. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/auth/autoauth.py +0 -0
  25. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/auth/github.py +0 -0
  26. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/auth/google.py +0 -0
  27. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/auth/user.py +0 -0
  28. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/cli.py +0 -0
  29. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/__init__.py +0 -0
  30. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/base/__init__.py +0 -0
  31. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/base/common.py +0 -0
  32. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/base/datastructures.py +0 -0
  33. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/base/document.py +0 -0
  34. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/base/fields.py +0 -0
  35. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/base/metaclasses.py +0 -0
  36. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/base/utils.py +0 -0
  37. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/common.py +0 -0
  38. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/connection.py +0 -0
  39. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/context_managers.py +0 -0
  40. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/db_sync.py +0 -0
  41. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/dereference.py +0 -0
  42. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/document.py +0 -0
  43. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/errors.py +0 -0
  44. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/fields.py +0 -0
  45. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/mongodb_support.py +0 -0
  46. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/pymongo_support.py +0 -0
  47. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/queryset/__init__.py +0 -0
  48. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/queryset/base.py +0 -0
  49. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/queryset/field_list.py +0 -0
  50. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/queryset/manager.py +0 -0
  51. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/queryset/queryset.py +0 -0
  52. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/queryset/transform.py +0 -0
  53. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/queryset/visitor.py +0 -0
  54. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/db/signals.py +0 -0
  55. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/logger.py +0 -0
  56. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/model/autoattr.py +0 -0
  57. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/model/automodel.py +0 -0
  58. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/storage/__init__.py +0 -0
  59. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/storage/imagestorage.py +0 -0
  60. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/storage/localstorage.py +0 -0
  61. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/taskrunner/__init__.py +0 -0
  62. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/taskrunner/autotasks.py +0 -0
  63. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/taskrunner/task_router.py +0 -0
  64. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous/utils/markdown.py +0 -0
  65. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous_app.egg-info/SOURCES.txt +0 -0
  66. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous_app.egg-info/dependency_links.txt +0 -0
  67. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous_app.egg-info/requires.txt +0 -0
  68. {autonomous_app-0.3.39 → autonomous_app-0.3.41}/src/autonomous_app.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autonomous-app
3
- Version: 0.3.39
3
+ Version: 0.3.41
4
4
  Summary: Containerized application framework built on Flask with additional libraries and tools for rapid development of web applications.
5
5
  Author-email: Steven A Moore <samoore@binghamton.edu>
6
6
  Project-URL: homepage, https://github.com/Sallenmoore/autonomous
@@ -1,4 +1,4 @@
1
- __version__ = "0.3.39"
1
+ __version__ = "0.3.41"
2
2
 
3
3
  from dotenv import load_dotenv
4
4
 
@@ -21,8 +21,7 @@ class ImageAgent(BaseAgent):
21
21
  self,
22
22
  prompt,
23
23
  negative_prompt="",
24
- aspect_ratio="3:4",
25
- image_size="2K",
24
+ aspect_ratio="2KPortrait",
26
25
  files=None,
27
26
  ):
28
27
  return self.get_client(
@@ -31,6 +30,5 @@ class ImageAgent(BaseAgent):
31
30
  prompt,
32
31
  aspect_ratio=aspect_ratio,
33
32
  negative_prompt=negative_prompt,
34
- image_size=image_size,
35
33
  files=files,
36
34
  )
@@ -18,13 +18,11 @@ class JSONAgent(BaseAgent):
18
18
  default="A helpful AI assistant trained to assist with generating JSON formatted data."
19
19
  )
20
20
 
21
- def generate(
22
- self, message, function, additional_instructions="", uri="", context=""
23
- ):
21
+ def generate(self, message, function, system_prompt="", uri="", context=""):
24
22
  result = self.get_client(
25
23
  os.environ.get("JSON_AI_AGENT", self.provider)
26
24
  ).generate_json(
27
- message, function, additional_instructions, uri=uri, context=context
25
+ message, function, system_prompt=system_prompt, uri=uri, context=context
28
26
  )
29
27
  if isinstance(result, str):
30
28
  try:
@@ -75,32 +75,48 @@ class LocalAIModel(AutoModel):
75
75
  return text.strip()
76
76
 
77
77
  def generate_json(
78
- self, message, function, additional_instructions="", uri="", context={}
78
+ self,
79
+ message,
80
+ function=None,
81
+ system_prompt=None,
82
+ uri="",
83
+ context={},
79
84
  ):
80
- schema_str = self._convert_tools_to_json_schema(function)
81
-
82
- # 1. Improved System Prompt
83
- # We explicitly warn about nested quotes, which is the #1 killer of complex JSON
84
- full_system_prompt = (
85
- f"{self.instructions}. {additional_instructions}\n"
86
- f"You are a strict JSON generator. Output ONLY a valid JSON object matching this schema:\n"
87
- f"{schema_str}\n"
88
- f"IMPORTANT RULES:\n"
89
- f"1. Do not include markdown formatting or explanations.\n"
90
- f"2. DOUBLE CHECK nested quotes inside strings. Escape them properly.\n"
91
- f"3. Ensure all arrays and objects are closed.\n"
92
- )
85
+ # 1. Determine System Prompt Strategy
86
+ if system_prompt:
87
+ # STRATEGY A: Custom System Prompt (Highest Priority)
88
+ full_system_prompt = system_prompt
89
+ elif function:
90
+ # STRATEGY B: Strict Schema Enforcement (Default)
91
+ schema_str = self._convert_tools_to_json_schema(function)
92
+
93
+ full_system_prompt = (
94
+ f"{self.instructions}.\n"
95
+ f"You are a strict JSON generator. Output ONLY a valid JSON object matching this schema:\n"
96
+ f"{schema_str}\n"
97
+ f"IMPORTANT RULES:\n"
98
+ f"1. Do not include markdown formatting or explanations.\n"
99
+ f"2. DOUBLE CHECK nested quotes inside strings. Escape them properly.\n"
100
+ f"3. Ensure all arrays and objects are closed.\n"
101
+ )
102
+ else:
103
+ # STRATEGY C: Fallback
104
+ full_system_prompt = (
105
+ f"{self.instructions}.\n"
106
+ f"You are a strict JSON generator. Output valid JSON."
107
+ )
93
108
 
109
+ # 2. Add Context (Applies to all strategies)
94
110
  if context:
95
111
  full_system_prompt += (
96
112
  f"\n\n### GROUND TRUTH CONTEXT ###\n"
97
113
  f"Adhere strictly to this context:\n"
98
114
  f"{json.dumps(context, indent=2)}"
99
115
  )
100
- elif uri:
116
+ if uri:
101
117
  full_system_prompt += f"Use the following URI for reference: {uri}"
102
118
 
103
- # 3. Payload with INCREASED CONTEXT and LOWER TEMPERATURE
119
+ # 3. Payload Construction
104
120
  payload = {
105
121
  "model": self._json_model,
106
122
  "messages": [
@@ -111,30 +127,28 @@ class LocalAIModel(AutoModel):
111
127
  "stream": False,
112
128
  "keep_alive": "24h",
113
129
  "options": {
114
- "num_ctx": 8192, # <--- Prevents cutoff on large schemas
115
- "temperature": 0.8, # <--- INCREASED from 0.2 to 0.8 for creativity
116
- "top_p": 0.9, # <--- Adds nuance to word choice
117
- "repeat_penalty": 1.1, # <--- Prevents it from saying "rust" 5 times
130
+ "num_ctx": 8192,
131
+ "temperature": 0.8, # Keep high for creativity
132
+ "top_p": 0.9,
133
+ "repeat_penalty": 1.1,
118
134
  },
119
135
  }
120
136
 
121
137
  log("==== LocalAI JSON Payload ====", payload, _print=True)
138
+
122
139
  result_text = ""
123
140
  try:
124
- # print(f"==== {self._ollama_url}: LocalAI JSON Payload ====")
125
141
  response = requests.post(f"{self._ollama_url}/chat", json=payload)
126
142
  log(response)
127
143
  response.raise_for_status()
128
144
 
129
145
  result_text = response.json().get("message", {}).get("content", "{}")
130
146
 
131
- # Clean
147
+ # Clean & Parse
132
148
  clean_text = self._clean_json_response(result_text)
133
-
134
- # Parse
135
149
  result_dict = json.loads(clean_text)
136
150
 
137
- # Unwrap
151
+ # Unwrap (Handle cases where model wraps in 'parameters' key)
138
152
  if "parameters" in result_dict and isinstance(
139
153
  result_dict["parameters"], dict
140
154
  ):
@@ -144,15 +158,12 @@ class LocalAIModel(AutoModel):
144
158
  return result_dict
145
159
 
146
160
  except Exception as e:
147
- # If it fails, print the RAW text so you can see WHERE it broke.
148
161
  log(f"==== LocalAI JSON Error: {e} ====", _print=True)
149
162
  if result_text:
150
163
  log(
151
164
  f"--- FAILED RAW OUTPUT ---\n{result_text}\n-----------------------",
152
165
  _print=True,
153
166
  )
154
-
155
- # Returning empty prevents the whole app from dying on one bad generation.
156
167
  return {}
157
168
 
158
169
  def generate_text(self, message, additional_instructions="", uri="", context={}):
@@ -257,7 +268,9 @@ class LocalAIModel(AutoModel):
257
268
  "4:3": (1152, 896),
258
269
  "16:9": (1216, 832),
259
270
  "2K": (2048, 1080),
271
+ "2KPortrait": (1080, 2048),
260
272
  "4K": (3840, 2160),
273
+ "4KPortrait": (2160, 3840),
261
274
  "9:16": (832, 1216),
262
275
  "3:2": (1216, 832),
263
276
  "2:3": (832, 1216),
@@ -266,25 +279,20 @@ class LocalAIModel(AutoModel):
266
279
  return resolutions.get(aspect_ratio, (1024, 1024))
267
280
 
268
281
  def generate_image(
269
- self,
270
- prompt,
271
- negative_prompt="",
272
- files=None,
273
- aspect_ratio="3:4",
274
- image_size="2K",
282
+ self, prompt, negative_prompt="", files=None, aspect_ratio="2KPortrait"
275
283
  ):
276
- # 1. CLIP Token Limit Fix (Auto-Summarize)
277
- if len(prompt) > 300:
278
- log("⚠️ Prompt exceeds CLIP limit. rewriting...", _print=True)
279
- summary_instruction = (
280
- "Convert the description into a comma-separated Stable Diffusion prompt. "
281
- "Keep visual elements and style. Under 50 words."
282
- )
283
- new_prompt = self.generate_text(
284
- message=prompt, additional_instructions=summary_instruction, context={}
285
- )
286
- if new_prompt and len(new_prompt) > 10:
287
- prompt = new_prompt
284
+ # # 1. CLIP Token Limit Fix (Auto-Summarize)
285
+ # if len(prompt) > 800:
286
+ # log("⚠️ Prompt exceeds CLIP limit. rewriting...", _print=True)
287
+ # summary_instruction = (
288
+ # "Convert the description into a comma-separated Stable Diffusion prompt. "
289
+ # "Keep visual elements and style. Under 50 words."
290
+ # )
291
+ # new_prompt = self.generate_text(
292
+ # message=prompt, additional_instructions=summary_instruction, context={}
293
+ # )
294
+ # if new_prompt and len(new_prompt) > 10:
295
+ # prompt = new_prompt
288
296
 
289
297
  # 2. Resolution Calculation
290
298
  width, height = self._get_dimensions(aspect_ratio)
@@ -301,25 +309,28 @@ class LocalAIModel(AutoModel):
301
309
  }
302
310
 
303
311
  try:
304
- # Handle Files (Dict -> List of Tuples for requests)
305
- img_files = {}
312
+ # Handle Files (Corrected List Logic)
313
+ # requests.post expects a list of tuples for multiple files with same key
314
+ files_list = []
306
315
  if files and isinstance(files, dict):
307
316
  for fn, f_bytes in files.items():
308
317
  if isinstance(f_bytes, bytes):
309
318
  file_obj = io.BytesIO(f_bytes)
310
319
  else:
311
320
  file_obj = f_bytes
312
- img_files["file"] = (fn, file_obj, "image/png")
321
+ # Appending to list instead of overwriting dict key
322
+ files_list.append(("files", (fn, file_obj, "image/png")))
313
323
 
314
324
  # Send Request
315
- if img_files:
325
+ if files_list:
316
326
  response = requests.post(
317
- f"{self._media_url}/generate-image", data=data, files=img_files
327
+ f"{self._media_url}/generate-image", data=data, files=files_list
318
328
  )
319
329
  else:
320
330
  response = requests.post(f"{self._media_url}/generate-image", data=data)
321
331
 
322
332
  response.raise_for_status()
333
+ log("==== LocalAI Image Payload ====", data, _print=True)
323
334
  return response.content
324
335
 
325
336
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autonomous-app
3
- Version: 0.3.39
3
+ Version: 0.3.41
4
4
  Summary: Containerized application framework built on Flask with additional libraries and tools for rapid development of web applications.
5
5
  Author-email: Steven A Moore <samoore@binghamton.edu>
6
6
  Project-URL: homepage, https://github.com/Sallenmoore/autonomous