superqode 0.1.5__py3-none-any.whl
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.
- superqode/__init__.py +33 -0
- superqode/acp/__init__.py +23 -0
- superqode/acp/client.py +913 -0
- superqode/acp/permission_screen.py +457 -0
- superqode/acp/types.py +480 -0
- superqode/acp_discovery.py +856 -0
- superqode/agent/__init__.py +22 -0
- superqode/agent/edit_strategies.py +334 -0
- superqode/agent/loop.py +892 -0
- superqode/agent/qe_report_templates.py +39 -0
- superqode/agent/system_prompts.py +353 -0
- superqode/agent_output.py +721 -0
- superqode/agent_stream.py +953 -0
- superqode/agents/__init__.py +59 -0
- superqode/agents/acp_registry.py +305 -0
- superqode/agents/client.py +249 -0
- superqode/agents/data/augmentcode.com.toml +51 -0
- superqode/agents/data/cagent.dev.toml +51 -0
- superqode/agents/data/claude.com.toml +60 -0
- superqode/agents/data/codeassistant.dev.toml +51 -0
- superqode/agents/data/codex.openai.com.toml +57 -0
- superqode/agents/data/fastagent.ai.toml +66 -0
- superqode/agents/data/geminicli.com.toml +77 -0
- superqode/agents/data/goose.block.xyz.toml +54 -0
- superqode/agents/data/junie.jetbrains.com.toml +56 -0
- superqode/agents/data/kimi.moonshot.cn.toml +57 -0
- superqode/agents/data/llmlingagent.dev.toml +51 -0
- superqode/agents/data/molt.bot.toml +49 -0
- superqode/agents/data/opencode.ai.toml +60 -0
- superqode/agents/data/stakpak.dev.toml +51 -0
- superqode/agents/data/vtcode.dev.toml +51 -0
- superqode/agents/discovery.py +266 -0
- superqode/agents/messaging.py +160 -0
- superqode/agents/persona.py +166 -0
- superqode/agents/registry.py +421 -0
- superqode/agents/schema.py +72 -0
- superqode/agents/unified.py +367 -0
- superqode/app/__init__.py +111 -0
- superqode/app/constants.py +314 -0
- superqode/app/css.py +366 -0
- superqode/app/models.py +118 -0
- superqode/app/suggester.py +125 -0
- superqode/app/widgets.py +1591 -0
- superqode/app_enhanced.py +399 -0
- superqode/app_main.py +17187 -0
- superqode/approval.py +312 -0
- superqode/atomic.py +296 -0
- superqode/commands/__init__.py +1 -0
- superqode/commands/acp.py +965 -0
- superqode/commands/agents.py +180 -0
- superqode/commands/auth.py +278 -0
- superqode/commands/config.py +374 -0
- superqode/commands/init.py +826 -0
- superqode/commands/providers.py +819 -0
- superqode/commands/qe.py +1145 -0
- superqode/commands/roles.py +380 -0
- superqode/commands/serve.py +172 -0
- superqode/commands/suggestions.py +127 -0
- superqode/commands/superqe.py +460 -0
- superqode/config/__init__.py +51 -0
- superqode/config/loader.py +812 -0
- superqode/config/schema.py +498 -0
- superqode/core/__init__.py +111 -0
- superqode/core/roles.py +281 -0
- superqode/danger.py +386 -0
- superqode/data/superqode-template.yaml +1522 -0
- superqode/design_system.py +1080 -0
- superqode/dialogs/__init__.py +6 -0
- superqode/dialogs/base.py +39 -0
- superqode/dialogs/model.py +130 -0
- superqode/dialogs/provider.py +870 -0
- superqode/diff_view.py +919 -0
- superqode/enterprise.py +21 -0
- superqode/evaluation/__init__.py +25 -0
- superqode/evaluation/adapters.py +93 -0
- superqode/evaluation/behaviors.py +89 -0
- superqode/evaluation/engine.py +209 -0
- superqode/evaluation/scenarios.py +96 -0
- superqode/execution/__init__.py +36 -0
- superqode/execution/linter.py +538 -0
- superqode/execution/modes.py +347 -0
- superqode/execution/resolver.py +283 -0
- superqode/execution/runner.py +642 -0
- superqode/file_explorer.py +811 -0
- superqode/file_viewer.py +471 -0
- superqode/flash.py +183 -0
- superqode/guidance/__init__.py +58 -0
- superqode/guidance/config.py +203 -0
- superqode/guidance/prompts.py +71 -0
- superqode/harness/__init__.py +54 -0
- superqode/harness/accelerator.py +291 -0
- superqode/harness/config.py +319 -0
- superqode/harness/validator.py +147 -0
- superqode/history.py +279 -0
- superqode/integrations/superopt_runner.py +124 -0
- superqode/logging/__init__.py +49 -0
- superqode/logging/adapters.py +219 -0
- superqode/logging/formatter.py +923 -0
- superqode/logging/integration.py +341 -0
- superqode/logging/sinks.py +170 -0
- superqode/logging/unified_log.py +417 -0
- superqode/lsp/__init__.py +26 -0
- superqode/lsp/client.py +544 -0
- superqode/main.py +1069 -0
- superqode/mcp/__init__.py +89 -0
- superqode/mcp/auth_storage.py +380 -0
- superqode/mcp/client.py +1236 -0
- superqode/mcp/config.py +319 -0
- superqode/mcp/integration.py +337 -0
- superqode/mcp/oauth.py +436 -0
- superqode/mcp/oauth_callback.py +385 -0
- superqode/mcp/types.py +290 -0
- superqode/memory/__init__.py +31 -0
- superqode/memory/feedback.py +342 -0
- superqode/memory/store.py +522 -0
- superqode/notifications.py +369 -0
- superqode/optimization/__init__.py +5 -0
- superqode/optimization/config.py +33 -0
- superqode/permissions/__init__.py +25 -0
- superqode/permissions/rules.py +488 -0
- superqode/plan.py +323 -0
- superqode/providers/__init__.py +33 -0
- superqode/providers/gateway/__init__.py +165 -0
- superqode/providers/gateway/base.py +228 -0
- superqode/providers/gateway/litellm_gateway.py +1170 -0
- superqode/providers/gateway/openresponses_gateway.py +436 -0
- superqode/providers/health.py +297 -0
- superqode/providers/huggingface/__init__.py +74 -0
- superqode/providers/huggingface/downloader.py +472 -0
- superqode/providers/huggingface/endpoints.py +442 -0
- superqode/providers/huggingface/hub.py +531 -0
- superqode/providers/huggingface/inference.py +394 -0
- superqode/providers/huggingface/transformers_runner.py +516 -0
- superqode/providers/local/__init__.py +100 -0
- superqode/providers/local/base.py +438 -0
- superqode/providers/local/discovery.py +418 -0
- superqode/providers/local/lmstudio.py +256 -0
- superqode/providers/local/mlx.py +457 -0
- superqode/providers/local/ollama.py +486 -0
- superqode/providers/local/sglang.py +268 -0
- superqode/providers/local/tgi.py +260 -0
- superqode/providers/local/tool_support.py +477 -0
- superqode/providers/local/vllm.py +258 -0
- superqode/providers/manager.py +1338 -0
- superqode/providers/models.py +1016 -0
- superqode/providers/models_dev.py +578 -0
- superqode/providers/openresponses/__init__.py +87 -0
- superqode/providers/openresponses/converters/__init__.py +17 -0
- superqode/providers/openresponses/converters/messages.py +343 -0
- superqode/providers/openresponses/converters/tools.py +268 -0
- superqode/providers/openresponses/schema/__init__.py +56 -0
- superqode/providers/openresponses/schema/models.py +585 -0
- superqode/providers/openresponses/streaming/__init__.py +5 -0
- superqode/providers/openresponses/streaming/parser.py +338 -0
- superqode/providers/openresponses/tools/__init__.py +21 -0
- superqode/providers/openresponses/tools/apply_patch.py +352 -0
- superqode/providers/openresponses/tools/code_interpreter.py +290 -0
- superqode/providers/openresponses/tools/file_search.py +333 -0
- superqode/providers/openresponses/tools/mcp_adapter.py +252 -0
- superqode/providers/registry.py +716 -0
- superqode/providers/usage.py +332 -0
- superqode/pure_mode.py +384 -0
- superqode/qr/__init__.py +23 -0
- superqode/qr/dashboard.py +781 -0
- superqode/qr/generator.py +1018 -0
- superqode/qr/templates.py +135 -0
- superqode/safety/__init__.py +41 -0
- superqode/safety/sandbox.py +413 -0
- superqode/safety/warnings.py +256 -0
- superqode/server/__init__.py +33 -0
- superqode/server/lsp_server.py +775 -0
- superqode/server/web.py +250 -0
- superqode/session/__init__.py +25 -0
- superqode/session/persistence.py +580 -0
- superqode/session/sharing.py +477 -0
- superqode/session.py +475 -0
- superqode/sidebar.py +2991 -0
- superqode/stream_view.py +648 -0
- superqode/styles/__init__.py +3 -0
- superqode/superqe/__init__.py +184 -0
- superqode/superqe/acp_runner.py +1064 -0
- superqode/superqe/constitution/__init__.py +62 -0
- superqode/superqe/constitution/evaluator.py +308 -0
- superqode/superqe/constitution/loader.py +432 -0
- superqode/superqe/constitution/schema.py +250 -0
- superqode/superqe/events.py +591 -0
- superqode/superqe/frameworks/__init__.py +65 -0
- superqode/superqe/frameworks/base.py +234 -0
- superqode/superqe/frameworks/e2e.py +263 -0
- superqode/superqe/frameworks/executor.py +237 -0
- superqode/superqe/frameworks/javascript.py +409 -0
- superqode/superqe/frameworks/python.py +373 -0
- superqode/superqe/frameworks/registry.py +92 -0
- superqode/superqe/mcp_tools/__init__.py +47 -0
- superqode/superqe/mcp_tools/core_tools.py +418 -0
- superqode/superqe/mcp_tools/registry.py +230 -0
- superqode/superqe/mcp_tools/testing_tools.py +167 -0
- superqode/superqe/noise.py +89 -0
- superqode/superqe/orchestrator.py +778 -0
- superqode/superqe/roles.py +609 -0
- superqode/superqe/session.py +713 -0
- superqode/superqe/skills/__init__.py +57 -0
- superqode/superqe/skills/base.py +106 -0
- superqode/superqe/skills/core_skills.py +899 -0
- superqode/superqe/skills/registry.py +90 -0
- superqode/superqe/verifier.py +101 -0
- superqode/superqe_cli.py +76 -0
- superqode/tool_call.py +358 -0
- superqode/tools/__init__.py +93 -0
- superqode/tools/agent_tools.py +496 -0
- superqode/tools/base.py +324 -0
- superqode/tools/batch_tool.py +133 -0
- superqode/tools/diagnostics.py +311 -0
- superqode/tools/edit_tools.py +653 -0
- superqode/tools/enhanced_base.py +515 -0
- superqode/tools/file_tools.py +269 -0
- superqode/tools/file_tracking.py +45 -0
- superqode/tools/lsp_tools.py +610 -0
- superqode/tools/network_tools.py +350 -0
- superqode/tools/permissions.py +400 -0
- superqode/tools/question_tool.py +324 -0
- superqode/tools/search_tools.py +598 -0
- superqode/tools/shell_tools.py +259 -0
- superqode/tools/todo_tools.py +121 -0
- superqode/tools/validation.py +80 -0
- superqode/tools/web_tools.py +639 -0
- superqode/tui.py +1152 -0
- superqode/tui_integration.py +875 -0
- superqode/tui_widgets/__init__.py +27 -0
- superqode/tui_widgets/widgets/__init__.py +18 -0
- superqode/tui_widgets/widgets/progress.py +185 -0
- superqode/tui_widgets/widgets/tool_display.py +188 -0
- superqode/undo_manager.py +574 -0
- superqode/utils/__init__.py +5 -0
- superqode/utils/error_handling.py +323 -0
- superqode/utils/fuzzy.py +257 -0
- superqode/widgets/__init__.py +477 -0
- superqode/widgets/agent_collab.py +390 -0
- superqode/widgets/agent_store.py +936 -0
- superqode/widgets/agent_switcher.py +395 -0
- superqode/widgets/animation_manager.py +284 -0
- superqode/widgets/code_context.py +356 -0
- superqode/widgets/command_palette.py +412 -0
- superqode/widgets/connection_status.py +537 -0
- superqode/widgets/conversation_history.py +470 -0
- superqode/widgets/diff_indicator.py +155 -0
- superqode/widgets/enhanced_status_bar.py +385 -0
- superqode/widgets/enhanced_toast.py +476 -0
- superqode/widgets/file_browser.py +809 -0
- superqode/widgets/file_reference.py +585 -0
- superqode/widgets/issue_timeline.py +340 -0
- superqode/widgets/leader_key.py +264 -0
- superqode/widgets/mode_switcher.py +445 -0
- superqode/widgets/model_picker.py +234 -0
- superqode/widgets/permission_preview.py +1205 -0
- superqode/widgets/prompt.py +358 -0
- superqode/widgets/provider_connect.py +725 -0
- superqode/widgets/pty_shell.py +587 -0
- superqode/widgets/qe_dashboard.py +321 -0
- superqode/widgets/resizable_sidebar.py +377 -0
- superqode/widgets/response_changes.py +218 -0
- superqode/widgets/response_display.py +528 -0
- superqode/widgets/rich_tool_display.py +613 -0
- superqode/widgets/sidebar_panels.py +1180 -0
- superqode/widgets/slash_complete.py +356 -0
- superqode/widgets/split_view.py +612 -0
- superqode/widgets/status_bar.py +273 -0
- superqode/widgets/superqode_display.py +786 -0
- superqode/widgets/thinking_display.py +815 -0
- superqode/widgets/throbber.py +87 -0
- superqode/widgets/toast.py +206 -0
- superqode/widgets/unified_output.py +1073 -0
- superqode/workspace/__init__.py +75 -0
- superqode/workspace/artifacts.py +472 -0
- superqode/workspace/coordinator.py +353 -0
- superqode/workspace/diff_tracker.py +429 -0
- superqode/workspace/git_guard.py +373 -0
- superqode/workspace/git_snapshot.py +526 -0
- superqode/workspace/manager.py +750 -0
- superqode/workspace/snapshot.py +357 -0
- superqode/workspace/watcher.py +535 -0
- superqode/workspace/worktree.py +440 -0
- superqode-0.1.5.dist-info/METADATA +204 -0
- superqode-0.1.5.dist-info/RECORD +288 -0
- superqode-0.1.5.dist-info/WHEEL +5 -0
- superqode-0.1.5.dist-info/entry_points.txt +3 -0
- superqode-0.1.5.dist-info/licenses/LICENSE +648 -0
- superqode-0.1.5.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base Gateway Interface for BYOK mode.
|
|
3
|
+
|
|
4
|
+
Defines the abstract interface that all gateways must implement.
|
|
5
|
+
This allows swapping between LiteLLM, direct API calls, or other
|
|
6
|
+
gateway implementations.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from abc import ABC, abstractmethod
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from typing import Any, AsyncIterator, Dict, List, Optional
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class Message:
|
|
16
|
+
"""A chat message."""
|
|
17
|
+
|
|
18
|
+
role: str # "system", "user", "assistant", "tool"
|
|
19
|
+
content: str
|
|
20
|
+
name: Optional[str] = None
|
|
21
|
+
tool_calls: Optional[List[Dict[str, Any]]] = None
|
|
22
|
+
tool_call_id: Optional[str] = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class ToolDefinition:
|
|
27
|
+
"""A tool/function definition."""
|
|
28
|
+
|
|
29
|
+
name: str
|
|
30
|
+
description: str
|
|
31
|
+
parameters: Dict[str, Any]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class Usage:
|
|
36
|
+
"""Token usage information."""
|
|
37
|
+
|
|
38
|
+
prompt_tokens: int = 0
|
|
39
|
+
completion_tokens: int = 0
|
|
40
|
+
total_tokens: int = 0
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class Cost:
|
|
45
|
+
"""Cost information."""
|
|
46
|
+
|
|
47
|
+
input_cost: float = 0.0
|
|
48
|
+
output_cost: float = 0.0
|
|
49
|
+
total_cost: float = 0.0
|
|
50
|
+
currency: str = "USD"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class GatewayResponse:
|
|
55
|
+
"""Response from a gateway call."""
|
|
56
|
+
|
|
57
|
+
content: str
|
|
58
|
+
role: str = "assistant"
|
|
59
|
+
finish_reason: Optional[str] = None
|
|
60
|
+
usage: Optional[Usage] = None
|
|
61
|
+
cost: Optional[Cost] = None
|
|
62
|
+
model: Optional[str] = None
|
|
63
|
+
provider: Optional[str] = None
|
|
64
|
+
tool_calls: Optional[List[Dict[str, Any]]] = None
|
|
65
|
+
raw_response: Optional[Any] = None
|
|
66
|
+
thinking_content: Optional[str] = (
|
|
67
|
+
None # Extended thinking/reasoning from models that support it
|
|
68
|
+
)
|
|
69
|
+
thinking_tokens: Optional[int] = None # Number of thinking tokens used
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@dataclass
|
|
73
|
+
class StreamChunk:
|
|
74
|
+
"""A chunk from a streaming response."""
|
|
75
|
+
|
|
76
|
+
content: str = ""
|
|
77
|
+
role: Optional[str] = None
|
|
78
|
+
finish_reason: Optional[str] = None
|
|
79
|
+
tool_calls: Optional[List[Dict[str, Any]]] = None
|
|
80
|
+
usage: Optional[Usage] = None
|
|
81
|
+
cost: Optional[Cost] = None
|
|
82
|
+
thinking_content: Optional[str] = None # Extended thinking/reasoning chunk
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class GatewayError(Exception):
|
|
86
|
+
"""Base error for gateway operations."""
|
|
87
|
+
|
|
88
|
+
def __init__(
|
|
89
|
+
self,
|
|
90
|
+
message: str,
|
|
91
|
+
provider: Optional[str] = None,
|
|
92
|
+
model: Optional[str] = None,
|
|
93
|
+
error_type: Optional[str] = None,
|
|
94
|
+
status_code: Optional[int] = None,
|
|
95
|
+
retry_after: Optional[int] = None,
|
|
96
|
+
):
|
|
97
|
+
self.provider = provider
|
|
98
|
+
self.model = model
|
|
99
|
+
self.error_type = error_type
|
|
100
|
+
self.status_code = status_code
|
|
101
|
+
self.retry_after = retry_after
|
|
102
|
+
super().__init__(message)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class AuthenticationError(GatewayError):
|
|
106
|
+
"""Authentication/API key error."""
|
|
107
|
+
|
|
108
|
+
pass
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class RateLimitError(GatewayError):
|
|
112
|
+
"""Rate limit exceeded."""
|
|
113
|
+
|
|
114
|
+
pass
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class ModelNotFoundError(GatewayError):
|
|
118
|
+
"""Model not found."""
|
|
119
|
+
|
|
120
|
+
pass
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class InvalidRequestError(GatewayError):
|
|
124
|
+
"""Invalid request parameters."""
|
|
125
|
+
|
|
126
|
+
pass
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class GatewayInterface(ABC):
|
|
130
|
+
"""Abstract interface for LLM gateways.
|
|
131
|
+
|
|
132
|
+
All gateway implementations must implement this interface.
|
|
133
|
+
This allows swapping between LiteLLM, direct API calls, etc.
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
@abstractmethod
|
|
137
|
+
async def chat_completion(
|
|
138
|
+
self,
|
|
139
|
+
messages: List[Message],
|
|
140
|
+
model: str,
|
|
141
|
+
provider: Optional[str] = None,
|
|
142
|
+
temperature: Optional[float] = None,
|
|
143
|
+
max_tokens: Optional[int] = None,
|
|
144
|
+
tools: Optional[List[ToolDefinition]] = None,
|
|
145
|
+
tool_choice: Optional[str] = None,
|
|
146
|
+
**kwargs,
|
|
147
|
+
) -> GatewayResponse:
|
|
148
|
+
"""Make a chat completion request.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
messages: List of chat messages
|
|
152
|
+
model: Model identifier (may include provider prefix)
|
|
153
|
+
provider: Optional provider override
|
|
154
|
+
temperature: Sampling temperature
|
|
155
|
+
max_tokens: Maximum tokens to generate
|
|
156
|
+
tools: Optional tool definitions
|
|
157
|
+
tool_choice: Tool choice mode ("auto", "none", "required")
|
|
158
|
+
**kwargs: Additional provider-specific parameters
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
GatewayResponse with the completion
|
|
162
|
+
|
|
163
|
+
Raises:
|
|
164
|
+
GatewayError: On any error
|
|
165
|
+
"""
|
|
166
|
+
pass
|
|
167
|
+
|
|
168
|
+
@abstractmethod
|
|
169
|
+
async def stream_completion(
|
|
170
|
+
self,
|
|
171
|
+
messages: List[Message],
|
|
172
|
+
model: str,
|
|
173
|
+
provider: Optional[str] = None,
|
|
174
|
+
temperature: Optional[float] = None,
|
|
175
|
+
max_tokens: Optional[int] = None,
|
|
176
|
+
tools: Optional[List[ToolDefinition]] = None,
|
|
177
|
+
tool_choice: Optional[str] = None,
|
|
178
|
+
**kwargs,
|
|
179
|
+
) -> AsyncIterator[StreamChunk]:
|
|
180
|
+
"""Make a streaming chat completion request.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
messages: List of chat messages
|
|
184
|
+
model: Model identifier (may include provider prefix)
|
|
185
|
+
provider: Optional provider override
|
|
186
|
+
temperature: Sampling temperature
|
|
187
|
+
max_tokens: Maximum tokens to generate
|
|
188
|
+
tools: Optional tool definitions
|
|
189
|
+
tool_choice: Tool choice mode
|
|
190
|
+
**kwargs: Additional provider-specific parameters
|
|
191
|
+
|
|
192
|
+
Yields:
|
|
193
|
+
StreamChunk objects as they arrive
|
|
194
|
+
|
|
195
|
+
Raises:
|
|
196
|
+
GatewayError: On any error
|
|
197
|
+
"""
|
|
198
|
+
pass
|
|
199
|
+
|
|
200
|
+
@abstractmethod
|
|
201
|
+
async def test_connection(
|
|
202
|
+
self,
|
|
203
|
+
provider: str,
|
|
204
|
+
model: Optional[str] = None,
|
|
205
|
+
) -> Dict[str, Any]:
|
|
206
|
+
"""Test connection to a provider.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
provider: Provider ID
|
|
210
|
+
model: Optional model to test with
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
Dictionary with test results
|
|
214
|
+
"""
|
|
215
|
+
pass
|
|
216
|
+
|
|
217
|
+
@abstractmethod
|
|
218
|
+
def get_model_string(self, provider: str, model: str) -> str:
|
|
219
|
+
"""Get the full model string for a provider/model combination.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
provider: Provider ID
|
|
223
|
+
model: Model ID
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
Full model string for the gateway
|
|
227
|
+
"""
|
|
228
|
+
pass
|