prompture 0.0.34__tar.gz → 0.0.34.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 (113) hide show
  1. {prompture-0.0.34 → prompture-0.0.34.dev1}/PKG-INFO +1 -1
  2. prompture-0.0.34.dev1/VERSION +1 -0
  3. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/__init__.py +0 -21
  4. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/_version.py +2 -2
  5. prompture-0.0.34.dev1/prompture/drivers/__init__.py +132 -0
  6. prompture-0.0.34.dev1/prompture/drivers/async_registry.py +80 -0
  7. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/PKG-INFO +1 -1
  8. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/SOURCES.txt +1 -2
  9. {prompture-0.0.34 → prompture-0.0.34.dev1}/pyproject.toml +0 -9
  10. prompture-0.0.34/VERSION +0 -1
  11. prompture-0.0.34/prompture/drivers/__init__.py +0 -224
  12. prompture-0.0.34/prompture/drivers/async_registry.py +0 -129
  13. prompture-0.0.34/prompture/drivers/registry.py +0 -306
  14. {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
  15. {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
  16. {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-example/SKILL.md +0 -0
  17. {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-field/SKILL.md +0 -0
  18. {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-test/SKILL.md +0 -0
  19. {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
  20. {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
  21. {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
  22. {prompture-0.0.34 → prompture-0.0.34.dev1}/.env.copy +0 -0
  23. {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/FUNDING.yml +0 -0
  24. {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/scripts/update_docs_version.py +0 -0
  25. {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/scripts/update_wrapper_version.py +0 -0
  26. {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/workflows/dev.yml +0 -0
  27. {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/workflows/documentation.yml +0 -0
  28. {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/workflows/publish.yml +0 -0
  29. {prompture-0.0.34 → prompture-0.0.34.dev1}/.mcp.json +0 -0
  30. {prompture-0.0.34 → prompture-0.0.34.dev1}/0.23.0 +0 -0
  31. {prompture-0.0.34 → prompture-0.0.34.dev1}/8 +0 -0
  32. {prompture-0.0.34 → prompture-0.0.34.dev1}/CLAUDE.md +0 -0
  33. {prompture-0.0.34 → prompture-0.0.34.dev1}/LICENSE +0 -0
  34. {prompture-0.0.34 → prompture-0.0.34.dev1}/MANIFEST.in +0 -0
  35. {prompture-0.0.34 → prompture-0.0.34.dev1}/README.md +0 -0
  36. {prompture-0.0.34 → prompture-0.0.34.dev1}/ROADMAP.md +0 -0
  37. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/_static/custom.css +0 -0
  38. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/core.rst +0 -0
  39. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/drivers.rst +0 -0
  40. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/field_definitions.rst +0 -0
  41. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/index.rst +0 -0
  42. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/runner.rst +0 -0
  43. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/tools.rst +0 -0
  44. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/validator.rst +0 -0
  45. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/conf.py +0 -0
  46. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/contributing.rst +0 -0
  47. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/examples.rst +0 -0
  48. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/field_definitions_reference.rst +0 -0
  49. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/index.rst +0 -0
  50. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/installation.rst +0 -0
  51. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/quickstart.rst +0 -0
  52. {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/toon_input_guide.rst +0 -0
  53. {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/README.md +0 -0
  54. {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_json/README.md +0 -0
  55. {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
  56. {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_json/pyproject.toml +0 -0
  57. {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_json/test.py +0 -0
  58. {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_toon/README.md +0 -0
  59. {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
  60. {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
  61. {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_toon/test.py +0 -0
  62. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/aio/__init__.py +0 -0
  63. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/async_conversation.py +0 -0
  64. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/async_core.py +0 -0
  65. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/async_driver.py +0 -0
  66. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/cache.py +0 -0
  67. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/callbacks.py +0 -0
  68. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/cli.py +0 -0
  69. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/conversation.py +0 -0
  70. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/core.py +0 -0
  71. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/cost_mixin.py +0 -0
  72. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/discovery.py +0 -0
  73. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/driver.py +0 -0
  74. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/airllm_driver.py +0 -0
  75. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
  76. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_azure_driver.py +0 -0
  77. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_claude_driver.py +0 -0
  78. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_google_driver.py +0 -0
  79. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_grok_driver.py +0 -0
  80. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_groq_driver.py +0 -0
  81. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
  82. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_lmstudio_driver.py +0 -0
  83. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
  84. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_ollama_driver.py +0 -0
  85. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_openai_driver.py +0 -0
  86. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
  87. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/azure_driver.py +0 -0
  88. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/claude_driver.py +0 -0
  89. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/google_driver.py +0 -0
  90. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/grok_driver.py +0 -0
  91. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/groq_driver.py +0 -0
  92. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/hugging_driver.py +0 -0
  93. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/lmstudio_driver.py +0 -0
  94. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/local_http_driver.py +0 -0
  95. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/ollama_driver.py +0 -0
  96. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/openai_driver.py +0 -0
  97. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/openrouter_driver.py +0 -0
  98. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/field_definitions.py +0 -0
  99. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/logging.py +0 -0
  100. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/model_rates.py +0 -0
  101. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/runner.py +0 -0
  102. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/session.py +0 -0
  103. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/settings.py +0 -0
  104. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/tools.py +0 -0
  105. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/validator.py +0 -0
  106. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/dependency_links.txt +0 -0
  107. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/entry_points.txt +0 -0
  108. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/requires.txt +0 -0
  109. {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/top_level.txt +0 -0
  110. {prompture-0.0.34 → prompture-0.0.34.dev1}/requirements.txt +0 -0
  111. {prompture-0.0.34 → prompture-0.0.34.dev1}/setup.cfg +0 -0
  112. {prompture-0.0.34 → prompture-0.0.34.dev1}/test.py +0 -0
  113. {prompture-0.0.34 → prompture-0.0.34.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.34
3
+ Version: 0.0.34.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
@@ -0,0 +1 @@
1
+ 0.0.29.dev1
@@ -42,16 +42,6 @@ from .drivers import (
42
42
  OpenRouterDriver,
43
43
  get_driver,
44
44
  get_driver_for_model,
45
- # Plugin registration API
46
- is_async_driver_registered,
47
- is_driver_registered,
48
- list_registered_async_drivers,
49
- list_registered_drivers,
50
- load_entry_point_drivers,
51
- register_async_driver,
52
- register_driver,
53
- unregister_async_driver,
54
- unregister_driver,
55
45
  )
56
46
  from .field_definitions import (
57
47
  FIELD_DEFINITIONS,
@@ -153,25 +143,14 @@ __all__ = [
153
143
  "get_model_rates",
154
144
  "get_registry_snapshot",
155
145
  "get_required_fields",
156
- # Plugin registration API
157
- "is_async_driver_registered",
158
- "is_driver_registered",
159
- "list_registered_async_drivers",
160
- "list_registered_drivers",
161
- "load_entry_point_drivers",
162
- # Other exports
163
146
  "manual_extract_and_jsonify",
164
147
  "normalize_enum_value",
165
148
  "refresh_rates_cache",
166
- "register_async_driver",
167
- "register_driver",
168
149
  "register_field",
169
150
  "render_output",
170
151
  "reset_registry",
171
152
  "run_suite_from_spec",
172
153
  "stepwise_extract_with_model",
173
- "unregister_async_driver",
174
- "unregister_driver",
175
154
  "validate_against_schema",
176
155
  "validate_enum_value",
177
156
  ]
@@ -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.34'
32
- __version_tuple__ = version_tuple = (0, 0, 34)
31
+ __version__ = version = '0.0.34.dev1'
32
+ __version_tuple__ = version_tuple = (0, 0, 34, 'dev1')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -0,0 +1,132 @@
1
+ from typing import Optional
2
+
3
+ from ..settings import settings
4
+ from .airllm_driver import AirLLMDriver
5
+ from .async_airllm_driver import AsyncAirLLMDriver
6
+ from .async_azure_driver import AsyncAzureDriver
7
+ from .async_claude_driver import AsyncClaudeDriver
8
+ from .async_google_driver import AsyncGoogleDriver
9
+ from .async_grok_driver import AsyncGrokDriver
10
+ from .async_groq_driver import AsyncGroqDriver
11
+ from .async_hugging_driver import AsyncHuggingFaceDriver
12
+ from .async_lmstudio_driver import AsyncLMStudioDriver
13
+ from .async_local_http_driver import AsyncLocalHTTPDriver
14
+ from .async_ollama_driver import AsyncOllamaDriver
15
+ from .async_openai_driver import AsyncOpenAIDriver
16
+ from .async_openrouter_driver import AsyncOpenRouterDriver
17
+ from .async_registry import ASYNC_DRIVER_REGISTRY, get_async_driver, get_async_driver_for_model
18
+ from .azure_driver import AzureDriver
19
+ from .claude_driver import ClaudeDriver
20
+ from .google_driver import GoogleDriver
21
+ from .grok_driver import GrokDriver
22
+ from .groq_driver import GroqDriver
23
+ from .lmstudio_driver import LMStudioDriver
24
+ from .local_http_driver import LocalHTTPDriver
25
+ from .ollama_driver import OllamaDriver
26
+ from .openai_driver import OpenAIDriver
27
+ from .openrouter_driver import OpenRouterDriver
28
+
29
+ # Central registry: maps provider → factory function
30
+ DRIVER_REGISTRY = {
31
+ "openai": lambda model=None: OpenAIDriver(api_key=settings.openai_api_key, model=model or settings.openai_model),
32
+ "ollama": lambda model=None: OllamaDriver(endpoint=settings.ollama_endpoint, model=model or settings.ollama_model),
33
+ "claude": lambda model=None: ClaudeDriver(api_key=settings.claude_api_key, model=model or settings.claude_model),
34
+ "lmstudio": lambda model=None: LMStudioDriver(
35
+ endpoint=settings.lmstudio_endpoint, model=model or settings.lmstudio_model
36
+ ),
37
+ "azure": lambda model=None: AzureDriver(
38
+ api_key=settings.azure_api_key, endpoint=settings.azure_api_endpoint, deployment_id=settings.azure_deployment_id
39
+ ),
40
+ "local_http": lambda model=None: LocalHTTPDriver(endpoint=settings.local_http_endpoint, model=model),
41
+ "google": lambda model=None: GoogleDriver(api_key=settings.google_api_key, model=model or settings.google_model),
42
+ "groq": lambda model=None: GroqDriver(api_key=settings.groq_api_key, model=model or settings.groq_model),
43
+ "openrouter": lambda model=None: OpenRouterDriver(
44
+ api_key=settings.openrouter_api_key, model=model or settings.openrouter_model
45
+ ),
46
+ "grok": lambda model=None: GrokDriver(api_key=settings.grok_api_key, model=model or settings.grok_model),
47
+ "airllm": lambda model=None: AirLLMDriver(
48
+ model=model or settings.airllm_model,
49
+ compression=settings.airllm_compression,
50
+ ),
51
+ }
52
+
53
+
54
+ def get_driver(provider_name: Optional[str] = None):
55
+ """
56
+ Factory to get a driver instance based on the provider name (legacy style).
57
+ Uses default model from settings if not overridden.
58
+ """
59
+ provider = (provider_name or settings.ai_provider or "ollama").strip().lower()
60
+ if provider not in DRIVER_REGISTRY:
61
+ raise ValueError(f"Unknown provider: {provider_name}")
62
+ return DRIVER_REGISTRY[provider]() # use default model from settings
63
+
64
+
65
+ def get_driver_for_model(model_str: str):
66
+ """
67
+ Factory to get a driver instance based on a full model string.
68
+ Format: provider/model_id
69
+ Example: "openai/gpt-4-turbo-preview"
70
+
71
+ Args:
72
+ model_str: Model identifier string. Can be either:
73
+ - Full format: "provider/model" (e.g. "openai/gpt-4")
74
+ - Provider only: "provider" (e.g. "openai")
75
+
76
+ Returns:
77
+ A configured driver instance for the specified provider/model.
78
+
79
+ Raises:
80
+ ValueError: If provider is invalid or format is incorrect.
81
+ """
82
+ if not isinstance(model_str, str):
83
+ raise ValueError("Model string must be a string, got {type(model_str)}")
84
+
85
+ if not model_str:
86
+ raise ValueError("Model string cannot be empty")
87
+
88
+ # Extract provider and model ID
89
+ parts = model_str.split("/", 1)
90
+ provider = parts[0].lower()
91
+ model_id = parts[1] if len(parts) > 1 else None
92
+
93
+ # Validate provider
94
+ if provider not in DRIVER_REGISTRY:
95
+ raise ValueError(f"Unsupported provider '{provider}'")
96
+
97
+ # Create driver with model ID if provided, otherwise use default
98
+ return DRIVER_REGISTRY[provider](model_id)
99
+
100
+
101
+ __all__ = [
102
+ # Async drivers
103
+ "ASYNC_DRIVER_REGISTRY",
104
+ # Sync drivers
105
+ "AirLLMDriver",
106
+ "AsyncAirLLMDriver",
107
+ "AsyncAzureDriver",
108
+ "AsyncClaudeDriver",
109
+ "AsyncGoogleDriver",
110
+ "AsyncGrokDriver",
111
+ "AsyncGroqDriver",
112
+ "AsyncHuggingFaceDriver",
113
+ "AsyncLMStudioDriver",
114
+ "AsyncLocalHTTPDriver",
115
+ "AsyncOllamaDriver",
116
+ "AsyncOpenAIDriver",
117
+ "AsyncOpenRouterDriver",
118
+ "AzureDriver",
119
+ "ClaudeDriver",
120
+ "GoogleDriver",
121
+ "GrokDriver",
122
+ "GroqDriver",
123
+ "LMStudioDriver",
124
+ "LocalHTTPDriver",
125
+ "OllamaDriver",
126
+ "OpenAIDriver",
127
+ "OpenRouterDriver",
128
+ "get_async_driver",
129
+ "get_async_driver_for_model",
130
+ "get_driver",
131
+ "get_driver_for_model",
132
+ ]
@@ -0,0 +1,80 @@
1
+ """Async driver registry — mirrors the sync DRIVER_REGISTRY."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from ..settings import settings
6
+ from .async_airllm_driver import AsyncAirLLMDriver
7
+ from .async_azure_driver import AsyncAzureDriver
8
+ from .async_claude_driver import AsyncClaudeDriver
9
+ from .async_google_driver import AsyncGoogleDriver
10
+ from .async_grok_driver import AsyncGrokDriver
11
+ from .async_groq_driver import AsyncGroqDriver
12
+ from .async_lmstudio_driver import AsyncLMStudioDriver
13
+ from .async_local_http_driver import AsyncLocalHTTPDriver
14
+ from .async_ollama_driver import AsyncOllamaDriver
15
+ from .async_openai_driver import AsyncOpenAIDriver
16
+ from .async_openrouter_driver import AsyncOpenRouterDriver
17
+
18
+ ASYNC_DRIVER_REGISTRY = {
19
+ "openai": lambda model=None: AsyncOpenAIDriver(
20
+ api_key=settings.openai_api_key, model=model or settings.openai_model
21
+ ),
22
+ "ollama": lambda model=None: AsyncOllamaDriver(
23
+ endpoint=settings.ollama_endpoint, model=model or settings.ollama_model
24
+ ),
25
+ "claude": lambda model=None: AsyncClaudeDriver(
26
+ api_key=settings.claude_api_key, model=model or settings.claude_model
27
+ ),
28
+ "lmstudio": lambda model=None: AsyncLMStudioDriver(
29
+ endpoint=settings.lmstudio_endpoint, model=model or settings.lmstudio_model
30
+ ),
31
+ "azure": lambda model=None: AsyncAzureDriver(
32
+ api_key=settings.azure_api_key, endpoint=settings.azure_api_endpoint, deployment_id=settings.azure_deployment_id
33
+ ),
34
+ "local_http": lambda model=None: AsyncLocalHTTPDriver(endpoint=settings.local_http_endpoint, model=model),
35
+ "google": lambda model=None: AsyncGoogleDriver(
36
+ api_key=settings.google_api_key, model=model or settings.google_model
37
+ ),
38
+ "groq": lambda model=None: AsyncGroqDriver(api_key=settings.groq_api_key, model=model or settings.groq_model),
39
+ "openrouter": lambda model=None: AsyncOpenRouterDriver(
40
+ api_key=settings.openrouter_api_key, model=model or settings.openrouter_model
41
+ ),
42
+ "grok": lambda model=None: AsyncGrokDriver(api_key=settings.grok_api_key, model=model or settings.grok_model),
43
+ "airllm": lambda model=None: AsyncAirLLMDriver(
44
+ model=model or settings.airllm_model,
45
+ compression=settings.airllm_compression,
46
+ ),
47
+ }
48
+
49
+
50
+ def get_async_driver(provider_name: str | None = None):
51
+ """Factory to get an async driver instance based on the provider name.
52
+
53
+ Uses default model from settings if not overridden.
54
+ """
55
+ provider = (provider_name or settings.ai_provider or "ollama").strip().lower()
56
+ if provider not in ASYNC_DRIVER_REGISTRY:
57
+ raise ValueError(f"Unknown provider: {provider_name}")
58
+ return ASYNC_DRIVER_REGISTRY[provider]()
59
+
60
+
61
+ def get_async_driver_for_model(model_str: str):
62
+ """Factory to get an async driver instance based on a full model string.
63
+
64
+ Format: ``provider/model_id``
65
+ Example: ``"openai/gpt-4-turbo-preview"``
66
+ """
67
+ if not isinstance(model_str, str):
68
+ raise ValueError("Model string must be a string, got {type(model_str)}")
69
+
70
+ if not model_str:
71
+ raise ValueError("Model string cannot be empty")
72
+
73
+ parts = model_str.split("/", 1)
74
+ provider = parts[0].lower()
75
+ model_id = parts[1] if len(parts) > 1 else None
76
+
77
+ if provider not in ASYNC_DRIVER_REGISTRY:
78
+ raise ValueError(f"Unsupported provider '{provider}'")
79
+
80
+ return ASYNC_DRIVER_REGISTRY[provider](model_id)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 0.0.34
3
+ Version: 0.0.34.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
@@ -104,5 +104,4 @@ prompture/drivers/lmstudio_driver.py
104
104
  prompture/drivers/local_http_driver.py
105
105
  prompture/drivers/ollama_driver.py
106
106
  prompture/drivers/openai_driver.py
107
- prompture/drivers/openrouter_driver.py
108
- prompture/drivers/registry.py
107
+ prompture/drivers/openrouter_driver.py
@@ -45,15 +45,6 @@ prompture = "prompture.cli:cli"
45
45
  [project.urls]
46
46
  Homepage = "https://github.com/jhd3197/prompture"
47
47
 
48
- # Entry point groups for plugin driver discovery
49
- # Third-party packages can register drivers by defining entry points in these groups:
50
- #
51
- # [project.entry-points."prompture.drivers"]
52
- # my_provider = "my_package.drivers:create_driver"
53
- #
54
- # [project.entry-points."prompture.async_drivers"]
55
- # my_provider = "my_package.drivers:create_async_driver"
56
-
57
48
  [tool.setuptools.packages.find]
58
49
  include = ["prompture*"]
59
50
  exclude = ["prompture-env*"]
prompture-0.0.34/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.34
@@ -1,224 +0,0 @@
1
- """Driver registry and factory functions.
2
-
3
- This module provides:
4
- - Built-in drivers for popular LLM providers
5
- - A pluggable registry system for custom drivers
6
- - Factory functions to instantiate drivers by provider/model name
7
-
8
- Custom Driver Registration:
9
- from prompture import register_driver
10
-
11
- def my_driver_factory(model=None):
12
- return MyCustomDriver(model=model)
13
-
14
- register_driver("my_provider", my_driver_factory)
15
-
16
- # Now you can use it
17
- driver = get_driver_for_model("my_provider/my-model")
18
-
19
- Entry Point Discovery:
20
- Third-party packages can register drivers via entry points.
21
- Add to your pyproject.toml:
22
-
23
- [project.entry-points."prompture.drivers"]
24
- my_provider = "my_package.drivers:my_driver_factory"
25
- """
26
-
27
- from typing import Optional
28
-
29
- from ..settings import settings
30
- from .airllm_driver import AirLLMDriver
31
- from .async_airllm_driver import AsyncAirLLMDriver
32
- from .async_azure_driver import AsyncAzureDriver
33
- from .async_claude_driver import AsyncClaudeDriver
34
- from .async_google_driver import AsyncGoogleDriver
35
- from .async_grok_driver import AsyncGrokDriver
36
- from .async_groq_driver import AsyncGroqDriver
37
- from .async_hugging_driver import AsyncHuggingFaceDriver
38
- from .async_lmstudio_driver import AsyncLMStudioDriver
39
- from .async_local_http_driver import AsyncLocalHTTPDriver
40
- from .async_ollama_driver import AsyncOllamaDriver
41
- from .async_openai_driver import AsyncOpenAIDriver
42
- from .async_openrouter_driver import AsyncOpenRouterDriver
43
- from .async_registry import ASYNC_DRIVER_REGISTRY, get_async_driver, get_async_driver_for_model
44
- from .azure_driver import AzureDriver
45
- from .claude_driver import ClaudeDriver
46
- from .google_driver import GoogleDriver
47
- from .grok_driver import GrokDriver
48
- from .groq_driver import GroqDriver
49
- from .lmstudio_driver import LMStudioDriver
50
- from .local_http_driver import LocalHTTPDriver
51
- from .ollama_driver import OllamaDriver
52
- from .openai_driver import OpenAIDriver
53
- from .openrouter_driver import OpenRouterDriver
54
- from .registry import (
55
- _get_sync_registry,
56
- get_async_driver_factory,
57
- get_driver_factory,
58
- is_async_driver_registered,
59
- is_driver_registered,
60
- list_registered_async_drivers,
61
- list_registered_drivers,
62
- load_entry_point_drivers,
63
- register_async_driver,
64
- register_driver,
65
- unregister_async_driver,
66
- unregister_driver,
67
- )
68
-
69
- # Register built-in sync drivers
70
- register_driver(
71
- "openai",
72
- lambda model=None: OpenAIDriver(api_key=settings.openai_api_key, model=model or settings.openai_model),
73
- overwrite=True,
74
- )
75
- register_driver(
76
- "ollama",
77
- lambda model=None: OllamaDriver(endpoint=settings.ollama_endpoint, model=model or settings.ollama_model),
78
- overwrite=True,
79
- )
80
- register_driver(
81
- "claude",
82
- lambda model=None: ClaudeDriver(api_key=settings.claude_api_key, model=model or settings.claude_model),
83
- overwrite=True,
84
- )
85
- register_driver(
86
- "lmstudio",
87
- lambda model=None: LMStudioDriver(endpoint=settings.lmstudio_endpoint, model=model or settings.lmstudio_model),
88
- overwrite=True,
89
- )
90
- register_driver(
91
- "azure",
92
- lambda model=None: AzureDriver(
93
- api_key=settings.azure_api_key, endpoint=settings.azure_api_endpoint, deployment_id=settings.azure_deployment_id
94
- ),
95
- overwrite=True,
96
- )
97
- register_driver(
98
- "local_http",
99
- lambda model=None: LocalHTTPDriver(endpoint=settings.local_http_endpoint, model=model),
100
- overwrite=True,
101
- )
102
- register_driver(
103
- "google",
104
- lambda model=None: GoogleDriver(api_key=settings.google_api_key, model=model or settings.google_model),
105
- overwrite=True,
106
- )
107
- register_driver(
108
- "groq",
109
- lambda model=None: GroqDriver(api_key=settings.groq_api_key, model=model or settings.groq_model),
110
- overwrite=True,
111
- )
112
- register_driver(
113
- "openrouter",
114
- lambda model=None: OpenRouterDriver(api_key=settings.openrouter_api_key, model=model or settings.openrouter_model),
115
- overwrite=True,
116
- )
117
- register_driver(
118
- "grok",
119
- lambda model=None: GrokDriver(api_key=settings.grok_api_key, model=model or settings.grok_model),
120
- overwrite=True,
121
- )
122
- register_driver(
123
- "airllm",
124
- lambda model=None: AirLLMDriver(
125
- model=model or settings.airllm_model,
126
- compression=settings.airllm_compression,
127
- ),
128
- overwrite=True,
129
- )
130
-
131
- # Backwards compatibility: expose registry dict (read-only view recommended)
132
- DRIVER_REGISTRY = _get_sync_registry()
133
-
134
-
135
- def get_driver(provider_name: Optional[str] = None):
136
- """
137
- Factory to get a driver instance based on the provider name (legacy style).
138
- Uses default model from settings if not overridden.
139
- """
140
- provider = (provider_name or settings.ai_provider or "ollama").strip().lower()
141
- factory = get_driver_factory(provider)
142
- return factory() # use default model from settings
143
-
144
-
145
- def get_driver_for_model(model_str: str):
146
- """
147
- Factory to get a driver instance based on a full model string.
148
- Format: provider/model_id
149
- Example: "openai/gpt-4-turbo-preview"
150
-
151
- Args:
152
- model_str: Model identifier string. Can be either:
153
- - Full format: "provider/model" (e.g. "openai/gpt-4")
154
- - Provider only: "provider" (e.g. "openai")
155
-
156
- Returns:
157
- A configured driver instance for the specified provider/model.
158
-
159
- Raises:
160
- ValueError: If provider is invalid or format is incorrect.
161
- """
162
- if not isinstance(model_str, str):
163
- raise ValueError("Model string must be a string, got {type(model_str)}")
164
-
165
- if not model_str:
166
- raise ValueError("Model string cannot be empty")
167
-
168
- # Extract provider and model ID
169
- parts = model_str.split("/", 1)
170
- provider = parts[0].lower()
171
- model_id = parts[1] if len(parts) > 1 else None
172
-
173
- # Get factory (validates provider exists)
174
- factory = get_driver_factory(provider)
175
-
176
- # Create driver with model ID if provided, otherwise use default
177
- return factory(model_id)
178
-
179
-
180
- __all__ = [
181
- "ASYNC_DRIVER_REGISTRY",
182
- # Legacy registry dicts (for backwards compatibility)
183
- "DRIVER_REGISTRY",
184
- # Sync drivers
185
- "AirLLMDriver",
186
- # Async drivers
187
- "AsyncAirLLMDriver",
188
- "AsyncAzureDriver",
189
- "AsyncClaudeDriver",
190
- "AsyncGoogleDriver",
191
- "AsyncGrokDriver",
192
- "AsyncGroqDriver",
193
- "AsyncHuggingFaceDriver",
194
- "AsyncLMStudioDriver",
195
- "AsyncLocalHTTPDriver",
196
- "AsyncOllamaDriver",
197
- "AsyncOpenAIDriver",
198
- "AsyncOpenRouterDriver",
199
- "AzureDriver",
200
- "ClaudeDriver",
201
- "GoogleDriver",
202
- "GrokDriver",
203
- "GroqDriver",
204
- "LMStudioDriver",
205
- "LocalHTTPDriver",
206
- "OllamaDriver",
207
- "OpenAIDriver",
208
- "OpenRouterDriver",
209
- "get_async_driver",
210
- "get_async_driver_for_model",
211
- # Factory functions
212
- "get_driver",
213
- "get_driver_for_model",
214
- "is_async_driver_registered",
215
- "is_driver_registered",
216
- "list_registered_async_drivers",
217
- "list_registered_drivers",
218
- "load_entry_point_drivers",
219
- "register_async_driver",
220
- # Registry functions (public API)
221
- "register_driver",
222
- "unregister_async_driver",
223
- "unregister_driver",
224
- ]
@@ -1,129 +0,0 @@
1
- """Async driver registry — mirrors the sync DRIVER_REGISTRY.
2
-
3
- This module provides async driver registration and factory functions.
4
- Custom async drivers can be registered via the ``register_async_driver()``
5
- function or discovered via entry points.
6
-
7
- Entry Point Discovery:
8
- Add to your pyproject.toml:
9
-
10
- [project.entry-points."prompture.async_drivers"]
11
- my_provider = "my_package.drivers:my_async_driver_factory"
12
- """
13
-
14
- from __future__ import annotations
15
-
16
- from ..settings import settings
17
- from .async_airllm_driver import AsyncAirLLMDriver
18
- from .async_azure_driver import AsyncAzureDriver
19
- from .async_claude_driver import AsyncClaudeDriver
20
- from .async_google_driver import AsyncGoogleDriver
21
- from .async_grok_driver import AsyncGrokDriver
22
- from .async_groq_driver import AsyncGroqDriver
23
- from .async_lmstudio_driver import AsyncLMStudioDriver
24
- from .async_local_http_driver import AsyncLocalHTTPDriver
25
- from .async_ollama_driver import AsyncOllamaDriver
26
- from .async_openai_driver import AsyncOpenAIDriver
27
- from .async_openrouter_driver import AsyncOpenRouterDriver
28
- from .registry import (
29
- _get_async_registry,
30
- get_async_driver_factory,
31
- register_async_driver,
32
- )
33
-
34
- # Register built-in async drivers
35
- register_async_driver(
36
- "openai",
37
- lambda model=None: AsyncOpenAIDriver(api_key=settings.openai_api_key, model=model or settings.openai_model),
38
- overwrite=True,
39
- )
40
- register_async_driver(
41
- "ollama",
42
- lambda model=None: AsyncOllamaDriver(endpoint=settings.ollama_endpoint, model=model or settings.ollama_model),
43
- overwrite=True,
44
- )
45
- register_async_driver(
46
- "claude",
47
- lambda model=None: AsyncClaudeDriver(api_key=settings.claude_api_key, model=model or settings.claude_model),
48
- overwrite=True,
49
- )
50
- register_async_driver(
51
- "lmstudio",
52
- lambda model=None: AsyncLMStudioDriver(endpoint=settings.lmstudio_endpoint, model=model or settings.lmstudio_model),
53
- overwrite=True,
54
- )
55
- register_async_driver(
56
- "azure",
57
- lambda model=None: AsyncAzureDriver(
58
- api_key=settings.azure_api_key, endpoint=settings.azure_api_endpoint, deployment_id=settings.azure_deployment_id
59
- ),
60
- overwrite=True,
61
- )
62
- register_async_driver(
63
- "local_http",
64
- lambda model=None: AsyncLocalHTTPDriver(endpoint=settings.local_http_endpoint, model=model),
65
- overwrite=True,
66
- )
67
- register_async_driver(
68
- "google",
69
- lambda model=None: AsyncGoogleDriver(api_key=settings.google_api_key, model=model or settings.google_model),
70
- overwrite=True,
71
- )
72
- register_async_driver(
73
- "groq",
74
- lambda model=None: AsyncGroqDriver(api_key=settings.groq_api_key, model=model or settings.groq_model),
75
- overwrite=True,
76
- )
77
- register_async_driver(
78
- "openrouter",
79
- lambda model=None: AsyncOpenRouterDriver(
80
- api_key=settings.openrouter_api_key, model=model or settings.openrouter_model
81
- ),
82
- overwrite=True,
83
- )
84
- register_async_driver(
85
- "grok",
86
- lambda model=None: AsyncGrokDriver(api_key=settings.grok_api_key, model=model or settings.grok_model),
87
- overwrite=True,
88
- )
89
- register_async_driver(
90
- "airllm",
91
- lambda model=None: AsyncAirLLMDriver(
92
- model=model or settings.airllm_model,
93
- compression=settings.airllm_compression,
94
- ),
95
- overwrite=True,
96
- )
97
-
98
- # Backwards compatibility: expose registry dict
99
- ASYNC_DRIVER_REGISTRY = _get_async_registry()
100
-
101
-
102
- def get_async_driver(provider_name: str | None = None):
103
- """Factory to get an async driver instance based on the provider name.
104
-
105
- Uses default model from settings if not overridden.
106
- """
107
- provider = (provider_name or settings.ai_provider or "ollama").strip().lower()
108
- factory = get_async_driver_factory(provider)
109
- return factory()
110
-
111
-
112
- def get_async_driver_for_model(model_str: str):
113
- """Factory to get an async driver instance based on a full model string.
114
-
115
- Format: ``provider/model_id``
116
- Example: ``"openai/gpt-4-turbo-preview"``
117
- """
118
- if not isinstance(model_str, str):
119
- raise ValueError("Model string must be a string, got {type(model_str)}")
120
-
121
- if not model_str:
122
- raise ValueError("Model string cannot be empty")
123
-
124
- parts = model_str.split("/", 1)
125
- provider = parts[0].lower()
126
- model_id = parts[1] if len(parts) > 1 else None
127
-
128
- factory = get_async_driver_factory(provider)
129
- return factory(model_id)