prompture 0.0.37.dev3__tar.gz → 0.0.38.dev1__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 (128) hide show
  1. {prompture-0.0.37.dev3/prompture.egg-info → prompture-0.0.38.dev1}/PKG-INFO +1 -1
  2. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/_version.py +2 -2
  3. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_lmstudio_driver.py +16 -3
  4. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_ollama_driver.py +6 -3
  5. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/lmstudio_driver.py +16 -3
  6. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/ollama_driver.py +9 -5
  7. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1/prompture.egg-info}/PKG-INFO +1 -1
  8. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
  9. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
  10. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.claude/skills/add-example/SKILL.md +0 -0
  11. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.claude/skills/add-field/SKILL.md +0 -0
  12. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.claude/skills/add-test/SKILL.md +0 -0
  13. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
  14. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
  15. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
  16. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.env.copy +0 -0
  17. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.github/FUNDING.yml +0 -0
  18. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.github/scripts/update_docs_version.py +0 -0
  19. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.github/scripts/update_wrapper_version.py +0 -0
  20. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.github/workflows/dev.yml +0 -0
  21. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.github/workflows/documentation.yml +0 -0
  22. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/.github/workflows/publish.yml +0 -0
  23. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/CLAUDE.md +0 -0
  24. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/LICENSE +0 -0
  25. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/MANIFEST.in +0 -0
  26. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/README.md +0 -0
  27. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/ROADMAP.md +0 -0
  28. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/_static/custom.css +0 -0
  29. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/api/core.rst +0 -0
  30. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/api/drivers.rst +0 -0
  31. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/api/field_definitions.rst +0 -0
  32. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/api/index.rst +0 -0
  33. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/api/runner.rst +0 -0
  34. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/api/tools.rst +0 -0
  35. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/api/validator.rst +0 -0
  36. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/conf.py +0 -0
  37. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/contributing.rst +0 -0
  38. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/examples.rst +0 -0
  39. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/field_definitions_reference.rst +0 -0
  40. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/index.rst +0 -0
  41. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/installation.rst +0 -0
  42. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/quickstart.rst +0 -0
  43. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/docs/source/toon_input_guide.rst +0 -0
  44. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/packages/README.md +0 -0
  45. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/packages/llm_to_json/README.md +0 -0
  46. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
  47. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/packages/llm_to_json/pyproject.toml +0 -0
  48. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/packages/llm_to_json/test.py +0 -0
  49. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/packages/llm_to_toon/README.md +0 -0
  50. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
  51. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
  52. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/packages/llm_to_toon/test.py +0 -0
  53. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/__init__.py +0 -0
  54. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/agent.py +0 -0
  55. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/agent_types.py +0 -0
  56. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/aio/__init__.py +0 -0
  57. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/async_agent.py +0 -0
  58. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/async_conversation.py +0 -0
  59. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/async_core.py +0 -0
  60. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/async_driver.py +0 -0
  61. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/async_groups.py +0 -0
  62. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/cache.py +0 -0
  63. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/callbacks.py +0 -0
  64. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/cli.py +0 -0
  65. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/conversation.py +0 -0
  66. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/core.py +0 -0
  67. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/cost_mixin.py +0 -0
  68. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/discovery.py +0 -0
  69. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/driver.py +0 -0
  70. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/__init__.py +0 -0
  71. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/airllm_driver.py +0 -0
  72. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
  73. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_azure_driver.py +0 -0
  74. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_claude_driver.py +0 -0
  75. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_google_driver.py +0 -0
  76. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_grok_driver.py +0 -0
  77. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_groq_driver.py +0 -0
  78. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
  79. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
  80. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_openai_driver.py +0 -0
  81. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
  82. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/async_registry.py +0 -0
  83. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/azure_driver.py +0 -0
  84. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/claude_driver.py +0 -0
  85. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/google_driver.py +0 -0
  86. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/grok_driver.py +0 -0
  87. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/groq_driver.py +0 -0
  88. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/hugging_driver.py +0 -0
  89. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/local_http_driver.py +0 -0
  90. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/openai_driver.py +0 -0
  91. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/openrouter_driver.py +0 -0
  92. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/registry.py +0 -0
  93. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/drivers/vision_helpers.py +0 -0
  94. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/field_definitions.py +0 -0
  95. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/group_types.py +0 -0
  96. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/groups.py +0 -0
  97. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/image.py +0 -0
  98. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/logging.py +0 -0
  99. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/model_rates.py +0 -0
  100. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/persistence.py +0 -0
  101. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/persona.py +0 -0
  102. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/runner.py +0 -0
  103. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/scaffold/__init__.py +0 -0
  104. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/scaffold/generator.py +0 -0
  105. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
  106. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/scaffold/templates/README.md.j2 +0 -0
  107. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/scaffold/templates/config.py.j2 +0 -0
  108. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/scaffold/templates/env.example.j2 +0 -0
  109. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/scaffold/templates/main.py.j2 +0 -0
  110. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/scaffold/templates/models.py.j2 +0 -0
  111. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
  112. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/serialization.py +0 -0
  113. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/server.py +0 -0
  114. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/session.py +0 -0
  115. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/settings.py +0 -0
  116. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/tools.py +0 -0
  117. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/tools_schema.py +0 -0
  118. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture/validator.py +0 -0
  119. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture.egg-info/SOURCES.txt +0 -0
  120. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture.egg-info/dependency_links.txt +0 -0
  121. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture.egg-info/entry_points.txt +0 -0
  122. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture.egg-info/requires.txt +0 -0
  123. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/prompture.egg-info/top_level.txt +0 -0
  124. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/pyproject.toml +0 -0
  125. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/requirements.txt +0 -0
  126. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/setup.cfg +0 -0
  127. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/test.py +0 -0
  128. {prompture-0.0.37.dev3 → prompture-0.0.38.dev1}/test_version_diagnosis.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 0.0.37.dev3
