Skip to content

openai provider updates#2

Merged
jeffreyaven merged 31 commits into
mainfrom
feature/provider-dev
Jul 15, 2026
Merged

openai provider updates#2
jeffreyaven merged 31 commits into
mainfrom
feature/provider-dev

Conversation

@jeffreyaven

Copy link
Copy Markdown
Contributor

Description

  • new provider generated
  • doc updates

Checklist

Please make sure that the following criteria are met:

  • The PR title is descriptive.
  • I have ⭐'ed the stackql and this repo.

Additional Notes

Add any additional information or context that might help the reviewers.

jeffreyaven and others added 30 commits July 15, 2026 08:03
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… 17 services)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…in-scope)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…med, live proof blocked on key

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…sources, 11 services)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ried, 13 renamed, 39 retired)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e_names.json

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d (99 ops, 26 resources), validations pass

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… evidence, gated tiers, cutover plan

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…blish, docs) and service coverage

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ize, residual-variant lowering

- pre_normalize.mjs injects OpenAI-Organization/OpenAI-Project optional header
  params on all 100 ops (200 params); guards against 3.1 array-type nullables
- bin/normalize.{mjs,sh} synced from k8s reference; provider-utils normalize
  flattens 569 allOf, renames 300 oneOf/anyOf, resolving nullable idioms
- lower_residual_variants.mjs lowers the 1 irreducible union left at a column
  site (conversations items.environment) to a json_extract blob column; roots
  left polymorphic fail the run
- column-producing sites verified free of polymorphism; deep nested variants
  intentionally retained as json_extract territory
- mapping is byte-identical pre/post normalize (schemas change, not paths/verbs)
- README stage 3 documented; deterministic and re-runnable from a fresh split

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- generate-provider.mjs synced to current toolchain (supports --service-config,
  --naive-req-body-translate, --skip-files); generate-provider.sh reduced to a
  thin passthrough so the wrapper cannot drop flags; npm script points at .mjs
- generated provider-dev/openapi/src/openai (11 services, 26 resources) with:
  bearer auth (OPENAI_API_KEY), fixed server https://api.openai.com/v1,
  derived-cursor pagination (after <- $.last_id), naive request body columns
- verified offline in stackql v0.10.542: SHOW SERVICES/RESOURCES/METHODS and
  DESCRIBE resolve for all 11 services; async-job archetype correct (jobs
  create/list/get + cancel/pause/resume EXEC, native columns model/training_file);
  the lowered conversations.items.environment union projects as a json column

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rmalize (no post_process needed)

- strip all k8s references and sibling name-drops from CLAUDE.md, README, NOTES,
  clean_specs.mjs, pre_normalize.mjs, bin/generate-docs.sh; artifacts stand alone
- post_process not needed for openai: all 99 methods are application/json (no
  media-type rewrite), and update-POST + body-carrying EXEC methods all bind via
  the naive translator (verified in generated output)
- the one build-input adjustment, assistants-family deprecation, moves into
  pre_normalize driven by the endpoint inventory deprecated column: stamps
  deprecated:true on the 18 family ops the vendor left unflagged (23 total),
  flowing through generate into the provider (verified 23/23 in generated
  assistants.yaml) and docs
- full pipeline re-run deterministic: only assistants.yaml changed, other 10
  services regenerated byte-identical; all 11 services resolve offline

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…lides with cursor pagination)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…fecycles, gated completions

- tests/smoke_test.py: resolution + cost-free reads + vector store lifecycle
  (create/get/update/delete) via pystackql; auth is the provider's declared
  bearer/OPENAI_API_KEY (no credential on the command line)
- local registry injected as platform-quoted JSON (survives Windows cmd and POSIX
  sh); public via 'registry pull openai'
- gated --with-completions makes a direct OpenAI API call (inference is out of
  provider scope) with the 'explain how stackql works' prompt
- error handling: executeStmt surfaces API errors (SELECT swallows to empty), and
  an empty models read is treated as an auth/connectivity failure
