querri 1.0.2__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.
- querri/__init__.py +51 -0
- querri/_auth.py +818 -0
- querri/_base_client.py +379 -0
- querri/_client.py +395 -0
- querri/_config.py +140 -0
- querri/_convenience.py +538 -0
- querri/_exceptions.py +180 -0
- querri/_pagination.py +278 -0
- querri/_streaming.py +663 -0
- querri/_user_client.py +193 -0
- querri/_version.py +1 -0
- querri/cli/__init__.py +21 -0
- querri/cli/_app.py +246 -0
- querri/cli/_context.py +216 -0
- querri/cli/_image.py +234 -0
- querri/cli/_output.py +293 -0
- querri/cli/audit.py +68 -0
- querri/cli/auth.py +556 -0
- querri/cli/chat.py +1255 -0
- querri/cli/chats.py +358 -0
- querri/cli/dashboards.py +294 -0
- querri/cli/embed.py +220 -0
- querri/cli/files.py +214 -0
- querri/cli/keys.py +304 -0
- querri/cli/policies.py +424 -0
- querri/cli/projects.py +916 -0
- querri/cli/sharing.py +403 -0
- querri/cli/sources.py +532 -0
- querri/cli/steps.py +123 -0
- querri/cli/usage.py +99 -0
- querri/cli/users.py +223 -0
- querri/cli/views.py +449 -0
- querri/cli/whoami.py +78 -0
- querri/py.typed +0 -0
- querri/resources/__init__.py +1 -0
- querri/resources/audit.py +119 -0
- querri/resources/dashboards.py +295 -0
- querri/resources/embed.py +268 -0
- querri/resources/files.py +145 -0
- querri/resources/keys.py +191 -0
- querri/resources/policies.py +492 -0
- querri/resources/projects.py +808 -0
- querri/resources/sharing.py +330 -0
- querri/resources/sources.py +511 -0
- querri/resources/usage.py +106 -0
- querri/resources/users.py +303 -0
- querri/resources/views.py +347 -0
- querri/types/__init__.py +104 -0
- querri/types/audit.py +21 -0
- querri/types/chat.py +51 -0
- querri/types/dashboard.py +51 -0
- querri/types/data.py +61 -0
- querri/types/embed.py +38 -0
- querri/types/file.py +18 -0
- querri/types/key.py +36 -0
- querri/types/policy.py +105 -0
- querri/types/project.py +158 -0
- querri/types/sharing.py +19 -0
- querri/types/usage.py +39 -0
- querri/types/user.py +33 -0
- querri-1.0.2.dist-info/METADATA +310 -0
- querri-1.0.2.dist-info/RECORD +64 -0
- querri-1.0.2.dist-info/WHEEL +4 -0
- querri-1.0.2.dist-info/entry_points.txt +2 -0
querri/types/usage.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Usage type models for the Querri SDK."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class DailyUsage(BaseModel):
|
|
9
|
+
"""Single day's usage count."""
|
|
10
|
+
|
|
11
|
+
date: str #: Date string (YYYY-MM-DD).
|
|
12
|
+
count: int = 0 #: Number of AI messages on this date.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class OrgUsageReport(BaseModel):
|
|
16
|
+
"""Organization-level usage report."""
|
|
17
|
+
|
|
18
|
+
org_id: str | None = None #: Organization ID.
|
|
19
|
+
period: str | None = None #: Period name (current_month, last_month, last_30_days).
|
|
20
|
+
period_start: str | None = None #: ISO-8601 start of the reporting period.
|
|
21
|
+
period_end: str | None = None #: ISO-8601 end of the reporting period.
|
|
22
|
+
total_ai_messages: int | None = None #: Total AI messages in the period.
|
|
23
|
+
active_user_count: int | None = None #: Number of active users in the period.
|
|
24
|
+
project_count: int | None = None #: Number of projects in the organization.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class UserUsageReport(BaseModel):
|
|
28
|
+
"""Per-user usage report."""
|
|
29
|
+
|
|
30
|
+
user_id: str | None = None #: User ID.
|
|
31
|
+
period: str | None = None #: Period name.
|
|
32
|
+
period_start: str | None = None #: ISO-8601 start of the reporting period.
|
|
33
|
+
period_end: str | None = None #: ISO-8601 end of the reporting period.
|
|
34
|
+
ai_messages: int | None = None #: Total AI messages by this user.
|
|
35
|
+
daily_breakdown: list[DailyUsage] | None = None #: Daily message counts.
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# Keep backward compat alias
|
|
39
|
+
UsageReport = OrgUsageReport
|
querri/types/user.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""User type models for the Querri SDK."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class User(BaseModel):
|
|
9
|
+
"""A user in the Querri organization."""
|
|
10
|
+
|
|
11
|
+
id: str #: Unique user identifier.
|
|
12
|
+
email: str #: User's email address.
|
|
13
|
+
first_name: str | None = None #: User's first name.
|
|
14
|
+
last_name: str | None = None #: User's last name.
|
|
15
|
+
role: str = "member" #: Role, e.g. ``"admin"`` or ``"member"``.
|
|
16
|
+
external_id: str | None = None #: Caller-supplied external identifier.
|
|
17
|
+
created_at: str | None = None #: ISO-8601 timestamp of creation.
|
|
18
|
+
created: bool | None = None #: Only on get_or_create; ``True`` if newly created.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class UserDeleteResponse(BaseModel):
|
|
22
|
+
"""Response from deleting a user."""
|
|
23
|
+
|
|
24
|
+
id: str #: ID of the deleted user.
|
|
25
|
+
deleted: bool = True #: Whether the user was successfully deleted.
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ExternalIdDeleteResponse(BaseModel):
|
|
29
|
+
"""Response from removing an external ID mapping."""
|
|
30
|
+
|
|
31
|
+
external_id: str #: The external ID that was removed.
|
|
32
|
+
user_id: str #: The user ID that was unlinked.
|
|
33
|
+
deleted: bool #: Whether the mapping was deleted.
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: querri
|
|
3
|
+
Version: 1.0.2
|
|
4
|
+
Summary: Python SDK and CLI for the Querri data analysis platform
|
|
5
|
+
Project-URL: Homepage, https://querri.com
|
|
6
|
+
Project-URL: Documentation, https://docs.querri.com/sdk/python
|
|
7
|
+
Project-URL: Repository, https://github.com/querri-ai/querri-python
|
|
8
|
+
Author-email: Querri <support@querri.com>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Typing :: Typed
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Requires-Dist: httpx<1.0,>=0.27
|
|
21
|
+
Requires-Dist: pydantic<3.0,>=2.0
|
|
22
|
+
Requires-Dist: typing-extensions>=4.0
|
|
23
|
+
Provides-Extra: cli
|
|
24
|
+
Requires-Dist: pillow<12.0,>=10.0; extra == 'cli'
|
|
25
|
+
Requires-Dist: rich<14.0,>=13.0; extra == 'cli'
|
|
26
|
+
Requires-Dist: typer[all]<1.0,>=0.12; extra == 'cli'
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: mypy>=1.0; extra == 'dev'
|
|
29
|
+
Requires-Dist: pillow<12.0,>=10.0; extra == 'dev'
|
|
30
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: respx>=0.21; extra == 'dev'
|
|
33
|
+
Requires-Dist: rich<14.0,>=13.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
35
|
+
Requires-Dist: typer[all]<1.0,>=0.12; extra == 'dev'
|
|
36
|
+
Provides-Extra: test
|
|
37
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'test'
|
|
38
|
+
Requires-Dist: pytest>=8.0; extra == 'test'
|
|
39
|
+
Requires-Dist: respx>=0.21; extra == 'test'
|
|
40
|
+
Provides-Extra: tui
|
|
41
|
+
Requires-Dist: pillow<12.0,>=10.0; extra == 'tui'
|
|
42
|
+
Requires-Dist: rich<14.0,>=13.0; extra == 'tui'
|
|
43
|
+
Requires-Dist: typer[all]<1.0,>=0.12; extra == 'tui'
|
|
44
|
+
Description-Content-Type: text/markdown
|
|
45
|
+
|
|
46
|
+
# Querri — Python SDK and CLI
|
|
47
|
+
|
|
48
|
+
> **CLI:** Interact with the Querri data analysis platform from the terminal or in scripts.
|
|
49
|
+
> **Python SDK:** Embed Querri analytics in your Python web application with one method call.
|
|
50
|
+
|
|
51
|
+
## Install
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pip install querri
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## CLI Quick Start
|
|
60
|
+
|
|
61
|
+
The `querri` CLI lets you upload data, create analysis projects, and ask questions — interactively or from scripts.
|
|
62
|
+
|
|
63
|
+
### Auth
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
querri auth login # browser-based login
|
|
67
|
+
querri whoami # confirm who you're logged in as
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
For scripted/non-interactive use, set `QUERRI_API_KEY` instead of relying on stored tokens:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
export QUERRI_API_KEY=qk_your_api_key
|
|
74
|
+
export QUERRI_ORG_ID=org_your_org_id
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Example workflow: upload a file and analyze it
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Upload a file (CSV, Excel, JSON, etc.)
|
|
81
|
+
querri --json file upload path/to/data.csv
|
|
82
|
+
|
|
83
|
+
# Create a project
|
|
84
|
+
querri --json project new "My Analysis"
|
|
85
|
+
|
|
86
|
+
# Add the file to the project (triggers ingestion + agent summary)
|
|
87
|
+
querri --json project add-source <file_id>
|
|
88
|
+
|
|
89
|
+
# Ask a question
|
|
90
|
+
querri --json project chat -m "What are the top 5 products by revenue?"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
For scripting, add `--no-interactive` to prevent prompts and `--json` for parseable output. Note that `--json` and other global flags must come **before** the subcommand:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
querri --json --no-interactive project chat -m "Summarize the data" # correct
|
|
97
|
+
querri project chat -m "Summarize the data" --json # WRONG
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Self-documenting
|
|
101
|
+
|
|
102
|
+
The CLI covers all Querri resources — projects, files, sources, views, dashboards, sharing, API keys, users, policies, embed sessions, and more.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
querri --help
|
|
106
|
+
querri <command> --help
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
See [`skills/querri-cli/SKILL.md`](skills/querri-cli/SKILL.md) for the full command reference.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Python SDK
|
|
114
|
+
|
|
115
|
+
For embedding Querri analytics in a Python web application. Use alongside the [`@querri-inc/embed`](https://www.npmjs.com/package/@querri-inc/embed) frontend component.
|
|
116
|
+
|
|
117
|
+
### Quick Start
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
from querri import Querri
|
|
121
|
+
|
|
122
|
+
client = Querri(api_key="qk_your_api_key", org_id="org_...")
|
|
123
|
+
|
|
124
|
+
session = client.embed.get_session(
|
|
125
|
+
user="customer-42", # external ID from your system
|
|
126
|
+
ttl=3600,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
print(session["session_token"]) # JWT to pass to the frontend
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Wire a session endpoint
|
|
133
|
+
|
|
134
|
+
**Flask:**
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
from flask import Flask, jsonify, request
|
|
138
|
+
from querri import Querri
|
|
139
|
+
|
|
140
|
+
app = Flask(__name__)
|
|
141
|
+
client = Querri() # reads QUERRI_API_KEY and QUERRI_ORG_ID from env
|
|
142
|
+
|
|
143
|
+
@app.route("/api/querri-session", methods=["POST"])
|
|
144
|
+
def querri_session():
|
|
145
|
+
# Derive user identity from YOUR auth system — never from the request body.
|
|
146
|
+
auth_user = get_authenticated_user()
|
|
147
|
+
|
|
148
|
+
session = client.embed.get_session(
|
|
149
|
+
user={"external_id": auth_user.id, "email": auth_user.email},
|
|
150
|
+
access={
|
|
151
|
+
"sources": ["src_sales_data"],
|
|
152
|
+
"filters": {"tenant_id": auth_user.tenant_id},
|
|
153
|
+
},
|
|
154
|
+
origin=request.headers.get("Origin"),
|
|
155
|
+
ttl=3600,
|
|
156
|
+
)
|
|
157
|
+
return jsonify(session)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Django and FastAPI follow the identical pattern — see **[docs/server-sdk.md](docs/server-sdk.md)** for those examples.
|
|
161
|
+
|
|
162
|
+
### Add the embed (React)
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
import { QuerriEmbed } from '@querri-inc/embed/react';
|
|
166
|
+
|
|
167
|
+
<QuerriEmbed
|
|
168
|
+
style={{ width: '100%', height: '600px' }}
|
|
169
|
+
serverUrl="https://app.querri.com"
|
|
170
|
+
auth={{ sessionEndpoint: '/api/querri-session' }}
|
|
171
|
+
/>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
> **Security:** Always derive user identity and access from server-side auth. Never read `user` or `access` from the request body — a malicious client can impersonate any user or escalate access.
|
|
175
|
+
|
|
176
|
+
### Configuration
|
|
177
|
+
|
|
178
|
+
The SDK reads configuration from constructor arguments or environment variables:
|
|
179
|
+
|
|
180
|
+
| Parameter | Env Variable | Default | Description |
|
|
181
|
+
|-----------|-------------|---------|-------------|
|
|
182
|
+
| `api_key` | `QUERRI_API_KEY` | *(required)* | Your `qk_` API key |
|
|
183
|
+
| `org_id` | `QUERRI_ORG_ID` | *(required)* | Organization ID |
|
|
184
|
+
| `host` | `QUERRI_HOST` | `https://app.querri.com` | Server host |
|
|
185
|
+
| `timeout` | `QUERRI_TIMEOUT` | `30.0` | Request timeout (seconds) |
|
|
186
|
+
| `max_retries` | `QUERRI_MAX_RETRIES` | `3` | Retry attempts for transient errors |
|
|
187
|
+
|
|
188
|
+
> **Note:** The parameter is `host`, not `base_url`. The SDK appends `/api/v1` automatically.
|
|
189
|
+
|
|
190
|
+
### `get_session()` — Embed Sessions
|
|
191
|
+
|
|
192
|
+
The flagship convenience method: resolves or creates a user, applies access policies, and generates a session JWT in one call.
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
session = client.embed.get_session(
|
|
196
|
+
user={
|
|
197
|
+
"external_id": "customer-42",
|
|
198
|
+
"email": "alice@acme.com",
|
|
199
|
+
"first_name": "Alice",
|
|
200
|
+
},
|
|
201
|
+
access={
|
|
202
|
+
"sources": ["src_sales_data"],
|
|
203
|
+
"filters": {
|
|
204
|
+
"tenant_id": "acme",
|
|
205
|
+
"region": ["us-east", "us-west"], # list values are OR'd
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
origin="https://app.acme.com",
|
|
209
|
+
ttl=7200,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
session["session_token"] # str — JWT for the embed
|
|
213
|
+
session["expires_in"] # int — seconds until expiry
|
|
214
|
+
session["user_id"] # str — Querri user ID
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
You can also pass pre-created policy IDs directly:
|
|
218
|
+
|
|
219
|
+
```python
|
|
220
|
+
session = client.embed.get_session(
|
|
221
|
+
user={"external_id": "customer-42"},
|
|
222
|
+
access={"policy_ids": ["pol_abc123"]},
|
|
223
|
+
)
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### User-Scoped Client (`as_user`)
|
|
227
|
+
|
|
228
|
+
```python
|
|
229
|
+
session = client.embed.get_session(user="customer-42", ttl=900)
|
|
230
|
+
|
|
231
|
+
with client.as_user(session) as user_client:
|
|
232
|
+
for project in user_client.projects.list():
|
|
233
|
+
print(project.name)
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
See **[docs/server-sdk.md](docs/server-sdk.md#user-scoped-client-as_user)** for details on granting access and available resources.
|
|
237
|
+
|
|
238
|
+
### All Resources
|
|
239
|
+
|
|
240
|
+
| Resource | Access | Key Methods |
|
|
241
|
+
|----------|--------|-------------|
|
|
242
|
+
| `client.dashboards` | Dashboard management | `list`, `create`, `get`, `update`, `delete`, `refresh` |
|
|
243
|
+
| `client.projects` | Analysis projects | `list`, `create`, `get`, `run`, `run_status`, `list_steps` |
|
|
244
|
+
| `client.projects.chats` | Chats within projects | `create`, `list`, `stream`, `cancel`, `delete` |
|
|
245
|
+
| `client.sources` | Sources, connectors & data | `list`, `create`, `create_data_source`, `query`, `source_data`, `append_rows`, `replace_data`, `ask`, `sync`, `list_connectors` |
|
|
246
|
+
| `client.views` | SQL-defined views | `list`, `create`, `get`, `update`, `delete`, `run`, `preview`, `chat` |
|
|
247
|
+
| `client.files` | File management | `upload`, `list`, `get`, `delete` |
|
|
248
|
+
| `client.users` | User management | `list`, `create`, `get`, `update`, `delete` |
|
|
249
|
+
| `client.keys` | API key management | `create`, `list`, `get`, `delete` |
|
|
250
|
+
| `client.audit` | Audit log | `list` |
|
|
251
|
+
| `client.usage` | Usage metrics | `org_usage`, `user_usage` |
|
|
252
|
+
| `client.sharing` | Sharing & permissions | `share_project`, `share_dashboard`, `share_source` |
|
|
253
|
+
|
|
254
|
+
### Async Client
|
|
255
|
+
|
|
256
|
+
`AsyncQuerri` mirrors the sync API with `async`/`await`:
|
|
257
|
+
|
|
258
|
+
```python
|
|
259
|
+
from querri import AsyncQuerri
|
|
260
|
+
|
|
261
|
+
async with AsyncQuerri() as client:
|
|
262
|
+
session = await client.embed.get_session(
|
|
263
|
+
user={"external_id": "cust-42", "email": "a@b.com"},
|
|
264
|
+
access={"sources": ["src_sales"]},
|
|
265
|
+
)
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Error Handling
|
|
269
|
+
|
|
270
|
+
All errors extend `QuerriError`:
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
QuerriError
|
|
274
|
+
├── APIError — HTTP error responses
|
|
275
|
+
│ ├── ValidationError — 400
|
|
276
|
+
│ ├── AuthenticationError — 401
|
|
277
|
+
│ ├── PermissionError — 403
|
|
278
|
+
│ ├── NotFoundError — 404
|
|
279
|
+
│ ├── ConflictError — 409
|
|
280
|
+
│ ├── RateLimitError — 429 (auto-retried)
|
|
281
|
+
│ └── ServerError — 5xx (auto-retried)
|
|
282
|
+
├── StreamError — SSE stream issues
|
|
283
|
+
└── ConfigError — missing/invalid configuration
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
The SDK automatically retries **429** (always) and **5xx** (idempotent methods only) with exponential backoff + jitter.
|
|
287
|
+
|
|
288
|
+
### Full Reference
|
|
289
|
+
|
|
290
|
+
See **[docs/server-sdk.md](docs/server-sdk.md)** for complete method signatures, all framework examples, and the `get_session()` deep dive.
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Requirements
|
|
295
|
+
|
|
296
|
+
- Python 3.10+
|
|
297
|
+
- [`httpx`](https://www.python-httpx.org/) >= 0.27
|
|
298
|
+
- [`pydantic`](https://docs.pydantic.dev/) >= 2.0
|
|
299
|
+
|
|
300
|
+
## Development
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
pip install -e ".[dev]"
|
|
304
|
+
pytest tests/ -v
|
|
305
|
+
pytest tests/test_integration.py -m integration -v # requires API credentials
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## License
|
|
309
|
+
|
|
310
|
+
MIT
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
querri/__init__.py,sha256=Fc27eNSwFmuIzGWxD4UDblANJfbGlkTvoVtXeg2uc04,1170
|
|
2
|
+
querri/_auth.py,sha256=BBJD-EE09AGeWiSRq67NaRh-A6Qpuz2PSQ8oaDweiNU,28360
|
|
3
|
+
querri/_base_client.py,sha256=dMGlV2X_KyF_RhGL91jDROnLrRnG0fKqB4agb0nUSps,13336
|
|
4
|
+
querri/_client.py,sha256=H6E5fX4TCGS_1DN8h-YDfYwGQ4116SAngKhMehsALH0,13196
|
|
5
|
+
querri/_config.py,sha256=1eNoGoN3rd1gFYa5HwCvhXno6Uz4NEfmyIAPJHUgALg,5218
|
|
6
|
+
querri/_convenience.py,sha256=TC-ggHPHgq07K_0kFSYUdf-D0VUKqrNCzRpGGmVAL-s,18785
|
|
7
|
+
querri/_exceptions.py,sha256=sHFdAc2lNPby6Bnej5GgwLmcm05ag59GCWdw4gllQgg,4849
|
|
8
|
+
querri/_pagination.py,sha256=d8bxpzGNLvDfJq7qwgWY8as31DWYfpm8RJPjauM4ofA,8723
|
|
9
|
+
querri/_streaming.py,sha256=8KgXjt1VXWz8wXpw1lhl5Sqc9oDiwH88TFwTRNatxAU,23407
|
|
10
|
+
querri/_user_client.py,sha256=ARN99plfuiV9bnL0ig5NiI44MOyNZ1tBFEOiBHa4VaU,6569
|
|
11
|
+
querri/_version.py,sha256=Zn1KFblwuFHiDRdRAiRnDBRkbPttWh44jKa5zG2ov0E,22
|
|
12
|
+
querri/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
querri/cli/__init__.py,sha256=S3IQjFvKO2PdkzIGJUCuTK3a7XTDh7EwDaRJGCVfGzE,663
|
|
14
|
+
querri/cli/_app.py,sha256=Wqj0pmJoPFihY-rZhes0ulCKgTAgmJT6vqXZrBSUI1o,8223
|
|
15
|
+
querri/cli/_context.py,sha256=7y2HBVm1A_oEs6OEfMU-_rxOMA5V0frwsCZEJ8a6i6o,6932
|
|
16
|
+
querri/cli/_image.py,sha256=Mf5xzWJOFB-G44oPGILE4XwIFjfaMW7K7vu3DFK5oUc,7241
|
|
17
|
+
querri/cli/_output.py,sha256=y_YxY7SVKyF3YKzxMDeTVUX-AtEhLjIKPgpiotHFfe8,8625
|
|
18
|
+
querri/cli/audit.py,sha256=Ko1jJw1LiX0yWzVZ74wOSR7djyDeR4SXQvttmYTSNiY,1999
|
|
19
|
+
querri/cli/auth.py,sha256=ZockvJ0DdDzIXBNLS2inp22gWk5q9sh0vW-lMpJX80s,17466
|
|
20
|
+
querri/cli/chat.py,sha256=B6zKt7Y-uzVQeK1b6-R5MU16iOlT49QS1TpZUhgsE78,43395
|
|
21
|
+
querri/cli/chats.py,sha256=KH3JMZXruZBw7EaxeRidYUBswx9s9nbfoEvhty-0Cao,10857
|
|
22
|
+
querri/cli/dashboards.py,sha256=u4D3CEpyCBo0YJxSBPlOMmzhQj4esZcwJZcav1Jf618,9367
|
|
23
|
+
querri/cli/embed.py,sha256=onuBPL8zQBLzq9K3SiMzPH3vvNTNOnQjitzJy0gts2g,6747
|
|
24
|
+
querri/cli/files.py,sha256=bEXAu7lhATLc0WabndJkMMp2C0JVWYY5WC06UIJ5gtg,6222
|
|
25
|
+
querri/cli/keys.py,sha256=zfgMdh3at_c3byL_G3FzMHYqew7VFb4Zt33jdJ3b4f0,9740
|
|
26
|
+
querri/cli/policies.py,sha256=IcmPdQnwZ64xFZGDscn08IVhLek5HvsqQ0mAYqzw5uw,13725
|
|
27
|
+
querri/cli/projects.py,sha256=KxRZpzIThGdhgzXWvIqakAUZSJyIEVJ7XpqLxijO628,29531
|
|
28
|
+
querri/cli/sharing.py,sha256=L1WbJEZYuDltbv99EO3MdkSuyWuNpKijc9jqYp3PWSQ,12874
|
|
29
|
+
querri/cli/sources.py,sha256=7yAr2hMe60w6ZChfEcAEb1pxmdf0SintSa_-4wd3jcA,17455
|
|
30
|
+
querri/cli/steps.py,sha256=ABRaI9FglWU2JNNE7Hol111Uf_VT4wlPLHoZqUQiS7M,3750
|
|
31
|
+
querri/cli/usage.py,sha256=7R2xlsICs6hL_ybBCH4sqhphh1pK0rjryN8uJoX20Yk,2877
|
|
32
|
+
querri/cli/users.py,sha256=VqelrgxE4k0e6Ar7kno6tckrHskeWqVHktJk-vrH-Q8,6858
|
|
33
|
+
querri/cli/views.py,sha256=2WtRHR690Ai0EEiST1fle02IZ6i1tobSynPSeavoyBg,15263
|
|
34
|
+
querri/cli/whoami.py,sha256=1WBm6BjqfMIgUZ06LVd1NYA616VqQYaPjgotgtJjtjA,2354
|
|
35
|
+
querri/resources/__init__.py,sha256=MwTB3luMZE6pE7RX6ZI2pY2pLNzKuIJYeAXt__luRbA,43
|
|
36
|
+
querri/resources/audit.py,sha256=sts0EgdCpxoL-cUn-QLlYelDJBQN_MIOQyxO6WFklCU,3796
|
|
37
|
+
querri/resources/dashboards.py,sha256=z5gIaow_EHXMdt97o9ENK5jKZ1cKdnWHkKMAe72-wl4,9070
|
|
38
|
+
querri/resources/embed.py,sha256=IeWfF-w8W5O3sV-5gzduf1nvNUod3pCiS-D9pohmJoU,8827
|
|
39
|
+
querri/resources/files.py,sha256=AM3RKyURMbOoHvzRmDsPEEsQuLkbTmiD2EIqdUiuKu8,3796
|
|
40
|
+
querri/resources/keys.py,sha256=a8oBa0hamQcKBKECPBfwL2_epHeOwZRYtz-a5aZRNwA,6472
|
|
41
|
+
querri/resources/policies.py,sha256=x9MKaZ5YkHMrN3HJ0a77KE26us9LZua6Qnc2SPlyZHE,15809
|
|
42
|
+
querri/resources/projects.py,sha256=ODB8Oe6tdQKZ_zHLq1B0QDPrK35ce1o4SZ4z9-KAAzE,23922
|
|
43
|
+
querri/resources/sharing.py,sha256=AlGoXdgAIQc5M3wQ4yIOXuPmJFIoZLhkRVAiF2mZeEU,10811
|
|
44
|
+
querri/resources/sources.py,sha256=gb-oQL2g2nttSFapTi0A_QqlK6y6YIyqxUE0LP4KbXc,15655
|
|
45
|
+
querri/resources/usage.py,sha256=3U1Y1_Xq3xz4FOTDEGsgw90xGkZhF5FZeZP2GIOv8fQ,2809
|
|
46
|
+
querri/resources/users.py,sha256=MryXKhk-8gls_Iv5PkDSfyZqHEPIvIQv7kb0Grc-5Kw,10078
|
|
47
|
+
querri/resources/views.py,sha256=leCa2Ddlmx7t54IGwPZPfaPbqnRaMTNzI9LIy-Am6Pw,10574
|
|
48
|
+
querri/types/__init__.py,sha256=NeamK9nIm1-dryYlObbCEonKFO6EamBfmVCme1PbNiE,2283
|
|
49
|
+
querri/types/audit.py,sha256=0MTYRW1LNyotauC03-jfAgfJ4Kb3w90zkbsSbEn8rfs,848
|
|
50
|
+
querri/types/chat.py,sha256=jM9Y2pMIFKrMeOR1fRU9rox2xE6qqpDnO6LCj-lGtjg,1679
|
|
51
|
+
querri/types/dashboard.py,sha256=Os2DAdn92ZPY26Kpf710uS3EdlL_kp9HpSZvdfjbQtM,1778
|
|
52
|
+
querri/types/data.py,sha256=Bc7L4ocINTlzmYeaQ2L7ZuQs085QAdko2WwpR9R_6d4,2140
|
|
53
|
+
querri/types/embed.py,sha256=m35FYj8QVA51zc54NwsVV_-PvpzAKDjem6-JHDRLnsg,1413
|
|
54
|
+
querri/types/file.py,sha256=ry5LRwdZ0qdFK-MQNc5jm7EWXWPwY_0H-WcshaMlYNk,648
|
|
55
|
+
querri/types/key.py,sha256=t4XtoDC1euNYa_rA07BdaF8DeMxRCoWNQ2EHR5nte3Q,1447
|
|
56
|
+
querri/types/policy.py,sha256=mcdMrSdSWbDqbTcU21A6gx0fHz7xiP8E6XiOvtNT4HI,3714
|
|
57
|
+
querri/types/project.py,sha256=QI64T3-7iNbvKemIDtiSxILt0Nc42KWnO1APkPaHieA,6250
|
|
58
|
+
querri/types/sharing.py,sha256=6N0VauTTa28Jju17XviiPUPWlEokfwc8ZFAb5ewHCUE,717
|
|
59
|
+
querri/types/usage.py,sha256=3otZESeR_ZlVH2KdvP3HguS9UaESDDyn6hHPCIqkQ_8,1426
|
|
60
|
+
querri/types/user.py,sha256=4CBdvbjJCerjiqI8GkgtUo9qkJ9sqAWPofbMCf0geoI,1138
|
|
61
|
+
querri-1.0.2.dist-info/METADATA,sha256=Zan9UnB8MrRlmUnxlWmW8nykbIDPfNYXNnrcld0Eq0Y,10018
|
|
62
|
+
querri-1.0.2.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
63
|
+
querri-1.0.2.dist-info/entry_points.txt,sha256=G88OLZu2u5pXTQkGP5obbK9pwFMoNMGpfWrvXQTVWXA,42
|
|
64
|
+
querri-1.0.2.dist-info/RECORD,,
|