promptjuggler 0.1.0__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.
- promptjuggler-0.1.0/.gitignore +9 -0
- promptjuggler-0.1.0/PKG-INFO +62 -0
- promptjuggler-0.1.0/README.md +42 -0
- promptjuggler-0.1.0/pyproject.toml +53 -0
- promptjuggler-0.1.0/src/promptjuggler/__init__.py +29 -0
- promptjuggler-0.1.0/src/promptjuggler/_client.py +196 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/__init__.py +136 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/api/__init__.py +8 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/api/knowledge_bases_api.py +1152 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/api/prompt_runs_api.py +626 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/api/prompts_api.py +319 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/api/workflow_runs_api.py +626 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/api_client.py +804 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/api_response.py +21 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/configuration.py +634 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/exceptions.py +218 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/__init__.py +57 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/content_message_response.py +91 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/create_prompt_run.py +134 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/create_prompt_run_response.py +91 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/create_workflow_run.py +132 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/create_workflow_run_metadata_value.py +143 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/create_workflow_run_response.py +91 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/error_response.py +88 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/http_call.py +140 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/http_header.py +111 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/json_object_format.py +95 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/json_schema_format.py +124 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/knowledge_base_finished.py +96 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/knowledge_base_response.py +106 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/knowledge_base_status.py +38 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/knowledge_document_finished.py +94 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/knowledge_document_response.py +98 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/knowledge_document_status.py +39 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/knowledge_document_summary.py +98 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/knowledge_search.py +120 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/mcp.py +124 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/memory.py +39 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/model.py +63 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/model_params.py +157 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/prompt_call.py +123 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/prompt_revision.py +139 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/prompt_run.py +116 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/prompt_run_finished.py +92 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/provider.py +38 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/response_format.py +154 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/role.py +37 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/run_status.py +38 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/script_call.py +128 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/service_tier.py +39 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/text_format.py +95 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/tool.py +210 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/version_ref.py +95 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/version_ref_id_or_tag.py +143 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/web_search.py +102 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/workflow_call.py +123 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/workflow_run.py +106 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/models/workflow_run_finished.py +92 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/py.typed +0 -0
- promptjuggler-0.1.0/src/promptjuggler/_generated/rest.py +263 -0
- promptjuggler-0.1.0/src/promptjuggler/errors.py +17 -0
- promptjuggler-0.1.0/src/promptjuggler/py.typed +0 -0
- promptjuggler-0.1.0/src/promptjuggler/webhook.py +57 -0
- promptjuggler-0.1.0/tests/helpers.py +85 -0
- promptjuggler-0.1.0/tests/test_errors.py +28 -0
- promptjuggler-0.1.0/tests/test_knowledge_bases.py +46 -0
- promptjuggler-0.1.0/tests/test_knowledge_documents.py +23 -0
- promptjuggler-0.1.0/tests/test_prompt_runs.py +49 -0
- promptjuggler-0.1.0/tests/test_prompts.py +31 -0
- promptjuggler-0.1.0/tests/test_webhook.py +43 -0
- promptjuggler-0.1.0/tests/test_workflow_runs.py +33 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: promptjuggler
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Python SDK for the PromptJuggler API — run prompts and workflows, manage knowledge bases, and verify webhooks.
|
|
5
|
+
Project-URL: Homepage, https://docs.promptjuggler.com/sdks/python/overview
|
|
6
|
+
Project-URL: Repository, https://github.com/motleyhand/promptjuggler-python-sdk
|
|
7
|
+
Author: PromptJuggler
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
Keywords: ai,llm,promptjuggler,prompts,sdk
|
|
10
|
+
Requires-Python: >=3.10
|
|
11
|
+
Requires-Dist: pydantic>=2
|
|
12
|
+
Requires-Dist: python-dateutil>=2.8
|
|
13
|
+
Requires-Dist: typing-extensions>=4.7
|
|
14
|
+
Requires-Dist: urllib3>=2
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: mypy>=1.13; extra == 'dev'
|
|
17
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
18
|
+
Requires-Dist: ruff>=0.8; extra == 'dev'
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
|
|
21
|
+
# PromptJuggler Python SDK
|
|
22
|
+
|
|
23
|
+
The official Python client for the [PromptJuggler](https://promptjuggler.com) API. Run
|
|
24
|
+
prompts and workflows, manage knowledge bases, and verify webhooks — with pydantic-typed
|
|
25
|
+
models and flat, synchronous methods.
|
|
26
|
+
|
|
27
|
+
## Requirements
|
|
28
|
+
|
|
29
|
+
- Python 3.10+
|
|
30
|
+
|
|
31
|
+
## Installation
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install promptjuggler
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Usage
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
from promptjuggler import PromptJuggler, RunStatus
|
|
41
|
+
|
|
42
|
+
pj = PromptJuggler("your-api-key")
|
|
43
|
+
|
|
44
|
+
# Trigger a run (async — returns the run ID)
|
|
45
|
+
created = pj.run_prompt("greeting", "production", {"name": "Ada"})
|
|
46
|
+
|
|
47
|
+
# Poll for the result
|
|
48
|
+
run = pj.get_prompt_run(created.id)
|
|
49
|
+
if run.status == RunStatus.COMPLETED:
|
|
50
|
+
print(run.output)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Errors surface as `ApiError` (with a `status_code`). Verify incoming webhooks with
|
|
54
|
+
`verify_webhook_signature()`.
|
|
55
|
+
|
|
56
|
+
## Documentation
|
|
57
|
+
|
|
58
|
+
Full guides and the API reference: **https://docs.promptjuggler.com/sdks/python/overview**
|
|
59
|
+
|
|
60
|
+
## License
|
|
61
|
+
|
|
62
|
+
MIT
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# PromptJuggler Python SDK
|
|
2
|
+
|
|
3
|
+
The official Python client for the [PromptJuggler](https://promptjuggler.com) API. Run
|
|
4
|
+
prompts and workflows, manage knowledge bases, and verify webhooks — with pydantic-typed
|
|
5
|
+
models and flat, synchronous methods.
|
|
6
|
+
|
|
7
|
+
## Requirements
|
|
8
|
+
|
|
9
|
+
- Python 3.10+
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pip install promptjuggler
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
from promptjuggler import PromptJuggler, RunStatus
|
|
21
|
+
|
|
22
|
+
pj = PromptJuggler("your-api-key")
|
|
23
|
+
|
|
24
|
+
# Trigger a run (async — returns the run ID)
|
|
25
|
+
created = pj.run_prompt("greeting", "production", {"name": "Ada"})
|
|
26
|
+
|
|
27
|
+
# Poll for the result
|
|
28
|
+
run = pj.get_prompt_run(created.id)
|
|
29
|
+
if run.status == RunStatus.COMPLETED:
|
|
30
|
+
print(run.output)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Errors surface as `ApiError` (with a `status_code`). Verify incoming webhooks with
|
|
34
|
+
`verify_webhook_signature()`.
|
|
35
|
+
|
|
36
|
+
## Documentation
|
|
37
|
+
|
|
38
|
+
Full guides and the API reference: **https://docs.promptjuggler.com/sdks/python/overview**
|
|
39
|
+
|
|
40
|
+
## License
|
|
41
|
+
|
|
42
|
+
MIT
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "promptjuggler"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Python SDK for the PromptJuggler API — run prompts and workflows, manage knowledge bases, and verify webhooks."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
authors = [{ name = "PromptJuggler" }]
|
|
13
|
+
keywords = ["promptjuggler", "llm", "prompts", "ai", "sdk"]
|
|
14
|
+
dependencies = [
|
|
15
|
+
"pydantic>=2",
|
|
16
|
+
"urllib3>=2",
|
|
17
|
+
"python-dateutil>=2.8",
|
|
18
|
+
"typing-extensions>=4.7",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
[project.urls]
|
|
22
|
+
Homepage = "https://docs.promptjuggler.com/sdks/python/overview"
|
|
23
|
+
Repository = "https://github.com/motleyhand/promptjuggler-python-sdk"
|
|
24
|
+
|
|
25
|
+
[project.optional-dependencies]
|
|
26
|
+
dev = ["pytest>=8", "mypy>=1.13", "ruff>=0.8"]
|
|
27
|
+
|
|
28
|
+
[tool.hatch.build.targets.wheel]
|
|
29
|
+
packages = ["src/promptjuggler"]
|
|
30
|
+
|
|
31
|
+
[tool.pytest.ini_options]
|
|
32
|
+
testpaths = ["tests"]
|
|
33
|
+
pythonpath = ["tests"]
|
|
34
|
+
|
|
35
|
+
[tool.ruff]
|
|
36
|
+
line-length = 110
|
|
37
|
+
src = ["src", "tests"]
|
|
38
|
+
# The generated client carries its own style; it's verified by the drift-check, not ruff.
|
|
39
|
+
extend-exclude = ["src/promptjuggler/_generated"]
|
|
40
|
+
|
|
41
|
+
[tool.ruff.lint]
|
|
42
|
+
select = ["E", "F", "I", "UP", "B", "SIM"]
|
|
43
|
+
|
|
44
|
+
[tool.mypy]
|
|
45
|
+
strict = true
|
|
46
|
+
python_version = "3.10"
|
|
47
|
+
# The generated client is third-party-style code; type-check only our facade.
|
|
48
|
+
files = ["src/promptjuggler", "tests"]
|
|
49
|
+
exclude = "src/promptjuggler/_generated"
|
|
50
|
+
|
|
51
|
+
[[tool.mypy.overrides]]
|
|
52
|
+
module = "promptjuggler._generated.*"
|
|
53
|
+
follow_untyped_imports = true
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from promptjuggler._client import PromptJuggler
|
|
4
|
+
from promptjuggler._generated.models.create_prompt_run_response import CreatePromptRunResponse
|
|
5
|
+
from promptjuggler._generated.models.create_workflow_run_response import CreateWorkflowRunResponse
|
|
6
|
+
from promptjuggler._generated.models.knowledge_base_response import KnowledgeBaseResponse
|
|
7
|
+
from promptjuggler._generated.models.knowledge_document_response import KnowledgeDocumentResponse
|
|
8
|
+
from promptjuggler._generated.models.prompt_revision import PromptRevision
|
|
9
|
+
from promptjuggler._generated.models.prompt_run import PromptRun
|
|
10
|
+
from promptjuggler._generated.models.run_status import RunStatus
|
|
11
|
+
from promptjuggler._generated.models.workflow_run import WorkflowRun
|
|
12
|
+
from promptjuggler.errors import ApiError, NetworkError, PromptJugglerError
|
|
13
|
+
from promptjuggler.webhook import verify_webhook_signature
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"PromptJuggler",
|
|
17
|
+
"ApiError",
|
|
18
|
+
"NetworkError",
|
|
19
|
+
"PromptJugglerError",
|
|
20
|
+
"verify_webhook_signature",
|
|
21
|
+
"CreatePromptRunResponse",
|
|
22
|
+
"CreateWorkflowRunResponse",
|
|
23
|
+
"KnowledgeBaseResponse",
|
|
24
|
+
"KnowledgeDocumentResponse",
|
|
25
|
+
"PromptRevision",
|
|
26
|
+
"PromptRun",
|
|
27
|
+
"RunStatus",
|
|
28
|
+
"WorkflowRun",
|
|
29
|
+
]
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from collections.abc import Callable
|
|
5
|
+
from typing import Any, TypeVar, cast
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
import urllib3.exceptions
|
|
9
|
+
|
|
10
|
+
from promptjuggler._generated.api.knowledge_bases_api import KnowledgeBasesApi
|
|
11
|
+
from promptjuggler._generated.api.prompt_runs_api import PromptRunsApi
|
|
12
|
+
from promptjuggler._generated.api.prompts_api import PromptsApi
|
|
13
|
+
from promptjuggler._generated.api.workflow_runs_api import WorkflowRunsApi
|
|
14
|
+
from promptjuggler._generated.api_client import ApiClient
|
|
15
|
+
from promptjuggler._generated.configuration import Configuration
|
|
16
|
+
from promptjuggler._generated.exceptions import ApiException
|
|
17
|
+
from promptjuggler._generated.models.create_prompt_run import CreatePromptRun
|
|
18
|
+
from promptjuggler._generated.models.create_prompt_run_response import CreatePromptRunResponse
|
|
19
|
+
from promptjuggler._generated.models.create_workflow_run import CreateWorkflowRun
|
|
20
|
+
from promptjuggler._generated.models.create_workflow_run_metadata_value import CreateWorkflowRunMetadataValue
|
|
21
|
+
from promptjuggler._generated.models.create_workflow_run_response import CreateWorkflowRunResponse
|
|
22
|
+
from promptjuggler._generated.models.knowledge_base_response import KnowledgeBaseResponse
|
|
23
|
+
from promptjuggler._generated.models.knowledge_document_response import KnowledgeDocumentResponse
|
|
24
|
+
from promptjuggler._generated.models.prompt_revision import PromptRevision
|
|
25
|
+
from promptjuggler._generated.models.prompt_run import PromptRun
|
|
26
|
+
from promptjuggler._generated.models.workflow_run import WorkflowRun
|
|
27
|
+
from promptjuggler.errors import ApiError, NetworkError
|
|
28
|
+
|
|
29
|
+
DEFAULT_BASE_URL = "https://promptjuggler.com"
|
|
30
|
+
|
|
31
|
+
T = TypeVar("T")
|
|
32
|
+
|
|
33
|
+
# Metadata values are strings or lists of strings; the generated model wraps them in a
|
|
34
|
+
# oneOf type, so the facade hides that wrapping.
|
|
35
|
+
Metadata = dict[str, "str | list[str]"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class PromptJuggler:
|
|
39
|
+
"""Ergonomic entry point to the PromptJuggler API. Wraps the generated client: flat
|
|
40
|
+
method calls in, generated typed (pydantic) models out, with API errors translated
|
|
41
|
+
into :class:`~promptjuggler.errors.ApiError`.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, api_key: str, *, base_url: str | None = None) -> None:
|
|
45
|
+
config = Configuration(host=base_url or DEFAULT_BASE_URL, access_token=api_key)
|
|
46
|
+
client = ApiClient(config)
|
|
47
|
+
self._prompts = PromptsApi(client)
|
|
48
|
+
self._prompt_runs = PromptRunsApi(client)
|
|
49
|
+
self._workflow_runs = WorkflowRunsApi(client)
|
|
50
|
+
self._knowledge_bases = KnowledgeBasesApi(client)
|
|
51
|
+
|
|
52
|
+
def get_prompt(self, slug: str, version: int | str) -> PromptRevision:
|
|
53
|
+
"""Fetch a prompt revision by slug and version (a revision number or a tag like ``production``)."""
|
|
54
|
+
return self._send(lambda: self._prompts.get_prompt_revision(slug, str(version)))
|
|
55
|
+
|
|
56
|
+
def run_prompt(
|
|
57
|
+
self,
|
|
58
|
+
slug: str,
|
|
59
|
+
version: int | str,
|
|
60
|
+
inputs: dict[str, str],
|
|
61
|
+
*,
|
|
62
|
+
priority: str | None = None,
|
|
63
|
+
thread: str | UUID | None = None,
|
|
64
|
+
environment: str | None = None,
|
|
65
|
+
env_vars: dict[str, str] | None = None,
|
|
66
|
+
metadata: Metadata | None = None,
|
|
67
|
+
channel: str | None = None,
|
|
68
|
+
) -> CreatePromptRunResponse:
|
|
69
|
+
"""Trigger a prompt run (async — returns the run ID; poll :meth:`get_prompt_run` for the result)."""
|
|
70
|
+
body = CreatePromptRun(
|
|
71
|
+
inputs=inputs,
|
|
72
|
+
priority=priority,
|
|
73
|
+
thread=_uuid(thread) if thread is not None else None,
|
|
74
|
+
environment=environment,
|
|
75
|
+
envVars=env_vars,
|
|
76
|
+
metadata=_wrap_metadata(metadata),
|
|
77
|
+
channel=channel,
|
|
78
|
+
)
|
|
79
|
+
return self._send(lambda: self._prompt_runs.create_prompt_run(slug, str(version), body))
|
|
80
|
+
|
|
81
|
+
def get_prompt_run(self, run_id: str | UUID) -> PromptRun:
|
|
82
|
+
"""Fetch a prompt run by ID."""
|
|
83
|
+
return self._send(lambda: self._prompt_runs.get_prompt_run(_uuid(run_id)))
|
|
84
|
+
|
|
85
|
+
def run_workflow(
|
|
86
|
+
self,
|
|
87
|
+
slug: str,
|
|
88
|
+
version: int | str,
|
|
89
|
+
inputs: dict[str, str],
|
|
90
|
+
*,
|
|
91
|
+
priority: str | None = None,
|
|
92
|
+
thread: str | UUID | None = None,
|
|
93
|
+
environment: str | None = None,
|
|
94
|
+
env_vars: dict[str, str] | None = None,
|
|
95
|
+
metadata: Metadata | None = None,
|
|
96
|
+
) -> CreateWorkflowRunResponse:
|
|
97
|
+
"""Trigger a workflow run (async — returns the run ID; poll :meth:`get_workflow_run`)."""
|
|
98
|
+
body = CreateWorkflowRun(
|
|
99
|
+
inputs=inputs,
|
|
100
|
+
priority=priority,
|
|
101
|
+
thread=_uuid(thread) if thread is not None else None,
|
|
102
|
+
environment=environment,
|
|
103
|
+
envVars=env_vars,
|
|
104
|
+
metadata=_wrap_metadata(metadata),
|
|
105
|
+
)
|
|
106
|
+
return self._send(lambda: self._workflow_runs.create_workflow_run(slug, str(version), body))
|
|
107
|
+
|
|
108
|
+
def get_workflow_run(self, run_id: str | UUID) -> WorkflowRun:
|
|
109
|
+
"""Fetch a workflow run by ID."""
|
|
110
|
+
return self._send(lambda: self._workflow_runs.get_workflow_run(_uuid(run_id)))
|
|
111
|
+
|
|
112
|
+
def get_knowledge_base(self, slug: str) -> KnowledgeBaseResponse:
|
|
113
|
+
"""Fetch a knowledge base by slug."""
|
|
114
|
+
return self._send(lambda: self._knowledge_bases.public_get_knowledge_base(slug))
|
|
115
|
+
|
|
116
|
+
def get_knowledge_document(self, document_id: str | UUID) -> KnowledgeDocumentResponse:
|
|
117
|
+
"""Fetch a knowledge document by ID."""
|
|
118
|
+
return self._send(lambda: self._knowledge_bases.public_get_document(_uuid(document_id)))
|
|
119
|
+
|
|
120
|
+
def delete_knowledge_document(self, document_id: str | UUID) -> None:
|
|
121
|
+
"""Delete a knowledge document by ID."""
|
|
122
|
+
self._send(lambda: self._knowledge_bases.public_delete_document(_uuid(document_id)))
|
|
123
|
+
|
|
124
|
+
def upload_documents(self, slug: str, files: list[tuple[str, bytes]]) -> list[KnowledgeDocumentResponse]:
|
|
125
|
+
"""Upload one or more documents to a knowledge base (processed asynchronously).
|
|
126
|
+
|
|
127
|
+
Each file is a ``(filename, contents)`` tuple.
|
|
128
|
+
"""
|
|
129
|
+
api = self._knowledge_bases
|
|
130
|
+
# The generated serializer names every multipart part "files"; the server needs
|
|
131
|
+
# them bracket-indexed (files[0], files[1], ...) to parse them as an array. Reuse
|
|
132
|
+
# the serializer (it builds the URL, auth, and (filename, bytes, mime) parts),
|
|
133
|
+
# rename the fields, and call through — the Python analogue of an init override.
|
|
134
|
+
method, url, headers, body, post_params = api._public_upload_documents_serialize(
|
|
135
|
+
slug=slug,
|
|
136
|
+
files=list(files),
|
|
137
|
+
_request_auth=None,
|
|
138
|
+
_content_type=None,
|
|
139
|
+
_headers=None,
|
|
140
|
+
_host_index=0,
|
|
141
|
+
)
|
|
142
|
+
bracketed = _bracket_file_fields(cast("list[tuple[str, Any]]", post_params))
|
|
143
|
+
|
|
144
|
+
def call() -> list[KnowledgeDocumentResponse]:
|
|
145
|
+
response = api.api_client.call_api(method, url, headers, body, bracketed)
|
|
146
|
+
response.read()
|
|
147
|
+
result = api.api_client.response_deserialize(
|
|
148
|
+
response, {"200": "List[KnowledgeDocumentResponse]", "403": "ErrorResponse"}
|
|
149
|
+
).data
|
|
150
|
+
return cast("list[KnowledgeDocumentResponse]", result)
|
|
151
|
+
|
|
152
|
+
return self._send(call)
|
|
153
|
+
|
|
154
|
+
def _send(self, call: Callable[[], T]) -> T:
|
|
155
|
+
try:
|
|
156
|
+
return call()
|
|
157
|
+
except ApiException as error:
|
|
158
|
+
raise _to_api_error(error) from error
|
|
159
|
+
except urllib3.exceptions.HTTPError as error:
|
|
160
|
+
# No response: DNS failure, timeout, refused connection, etc.
|
|
161
|
+
raise NetworkError(str(error)) from error
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def _uuid(value: str | UUID) -> UUID:
|
|
165
|
+
return value if isinstance(value, UUID) else UUID(value)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _bracket_file_fields(post_params: list[tuple[str, Any]]) -> list[tuple[str, Any]]:
|
|
169
|
+
bracketed: list[tuple[str, Any]] = []
|
|
170
|
+
index = 0
|
|
171
|
+
for name, value in post_params:
|
|
172
|
+
if name == "files":
|
|
173
|
+
bracketed.append((f"files[{index}]", value))
|
|
174
|
+
index += 1
|
|
175
|
+
else:
|
|
176
|
+
bracketed.append((name, value))
|
|
177
|
+
return bracketed
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _wrap_metadata(metadata: Metadata | None) -> dict[str, CreateWorkflowRunMetadataValue] | None:
|
|
181
|
+
if metadata is None:
|
|
182
|
+
return None
|
|
183
|
+
return {key: CreateWorkflowRunMetadataValue(value) for key, value in metadata.items()}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _to_api_error(error: ApiException) -> ApiError:
|
|
187
|
+
message = error.reason or "API request failed"
|
|
188
|
+
body = error.body
|
|
189
|
+
if isinstance(body, (str, bytes)):
|
|
190
|
+
try:
|
|
191
|
+
decoded = json.loads(body)
|
|
192
|
+
except (ValueError, TypeError):
|
|
193
|
+
decoded = None
|
|
194
|
+
if isinstance(decoded, dict) and isinstance(decoded.get("error"), str):
|
|
195
|
+
message = decoded["error"]
|
|
196
|
+
return ApiError(message, error.status)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
# flake8: noqa
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
PromptJuggler
|
|
7
|
+
|
|
8
|
+
PromptJuggler API
|
|
9
|
+
|
|
10
|
+
The version of the OpenAPI document: 1.0.0
|
|
11
|
+
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
12
|
+
|
|
13
|
+
Do not edit the class manually.
|
|
14
|
+
""" # noqa: E501
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__version__ = "1.0.0"
|
|
18
|
+
|
|
19
|
+
# Define package exports
|
|
20
|
+
__all__ = [
|
|
21
|
+
"KnowledgeBasesApi",
|
|
22
|
+
"PromptRunsApi",
|
|
23
|
+
"PromptsApi",
|
|
24
|
+
"WorkflowRunsApi",
|
|
25
|
+
"ApiResponse",
|
|
26
|
+
"ApiClient",
|
|
27
|
+
"Configuration",
|
|
28
|
+
"OpenApiException",
|
|
29
|
+
"ApiTypeError",
|
|
30
|
+
"ApiValueError",
|
|
31
|
+
"ApiKeyError",
|
|
32
|
+
"ApiAttributeError",
|
|
33
|
+
"ApiException",
|
|
34
|
+
"ContentMessageResponse",
|
|
35
|
+
"CreatePromptRun",
|
|
36
|
+
"CreatePromptRunResponse",
|
|
37
|
+
"CreateWorkflowRun",
|
|
38
|
+
"CreateWorkflowRunMetadataValue",
|
|
39
|
+
"CreateWorkflowRunResponse",
|
|
40
|
+
"ErrorResponse",
|
|
41
|
+
"HttpCall",
|
|
42
|
+
"HttpHeader",
|
|
43
|
+
"JsonObjectFormat",
|
|
44
|
+
"JsonSchemaFormat",
|
|
45
|
+
"KnowledgeBaseFinished",
|
|
46
|
+
"KnowledgeBaseResponse",
|
|
47
|
+
"KnowledgeBaseStatus",
|
|
48
|
+
"KnowledgeDocumentFinished",
|
|
49
|
+
"KnowledgeDocumentResponse",
|
|
50
|
+
"KnowledgeDocumentStatus",
|
|
51
|
+
"KnowledgeDocumentSummary",
|
|
52
|
+
"KnowledgeSearch",
|
|
53
|
+
"Mcp",
|
|
54
|
+
"Memory",
|
|
55
|
+
"Model",
|
|
56
|
+
"ModelParams",
|
|
57
|
+
"PromptCall",
|
|
58
|
+
"PromptRevision",
|
|
59
|
+
"PromptRun",
|
|
60
|
+
"PromptRunFinished",
|
|
61
|
+
"Provider",
|
|
62
|
+
"ResponseFormat",
|
|
63
|
+
"Role",
|
|
64
|
+
"RunStatus",
|
|
65
|
+
"ScriptCall",
|
|
66
|
+
"ServiceTier",
|
|
67
|
+
"TextFormat",
|
|
68
|
+
"Tool",
|
|
69
|
+
"VersionRef",
|
|
70
|
+
"VersionRefIdOrTag",
|
|
71
|
+
"WebSearch",
|
|
72
|
+
"WorkflowCall",
|
|
73
|
+
"WorkflowRun",
|
|
74
|
+
"WorkflowRunFinished",
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
# import apis into sdk package
|
|
78
|
+
from promptjuggler._generated.api.knowledge_bases_api import KnowledgeBasesApi as KnowledgeBasesApi
|
|
79
|
+
from promptjuggler._generated.api.prompt_runs_api import PromptRunsApi as PromptRunsApi
|
|
80
|
+
from promptjuggler._generated.api.prompts_api import PromptsApi as PromptsApi
|
|
81
|
+
from promptjuggler._generated.api.workflow_runs_api import WorkflowRunsApi as WorkflowRunsApi
|
|
82
|
+
|
|
83
|
+
# import ApiClient
|
|
84
|
+
from promptjuggler._generated.api_response import ApiResponse as ApiResponse
|
|
85
|
+
from promptjuggler._generated.api_client import ApiClient as ApiClient
|
|
86
|
+
from promptjuggler._generated.configuration import Configuration as Configuration
|
|
87
|
+
from promptjuggler._generated.exceptions import OpenApiException as OpenApiException
|
|
88
|
+
from promptjuggler._generated.exceptions import ApiTypeError as ApiTypeError
|
|
89
|
+
from promptjuggler._generated.exceptions import ApiValueError as ApiValueError
|
|
90
|
+
from promptjuggler._generated.exceptions import ApiKeyError as ApiKeyError
|
|
91
|
+
from promptjuggler._generated.exceptions import ApiAttributeError as ApiAttributeError
|
|
92
|
+
from promptjuggler._generated.exceptions import ApiException as ApiException
|
|
93
|
+
|
|
94
|
+
# import models into sdk package
|
|
95
|
+
from promptjuggler._generated.models.content_message_response import ContentMessageResponse as ContentMessageResponse
|
|
96
|
+
from promptjuggler._generated.models.create_prompt_run import CreatePromptRun as CreatePromptRun
|
|
97
|
+
from promptjuggler._generated.models.create_prompt_run_response import CreatePromptRunResponse as CreatePromptRunResponse
|
|
98
|
+
from promptjuggler._generated.models.create_workflow_run import CreateWorkflowRun as CreateWorkflowRun
|
|
99
|
+
from promptjuggler._generated.models.create_workflow_run_metadata_value import CreateWorkflowRunMetadataValue as CreateWorkflowRunMetadataValue
|
|
100
|
+
from promptjuggler._generated.models.create_workflow_run_response import CreateWorkflowRunResponse as CreateWorkflowRunResponse
|
|
101
|
+
from promptjuggler._generated.models.error_response import ErrorResponse as ErrorResponse
|
|
102
|
+
from promptjuggler._generated.models.http_call import HttpCall as HttpCall
|
|
103
|
+
from promptjuggler._generated.models.http_header import HttpHeader as HttpHeader
|
|
104
|
+
from promptjuggler._generated.models.json_object_format import JsonObjectFormat as JsonObjectFormat
|
|
105
|
+
from promptjuggler._generated.models.json_schema_format import JsonSchemaFormat as JsonSchemaFormat
|
|
106
|
+
from promptjuggler._generated.models.knowledge_base_finished import KnowledgeBaseFinished as KnowledgeBaseFinished
|
|
107
|
+
from promptjuggler._generated.models.knowledge_base_response import KnowledgeBaseResponse as KnowledgeBaseResponse
|
|
108
|
+
from promptjuggler._generated.models.knowledge_base_status import KnowledgeBaseStatus as KnowledgeBaseStatus
|
|
109
|
+
from promptjuggler._generated.models.knowledge_document_finished import KnowledgeDocumentFinished as KnowledgeDocumentFinished
|
|
110
|
+
from promptjuggler._generated.models.knowledge_document_response import KnowledgeDocumentResponse as KnowledgeDocumentResponse
|
|
111
|
+
from promptjuggler._generated.models.knowledge_document_status import KnowledgeDocumentStatus as KnowledgeDocumentStatus
|
|
112
|
+
from promptjuggler._generated.models.knowledge_document_summary import KnowledgeDocumentSummary as KnowledgeDocumentSummary
|
|
113
|
+
from promptjuggler._generated.models.knowledge_search import KnowledgeSearch as KnowledgeSearch
|
|
114
|
+
from promptjuggler._generated.models.mcp import Mcp as Mcp
|
|
115
|
+
from promptjuggler._generated.models.memory import Memory as Memory
|
|
116
|
+
from promptjuggler._generated.models.model import Model as Model
|
|
117
|
+
from promptjuggler._generated.models.model_params import ModelParams as ModelParams
|
|
118
|
+
from promptjuggler._generated.models.prompt_call import PromptCall as PromptCall
|
|
119
|
+
from promptjuggler._generated.models.prompt_revision import PromptRevision as PromptRevision
|
|
120
|
+
from promptjuggler._generated.models.prompt_run import PromptRun as PromptRun
|
|
121
|
+
from promptjuggler._generated.models.prompt_run_finished import PromptRunFinished as PromptRunFinished
|
|
122
|
+
from promptjuggler._generated.models.provider import Provider as Provider
|
|
123
|
+
from promptjuggler._generated.models.response_format import ResponseFormat as ResponseFormat
|
|
124
|
+
from promptjuggler._generated.models.role import Role as Role
|
|
125
|
+
from promptjuggler._generated.models.run_status import RunStatus as RunStatus
|
|
126
|
+
from promptjuggler._generated.models.script_call import ScriptCall as ScriptCall
|
|
127
|
+
from promptjuggler._generated.models.service_tier import ServiceTier as ServiceTier
|
|
128
|
+
from promptjuggler._generated.models.text_format import TextFormat as TextFormat
|
|
129
|
+
from promptjuggler._generated.models.tool import Tool as Tool
|
|
130
|
+
from promptjuggler._generated.models.version_ref import VersionRef as VersionRef
|
|
131
|
+
from promptjuggler._generated.models.version_ref_id_or_tag import VersionRefIdOrTag as VersionRefIdOrTag
|
|
132
|
+
from promptjuggler._generated.models.web_search import WebSearch as WebSearch
|
|
133
|
+
from promptjuggler._generated.models.workflow_call import WorkflowCall as WorkflowCall
|
|
134
|
+
from promptjuggler._generated.models.workflow_run import WorkflowRun as WorkflowRun
|
|
135
|
+
from promptjuggler._generated.models.workflow_run_finished import WorkflowRunFinished as WorkflowRunFinished
|
|
136
|
+
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# flake8: noqa
|
|
2
|
+
|
|
3
|
+
# import apis into api package
|
|
4
|
+
from promptjuggler._generated.api.knowledge_bases_api import KnowledgeBasesApi
|
|
5
|
+
from promptjuggler._generated.api.prompt_runs_api import PromptRunsApi
|
|
6
|
+
from promptjuggler._generated.api.prompts_api import PromptsApi
|
|
7
|
+
from promptjuggler._generated.api.workflow_runs_api import WorkflowRunsApi
|
|
8
|
+
|