persona-sdk-python 0.1.2__tar.gz → 0.2.4__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.
- persona_sdk_python-0.2.4/DEPLOY.md +112 -0
- persona_sdk_python-0.2.4/PKG-INFO +246 -0
- persona_sdk_python-0.2.4/README.md +222 -0
- persona_sdk_python-0.2.4/bitbucket-pipelines.yml +17 -0
- persona_sdk_python-0.2.4/persona_sdk/__init__.py +100 -0
- persona_sdk_python-0.2.4/persona_sdk/auth/__init__.py +11 -0
- persona_sdk_python-0.2.4/persona_sdk/auth/api_key_auth.py +14 -0
- persona_sdk_python-0.2.4/persona_sdk/auth/base.py +17 -0
- persona_sdk_python-0.2.4/persona_sdk/auth/bearer_token_auth.py +14 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/client.py +34 -6
- persona_sdk_python-0.2.4/pyproject.toml +38 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/uv.lock +137 -128
- persona_sdk_python-0.1.2/PKG-INFO +0 -7
- persona_sdk_python-0.1.2/README.md +0 -351
- persona_sdk_python-0.1.2/persona_sdk/__init__.py +0 -32
- persona_sdk_python-0.1.2/pyproject.toml +0 -16
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/.gitignore +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/__init__.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/agents.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/credentials.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/features.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/knowledge_bases.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/missions.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/projects.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/service_prices.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/sessions.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/triggers.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/api/workflows.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/runners/__init__.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/runners/agent_runner.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/runners/resource_retriever.py +0 -0
- {persona_sdk_python-0.1.2 → persona_sdk_python-0.2.4}/persona_sdk/runners/tool_invoker.py +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Deploy to PyPI
|
|
2
|
+
|
|
3
|
+
Operational guide for publishing `persona-sdk-python` to PyPI.
|
|
4
|
+
|
|
5
|
+
Reference: same strategy used by `applica-iam-client`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
### 1. PyPI account
|
|
12
|
+
|
|
13
|
+
- Go to https://pypi.org/account/register/
|
|
14
|
+
- If the account already exists (e.g. the one used for `applica-iam-client`), skip this step
|
|
15
|
+
|
|
16
|
+
### 2. PyPI API Token
|
|
17
|
+
|
|
18
|
+
1. Login at https://pypi.org
|
|
19
|
+
2. Go to **Account Settings** → **API tokens**
|
|
20
|
+
3. Click **Add API token**
|
|
21
|
+
- Name: `persona-sdk-python-deploy`
|
|
22
|
+
- Scope: **Entire account** (for the first release, you can restrict to the project later)
|
|
23
|
+
4. Copy the token (starts with `pypi-...`) — it is shown only once
|
|
24
|
+
|
|
25
|
+
### 3. Configure the token on Bitbucket
|
|
26
|
+
|
|
27
|
+
1. Go to the Bitbucket repository for `persona-sdk-python`
|
|
28
|
+
2. **Repository settings** → **Pipelines** → **Repository variables**
|
|
29
|
+
3. Add:
|
|
30
|
+
- **Name:** `PYPI_TOKEN`
|
|
31
|
+
- **Value:** the copied token (e.g. `pypi-AgEIcH...`)
|
|
32
|
+
- **Secured:** checked
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Automated Release (Bitbucket Pipelines)
|
|
37
|
+
|
|
38
|
+
Every push to `main` automatically publishes a new version.
|
|
39
|
+
|
|
40
|
+
The version is computed as `0.1.{BITBUCKET_BUILD_NUMBER}`, so it auto-increments
|
|
41
|
+
(e.g. build #1 → `0.1.1`, build #14 → `0.1.14`, build #203 → `0.1.203`).
|
|
42
|
+
|
|
43
|
+
When you want a major/minor bump, change the prefix in `bitbucket-pipelines.yml`
|
|
44
|
+
(e.g. from `0.1.` to `0.2.` or `1.0.`).
|
|
45
|
+
|
|
46
|
+
### Flow:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
git push origin main
|
|
50
|
+
│
|
|
51
|
+
▼
|
|
52
|
+
Pipeline triggers
|
|
53
|
+
│
|
|
54
|
+
▼
|
|
55
|
+
Updates version in pyproject.toml (0.1.$BUILD_NUMBER)
|
|
56
|
+
│
|
|
57
|
+
▼
|
|
58
|
+
Build (sdist + wheel)
|
|
59
|
+
│
|
|
60
|
+
▼
|
|
61
|
+
Upload to PyPI via twine with $PYPI_TOKEN
|
|
62
|
+
│
|
|
63
|
+
▼
|
|
64
|
+
Creates git tag (0.1.$BUILD_NUMBER) and pushes it
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Manual Release (from local machine)
|
|
70
|
+
|
|
71
|
+
If you want to publish without the pipeline, from your terminal:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
cd /path/to/persona-sdk-python
|
|
75
|
+
|
|
76
|
+
# 1. Update the version in pyproject.toml
|
|
77
|
+
# Edit the line: version = "0.1.X"
|
|
78
|
+
|
|
79
|
+
# 2. Build
|
|
80
|
+
pip install build
|
|
81
|
+
python -m build
|
|
82
|
+
|
|
83
|
+
# 3. Upload
|
|
84
|
+
pip install twine
|
|
85
|
+
twine upload dist/* -u __token__ -p pypi-YOUR_TOKEN_HERE
|
|
86
|
+
|
|
87
|
+
# 4. Tag
|
|
88
|
+
git tag -a 0.1.X -m "0.1.X"
|
|
89
|
+
git push origin 0.1.X
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Verification
|
|
95
|
+
|
|
96
|
+
After release, verify that the package is available:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
pip install persona-sdk-python --upgrade
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Or check at: https://pypi.org/project/persona-sdk-python/
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## First Release — Checklist
|
|
107
|
+
|
|
108
|
+
- [ ] PyPI account created/existing
|
|
109
|
+
- [ ] API Token generated on PyPI
|
|
110
|
+
- [ ] Token configured as `PYPI_TOKEN` in Bitbucket repository variables
|
|
111
|
+
- [ ] Push to `main` → pipeline runs → package published
|
|
112
|
+
- [ ] `pip install persona-sdk-python` works
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: persona-sdk-python
|
|
3
|
+
Version: 0.2.4
|
|
4
|
+
Summary: Async Python SDK for the Persona AI platform
|
|
5
|
+
Project-URL: Homepage, https://persona.applica.guru
|
|
6
|
+
Project-URL: Repository, https://bitbucket.org/applicaguru/persona-sdk-python
|
|
7
|
+
Author: Applica Software Guru
|
|
8
|
+
License: Proprietary
|
|
9
|
+
Keywords: agents,ai,async,persona,sdk
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Framework :: AsyncIO
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Requires-Dist: httpx>=0.27.0
|
|
22
|
+
Requires-Dist: persona-models>=0.1.0
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# persona-sdk-python
|
|
26
|
+
|
|
27
|
+
Async Python SDK for the [Persona AI](https://persona.applica.guru) platform.
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
pip install persona-sdk-python
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Or with [uv](https://docs.astral.sh/uv/):
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
uv add persona-sdk-python
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Requirements: Python 3.10+
|
|
42
|
+
|
|
43
|
+
## Quick start
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
import asyncio
|
|
47
|
+
from persona_sdk import PersonaSdk
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
async def main():
|
|
51
|
+
sdk = PersonaSdk(
|
|
52
|
+
base_url="https://persona.applica.guru/api",
|
|
53
|
+
auth="prs_your_project_api_key",
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# List agents in your project
|
|
57
|
+
agents = await sdk.agents.list()
|
|
58
|
+
print(agents)
|
|
59
|
+
|
|
60
|
+
await sdk.close()
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
asyncio.run(main())
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Authentication
|
|
67
|
+
|
|
68
|
+
The SDK supports two authentication methods via the `auth` parameter.
|
|
69
|
+
|
|
70
|
+
### API key (default)
|
|
71
|
+
|
|
72
|
+
A plain string is wrapped automatically in `ApiKeyAuthenticationProvider` and
|
|
73
|
+
sent as the `x-persona-apikey` header. Accepts:
|
|
74
|
+
|
|
75
|
+
- Master key (full admin access)
|
|
76
|
+
- Project API key (`prs_...`)
|
|
77
|
+
- Agent API key (`prs_ag_...`)
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
from persona_sdk import PersonaSdk
|
|
81
|
+
|
|
82
|
+
sdk = PersonaSdk(
|
|
83
|
+
base_url="https://persona.applica.guru/api",
|
|
84
|
+
auth="prs_your_project_api_key",
|
|
85
|
+
)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### IAM Bearer token
|
|
89
|
+
|
|
90
|
+
For applications that authenticate users via IAM, pass a
|
|
91
|
+
`BearerTokenAuthenticationProvider` with a valid JWT:
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
from persona_sdk import PersonaSdk, BearerTokenAuthenticationProvider
|
|
95
|
+
|
|
96
|
+
sdk = PersonaSdk(
|
|
97
|
+
base_url="https://persona.applica.guru/api",
|
|
98
|
+
auth=BearerTokenAuthenticationProvider(iam_jwt_token),
|
|
99
|
+
)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
The token is sent as the `Authorization: Bearer <token>` header. The server
|
|
103
|
+
validates it via the IAM service and resolves the user's project automatically.
|
|
104
|
+
|
|
105
|
+
### Custom provider
|
|
106
|
+
|
|
107
|
+
Implement your own provider by subclassing `AuthenticationProvider`:
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
from persona_sdk import AuthenticationProvider
|
|
111
|
+
|
|
112
|
+
class MyProvider(AuthenticationProvider):
|
|
113
|
+
def headers(self) -> dict[str, str]:
|
|
114
|
+
return {"x-custom-header": "value"}
|
|
115
|
+
|
|
116
|
+
def credentials(self) -> str:
|
|
117
|
+
return "my-credentials"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Available APIs
|
|
121
|
+
|
|
122
|
+
The `PersonaSdk` instance exposes one client per resource:
|
|
123
|
+
|
|
124
|
+
| Attribute | Description |
|
|
125
|
+
|-----------|-------------|
|
|
126
|
+
| `sdk.agents` | Agent management (CRUD, voices) |
|
|
127
|
+
| `sdk.projects` | Project management and subscriptions |
|
|
128
|
+
| `sdk.sessions` | Sessions, messages, usage |
|
|
129
|
+
| `sdk.knowledge_bases` | Knowledge bases, documents, chunk search |
|
|
130
|
+
| `sdk.workflows` | Workflows, executions, queues |
|
|
131
|
+
| `sdk.triggers` | Triggers and trigger executions |
|
|
132
|
+
| `sdk.missions` | Missions (generate, execute, stop, continue) |
|
|
133
|
+
| `sdk.features` | Feature templates and MCP tools |
|
|
134
|
+
| `sdk.credentials` | OAuth credentials and authorization |
|
|
135
|
+
| `sdk.service_prices` | Service pricing |
|
|
136
|
+
|
|
137
|
+
Each API method is fully async. Always close the SDK when done:
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
sdk = PersonaSdk(...)
|
|
141
|
+
try:
|
|
142
|
+
agents = await sdk.agents.list()
|
|
143
|
+
finally:
|
|
144
|
+
await sdk.close()
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Or use it as an async context manager pattern:
|
|
148
|
+
|
|
149
|
+
```python
|
|
150
|
+
sdk = PersonaSdk(...)
|
|
151
|
+
async with sdk.client._client: # internal httpx client
|
|
152
|
+
...
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## CRUD example
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
# Create an agent
|
|
159
|
+
agent = await sdk.agents.create({
|
|
160
|
+
"name": "my-agent",
|
|
161
|
+
"model": {"modelName": "gpt-4o"},
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
# Read
|
|
165
|
+
fetched = await sdk.agents.get(agent["id"])
|
|
166
|
+
|
|
167
|
+
# Update
|
|
168
|
+
fetched["name"] = "renamed-agent"
|
|
169
|
+
await sdk.agents.update(agent["id"], fetched)
|
|
170
|
+
|
|
171
|
+
# Delete
|
|
172
|
+
await sdk.agents.delete(agent["id"])
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Pagination
|
|
176
|
+
|
|
177
|
+
List endpoints accept `keyword`, `page`, and `size`:
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
result = await sdk.agents.list(keyword="bot", page=1, size=20)
|
|
181
|
+
# {
|
|
182
|
+
# "items": [...],
|
|
183
|
+
# "total": 42,
|
|
184
|
+
# "page": 1,
|
|
185
|
+
# "size": 20
|
|
186
|
+
# }
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Workflows
|
|
190
|
+
|
|
191
|
+
If your workflows service runs on a different host, pass `workflows_url`:
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
sdk = PersonaSdk(
|
|
195
|
+
base_url="https://persona.applica.guru/api",
|
|
196
|
+
auth="prs_...",
|
|
197
|
+
workflows_url="https://persona.applica.guru/workflows",
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# Execute a workflow
|
|
201
|
+
result = await sdk.workflows.execute(
|
|
202
|
+
workflow_id="wf-123",
|
|
203
|
+
data={"input": "value"},
|
|
204
|
+
)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Runners
|
|
208
|
+
|
|
209
|
+
For higher-level abstractions, the SDK provides runners:
|
|
210
|
+
|
|
211
|
+
```python
|
|
212
|
+
from persona_sdk import PersonaClient
|
|
213
|
+
from persona_sdk.runners import AgentRunner, invoke_tool, retrieve_resource
|
|
214
|
+
|
|
215
|
+
client = PersonaClient(
|
|
216
|
+
base_url="https://persona.applica.guru/api",
|
|
217
|
+
auth="prs_...",
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
# Run an agent in an existing session
|
|
221
|
+
runner = AgentRunner(client=client, agent_id="agent-1", session_code="sess-1")
|
|
222
|
+
response = await runner.run("Hello, agent!")
|
|
223
|
+
|
|
224
|
+
# Invoke an MCP tool directly
|
|
225
|
+
result = await invoke_tool(
|
|
226
|
+
client=client,
|
|
227
|
+
mcp_server_name="my-mcp",
|
|
228
|
+
transport=...,
|
|
229
|
+
tool_name="search",
|
|
230
|
+
args={"query": "hello"},
|
|
231
|
+
)
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Proxy support
|
|
235
|
+
|
|
236
|
+
```python
|
|
237
|
+
sdk = PersonaSdk(
|
|
238
|
+
base_url="https://persona.applica.guru/api",
|
|
239
|
+
auth="prs_...",
|
|
240
|
+
proxy="http://proxy.local:8080",
|
|
241
|
+
)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## License
|
|
245
|
+
|
|
246
|
+
Proprietary — © Applica Software Guru
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# persona-sdk-python
|
|
2
|
+
|
|
3
|
+
Async Python SDK for the [Persona AI](https://persona.applica.guru) platform.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install persona-sdk-python
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or with [uv](https://docs.astral.sh/uv/):
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
uv add persona-sdk-python
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Requirements: Python 3.10+
|
|
18
|
+
|
|
19
|
+
## Quick start
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
import asyncio
|
|
23
|
+
from persona_sdk import PersonaSdk
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
async def main():
|
|
27
|
+
sdk = PersonaSdk(
|
|
28
|
+
base_url="https://persona.applica.guru/api",
|
|
29
|
+
auth="prs_your_project_api_key",
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# List agents in your project
|
|
33
|
+
agents = await sdk.agents.list()
|
|
34
|
+
print(agents)
|
|
35
|
+
|
|
36
|
+
await sdk.close()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
asyncio.run(main())
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Authentication
|
|
43
|
+
|
|
44
|
+
The SDK supports two authentication methods via the `auth` parameter.
|
|
45
|
+
|
|
46
|
+
### API key (default)
|
|
47
|
+
|
|
48
|
+
A plain string is wrapped automatically in `ApiKeyAuthenticationProvider` and
|
|
49
|
+
sent as the `x-persona-apikey` header. Accepts:
|
|
50
|
+
|
|
51
|
+
- Master key (full admin access)
|
|
52
|
+
- Project API key (`prs_...`)
|
|
53
|
+
- Agent API key (`prs_ag_...`)
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
from persona_sdk import PersonaSdk
|
|
57
|
+
|
|
58
|
+
sdk = PersonaSdk(
|
|
59
|
+
base_url="https://persona.applica.guru/api",
|
|
60
|
+
auth="prs_your_project_api_key",
|
|
61
|
+
)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### IAM Bearer token
|
|
65
|
+
|
|
66
|
+
For applications that authenticate users via IAM, pass a
|
|
67
|
+
`BearerTokenAuthenticationProvider` with a valid JWT:
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
from persona_sdk import PersonaSdk, BearerTokenAuthenticationProvider
|
|
71
|
+
|
|
72
|
+
sdk = PersonaSdk(
|
|
73
|
+
base_url="https://persona.applica.guru/api",
|
|
74
|
+
auth=BearerTokenAuthenticationProvider(iam_jwt_token),
|
|
75
|
+
)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The token is sent as the `Authorization: Bearer <token>` header. The server
|
|
79
|
+
validates it via the IAM service and resolves the user's project automatically.
|
|
80
|
+
|
|
81
|
+
### Custom provider
|
|
82
|
+
|
|
83
|
+
Implement your own provider by subclassing `AuthenticationProvider`:
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
from persona_sdk import AuthenticationProvider
|
|
87
|
+
|
|
88
|
+
class MyProvider(AuthenticationProvider):
|
|
89
|
+
def headers(self) -> dict[str, str]:
|
|
90
|
+
return {"x-custom-header": "value"}
|
|
91
|
+
|
|
92
|
+
def credentials(self) -> str:
|
|
93
|
+
return "my-credentials"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Available APIs
|
|
97
|
+
|
|
98
|
+
The `PersonaSdk` instance exposes one client per resource:
|
|
99
|
+
|
|
100
|
+
| Attribute | Description |
|
|
101
|
+
|-----------|-------------|
|
|
102
|
+
| `sdk.agents` | Agent management (CRUD, voices) |
|
|
103
|
+
| `sdk.projects` | Project management and subscriptions |
|
|
104
|
+
| `sdk.sessions` | Sessions, messages, usage |
|
|
105
|
+
| `sdk.knowledge_bases` | Knowledge bases, documents, chunk search |
|
|
106
|
+
| `sdk.workflows` | Workflows, executions, queues |
|
|
107
|
+
| `sdk.triggers` | Triggers and trigger executions |
|
|
108
|
+
| `sdk.missions` | Missions (generate, execute, stop, continue) |
|
|
109
|
+
| `sdk.features` | Feature templates and MCP tools |
|
|
110
|
+
| `sdk.credentials` | OAuth credentials and authorization |
|
|
111
|
+
| `sdk.service_prices` | Service pricing |
|
|
112
|
+
|
|
113
|
+
Each API method is fully async. Always close the SDK when done:
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
sdk = PersonaSdk(...)
|
|
117
|
+
try:
|
|
118
|
+
agents = await sdk.agents.list()
|
|
119
|
+
finally:
|
|
120
|
+
await sdk.close()
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Or use it as an async context manager pattern:
|
|
124
|
+
|
|
125
|
+
```python
|
|
126
|
+
sdk = PersonaSdk(...)
|
|
127
|
+
async with sdk.client._client: # internal httpx client
|
|
128
|
+
...
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## CRUD example
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
# Create an agent
|
|
135
|
+
agent = await sdk.agents.create({
|
|
136
|
+
"name": "my-agent",
|
|
137
|
+
"model": {"modelName": "gpt-4o"},
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
# Read
|
|
141
|
+
fetched = await sdk.agents.get(agent["id"])
|
|
142
|
+
|
|
143
|
+
# Update
|
|
144
|
+
fetched["name"] = "renamed-agent"
|
|
145
|
+
await sdk.agents.update(agent["id"], fetched)
|
|
146
|
+
|
|
147
|
+
# Delete
|
|
148
|
+
await sdk.agents.delete(agent["id"])
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Pagination
|
|
152
|
+
|
|
153
|
+
List endpoints accept `keyword`, `page`, and `size`:
|
|
154
|
+
|
|
155
|
+
```python
|
|
156
|
+
result = await sdk.agents.list(keyword="bot", page=1, size=20)
|
|
157
|
+
# {
|
|
158
|
+
# "items": [...],
|
|
159
|
+
# "total": 42,
|
|
160
|
+
# "page": 1,
|
|
161
|
+
# "size": 20
|
|
162
|
+
# }
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Workflows
|
|
166
|
+
|
|
167
|
+
If your workflows service runs on a different host, pass `workflows_url`:
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
sdk = PersonaSdk(
|
|
171
|
+
base_url="https://persona.applica.guru/api",
|
|
172
|
+
auth="prs_...",
|
|
173
|
+
workflows_url="https://persona.applica.guru/workflows",
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
# Execute a workflow
|
|
177
|
+
result = await sdk.workflows.execute(
|
|
178
|
+
workflow_id="wf-123",
|
|
179
|
+
data={"input": "value"},
|
|
180
|
+
)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Runners
|
|
184
|
+
|
|
185
|
+
For higher-level abstractions, the SDK provides runners:
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
from persona_sdk import PersonaClient
|
|
189
|
+
from persona_sdk.runners import AgentRunner, invoke_tool, retrieve_resource
|
|
190
|
+
|
|
191
|
+
client = PersonaClient(
|
|
192
|
+
base_url="https://persona.applica.guru/api",
|
|
193
|
+
auth="prs_...",
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
# Run an agent in an existing session
|
|
197
|
+
runner = AgentRunner(client=client, agent_id="agent-1", session_code="sess-1")
|
|
198
|
+
response = await runner.run("Hello, agent!")
|
|
199
|
+
|
|
200
|
+
# Invoke an MCP tool directly
|
|
201
|
+
result = await invoke_tool(
|
|
202
|
+
client=client,
|
|
203
|
+
mcp_server_name="my-mcp",
|
|
204
|
+
transport=...,
|
|
205
|
+
tool_name="search",
|
|
206
|
+
args={"query": "hello"},
|
|
207
|
+
)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Proxy support
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
sdk = PersonaSdk(
|
|
214
|
+
base_url="https://persona.applica.guru/api",
|
|
215
|
+
auth="prs_...",
|
|
216
|
+
proxy="http://proxy.local:8080",
|
|
217
|
+
)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## License
|
|
221
|
+
|
|
222
|
+
Proprietary — © Applica Software Guru
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
image: python:3.12
|
|
2
|
+
|
|
3
|
+
pipelines:
|
|
4
|
+
default:
|
|
5
|
+
- step:
|
|
6
|
+
name: Publish to PyPI
|
|
7
|
+
caches:
|
|
8
|
+
- pip
|
|
9
|
+
script:
|
|
10
|
+
- apt-get update && apt-get install -y git
|
|
11
|
+
- pip install build twine
|
|
12
|
+
- export VERSION=0.2.$BITBUCKET_BUILD_NUMBER
|
|
13
|
+
- sed -i "s/^version = .*/version = \"$VERSION\"/" pyproject.toml
|
|
14
|
+
- python -m build
|
|
15
|
+
- twine upload dist/* -u __token__ -p $PYPI_TOKEN
|
|
16
|
+
- git tag -a $VERSION -m "$VERSION"
|
|
17
|
+
- git push origin $VERSION
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
from typing import Union
|
|
2
|
+
|
|
3
|
+
from persona_sdk.api.agents import AgentsApi
|
|
4
|
+
from persona_sdk.api.credentials import CredentialsApi
|
|
5
|
+
from persona_sdk.api.features import FeaturesApi
|
|
6
|
+
from persona_sdk.api.knowledge_bases import KnowledgeBasesApi
|
|
7
|
+
from persona_sdk.api.missions import MissionsApi
|
|
8
|
+
from persona_sdk.api.projects import ProjectsApi
|
|
9
|
+
from persona_sdk.api.service_prices import ServicePricesApi
|
|
10
|
+
from persona_sdk.api.sessions import SessionsApi
|
|
11
|
+
from persona_sdk.api.triggers import TriggersApi
|
|
12
|
+
from persona_sdk.api.workflows import WorkflowsApi
|
|
13
|
+
from persona_sdk.auth import (
|
|
14
|
+
ApiKeyAuthenticationProvider,
|
|
15
|
+
AuthenticationProvider,
|
|
16
|
+
BearerTokenAuthenticationProvider,
|
|
17
|
+
)
|
|
18
|
+
from persona_sdk.client import PersonaClient
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"PersonaSdk",
|
|
22
|
+
"PersonaClient",
|
|
23
|
+
"AuthenticationProvider",
|
|
24
|
+
"ApiKeyAuthenticationProvider",
|
|
25
|
+
"BearerTokenAuthenticationProvider",
|
|
26
|
+
"AgentsApi",
|
|
27
|
+
"CredentialsApi",
|
|
28
|
+
"FeaturesApi",
|
|
29
|
+
"KnowledgeBasesApi",
|
|
30
|
+
"MissionsApi",
|
|
31
|
+
"ProjectsApi",
|
|
32
|
+
"ServicePricesApi",
|
|
33
|
+
"SessionsApi",
|
|
34
|
+
"TriggersApi",
|
|
35
|
+
"WorkflowsApi",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class PersonaSdk:
|
|
40
|
+
"""
|
|
41
|
+
Persona SDK facade.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
base_url: Base URL of persona-core (e.g. https://persona.applica.guru/api).
|
|
45
|
+
auth: An ``AuthenticationProvider`` (preferred) or a plain string with
|
|
46
|
+
the API key / JWT token. Strings are wrapped in
|
|
47
|
+
``ApiKeyAuthenticationProvider`` for backwards compatibility.
|
|
48
|
+
proxy: Optional HTTP proxy URL.
|
|
49
|
+
workflows_url: Optional separate base URL for the workflows service.
|
|
50
|
+
If provided, a second client is created using the same auth.
|
|
51
|
+
api_key: Deprecated keyword-only alias for ``auth``. Provided for
|
|
52
|
+
backwards compatibility with previous SDK versions.
|
|
53
|
+
|
|
54
|
+
Examples:
|
|
55
|
+
Using an API key (legacy)::
|
|
56
|
+
|
|
57
|
+
sdk = PersonaSdk("http://localhost:8000", "prs_my_key")
|
|
58
|
+
|
|
59
|
+
Using an IAM Bearer token::
|
|
60
|
+
|
|
61
|
+
from persona_sdk import BearerTokenAuthenticationProvider
|
|
62
|
+
sdk = PersonaSdk(
|
|
63
|
+
"http://localhost:8000",
|
|
64
|
+
BearerTokenAuthenticationProvider(jwt_token),
|
|
65
|
+
)
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
def __init__(
|
|
69
|
+
self,
|
|
70
|
+
base_url: str,
|
|
71
|
+
auth: Union[str, AuthenticationProvider, None] = None,
|
|
72
|
+
proxy: str = None,
|
|
73
|
+
workflows_url: str = None,
|
|
74
|
+
api_key: str = None,
|
|
75
|
+
):
|
|
76
|
+
# Backwards compatibility: keep the legacy `api_key` keyword
|
|
77
|
+
if auth is None:
|
|
78
|
+
if api_key is None:
|
|
79
|
+
raise ValueError("Either 'auth' or 'api_key' must be provided")
|
|
80
|
+
auth = api_key
|
|
81
|
+
|
|
82
|
+
self.client = PersonaClient(base_url, auth, proxy=proxy)
|
|
83
|
+
self.workflows_client = (
|
|
84
|
+
PersonaClient(workflows_url, auth) if workflows_url else self.client
|
|
85
|
+
)
|
|
86
|
+
self.agents = AgentsApi(self.client)
|
|
87
|
+
self.workflows = WorkflowsApi(self.workflows_client)
|
|
88
|
+
self.triggers = TriggersApi(self.client)
|
|
89
|
+
self.sessions = SessionsApi(self.client)
|
|
90
|
+
self.credentials = CredentialsApi(self.client)
|
|
91
|
+
self.knowledge_bases = KnowledgeBasesApi(self.client)
|
|
92
|
+
self.projects = ProjectsApi(self.client)
|
|
93
|
+
self.features = FeaturesApi(self.client)
|
|
94
|
+
self.missions = MissionsApi(self.client)
|
|
95
|
+
self.service_prices = ServicePricesApi(self.client)
|
|
96
|
+
|
|
97
|
+
async def close(self):
|
|
98
|
+
await self.client.close()
|
|
99
|
+
if self.workflows_client is not self.client:
|
|
100
|
+
await self.workflows_client.close()
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Authentication providers for the Persona SDK."""
|
|
2
|
+
|
|
3
|
+
from persona_sdk.auth.api_key_auth import ApiKeyAuthenticationProvider
|
|
4
|
+
from persona_sdk.auth.base import AuthenticationProvider
|
|
5
|
+
from persona_sdk.auth.bearer_token_auth import BearerTokenAuthenticationProvider
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"AuthenticationProvider",
|
|
9
|
+
"ApiKeyAuthenticationProvider",
|
|
10
|
+
"BearerTokenAuthenticationProvider",
|
|
11
|
+
]
|