manifest 5.44.0 → 5.45.1
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/backend/analytics/services/message-details.service.js +1 -0
- package/dist/backend/analytics/services/messages-query.service.js +1 -0
- package/dist/backend/common/middleware/http-error-logger.middleware.js +19 -0
- package/dist/backend/database/database.module.js +2 -0
- package/dist/backend/database/migrations/1775000000000-AddErrorHttpStatus.js +18 -0
- package/dist/backend/entities/agent-message.entity.js +5 -0
- package/dist/backend/main.js +2 -1
- package/dist/backend/public-stats/public-stats.service.js +23 -6
- package/dist/backend/routing/proxy/proxy-message-recorder.js +2 -0
- package/dist/backend/routing/proxy/proxy-response-handler.js +1 -1
- package/dist/index.js +14 -8
- package/dist/openclaw.plugin.json +1 -1
- package/dist/server.d.ts +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/public/assets/{Account-zQzvTzY5.js → Account-C5g6WhPe.js} +1 -1
- package/public/assets/{AuthBadge-zJLfTd7g.js → AuthBadge-Dj2KkXRW.js} +1 -1
- package/public/assets/{ConnectProvider-CijtACuN.js → ConnectProvider-axzk92LC.js} +1 -1
- package/public/assets/{CopyButton-DlLfDy-9.js → CopyButton-BWMVlK2w.js} +1 -1
- package/public/assets/{FreeModels-CxCyPQ1u.js → FreeModels-D14GhDL_.js} +1 -1
- package/public/assets/{Help-CR2U5i6U.js → Help-ifWIlcDo.js} +1 -1
- package/public/assets/{Limits-BFY5lLxN.js → Limits-Xgc4xTl5.js} +1 -1
- package/public/assets/{Login-BdBBgvkK.js → Login-DMXD4PMZ.js} +1 -1
- package/public/assets/{MessageLog-DnWLFpnv.js → MessageLog-DoriYlHo.js} +1 -1
- package/public/assets/{ModelPrices-B5e9PrSU.js → ModelPrices-MhBT_7Zb.js} +1 -1
- package/public/assets/Overview-Bi9FuoLx.js +1 -0
- package/public/assets/{Pagination-Ctujg2Tx.js → Pagination-D8BOkffh.js} +1 -1
- package/public/assets/ProviderTokens-Cu2RUqQG.js +1 -0
- package/public/assets/{Register-DSkxK2OW.js → Register-CrovWG_d.js} +1 -1
- package/public/assets/{ResetPassword-t4R6xn-I.js → ResetPassword-C6B1ubhL.js} +1 -1
- package/public/assets/{Routing-Otvyer_1.js → Routing-B-On2pvv.js} +1 -1
- package/public/assets/{Settings-DB4Cb5ot.js → Settings-BH-xNoID.js} +1 -1
- package/public/assets/{SetupStepAddProvider-D3OEzrCA.js → SetupStepAddProvider-CSNkQmoC.js} +2 -2
- package/public/assets/{SocialButtons-CEq5n4xZ.js → SocialButtons-DudwEJ6b.js} +1 -1
- package/public/assets/{auth-DmX5tAfx.js → auth-CU91cd7V.js} +1 -1
- package/public/assets/chart-utils-DTt1NOye.js +1 -0
- package/public/assets/index-C4Qw7vZo.js +2 -0
- package/public/assets/{index-nVifXYeY.css → index-DhaXpWfr.css} +1 -1
- package/public/assets/{model-display-C1JaCTzE.js → model-display-DHwvDtl4.js} +1 -1
- package/public/assets/{overview-CheX4llv.js → overview-DKLGwfLs.js} +1 -1
- package/public/assets/{routing-DEZq9Ja8.js → routing-CLLAl6kl.js} +1 -1
- package/public/assets/{routing-utils-DH67yPsd.js → routing-utils-CHapjwyd.js} +1 -1
- package/public/assets/{vendor-pl6Q4jbW.js → vendor-C-Y5oNOq.js} +1 -1
- package/public/index.html +4 -4
- package/public/assets/Overview-DRj_bQH9.js +0 -1
- package/public/assets/index-onE2M38p.js +0 -2
|
@@ -79,6 +79,7 @@ let MessageDetailsService = class MessageDetailsService {
|
|
|
79
79
|
model: message.model,
|
|
80
80
|
status: message.status,
|
|
81
81
|
error_message: message.error_message,
|
|
82
|
+
error_http_status: message.error_http_status,
|
|
82
83
|
description: message.description,
|
|
83
84
|
service_type: message.service_type,
|
|
84
85
|
input_tokens: message.input_tokens,
|
|
@@ -93,6 +93,7 @@ let MessagesQueryService = class MessagesQueryService {
|
|
|
93
93
|
.addSelect('at.cache_creation_tokens', 'cache_creation_tokens')
|
|
94
94
|
.addSelect('at.duration_ms', 'duration_ms')
|
|
95
95
|
.addSelect('at.error_message', 'error_message')
|
|
96
|
+
.addSelect('at.error_http_status', 'error_http_status')
|
|
96
97
|
.addSelect('at.auth_type', 'auth_type')
|
|
97
98
|
.addSelect('at.fallback_from_model', 'fallback_from_model')
|
|
98
99
|
.addSelect('at.fallback_index', 'fallback_index');
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpErrorLogger = httpErrorLogger;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const logger = new common_1.Logger('HttpErrors');
|
|
6
|
+
function httpErrorLogger(req, res, next) {
|
|
7
|
+
const start = Date.now();
|
|
8
|
+
res.on('finish', () => {
|
|
9
|
+
if (res.statusCode < 400)
|
|
10
|
+
return;
|
|
11
|
+
const elapsed = Date.now() - start;
|
|
12
|
+
const ua = (req.headers['user-agent'] ?? '').slice(0, 120);
|
|
13
|
+
const ip = req.headers['x-forwarded-for'] ?? req.ip ?? '';
|
|
14
|
+
const forwardedIp = Array.isArray(ip) ? ip[0] : ip;
|
|
15
|
+
logger.warn(`${res.statusCode} ${req.method} ${req.originalUrl} ${elapsed}ms ip=${forwardedIp} ua=${ua}`);
|
|
16
|
+
});
|
|
17
|
+
next();
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=http-error-logger.middleware.js.map
|
|
@@ -73,6 +73,7 @@ const _1773800000000_FixNegativeCosts_1 = require("./migrations/1773800000000-Fi
|
|
|
73
73
|
const _1773900000000_AddKeyPrefixIndex_1 = require("./migrations/1773900000000-AddKeyPrefixIndex");
|
|
74
74
|
const _1774000000000_WidenKeyHashColumn_1 = require("./migrations/1774000000000-WidenKeyHashColumn");
|
|
75
75
|
const _1774896789000_WidenApiKeyColumn_1 = require("./migrations/1774896789000-WidenApiKeyColumn");
|
|
76
|
+
const _1775000000000_AddErrorHttpStatus_1 = require("./migrations/1775000000000-AddErrorHttpStatus");
|
|
76
77
|
const entities = [
|
|
77
78
|
agent_message_entity_1.AgentMessage,
|
|
78
79
|
llm_call_entity_1.LlmCall,
|
|
@@ -133,6 +134,7 @@ const migrations = [
|
|
|
133
134
|
_1773900000000_AddKeyPrefixIndex_1.AddKeyPrefixIndex1773900000000,
|
|
134
135
|
_1774000000000_WidenKeyHashColumn_1.WidenKeyHashColumn1774000000000,
|
|
135
136
|
_1774896789000_WidenApiKeyColumn_1.WidenApiKeyColumn1774896789000,
|
|
137
|
+
_1775000000000_AddErrorHttpStatus_1.AddErrorHttpStatus1775000000000,
|
|
136
138
|
];
|
|
137
139
|
const isLocalMode = process.env['MANIFEST_MODE'] === 'local';
|
|
138
140
|
function buildModeServices() {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AddErrorHttpStatus1775000000000 = void 0;
|
|
4
|
+
const typeorm_1 = require("typeorm");
|
|
5
|
+
class AddErrorHttpStatus1775000000000 {
|
|
6
|
+
async up(queryRunner) {
|
|
7
|
+
await queryRunner.addColumn('agent_messages', new typeorm_1.TableColumn({
|
|
8
|
+
name: 'error_http_status',
|
|
9
|
+
type: 'integer',
|
|
10
|
+
isNullable: true,
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
13
|
+
async down(queryRunner) {
|
|
14
|
+
await queryRunner.dropColumn('agent_messages', 'error_http_status');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.AddErrorHttpStatus1775000000000 = AddErrorHttpStatus1775000000000;
|
|
18
|
+
//# sourceMappingURL=1775000000000-AddErrorHttpStatus.js.map
|
|
@@ -28,6 +28,7 @@ let AgentMessage = class AgentMessage {
|
|
|
28
28
|
cost_usd;
|
|
29
29
|
status;
|
|
30
30
|
error_message;
|
|
31
|
+
error_http_status;
|
|
31
32
|
description;
|
|
32
33
|
service_type;
|
|
33
34
|
agent_name;
|
|
@@ -101,6 +102,10 @@ __decorate([
|
|
|
101
102
|
(0, typeorm_1.Column)('varchar', { nullable: true }),
|
|
102
103
|
__metadata("design:type", Object)
|
|
103
104
|
], AgentMessage.prototype, "error_message", void 0);
|
|
105
|
+
__decorate([
|
|
106
|
+
(0, typeorm_1.Column)('integer', { nullable: true }),
|
|
107
|
+
__metadata("design:type", Object)
|
|
108
|
+
], AgentMessage.prototype, "error_http_status", void 0);
|
|
104
109
|
__decorate([
|
|
105
110
|
(0, typeorm_1.Column)('varchar', { nullable: true }),
|
|
106
111
|
__metadata("design:type", Object)
|
package/dist/backend/main.js
CHANGED
|
@@ -46,6 +46,7 @@ const app_module_1 = require("./app.module");
|
|
|
46
46
|
const auth_instance_1 = require("./auth/auth.instance");
|
|
47
47
|
const local_mode_constants_1 = require("./common/constants/local-mode.constants");
|
|
48
48
|
const spa_fallback_filter_1 = require("./common/filters/spa-fallback.filter");
|
|
49
|
+
const http_error_logger_middleware_1 = require("./common/middleware/http-error-logger.middleware");
|
|
49
50
|
const local_ip_1 = require("./common/utils/local-ip");
|
|
50
51
|
async function bootstrap() {
|
|
51
52
|
const logger = new common_1.Logger('Bootstrap');
|
|
@@ -82,9 +83,9 @@ async function bootstrap() {
|
|
|
82
83
|
app.useGlobalPipes(new common_1.ValidationPipe({
|
|
83
84
|
transform: true,
|
|
84
85
|
whitelist: true,
|
|
85
|
-
forbidNonWhitelisted: true,
|
|
86
86
|
}));
|
|
87
87
|
const expressApp = app.getHttpAdapter().getInstance();
|
|
88
|
+
expressApp.use(http_error_logger_middleware_1.httpErrorLogger);
|
|
88
89
|
if (!isDev && process.env['MANIFEST_MODE'] !== 'local') {
|
|
89
90
|
expressApp.set('trust proxy', 1);
|
|
90
91
|
}
|
|
@@ -127,11 +127,14 @@ let PublicStatsService = class PublicStatsService {
|
|
|
127
127
|
.createQueryBuilder('at')
|
|
128
128
|
.select('at.model', 'model')
|
|
129
129
|
.addSelect(dateBucket, 'date')
|
|
130
|
+
.addSelect('at.auth_type', 'auth_type')
|
|
130
131
|
.addSelect('SUM(at.input_tokens + at.output_tokens)', 'tokens')
|
|
132
|
+
.addSelect('SUM(at.cost_usd)', 'cost')
|
|
131
133
|
.where('at.model IS NOT NULL')
|
|
132
134
|
.andWhere('at.timestamp >= :cutoff30d', { cutoff30d })
|
|
133
135
|
.groupBy('at.model')
|
|
134
136
|
.addGroupBy('date')
|
|
137
|
+
.addGroupBy('at.auth_type')
|
|
135
138
|
.orderBy('date', 'ASC')
|
|
136
139
|
.getRawMany();
|
|
137
140
|
const modelMap = new Map();
|
|
@@ -143,17 +146,29 @@ let PublicStatsService = class PublicStatsService {
|
|
|
143
146
|
const provider = pricing?.provider || 'Unknown';
|
|
144
147
|
if (EXCLUDED_PROVIDERS.has(provider))
|
|
145
148
|
continue;
|
|
146
|
-
|
|
149
|
+
const key = `${modelName}:${r.auth_type ?? ''}`;
|
|
150
|
+
let entry = modelMap.get(key);
|
|
147
151
|
if (!entry) {
|
|
148
|
-
entry = {
|
|
149
|
-
|
|
152
|
+
entry = {
|
|
153
|
+
modelName,
|
|
154
|
+
provider,
|
|
155
|
+
authType: r.auth_type ?? null,
|
|
156
|
+
total: 0,
|
|
157
|
+
cost: null,
|
|
158
|
+
daily: new Map(),
|
|
159
|
+
};
|
|
160
|
+
modelMap.set(key, entry);
|
|
150
161
|
}
|
|
151
162
|
const tokens = Number(r.tokens ?? 0);
|
|
152
163
|
entry.total += tokens;
|
|
153
|
-
|
|
164
|
+
const rowCost = r.cost != null ? Number(r.cost) : null;
|
|
165
|
+
if (rowCost != null) {
|
|
166
|
+
entry.cost = (entry.cost ?? 0) + rowCost;
|
|
167
|
+
}
|
|
168
|
+
entry.daily.set(r.date, (entry.daily.get(r.date) ?? 0) + tokens);
|
|
154
169
|
}
|
|
155
170
|
const providerMap = new Map();
|
|
156
|
-
for (const [
|
|
171
|
+
for (const [, entry] of modelMap) {
|
|
157
172
|
let prov = providerMap.get(entry.provider);
|
|
158
173
|
if (!prov) {
|
|
159
174
|
prov = { total: 0, models: [] };
|
|
@@ -161,8 +176,10 @@ let PublicStatsService = class PublicStatsService {
|
|
|
161
176
|
}
|
|
162
177
|
prov.total += entry.total;
|
|
163
178
|
prov.models.push({
|
|
164
|
-
model: modelName,
|
|
179
|
+
model: entry.modelName,
|
|
180
|
+
auth_type: entry.authType,
|
|
165
181
|
total_tokens: entry.total,
|
|
182
|
+
total_cost: entry.cost,
|
|
166
183
|
daily: Array.from(entry.daily.entries())
|
|
167
184
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
168
185
|
.map(([date, tokens]) => ({ date, tokens })),
|
|
@@ -69,6 +69,7 @@ let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
|
69
69
|
timestamp: new Date().toISOString(),
|
|
70
70
|
status: messageStatus,
|
|
71
71
|
error_message: errorMessage.slice(0, 2000),
|
|
72
|
+
error_http_status: httpStatus,
|
|
72
73
|
agent_name: ctx.agentName,
|
|
73
74
|
model: model ?? null,
|
|
74
75
|
routing_tier: tier ?? null,
|
|
@@ -105,6 +106,7 @@ let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
|
105
106
|
timestamp: ts,
|
|
106
107
|
status,
|
|
107
108
|
error_message: f.errorBody.slice(0, 2000),
|
|
109
|
+
error_http_status: f.status,
|
|
108
110
|
agent_name: ctx.agentName,
|
|
109
111
|
model: f.model,
|
|
110
112
|
routing_tier: tier,
|
|
@@ -43,7 +43,7 @@ async function handleProviderError(res, ctx, meta, metaHeaders, errorStatus, err
|
|
|
43
43
|
authType: meta.auth_type,
|
|
44
44
|
})
|
|
45
45
|
.catch((e) => logger.warn(`Failed to record provider error: ${e}`));
|
|
46
|
-
logger.warn(`Upstream error ${errorStatus}:
|
|
46
|
+
logger.warn(`Upstream error ${errorStatus}: provider=${meta.provider} model=${meta.model} tier=${meta.tier} body=${errorBody.slice(0, 500)}`);
|
|
47
47
|
res.status(errorStatus);
|
|
48
48
|
setHeaders(res, metaHeaders);
|
|
49
49
|
res.json({
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
/* manifest-local — OpenClaw Self-Hosted LLM Router */
|
|
2
|
-
"use strict";var
|
|
2
|
+
"use strict";var d=require("fs"),l=require("path"),m=require("os"),u=(0,l.join)((0,m.homedir)(),".openclaw","manifest"),p=3e3;async function g(i,t){try{let e=await fetch(`http://${i}:${t}/api/v1/health`,{signal:AbortSignal.timeout(p)});if(!e.ok)return!1;let n=await e.json();return n!==null&&typeof n=="object"&&"status"in n&&n.status==="healthy"}catch{return!1}}function h(i,t,e,n){(0,d.existsSync)(u)||(0,d.mkdirSync)(u,{recursive:!0,mode:448});let a=(0,l.join)(u,"manifest.db");n.debug("[manifest] Starting embedded server...");let o;try{o=require("./server")}catch(c){let s=c instanceof Error?c.message:String(c);n.error(`[manifest] Failed to load embedded server.
|
|
3
3
|
Error: ${s}
|
|
4
|
-
This is a packaging error \u2014 please reinstall the manifest plugin.`);return}
|
|
5
|
-
|
|
4
|
+
This is a packaging error \u2014 please reinstall the manifest plugin.`);return}let r=async()=>{if(n.debug("[manifest] Service start callback invoked"),await g(e,t)){n.info(`
|
|
5
|
+
[\u{1F99A} Manifest] Dashboard: http://${e}:${t}
|
|
6
|
+
[\u{1F99A} Manifest] Reusing existing server.
|
|
7
|
+
[\u{1F99A} Manifest] Open the dashboard to connect a provider and start routing.`);return}try{await o.start({port:t,host:e,dbPath:a,quiet:!0}),await g(e,t)?(n.info(`
|
|
8
|
+
[\u{1F99A} Manifest] Dashboard: http://${e}:${t}
|
|
9
|
+
[\u{1F99A} Manifest] The embedded server is running.
|
|
10
|
+
[\u{1F99A} Manifest] Open the dashboard to connect a provider and start routing.`),n.debug(`[manifest] DB: ${a}`)):(n.warn??n.info)(`[manifest] Server started but health check failed.
|
|
11
|
+
The dashboard may not be accessible at http://${e}:${t}`)}catch(s){let f=s instanceof Error?s.message:String(s);f.includes("EADDRINUSE")||f.includes("address already in use")?await g(e,t)?n.info(`
|
|
12
|
+
[\u{1F99A} Manifest] Dashboard: http://${e}:${t}
|
|
13
|
+
[\u{1F99A} Manifest] Reusing existing server.
|
|
14
|
+
[\u{1F99A} Manifest] Open the dashboard to connect a provider and start routing.`):n.error(`[manifest] Port ${t} is already in use by another process.
|
|
6
15
|
Change it with: openclaw config set plugins.entries.manifest.config.port ${t+1}
|
|
7
|
-
Then restart the gateway.`):n.error(`[manifest] Failed to start local server: ${
|
|
16
|
+
Then restart the gateway.`):n.error(`[manifest] Failed to start local server: ${f}
|
|
8
17
|
Try reinstalling: openclaw plugins install manifest
|
|
9
|
-
Then restart: openclaw gateway restart`)}}})}module.exports={id:"manifest",name:"Manifest Self-Hosted LLM Router",register(i){let t=i.logger||{info:(...r)=>console.log(...r),debug:()=>{},error:(...r)=>console.error(...r),warn:(...r)=>console.warn(...r)},e=i.pluginConfig||{},n=e&&typeof e=="object"&&"config"in e&&e.config!=null&&typeof e.config=="object"?e.config:e,a=typeof n.port=="number"&&n.port>0?n.port:2099,o=typeof n.host=="string"&&n.host.length>0?n.host:"127.0.0.1";t.info(
|
|
10
|
-
[\u{1F99A} Manifest] Dashboard: http://${o}:${a}
|
|
11
|
-
[\u{1F99A} Manifest] The plugin starts an embedded server.
|
|
12
|
-
[\u{1F99A} Manifest] Open the dashboard to connect a provider and start routing.`),m(i,a,o,t)}};
|
|
18
|
+
Then restart: openclaw gateway restart`)}};i.registerService({id:"manifest",start:r}),r().catch(()=>{})}module.exports={id:"manifest",name:"Manifest Self-Hosted LLM Router",register(i){let t=i.logger||{info:(...r)=>console.log(...r),debug:()=>{},error:(...r)=>console.error(...r),warn:(...r)=>console.warn(...r)},e=i.pluginConfig||{},n=e&&typeof e=="object"&&"config"in e&&e.config!=null&&typeof e.config=="object"?e.config:e,a=typeof n.port=="number"&&n.port>0?n.port:2099,o=typeof n.host=="string"&&n.host.length>0?n.host:"127.0.0.1";t.info("[\u{1F99A} Manifest] Loading embedded server..."),h(i,a,o,t)}};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "manifest",
|
|
3
3
|
"name": "Manifest Self-Hosted LLM Router",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.45.1",
|
|
5
5
|
"description": "Run the Manifest LLM router locally with SQLite. Zero-config dashboard included.",
|
|
6
6
|
"author": "MNFST Inc.",
|
|
7
7
|
"homepage": "https://manifest.build",
|
package/dist/server.d.ts
CHANGED
package/openclaw.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "manifest",
|
|
3
3
|
"name": "Manifest Self-Hosted LLM Router",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.45.1",
|
|
5
5
|
"description": "Run the Manifest LLM router locally with SQLite. Zero-config dashboard included.",
|
|
6
6
|
"author": "MNFST Inc.",
|
|
7
7
|
"homepage": "https://manifest.build",
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as H,a as b,e as R,i as c,g as h,T as V,M as W,h as d,m as Z,s as F,S as L,t as r,d as G}from"./vendor-
|
|
1
|
+
import{b as H,a as b,e as R,i as c,g as h,T as V,M as W,h as d,m as Z,s as F,S as L,t as r,d as G}from"./vendor-C-Y5oNOq.js";import{s as J,u as K,v as O,d as E,w as D}from"./index-C4Qw7vZo.js";import"./auth-CU91cd7V.js";var Q=r("<h3 class=settings-section__title>Profile information"),X=r('<div class=settings-card><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Display name</span><span class=settings-card__label-desc>Name shown throughout the dashboard.</span></div><div class=settings-card__control><input class=settings-card__input type=text aria-label="Display name"readonly></div></div><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Email</span><span class=settings-card__label-desc>Used for account notifications and limit alerts.</span></div><div class=settings-card__control><input class=settings-card__input type=email aria-label=Email readonly></div></div><div class=settings-card__footer><span style=font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))>Profile information is managed through your authentication provider.'),ee=r("<h3 class=settings-section__title>Workspace"),te=r("<div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Your unique workspace identifier. You may need this for support requests or advanced integrations.</p><div class=settings-card__id-row><code class=settings-card__id-value></code><button class=settings-card__copy-btn title=Copy>"),se=r("<h3 class=settings-section__title>Profile"),ie=r('<div class=settings-card><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Display name</span><span class=settings-card__label-desc>Name shown throughout the dashboard.</span></div><div class=settings-card__control><input class=settings-card__input type=text aria-label="Display name"placeholder="Local User">'),ae=r('<div class=account-modal><div class=account-modal__inner><button class=account-modal__back><svg width=16 height=16 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="m15 18-6-6 6-6"></path></svg>Back</button><div class=page-header><div><h1>Account Preferences</h1><span class=breadcrumb>Your profile, workspace details, and display preferences</span></div></div><h3 class=settings-section__title>Appearance</h3><div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Choose how Manifest looks for you.</p><div class=theme-picker><button class=theme-picker__option><svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><circle cx=12 cy=12 r=4></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg>Light</button><button class=theme-picker__option><svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path></svg>Dark</button><button class=theme-picker__option><svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><rect x=2 y=3 width=20 height=14 rx=2></rect><path d="M8 21h8"></path><path d="M12 17v4"></path></svg>System'),re=r('<svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><polyline points="20 6 9 17 4 12">'),le=r('<svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><rect x=9 y=9 width=13 height=13 rx=2></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">');const de=()=>{const N=H(),p=J.useSession(),[w,y]=b(!1),[_,g]=b("system"),[u,C]=b(""),T=()=>p()?.data?.user?.name??"",B=()=>p()?.data?.user?.email??"",x=()=>p()?.data?.user?.id??"";R(()=>{K(),C(O()||"Local User");const t=localStorage.getItem("theme");g(t==="dark"||t==="light"?t:"system")});const m=t=>{if(g(t),t==="system"){localStorage.removeItem("theme");const o=window.matchMedia("(prefers-color-scheme: dark)").matches;document.documentElement.classList.toggle("dark",o)}else localStorage.setItem("theme",t),document.documentElement.classList.toggle("dark",t==="dark")},j=()=>{navigator.clipboard.writeText(x()),y(!0),setTimeout(()=>y(!1),2e3)};return(()=>{var t=ae(),o=t.firstChild,S=o.firstChild,I=S.nextSibling,v=I.nextSibling,A=v.nextSibling,P=A.firstChild,U=P.firstChild,Y=U.nextSibling,k=Y.firstChild,f=k.nextSibling,M=f.nextSibling;return c(t,h(V,{children:"Account Preferences - Manifest"}),o),c(t,h(W,{name:"description",content:"Manage your profile, workspace, and theme preferences."}),o),S.$$click=()=>N(-1),c(o,h(L,{get when(){return!E()},get children(){return[Q(),(()=>{var e=X(),i=e.firstChild,l=i.firstChild,n=l.nextSibling,a=n.firstChild,s=i.nextSibling,$=s.firstChild,q=$.nextSibling,z=q.firstChild;return d(()=>a.value=T()),d(()=>z.value=B()),e})(),ee(),(()=>{var e=te(),i=e.firstChild,l=i.firstChild,n=l.nextSibling,a=n.firstChild,s=a.nextSibling;return c(a,x),s.$$click=j,c(s,(()=>{var $=Z(()=>!!w());return()=>$()?re():le()})()),d(()=>F(s,"aria-label",w()?"Copied":"Copy workspace ID")),e})()]}}),v),c(o,h(L,{get when(){return E()},get children(){return[se(),(()=>{var e=ie(),i=e.firstChild,l=i.firstChild,n=l.nextSibling,a=n.firstChild;return a.$$keydown=s=>{s.key==="Enter"&&(D(u()),s.currentTarget.blur())},a.addEventListener("blur",()=>D(u())),a.$$input=s=>C(s.currentTarget.value),d(()=>a.value=u()),e})()]}}),v),k.$$click=()=>m("light"),f.$$click=()=>m("dark"),M.$$click=()=>m("system"),d(e=>{var i=_()==="light",l=_()==="dark",n=_()==="system";return i!==e.e&&k.classList.toggle("theme-picker__option--active",e.e=i),l!==e.t&&f.classList.toggle("theme-picker__option--active",e.t=l),n!==e.a&&M.classList.toggle("theme-picker__option--active",e.a=n),e},{e:void 0,t:void 0,a:void 0}),t})()};G(["click","input","keydown"]);export{de as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{q as l,
|
|
1
|
+
import{q as l,z as a,i as u,t as o,s as i}from"./vendor-C-Y5oNOq.js";var p=o('<svg viewBox="2 1 20 22"fill=none stroke=currentColor stroke-width=3 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path><circle cx=12 cy=7 r=4>'),d=o('<svg viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=3 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="m21 2-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0 3 3L22 7l-3-3m-3.5 3.5L19 4">'),s=o("<span aria-label=Subscription>"),h=o('<span aria-label="API Key">');const c=e=>(()=>{var r=p();return i(r,"width",e),i(r,"height",e),r})(),v=e=>(()=>{var r=d();return i(r,"width",e),i(r,"height",e),r})();function $(e){return e==="subscription"?"Subscription":"API Key"}function m(e,r){const n=r<=8?" provider-auth-badge--overlay":"";return e==="subscription"?(()=>{var t=s();return l(t,`provider-auth-badge provider-auth-badge--sub${n}`),a(t,"width",`${r}px`),a(t,"height",`${r}px`),u(t,()=>c(r*.58)),t})():e==="api_key"?(()=>{var t=h();return l(t,`provider-auth-badge provider-auth-badge--key${n}`),a(t,"width",`${r}px`),a(t,"height",`${r}px`),u(t,()=>v(r*.58)),t})():null}export{m as a,$ as b};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as _,D as $,a as b,k as w,i as c,g as u,F as S,m as C,S as y,t as g,d as A}from"./vendor-
|
|
1
|
+
import{b as _,D as $,a as b,k as w,i as c,g as u,F as S,m as C,S as y,t as g,d as A}from"./vendor-C-Y5oNOq.js";import{x as k,y as U,n as P}from"./index-C4Qw7vZo.js";import"./auth-CU91cd7V.js";var K=g('<div class=panel style="max-width:440px;margin:0 auto;padding:32px"><h2 style="margin:0 0 8px">Select an agent</h2><p style="color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);margin:0 0 24px">Which agent should this provider be added to?</p><div style=display:flex;flex-direction:column;gap:8px>'),R=g("<div style=display:flex;align-items:center;justify-content:center;min-height:200px><span class=spinner role=status aria-label=Loading style=width:24px;height:24px>"),j=g("<div class=container--sm style=padding-top:80px>"),z=g('<button class="btn btn--outline"style=justify-content:flex-start;text-align:left>');const D=()=>{const p=_(),[s]=$(),[f,h]=b(!1),r=t=>Array.isArray(t)?t[0]:t,m=t=>{const e=new URLSearchParams,d=r(s.provider)||"custom";e.set("provider",d);const i=r(s.name),o=r(s.baseUrl),a=r(s.apiKey),n=r(s.models);return i&&e.set("name",i),o&&e.set("baseUrl",o),a&&e.set("apiKey",a),n&&e.set("models",n),`/agents/${encodeURIComponent(t)}/routing?${e.toString()}`},x=async()=>{h(!0);try{const e=(await U("my-agent"))?.agent?.name??"my-agent";P(e),p(m(e),{replace:!0})}catch{h(!1)}},[l]=w(async()=>{const e=(await k())?.agents??[];return e.length===1&&e[0]?p(m(e[0].agent_name),{replace:!0}):e.length===0&&await x(),e}),v=t=>{p(m(t),{replace:!0})};return(()=>{var t=j();return c(t,u(y,{get when(){return C(()=>!l.loading)()&&(l()?.length??0)>1},get children(){var e=K(),d=e.firstChild,i=d.nextSibling,o=i.nextSibling;return c(o,u(S,{get each(){return l()},children:a=>(()=>{var n=z();return n.$$click=()=>v(a.agent_name),c(n,()=>a.display_name??a.agent_name),n})()})),e}}),null),c(t,u(y,{get when(){return l.loading||f()||(l()?.length??0)<=1},get children(){return R()}}),null),t})()};A(["click"]);export{D as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as o,i as d,m as p,h,s as u,t,d as m}from"./vendor-
|
|
1
|
+
import{a as o,i as d,m as p,h,s as u,t,d as m}from"./vendor-C-Y5oNOq.js";var f=t("<button class=modal-terminal__copy title=Copy>"),y=t('<svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 aria-hidden=true><polyline points="20 6 9 17 4 12">'),v=t('<svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 aria-hidden=true><rect x=9 y=9 width=13 height=13 rx=2 ry=2></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1">');const w=s=>{const[a,r]=o(!1),[l,i]=o(!1),n=async()=>{try{await navigator.clipboard.writeText(s.text),r(!0),setTimeout(()=>r(!1),2e3)}catch{i(!0),setTimeout(()=>i(!1),2e3)}};return(()=>{var e=f();return e.$$click=n,d(e,(()=>{var c=p(()=>!!a());return()=>c()?y():v()})()),h(()=>u(e,"aria-label",a()?"Copied":l()?"Copy failed":"Copy to clipboard")),e})()};m(["click"]);export{w as C};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,g as n,T as N,M as F,m as U,h as y,s as z,F as C,a as R,C as q,S as L,t as o,n as A,d as B}from"./vendor-pl6Q4jbW.js";import{b as G,t as I}from"./index-onE2M38p.js";import"./auth-DmX5tAfx.js";var D=o('<svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true style=margin-left:4px><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>'),E=o('<button class="btn btn--outline btn--sm"aria-label="Copy to clipboard"style="padding:2px 8px;font-size:var(--font-size-xs)">'),H=o('<a class="btn btn--primary btn--sm"style=text-decoration:none>Connect '),O=o("<div class=container--lg><div class=page-header><div><h1>Free Models</h1><span class=breadcrumb>Cloud providers offering free API access for </span></div></div><div style=display:flex;flex-direction:column;gap:10px;margin-bottom:24px><div style=display:flex;align-items:center;gap:10px><span style=display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:hsl(var(--primary));color:hsl(var(--primary-foreground));font-size:var(--font-size-xs);font-weight:600;flex-shrink:0>1</span><span style=font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))>Get your free API key from the provider website</span></div><div style=display:flex;align-items:center;gap:10px><span style=display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:hsl(var(--primary));color:hsl(var(--primary-foreground));font-size:var(--font-size-xs);font-weight:600;flex-shrink:0>2</span><span style=font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))>Hit the provider Connect button, paste your key, and validate the connection</span></div><div style=display:flex;align-items:center;gap:10px><span style=display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:hsl(var(--primary));color:hsl(var(--primary-foreground));font-size:var(--font-size-xs);font-weight:600;flex-shrink:0>3</span><span style=font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))>Done! The provider models are now included in your routing. Customize tiers and preferences from the routing page."),V=o('<div class=panel style=margin-bottom:24px><div style=display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:8px><h2 style=margin:0;font-size:var(--font-size-lg);display:flex;align-items:center;gap:8px></h2><div style=display:flex;gap:8px;flex-shrink:0><a target=_blank rel="noopener noreferrer"class="btn btn--outline btn--sm"style=text-decoration:none>Get API key</a></div></div><div style=display:flex;align-items:center;gap:20px;margin-bottom:16px;flex-wrap:wrap>'),J=o("<img alt style=height:20px>"),Q=o("<span style=display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-sm);color:hsl(var(--foreground));white-space:nowrap><span style=width:5px;height:5px;border-radius:50%;background:hsl(var(--foreground));flex-shrink:0>"),W=o('<div class=free-models-base-url-row><div style=display:flex;align-items:center;gap:8px;min-width:0><span style=font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));flex-shrink:0>Base URL:</span><code style="font-family:var(--font-mono);font-size:var(--font-size-xs);background:hsl(var(--muted) / 0.5);padding:4px 8px;border-radius:var(--radius);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0"></code></div><button style=display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-sm);color:hsl(var(--foreground));padding:0;background:none;border:none;cursor:pointer;white-space:nowrap;margin-left:auto;font-weight:500><img src=/icons/caret-down.svg alt class=free-models-caret>'),X=o('<div style="display:flex;align-items:flex-start;gap:8px;padding:10px 14px;border-radius:var(--radius);background:#f7f5ed;margin-top:16px;margin-bottom:16px;font-size:var(--font-size-sm)"><svg xmlns=http://www.w3.org/2000/svg width=16 height=16 fill=currentColor viewBox="0 0 24 24"style=flex-shrink:0;color:hsl(var(--primary));margin-top:1px><path d="M12 17c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1s-1 .45-1 1v4c0 .55.45 1 1 1M12 7a1 1 0 1 0 0 2 1 1 0 1 0 0-2"></path><path d="M12 22c5.51 0 10-4.49 10-10S17.51 2 12 2 2 6.49 2 12s4.49 10 10 10m0-18c4.41 0 8 3.59 8 8s-3.59 8-8 8-8-3.59-8-8 3.59-8 8-8"></path></svg><span style="color:hsl(var(--foreground) / 0.8)">'),Y=o("<div class=free-models-accordion><div><table class=data-table><colgroup><col style=width:36%><col style=width:12%><col style=width:14%><col style=width:16%><col style=width:22%></colgroup><thead><tr><th>Model Name</th><th>Context</th><th>Max Output</th><th>Modality</th><th>Rate Limit</th></tr></thead><tbody>"),Z=o("<tr><td style=font-family:var(--font-mono);font-size:var(--font-size-xs)></td><td style=font-size:var(--font-size-sm)></td><td style=font-size:var(--font-size-sm)></td><td style=font-size:var(--font-size-sm)></td><td style=font-size:var(--font-size-sm)>");const ee=[{name:"Cohere",logo:"/icons/cohere.svg",description:"",tags:["Up to 1,000 calls/month","No credit card required"],apiKeyUrl:"https://dashboard.cohere.com/api-keys",baseUrl:"https://api.cohere.ai/compatibility/v1",warning:"Trial keys cannot be used for production or commercial workloads. Data may be used for training.",models:[{model_id:"command-a-03-2025",context:"256K",max_output:"8K",modality:"Text",trial_rate_limit:"20 req / min"},{model_id:"command-a-reasoning-08-2025",context:"256K",max_output:"32K",modality:"Text",trial_rate_limit:"20 req / min"}]},{name:"Gemini",logo:"/icons/gemini.svg",description:"",tags:["250K TPM (Tokens / Minute) shared across models","No credit card required"],apiKeyUrl:"https://aistudio.google.com/apikey",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai/",warning:"Rate limits apply per Google Cloud project, not per API key. On the free tier, prompts and responses may be used to improve Google products.",models:[{model_id:"gemini-2.5-pro",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"5 req / min"},{model_id:"gemini-2.5-flash",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"10 req / min"},{model_id:"gemini-2.5-flash-lite",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"15 req / min"},{model_id:"gemini-3-flash-preview",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"Preview limits"},{model_id:"gemini-3.1-flash-lite-preview",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"Preview limits"}]},{name:"Kilo Code",logo:"/icons/kilocode.jpg",description:"",tags:["No credit card required"],apiKeyUrl:"https://app.kilo.ai/profile",baseUrl:"https://api.kilo.ai/api/gateway",warning:"Prompts and outputs are logged on free models to improve provider products.",models:[{model_id:"qwen/qwen3.6-plus:free",context:"1M",max_output:"65K",modality:"Text + Image + Video",trial_rate_limit:"~200 req / hr"},{model_id:"nvidia/nemotron-3-super-120b-a12b:free",context:"262K",max_output:"262K",modality:"Text",trial_rate_limit:"~200 req / hr"},{model_id:"stepfun/step-3.5-flash:free",context:"256K",max_output:"256K",modality:"Text",trial_rate_limit:"~200 req / hr"},{model_id:"corethink:free",context:"78K",max_output:"8K",modality:"Text",trial_rate_limit:"~200 req / hr"}]}],te=()=>D(),ie=r=>{const[a,m]=R(!1),f=async()=>{try{await navigator.clipboard.writeText(r.text),m(!0),I.success("Copied to clipboard"),setTimeout(()=>m(!1),2e3)}catch{I.error("Failed to copy")}};return(()=>{var l=E();return l.$$click=f,e(l,()=>a()?"Copied":"Copy"),l})()},re=r=>{const a=A(),m=()=>decodeURIComponent(a.agentName),f=()=>r.provider.models.map(t=>`${t.model_id}:0:0`).join(","),l=()=>`/agents/${encodeURIComponent(m())}/routing?provider=custom&name=${encodeURIComponent(r.provider.name)}&baseUrl=${encodeURIComponent(r.provider.baseUrl)}&models=${encodeURIComponent(f())}`;return(()=>{var t=H();return t.firstChild,e(t,()=>r.provider.name,null),y(()=>z(t,"href",l())),t})()},le=()=>(()=>{var r=O(),a=r.firstChild,m=a.firstChild,f=m.firstChild,l=f.nextSibling;return l.firstChild,a.nextSibling,e(r,n(N,{children:"Free Models - Manifest"}),a),e(r,n(F,{name:"description",content:"Free LLM models you can use with Manifest. No credit card required."}),a),e(l,()=>G()??"your agent",null),e(r,n(C,{each:ee,children:t=>(()=>{var _=V(),k=_.firstChild,b=k.firstChild,M=b.nextSibling,w=M.firstChild;w.firstChild;var P=k.nextSibling;return e(b,(()=>{var d=U(()=>!!t.logo);return()=>d()&&(()=>{var s=J();return y(()=>z(s,"src",t.logo)),s})()})(),null),e(b,()=>t.name,null),e(w,n(te,{}),null),e(M,n(re,{provider:t}),null),e(P,n(C,{get each(){return t.tags??[]},children:d=>(()=>{var s=Q();return s.firstChild,e(s,d,null),s})()})),e(_,()=>{const[d,s]=R(!0);return[(()=>{var c=W(),g=c.firstChild,u=g.firstChild,$=u.nextSibling,x=g.nextSibling,v=x.firstChild;return e($,()=>t.baseUrl),e(g,n(ie,{get text(){return t.baseUrl}}),null),x.$$click=()=>s(i=>!i),e(x,(()=>{var i=U(()=>!!d());return()=>i()?"Hide models":`Show models (${t.models.length})`})(),v),y(i=>q(v,`width: 20px; height: 20px; transition: transform 250ms ease; transform: rotate(${d()?"180deg":"0deg"});`,i)),c})(),(()=>{var c=Y(),g=c.firstChild,u=g.firstChild,$=u.firstChild,x=$.nextSibling,v=x.nextSibling;return e(g,n(L,{get when(){return t.warning},get children(){var i=X(),p=i.firstChild,h=p.nextSibling;return e(h,()=>t.warning),i}}),u),e(v,n(C,{get each(){return t.models},children:i=>(()=>{var p=Z(),h=p.firstChild,K=h.nextSibling,S=K.nextSibling,T=S.nextSibling,j=T.nextSibling;return e(h,()=>i.model_id),e(K,()=>i.context),e(S,()=>i.max_output),e(T,()=>i.modality),e(j,()=>i.trial_rate_limit),p})()})),y(i=>{var p=!!d(),h=`table-layout: fixed; width: 100%;${t.warning?"":" margin-top: 16px;"}`;return p!==i.e&&c.classList.toggle("free-models-accordion--open",i.e=p),i.t=q(u,h,i.t),i},{e:void 0,t:void 0}),c})()]},null),y(()=>z(w,"href",t.apiKeyUrl)),_})()}),null),r})();B(["click"]);export{le as default};
|
|
1
|
+
import{i as e,g as n,T as N,M as F,m as U,h as y,s as z,F as C,a as R,B as q,S as B,t as o,n as L,d as A}from"./vendor-C-Y5oNOq.js";import{b as G,t as I}from"./index-C4Qw7vZo.js";import"./auth-CU91cd7V.js";var D=o('<svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true style=margin-left:4px><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>'),E=o('<button class="btn btn--outline btn--sm"aria-label="Copy to clipboard"style="padding:2px 8px;font-size:var(--font-size-xs)">'),H=o('<a class="btn btn--primary btn--sm"style=text-decoration:none>Connect '),O=o("<div class=container--lg><div class=page-header><div><h1>Free Models</h1><span class=breadcrumb>Cloud providers offering free API access for </span></div></div><div style=display:flex;flex-direction:column;gap:10px;margin-bottom:24px><div style=display:flex;align-items:center;gap:10px><span style=display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:hsl(var(--primary));color:hsl(var(--primary-foreground));font-size:var(--font-size-xs);font-weight:600;flex-shrink:0>1</span><span style=font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))>Get your free API key from the provider website</span></div><div style=display:flex;align-items:center;gap:10px><span style=display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:hsl(var(--primary));color:hsl(var(--primary-foreground));font-size:var(--font-size-xs);font-weight:600;flex-shrink:0>2</span><span style=font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))>Hit the provider Connect button, paste your key, and validate the connection</span></div><div style=display:flex;align-items:center;gap:10px><span style=display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:hsl(var(--primary));color:hsl(var(--primary-foreground));font-size:var(--font-size-xs);font-weight:600;flex-shrink:0>3</span><span style=font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))>Done! The provider models are now included in your routing. Customize tiers and preferences from the routing page."),V=o('<div class=panel style=margin-bottom:24px><div style=display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:8px><h2 style=margin:0;font-size:var(--font-size-lg);display:flex;align-items:center;gap:8px></h2><div style=display:flex;gap:8px;flex-shrink:0><a target=_blank rel="noopener noreferrer"class="btn btn--outline btn--sm"style=text-decoration:none>Get API key</a></div></div><div style=display:flex;align-items:center;gap:20px;margin-bottom:16px;flex-wrap:wrap>'),J=o("<img alt style=height:20px>"),Q=o("<span style=display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-sm);color:hsl(var(--foreground));white-space:nowrap><span style=width:5px;height:5px;border-radius:50%;background:hsl(var(--foreground));flex-shrink:0>"),W=o('<div class=free-models-base-url-row><div style=display:flex;align-items:center;gap:8px;min-width:0><span style=font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));flex-shrink:0>Base URL:</span><code style="font-family:var(--font-mono);font-size:var(--font-size-xs);background:hsl(var(--muted) / 0.5);padding:4px 8px;border-radius:var(--radius);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0"></code></div><button style=display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-sm);color:hsl(var(--foreground));padding:0;background:none;border:none;cursor:pointer;white-space:nowrap;margin-left:auto;font-weight:500><img src=/icons/caret-down.svg alt class=free-models-caret>'),X=o('<div style="display:flex;align-items:flex-start;gap:8px;padding:10px 14px;border-radius:var(--radius);background:#f7f5ed;margin-top:16px;margin-bottom:16px;font-size:var(--font-size-sm)"><svg xmlns=http://www.w3.org/2000/svg width=16 height=16 fill=currentColor viewBox="0 0 24 24"style=flex-shrink:0;color:hsl(var(--primary));margin-top:1px><path d="M12 17c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1s-1 .45-1 1v4c0 .55.45 1 1 1M12 7a1 1 0 1 0 0 2 1 1 0 1 0 0-2"></path><path d="M12 22c5.51 0 10-4.49 10-10S17.51 2 12 2 2 6.49 2 12s4.49 10 10 10m0-18c4.41 0 8 3.59 8 8s-3.59 8-8 8-8-3.59-8-8 3.59-8 8-8"></path></svg><span style="color:hsl(var(--foreground) / 0.8)">'),Y=o("<div class=free-models-accordion><div><table class=data-table><colgroup><col style=width:36%><col style=width:12%><col style=width:14%><col style=width:16%><col style=width:22%></colgroup><thead><tr><th>Model Name</th><th>Context</th><th>Max Output</th><th>Modality</th><th>Rate Limit</th></tr></thead><tbody>"),Z=o("<tr><td style=font-family:var(--font-mono);font-size:var(--font-size-xs)></td><td style=font-size:var(--font-size-sm)></td><td style=font-size:var(--font-size-sm)></td><td style=font-size:var(--font-size-sm)></td><td style=font-size:var(--font-size-sm)>");const ee=[{name:"Cohere",logo:"/icons/cohere.svg",description:"",tags:["Up to 1,000 calls/month","No credit card required"],apiKeyUrl:"https://dashboard.cohere.com/api-keys",baseUrl:"https://api.cohere.ai/compatibility/v1",warning:"Trial keys cannot be used for production or commercial workloads. Data may be used for training.",models:[{model_id:"command-a-03-2025",context:"256K",max_output:"8K",modality:"Text",trial_rate_limit:"20 req / min"},{model_id:"command-a-reasoning-08-2025",context:"256K",max_output:"32K",modality:"Text",trial_rate_limit:"20 req / min"}]},{name:"Gemini",logo:"/icons/gemini.svg",description:"",tags:["250K TPM (Tokens / Minute) shared across models","No credit card required"],apiKeyUrl:"https://aistudio.google.com/apikey",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai/",warning:"Rate limits apply per Google Cloud project, not per API key. On the free tier, prompts and responses may be used to improve Google products.",models:[{model_id:"gemini-2.5-pro",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"5 req / min"},{model_id:"gemini-2.5-flash",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"10 req / min"},{model_id:"gemini-2.5-flash-lite",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"15 req / min"},{model_id:"gemini-3-flash-preview",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"Preview limits"},{model_id:"gemini-3.1-flash-lite-preview",context:"1M",max_output:"64K",modality:"Text",trial_rate_limit:"Preview limits"}]},{name:"Kilo Code",logo:"/icons/kilocode.jpg",description:"",tags:["No credit card required"],apiKeyUrl:"https://app.kilo.ai/profile",baseUrl:"https://api.kilo.ai/api/gateway",warning:"Prompts and outputs are logged on free models to improve provider products.",models:[{model_id:"qwen/qwen3.6-plus:free",context:"1M",max_output:"65K",modality:"Text + Image + Video",trial_rate_limit:"~200 req / hr"},{model_id:"nvidia/nemotron-3-super-120b-a12b:free",context:"262K",max_output:"262K",modality:"Text",trial_rate_limit:"~200 req / hr"},{model_id:"stepfun/step-3.5-flash:free",context:"256K",max_output:"256K",modality:"Text",trial_rate_limit:"~200 req / hr"},{model_id:"corethink:free",context:"78K",max_output:"8K",modality:"Text",trial_rate_limit:"~200 req / hr"}]}],te=()=>D(),ie=r=>{const[a,m]=R(!1),f=async()=>{try{await navigator.clipboard.writeText(r.text),m(!0),I.success("Copied to clipboard"),setTimeout(()=>m(!1),2e3)}catch{I.error("Failed to copy")}};return(()=>{var l=E();return l.$$click=f,e(l,()=>a()?"Copied":"Copy"),l})()},re=r=>{const a=L(),m=()=>decodeURIComponent(a.agentName),f=()=>r.provider.models.map(t=>`${t.model_id}:0:0`).join(","),l=()=>`/agents/${encodeURIComponent(m())}/routing?provider=custom&name=${encodeURIComponent(r.provider.name)}&baseUrl=${encodeURIComponent(r.provider.baseUrl)}&models=${encodeURIComponent(f())}`;return(()=>{var t=H();return t.firstChild,e(t,()=>r.provider.name,null),y(()=>z(t,"href",l())),t})()},le=()=>(()=>{var r=O(),a=r.firstChild,m=a.firstChild,f=m.firstChild,l=f.nextSibling;return l.firstChild,a.nextSibling,e(r,n(N,{children:"Free Models - Manifest"}),a),e(r,n(F,{name:"description",content:"Free LLM models you can use with Manifest. No credit card required."}),a),e(l,()=>G()??"your agent",null),e(r,n(C,{each:ee,children:t=>(()=>{var _=V(),k=_.firstChild,b=k.firstChild,M=b.nextSibling,w=M.firstChild;w.firstChild;var P=k.nextSibling;return e(b,(()=>{var d=U(()=>!!t.logo);return()=>d()&&(()=>{var s=J();return y(()=>z(s,"src",t.logo)),s})()})(),null),e(b,()=>t.name,null),e(w,n(te,{}),null),e(M,n(re,{provider:t}),null),e(P,n(C,{get each(){return t.tags??[]},children:d=>(()=>{var s=Q();return s.firstChild,e(s,d,null),s})()})),e(_,()=>{const[d,s]=R(!0);return[(()=>{var c=W(),g=c.firstChild,u=g.firstChild,$=u.nextSibling,x=g.nextSibling,v=x.firstChild;return e($,()=>t.baseUrl),e(g,n(ie,{get text(){return t.baseUrl}}),null),x.$$click=()=>s(i=>!i),e(x,(()=>{var i=U(()=>!!d());return()=>i()?"Hide models":`Show models (${t.models.length})`})(),v),y(i=>q(v,`width: 20px; height: 20px; transition: transform 250ms ease; transform: rotate(${d()?"180deg":"0deg"});`,i)),c})(),(()=>{var c=Y(),g=c.firstChild,u=g.firstChild,$=u.firstChild,x=$.nextSibling,v=x.nextSibling;return e(g,n(B,{get when(){return t.warning},get children(){var i=X(),p=i.firstChild,h=p.nextSibling;return e(h,()=>t.warning),i}}),u),e(v,n(C,{get each(){return t.models},children:i=>(()=>{var p=Z(),h=p.firstChild,K=h.nextSibling,S=K.nextSibling,T=S.nextSibling,j=T.nextSibling;return e(h,()=>i.model_id),e(K,()=>i.context),e(S,()=>i.max_output),e(T,()=>i.modality),e(j,()=>i.trial_rate_limit),p})()})),y(i=>{var p=!!d(),h=`table-layout: fixed; width: 100%;${t.warning?"":" margin-top: 16px;"}`;return p!==i.e&&c.classList.toggle("free-models-accordion--open",i.e=p),i.t=q(u,h,i.t),i},{e:void 0,t:void 0}),c})()]},null),y(()=>z(w,"href",t.apiKeyUrl)),_})()}),null),r})();A(["click"]);export{le as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as s,g as a,T as n,M as i,t as l}from"./vendor-
|
|
1
|
+
import{i as s,g as a,T as n,M as i,t as l}from"./vendor-C-Y5oNOq.js";var r=l(`<div class=container--sm><div class=page-header><div><h1>Help & Support</h1><span class=breadcrumb>Questions or issues? Reach out and we'll get back to you quickly</span></div></div><div class=settings-card><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Schedule a Call</span><span class=settings-card__label-desc>Book a 30-min call with us to get help setting things up.</span></div><div class=settings-card__control><a href="https://calendly.com/sebastien-manifest/30min?month=2026-02"target=_blank rel="noopener noreferrer"class="btn btn--outline btn--sm"style=text-decoration:none>Book<svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true style=margin-left:4px><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3></line></svg></a></div></div><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Email Support</span><span class=settings-card__label-desc>sebastien@manifest.build — we typically respond within 24 hours.</span></div><div class=settings-card__control><a href=mailto:sebastien@manifest.build class="btn btn--outline btn--sm"style=text-decoration:none>Contact<svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true style=margin-left:4px><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6">`);const c=()=>(()=>{var t=r(),e=t.firstChild;return s(t,a(n,{children:"Help & Support - Manifest"}),e),s(t,a(i,{name:"description",content:"Get help with Manifest. Schedule a call or contact support."}),e),t})();export{c as default};
|