3
+ Version: 0.0.38.dev1
4
4
  Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
5
5
  Author-email: Juan Denis <juan@vene.co>
6
6
  License-Expression: MIT
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.0.37.dev3'
32
- __version_tuple__ = version_tuple = (0, 0, 37, 'dev3')
31
+ __version__ = version = '0.0.38.dev1'
32
+ __version_tuple__ = version_tuple = (0, 0, 38, 'dev1')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -15,6 +15,7 @@ logger = logging.getLogger(__name__)
15
15
 
16
16
  class AsyncLMStudioDriver(AsyncDriver):
17
17
  supports_json_mode = True
18
+ supports_json_schema = True
18
19
  supports_vision = True
19
20
 
20
21
  MODEL_PRICING = {"default": {"prompt": 0.0, "completion": 0.0}}
@@ -70,9 +71,21 @@ class AsyncLMStudioDriver(AsyncDriver):
70
71
  "temperature": merged_options.get("temperature", 0.7),
71
72
  }
72
73
 
73
- # Native JSON mode support
74
+ # Native JSON mode support (LM Studio requires json_schema, not json_object)
74
75
  if merged_options.get("json_mode"):
75
- payload["response_format"] = {"type": "json_object"}
76
+ json_schema = merged_options.get("json_schema")
77
+ if json_schema:
78
+ payload["response_format"] = {
79
+ "type": "json_schema",
80
+ "json_schema": {
81
+ "name": "extraction",
82
+ "schema": json_schema,
83
+ },
84
+ }
85
+ else:
86
+ # No schema provided — omit response_format entirely;
87
+ # LM Studio rejects "json_object" type.
88
+ pass
76
89
 
77
90
  async with httpx.AsyncClient() as client:
78
91
  try:
@@ -128,7 +141,7 @@ class AsyncLMStudioDriver(AsyncDriver):
128
141
  async def unload_model(self, model: str) -> dict[str, Any]:
129
142
  """Unload a model from LM Studio via POST /api/v1/models/unload."""
130
143
  url = f"{self.base_url}/api/v1/models/unload"
131
- payload = {"model": model}
144
+ payload = {"instance_id": model}
132
145
  async with httpx.AsyncClient() as client:
133
146
  r = await client.post(url, json=payload, headers=self._headers, timeout=30)
134
147
  r.raise_for_status()
@@ -15,6 +15,7 @@ logger = logging.getLogger(__name__)
15
15
 
16
16
  class AsyncOllamaDriver(AsyncDriver):
17
17
  supports_json_mode = True
18
+ supports_json_schema = True
18
19
  supports_vision = True
19
20
 
20
21
  MODEL_PRICING = {"default": {"prompt": 0.0, "completion": 0.0}}
@@ -42,9 +43,10 @@ class AsyncOllamaDriver(AsyncDriver):
42
43
  "stream": False,
43
44
  }
44
45
 
45
- # Native JSON mode support
46
+ # Native JSON mode / structured output support
46
47
  if merged_options.get("json_mode"):
47
- payload["format"] = "json"
48
+ json_schema = merged_options.get("json_schema")
49
+ payload["format"] = json_schema if json_schema else "json"
48
50
 
