@moxxy/plugin-provider-openai-codex 0.30.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/models.js +9 -9
- package/dist/models.js.map +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +33 -3
- package/dist/provider.js.map +1 -1
- package/dist/translate.d.ts +7 -3
- package/dist/translate.d.ts.map +1 -1
- package/dist/translate.js +8 -3
- package/dist/translate.js.map +1 -1
- package/package.json +17 -3
- package/src/index.ts +26 -2
- package/src/models.ts +9 -9
- package/src/provider.test.ts +33 -1
- package/src/provider.ts +36 -3
- package/src/translate.test.ts +18 -0
- package/src/translate.ts +17 -4
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,sBAAsB,kCAiCjC,CAAC;AAEH,eAAO,MAAM,iBAAiB,6BAI5B,CAAC;AAEH,eAAe,iBAAiB,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,SAAS,EACT,MAAM,EACN,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,EACN,UAAU,EACV,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,IAAI,qBAAqB,GAC1C,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,29 @@
|
|
|
1
|
-
import { defineProvider, definePlugin } from '@moxxy/sdk';
|
|
1
|
+
import { defineProvider, definePlugin, MoxxyError } from '@moxxy/sdk';
|
|
2
2
|
import { CodexProvider } from './provider.js';
|
|
3
3
|
import { codexModels } from './models.js';
|
|
4
|
-
import { codexLogin, codexLogout, codexStatus } from './login.js';
|
|
4
|
+
import { codexLogin, codexLogout, codexStatus, persistCodexTokens, readStoredTokens, } from './login.js';
|
|
5
5
|
import { PLUGIN_VERSION } from './codex/headers.js';
|
|
6
6
|
export const openaiCodexProviderDef = defineProvider({
|
|
7
7
|
name: 'openai-codex',
|
|
8
8
|
models: [...codexModels],
|
|
9
9
|
createClient: (config) => new CodexProvider(config),
|
|
10
|
+
async resolveCredentials({ vault, providerConfig }) {
|
|
11
|
+
const tokens = await readStoredTokens(vault).catch(() => null);
|
|
12
|
+
if (!tokens) {
|
|
13
|
+
throw new MoxxyError({
|
|
14
|
+
code: 'AUTH_NO_CREDENTIALS',
|
|
15
|
+
message: 'No ChatGPT OAuth credentials found in the vault.',
|
|
16
|
+
hint: 'Run `moxxy login openai-codex` to sign in with your ChatGPT Pro/Plus account.',
|
|
17
|
+
context: { provider: 'openai-codex' },
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
...providerConfig,
|
|
22
|
+
tokens,
|
|
23
|
+
onTokensRefreshed: (next) => persistCodexTokens(vault, next),
|
|
24
|
+
reloadTokens: () => readStoredTokens(vault),
|
|
25
|
+
};
|
|
26
|
+
},
|
|
10
27
|
// No validateKey: OAuth credentials are validated by the OAuth token
|
|
11
28
|
// exchange itself, not by a synchronous key check.
|
|
12
29
|
auth: {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,aAAa,EAA4B,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAc,CAAC;IACnD,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,CAAC,GAAG,WAAW,CAAC;IACxB,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,MAA6B,CAAC;IAC1E,KAAK,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE;QAChD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,UAAU,CAAC;gBACnB,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,kDAAkD;gBAC3D,IAAI,EAAE,+EAA+E;gBACrF,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;aACtC,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,GAAG,cAAc;YACjB,MAAM;YACN,iBAAiB,EAAE,CAAC,IAAiB,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC;YACzE,YAAY,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC;SAC5C,CAAC;IACJ,CAAC;IACD,qEAAqE;IACrE,mDAAmD;IACnD,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,kBAAkB;QAC/B,2EAA2E;QAC3E,2EAA2E;QAC3E,gBAAgB,EAAE,IAAI;QACtB,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,WAAW;KACpB;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;IAC5C,IAAI,EAAE,qCAAqC;IAC3C,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,CAAC,sBAAsB,CAAC;CACpC,CAAC,CAAC;AAEH,eAAe,iBAAiB,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,SAAS,EACT,MAAM,EACN,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,EACN,UAAU,EACV,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,IAAI,qBAAqB,GAC1C,MAAM,YAAY,CAAC"}
|
package/dist/models.js
CHANGED
|
@@ -17,15 +17,15 @@ export const codexModels = [
|
|
|
17
17
|
// under the same ids the API uses (sol/terra/luna — no `-codex` variant).
|
|
18
18
|
// Sol is OpenAI's default Codex model. The ChatGPT-plan window cap applies
|
|
19
19
|
// here too, so keep them at 400k like the rest of this list.
|
|
20
|
-
{ id: 'gpt-5.6-sol', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
21
|
-
{ id: 'gpt-5.6-terra', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
22
|
-
{ id: 'gpt-5.6-luna', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
23
|
-
{ id: 'gpt-5.5', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
24
|
-
{ id: 'gpt-5.4', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
25
|
-
{ id: 'gpt-5.4-mini', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
26
|
-
{ id: 'gpt-5.3-codex', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
27
|
-
{ id: 'gpt-5.3-codex-spark', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
28
|
-
{ id: 'gpt-5.2', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
20
|
+
{ id: 'gpt-5.6-sol', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
21
|
+
{ id: 'gpt-5.6-terra', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
22
|
+
{ id: 'gpt-5.6-luna', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
23
|
+
{ id: 'gpt-5.5', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
24
|
+
{ id: 'gpt-5.4', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
25
|
+
{ id: 'gpt-5.4-mini', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
26
|
+
{ id: 'gpt-5.3-codex', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
27
|
+
{ id: 'gpt-5.3-codex-spark', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
28
|
+
{ id: 'gpt-5.2', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
29
29
|
];
|
|
30
30
|
// OpenAI's own Codex default moved to gpt-5.6-sol at GA (July 9, 2026); mirror
|
|
31
31
|
// it so a ChatGPT-plan user who hasn't pinned a model gets the current flagship.
|
package/dist/models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,+EAA+E;AAC/E,+EAA+E;AAC/E,mEAAmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAmC;IACzD,8EAA8E;IAC9E,6EAA6E;IAC7E,0EAA0E;IAC1E,8DAA8D;IAC9D,8EAA8E;IAC9E,2EAA2E;IAC3E,0EAA0E;IAC1E,2EAA2E;IAC3E,6DAA6D;IAC7D,EAAE,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAQpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0B9C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,wFAAwF;IACxF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,YAAW,WAAW;IAC/C,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,MAAM,kDAAe;IAE9B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAA8C;IACjF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAoC;IAClE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA4B;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,MAAM,GAAE,mBAAwB;IAmBrC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAQpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0B9C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,wFAAwF;IACxF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,YAAW,WAAW;IAC/C,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,MAAM,kDAAe;IAE9B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAA8C;IACjF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAoC;IAClE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA4B;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,MAAM,GAAE,mBAAwB;IAmBrC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC;IA4I3D,WAAW,CACf,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC,GACpE,OAAO,CAAC,MAAM,CAAC;IAiBlB,OAAO,CAAC,SAAS;YAUH,WAAW;IAWzB;;;;;;;OAOG;YACW,UAAU;CA4CzB"}
|
package/dist/provider.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { webcrypto } from 'node:crypto';
|
|
2
|
-
import { classifyHttpStatus, estimateTextTokens } from '@moxxy/sdk';
|
|
2
|
+
import { classifyHttpStatus, estimateTextTokens, resolveProviderTools } from '@moxxy/sdk';
|
|
3
3
|
import { isAuthRejection, withCredentialLock } from '@moxxy/plugin-oauth';
|
|
4
4
|
import { CODEX_RESPONSES_URL, refreshTokens } from './oauth.js';
|
|
5
5
|
import { codexModels, DEFAULT_CODEX_MODEL } from './models.js';
|
|
@@ -89,13 +89,22 @@ export class CodexProvider {
|
|
|
89
89
|
const emitReasoning = req.reasoning != null && req.reasoning !== false;
|
|
90
90
|
const reqEffort = typeof req.reasoning === 'object' ? req.reasoning.effort : undefined;
|
|
91
91
|
const reasoningEffort = reqEffort ?? this.reasoningEffort;
|
|
92
|
+
const resolvedTools = resolveProviderTools(req.tools, this.models, model);
|
|
93
|
+
const nativeRequest = { ...req, model, tools: resolvedTools.tools };
|
|
92
94
|
// Pass the session id as the Responses prefix-cache key so repeated turns
|
|
93
95
|
// in a session reuse the cached prefix (cheaper + faster). Codex DOES
|
|
94
96
|
// support this even though the Chat-Completions providers ignore cacheHints.
|
|
95
|
-
const body = toResponsesBody(
|
|
97
|
+
const body = toResponsesBody(nativeRequest, {
|
|
96
98
|
sessionHint: sessionId,
|
|
97
99
|
...(reasoningEffort ? { reasoningEffort } : {}),
|
|
100
|
+
...(resolvedTools.hostedTools.length > 0 ? { hostedTools: resolvedTools.hostedTools } : {}),
|
|
98
101
|
});
|
|
102
|
+
const fallbackBody = resolvedTools.hostedTools.length > 0
|
|
103
|
+
? toResponsesBody({ ...req, model }, {
|
|
104
|
+
sessionHint: sessionId,
|
|
105
|
+
...(reasoningEffort ? { reasoningEffort } : {}),
|
|
106
|
+
})
|
|
107
|
+
: null;
|
|
99
108
|
// Internal idle watchdog: aborts the request if the backend stalls (accepts
|
|
100
109
|
// the POST but never sends headers/body, or goes silent mid-stream) so the
|
|
101
110
|
// turn can't hang forever when the caller supplied no AbortSignal. Composed
|
|
@@ -153,10 +162,25 @@ export class CodexProvider {
|
|
|
153
162
|
return;
|
|
154
163
|
}
|
|
155
164
|
}
|
|
165
|
+
let errorText;
|
|
166
|
+
if (!response.ok && fallbackBody) {
|
|
167
|
+
errorText = await readCappedText(response, MAX_ERROR_BODY_CHARS);
|
|
168
|
+
if (isHostedWebSearchRejection(response.status, errorText)) {
|
|
169
|
+
try {
|
|
170
|
+
armIdle();
|
|
171
|
+
response = await this.postCodex(fallbackBody, sessionId, signal);
|
|
172
|
+
errorText = undefined;
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
yield toErrorEvent(err);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
156
180
|
if (!response.ok || !response.body) {
|
|
157
181
|
// Cap the buffered error body: a hostile/broken backend could otherwise
|
|
158
182
|
// stream a huge body that we'd hold in full and then put into a string.
|
|
159
|
-
const text = await readCappedText(response, MAX_ERROR_BODY_CHARS);
|
|
183
|
+
const text = errorText ?? await readCappedText(response, MAX_ERROR_BODY_CHARS);
|
|
160
184
|
// Derive the retryable verdict from the SDK's status classifier so it
|
|
161
185
|
// stays consistent with the rest of moxxy (429 + 5xx are retryable).
|
|
162
186
|
const classified = classifyHttpStatus(response.status);
|
|
@@ -269,6 +293,12 @@ export class CodexProvider {
|
|
|
269
293
|
});
|
|
270
294
|
}
|
|
271
295
|
}
|
|
296
|
+
function isHostedWebSearchRejection(status, body) {
|
|
297
|
+
if (status !== 400)
|
|
298
|
+
return false;
|
|
299
|
+
const normalized = body.toLowerCase();
|
|
300
|
+
return normalized.includes('web_search') || normalized.includes('web search');
|
|
301
|
+
}
|
|
272
302
|
function withAccountId(tokens, accountId) {
|
|
273
303
|
return accountId
|
|
274
304
|
? { access: tokens.access, refresh: tokens.refresh, expires: tokens.expires, accountId }
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAMxC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAMxC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG/E;;;;;;GAMG;AACH,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC;;;;;GAKG;AACH,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAyClC;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,cAAc,CAAC;IACtB,MAAM,GAAG,WAAW,CAAC;IAEtB,MAAM,CAA0B;IACvB,iBAAiB,CAA+C;IAChE,YAAY,CAAqC;IACjD,YAAY,CAAS;IACrB,eAAe,CAA6B;IAC5C,SAAS,CAAe;IACxB,iBAAiB,CAAe;IAChC,aAAa,CAAS;IAEvC,YAAY,SAA8B,EAAE;QAC1C,IAAI,MAAM,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/C,IAAI,MAAM,CAAC,iBAAiB;YAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAChF,IAAI,MAAM,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACjE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,mBAAmB,CAAC;QAC/D,IAAI,MAAM,CAAC,eAAe;YAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;QACvC,4EAA4E;QAC5E,sEAAsE;QACtE,0EAA0E;QAC1E,qEAAqE;QACrE,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAC9E,IAAI,CAAC,aAAa;YAChB,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,GAAG,CAAC;gBAC9C,CAAC,CAAC,MAAM,CAAC,aAAa;gBACtB,CAAC,CAAC,qBAAqB,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,GAAoB;QAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QAC7C,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3C,2EAA2E;QAC3E,yEAAyE;QACzE,yEAAyE;QACzE,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC;QACvE,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,MAAM,eAAe,GAAG,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC;QAC1D,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;QACpE,0EAA0E;QAC1E,sEAAsE;QACtE,6EAA6E;QAC7E,MAAM,IAAI,GAAG,eAAe,CAC1B,aAAa,EACb;YACE,WAAW,EAAE,SAAS;YACtB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5F,CACF,CAAC;QACF,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YACvD,CAAC,CAAC,eAAe,CACb,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,EACjB;gBACE,WAAW,EAAE,SAAS;gBACtB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CACF;YACH,CAAC,CAAC,IAAI,CAAC;QAET,4EAA4E;QAC5E,2EAA2E;QAC3E,4EAA4E;QAC5E,4EAA4E;QAC5E,gEAAgE;QAChE,MAAM,cAAc,GAAG,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,SAAoD,CAAC;QACzD,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,SAAS,GAAG,UAAU,CACpB,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,EAC1F,IAAI,CAAC,aAAa,CACnB,CAAC;YACF,8DAA8D;YAC9D,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACtB,CAAC,CAAC;QACF,MAAM,UAAU,GAAG,GAAS,EAAE;YAC5B,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,SAAS,GAAG,SAAS,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM;YACvB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;YACtD,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC;QAE1B,IAAI,CAAC;YACH,OAAO,EAAE,CAAC;YACV,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,sEAAsE;gBACtE,oDAAoD;gBACpD,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;oBACxB,OAAO,EAAE,CAAC;oBACV,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC3D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;oBACxB,OAAO;gBACT,CAAC;gBACD,wEAAwE;gBACxE,qEAAqE;gBACrE,qEAAqE;gBACrE,qCAAqC;gBACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,MAAM;wBACJ,IAAI,EAAE,OAAO;wBACb,OAAO,EACL,mHAAmH;wBACrH,SAAS,EAAE,KAAK;qBACjB,CAAC;oBACF,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,SAA6B,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,YAAY,EAAE,CAAC;gBACjC,SAAS,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;gBACjE,IAAI,0BAA0B,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;oBAC3D,IAAI,CAAC;wBACH,OAAO,EAAE,CAAC;wBACV,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;wBACjE,SAAS,GAAG,SAAS,CAAC;oBACxB,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;wBACxB,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,wEAAwE;gBACxE,wEAAwE;gBACxE,MAAM,IAAI,GAAG,SAAS,IAAI,MAAM,cAAc,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;gBAC/E,sEAAsE;gBACtE,qEAAqE;gBACrE,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,SAAS,GACb,UAAU,EAAE,IAAI,KAAK,uBAAuB;oBAC5C,UAAU,EAAE,IAAI,KAAK,uBAAuB,CAAC;gBAC/C,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,6BAA6B,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE;oBACvF,SAAS;iBACV,CAAC;gBACF,OAAO;YACT,CAAC;YAED,KAAK,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAC5E,CAAC;gBAAS,CAAC;YACT,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CACf,GAAqE;QAErE,8EAA8E;QAC9E,6EAA6E;QAC7E,4EAA4E;QAC5E,uEAAuE;QACvE,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QAC5B,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC7B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;oBAAE,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;;oBACzD,aAAa,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,kBAAkB,CAAC,IAAI,CAAC,GAAG,aAAa,GAAG,qBAAqB,CAAC;IAC1E,CAAC;IAEO,SAAS,CAAC,IAAa,EAAE,SAAiB,EAAE,MAA+B;QACjF,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE;YACzC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;YAClD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;QACJ,CAAC;QACD,yEAAyE;QACzE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;YAAE,OAAO;QACtD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,UAAU;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,kBAAkB,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE;YACxD,iEAAiE;YACjE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC/D,mEAAmE;YACnE,oEAAoE;YACpE,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;YACnC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAC3D,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;oBACvF,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC3E,OAAO;gBACT,CAAC;gBACD,IAAI,MAAM,EAAE,OAAO;oBAAE,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YACzE,CAAC;YACD,IAAI,IAAiB,CAAC;YACtB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,mEAAmE;gBACnE,+DAA+D;gBAC/D,8CAA8C;gBAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY;oBACtD,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;oBAC7C,CAAC,CAAC,IAAI,CAAC;gBACT,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;oBAAE,MAAM,GAAG,CAAC;gBACtE,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7D,CAAC;YACD,uEAAuE;YACvE,4DAA4D;YAC5D,8CAA8C;YAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,gEAAgE;gBAChE,uDAAuD;gBACvD,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,0BAA0B,CAAC,MAAc,EAAE,IAAY;IAC9D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,MAAmB,EAAE,SAA6B;IACvE,OAAO,SAAS;QACd,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE;QACxF,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AAClF,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,cAAc,CAAC,QAAkB,EAAE,QAAgB;IAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
|
package/dist/translate.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ProviderMessage, type ProviderRequest, type ToolDef } from '@moxxy/sdk';
|
|
1
|
+
import { type HostedTool, type ProviderMessage, type ProviderRequest, type ToolDef } from '@moxxy/sdk';
|
|
2
2
|
/**
|
|
3
3
|
* Responses-API "input" item shape. We only emit the subset codex uses:
|
|
4
4
|
* - `message` items with role + a string-or-rich content
|
|
@@ -33,13 +33,16 @@ type ResponsesContent = {
|
|
|
33
33
|
filename?: string;
|
|
34
34
|
file_data: string;
|
|
35
35
|
};
|
|
36
|
-
interface
|
|
36
|
+
interface ResponsesFunctionTool {
|
|
37
37
|
type: 'function';
|
|
38
38
|
name: string;
|
|
39
39
|
description: string;
|
|
40
40
|
parameters: unknown;
|
|
41
41
|
strict?: boolean;
|
|
42
42
|
}
|
|
43
|
+
type ResponsesTool = ResponsesFunctionTool | {
|
|
44
|
+
type: 'web_search';
|
|
45
|
+
};
|
|
43
46
|
export interface ResponsesBody {
|
|
44
47
|
model: string;
|
|
45
48
|
instructions?: string;
|
|
@@ -67,10 +70,11 @@ export interface ResponsesBody {
|
|
|
67
70
|
*/
|
|
68
71
|
export declare function extractSystemText(messages: ReadonlyArray<ProviderMessage>, explicitSystem?: string): string;
|
|
69
72
|
export declare function toResponsesInput(messages: ReadonlyArray<ProviderMessage>): ResponsesInputItem[];
|
|
70
|
-
export declare function toResponsesTools(tools: ReadonlyArray<ToolDef>):
|
|
73
|
+
export declare function toResponsesTools(tools: ReadonlyArray<ToolDef>): ResponsesFunctionTool[];
|
|
71
74
|
export interface BuildBodyOptions {
|
|
72
75
|
readonly sessionHint?: string;
|
|
73
76
|
readonly reasoningEffort?: 'low' | 'medium' | 'high';
|
|
77
|
+
readonly hostedTools?: ReadonlyArray<HostedTool>;
|
|
74
78
|
}
|
|
75
79
|
export declare function toResponsesBody(req: ProviderRequest, opts?: BuildBodyOptions): ResponsesBody;
|
|
76
80
|
export {};
|
package/dist/translate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,OAAO,EACb,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,KAAK,kBAAkB,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;CAAE,GACpG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,KAAK,gBAAgB,GACjB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE,UAAU,qBAAqB;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,KAAK,aAAa,GAAG,qBAAqB,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,CAAC;IAClF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,IAAI,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CAMpB;AAuBD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EACxC,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAUR;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,kBAAkB,EAAE,CAmD/F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,qBAAqB,EAAE,CAOvF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAClD;AAkDD,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,GAAE,gBAAqB,GAAG,aAAa,CAqBhG"}
|
package/dist/translate.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { zodToJsonSchema } from '@moxxy/sdk';
|
|
1
|
+
import { zodToJsonSchema, } from '@moxxy/sdk';
|
|
2
2
|
function contentBlocksToInputText(role, blocks) {
|
|
3
3
|
const out = [];
|
|
4
4
|
for (const block of blocks) {
|
|
@@ -159,8 +159,13 @@ export function toResponsesBody(req, opts = {}) {
|
|
|
159
159
|
reasoning: { effort: opts.reasoningEffort ?? 'medium', summary: 'auto' },
|
|
160
160
|
include: ['reasoning.encrypted_content'],
|
|
161
161
|
};
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
const tools = req.tools ? toResponsesTools(req.tools) : [];
|
|
163
|
+
for (const hosted of opts.hostedTools ?? []) {
|
|
164
|
+
if (hosted.type === 'web_search')
|
|
165
|
+
tools.push({ type: 'web_search' });
|
|
166
|
+
}
|
|
167
|
+
if (tools.length > 0)
|
|
168
|
+
body.tools = tools;
|
|
164
169
|
if (opts.sessionHint)
|
|
165
170
|
body.prompt_cache_key = opts.sessionHint;
|
|
166
171
|
if (req.maxTokens !== undefined)
|
package/dist/translate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translate.js","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"translate.js","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moxxy/plugin-provider-openai-codex",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"description": "OpenAI Codex (ChatGPT Pro/Plus OAuth) LLMProvider plugin for moxxy. Streams against https://chatgpt.com/backend-api/codex/responses using PKCE-based OAuth tokens.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"moxxy",
|
|
@@ -43,11 +43,25 @@
|
|
|
43
43
|
"plugin": {
|
|
44
44
|
"entry": "./dist/index.js",
|
|
45
45
|
"kind": "provider"
|
|
46
|
+
},
|
|
47
|
+
"catalog": {
|
|
48
|
+
"label": "OpenAI Codex (ChatGPT sign-in)",
|
|
49
|
+
"description": "Codex models through a ChatGPT subscription sign-in.",
|
|
50
|
+
"provides": [
|
|
51
|
+
{
|
|
52
|
+
"category": "provider",
|
|
53
|
+
"name": "openai-codex"
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"provider": {
|
|
57
|
+
"auth": "oauth"
|
|
58
|
+
}
|
|
46
59
|
}
|
|
47
60
|
},
|
|
48
61
|
"dependencies": {
|
|
49
|
-
"@moxxy/plugin-
|
|
50
|
-
"@moxxy/
|
|
62
|
+
"@moxxy/plugin-browser": "0.32.0",
|
|
63
|
+
"@moxxy/plugin-oauth": "0.32.0",
|
|
64
|
+
"@moxxy/sdk": "0.32.0"
|
|
51
65
|
},
|
|
52
66
|
"devDependencies": {
|
|
53
67
|
"@types/node": "^22.10.0",
|
package/src/index.ts
CHANGED
|
@@ -1,13 +1,37 @@
|
|
|
1
|
-
import { defineProvider, definePlugin } from '@moxxy/sdk';
|
|
1
|
+
import { defineProvider, definePlugin, MoxxyError } from '@moxxy/sdk';
|
|
2
2
|
import { CodexProvider, type CodexProviderConfig } from './provider.js';
|
|
3
3
|
import { codexModels } from './models.js';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
codexLogin,
|
|
6
|
+
codexLogout,
|
|
7
|
+
codexStatus,
|
|
8
|
+
persistCodexTokens,
|
|
9
|
+
readStoredTokens,
|
|
10
|
+
} from './login.js';
|
|
11
|
+
import type { CodexTokens } from './types.js';
|
|
5
12
|
import { PLUGIN_VERSION } from './codex/headers.js';
|
|
6
13
|
|
|
7
14
|
export const openaiCodexProviderDef = defineProvider({
|
|
8
15
|
name: 'openai-codex',
|
|
9
16
|
models: [...codexModels],
|
|
10
17
|
createClient: (config) => new CodexProvider(config as CodexProviderConfig),
|
|
18
|
+
async resolveCredentials({ vault, providerConfig }) {
|
|
19
|
+
const tokens = await readStoredTokens(vault).catch(() => null);
|
|
20
|
+
if (!tokens) {
|
|
21
|
+
throw new MoxxyError({
|
|
22
|
+
code: 'AUTH_NO_CREDENTIALS',
|
|
23
|
+
message: 'No ChatGPT OAuth credentials found in the vault.',
|
|
24
|
+
hint: 'Run `moxxy login openai-codex` to sign in with your ChatGPT Pro/Plus account.',
|
|
25
|
+
context: { provider: 'openai-codex' },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
...providerConfig,
|
|
30
|
+
tokens,
|
|
31
|
+
onTokensRefreshed: (next: CodexTokens) => persistCodexTokens(vault, next),
|
|
32
|
+
reloadTokens: () => readStoredTokens(vault),
|
|
33
|
+
};
|
|
34
|
+
},
|
|
11
35
|
// No validateKey: OAuth credentials are validated by the OAuth token
|
|
12
36
|
// exchange itself, not by a synchronous key check.
|
|
13
37
|
auth: {
|
package/src/models.ts
CHANGED
|
@@ -19,15 +19,15 @@ export const codexModels: ReadonlyArray<ModelDescriptor> = [
|
|
|
19
19
|
// under the same ids the API uses (sol/terra/luna — no `-codex` variant).
|
|
20
20
|
// Sol is OpenAI's default Codex model. The ChatGPT-plan window cap applies
|
|
21
21
|
// here too, so keep them at 400k like the rest of this list.
|
|
22
|
-
{ id: 'gpt-5.6-sol', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
23
|
-
{ id: 'gpt-5.6-terra', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
24
|
-
{ id: 'gpt-5.6-luna', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
25
|
-
{ id: 'gpt-5.5', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
26
|
-
{ id: 'gpt-5.4', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
27
|
-
{ id: 'gpt-5.4-mini', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
28
|
-
{ id: 'gpt-5.3-codex', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
29
|
-
{ id: 'gpt-5.3-codex-spark', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
30
|
-
{ id: 'gpt-5.2', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true },
|
|
22
|
+
{ id: 'gpt-5.6-sol', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
23
|
+
{ id: 'gpt-5.6-terra', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
24
|
+
{ id: 'gpt-5.6-luna', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
25
|
+
{ id: 'gpt-5.5', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
26
|
+
{ id: 'gpt-5.4', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
27
|
+
{ id: 'gpt-5.4-mini', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
28
|
+
{ id: 'gpt-5.3-codex', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
29
|
+
{ id: 'gpt-5.3-codex-spark', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
30
|
+
{ id: 'gpt-5.2', contextWindow: 400_000, maxOutputTokens: 128_000, supportsTools: true, supportsStreaming: true, supportsImages: true, supportsDocuments: true, supportsReasoning: true, hostedTools: ['web_search'] },
|
|
31
31
|
];
|
|
32
32
|
|
|
33
33
|
// OpenAI's own Codex default moved to gpt-5.6-sol at GA (July 9, 2026); mirror
|
package/src/provider.test.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { CodexProvider } from './provider.js';
|
|
|
6
6
|
import { CODEX_RESPONSES_URL } from './oauth.js';
|
|
7
7
|
import type { CodexTokens } from './types.js';
|
|
8
8
|
import type { ProviderEvent, ProviderRequest } from '@moxxy/sdk';
|
|
9
|
-
import { assertDefined } from '@moxxy/sdk';
|
|
9
|
+
import { assertDefined, defineTool, z } from '@moxxy/sdk';
|
|
10
10
|
|
|
11
11
|
// The refresh path takes a cross-process lockfile under `<moxxy home>/locks`;
|
|
12
12
|
// point MOXXY_HOME at a temp dir so tests never touch the real ~/.moxxy.
|
|
@@ -57,6 +57,38 @@ function baseRequest(over: Partial<ProviderRequest> = {}): ProviderRequest {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
describe('CodexProvider.stream', () => {
|
|
60
|
+
it('uses hosted web search first and retries with the client fallback when the backend rejects it', async () => {
|
|
61
|
+
const bodies: Array<{ tools?: Array<{ type: string; name?: string }> }> = [];
|
|
62
|
+
const fakeFetch = vi.fn(async (_url: RequestInfo | URL, init?: RequestInit) => {
|
|
63
|
+
bodies.push(JSON.parse(String(init?.body)) as { tools?: Array<{ type: string; name?: string }> });
|
|
64
|
+
if (bodies.length === 1) {
|
|
65
|
+
return new Response('{"error":"web_search is not enabled"}', { status: 400 });
|
|
66
|
+
}
|
|
67
|
+
return new Response(sseStream(['data: {"type":"response.completed"}\n\n']), { status: 200 });
|
|
68
|
+
});
|
|
69
|
+
const fallback = defineTool({
|
|
70
|
+
name: 'web_search',
|
|
71
|
+
description: 'fallback search',
|
|
72
|
+
inputSchema: z.object({ query: z.string() }),
|
|
73
|
+
hosted: { type: 'web_search' },
|
|
74
|
+
handler: () => [],
|
|
75
|
+
});
|
|
76
|
+
const provider = new CodexProvider({
|
|
77
|
+
tokens: makeTokens(),
|
|
78
|
+
fetch: fakeFetch as unknown as typeof fetch,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const events = await collect(provider.stream(baseRequest({ tools: [fallback] })));
|
|
82
|
+
|
|
83
|
+
expect(bodies).toHaveLength(2);
|
|
84
|
+
expect(bodies[0]?.tools).toEqual([{ type: 'web_search' }]);
|
|
85
|
+
expect(bodies[1]?.tools).toEqual([
|
|
86
|
+
expect.objectContaining({ type: 'function', name: 'web_search' }),
|
|
87
|
+
]);
|
|
88
|
+
expect(events.some((event) => event.type === 'error')).toBe(false);
|
|
89
|
+
expect(events.at(-1)).toMatchObject({ type: 'message_end', stopReason: 'end_turn' });
|
|
90
|
+
});
|
|
91
|
+
|
|
60
92
|
it('sends Bearer auth, ChatGPT-Account-Id, originator and User-Agent headers', async () => {
|
|
61
93
|
const captured: { url?: string; init?: RequestInit } = {};
|
|
62
94
|
const fakeFetch = vi.fn(async (url: RequestInfo | URL, init?: RequestInit) => {
|
package/src/provider.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type {
|
|
|
4
4
|
ProviderEvent,
|
|
5
5
|
ProviderRequest,
|
|
6
6
|
} from '@moxxy/sdk';
|
|
7
|
-
import { classifyHttpStatus, estimateTextTokens } from '@moxxy/sdk';
|
|
7
|
+
import { classifyHttpStatus, estimateTextTokens, resolveProviderTools } from '@moxxy/sdk';
|
|
8
8
|
import { isAuthRejection, withCredentialLock } from '@moxxy/plugin-oauth';
|
|
9
9
|
import { CODEX_RESPONSES_URL, refreshTokens } from './oauth.js';
|
|
10
10
|
import { codexModels, DEFAULT_CODEX_MODEL } from './models.js';
|
|
@@ -138,16 +138,28 @@ export class CodexProvider implements LLMProvider {
|
|
|
138
138
|
const emitReasoning = req.reasoning != null && req.reasoning !== false;
|
|
139
139
|
const reqEffort = typeof req.reasoning === 'object' ? req.reasoning.effort : undefined;
|
|
140
140
|
const reasoningEffort = reqEffort ?? this.reasoningEffort;
|
|
141
|
+
const resolvedTools = resolveProviderTools(req.tools, this.models, model);
|
|
142
|
+
const nativeRequest = { ...req, model, tools: resolvedTools.tools };
|
|
141
143
|
// Pass the session id as the Responses prefix-cache key so repeated turns
|
|
142
144
|
// in a session reuse the cached prefix (cheaper + faster). Codex DOES
|
|
143
145
|
// support this even though the Chat-Completions providers ignore cacheHints.
|
|
144
146
|
const body = toResponsesBody(
|
|
145
|
-
|
|
147
|
+
nativeRequest,
|
|
146
148
|
{
|
|
147
149
|
sessionHint: sessionId,
|
|
148
150
|
...(reasoningEffort ? { reasoningEffort } : {}),
|
|
151
|
+
...(resolvedTools.hostedTools.length > 0 ? { hostedTools: resolvedTools.hostedTools } : {}),
|
|
149
152
|
},
|
|
150
153
|
);
|
|
154
|
+
const fallbackBody = resolvedTools.hostedTools.length > 0
|
|
155
|
+
? toResponsesBody(
|
|
156
|
+
{ ...req, model },
|
|
157
|
+
{
|
|
158
|
+
sessionHint: sessionId,
|
|
159
|
+
...(reasoningEffort ? { reasoningEffort } : {}),
|
|
160
|
+
},
|
|
161
|
+
)
|
|
162
|
+
: null;
|
|
151
163
|
|
|
152
164
|
// Internal idle watchdog: aborts the request if the backend stalls (accepts
|
|
153
165
|
// the POST but never sends headers/body, or goes silent mid-stream) so the
|
|
@@ -209,10 +221,25 @@ export class CodexProvider implements LLMProvider {
|
|
|
209
221
|
}
|
|
210
222
|
}
|
|
211
223
|
|
|
224
|
+
let errorText: string | undefined;
|
|
225
|
+
if (!response.ok && fallbackBody) {
|
|
226
|
+
errorText = await readCappedText(response, MAX_ERROR_BODY_CHARS);
|
|
227
|
+
if (isHostedWebSearchRejection(response.status, errorText)) {
|
|
228
|
+
try {
|
|
229
|
+
armIdle();
|
|
230
|
+
response = await this.postCodex(fallbackBody, sessionId, signal);
|
|
231
|
+
errorText = undefined;
|
|
232
|
+
} catch (err) {
|
|
233
|
+
yield toErrorEvent(err);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
212
239
|
if (!response.ok || !response.body) {
|
|
213
240
|
// Cap the buffered error body: a hostile/broken backend could otherwise
|
|
214
241
|
// stream a huge body that we'd hold in full and then put into a string.
|
|
215
|
-
const text = await readCappedText(response, MAX_ERROR_BODY_CHARS);
|
|
242
|
+
const text = errorText ?? await readCappedText(response, MAX_ERROR_BODY_CHARS);
|
|
216
243
|
// Derive the retryable verdict from the SDK's status classifier so it
|
|
217
244
|
// stays consistent with the rest of moxxy (429 + 5xx are retryable).
|
|
218
245
|
const classified = classifyHttpStatus(response.status);
|
|
@@ -327,6 +354,12 @@ export class CodexProvider implements LLMProvider {
|
|
|
327
354
|
}
|
|
328
355
|
}
|
|
329
356
|
|
|
357
|
+
function isHostedWebSearchRejection(status: number, body: string): boolean {
|
|
358
|
+
if (status !== 400) return false;
|
|
359
|
+
const normalized = body.toLowerCase();
|
|
360
|
+
return normalized.includes('web_search') || normalized.includes('web search');
|
|
361
|
+
}
|
|
362
|
+
|
|
330
363
|
function withAccountId(tokens: CodexTokens, accountId: string | undefined): CodexTokens {
|
|
331
364
|
return accountId
|
|
332
365
|
? { access: tokens.access, refresh: tokens.refresh, expires: tokens.expires, accountId }
|
package/src/translate.test.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { defineTool, z } from '@moxxy/sdk';
|
|
2
3
|
import { extractSystemText, toResponsesBody, toResponsesInput } from './translate.js';
|
|
3
4
|
|
|
4
5
|
describe('toResponsesInput', () => {
|
|
@@ -92,4 +93,21 @@ describe('toResponsesBody', () => {
|
|
|
92
93
|
expect(body).not.toHaveProperty('max_output_tokens');
|
|
93
94
|
expect(body).not.toHaveProperty('temperature');
|
|
94
95
|
});
|
|
96
|
+
|
|
97
|
+
it('serializes hosted web search beside ordinary function tools', () => {
|
|
98
|
+
const read = defineTool({
|
|
99
|
+
name: 'Read',
|
|
100
|
+
description: 'read',
|
|
101
|
+
inputSchema: z.object({ path: z.string() }),
|
|
102
|
+
handler: () => '',
|
|
103
|
+
});
|
|
104
|
+
const body = toResponsesBody(
|
|
105
|
+
{ ...req, tools: [read] },
|
|
106
|
+
{ hostedTools: [{ type: 'web_search' }] },
|
|
107
|
+
);
|
|
108
|
+
expect(body.tools).toEqual([
|
|
109
|
+
expect.objectContaining({ type: 'function', name: 'Read' }),
|
|
110
|
+
{ type: 'web_search' },
|
|
111
|
+
]);
|
|
112
|
+
});
|
|
95
113
|
});
|
package/src/translate.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
zodToJsonSchema,
|
|
3
|
+
type HostedTool,
|
|
4
|
+
type ProviderMessage,
|
|
5
|
+
type ProviderRequest,
|
|
6
|
+
type ToolDef,
|
|
7
|
+
} from '@moxxy/sdk';
|
|
2
8
|
|
|
3
9
|
/**
|
|
4
10
|
* Responses-API "input" item shape. We only emit the subset codex uses:
|
|
@@ -17,7 +23,7 @@ type ResponsesContent =
|
|
|
17
23
|
| { type: 'input_image'; image_url: string }
|
|
18
24
|
| { type: 'input_file'; filename?: string; file_data: string };
|
|
19
25
|
|
|
20
|
-
interface
|
|
26
|
+
interface ResponsesFunctionTool {
|
|
21
27
|
type: 'function';
|
|
22
28
|
name: string;
|
|
23
29
|
description: string;
|
|
@@ -25,6 +31,8 @@ interface ResponsesTool {
|
|
|
25
31
|
strict?: boolean;
|
|
26
32
|
}
|
|
27
33
|
|
|
34
|
+
type ResponsesTool = ResponsesFunctionTool | { type: 'web_search' };
|
|
35
|
+
|
|
28
36
|
export interface ResponsesBody {
|
|
29
37
|
model: string;
|
|
30
38
|
instructions?: string;
|
|
@@ -142,7 +150,7 @@ export function toResponsesInput(messages: ReadonlyArray<ProviderMessage>): Resp
|
|
|
142
150
|
return out;
|
|
143
151
|
}
|
|
144
152
|
|
|
145
|
-
export function toResponsesTools(tools: ReadonlyArray<ToolDef>):
|
|
153
|
+
export function toResponsesTools(tools: ReadonlyArray<ToolDef>): ResponsesFunctionTool[] {
|
|
146
154
|
return tools.map((t) => ({
|
|
147
155
|
type: 'function' as const,
|
|
148
156
|
name: t.name,
|
|
@@ -154,6 +162,7 @@ export function toResponsesTools(tools: ReadonlyArray<ToolDef>): ResponsesTool[]
|
|
|
154
162
|
export interface BuildBodyOptions {
|
|
155
163
|
readonly sessionHint?: string;
|
|
156
164
|
readonly reasoningEffort?: 'low' | 'medium' | 'high';
|
|
165
|
+
readonly hostedTools?: ReadonlyArray<HostedTool>;
|
|
157
166
|
}
|
|
158
167
|
|
|
159
168
|
/**
|
|
@@ -216,7 +225,11 @@ export function toResponsesBody(req: ProviderRequest, opts: BuildBodyOptions = {
|
|
|
216
225
|
reasoning: { effort: opts.reasoningEffort ?? 'medium', summary: 'auto' },
|
|
217
226
|
include: ['reasoning.encrypted_content'],
|
|
218
227
|
};
|
|
219
|
-
|
|
228
|
+
const tools: ResponsesTool[] = req.tools ? toResponsesTools(req.tools) : [];
|
|
229
|
+
for (const hosted of opts.hostedTools ?? []) {
|
|
230
|
+
if (hosted.type === 'web_search') tools.push({ type: 'web_search' });
|
|
231
|
+
}
|
|
232
|
+
if (tools.length > 0) body.tools = tools;
|
|
220
233
|
if (opts.sessionHint) body.prompt_cache_key = opts.sessionHint;
|
|
221
234
|
if (req.maxTokens !== undefined) noteMaxTokensUnsupported();
|
|
222
235
|
if (req.temperature !== undefined) noteTemperatureUnsupported();
|