Skip to content

Commit e846ace

Browse files
Refactor PromptLayer API integration to include base URL parameter
1 parent d918d32 commit e846ace

22 files changed

+492
-392
lines changed

.devcontainer/devcontainer.json

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
66
"image": "mcr.microsoft.com/devcontainers/python:1-3.9-bullseye",
77
"features": {
8-
"ghcr.io/devcontainers-extra/features/poetry:2": {}
8+
"ghcr.io/devcontainers-extra/features/poetry:2": {
9+
"version": "2.2.1"
10+
}
911
},
1012
"customizations": {
1113
"vscode": {
@@ -24,19 +26,14 @@
2426
}
2527
}
2628
},
27-
2829
// Features to add to the dev container. More info: https://containers.dev/features.
2930
// "features": {},
30-
3131
// Use 'forwardPorts' to make a list of ports inside the container available locally.
3232
// "forwardPorts": [],
33-
3433
// Use 'postCreateCommand' to run commands after the container is created.
3534
"postCreateCommand": "poetry install"
36-
3735
// Configure tool-specific properties.
3836
// "customizations": {},
39-
4037
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
4138
// "remoteUser": "root",
4239
}
Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,31 @@
11
name: Integration Tests
22

33
on:
4-
push:
5-
branches: [$default-branch]
6-
7-
workflow_dispatch:
4+
pull_request:
5+
branches: ["master"]
86

97
env:
10-
PROMPTLAYER_API_KEY: ${{ secrets.PROMPTLAYER_API_KEY }}
11-
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
8+
POETRY_VIRTUALENVS_CREATE: "false"
9+
PYTHON_VERSION: "3.9"
10+
POETRY_VERSION: "2.2.1"
11+
PIPX_DEFAULT_PYTHON: "python3.9"
1212

1313
jobs:
1414
integration-tests:
1515
runs-on: ubuntu-latest
1616

1717
steps:
18-
- uses: actions/checkout@v3
18+
- uses: actions/checkout@v5
1919
- name: Set up Python
20-
uses: actions/setup-python@v3
20+
uses: actions/setup-python@v6
2121
with:
22-
python-version: "3.x"
22+
python-version: ${{ env.PYTHON_VERSION }}
23+
24+
- name: Install Poetry
25+
run: pipx install poetry==${{ env.POETRY_VERSION }}
26+
2327
- name: Install dependencies
24-
run: |
25-
python -m pip install --upgrade pip
26-
python -m pip install behave openai
27-
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
28-
- name: Run Integration Tests
29-
run: behave
28+
run: poetry install
29+
30+
- name: Run integration tests
31+
run: poetry run pytest

poetry.lock

Lines changed: 152 additions & 162 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

promptlayer/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from .promptlayer import AsyncPromptLayer, PromptLayer
22

3-
__version__ = "1.0.71"
3+
__version__ = "1.0.72"
44
__all__ = ["PromptLayer", "AsyncPromptLayer", "__version__"]

promptlayer/groups/__init__.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@
22

33

44
class GroupManager:
5-
def __init__(self, api_key: str):
5+
def __init__(self, api_key: str, base_url: str):
66
self.api_key = api_key
7+
self.base_url = base_url
78

89
def create(self):
9-
return create(self.api_key)
10+
return create(self.api_key, self.base_url)
1011

1112

1213
class AsyncGroupManager:
13-
def __init__(self, api_key: str):
14+
def __init__(self, api_key: str, base_url: str):
1415
self.api_key = api_key
16+
self.base_url = base_url
1517

16-
async def create(self) -> str:
17-
return await acreate(self.api_key)
18+
async def create(self):
19+
return await acreate(self.api_key, self.base_url)
1820

1921

2022
__all__ = ["GroupManager", "AsyncGroupManager"]

promptlayer/groups/groups.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
from promptlayer.utils import apromptlayer_create_group, promptlayer_create_group
22

33

