autonomous-app 0.3.47__tar.gz → 0.3.49__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 (69) hide show
  1. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/PKG-INFO +1 -1
  2. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/__init__.py +1 -1
  3. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/ai/models/local_model.py +74 -52
  4. autonomous_app-0.3.49/src/autonomous/ai/models/mock_model.py +78 -0
  5. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous_app.egg-info/PKG-INFO +1 -1
  6. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous_app.egg-info/SOURCES.txt +1 -0
  7. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/README.md +0 -0
  8. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/pyproject.toml +0 -0
  9. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/requirements.txt +0 -0
  10. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/setup.cfg +0 -0
  11. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/setup.py +0 -0
  12. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/ai/__init__.py +0 -0
  13. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/ai/audioagent.py +0 -0
  14. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/ai/baseagent.py +0 -0
  15. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/ai/imageagent.py +0 -0
  16. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/ai/jsonagent.py +0 -0
  17. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/ai/models/__init__.py +0 -0
  18. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/ai/models/gemini.py +0 -0
  19. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/ai/textagent.py +0 -0
  20. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/apis/version_control/GHCallbacks.py +0 -0
  21. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/apis/version_control/GHOrganization.py +0 -0
  22. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/apis/version_control/GHRepo.py +0 -0
  23. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/apis/version_control/GHVersionControl.py +0 -0
  24. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/apis/version_control/__init__.py +0 -0
  25. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/auth/__init__.py +0 -0
  26. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/auth/autoauth.py +0 -0
  27. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/auth/github.py +0 -0
  28. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/auth/google.py +0 -0
  29. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/auth/user.py +0 -0
  30. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/cli.py +0 -0
  31. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/__init__.py +0 -0
  32. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/base/__init__.py +0 -0
  33. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/base/common.py +0 -0
  34. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/base/datastructures.py +0 -0
  35. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/base/document.py +0 -0
  36. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/base/fields.py +0 -0
  37. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/base/metaclasses.py +0 -0
  38. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/base/utils.py +0 -0
  39. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/common.py +0 -0
  40. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/connection.py +0 -0
  41. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/context_managers.py +0 -0
  42. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/db_sync.py +0 -0
  43. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/dereference.py +0 -0
  44. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/document.py +0 -0
  45. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/errors.py +0 -0
  46. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/fields.py +0 -0
  47. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/mongodb_support.py +0 -0
  48. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/pymongo_support.py +0 -0
  49. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/queryset/__init__.py +0 -0
  50. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/queryset/base.py +0 -0
  51. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/queryset/field_list.py +0 -0
  52. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/queryset/manager.py +0 -0
  53. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/queryset/queryset.py +0 -0
  54. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/queryset/transform.py +0 -0
  55. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/queryset/visitor.py +0 -0
  56. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/db/signals.py +0 -0
  57. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/logger.py +0 -0
  58. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/model/autoattr.py +0 -0
  59. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/model/automodel.py +0 -0
  60. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/storage/__init__.py +0 -0
  61. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/storage/imagestorage.py +0 -0
  62. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/storage/localstorage.py +0 -0
  63. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/taskrunner/__init__.py +0 -0
  64. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/taskrunner/autotasks.py +0 -0
  65. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/taskrunner/task_router.py +0 -0
  66. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous/utils/markdown.py +0 -0
  67. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous_app.egg-info/dependency_links.txt +0 -0
  68. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/src/autonomous_app.egg-info/requires.txt +0 -0
  69. {autonomous_app-0.3.47 → autonomous_app-0.3.49}/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.47
3
+ Version: 0.3.49
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.47"
1
+ __version__ = "0.3.49"
2
2
 
3
3
  from dotenv import load_dotenv
4
4
 
@@ -4,6 +4,7 @@ import os
4
4
  import random
5
5
 
6
6
  import requests
7
+ from PIL import Image
7
8
  from pydub import AudioSegment
8
9
 
9
10
  from autonomous import log
