Skip to content

Commit 841c8b2

Browse files
authored
Add API-key-compatible credential providers (#231)
* feat(auth): add credential provider abstraction * docs(sdk): clarify credential provider is for QVeris API authentication Distinguish the CredentialProvider abstraction from the data/tool providers in the capability catalog: it supplies the bearer value for the QVeris API itself; upstream provider credentials are managed by the platform and never pass through the SDK. * docs: regenerate SDK API references for credential provider exports
1 parent 934c2ec commit 841c8b2

24 files changed

Lines changed: 895 additions & 45 deletions

docs/en-US/js-sdk-api.md

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,52 @@ workflows.
1010

1111
## Classes
1212

13+
### ApiKeyCredentialProvider
14+
15+
A credential provider backed by a static QVeris API key.
16+
17+
#### Implements
18+
19+
- [`CredentialProvider`](#credentialprovider)
20+
21+
#### Constructors
22+
23+
##### Constructor
24+
25+
> **new ApiKeyCredentialProvider**(`apiKey`): [`ApiKeyCredentialProvider`](#apikeycredentialprovider)
26+
27+
###### Parameters
28+
29+
###### apiKey
30+
31+
`string`
32+
33+
###### Returns
34+
35+
[`ApiKeyCredentialProvider`](#apikeycredentialprovider)
36+
37+
#### Methods
38+
39+
##### getCredential()
40+
41+
> **getCredential**(`_context`): `Promise`\<`string`\>
42+
43+
###### Parameters
44+
45+
###### \_context
46+
47+
[`CredentialContext`](#credentialcontext)
48+
49+
###### Returns
50+
51+
`Promise`\<`string`\>
52+
53+
###### Implementation of
54+
55+
[`CredentialProvider`](#credentialprovider).[`getCredential`](#getcredential-1)
56+
57+
***
58+
1359
### Qveris
1460

1561
QVeris API client.
@@ -40,7 +86,7 @@ const outcome = await qveris.call(tool.tool_id, {
4086

4187
###### config
4288

43-
[`QverisClientConfig`](#qverisclientconfig)
89+
[`QverisClientOptions`](#qverisclientoptions)
4490

4591
###### Returns
4692

@@ -179,7 +225,7 @@ An explicit baseUrl override takes priority over QVERIS_BASE_URL.
179225

180226
###### overrides?
181227

182-
`Omit`\<[`QverisClientConfig`](#qverisclientconfig), `"apiKey"`\>
228+
`Omit`\<[`QverisClientOptions`](#qverisclientoptions), `"apiKey"` \| `"credentialProvider"`\>
183229

184230
###### Returns
185231

@@ -709,6 +755,48 @@ Per-request timeout override in milliseconds (default 120s)
709755
710756
***
711757

758+
### CredentialContext
759+
760+
Context supplied whenever the client requests a credential.
761+
762+
#### Properties
763+
764+
##### resource
765+
766+
> **resource**: `string`
767+
768+
API resource the credential will be sent to.
769+
770+
##### scopes
771+
772+
> **scopes**: readonly `string`[]
773+
774+
Requested authorization scopes. Empty until a public scope contract is available.
775+
776+
***
777+
778+
### CredentialProvider
779+
780+
Supplies a bearer credential for an API request.
781+
782+
#### Methods
783+
784+
##### getCredential()
785+
786+
> **getCredential**(`context`): `string` \| `Promise`\<`string`\>
787+
788+
###### Parameters
789+
790+
###### context
791+
792+
[`CredentialContext`](#credentialcontext)
793+
794+
###### Returns
795+
796+
`string` \| `Promise`\<`string`\>
797+
798+
***
799+
712800
### CreditsLedgerItem
713801

714802
#### Properties
@@ -1773,6 +1861,14 @@ Error response from the Qveris API.
17731861
17741862
Union type for execution results (either full data or truncated).
17751863

1864+
***
1865+
1866+
### QverisClientOptions
1867+
1868+
> **QverisClientOptions** = `Omit`\<[`QverisClientConfig`](#qverisclientconfig), `"apiKey"`\> & \{ `apiKey`: `string`; `credentialProvider?`: `never`; \} \| \{ `apiKey?`: `never`; `credentialProvider`: [`CredentialProvider`](#credentialprovider); \}
1869+
1870+
Configuration accepted by the QVeris REST client.
1871+
17761872
## Functions
17771873

17781874
### getQverisTools()

docs/en-US/python-sdk-api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ This reference is generated from the public Python objects and docstrings. See t
1010

1111
<a id="qveris.QverisClient"></a>
1212

13-
### *class* qveris.QverisClient(config: [QverisConfig](#qveris.QverisConfig) | None = None, debug_callback: Callable[[str], None] | None = None)
13+
### *class* qveris.QverisClient(config: [QverisConfig](#qveris.QverisConfig) | None = None, debug_callback: Callable[[str], None] | None = None, \*, credential_provider: CredentialProvider | None = None)
1414

1515
Async client for Qveris API.
1616

docs/zh-CN/js-sdk-api.md

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,52 @@
88

99
##
1010

11+
### ApiKeyCredentialProvider
12+
13+
A credential provider backed by a static QVeris API key.
14+
15+
#### 实现
16+
17+
- [`CredentialProvider`](#credentialprovider)
18+
19+
#### 构造函数
20+
21+
##### 构造函数
22+
23+
> **new ApiKeyCredentialProvider**(`apiKey`): [`ApiKeyCredentialProvider`](#apikeycredentialprovider)
24+
25+
###### 参数
26+
27+
###### apiKey
28+
29+
`string`
30+
31+
###### 返回
32+
33+
[`ApiKeyCredentialProvider`](#apikeycredentialprovider)
34+
35+
#### 方法
36+
37+
##### getCredential()
38+
39+
> **getCredential**(`_context`): `Promise`\<`string`\>
40+
41+
###### 参数
42+
43+
###### \_context
44+
45+
[`CredentialContext`](#credentialcontext)
46+
47+
###### 返回
48+
49+
`Promise`\<`string`\>
50+
51+
###### 实现了
52+
53+
[`CredentialProvider`](#credentialprovider).[`getCredential`](#getcredential-1)
54+
55+
***
56+
1157
### Qveris
1258

1359
QVeris API client.
@@ -38,7 +84,7 @@ const outcome = await qveris.call(tool.tool_id, {
3884

3985
###### config
4086

41-
[`QverisClientConfig`](#qverisclientconfig)
87+
[`QverisClientOptions`](#qverisclientoptions)
4288

4389
###### 返回
4490

@@ -177,7 +223,7 @@ An explicit baseUrl override takes priority over QVERIS_BASE_URL.
177223

178224
###### overrides?
179225

180-
`Omit`\<[`QverisClientConfig`](#qverisclientconfig), `"apiKey"`\>
226+
`Omit`\<[`QverisClientOptions`](#qverisclientoptions), `"apiKey"` \| `"credentialProvider"`\>
181227

182228
###### 返回
183229

@@ -707,6 +753,48 @@ Per-request timeout override in milliseconds (default 120s)
707753
708754
***
709755

756+
### CredentialContext
757+
758+
Context supplied whenever the client requests a credential.
759+
760+
#### 属性
761+
762+
##### resource
763+
764+
> **resource**: `string`
765+
766+
API resource the credential will be sent to.
767+
768+
##### scopes
769+
770+
> **scopes**: readonly `string`[]
771+
772+
Requested authorization scopes. Empty until a public scope contract is available.
773+
774+
***
775+
776+
### CredentialProvider
777+
778+
Supplies a bearer credential for an API request.
779+
780+
#### 方法
781+
782+
##### getCredential()
783+
784+
> **getCredential**(`context`): `string` \| `Promise`\<`string`\>
785+
786+
###### 参数
787+
788+
###### context
789+
790+
[`CredentialContext`](#credentialcontext)
791+
792+
###### 返回
793+
794+
`string` \| `Promise`\<`string`\>
795+
796+
***
797+
710798
### CreditsLedgerItem
711799

712800
#### 属性
@@ -1771,6 +1859,14 @@ Error response from the Qveris API.
17711859
17721860
Union type for execution results (either full data or truncated).
17731861

1862+
***
1863+
1864+
### QverisClientOptions
1865+
1866+
> **QverisClientOptions** = `Omit`\<[`QverisClientConfig`](#qverisclientconfig), `"apiKey"`\> & \{ `apiKey`: `string`; `credentialProvider?`: `never`; \} \| \{ `apiKey?`: `never`; `credentialProvider`: [`CredentialProvider`](#credentialprovider); \}
1867+
1868+
Configuration accepted by the QVeris REST client.
1869+
17741870
## 函数
17751871

17761872
### getQverisTools()

docs/zh-CN/python-sdk-api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
<a id="qveris.QverisClient"></a>
1212

13-
### *class* qveris.QverisClient(config: [QverisConfig](#qveris.QverisConfig) | None = None, debug_callback: Callable[[str], None] | None = None)
13+
### *class* qveris.QverisClient(config: [QverisConfig](#qveris.QverisConfig) | None = None, debug_callback: Callable[[str], None] | None = None, \*, credential_provider: CredentialProvider | None = None)
1414

1515
Async client for Qveris API.
1616

packages/cli/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
1212

1313
- Account and pricing recovery hints now follow the resolved API endpoint for the public sites and custom deployments instead of linking to an unrelated site. ([#221])
1414

15+
### Changed
16+
17+
- Routed authenticated requests through an internal credential-provider boundary while preserving all existing API-key resolution and endpoint-selection behavior. ([#226])
18+
1519
## [0.8.0] - 2026-07-14
1620

1721
### Changed
@@ -87,6 +91,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
8791
[0.2.0]: https://github.com/QVerisAI/qveris-agent-toolkit/compare/cli-v0.1.0...cli-v0.2.0
8892
[0.1.0]: https://github.com/QVerisAI/qveris-agent-toolkit/releases/tag/cli-v0.1.0
8993
[#221]: https://github.com/QVerisAI/qveris-agent-toolkit/issues/221
94+
[#226]: https://github.com/QVerisAI/qveris-agent-toolkit/issues/226
9095
[#204]: https://github.com/QVerisAI/qveris-agent-toolkit/issues/204
9196
[#161]: https://github.com/QVerisAI/qveris-agent-toolkit/issues/161
9297
[#144]: https://github.com/QVerisAI/qveris-agent-toolkit/pull/144

0 commit comments

Comments
 (0)