Latest commit

History

History
274 lines (213 loc) · 9.68 KB

File metadata and controls

274 lines (213 loc) · 9.68 KB

CometAPI TypeScript and Node.js SDK

The official CometAPI entry point for the OpenAI-compatible API. The SDK keeps the official OpenAI JavaScript request, response, stream, and error types while defaulting the client to CometAPI.

Stable 0.1.x maintenance: Stable packages install from npm's default latest dist-tag, while prerelease artifacts use next. Exact package, dist-tag, and GitHub Release state is intentionally not pinned in this README; query the registries when that state matters. The supported API remains limited to the contract-tested 0.1 surface documented here and in COMPATIBILITY.md.

Supported 0.1 surface

The 0.1 contract is intentionally small:

  • chat.completions.create, streaming and non-streaming
  • responses.create, streaming and non-streaming
  • models.list

Other methods inherited from the official OpenAI client are not supported by CometAPI unless they are listed in COMPATIBILITY.md with contract evidence. Anthropic, Gemini, CometAPI account resources, images, video, audio, batch, fine-tuning, realtime, and browser-side use of long-lived keys are outside the 0.1 scope.

Requirements

  • Node.js 22 or 24
  • A CometAPI API key

Node.js 26 is an advisory test target until it enters LTS. Node.js 18 and 20 are not supported. The package engines range includes Node.js 22 and 24 only; passing the Node.js 26 advisory lane does not create a support claim.

Create an API key at https://www.cometapi.com/console/token. Keep it secret: do not embed it in source code, browser bundles, logs, or committed environment files. You are responsible for all usage and charges incurred with your key.

Installation

Install the stable package from npm's default latest dist-tag:

npm install cometapi

The unversioned registry page is https://www.npmjs.com/package/cometapi. Query npm and GitHub instead of using an exact version copied from repository prose:

npm view cometapi version
npm view cometapi dist-tags --json
gh release view --repo cometapi-dev/cometapi-node \
--json tagName,isDraft,isPrerelease,publishedAt,url

The release workflow is the sole source of the npm dist-tag: prerelease versions publish to next, while stable versions publish to latest. The package manifest does not declare a static dist-tag.

For source-checkout testing, retain and verify one exact tarball:

mkdir -p .artifacts
npm pack --pack-destination .artifacts
npm run test:package -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:examples -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:fixtures -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz

Install that path in a separate consumer when needed. Do not treat a locally packed artifact as proof that npm publication succeeded.

Configuration

Set the key in the environment:

export COMETAPI_KEY="your-api-key"

CometAPI uses these settings:

SettingPurposeDefault
Constructor apiKeyExplicit API keyCOMETAPI_KEY
Constructor baseURLExplicit OpenAI-compatible base URLCOMETAPI_BASE_URL, then https://api.cometapi.com/v1

Explicit constructor values take precedence over environment variables. The SDK does not add an account-management access-token contract in 0.1. Missing or blank API keys and explicitly blank base URLs throw the official OpenAI OpenAIError family. HTTP failures preserve the official APIError family and identity.

ESM quick start

import{CometAPI}from"cometapi";constclient=newCometAPI();constresponse=awaitclient.responses.create({model: "gpt-5.6-sol",input: "Explain why the sky is blue in one sentence.",});console.log(response.output_text);conststream=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Write one sentence about comets."}],stream: true,});forawait(constchunkofstream){process.stdout.write(chunk.choices[0]?.delta?.content??"");}process.stdout.write("\n");

CommonJS quick start