4-
def create(api_key: str = None):
5-
"""Create a new group."""
6-
return promptlayer_create_group(api_key)
4+
def create(api_key: str, base_url: str):
5+
return promptlayer_create_group(api_key, base_url)
76

87

9-
async def acreate(api_key: str = None) -> str:
10-
"""Asynchronously create a new group."""
11-
return await apromptlayer_create_group(api_key)
8+
async def acreate(api_key: str, base_url: str):
9+
return await apromptlayer_create_group(api_key, base_url)

promptlayer/promptlayer.py

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
logger = logging.getLogger(__name__)
2727

2828

29+
def get_base_url(base_url: Union[str, None]):
30+
return base_url or os.environ.get("PROMPTLAYER_BASE_URL", "https://api.promptlayer.com")
31+
32+
2933
def is_workflow_results_dict(obj: Any) -> bool:
3034
if not isinstance(obj, dict):
3135
return False
@@ -49,9 +53,7 @@ def is_workflow_results_dict(obj: Any) -> bool:
4953

5054
class PromptLayer(PromptLayerMixin):
5155
def __init__(
52-
self,
53-
api_key: str = None,
54-
enable_tracing: bool = False,
56+
self, api_key: Union[str, None] = None, enable_tracing: bool = False, base_url: Union[str, None] = None
5557
):
5658
if api_key is None:
5759
api_key = os.environ.get("PROMPTLAYER_API_KEY")
@@ -62,11 +64,12 @@ def __init__(
6264
"Please set the PROMPTLAYER_API_KEY environment variable or pass the api_key parameter."
6365
)
6466

67+
self.base_url = get_base_url(base_url)
6568
self.api_key = api_key
66-
self.templates = TemplateManager(api_key)
67-
self.group = GroupManager(api_key)
68-
self.tracer_provider, self.tracer = self._initialize_tracer(api_key, enable_tracing)
69-
self.track = TrackManager(api_key)
69+
self.templates = TemplateManager(api_key, self.base_url)
70+
self.group = GroupManager(api_key, self.base_url)
71+
self.tracer_provider, self.tracer = self._initialize_tracer(api_key, self.base_url, enable_tracing)
72+
self.track = TrackManager(api_key, self.base_url)
7073