- validated offline: resolution passes with no key (live steps BLOCKED); with a
  dummy key the smoke SQL parses/plans/routes to api.openai.com and fails only at
  401, surfaced as FAIL
- README stage 5 updated; tests/requirements.txt added

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…wait pattern)

- create then poll the list until the store is listable (--timeout default 120s,
  --poll-interval default 3s), returning as soon as found and reporting elapsed
- on timeout, surface diagnostics: store count (a count of the default page size
  hints at pagination not traversing) and a sample of names (a blank name hints
  at the INSERT not binding name)
- README stage 5 updated with the new flags and poll behaviour

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The gated completions demo is an optional, out-of-scope direct API call; an
account quota/billing state (HTTP 429 insufficient_quota) is not a provider or
code defect, so it is reported as SKIP rather than failing the run. Other HTTP
errors remain FAIL.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The provider-data header templates were still the generic REPLACEME defaults,
including a malformed <a href="REPLACEME> with no closing quote - injected
verbatim into the generated landing page, breaking MDX (unterminated attribute).
Authored headerContent1/2.txt for openai (identity, OPENAI_API_KEY auth, correct
api-keys URL with a closed href) and regenerated the docs; REPLACEME is gone from
website/docs and the landing page is valid.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…h anthropic)

- package.json -> Docusaurus 3.10.1 (+faster, +ideal-image, +theme-mermaid);
  vendor-config script clones stackql/docusaurus-config into .shared-config on
  prestart/prebuild (gitignored)
- provider.js supplies providerName/providerTitle (openai/OpenAI)
- docusaurus.config.js uses createConfig from the vendored shared config, with
  openai-specific editUrl (stackql/stackql-provider-openai, website/ subdir) and
  the registry-branded local logos
- sidebars.js -> shared mainSidebar pattern (All Providers + autogenerated services)
- src aligned with the shared theme: add SchemaTable, StackqlDeployDropdown,
  DocBreadcrumbs, css/global.css; drop the legacy standalone src/pages (docs are
  served at root by the shared config)
- static: fix CNAME (was snowflake-provider), add root favicons + site.webmanifest
  + logo.svg the shared head expects; netlify.toml for openai-provider.stackql.io
- clean install + build verified green on 3.10.1 (only the cosmetic spec-description
  /docs link warnings remain, onBrokenLinks: warn)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s; flip editUrl to stackql-registry

- sanitize_docs.mjs prefixes every relative /docs/... link (91 across 13 service
  docs) with https://platform.openai.com. OpenAI moved docs to developers.openai.com
  with non-deterministically renamed paths (retrieve-contents->retrieve,
  fine-tuning->model-optimization), but platform.openai.com 301-redirects every old
  /docs path (verified 25/26 distinct; 26th is a live page behind an anti-bot 403),
  so the host prefix is the only deterministic fix and stays correct via their redirects
- build now emits zero broken-link warnings
- editUrl flipped to github.com/stackql-registry/stackql-provider-openai/edit/main/website/
- README stage 7 documents the shared-config pattern and the sanitize step

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ly README

website/README.md was a full 282-line provider-generation guide (download spec,
split, mappings, generate, test, publish) duplicating and conflicting with the
root README. Replaced with a short Docusaurus-site README (install/dev/build/
deploy) that documents the shared-config vendoring and points to the root README
as the canonical provider-generation pipeline doc.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… GHA

This provider is a single-microsite repo, so it deploys via GitHub Pages (the
existing prod/test-web-deploy GHA workflows), not Netlify (which is only used when
multiple microsites share a repo). Removed website/netlify.toml, rewrote the
website README deployment section for GitHub Pages, and corrected the NOTES.md
website-state line. The GHA build runs yarn build, which vendors .shared-config,
then publishes website/build via actions/deploy-pages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…p creates, keep file_id INSERT

any-sdk marshalBody handles only JSON/XML (no multipart/form-data or octet-stream),
so a format:binary request field (file upload) cannot be sent regardless of verb.
Per the EXEC-minimisation rule (EXEC only for genuine lifecycle ops):

