Skip to content

Commit b0dec06

Browse files
authored
Merge pull request #8 from SocAIty/dev
Dev
2 parents acf69a0 + c416f16 commit b0dec06

44 files changed

Lines changed: 670 additions & 254 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apipod/__init__.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
from apipod.apipod import APIPod
2-
from apipod.core.job.job_progress import JobProgress
3-
from apipod.core.job.job_result import FileModel, JobResult
1+
from apipod.api import APIPod
2+
from apipod.engine.jobs.job_progress import JobProgress
3+
from apipod.engine.jobs.job_result import FileModel, JobResult
44
from media_toolkit import MediaFile, ImageFile, AudioFile, VideoFile, MediaList, MediaDict
5+
from apipod.common import constants
56

67
try:
78
import importlib.metadata as metadata
@@ -14,4 +15,4 @@
1415
except Exception:
1516
__version__ = "0.0.0"
1617

17-
__all__ = ["APIPod", "JobProgress", "FileModel", "JobResult", "MediaFile", "ImageFile", "AudioFile", "VideoFile", "MediaList", "MediaDict"]
18+
__all__ = ["APIPod", "JobProgress", "FileModel", "JobResult", "MediaFile", "ImageFile", "AudioFile", "VideoFile", "MediaList", "MediaDict", "constants"]

apipod/apipod.py renamed to apipod/api.py

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
from apipod import CONSTS
2-
from apipod.settings import APIPOD_ORCHESTRATOR, APIPOD_COMPUTE, APIPOD_PROVIDER
3-
from apipod.core.routers._socaity_router import _SocaityRouter
4-
from apipod.core.routers._runpod_router import SocaityRunpodRouter
5-
from apipod.core.routers._fastapi_router import SocaityFastAPIRouter
6-
from apipod.core.job_queues.job_queue_interface import JobQueueInterface
1+
from apipod.common import constants
2+
from apipod.common.settings import APIPOD_ORCHESTRATOR, APIPOD_COMPUTE, APIPOD_PROVIDER
3+
from apipod.engine.base_backend import _BaseBackend
4+
from apipod.engine.backend.runpod.router import SocaityRunpodRouter
5+
from apipod.engine.backend.fastapi.router import SocaityFastAPIRouter
6+
from apipod.engine.queue.job_queue_interface import JobQueueInterface
77

88
from typing import Union
99

1010

1111
def APIPod(
12-
orchestrator: Union[CONSTS.ORCHESTRATOR, str, None] = None,
13-
compute: Union[CONSTS.COMPUTE, str, None] = None,
14-
provider: Union[CONSTS.PROVIDER, str, None] = None,
12+
orchestrator: Union[constants.ORCHESTRATOR, str, None] = None,
13+
compute: Union[constants.COMPUTE, str, None] = None,
14+
provider: Union[constants.PROVIDER, str, None] = None,
1515
*args, **kwargs
16-
) -> Union[_SocaityRouter, SocaityRunpodRouter, SocaityFastAPIRouter]:
16+
) -> Union[_BaseBackend, SocaityRunpodRouter, SocaityFastAPIRouter]:
1717
"""
1818
Initialize an APIPod router with the appropriate backend based on the deployment configuration.
1919
@@ -42,9 +42,9 @@ def APIPod(
4242
compute: "dedicated" or "serverless" (default from env / dedicated).
4343
provider: "auto", "localhost", "runpod", "scaleway", "azure" (default from env / localhost).
4444
"""
45-
orchestrator = _resolve_enum(orchestrator, CONSTS.ORCHESTRATOR, APIPOD_ORCHESTRATOR, CONSTS.ORCHESTRATOR.LOCAL)
46-
compute = _resolve_enum(compute, CONSTS.COMPUTE, APIPOD_COMPUTE, CONSTS.COMPUTE.DEDICATED)
47-
provider = _resolve_enum(provider, CONSTS.PROVIDER, APIPOD_PROVIDER, CONSTS.PROVIDER.LOCALHOST)
45+
orchestrator = _resolve_enum(orchestrator, constants.ORCHESTRATOR, APIPOD_ORCHESTRATOR, constants.ORCHESTRATOR.LOCAL)
46+
compute = _resolve_enum(compute, constants.COMPUTE, APIPOD_COMPUTE, constants.COMPUTE.DEDICATED)
47+
provider = _resolve_enum(provider, constants.PROVIDER, APIPOD_PROVIDER, constants.PROVIDER.LOCALHOST)
4848

4949
backend_class, use_job_queue = _resolve_backend(orchestrator, compute, provider)
5050

@@ -71,26 +71,26 @@ def _resolve_enum(value, enum_cls, env_default, fallback):
7171

7272

7373
def _resolve_backend(
74-
orchestrator: CONSTS.ORCHESTRATOR,
75-
compute: CONSTS.COMPUTE,
76-
provider: CONSTS.PROVIDER,
74+
orchestrator: constants.ORCHESTRATOR,
75+
compute: constants.COMPUTE,
76+
provider: constants.PROVIDER,
7777
) -> tuple:
7878
"""
7979
Apply the configuration matrix and return (backend_class, use_job_queue).
8080
Raises for unsupported or not-yet-implemented combinations.
8181
"""
8282
_raise_if_unsupported(compute, provider)
8383