const{ CometAPI }=require("cometapi");constclient=newCometAPI();asyncfunctionmain(){constcompletion=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with one short greeting."}],});console.log(completion.choices[0]?.message?.content??"");constmodels=awaitclient.models.list();for(constmodelofmodels.data){console.log(model.id);}}main().catch((error)=>{console.error(error);process.exitCode=1;});

Runnable ESM and CommonJS examples are in examples/. The offline example gate executes these exact files against the packed artifact with a fail-closed mocked transport. Executing them against the live API remains a separately authorized operation.

Custom options

Because CometAPI is a thin subclass of the official OpenAI client, supported OpenAI constructor and per-request options remain available:

import{CometAPI}from"cometapi";constclient=newCometAPI({timeout: 20_000,maxRetries: 2,fetch: globalThis.fetch,});constresponse=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with OK."}],},{timeout: 5_000},);

The 0.1.x public type matches the enforced runtime boundary. The SDK owns CometAPI routing, authentication, and the Node-only secret boundary. CometAPIOptions therefore declares provider?: never, workloadIdentity?: never, and dangerouslyAllowBrowser?: never. Non-undefined values are rejected by TypeScript, including through inferred variables, spreads, and constrained generics, and runtime validation protects plain JavaScript and type-cast bypasses. The same restriction applies to inherited withOptions calls. A rejection is an official OpenAI OpenAIError and names only the forbidden field; it never includes the supplied value.

Supported options remain available, including timeout, maxRetries, fetch, fetchOptions, defaultHeaders, defaultQuery, logger, organization, project, webhookSecret, adminAPIKey, and per-request options. The client continues to derive its CometAPI API key and base URL from the documented constructor and environment settings.

Direct OpenAI client interoperability

Applications may also configure the official client directly. This is an interoperability option, not the primary CometAPI SDK experience:

importOpenAIfrom"openai";constclient=newOpenAI({apiKey: process.env.COMETAPI_KEY,baseURL: process.env.COMETAPI_BASE_URL??"https://api.cometapi.com/v1",});

Local development and verification

Run commands from this repository root:

npm ci
npm run build
npm test
npm run typecheck
npm run lint
npm run format:check
npm run test:secrets
npm run test:package
npm run test:examples
npm run test:live-contract
npm run test:fixtures
npm run test:compat
npm run check:standalone-content
npm run check:self-contained
npm run check:public-preview
npm run actionlint
npm run verify

npm run verify is the aggregate offline verification gate. Contract tests use mocked transport and require no production credential. npm run actionlint downloads and checksum-verifies the repository-pinned version when needed, then performs static workflow validation. It does not prove that a workflow ran successfully on GitHub Actions. The secret gate scans the current tracked tree plus reachable Git blobs, commit and tag messages, and historical paths without printing matched values. The self-containment gate requires a clean tracked worktree and verifies an exact materialized copy of HEAD in an empty temporary parent.

Project status

The repository is in stable 0.1.x maintenance, and no 0.2 provider-adapter milestone is active. Repository foundation, Public Preview, and Registry Alpha are complete. Stable packages use latest; Registry Alpha artifacts use next. Use the npm and GitHub queries in Installation for exact current state. Release-specific CI, live-smoke, registry, integrity, signature, provenance, and public-install evidence is retained in RELEASING.md, not restated as mutable version status here.

Mocked responses, packed artifacts, GitHub Actions, trusted live tests, and npm publication remain separate evidence layers and must not be represented as one another. Exact failed-release, immutable-artifact, and one-time recovery history is retained in RELEASING.md rather than reproduced in this consumer README. The permanent release workflow is immutable-tag-bound and publishes through npm OIDC.

See:

License

MIT. See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History
274 lines (213 loc) · 9.68 KB

File metadata and controls

274 lines (213 loc) · 9.68 KB

CometAPI TypeScript and Node.js SDK

The official CometAPI entry point for the OpenAI-compatible API. The SDK keeps the official OpenAI JavaScript request, response, stream, and error types while defaulting the client to CometAPI.

Stable 0.1.x maintenance: Stable packages install from npm's default latest dist-tag, while prerelease artifacts use next. Exact package, dist-tag, and GitHub Release state is intentionally not pinned in this README; query the registries when that state matters. The supported API remains limited to the contract-tested 0.1 surface documented here and in COMPATIBILITY.md.

Supported 0.1 surface

The 0.1 contract is intentionally small:

  • chat.completions.create, streaming and non-streaming
  • responses.create, streaming and non-streaming
  • models.list

Other methods inherited from the official OpenAI client are not supported by CometAPI unless they are listed in COMPATIBILITY.md with contract evidence. Anthropic, Gemini, CometAPI account resources, images, video, audio, batch, fine-tuning, realtime, and browser-side use of long-lived keys are outside the 0.1 scope.

Requirements

  • Node.js 22 or 24
  • A CometAPI API key

Node.js 26 is an advisory test target until it enters LTS. Node.js 18 and 20 are not supported. The package engines range includes Node.js 22 and 24 only; passing the Node.js 26 advisory lane does not create a support claim.

Create an API key at https://www.cometapi.com/console/token. Keep it secret: do not embed it in source code, browser bundles, logs, or committed environment files. You are responsible for all usage and charges incurred with your key.

Installation

Install the stable package from npm's default latest dist-tag:

npm install cometapi

The unversioned registry page is https://www.npmjs.com/package/cometapi. Query npm and GitHub instead of using an exact version copied from repository prose:

npm view cometapi version
npm view cometapi dist-tags --json
gh release view --repo cometapi-dev/cometapi-node \
--json tagName,isDraft,isPrerelease,publishedAt,url

The release workflow is the sole source of the npm dist-tag: prerelease versions publish to next, while stable versions publish to latest. The package manifest does not declare a static dist-tag.

For source-checkout testing, retain and verify one exact tarball:

mkdir -p .artifacts
npm pack --pack-destination .artifacts
npm run test:package -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:examples -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:fixtures -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz

Install that path in a separate consumer when needed. Do not treat a locally packed artifact as proof that npm publication succeeded.

Configuration

Set the key in the environment:

export COMETAPI_KEY="your-api-key"

CometAPI uses these settings:

SettingPurposeDefault
Constructor apiKeyExplicit API keyCOMETAPI_KEY
Constructor baseURLExplicit OpenAI-compatible base URLCOMETAPI_BASE_URL, then https://api.cometapi.com/v1

Explicit constructor values take precedence over environment variables. The SDK does not add an account-management access-token contract in 0.1. Missing or blank API keys and explicitly blank base URLs throw the official OpenAI OpenAIError family. HTTP failures preserve the official APIError family and identity.

ESM quick start

import{CometAPI}from"cometapi";constclient=newCometAPI();constresponse=awaitclient.responses.create({model: "gpt-5.6-sol",input: "Explain why the sky is blue in one sentence.",});console.log(response.output_text);conststream=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Write one sentence about comets."}],stream: true,});forawait(constchunkofstream){process.stdout.write(chunk.choices[0]?.delta?.content??"");}process.stdout.write("\n");

CommonJS quick start

const{ CometAPI }=require("cometapi");constclient=newCometAPI();asyncfunctionmain(){constcompletion=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with one short greeting."}],});console.log(completion.choices[0]?.message?.content??"");constmodels=awaitclient.models.list();for(constmodelofmodels.data){console.log(model.id);}}main().catch((error)=>{console.error(error);process.exitCode=1;});

Runnable ESM and CommonJS examples are in examples/. The offline example gate executes these exact files against the packed artifact with a fail-closed mocked transport. Executing them against the live API remains a separately authorized operation.

Custom options

Because CometAPI is a thin subclass of the official OpenAI client, supported OpenAI constructor and per-request options remain available:

import{CometAPI}from"cometapi";constclient=newCometAPI({timeout: 20_000,maxRetries: 2,fetch: globalThis.fetch,});constresponse=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with OK."}],},{timeout: 5_000},);

The 0.1.x public type matches the enforced runtime boundary. The SDK owns CometAPI routing, authentication, and the Node-only secret boundary. CometAPIOptions therefore declares provider?: never, workloadIdentity?: never, and dangerouslyAllowBrowser?: never. Non-undefined values are rejected by TypeScript, including through inferred variables, spreads, and constrained generics, and runtime validation protects plain JavaScript and type-cast bypasses. The same restriction applies to inherited withOptions calls. A rejection is an official OpenAI OpenAIError and names only the forbidden field; it never includes the supplied value.

Supported options remain available, including timeout, maxRetries, fetch, fetchOptions, defaultHeaders, defaultQuery, logger, organization, project, webhookSecret, adminAPIKey, and per-request options. The client continues to derive its CometAPI API key and base URL from the documented constructor and environment settings.

Direct OpenAI client interoperability

Applications may also configure the official client directly. This is an interoperability option, not the primary CometAPI SDK experience:

importOpenAIfrom"openai";constclient=newOpenAI({apiKey: process.env.COMETAPI_KEY,baseURL: process.env.COMETAPI_BASE_URL??"https://api.cometapi.com/v1",});

Local development and verification

Run commands from this repository root:

npm ci
npm run build
npm test
npm run typecheck
npm run lint
npm run format:check
npm run test:secrets
npm run test:package
npm run test:examples
npm run test:live-contract
npm run test:fixtures
npm run test:compat
npm run check:standalone-content
npm run check:self-contained
npm run check:public-preview
npm run actionlint
npm run verify

npm run verify is the aggregate offline verification gate. Contract tests use mocked transport and require no production credential. npm run actionlint downloads and checksum-verifies the repository-pinned version when needed, then performs static workflow validation. It does not prove that a workflow ran successfully on GitHub Actions. The secret gate scans the current tracked tree plus reachable Git blobs, commit and tag messages, and historical paths without printing matched values. The self-containment gate requires a clean tracked worktree and verifies an exact materialized copy of HEAD in an empty temporary parent.

Project status

The repository is in stable 0.1.x maintenance, and no 0.2 provider-adapter milestone is active. Repository foundation, Public Preview, and Registry Alpha are complete. Stable packages use latest; Registry Alpha artifacts use next. Use the npm and GitHub queries in Installation for exact current state. Release-specific CI, live-smoke, registry, integrity, signature, provenance, and public-install evidence is retained in RELEASING.md, not restated as mutable version status here.

Mocked responses, packed artifacts, GitHub Actions, trusted live tests, and npm publication remain separate evidence layers and must not be represented as one another. Exact failed-release, immutable-artifact, and one-time recovery history is retained in RELEASING.md rather than reproduced in this consumer README. The permanent release workflow is immutable-tag-bound and publishes through npm OIDC.

See:

License

MIT. See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
274 lines (213 loc) · 9.68 KB

File metadata and controls

274 lines (213 loc) · 9.68 KB

CometAPI TypeScript and Node.js SDK

The official CometAPI entry point for the OpenAI-compatible API. The SDK keeps the official OpenAI JavaScript request, response, stream, and error types while defaulting the client to CometAPI.

Stable 0.1.x maintenance: Stable packages install from npm's default latest dist-tag, while prerelease artifacts use next. Exact package, dist-tag, and GitHub Release state is intentionally not pinned in this README; query the registries when that state matters. The supported API remains limited to the contract-tested 0.1 surface documented here and in COMPATIBILITY.md.

Supported 0.1 surface

The 0.1 contract is intentionally small:

  • chat.completions.create, streaming and non-streaming
  • responses.create, streaming and non-streaming
  • models.list

Other methods inherited from the official OpenAI client are not supported by CometAPI unless they are listed in COMPATIBILITY.md with contract evidence. Anthropic, Gemini, CometAPI account resources, images, video, audio, batch, fine-tuning, realtime, and browser-side use of long-lived keys are outside the 0.1 scope.

Requirements

  • Node.js 22 or 24
  • A CometAPI API key

Node.js 26 is an advisory test target until it enters LTS. Node.js 18 and 20 are not supported. The package engines range includes Node.js 22 and 24 only; passing the Node.js 26 advisory lane does not create a support claim.

Create an API key at https://www.cometapi.com/console/token. Keep it secret: do not embed it in source code, browser bundles, logs, or committed environment files. You are responsible for all usage and charges incurred with your key.

Installation

Install the stable package from npm's default latest dist-tag:

npm install cometapi

The unversioned registry page is https://www.npmjs.com/package/cometapi. Query npm and GitHub instead of using an exact version copied from repository prose:

npm view cometapi version
npm view cometapi dist-tags --json
gh release view --repo cometapi-dev/cometapi-node \
--json tagName,isDraft,isPrerelease,publishedAt,url

The release workflow is the sole source of the npm dist-tag: prerelease versions publish to next, while stable versions publish to latest. The package manifest does not declare a static dist-tag.

For source-checkout testing, retain and verify one exact tarball:

mkdir -p .artifacts
npm pack --pack-destination .artifacts
npm run test:package -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:examples -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:fixtures -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz

Install that path in a separate consumer when needed. Do not treat a locally packed artifact as proof that npm publication succeeded.

Configuration

Set the key in the environment:

export COMETAPI_KEY="your-api-key"

CometAPI uses these settings:

SettingPurposeDefault
Constructor apiKeyExplicit API keyCOMETAPI_KEY
Constructor baseURLExplicit OpenAI-compatible base URLCOMETAPI_BASE_URL, then https://api.cometapi.com/v1

Explicit constructor values take precedence over environment variables. The SDK does not add an account-management access-token contract in 0.1. Missing or blank API keys and explicitly blank base URLs throw the official OpenAI OpenAIError family. HTTP failures preserve the official APIError family and identity.

ESM quick start

import{CometAPI}from"cometapi";constclient=newCometAPI();constresponse=awaitclient.responses.create({model: "gpt-5.6-sol",input: "Explain why the sky is blue in one sentence.",});console.log(response.output_text);conststream=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Write one sentence about comets."}],stream: true,});forawait(constchunkofstream){process.stdout.write(chunk.choices[0]?.delta?.content??"");}process.stdout.write("\n");

CommonJS quick start

const{ CometAPI }=require("cometapi");constclient=newCometAPI();asyncfunctionmain(){constcompletion=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with one short greeting."}],});console.log(completion.choices[0]?.message?.content??"");constmodels=awaitclient.models.list();for(constmodelofmodels.data){console.log(model.id);}}main().catch((error)=>{console.error(error);process.exitCode=1;});

Runnable ESM and CommonJS examples are in examples/. The offline example gate executes these exact files against the packed artifact with a fail-closed mocked transport. Executing them against the live API remains a separately authorized operation.

Custom options

Because CometAPI is a thin subclass of the official OpenAI client, supported OpenAI constructor and per-request options remain available:

import{CometAPI}from"cometapi";constclient=newCometAPI({timeout: 20_000,maxRetries: 2,fetch: globalThis.fetch,});constresponse=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with OK."}],},{timeout: 5_000},);

The 0.1.x public type matches the enforced runtime boundary. The SDK owns CometAPI routing, authentication, and the Node-only secret boundary. CometAPIOptions therefore declares provider?: never, workloadIdentity?: never, and dangerouslyAllowBrowser?: never. Non-undefined values are rejected by TypeScript, including through inferred variables, spreads, and constrained generics, and runtime validation protects plain JavaScript and type-cast bypasses. The same restriction applies to inherited withOptions calls. A rejection is an official OpenAI OpenAIError and names only the forbidden field; it never includes the supplied value.

Supported options remain available, including timeout, maxRetries, fetch, fetchOptions, defaultHeaders, defaultQuery, logger, organization, project, webhookSecret, adminAPIKey, and per-request options. The client continues to derive its CometAPI API key and base URL from the documented constructor and environment settings.

Direct OpenAI client interoperability

Applications may also configure the official client directly. This is an interoperability option, not the primary CometAPI SDK experience:

importOpenAIfrom"openai";constclient=newOpenAI({apiKey: process.env.COMETAPI_KEY,baseURL: process.env.COMETAPI_BASE_URL??"https://api.cometapi.com/v1",});

Local development and verification

Run commands from this repository root:

npm ci
npm run build
npm test
npm run typecheck
npm run lint
npm run format:check
npm run test:secrets
npm run test:package
npm run test:examples
npm run test:live-contract
npm run test:fixtures
npm run test:compat
npm run check:standalone-content
npm run check:self-contained
npm run check:public-preview
npm run actionlint
npm run verify

npm run verify is the aggregate offline verification gate. Contract tests use mocked transport and require no production credential. npm run actionlint downloads and checksum-verifies the repository-pinned version when needed, then performs static workflow validation. It does not prove that a workflow ran successfully on GitHub Actions. The secret gate scans the current tracked tree plus reachable Git blobs, commit and tag messages, and historical paths without printing matched values. The self-containment gate requires a clean tracked worktree and verifies an exact materialized copy of HEAD in an empty temporary parent.

Project status

The repository is in stable 0.1.x maintenance, and no 0.2 provider-adapter milestone is active. Repository foundation, Public Preview, and Registry Alpha are complete. Stable packages use latest; Registry Alpha artifacts use next. Use the npm and GitHub queries in Installation for exact current state. Release-specific CI, live-smoke, registry, integrity, signature, provenance, and public-install evidence is retained in RELEASING.md, not restated as mutable version status here.

Mocked responses, packed artifacts, GitHub Actions, trusted live tests, and npm publication remain separate evidence layers and must not be represented as one another. Exact failed-release, immutable-artifact, and one-time recovery history is retained in RELEASING.md rather than reproduced in this consumer README. The permanent release workflow is immutable-tag-bound and publishes through npm OIDC.

See:

License

MIT. See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
274 lines (213 loc) · 9.68 KB

File metadata and controls

274 lines (213 loc) · 9.68 KB

CometAPI TypeScript and Node.js SDK

The official CometAPI entry point for the OpenAI-compatible API. The SDK keeps the official OpenAI JavaScript request, response, stream, and error types while defaulting the client to CometAPI.

Stable 0.1.x maintenance: Stable packages install from npm's default latest dist-tag, while prerelease artifacts use next. Exact package, dist-tag, and GitHub Release state is intentionally not pinned in this README; query the registries when that state matters. The supported API remains limited to the contract-tested 0.1 surface documented here and in COMPATIBILITY.md.

Supported 0.1 surface

The 0.1 contract is intentionally small:

  • chat.completions.create, streaming and non-streaming
  • responses.create, streaming and non-streaming
  • models.list

Other methods inherited from the official OpenAI client are not supported by CometAPI unless they are listed in COMPATIBILITY.md with contract evidence. Anthropic, Gemini, CometAPI account resources, images, video, audio, batch, fine-tuning, realtime, and browser-side use of long-lived keys are outside the 0.1 scope.

Requirements

  • Node.js 22 or 24
  • A CometAPI API key

Node.js 26 is an advisory test target until it enters LTS. Node.js 18 and 20 are not supported. The package engines range includes Node.js 22 and 24 only; passing the Node.js 26 advisory lane does not create a support claim.

Create an API key at https://www.cometapi.com/console/token. Keep it secret: do not embed it in source code, browser bundles, logs, or committed environment files. You are responsible for all usage and charges incurred with your key.

Installation

Install the stable package from npm's default latest dist-tag:

npm install cometapi

The unversioned registry page is https://www.npmjs.com/package/cometapi. Query npm and GitHub instead of using an exact version copied from repository prose:

npm view cometapi version
npm view cometapi dist-tags --json
gh release view --repo cometapi-dev/cometapi-node \
--json tagName,isDraft,isPrerelease,publishedAt,url

The release workflow is the sole source of the npm dist-tag: prerelease versions publish to next, while stable versions publish to latest. The package manifest does not declare a static dist-tag.

For source-checkout testing, retain and verify one exact tarball:

mkdir -p .artifacts
npm pack --pack-destination .artifacts
npm run test:package -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:examples -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:fixtures -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz

Install that path in a separate consumer when needed. Do not treat a locally packed artifact as proof that npm publication succeeded.

Configuration

Set the key in the environment:

export COMETAPI_KEY="your-api-key"

CometAPI uses these settings:

SettingPurposeDefault
Constructor apiKeyExplicit API keyCOMETAPI_KEY
Constructor baseURLExplicit OpenAI-compatible base URLCOMETAPI_BASE_URL, then https://api.cometapi.com/v1

Explicit constructor values take precedence over environment variables. The SDK does not add an account-management access-token contract in 0.1. Missing or blank API keys and explicitly blank base URLs throw the official OpenAI OpenAIError family. HTTP failures preserve the official APIError family and identity.

ESM quick start

import{CometAPI}from"cometapi";constclient=newCometAPI();constresponse=awaitclient.responses.create({model: "gpt-5.6-sol",input: "Explain why the sky is blue in one sentence.",});console.log(response.output_text);conststream=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Write one sentence about comets."}],stream: true,});forawait(constchunkofstream){process.stdout.write(chunk.choices[0]?.delta?.content??"");}process.stdout.write("\n");

CommonJS quick start

const{ CometAPI }=require("cometapi");constclient=newCometAPI();asyncfunctionmain(){constcompletion=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with one short greeting."}],});console.log(completion.choices[0]?.message?.content??"");constmodels=awaitclient.models.list();for(constmodelofmodels.data){console.log(model.id);}}main().catch((error)=>{console.error(error);process.exitCode=1;});

Runnable ESM and CommonJS examples are in examples/. The offline example gate executes these exact files against the packed artifact with a fail-closed mocked transport. Executing them against the live API remains a separately authorized operation.

Custom options

Because CometAPI is a thin subclass of the official OpenAI client, supported OpenAI constructor and per-request options remain available:

import{CometAPI}from"cometapi";constclient=newCometAPI({timeout: 20_000,maxRetries: 2,fetch: globalThis.fetch,});constresponse=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with OK."}],},{timeout: 5_000},);

The 0.1.x public type matches the enforced runtime boundary. The SDK owns CometAPI routing, authentication, and the Node-only secret boundary. CometAPIOptions therefore declares provider?: never, workloadIdentity?: never, and dangerouslyAllowBrowser?: never. Non-undefined values are rejected by TypeScript, including through inferred variables, spreads, and constrained generics, and runtime validation protects plain JavaScript and type-cast bypasses. The same restriction applies to inherited withOptions calls. A rejection is an official OpenAI OpenAIError and names only the forbidden field; it never includes the supplied value.

Supported options remain available, including timeout, maxRetries, fetch, fetchOptions, defaultHeaders, defaultQuery, logger, organization, project, webhookSecret, adminAPIKey, and per-request options. The client continues to derive its CometAPI API key and base URL from the documented constructor and environment settings.

Direct OpenAI client interoperability

Applications may also configure the official client directly. This is an interoperability option, not the primary CometAPI SDK experience:

importOpenAIfrom"openai";constclient=newOpenAI({apiKey: process.env.COMETAPI_KEY,baseURL: process.env.COMETAPI_BASE_URL??"https://api.cometapi.com/v1",});

Local development and verification

Run commands from this repository root:

npm ci
npm run build
npm test
npm run typecheck
npm run lint
npm run format:check
npm run test:secrets
npm run test:package
npm run test:examples
npm run test:live-contract
npm run test:fixtures
npm run test:compat
npm run check:standalone-content
npm run check:self-contained
npm run check:public-preview
npm run actionlint
npm run verify

npm run verify is the aggregate offline verification gate. Contract tests use mocked transport and require no production credential. npm run actionlint downloads and checksum-verifies the repository-pinned version when needed, then performs static workflow validation. It does not prove that a workflow ran successfully on GitHub Actions. The secret gate scans the current tracked tree plus reachable Git blobs, commit and tag messages, and historical paths without printing matched values. The self-containment gate requires a clean tracked worktree and verifies an exact materialized copy of HEAD in an empty temporary parent.

Project status

The repository is in stable 0.1.x maintenance, and no 0.2 provider-adapter milestone is active. Repository foundation, Public Preview, and Registry Alpha are complete. Stable packages use latest; Registry Alpha artifacts use next. Use the npm and GitHub queries in Installation for exact current state. Release-specific CI, live-smoke, registry, integrity, signature, provenance, and public-install evidence is retained in RELEASING.md, not restated as mutable version status here.

Mocked responses, packed artifacts, GitHub Actions, trusted live tests, and npm publication remain separate evidence layers and must not be represented as one another. Exact failed-release, immutable-artifact, and one-time recovery history is retained in RELEASING.md rather than reproduced in this consumer README. The permanent release workflow is immutable-tag-bound and publishes through npm OIDC.

See:

License

MIT. See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History
274 lines (213 loc) · 9.68 KB

File metadata and controls

274 lines (213 loc) · 9.68 KB

CometAPI TypeScript and Node.js SDK

The official CometAPI entry point for the OpenAI-compatible API. The SDK keeps the official OpenAI JavaScript request, response, stream, and error types while defaulting the client to CometAPI.

Stable 0.1.x maintenance: Stable packages install from npm's default latest dist-tag, while prerelease artifacts use next. Exact package, dist-tag, and GitHub Release state is intentionally not pinned in this README; query the registries when that state matters. The supported API remains limited to the contract-tested 0.1 surface documented here and in COMPATIBILITY.md.

Supported 0.1 surface

The 0.1 contract is intentionally small:

  • chat.completions.create, streaming and non-streaming
  • responses.create, streaming and non-streaming
  • models.list

Other methods inherited from the official OpenAI client are not supported by CometAPI unless they are listed in COMPATIBILITY.md with contract evidence. Anthropic, Gemini, CometAPI account resources, images, video, audio, batch, fine-tuning, realtime, and browser-side use of long-lived keys are outside the 0.1 scope.

Requirements

  • Node.js 22 or 24
  • A CometAPI API key

Node.js 26 is an advisory test target until it enters LTS. Node.js 18 and 20 are not supported. The package engines range includes Node.js 22 and 24 only; passing the Node.js 26 advisory lane does not create a support claim.

Create an API key at https://www.cometapi.com/console/token. Keep it secret: do not embed it in source code, browser bundles, logs, or committed environment files. You are responsible for all usage and charges incurred with your key.

Installation

Install the stable package from npm's default latest dist-tag:

npm install cometapi

The unversioned registry page is https://www.npmjs.com/package/cometapi. Query npm and GitHub instead of using an exact version copied from repository prose:

npm view cometapi version
npm view cometapi dist-tags --json
gh release view --repo cometapi-dev/cometapi-node \
--json tagName,isDraft,isPrerelease,publishedAt,url

The release workflow is the sole source of the npm dist-tag: prerelease versions publish to next, while stable versions publish to latest. The package manifest does not declare a static dist-tag.

For source-checkout testing, retain and verify one exact tarball:

mkdir -p .artifacts
npm pack --pack-destination .artifacts
npm run test:package -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:examples -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:fixtures -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz

Install that path in a separate consumer when needed. Do not treat a locally packed artifact as proof that npm publication succeeded.

Configuration

Set the key in the environment:

export COMETAPI_KEY="your-api-key"

CometAPI uses these settings:

SettingPurposeDefault
Constructor apiKeyExplicit API keyCOMETAPI_KEY
Constructor baseURLExplicit OpenAI-compatible base URLCOMETAPI_BASE_URL, then https://api.cometapi.com/v1

Explicit constructor values take precedence over environment variables. The SDK does not add an account-management access-token contract in 0.1. Missing or blank API keys and explicitly blank base URLs throw the official OpenAI OpenAIError family. HTTP failures preserve the official APIError family and identity.

ESM quick start

import{CometAPI}from"cometapi";constclient=newCometAPI();constresponse=awaitclient.responses.create({model: "gpt-5.6-sol",input: "Explain why the sky is blue in one sentence.",});console.log(response.output_text);conststream=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Write one sentence about comets."}],stream: true,});forawait(constchunkofstream){process.stdout.write(chunk.choices[0]?.delta?.content??"");}process.stdout.write("\n");

CommonJS quick start

const{ CometAPI }=require("cometapi");constclient=newCometAPI();asyncfunctionmain(){constcompletion=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with one short greeting."}],});console.log(completion.choices[0]?.message?.content??"");constmodels=awaitclient.models.list();for(constmodelofmodels.data){console.log(model.id);}}main().catch((error)=>{console.error(error);process.exitCode=1;});

Runnable ESM and CommonJS examples are in examples/. The offline example gate executes these exact files against the packed artifact with a fail-closed mocked transport. Executing them against the live API remains a separately authorized operation.

Custom options

Because CometAPI is a thin subclass of the official OpenAI client, supported OpenAI constructor and per-request options remain available:

import{CometAPI}from"cometapi";constclient=newCometAPI({timeout: 20_000,maxRetries: 2,fetch: globalThis.fetch,});constresponse=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with OK."}],},{timeout: 5_000},);

The 0.1.x public type matches the enforced runtime boundary. The SDK owns CometAPI routing, authentication, and the Node-only secret boundary. CometAPIOptions therefore declares provider?: never, workloadIdentity?: never, and dangerouslyAllowBrowser?: never. Non-undefined values are rejected by TypeScript, including through inferred variables, spreads, and constrained generics, and runtime validation protects plain JavaScript and type-cast bypasses. The same restriction applies to inherited withOptions calls. A rejection is an official OpenAI OpenAIError and names only the forbidden field; it never includes the supplied value.

Supported options remain available, including timeout, maxRetries, fetch, fetchOptions, defaultHeaders, defaultQuery, logger, organization, project, webhookSecret, adminAPIKey, and per-request options. The client continues to derive its CometAPI API key and base URL from the documented constructor and environment settings.

Direct OpenAI client interoperability

Applications may also configure the official client directly. This is an interoperability option, not the primary CometAPI SDK experience:

importOpenAIfrom"openai";constclient=newOpenAI({apiKey: process.env.COMETAPI_KEY,baseURL: process.env.COMETAPI_BASE_URL??"https://api.cometapi.com/v1",});

Local development and verification

Run commands from this repository root:

npm ci
npm run build
npm test
npm run typecheck
npm run lint
npm run format:check
npm run test:secrets
npm run test:package
npm run test:examples
npm run test:live-contract
npm run test:fixtures
npm run test:compat
npm run check:standalone-content
npm run check:self-contained
npm run check:public-preview
npm run actionlint
npm run verify

npm run verify is the aggregate offline verification gate. Contract tests use mocked transport and require no production credential. npm run actionlint downloads and checksum-verifies the repository-pinned version when needed, then performs static workflow validation. It does not prove that a workflow ran successfully on GitHub Actions. The secret gate scans the current tracked tree plus reachable Git blobs, commit and tag messages, and historical paths without printing matched values. The self-containment gate requires a clean tracked worktree and verifies an exact materialized copy of HEAD in an empty temporary parent.

Project status

The repository is in stable 0.1.x maintenance, and no 0.2 provider-adapter milestone is active. Repository foundation, Public Preview, and Registry Alpha are complete. Stable packages use latest; Registry Alpha artifacts use next. Use the npm and GitHub queries in Installation for exact current state. Release-specific CI, live-smoke, registry, integrity, signature, provenance, and public-install evidence is retained in RELEASING.md, not restated as mutable version status here.

Mocked responses, packed artifacts, GitHub Actions, trusted live tests, and npm publication remain separate evidence layers and must not be represented as one another. Exact failed-release, immutable-artifact, and one-time recovery history is retained in RELEASING.md rather than reproduced in this consumer README. The permanent release workflow is immutable-tag-bound and publishes through npm OIDC.

See:

License

MIT. See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
274 lines (213 loc) · 9.68 KB

File metadata and controls

274 lines (213 loc) · 9.68 KB

CometAPI TypeScript and Node.js SDK

The official CometAPI entry point for the OpenAI-compatible API. The SDK keeps the official OpenAI JavaScript request, response, stream, and error types while defaulting the client to CometAPI.

Stable 0.1.x maintenance: Stable packages install from npm's default latest dist-tag, while prerelease artifacts use next. Exact package, dist-tag, and GitHub Release state is intentionally not pinned in this README; query the registries when that state matters. The supported API remains limited to the contract-tested 0.1 surface documented here and in COMPATIBILITY.md.

Supported 0.1 surface

The 0.1 contract is intentionally small:

  • chat.completions.create, streaming and non-streaming
  • responses.create, streaming and non-streaming
  • models.list

Other methods inherited from the official OpenAI client are not supported by CometAPI unless they are listed in COMPATIBILITY.md with contract evidence. Anthropic, Gemini, CometAPI account resources, images, video, audio, batch, fine-tuning, realtime, and browser-side use of long-lived keys are outside the 0.1 scope.

Requirements

  • Node.js 22 or 24
  • A CometAPI API key

Node.js 26 is an advisory test target until it enters LTS. Node.js 18 and 20 are not supported. The package engines range includes Node.js 22 and 24 only; passing the Node.js 26 advisory lane does not create a support claim.

Create an API key at https://www.cometapi.com/console/token. Keep it secret: do not embed it in source code, browser bundles, logs, or committed environment files. You are responsible for all usage and charges incurred with your key.

Installation

Install the stable package from npm's default latest dist-tag:

npm install cometapi

The unversioned registry page is https://www.npmjs.com/package/cometapi. Query npm and GitHub instead of using an exact version copied from repository prose:

npm view cometapi version
npm view cometapi dist-tags --json
gh release view --repo cometapi-dev/cometapi-node \
--json tagName,isDraft,isPrerelease,publishedAt,url

The release workflow is the sole source of the npm dist-tag: prerelease versions publish to next, while stable versions publish to latest. The package manifest does not declare a static dist-tag.

For source-checkout testing, retain and verify one exact tarball:

mkdir -p .artifacts
npm pack --pack-destination .artifacts
npm run test:package -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:examples -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:fixtures -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz

Install that path in a separate consumer when needed. Do not treat a locally packed artifact as proof that npm publication succeeded.

Configuration

Set the key in the environment:

export COMETAPI_KEY="your-api-key"

CometAPI uses these settings:

SettingPurposeDefault
Constructor apiKeyExplicit API keyCOMETAPI_KEY
Constructor baseURLExplicit OpenAI-compatible base URLCOMETAPI_BASE_URL, then https://api.cometapi.com/v1

Explicit constructor values take precedence over environment variables. The SDK does not add an account-management access-token contract in 0.1. Missing or blank API keys and explicitly blank base URLs throw the official OpenAI OpenAIError family. HTTP failures preserve the official APIError family and identity.

ESM quick start

import{CometAPI}from"cometapi";constclient=newCometAPI();constresponse=awaitclient.responses.create({model: "gpt-5.6-sol",input: "Explain why the sky is blue in one sentence.",});console.log(response.output_text);conststream=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Write one sentence about comets."}],stream: true,});forawait(constchunkofstream){process.stdout.write(chunk.choices[0]?.delta?.content??"");}process.stdout.write("\n");

CommonJS quick start

const{ CometAPI }=require("cometapi");constclient=newCometAPI();asyncfunctionmain(){constcompletion=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with one short greeting."}],});console.log(completion.choices[0]?.message?.content??"");constmodels=awaitclient.models.list();for(constmodelofmodels.data){console.log(model.id);}}main().catch((error)=>{console.error(error);process.exitCode=1;});

Runnable ESM and CommonJS examples are in examples/. The offline example gate executes these exact files against the packed artifact with a fail-closed mocked transport. Executing them against the live API remains a separately authorized operation.

Custom options

Because CometAPI is a thin subclass of the official OpenAI client, supported OpenAI constructor and per-request options remain available:

import{CometAPI}from"cometapi";constclient=newCometAPI({timeout: 20_000,maxRetries: 2,fetch: globalThis.fetch,});constresponse=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with OK."}],},{timeout: 5_000},);

The 0.1.x public type matches the enforced runtime boundary. The SDK owns CometAPI routing, authentication, and the Node-only secret boundary. CometAPIOptions therefore declares provider?: never, workloadIdentity?: never, and dangerouslyAllowBrowser?: never. Non-undefined values are rejected by TypeScript, including through inferred variables, spreads, and constrained generics, and runtime validation protects plain JavaScript and type-cast bypasses. The same restriction applies to inherited withOptions calls. A rejection is an official OpenAI OpenAIError and names only the forbidden field; it never includes the supplied value.

Supported options remain available, including timeout, maxRetries, fetch, fetchOptions, defaultHeaders, defaultQuery, logger, organization, project, webhookSecret, adminAPIKey, and per-request options. The client continues to derive its CometAPI API key and base URL from the documented constructor and environment settings.

Direct OpenAI client interoperability

Applications may also configure the official client directly. This is an interoperability option, not the primary CometAPI SDK experience:

importOpenAIfrom"openai";constclient=newOpenAI({apiKey: process.env.COMETAPI_KEY,baseURL: process.env.COMETAPI_BASE_URL??"https://api.cometapi.com/v1",});

Local development and verification

Run commands from this repository root:

npm ci
npm run build
npm test
npm run typecheck
npm run lint
npm run format:check
npm run test:secrets
npm run test:package
npm run test:examples
npm run test:live-contract
npm run test:fixtures
npm run test:compat
npm run check:standalone-content
npm run check:self-contained
npm run check:public-preview
npm run actionlint
npm run verify

npm run verify is the aggregate offline verification gate. Contract tests use mocked transport and require no production credential. npm run actionlint downloads and checksum-verifies the repository-pinned version when needed, then performs static workflow validation. It does not prove that a workflow ran successfully on GitHub Actions. The secret gate scans the current tracked tree plus reachable Git blobs, commit and tag messages, and historical paths without printing matched values. The self-containment gate requires a clean tracked worktree and verifies an exact materialized copy of HEAD in an empty temporary parent.

Project status

The repository is in stable 0.1.x maintenance, and no 0.2 provider-adapter milestone is active. Repository foundation, Public Preview, and Registry Alpha are complete. Stable packages use latest; Registry Alpha artifacts use next. Use the npm and GitHub queries in Installation for exact current state. Release-specific CI, live-smoke, registry, integrity, signature, provenance, and public-install evidence is retained in RELEASING.md, not restated as mutable version status here.

Mocked responses, packed artifacts, GitHub Actions, trusted live tests, and npm publication remain separate evidence layers and must not be represented as one another. Exact failed-release, immutable-artifact, and one-time recovery history is retained in RELEASING.md rather than reproduced in this consumer README. The permanent release workflow is immutable-tag-bound and publishes through npm OIDC.

See:

License

MIT. See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
274 lines (213 loc) · 9.68 KB

File metadata and controls

274 lines (213 loc) · 9.68 KB

CometAPI TypeScript and Node.js SDK

The official CometAPI entry point for the OpenAI-compatible API. The SDK keeps the official OpenAI JavaScript request, response, stream, and error types while defaulting the client to CometAPI.

Stable 0.1.x maintenance: Stable packages install from npm's default latest dist-tag, while prerelease artifacts use next. Exact package, dist-tag, and GitHub Release state is intentionally not pinned in this README; query the registries when that state matters. The supported API remains limited to the contract-tested 0.1 surface documented here and in COMPATIBILITY.md.

Supported 0.1 surface

The 0.1 contract is intentionally small:

  • chat.completions.create, streaming and non-streaming
  • responses.create, streaming and non-streaming
  • models.list

Other methods inherited from the official OpenAI client are not supported by CometAPI unless they are listed in COMPATIBILITY.md with contract evidence. Anthropic, Gemini, CometAPI account resources, images, video, audio, batch, fine-tuning, realtime, and browser-side use of long-lived keys are outside the 0.1 scope.

Requirements

  • Node.js 22 or 24
  • A CometAPI API key

Node.js 26 is an advisory test target until it enters LTS. Node.js 18 and 20 are not supported. The package engines range includes Node.js 22 and 24 only; passing the Node.js 26 advisory lane does not create a support claim.

Create an API key at https://www.cometapi.com/console/token. Keep it secret: do not embed it in source code, browser bundles, logs, or committed environment files. You are responsible for all usage and charges incurred with your key.

Installation

Install the stable package from npm's default latest dist-tag:

npm install cometapi

The unversioned registry page is https://www.npmjs.com/package/cometapi. Query npm and GitHub instead of using an exact version copied from repository prose:

npm view cometapi version
npm view cometapi dist-tags --json
gh release view --repo cometapi-dev/cometapi-node \
--json tagName,isDraft,isPrerelease,publishedAt,url

The release workflow is the sole source of the npm dist-tag: prerelease versions publish to next, while stable versions publish to latest. The package manifest does not declare a static dist-tag.

For source-checkout testing, retain and verify one exact tarball:

mkdir -p .artifacts
npm pack --pack-destination .artifacts
npm run test:package -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:examples -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:fixtures -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz

Install that path in a separate consumer when needed. Do not treat a locally packed artifact as proof that npm publication succeeded.

Configuration

Set the key in the environment:

export COMETAPI_KEY="your-api-key"

CometAPI uses these settings:

SettingPurposeDefault
Constructor apiKeyExplicit API keyCOMETAPI_KEY
Constructor baseURLExplicit OpenAI-compatible base URLCOMETAPI_BASE_URL, then https://api.cometapi.com/v1

Explicit constructor values take precedence over environment variables. The SDK does not add an account-management access-token contract in 0.1. Missing or blank API keys and explicitly blank base URLs throw the official OpenAI OpenAIError family. HTTP failures preserve the official APIError family and identity.

ESM quick start

import{CometAPI}from"cometapi";constclient=newCometAPI();constresponse=awaitclient.responses.create({model: "gpt-5.6-sol",input: "Explain why the sky is blue in one sentence.",});console.log(response.output_text);conststream=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Write one sentence about comets."}],stream: true,});forawait(constchunkofstream){process.stdout.write(chunk.choices[0]?.delta?.content??"");}process.stdout.write("\n");

CommonJS quick start

const{ CometAPI }=require("cometapi");constclient=newCometAPI();asyncfunctionmain(){constcompletion=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with one short greeting."}],});console.log(completion.choices[0]?.message?.content??"");constmodels=awaitclient.models.list();for(constmodelofmodels.data){console.log(model.id);}}main().catch((error)=>{console.error(error);process.exitCode=1;});

Runnable ESM and CommonJS examples are in examples/. The offline example gate executes these exact files against the packed artifact with a fail-closed mocked transport. Executing them against the live API remains a separately authorized operation.

Custom options

Because CometAPI is a thin subclass of the official OpenAI client, supported OpenAI constructor and per-request options remain available:

import{CometAPI}from"cometapi";constclient=newCometAPI({timeout: 20_000,maxRetries: 2,fetch: globalThis.fetch,});constresponse=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with OK."}],},{timeout: 5_000},);

The 0.1.x public type matches the enforced runtime boundary. The SDK owns CometAPI routing, authentication, and the Node-only secret boundary. CometAPIOptions therefore declares provider?: never, workloadIdentity?: never, and dangerouslyAllowBrowser?: never. Non-undefined values are rejected by TypeScript, including through inferred variables, spreads, and constrained generics, and runtime validation protects plain JavaScript and type-cast bypasses. The same restriction applies to inherited withOptions calls. A rejection is an official OpenAI OpenAIError and names only the forbidden field; it never includes the supplied value.

Supported options remain available, including timeout, maxRetries, fetch, fetchOptions, defaultHeaders, defaultQuery, logger, organization, project, webhookSecret, adminAPIKey, and per-request options. The client continues to derive its CometAPI API key and base URL from the documented constructor and environment settings.

Direct OpenAI client interoperability

Applications may also configure the official client directly. This is an interoperability option, not the primary CometAPI SDK experience:

importOpenAIfrom"openai";constclient=newOpenAI({apiKey: process.env.COMETAPI_KEY,baseURL: process.env.COMETAPI_BASE_URL??"https://api.cometapi.com/v1",});

Local development and verification

Run commands from this repository root:

npm ci
npm run build
npm test
npm run typecheck
npm run lint
npm run format:check
npm run test:secrets
npm run test:package
npm run test:examples
npm run test:live-contract
npm run test:fixtures
npm run test:compat
npm run check:standalone-content
npm run check:self-contained
npm run check:public-preview
npm run actionlint
npm run verify

npm run verify is the aggregate offline verification gate. Contract tests use mocked transport and require no production credential. npm run actionlint downloads and checksum-verifies the repository-pinned version when needed, then performs static workflow validation. It does not prove that a workflow ran successfully on GitHub Actions. The secret gate scans the current tracked tree plus reachable Git blobs, commit and tag messages, and historical paths without printing matched values. The self-containment gate requires a clean tracked worktree and verifies an exact materialized copy of HEAD in an empty temporary parent.

Project status

The repository is in stable 0.1.x maintenance, and no 0.2 provider-adapter milestone is active. Repository foundation, Public Preview, and Registry Alpha are complete. Stable packages use latest; Registry Alpha artifacts use next. Use the npm and GitHub queries in Installation for exact current state. Release-specific CI, live-smoke, registry, integrity, signature, provenance, and public-install evidence is retained in RELEASING.md, not restated as mutable version status here.

Mocked responses, packed artifacts, GitHub Actions, trusted live tests, and npm publication remain separate evidence layers and must not be represented as one another. Exact failed-release, immutable-artifact, and one-time recovery history is retained in RELEASING.md rather than reproduced in this consumer README. The permanent release workflow is immutable-tag-bound and publishes through npm OIDC.

See:

License

MIT. See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History
274 lines (213 loc) · 9.68 KB

File metadata and controls

274 lines (213 loc) · 9.68 KB

CometAPI TypeScript and Node.js SDK

The official CometAPI entry point for the OpenAI-compatible API. The SDK keeps the official OpenAI JavaScript request, response, stream, and error types while defaulting the client to CometAPI.

Stable 0.1.x maintenance: Stable packages install from npm's default latest dist-tag, while prerelease artifacts use next. Exact package, dist-tag, and GitHub Release state is intentionally not pinned in this README; query the registries when that state matters. The supported API remains limited to the contract-tested 0.1 surface documented here and in COMPATIBILITY.md.

Supported 0.1 surface

The 0.1 contract is intentionally small:

  • chat.completions.create, streaming and non-streaming
  • responses.create, streaming and non-streaming
  • models.list

Other methods inherited from the official OpenAI client are not supported by CometAPI unless they are listed in COMPATIBILITY.md with contract evidence. Anthropic, Gemini, CometAPI account resources, images, video, audio, batch, fine-tuning, realtime, and browser-side use of long-lived keys are outside the 0.1 scope.

Requirements

  • Node.js 22 or 24
  • A CometAPI API key

Node.js 26 is an advisory test target until it enters LTS. Node.js 18 and 20 are not supported. The package engines range includes Node.js 22 and 24 only; passing the Node.js 26 advisory lane does not create a support claim.

Create an API key at https://www.cometapi.com/console/token. Keep it secret: do not embed it in source code, browser bundles, logs, or committed environment files. You are responsible for all usage and charges incurred with your key.

Installation

Install the stable package from npm's default latest dist-tag:

npm install cometapi

The unversioned registry page is https://www.npmjs.com/package/cometapi. Query npm and GitHub instead of using an exact version copied from repository prose:

npm view cometapi version
npm view cometapi dist-tags --json
gh release view --repo cometapi-dev/cometapi-node \
--json tagName,isDraft,isPrerelease,publishedAt,url

The release workflow is the sole source of the npm dist-tag: prerelease versions publish to next, while stable versions publish to latest. The package manifest does not declare a static dist-tag.

For source-checkout testing, retain and verify one exact tarball:

mkdir -p .artifacts
npm pack --pack-destination .artifacts
npm run test:package -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:examples -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz
npm run test:fixtures -- --tarball .artifacts/cometapi-$(node -p 'require("./package.json").version').tgz

Install that path in a separate consumer when needed. Do not treat a locally packed artifact as proof that npm publication succeeded.

Configuration

Set the key in the environment:

export COMETAPI_KEY="your-api-key"

CometAPI uses these settings:

SettingPurposeDefault
Constructor apiKeyExplicit API keyCOMETAPI_KEY
Constructor baseURLExplicit OpenAI-compatible base URLCOMETAPI_BASE_URL, then https://api.cometapi.com/v1

Explicit constructor values take precedence over environment variables. The SDK does not add an account-management access-token contract in 0.1. Missing or blank API keys and explicitly blank base URLs throw the official OpenAI OpenAIError family. HTTP failures preserve the official APIError family and identity.

ESM quick start

import{CometAPI}from"cometapi";constclient=newCometAPI();constresponse=awaitclient.responses.create({model: "gpt-5.6-sol",input: "Explain why the sky is blue in one sentence.",});console.log(response.output_text);conststream=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Write one sentence about comets."}],stream: true,});forawait(constchunkofstream){process.stdout.write(chunk.choices[0]?.delta?.content??"");}process.stdout.write("\n");

CommonJS quick start

const{ CometAPI }=require("cometapi");constclient=newCometAPI();asyncfunctionmain(){constcompletion=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with one short greeting."}],});console.log(completion.choices[0]?.message?.content??"");constmodels=awaitclient.models.list();for(constmodelofmodels.data){console.log(model.id);}}main().catch((error)=>{console.error(error);process.exitCode=1;});

Runnable ESM and CommonJS examples are in examples/. The offline example gate executes these exact files against the packed artifact with a fail-closed mocked transport. Executing them against the live API remains a separately authorized operation.

Custom options

Because CometAPI is a thin subclass of the official OpenAI client, supported OpenAI constructor and per-request options remain available:

import{CometAPI}from"cometapi";constclient=newCometAPI({timeout: 20_000,maxRetries: 2,fetch: globalThis.fetch,});constresponse=awaitclient.chat.completions.create({model: "gpt-5.6-sol",messages: [{role: "user",content: "Reply with OK."}],},{timeout: 5_000},);

The 0.1.x public type matches the enforced runtime boundary. The SDK owns CometAPI routing, authentication, and the Node-only secret boundary. CometAPIOptions therefore declares provider?: never, workloadIdentity?: never, and dangerouslyAllowBrowser?: never. Non-undefined values are rejected by TypeScript, including through inferred variables, spreads, and constrained generics, and runtime validation protects plain JavaScript and type-cast bypasses. The same restriction applies to inherited withOptions calls. A rejection is an official OpenAI OpenAIError and names only the forbidden field; it never includes the supplied value.

Supported options remain available, including timeout, maxRetries, fetch, fetchOptions, defaultHeaders, defaultQuery, logger, organization, project, webhookSecret, adminAPIKey, and per-request options. The client continues to derive its CometAPI API key and base URL from the documented constructor and environment settings.

Direct OpenAI client interoperability

Applications may also configure the official client directly. This is an interoperability option, not the primary CometAPI SDK experience:

importOpenAIfrom"openai";constclient=newOpenAI({apiKey: process.env.COMETAPI_KEY,baseURL: process.env.COMETAPI_BASE_URL??"https://api.cometapi.com/v1",});

Local development and verification

Run commands from this repository root:

npm ci
npm run build
npm test
npm run typecheck
npm run lint
npm run format:check
npm run test:secrets
npm run test:package
npm run test:examples
npm run test:live-contract
npm run test:fixtures
npm run test:compat
npm run check:standalone-content
npm run check:self-contained
npm run check:public-preview
npm run actionlint
npm run verify

npm run verify is the aggregate offline verification gate. Contract tests use mocked transport and require no production credential. npm run actionlint downloads and checksum-verifies the repository-pinned version when needed, then performs static workflow validation. It does not prove that a workflow ran successfully on GitHub Actions. The secret gate scans the current tracked tree plus reachable Git blobs, commit and tag messages, and historical paths without printing matched values. The self-containment gate requires a clean tracked worktree and verifies an exact materialized copy of HEAD in an empty temporary parent.

Project status

The repository is in stable 0.1.x maintenance, and no 0.2 provider-adapter milestone is active. Repository foundation, Public Preview, and Registry Alpha are complete. Stable packages use latest; Registry Alpha artifacts use next. Use the npm and GitHub queries in Installation for exact current state. Release-specific CI, live-smoke, registry, integrity, signature, provenance, and public-install evidence is retained in RELEASING.md, not restated as mutable version status here.

Mocked responses, packed artifacts, GitHub Actions, trusted live tests, and npm publication remain separate evidence layers and must not be represented as one another. Exact failed-release, immutable-artifact, and one-time recovery history is retained in RELEASING.md rather than reproduced in this consumer README. The permanent release workflow is immutable-tag-bound and publishes through npm OIDC.

See:

License

MIT. See LICENSE.