@@ -119,7 +120,7 @@ class LocalAIModel(AutoModel):
119
120
  },
120
121
  }
121
122
 
122
- # log("==== LocalAI JSON Payload ====", payload, _print=True)
123
+ log("==== LocalAI JSON Payload ====", payload, _print=True)
123
124
 
124
125
  result_text = ""
125
126
  try:
@@ -139,7 +140,7 @@ class LocalAIModel(AutoModel):
139
140
  ):
140
141
  params = result_dict.pop("parameters")
141
142
  result_dict.update(params)
142
-
143
+ log("==== LocalAI JSON Result ====", result_dict, _print=True)
143
144
  return result_dict
144
145
 
145
146
  except Exception as e:
@@ -242,64 +243,60 @@ class LocalAIModel(AutoModel):
242
243
  log(f"TTS Error: {e}", _print=True)
243
244
  return None
244
245
 
245
- # ... inside LocalAIModel class ...
246
-
247
246
  def _get_dimensions(self, aspect_ratio):
248
247
  """
249
- Maps abstract aspect ratios to optimal SDXL resolutions.
250
- SDXL performs best at ~1024x1024 total pixels.
248
+ Returns a tuple: ((base_w, base_h), (target_w, target_h))
249
+
250
+ 1. base_*: The resolution sent to SDXL (approx 1024x1024).
251
+ 2. target_*: The final resolution to resize/upscale to.
251
252
  """