7174
def __getattr__(
7275
self,
@@ -75,15 +78,18 @@ def __getattr__(
7578
if name == "openai":
7679
import openai as openai_module
7780

78-
return PromptLayerBase(openai_module, function_name="openai", api_key=self.api_key, tracer=self.tracer)
81+
return PromptLayerBase(
82+
self.api_key, self.base_url, openai_module, function_name="openai", tracer=self.tracer
83+
)
7984
elif name == "anthropic":
8085
import anthropic as anthropic_module
8186

8287
return PromptLayerBase(
88+
self.api_key,
89+
self.base_url,
8390
anthropic_module,
8491
function_name="anthropic",
8592
provider_type="anthropic",
86-
api_key=self.api_key,
8793
tracer=self.tracer,
8894
)
8995
else:
@@ -212,7 +218,7 @@ def _track_request_log(
212218
metadata=metadata,
213219
**body,
214220
)
215-
return track_request(**track_request_kwargs)
221+
return track_request(self.base_url, **track_request_kwargs)
216222

217223
def run(
218224
self,
@@ -277,12 +283,13 @@ def run_workflow(
277283

278284
results = asyncio.run(
279285
arun_workflow_request(
286+
api_key=self.api_key,
287+
base_url=self.base_url,
280288
workflow_id_or_name=_get_workflow_workflow_id_or_name(workflow_id_or_name, workflow_name),
281289
input_variables=input_variables or {},
282290
metadata=metadata,
283291
workflow_label_name=workflow_label_name,
284292
workflow_version_number=workflow_version,
285-
api_key=self.api_key,
286293
return_all_outputs=return_all_outputs,
287294
)
288295
)
@@ -330,6 +337,7 @@ def log_request(
330337
):
331338
return util_log_request(
332339
self.api_key,
340+
self.base_url,
333341
provider=provider,
334342
model=model,
335343
input=input,
@@ -354,9 +362,7 @@ def log_request(
354362

355363
class AsyncPromptLayer(PromptLayerMixin):
356364
def __init__(
357-
self,
358-
api_key: str = None,
359-
enable_tracing: bool = False,
365+
self, api_key: Union[str, None] = None, enable_tracing: bool = False, base_url: Union[str, None] = None
360366
):
361367
if api_key is None:
362368
api_key = os.environ.get("PROMPTLAYER_API_KEY")
@@ -367,31 +373,30 @@ def __init__(
367373
"Please set the PROMPTLAYER_API_KEY environment variable or pass the api_key parameter."
368374
)
369375

376+
self.base_url = get_base_url(base_url)
370377
self.api_key = api_key
371-
self.templates = AsyncTemplateManager(api_key)
372-
self.group = AsyncGroupManager(api_key)
373-
self.tracer_provider, self.tracer = self._initialize_tracer(api_key, enable_tracing)
374-
self.track = AsyncTrackManager(api_key)
378+
self.templates = AsyncTemplateManager(api_key, self.base_url)
379+
self.group = AsyncGroupManager(api_key, self.base_url)
380+
self.tracer_provider, self.tracer = self._initialize_tracer(api_key, self.base_url, enable_tracing)
381+
self.track = AsyncTrackManager(api_key, self.base_url)
375382

376383
def __getattr__(self, name: Union[Literal["openai"], Literal["anthropic"], Literal["prompts"]]):
377384
if name == "openai":
378385
import openai as openai_module
379386

380387
openai = PromptLayerBase(
381-
openai_module,
382-
function_name="openai",
383-
api_key=self.api_key,
384-
tracer=self.tracer,
388+
self.api_key, self.base_url, openai_module, function_name="openai", tracer=self.tracer
385389
)
386390
return openai
387391
elif name == "anthropic":
388392
import anthropic as anthropic_module
389393

390394
anthropic = PromptLayerBase(
395+
self.api_key,
396+
self.base_url,
391397
anthropic_module,
392398
function_name="anthropic",
393399
provider_type="anthropic",
394-
api_key=self.api_key,
395400
tracer=self.tracer,
396401
)
397402
return anthropic
@@ -413,12 +418,13 @@ async def run_workflow(
413418
) -> Union[Dict[str, Any], Any]:
414419
try:
415420
return await arun_workflow_request(
421+
api_key=self.api_key,
422+
base_url=self.base_url,
416423
workflow_id_or_name=_get_workflow_workflow_id_or_name(workflow_id_or_name, workflow_name),
417424
input_variables=input_variables or {},
418425
metadata=metadata,
419426
workflow_label_name=workflow_label_name,
420427
workflow_version_number=workflow_version,
421-
api_key=self.api_key,
422428
return_all_outputs=return_all_outputs,
423429
)
424430
except Exception as ex:
@@ -491,6 +497,7 @@ async def log_request(
491497
):
492498
return await autil_log_request(
493499
self.api_key,
500+
self.base_url,
494501
provider=provider,
495502
model=model,
496503
input=input,
@@ -530,7 +537,7 @@ async def _track_request(**body):
530537
pl_run_span_id,
531538
**body,
532539
)
533-
return await atrack_request(**track_request_kwargs)
540+
return await atrack_request(self.base_url, **track_request_kwargs)
534541

535542
return _track_request
536543

@@ -554,7 +561,7 @@ async def _track_request_log(
554561
metadata=metadata,
555562
**body,
556563
)
557-
return await atrack_request(**track_request_kwargs)
564+
return await atrack_request(self.base_url, **track_request_kwargs)
558565

559566
async def _run_internal(
560567
self,
@@ -631,6 +638,6 @@ async def _run_internal(
631638

632639
return {
633640
"request_id": request_log.get("request_id", None),
634-
"raw_response": request_response,
641+
"raw_response": response,
635642
"prompt_blueprint": request_log.get("prompt_blueprint", None),
636643
}

0 commit comments

Comments
 (0)