49
51
  if "temperature" in merged_options:
50
52
  payload["temperature"] = merged_options["temperature"]
@@ -95,7 +97,8 @@ class AsyncOllamaDriver(AsyncDriver):
95
97
  }
96
98
 
97
99
  if merged_options.get("json_mode"):
98
- payload["format"] = "json"
100
+ json_schema = merged_options.get("json_schema")
101
+ payload["format"] = json_schema if json_schema else "json"
99
102
 
100
103
  if "temperature" in merged_options:
101
104
  payload["temperature"] = merged_options["temperature"]
@@ -12,6 +12,7 @@ logger = logging.getLogger(__name__)
12
12
 
13
13
  class LMStudioDriver(Driver):
14
14
  supports_json_mode = True
15
+ supports_json_schema = True
15
16
  supports_vision = True
16
17
 
17
18
  # LM Studio is local – costs are always zero.
@@ -82,9 +83,21 @@ class LMStudioDriver(Driver):
82
83
  "temperature": merged_options.get("temperature", 0.7),
83
84
  }
84
85
 
85
- # Native JSON mode support
86
+ # Native JSON mode support (LM Studio requires json_schema, not json_object)
86
87
  if merged_options.get("json_mode"):
87
- payload["response_format"] = {"type": "json_object"}
88
+ json_schema = merged_options.get("json_schema")
89
+ if json_schema:
90
+ payload["response_format"] = {
91
+ "type": "json_schema",
92
+ "json_schema": {
93
+ "name": "extraction",
94
+ "schema": json_schema,
95
+ },
96
+ }
97
+ else:
98
+ # No schema provided — omit response_format entirely;
99
+ # LM Studio rejects "json_object" type.
100
+ pass
88
101
 
89
102
  try:
90
103
  logger.debug(f"Sending request to LM Studio endpoint: {self.endpoint}")
@@ -152,7 +165,7 @@ class LMStudioDriver(Driver):
152
165
  def unload_model(self, model: str) -> dict[str, Any]:
153
166
  """Unload a model from LM Studio via POST /api/v1/models/unload."""
154
167
  url = f"{self.base_url}/api/v1/models/unload"
155
- payload = {"model": model}
168
+ payload = {"instance_id": model}
156
169
  r = requests.post(url, json=payload, headers=self._headers, timeout=30)
157
170
  r.raise_for_status()
158
171
  return r.json()
@@ -13,6 +13,7 @@ logger = logging.getLogger(__name__)
13
13
 
14
14
  class OllamaDriver(Driver):
15
15
  supports_json_mode = True
16
+ supports_json_schema = True
16
17
  supports_streaming = True
17
18
  supports_vision = True
18
19
 
@@ -64,9 +65,10 @@ class OllamaDriver(Driver):
64
65
  "stream": False,
65
66
  }
66
67
 
67
- # Native JSON mode support
68
+ # Native JSON mode / structured output support
68
69
  if merged_options.get("json_mode"):
69
- payload["format"] = "json"
70
+ json_schema = merged_options.get("json_schema")
71
+ payload["format"] = json_schema if json_schema else "json"
70
72
 
71
73
  # Add any Ollama-specific options from merged_options
72
74
  if "temperature" in merged_options:
@@ -152,7 +154,8 @@ class OllamaDriver(Driver):
152
154
  }
153
155
 
154
156
  if merged_options.get("json_mode"):
155
- payload["format"] = "json"
157
+ json_schema = merged_options.get("json_schema")
158
+ payload["format"] = json_schema if json_schema else "json"
156
159
  if "temperature" in merged_options:
157
160
  payload["temperature"] = merged_options["temperature"]
158
161
  if "top_p" in merged_options:
@@ -210,9 +213,10 @@ class OllamaDriver(Driver):
210
213
  "stream": False,
211
214
  }
212
215
 
213
- # Native JSON mode support
216
+ # Native JSON mode / structured output support
214
217
  if merged_options.get("json_mode"):
215
- payload["format"] = "json"
218
+ json_schema = merged_options.get("json_schema")
219
+ payload["format"] = json_schema if json_schema else "json"
216
220
 
217
221
  if "temperature" in merged_options:
218
222
  payload["temperature"] = merged_options["temperature"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 0.0.37.dev3
3
+ Version: 0.0.38.dev1
4
4
  Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
5
5
  Author-email: Juan Denis <juan@vene.co>
6
6
  License-Expression: MIT
File without changes
File without changes