neoagent 2.3.1-beta.97 → 2.3.1-beta.99
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/.env.example +4 -4
- package/package.json +1 -1
- package/server/public/.last_build_id +1 -1
- package/server/public/flutter_bootstrap.js +1 -1
- package/server/public/main.dart.js +4 -4
- package/server/services/ai/models.js +8 -2
- package/server/services/ai/providers/openaiCodex.js +22 -8
- package/server/services/ai/settings.js +2 -2
package/.env.example
CHANGED
|
@@ -116,9 +116,9 @@ MINIMAX_API_KEY=your-minimax-api-key-here
|
|
|
116
116
|
# Set via: neoagent login github-copilot
|
|
117
117
|
GITHUB_COPILOT_ACCESS_TOKEN=
|
|
118
118
|
|
|
119
|
-
# OpenAI Codex
|
|
120
|
-
# • Codex-backed chat/coding models (gpt-5.
|
|
121
|
-
#
|
|
119
|
+
# OpenAI Codex API key or Codex access token — used for:
|
|
120
|
+
# • Codex-backed chat/coding models (gpt-5.5, gpt-5.4, gpt-5.4-mini)
|
|
121
|
+
# API-key usage goes through the normal OpenAI Responses API endpoint.
|
|
122
122
|
OPENAI_CODEX_ACCESS_TOKEN=
|
|
123
123
|
# Optional refresh token if your login flow returns it.
|
|
124
124
|
OPENAI_CODEX_REFRESH_TOKEN=
|
|
@@ -130,7 +130,7 @@ OPENAI_CODEX_REFRESH_TOKEN=
|
|
|
130
130
|
# OPENAI_BASE_URL=https://your-openai-compatible-endpoint/v1
|
|
131
131
|
# ANTHROPIC_BASE_URL=https://your-anthropic-compatible-endpoint
|
|
132
132
|
# XAI_BASE_URL=https://api.x.ai/v1
|
|
133
|
-
# OPENAI_CODEX_BASE_URL=https://
|
|
133
|
+
# OPENAI_CODEX_BASE_URL=https://api.openai.com/v1
|
|
134
134
|
# OPENAI_CODEX_EDITOR_VERSION=vscode/1.99.0
|
|
135
135
|
# OPENAI_CODEX_EDITOR_PLUGIN_VERSION=neoagent/1.0.0
|
|
136
136
|
# OPENAI_CODEX_USER_AGENT=NeoAgent/1.0.0
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
1f7fbbbdae35e424bcbd5adf22601df0
|
|
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"42d3d75a56efe1a2e9902f52dc8006099c45d9
|
|
|
37
37
|
|
|
38
38
|
_flutter.loader.load({
|
|
39
39
|
serviceWorkerSettings: {
|
|
40
|
-
serviceWorkerVersion: "
|
|
40
|
+
serviceWorkerVersion: "141828066" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
|
|
41
41
|
}
|
|
42
42
|
});
|
|
@@ -129338,7 +129338,7 @@ r===$&&A.b()
|
|
|
129338
129338
|
o.push(A.ii(p,A.iY(!1,new A.a3(B.tM,A.dT(new A.cI(B.he,new A.a5V(r,p),p),p,p),p),!1,B.I,!0),p,p,0,0,0,p))}r=!1
|
|
129339
129339
|
if(!s.ay)if(!s.ch){r=s.e
|
|
129340
129340
|
r===$&&A.b()
|
|
129341
|
-
r=B.b.t("
|
|
129341
|
+
r=B.b.t("mp9znmhn-185109e").length!==0&&r.b}if(r){r=s.d
|
|
129342
129342
|
r===$&&A.b()
|
|
129343
129343
|
r=r.ag&&!r.V?84:0
|
|
129344
129344
|
q=s.e
|
|
@@ -134146,7 +134146,7 @@ $S:236}
|
|
|
134146
134146
|
A.Ys.prototype={}
|
|
134147
134147
|
A.Rr.prototype={
|
|
134148
134148
|
mT(a){var s=this
|
|
134149
|
-
if(B.b.t("
|
|
134149
|
+
if(B.b.t("mp9znmhn-185109e").length===0||s.a!=null)return
|
|
134150
134150
|
s.A5()
|
|
134151
134151
|
s.a=A.q1(B.PP,new A.b58(s))},
|
|
134152
134152
|
A5(){var s=0,r=A.l(t.H),q,p=2,o=[],n=this,m,l,k,j,i,h,g,f
|
|
@@ -134164,7 +134164,7 @@ if(!t.f.b(k)){s=1
|
|
|
134164
134164
|
break}i=J.Z(k,"buildId")
|
|
134165
134165
|
h=i==null?null:B.b.t(J.r(i))
|
|
134166
134166
|
j=h==null?"":h
|
|
134167
|
-
if(J.bm(j)===0||J.d(j,"
|
|
134167
|
+
if(J.bm(j)===0||J.d(j,"mp9znmhn-185109e")){s=1
|
|
134168
134168
|
break}n.b=!0
|
|
134169
134169
|
n.D()
|
|
134170
134170
|
p=2
|
|
@@ -134181,7 +134181,7 @@ case 2:return A.i(o.at(-1),r)}})
|
|
|
134181
134181
|
return A.k($async$A5,r)},
|
|
134182
134182
|
vb(){var s=0,r=A.l(t.H),q,p=2,o=[],n=this,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1
|
|
134183
134183
|
var $async$vb=A.h(function(a2,a3){if(a2===1){o.push(a3)
|
|
134184
|
-
s=p}for(;;)switch(s){case 0:if(B.b.t("
|
|
134184
|
+
s=p}for(;;)switch(s){case 0:if(B.b.t("mp9znmhn-185109e").length===0||n.c){s=1
|
|
134185
134185
|
break}n.c=!0
|
|
134186
134186
|
n.D()
|
|
134187
134187
|
p=4
|
|
@@ -31,8 +31,8 @@ const STATIC_MODELS = [
|
|
|
31
31
|
purpose: 'coding'
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
|
-
id: 'gpt-5.
|
|
35
|
-
label: 'GPT-5.
|
|
34
|
+
id: 'gpt-5.5',
|
|
35
|
+
label: 'GPT-5.5 (Codex Default)',
|
|
36
36
|
provider: 'openai-codex',
|
|
37
37
|
purpose: 'general'
|
|
38
38
|
},
|
|
@@ -42,6 +42,12 @@ const STATIC_MODELS = [
|
|
|
42
42
|
provider: 'openai-codex',
|
|
43
43
|
purpose: 'coding'
|
|
44
44
|
},
|
|
45
|
+
{
|
|
46
|
+
id: 'gpt-5.4',
|
|
47
|
+
label: 'GPT-5.4 (Codex Fallback)',
|
|
48
|
+
provider: 'openai-codex',
|
|
49
|
+
purpose: 'general'
|
|
50
|
+
},
|
|
45
51
|
{
|
|
46
52
|
id: 'gpt-5-nano',
|
|
47
53
|
label: 'GPT-5 Nano (Fast / Subagents)',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const OpenAI = require('openai');
|
|
2
2
|
const { BaseProvider } = require('./base');
|
|
3
3
|
|
|
4
|
-
const DEFAULT_BASE_URL = 'https://
|
|
4
|
+
const DEFAULT_BASE_URL = 'https://api.openai.com/v1';
|
|
5
5
|
|
|
6
6
|
function normalizeContent(content) {
|
|
7
7
|
if (content == null) return '';
|
|
@@ -136,25 +136,40 @@ class OpenAICodexProvider extends BaseProvider {
|
|
|
136
136
|
|
|
137
137
|
this.name = 'openai-codex';
|
|
138
138
|
this.models = [
|
|
139
|
+
'gpt-5.5',
|
|
139
140
|
'gpt-5.4',
|
|
140
141
|
'gpt-5.4-mini',
|
|
141
142
|
];
|
|
142
143
|
this.reasoningModels = new Set([
|
|
144
|
+
'gpt-5.5',
|
|
143
145
|
'gpt-5.4',
|
|
144
146
|
'gpt-5.4-mini',
|
|
145
|
-
'gpt-5.4-nano',
|
|
146
147
|
]);
|
|
148
|
+
const defaultHeaders = baseURL.includes('chatgpt.com/backend-api/codex')
|
|
149
|
+
? {
|
|
150
|
+
'Editor-Version': process.env.OPENAI_CODEX_EDITOR_VERSION || 'vscode/1.99.0',
|
|
151
|
+
'Editor-Plugin-Version': process.env.OPENAI_CODEX_EDITOR_PLUGIN_VERSION || 'neoagent/1.0.0',
|
|
152
|
+
'User-Agent': process.env.OPENAI_CODEX_USER_AGENT || 'NeoAgent/1.0.0',
|
|
153
|
+
}
|
|
154
|
+
: undefined;
|
|
155
|
+
|
|
147
156
|
this.client = new OpenAI({
|
|
148
157
|
apiKey: config.apiKey || process.env.OPENAI_CODEX_ACCESS_TOKEN,
|
|
149
158
|
baseURL,
|
|
150
|
-
defaultHeaders
|
|
151
|
-
'Editor-Version': process.env.OPENAI_CODEX_EDITOR_VERSION || 'vscode/1.99.0',
|
|
152
|
-
'Editor-Plugin-Version': process.env.OPENAI_CODEX_EDITOR_PLUGIN_VERSION || 'neoagent/1.0.0',
|
|
153
|
-
'User-Agent': process.env.OPENAI_CODEX_USER_AGENT || 'NeoAgent/1.0.0',
|
|
154
|
-
},
|
|
159
|
+
defaultHeaders,
|
|
155
160
|
});
|
|
156
161
|
}
|
|
157
162
|
|
|
163
|
+
formatTools(tools) {
|
|
164
|
+
return tools.map((tool) => ({
|
|
165
|
+
type: 'function',
|
|
166
|
+
name: tool.name,
|
|
167
|
+
description: tool.description || '',
|
|
168
|
+
parameters: tool.parameters || { type: 'object', properties: {} },
|
|
169
|
+
strict: false,
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
|
|
158
173
|
_isReasoningModel(model) {
|
|
159
174
|
if (!model) return false;
|
|
160
175
|
for (const id of this.reasoningModels) {
|
|
@@ -200,7 +215,6 @@ class OpenAICodexProvider extends BaseProvider {
|
|
|
200
215
|
if (!name || !callId) continue;
|
|
201
216
|
input.push({
|
|
202
217
|
type: 'function_call',
|
|
203
|
-
id: callId,
|
|
204
218
|
call_id: callId,
|
|
205
219
|
name,
|
|
206
220
|
arguments: argumentsText,
|
|
@@ -72,12 +72,12 @@ const AI_PROVIDER_DEFINITIONS = Object.freeze({
|
|
|
72
72
|
'openai-codex': {
|
|
73
73
|
id: 'openai-codex',
|
|
74
74
|
label: 'OpenAI Codex',
|
|
75
|
-
description: 'Use
|
|
75
|
+
description: 'Use Codex models through OpenAI authentication.',
|
|
76
76
|
envKey: 'OPENAI_CODEX_ACCESS_TOKEN',
|
|
77
77
|
supportsApiKey: true,
|
|
78
78
|
supportsBaseUrl: true,
|
|
79
79
|
defaultEnabled: false,
|
|
80
|
-
defaultBaseUrl: 'https://
|
|
80
|
+
defaultBaseUrl: 'https://api.openai.com/v1'
|
|
81
81
|
},
|
|
82
82
|
ollama: {
|
|
83
83
|
id: 'ollama',
|