252
- resolutions = {
253
+ # Standard SDXL buckets (approx 1MP)
254
+ # We use these for the initial generation to ensure good composition.
255
+ sdxl_base = {
253
256
  "1:1": (1024, 1024),
254
- "3:4": (896, 1152),
255
- "4:3": (1152, 896),
256
- "16:9": (1216, 832),
257
- "2K": (2048, 1080),
258
- "2KPortrait": (1080, 2048),
259
- "Portrait": (1080, 2048),
260
- "4K": (3840, 2160),
261
- "Landscape": (3840, 2160),
262
- "4KPortrait": (2160, 3840),
263
- "9:16": (832, 1216),
264
- "3:2": (1216, 832),
265
- "2:3": (832, 1216),
257
+ "Portrait": (896, 1152), # 3:4
258
+ "Landscape": (1216, 832), # 3:2 or 16:9 approx
259
+ }
260
+
261
+ # The Logic: Define the target, map it to the closest SDXL base
262
+ # Format: "Key": ((Base_W, Base_H), (Target_W, Target_H))
263
+ resolutions = {
264
+ # Standard
265
+ "1:1": ((832, 832), (1024, 1024)),
266
+ "3:4": ((832, 1152), (1664, 2304)),
267
+ "4:3": ((1152, 832), (2304, 1664)),
268
+ # High Res (The logic changes here)
269
+ "16:9": ((1216, 832), (2048, 1152)),
270
+ "9:16": ((832, 1216), (1152, 2048)),
271
+ # 2K Tier
272
+ "2K": ((1216, 832), (2048, 1152)), # Base is 1216x832 -> Upscale to 2K
273
+ "2KPortrait": ((832, 1216), (1152, 2048)),
274
+ # 4K Tier (The generated image will be upscaled ~3x)
275
+ "4K": ((1216, 832), (3840, 2160)),
276
+ "4KPortrait": ((832, 1216), (2160, 3840)),
266
277
  }
267
- # Default to 1:1 (1024x1024) if unknown
268
- return resolutions.get(aspect_ratio, (1024, 1024))
278
+
279
+ # Default to 1:1 if unknown
280
+ return resolutions.get(aspect_ratio, ((832, 832), (1024, 1024)))
269
281
 
270
282
  def generate_image(
271
283
  self, prompt, negative_prompt="", files=None, aspect_ratio="2KPortrait"
272
284
  ):
273
- # # 1. CLIP Token Limit Fix (Auto-Summarize)
274
- # if len(prompt) > 800:
275
- # log("⚠️ Prompt exceeds CLIP limit. rewriting...", _print=True)
276
- # summary_instruction = (
277
- # "Convert the description into a comma-separated Stable Diffusion prompt. "
278
- # "Keep visual elements and style. Under 50 words."
279
- # )
280
- # new_prompt = self.generate_text(
281
- # message=prompt, additional_instructions=summary_instruction, context={}
282
- # )
283
- # if new_prompt and len(new_prompt) > 10:
284
- # prompt = new_prompt
285
-
286
- # 2. Resolution Calculation
287
- width, height = self._get_dimensions(aspect_ratio)
288
-
289
- # 3. Construct Payload
290
- # We send both the abstract params (for logging/metadata)
291
- # and the concrete pixels (for the engine).
285
+ # 1. Resolution Calculation
286
+ (base_w, base_h), (target_w, target_h) = self._get_dimensions(aspect_ratio)
287
+
288
+ # 2. Construct Base Generation Payload
289
+ # We tell the AI to generate the smaller, stable size first.
292
290
  data = {
293
291
  "prompt": prompt,
294
292
  "negative_prompt": negative_prompt,
295
293
  "aspect_ratio": aspect_ratio,
296
- "width": width, # <--- Calculated Pixel Width
297
- "height": height, # <--- Calculated Pixel Height
294
+ "width": base_w,
295
+ "height": base_h,
298
296
  }
299
297
 
300
298
  try:
301
- # Handle Files (Corrected List Logic)
302
- # requests.post expects a list of tuples for multiple files with same key
299
+ # Handle Input Files (for Img2Img)
303
300
  files_list = []
304
301
  if files and isinstance(files, dict):
305
302
  for fn, f_bytes in files.items():
@@ -307,20 +304,45 @@ class LocalAIModel(AutoModel):
307
304
  file_obj = io.BytesIO(f_bytes)
308
305
  else:
309
306
  file_obj = f_bytes
310
- # Appending to list instead of overwriting dict key
311
307
  files_list.append(("files", (fn, file_obj, "image/png")))
312
308
 
313
- # Send Request
309
+ # 3. Step 1: Generate Base Image
310
+ url = f"{self._media_url}/generate-image"
314
311
  if files_list:
315
- response = requests.post(
316
- f"{self._media_url}/generate-image", data=data, files=files_list
317
- )
312
+ response = requests.post(url, data=data, files=files_list)
318
313
  else:
319
- response = requests.post(f"{self._media_url}/generate-image", data=data)
314
+ response = requests.post(url, data=data)
320
315
 
321
316
  response.raise_for_status()
322
- log("==== LocalAI Image Payload ====", data, _print=True)
323
- return response.content
317
+ image_content = response.content
318
+
319
+ # 4. Step 2: Upscale (If necessary)
320
+ if (base_w, base_h) != (target_w, target_h):
321
+ log(
322
+ f"Requesting AI Upscale: {base_w}x{base_h} -> {target_w}x{target_h}...",
323
+ _print=True,
324
+ )
325
+
326
+ # Prepare payload for the /upscale route
327
+ upscale_data = {
328
+ "prompt": prompt, # Reuse prompt to guide texture generation
329
+ "width": target_w, # Explicitly tell server the target size
330
+ "height": target_h,
331
+ }
332
+
333
+ # Send the image we just generated back to the server as a file
334
+ upscale_files = {
335
+ "file": ("generated.png", io.BytesIO(image_content), "image/png")
336
+ }
337
+
338
+ upscale_response = requests.post(
339
+ f"{self._media_url}/upscale", data=upscale_data, files=upscale_files
340
+ )
341
+ upscale_response.raise_for_status()
342
+ image_content = upscale_response.content
343
+
344
+ log("==== LocalAI Image Generation Complete ====", data, _print=True)
345
+ return image_content
324
346
 
325
347
  except Exception as e:
326
348
  log(f"Image Gen Error: {e}", _print=True)
@@ -0,0 +1,78 @@
1
+ import base64
2
+ import io
3
+ import json
4
+
5
+ from autonomous import log
6
+ from autonomous.model.autoattr import ListAttr, StringAttr
7
+ from autonomous.model.automodel import AutoModel
8
+
9
+
10
+ class MockAIModel(AutoModel):
11
+ """
12
+ A Offline Mock Model for development.
13
+ Returns valid, structure-compliant dummy data instantly.
14
+ """
15
+
16
+ messages = ListAttr(StringAttr(default=[]))
17
+ name = StringAttr(default="mock_agent")
18
+ instructions = StringAttr(default="You are a Mock AI.")
19
+ description = StringAttr(default="Offline Mock Provider for testing.")
20
+
21
+ # A 1x1 Red Pixel PNG (Base64 decoded to bytes)
22
+ # This ensures PIL/Frontend code receives valid image data.
23
+ _MOCK_IMAGE_BYTES = base64.b64decode(
24
+ "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
25
+ )
26
+
27
+ # A 1-second silent WAV file (Base64 decoded to bytes)
28
+ _MOCK_AUDIO_BYTES = base64.b64decode(
29
+ "UklGRigAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAAAAEA"
30
+ )
31
+
32
+ def generate_json(self, message, system_prompt=None, uri="", context={}):
33
+ """
34
+ Returns a rich dummy JSON object.
35
+ It attempts to guess the context based on keys found in the prompt,
36
+ otherwise returns a safe default TTRPG object.
37
+ """
38
+ log(f"⚡ [MOCK] Generating JSON for prompt: {message[:50]}...", _print=True)
39
+
40
+ # 1. Default Mock Object
41
+ mock_response = {}
42
+
43
+ # 2. Heuristic: If the user provided a context with 'name', use it.
44
+ # This makes the mock feel slightly responsive.
45
+ if context:
46
+ if "name" in context:
47
+ mock_response["name"] = f"Mock {context['name']}"
48
+ if "title" in context:
49
+ mock_response["name"] = f"Mock {context['title']}"
50
+
51
+ return mock_response
52
+
53
+ def generate_text(self, message, additional_instructions="", uri="", context={}):
54
+ log(f"⚡ [MOCK] Generating Text...", _print=True)
55
+ return (
56
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
57
+ "This is MOCK TEXT generated because you are currently offline. "
58
+ "The quick brown fox jumps over the lazy dog."
59
+ )
60
+
61
+ def summarize_text(self, text, primer=""):
62
+ log(f"⚡ [MOCK] Summarizing {len(text)} chars...", _print=True)
63
+ return "This is a mock summary of the provided text. It is concise and offline."
64
+
65
+ def generate_transcription(self, audio_file, prompt=""):
66
+ log(f"⚡ [MOCK] Transcribing Audio...", _print=True)
67
+ return "This is a mock transcription of the audio file."
68
+
69
+ def generate_audio(self, prompt, voice=None):
70
+ log(f"⚡ [MOCK] Generating Audio...", _print=True)
71
+ return self._MOCK_AUDIO_BYTES
72
+
73
+ def generate_image(
74
+ self, prompt, negative_prompt="", files=None, aspect_ratio="2KPortrait"
75
+ ):
76
+ log(f"⚡ [MOCK] Generating Image ({aspect_ratio})...", _print=True)
77
+ # Returns a valid 1x1 pixel PNG so your UI displays something red instead of crashing
78
+ return self._MOCK_IMAGE_BYTES
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autonomous-app
3
- Version: 0.3.47
3
+ Version: 0.3.49
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
@@ -14,6 +14,7 @@ src/autonomous/ai/textagent.py
14
14
  src/autonomous/ai/models/__init__.py
15
15
  src/autonomous/ai/models/gemini.py
16
16
  src/autonomous/ai/models/local_model.py
17
+ src/autonomous/ai/models/mock_model.py
17
18
  src/autonomous/apis/version_control/GHCallbacks.py
18
19
  src/autonomous/apis/version_control/GHOrganization.py
19
20
  src/autonomous/apis/version_control/GHRepo.py