- CreateSkill, CreateSkillVersion: required binary files, no file_id path, not
  lifecycle -> skipped (multipart-binary-body). skills/versions become metadata
  surfaces (list/get/delete + skills default-version update), no create.
- CreateContainerFile: optional binary file plus a non-binary file_id -> stays
  INSERT via file_id; pre_normalize strips the dead binary column.
- pre_normalize adds a general rule: strip format:binary request properties (and
  drop from required) - never marshalable.

Totals: 100 ops -> 97 mapped / 3 skipped (was 99/1); insert 19 -> 17. Verified in
stackql: skills/versions have no create, containers.files INSERT exposes only
file_id. Docs regenerated + sanitized; NOTES section 9 records the finding.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The minor upgrade left theme-mermaid, module-type-aliases and types at 3.10.1;
Docusaurus requires a uniform version across its packages (build failed with
'Invalid name=docusaurus-theme-mermaid version number=3.10.1'). Bumped the three
stragglers to 3.10.2. Build verified green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…raise 2 any-sdk work orders

Q1 - pushdown:
- top pushdown enabled (paramName: limit, maxValue: 100): SELECT ... LIMIT n now
  sends ?limit=n. applyPushdownTop has no dialect gate, so a custom paramName works
  (correcting the earlier NOTES 8 claim).
- limit dropped from generated example WHERE clauses; params table annotates it as
  SQL-LIMIT driven (pre_normalize).
- orderBy stays blocked: applyPushdownOrderBy hard-requires odata and renders
  '<col> <dir>', but OpenAI's order takes a bare asc/desc. Raised
  any-sdk-order-pushdown-issue.md requesting a general directive (direction_only).
  filter deliberately parked (vendor DSLs).

Q2 - casing: not achievable without an any-sdk change. nativeCasing is live at the
method level (proven: the mangled ToSnake alias open_ai-_organization resolves),
but casing.ToSnake never treats '-' as a separator, so hyphenated headers get a
mangled alias or none. Raised any-sdk-casing-hyphen-issue.md. Shipped: headers
declared wire-valid lowercase kebab (case-insensitive per RFC 7230) with
request.nativeCasing: kebab (forward-compatible), docs use the quoted form.

Docs: sanitize_docs now also fixes SQL examples that did not parse - the generator
emitted bare 'order' (reserved word) and hyphenated headers. 21 limit predicates
dropped, 187 identifiers quoted across 26 files. Verified: the sanitized example
parses and reaches the API. Docs build green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…itize SQL fixups

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…operations

The request.nativeCasing stamp delivered no benefit (any-sdk's ToSnake cannot alias
hyphenated headers, so no snake alias is ever produced) and actively regressed the
async control surface: getRequestBodySchema treats a present request block as
implying a body, so a metadata-only 'request: {nativeCasing: kebab}' on a body-less
POST made EXEC fail with 'no request body for operation = cancelFineTuningJob'.
Verified: EXEC jobs.cancel / batches.cancel reach the API with the block removed.
Scoping headers keep their wire-valid lowercase kebab names and are addressed
quoted. Also drops references to the upstream work-order files (removed in 9df3106).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Follows the openai_admin pattern: teach the flagship queries on the home page
rather than only listing services. Sections match the CLAUDE.md doc leads -
fine-tuning history and checkpoint inventory, the async create/poll/cancel shape,
batch status and error triage, vector store audits, file estate by purpose/age,
and the assistants inventory with its deprecation posture - plus a 'Reading the
surface' preamble (deep blocks are json_extract columns; LIMIT is pushed to the
wire) and the openai_admin sibling pointer.

All 15 examples were executed against the generated provider and reach the API
(dummy key -> 401), so every column, json_extract path, aggregate and EXEC is real,
not assumed. Docs build green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@jeffreyaven jeffreyaven self-assigned this Jul 15, 2026
@jeffreyaven
jeffreyaven merged commit 5e3f8a8 into main Jul 15, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant