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.
- {prompture-0.0.34 → prompture-0.0.34.dev1}/PKG-INFO +1 -1
- prompture-0.0.34.dev1/VERSION +1 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/__init__.py +0 -21
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/_version.py +2 -2
- prompture-0.0.34.dev1/prompture/drivers/__init__.py +132 -0
- prompture-0.0.34.dev1/prompture/drivers/async_registry.py +80 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/PKG-INFO +1 -1
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/SOURCES.txt +1 -2
- {prompture-0.0.34 → prompture-0.0.34.dev1}/pyproject.toml +0 -9
- prompture-0.0.34/VERSION +0 -1
- prompture-0.0.34/prompture/drivers/__init__.py +0 -224
- prompture-0.0.34/prompture/drivers/async_registry.py +0 -129
- prompture-0.0.34/prompture/drivers/registry.py +0 -306
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-example/SKILL.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-field/SKILL.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/add-test/SKILL.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.env.copy +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/FUNDING.yml +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/scripts/update_docs_version.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/scripts/update_wrapper_version.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/workflows/dev.yml +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/workflows/documentation.yml +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.github/workflows/publish.yml +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/.mcp.json +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/0.23.0 +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/8 +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/CLAUDE.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/LICENSE +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/MANIFEST.in +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/README.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/ROADMAP.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/_static/custom.css +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/core.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/drivers.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/field_definitions.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/index.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/runner.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/tools.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/api/validator.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/conf.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/contributing.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/examples.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/field_definitions_reference.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/index.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/installation.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/quickstart.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/docs/source/toon_input_guide.rst +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/README.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_json/README.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_json/pyproject.toml +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_json/test.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_toon/README.md +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/packages/llm_to_toon/test.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/aio/__init__.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/async_conversation.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/async_core.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/async_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/cache.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/callbacks.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/cli.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/conversation.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/core.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/cost_mixin.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/discovery.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/airllm_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_azure_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_claude_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_google_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_grok_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_groq_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_lmstudio_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_ollama_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_openai_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/azure_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/claude_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/google_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/grok_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/groq_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/hugging_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/lmstudio_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/local_http_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/ollama_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/openai_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/drivers/openrouter_driver.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/field_definitions.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/logging.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/model_rates.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/runner.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/session.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/settings.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/tools.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture/validator.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/dependency_links.txt +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/entry_points.txt +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/requires.txt +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/prompture.egg-info/top_level.txt +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/requirements.txt +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/setup.cfg +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/test.py +0 -0
- {prompture-0.0.34 → prompture-0.0.34.dev1}/test_version_diagnosis.py +0 -0
|
@@ -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)
|
|
@@ -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)
|