idside 0.1.0.dev0__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.
@@ -0,0 +1,217 @@
1
+ {
2
+ "descriptor_version": "2",
3
+ "name": "openai",
4
+ "client_module": "openai",
5
+ "call_sites": [
6
+ {
7
+ "id": "chat.completions.create",
8
+ "path": [
9
+ "chat",
10
+ "completions",
11
+ "create"
12
+ ],
13
+ "aliases": [
14
+ "parse",
15
+ "stream"
16
+ ],
17
+ "forceable_params": [
18
+ "prompt_cache_retention",
19
+ "store"
20
+ ],
21
+ "tool_fields": [
22
+ {
23
+ "path": [
24
+ "functions"
25
+ ],
26
+ "kind": "definitions",
27
+ "note": "The legacy form of `tools`: function definitions the model may call. Deprecated, still accepted."
28
+ },
29
+ {
30
+ "path": [
31
+ "web_search_options"
32
+ ],
33
+ "kind": "enabler",
34
+ "note": "Switches hosted web search on without any `tools` key: an empty object is enough."
35
+ }
36
+ ],
37
+ "note": "The stateless endpoint. Retention here is `store` and the prompt cache, and nothing else: `background`, `conversation` and `previous_response_id` do not exist on it, which is why this list is shorter than the one below rather than a copy of it. `stream` is an alias because the Python helper `chat.completions.stream()` builds its request from a fixed keyword signature: the identity kwarg this SDK requires is a TypeError on it, so a helper that is not itself a call site cannot be called at all. It is skipped by the JS SDK, whose helper forwards one body object — identity included — to the patched `create`."
38
+ },
39
+ {
40
+ "id": "responses.create",
41
+ "path": [
42
+ "responses",
43
+ "create"
44
+ ],
45
+ "aliases": [
46
+ "parse",
47
+ "stream"
48
+ ],
49
+ "resuming_params": [
50
+ "response_id",
51
+ "starting_after"
52
+ ],
53
+ "forceable_params": [
54
+ "background",
55
+ "prompt_cache_retention",
56
+ "store"
57
+ ],
58
+ "tool_fields": [
59
+ {
60
+ "path": [
61
+ "conversation"
62
+ ],
63
+ "kind": "enabler",
64
+ "note": "Prepends a stored conversation, whose items may include `additional_tools` the SDK cannot see."
65
+ },
66
+ {
67
+ "path": [
68
+ "previous_response_id"
69
+ ],
70
+ "kind": "enabler",
71
+ "note": "Continues from a stored response, whose items may include `additional_tools` the SDK cannot see."
72
+ },
73
+ {
74
+ "path": [
75
+ "prompt"
76
+ ],
77
+ "kind": "enabler",
78
+ "note": "A reusable prompt stored server-side, which may carry its own tool configuration."
79
+ },
80
+ {
81
+ "path": [
82
+ "input"
83
+ ],
84
+ "kind": "input_items",
85
+ "item_types": [
86
+ "additional_tools",
87
+ "tool_search_output",
88
+ "item_reference",
89
+ "mcp_approval_response"
90
+ ],
91
+ "note": "`additional_tools` and `tool_search_output` items carry full tool definitions inside `input`; `item_reference` points at a stored item that may be one; `mcp_approval_response` releases a pending MCP tool call."
92
+ }
93
+ ],
94
+ "note": "The stateful endpoint, and the one with more to refuse. `stream` is an alias for the same reason as above, with one consequence worth stating: the Python `responses.stream()` helper is overloaded, and its RESUMING form (`response_id=` / `starting_after=`, no `input`/`model`) reaches /v1/responses/{id} with a GET rather than creating anything. That is why this site declares `resuming_params`: enforced like the creating form, the resuming one demanded an identity for a call that creates nothing, authorized with an empty model, and then broke outright when the forced `store` was injected into a request that refuses it. It is now let through unenforced — the same GET `responses.retrieve()` makes, which the guard has always allowed — and letting it through is safe rather than trusted: a request that turned out to carry a body would carry no ACT token, and the guard would refuse it. Beyond `store`, `background: true` persists the response for about ten minutes so it can be polled — a second, separate retention this endpoint alone can create. `include: [\"reasoning.encrypted_content\"]` is a third lever and is not claimed YET, which is a backlog line rather than a wall: it is a LIST, so forcing it would silently drop whatever the developer already asked to include. What that needs is a union over the eight closed literals `include` accepts, not generic JSON merging — small, but it does not exist in the injection engine today, and an allowlist entry alone would break the calls of the users who opted out."
95
+ }
96
+ ],
97
+ "identity_param": "user_id",
98
+ "token_header": "X-AI-Consent-Token",
99
+ "param_target": "kwargs",
100
+ "protected_params": [
101
+ "model",
102
+ "messages",
103
+ "stream"
104
+ ],
105
+ "tools_param": [
106
+ "tools"
107
+ ],
108
+ "reserved_headers": [
109
+ "Authorization",
110
+ "OpenAI-Organization",
111
+ "OpenAI-Project",
112
+ "api-key"
113
+ ],
114
+ "notes": "Two endpoints are wrapped; every other POST on this client is refused by the transport guard (`UnenforcedCallError`) until it gets a call site of its own. Recorded 2026-07-26 because the refusals are load-bearing, not incidental: `vector_stores.create` is where uploaded file CONTENT ends up, chunked and indexed, and it carries `expires_after`; `containers.create` carries `network_policy`, which decides whether code running on a user's data may reach the network; and `audio.transcriptions.create` accepts `known_speaker_names` / `known_speaker_references`, which are voiceprints of named people — biometric data under GDPR Art. 9, and the only parameter in this API that ADDS special-category data rather than protecting any. The catalogue has no option covering biometrics or network egress, so the guard refusing those endpoints is currently the whole of the protection. Naming them here so the gap is a known one.",
115
+ "forceable_params": [
116
+ "background",
117
+ "prompt_cache_retention",
118
+ "store"
119
+ ],
120
+ "forceable_params_note": "Verified 2026-07-26 against the pinned `openai` client, per call site: `chat.completions.create` accepts `store` and `prompt_cache_retention`; `responses.create` accepts those plus `background`. Declared per site precisely because they differ — forcing `background` on chat.completions would raise TypeError for every user who opted out, and for nobody else.",
121
+ "enforcement": {
122
+ "training.foundation": {
123
+ "level": "contractual",
124
+ "protective": false,
125
+ "note": "API data has not been used for training since March 2023 unless the org opts in. No request parameter asserts it."
126
+ },
127
+ "training.personalisation": {
128
+ "level": "absent",
129
+ "note": "A ChatGPT product feature; the API has no per-user personalisation to switch off. `absent` rather than `unsupported` for that reason: the processing does not happen on the API, so a refusal has nothing to stop."
130
+ },
131
+ "training.analytics": {
132
+ "level": "contractual",
133
+ "protective": false,
134
+ "note": "Same data-usage policy, same absence of a request-level lever."
135
+ },
136
+ "memory": {
137
+ "level": "absent",
138
+ "note": "ChatGPT memory is a product feature. Memory in an API app is built by the developer, not the provider. `absent` for that reason: the provider keeps no memory on the API for a refusal to switch off, and what the developer builds is their own processing."
139
+ },
140
+ "agentic_tools": {
141
+ "level": "enforced",
142
+ "mechanism": "refuse_or_strip_tools",
143
+ "note": "ENFORCED by the SDK, not by a parameter. Every zero-retention arrangement excludes agentic features while the API itself does not block them: a call that hands the model tools falls outside the retention regime the user was promised, and the SDK is the only component that can see it happening, because it is the only one that sees the outgoing request. When the user has refused, the cloud returns a `tools` constraint and the SDK refuses the call (`ToolUseRefusedError`) or strips the tools, per the constraint. Refusing is the default: an agent stripped of its tools does not fail, it answers wrongly, and the developer has no way to know. Note what is NOT sent to us to make this work: nothing. The constraint follows from the consent state alone — we are never told whether a given call carried tools."
144
+ },
145
+ "data_residency": {
146
+ "level": "account",
147
+ "note": "Residency is chosen by DOMAIN (eu./gb./ca./au./jp./in./sg./kr./ae./us.api.openai.com), not by a parameter. The SDK can READ the base URL and record which region was used — see P1.10. `background: true` is rejected in the EU region. Can still be honoured per user IF the developer provisions one project per posture — the SDK then routes each call to the one matching that user's answer. See `credential_routing`.",
148
+ "routable": true
149
+ },
150
+ "retention.conversation": {
151
+ "level": "enforced",
152
+ "params": [
153
+ {
154
+ "name": "store",
155
+ "call_sites": [
156
+ "chat.completions.create",
157
+ "responses.create"
158
+ ],
159
+ "when": false,
160
+ "value": false,
161
+ "note": "VERIFIED live on both endpoints: `store: false` is accepted, and Responses keeps 30 days of application state otherwise. Under an org-level ZDR arrangement `store` is treated as false whatever the request asks — the account wins, in the safe direction."
162
+ },
163
+ {
164
+ "name": "background",
165
+ "call_sites": [
166
+ "responses.create"
167
+ ],
168
+ "when": false,
169
+ "value": false,
170
+ "conditions": "`false` only; `background: true` is additionally rejected outright in the EU region",
171
+ "note": "Unlocked by per-call-site parameters. Background mode persists the response for about ten minutes so the client can poll for it — a retention the user did not agree to, created by a flag the developer set for their own convenience. Forcing it off degrades that call to synchronous rather than failing it, which is the right way to lose the argument."
172
+ }
173
+ ],
174
+ "note": "Two parameters, one refusal: durable application state (`store`) and the polling window (`background`). Stateful chaining — `conversation` and `previous_response_id` — is the remaining gap: it is not zero-retention eligible, but refusing it means REMOVING an argument the developer passed rather than forcing one, which is the tool-refusal mechanism, not this."
175
+ },
176
+ "retention.cache": {
177
+ "level": "enforced",
178
+ "params": [
179
+ {
180
+ "name": "prompt_cache_retention",
181
+ "call_sites": [
182
+ "chat.completions.create",
183
+ "responses.create"
184
+ ],
185
+ "when": false,
186
+ "value": "in_memory",
187
+ "models": {
188
+ "only": "gpt-4*|gpt-5|gpt-5-*|gpt-5.1|gpt-5.1-*|gpt-5.2|gpt-5.2-*|gpt-5.3|gpt-5.3-*|gpt-5.4|gpt-5.4-*|o1*|o3*|o4*"
189
+ },
190
+ "conditions": "values `in_memory` or `24h`; on GPT-5.5+ only `24h` is supported, so the REFUSAL cannot be honoured from that model onward",
191
+ "note": "Written as `models.only` rather than `models.except` deliberately. \"5.5 and later\" is open-ended and a glob cannot say it, so a denylist would have to name models OpenAI has not shipped: `gpt-5.7` would match none of them, get `in_memory` forced, and 400 — for exactly the users who refused the cache and for nobody else. An allowlist that falls behind instead stops forcing on a model that would have accepted it: under-protected, still working, and said so in the published matrix.\n\n`gpt-5|gpt-5-*` and NOT `gpt-5*`, which is the whole difficulty in one line. `gpt-5*` would sweep in `gpt-5.5-mini`, the family this list exists to exclude. The hyphen cannot match the dot, so the two alternatives cover `gpt-5` itself and its `-mini` / `-nano` / dated variants while leaving every `5.x` above 5.4 out. Written as bare `gpt-5` on 2026-07-27, which silently dropped enforcement for `gpt-5-mini` and `gpt-5-nano` — under-protection rather than a broken call, and invisible without reading the glob character by character. Each of `gpt-5.1` to `gpt-5.4` is spelled the same way and for the same reason: `gpt-5.1*` would also match `gpt-5.10` and `gpt-5.11`, which are \"5.5 and later\" and would take `in_memory` and 400 — the unsurvivable direction, and the one an allowlist is chosen to avoid.\n\n`gpt-4*`, `o1*`, `o3*` and `o4*` carry over the claim the previous DENYLIST made implicitly: it excluded only 5.5+, so it asserted the parameter worked everywhere else. Keeping them is therefore not a new assertion. It is still weaker than the schema's word \"VERIFIED\" deserves — none of those families has been exercised with a live call — and settling it is what `tests/live/` is for."
192
+ }
193
+ ],
194
+ "note": "VERIFIED against the pinned client: `prompt_cache_retention` is the parameter this SDK can send today. It is deprecated in favour of `prompt_cache_options.ttl` (GPT-5.6+), which the pinned `openai` package does not expose yet — switching requires a client upgrade, so declaring it now would promise a parameter we cannot actually send. Orgs without zero-retention default to `24h`, orgs with it default to `in_memory`."
195
+ },
196
+ "location": {
197
+ "level": "unsupported",
198
+ "note": "The API infers no location, but it processes one an application declares: `web_search_options.user_location` on `chat.completions.create` and `user_location` on the `web_search` tool of `responses.create`, approximate location parameters for the search. No request lever refuses it. Web search is a tool, so a user who refuses `agentic_tools` loses it, and the declared location with it, through the tool refusal; refusing `location` alone is not possible, which is why this is `unsupported` and not `absent`."
199
+ },
200
+ "human_review": {
201
+ "level": "contractual",
202
+ "protective": false,
203
+ "note": "No request parameter. Abuse-monitoring logs, which may hold prompts and responses, are kept up to 30 days by default, and OpenAI limits access to stored API data to authorized employees — for engineering support, investigating potential platform abuse and legal compliance — and to specialized third-party contractors, solely to review for abuse and misuse. Zero Data Retention and Modified Abuse Monitoring keep customer content out of those logs, and Zero Data Retention with Private Safety Processing runs its safety review where no human can access the content; all three are granted only once OpenAI has approved the organization, then set for the whole organization or per project (Zero Data Retention with Private Safety Processing per project only), so a project carrying one could be routed to through `OpenAI-Project`. None of them rules human review out, which is why this entry is not routable: an image the CSAM classifier flags is retained for manual review even under Zero Data Retention or Modified Abuse Monitoring, and under Safety Retention OpenAI may, with written notice, make a model ineligible for both and human-review the content its classifiers flag. Private Retention with Private Safety Processing (formerly Eyes Off) keeps content in encrypted logs excluded from human review unless the law requires it, and is no posture either: OpenAI applies it when it makes a model ineligible for Zero Data Retention or Modified Abuse Monitoring, its page speaks of an organization ID being provisioned with it, and the CSAM rule applies to it too. Checked on 2026-10-12 against OpenAI's data-controls and Private Safety Processing guides and its enterprise privacy page."
204
+ },
205
+ "retention.files": {
206
+ "level": "unsupported",
207
+ "note": "OpenAI DOES offer per-request file retention controls — `expires_after` on /v1/files and on /v1/vector_stores, `output_expires_after` on /v1/batches — and none of them is reachable from the endpoints this descriptor wraps. That is our gap, not a carence of the provider's, and the two reasons must not be blurred: (1) `files.create` takes a binary stream that the request hash cannot canonicalise, which is a real and structural obstacle; (2) it carries no `model`, which /v1/authorize requires — but that is OUR API's constraint, and citing it as a limit of OpenAI's reads as a provider failing where it is us. `batches.create` is the cheapest way in, taking an `input_file_id` string rather than a stream. `vector_stores.create` matters most: an option covering the file wrapper but not the indexed content covers the wrong thing. Wrapping upload endpoints is its own card, not a line in this list."
208
+ }
209
+ },
210
+ "enforcement_verified_at": "2026-07-26",
211
+ "credential_routing": {
212
+ "header": "OpenAI-Project",
213
+ "header_value_pattern": "^proj_[A-Za-z0-9_-]{1,120}$",
214
+ "unit": "project",
215
+ "note": "Retention regime (default / ZDR / Modified Abuse Monitoring / None) is set per PROJECT, and `OpenAI-Project` is a per-request header the API validates. A developer who provisions one project per posture lets the SDK route each call to the one matching that user's answer. The pattern is a guard, not decoration: the value is written into an outgoing HTTP header, so it must not be able to carry CR/LF, and a project id is `proj_...` while an API key is `sk-...` — a developer who pastes the wrong one is stopped before their secret leaves the process."
216
+ }
217
+ }
idside/py.typed ADDED
File without changes