84-
if orchestrator == CONSTS.ORCHESTRATOR.SOCAITY:
84+
if orchestrator == constants.ORCHESTRATOR.SOCAITY:
8585
return _resolve_socaity(compute, provider)
8686

8787
return _resolve_local(compute, provider)
8888

8989

90-
def _raise_if_unsupported(compute: CONSTS.COMPUTE, provider: CONSTS.PROVIDER):
90+
def _raise_if_unsupported(compute: constants.COMPUTE, provider: constants.PROVIDER):
9191
unsupported = {
92-
(CONSTS.COMPUTE.SERVERLESS, CONSTS.PROVIDER.SCALEWAY),
93-
(CONSTS.COMPUTE.SERVERLESS, CONSTS.PROVIDER.AZURE),
92+
(constants.COMPUTE.SERVERLESS, constants.PROVIDER.SCALEWAY),
93+
(constants.COMPUTE.SERVERLESS, constants.PROVIDER.AZURE),
9494
}
9595
if (compute, provider) in unsupported:
9696
raise NotImplementedError(
@@ -99,40 +99,40 @@ def _raise_if_unsupported(compute: CONSTS.COMPUTE, provider: CONSTS.PROVIDER):
9999
)
100100

101101

102-
def _resolve_socaity(compute: CONSTS.COMPUTE, provider: CONSTS.PROVIDER) -> tuple:
103-
if compute == CONSTS.COMPUTE.DEDICATED:
104-
if provider in (CONSTS.PROVIDER.RUNPOD, CONSTS.PROVIDER.SCALEWAY, CONSTS.PROVIDER.AZURE):
102+
def _resolve_socaity(compute: constants.COMPUTE, provider: constants.PROVIDER) -> tuple:
103+
if compute == constants.COMPUTE.DEDICATED:
104+
if provider in (constants.PROVIDER.RUNPOD, constants.PROVIDER.SCALEWAY, constants.PROVIDER.AZURE):
105105
raise NotImplementedError(
106106
f"Celery backend for socaity + dedicated + {provider.value} is planned but not yet available."
107107
)
108-
if provider == CONSTS.PROVIDER.LOCALHOST:
108+
if provider == constants.PROVIDER.LOCALHOST:
109109
return SocaityFastAPIRouter, True
110110
# auto or any other -> FastAPI without queue
111111
return SocaityFastAPIRouter, False
112112

113113
# serverless
114-
if provider == CONSTS.PROVIDER.LOCALHOST:
114+
if provider == constants.PROVIDER.LOCALHOST:
115115
return SocaityFastAPIRouter, True
116116
# auto or runpod -> RunPod router
117117
return SocaityRunpodRouter, False
118118

119119

120-
def _resolve_local(compute: CONSTS.COMPUTE, provider: CONSTS.PROVIDER) -> tuple:
121-
if compute == CONSTS.COMPUTE.DEDICATED:
120+
def _resolve_local(compute: constants.COMPUTE, provider: constants.PROVIDER) -> tuple:
121+
if compute == constants.COMPUTE.DEDICATED:
122122
return SocaityFastAPIRouter, False
123123

124124
# serverless
125-
if provider == CONSTS.PROVIDER.LOCALHOST:
125+
if provider == constants.PROVIDER.LOCALHOST:
126126
return SocaityFastAPIRouter, True
127-
if provider == CONSTS.PROVIDER.RUNPOD:
127+
if provider == constants.PROVIDER.RUNPOD:
128128
return SocaityRunpodRouter, False
129129
# auto -> RunPod router (same default as socaity serverless auto)
130-
if provider == CONSTS.PROVIDER.AUTO:
130+
if provider == constants.PROVIDER.AUTO:
131131
return SocaityRunpodRouter, False
132132

133133
raise NotImplementedError(f"Unsupported configuration: local + serverless + {provider.value}")
134134

135135

136136
def _create_job_queue() -> JobQueueInterface:
137-
from apipod.core.job_queues.job_queue import JobQueue
137+
from apipod.engine.queue.job_queue import JobQueue
138138
return JobQueue()

apipod/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import Optional
55

66
from apipod.deploy.deployment_manager import DeploymentManager
7-
from apipod.CONSTS import ORCHESTRATOR, COMPUTE, PROVIDER
7+
from apipod.common.constants import ORCHESTRATOR, COMPUTE, PROVIDER
88

99

1010
def input_yes_no(question: str, default: bool = True) -> bool:
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ class EmbeddingRequest(OpenAIBaseModel):
6363
user: Optional[str] = None
6464

6565

66+
# Supported request schemas that should be interpreted as JSON bodies
67+
# by router decorators, even when endpoint authors do not specify Body(...).
68+
SUPPORTED_LLM_REQUEST_SCHEMAS = (
69+
ChatCompletionRequest,
70+
CompletionRequest,
71+
EmbeddingRequest,
72+
)
73+
74+
6675
# =====================================================
6776
# Shared output schemas
6877
# =====================================================
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import sys
22
from os import environ
3-
from apipod.CONSTS import ORCHESTRATOR, COMPUTE, PROVIDER
3+
from apipod.common.constants import ORCHESTRATOR, COMPUTE, PROVIDER
44

55
APIPOD_ORCHESTRATOR = environ.get("APIPOD_ORCHESTRATOR", ORCHESTRATOR.LOCAL)
66
APIPOD_COMPUTE = environ.get("APIPOD_COMPUTE", COMPUTE.DEDICATED)

0 commit comments

Comments
 (0)