mppx 0.2.5 → 0.2.6
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/proxy/Proxy.d.ts +4 -0
- package/dist/proxy/Proxy.d.ts.map +1 -1
- package/dist/proxy/Proxy.js +4 -1
- package/dist/proxy/Proxy.js.map +1 -1
- package/dist/proxy/Service.d.ts +29 -6
- package/dist/proxy/Service.d.ts.map +1 -1
- package/dist/proxy/Service.js +49 -24
- package/dist/proxy/Service.js.map +1 -1
- package/dist/proxy/services/anthropic.d.ts.map +1 -1
- package/dist/proxy/services/anthropic.js +2 -0
- package/dist/proxy/services/anthropic.js.map +1 -1
- package/dist/proxy/services/openai.d.ts +1 -0
- package/dist/proxy/services/openai.d.ts.map +1 -1
- package/dist/proxy/services/openai.js +5 -0
- package/dist/proxy/services/openai.js.map +1 -1
- package/dist/proxy/services/stripe.d.ts.map +1 -1
- package/dist/proxy/services/stripe.js +5 -0
- package/dist/proxy/services/stripe.js.map +1 -1
- package/package.json +1 -1
- package/src/proxy/Proxy.test.ts +30 -10
- package/src/proxy/Proxy.ts +13 -3
- package/src/proxy/Service.ts +67 -27
- package/src/proxy/services/anthropic.ts +2 -0
- package/src/proxy/services/openai.ts +7 -0
- package/src/proxy/services/stripe.ts +6 -0
package/dist/proxy/Proxy.d.ts
CHANGED
|
@@ -38,10 +38,14 @@ export declare namespace create {
|
|
|
38
38
|
type Config = {
|
|
39
39
|
/** Base path prefix to strip before routing (e.g. `'/api/proxy'`). */
|
|
40
40
|
basePath?: string | undefined;
|
|
41
|
+
/** Short description of the proxy shown in `llms.txt`. */
|
|
42
|
+
description?: string | undefined;
|
|
41
43
|
/** Custom `fetch` implementation. Defaults to `globalThis.fetch`. */
|
|
42
44
|
fetch?: typeof globalThis.fetch | undefined;
|
|
43
45
|
/** Services to proxy. Each service is mounted at `/{serviceId}/`. */
|
|
44
46
|
services: Service.Service[];
|
|
47
|
+
/** Human-readable title for the proxy shown in `llms.txt`. */
|
|
48
|
+
title?: string | undefined;
|
|
45
49
|
};
|
|
46
50
|
}
|
|
47
51
|
//# sourceMappingURL=Proxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/Proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,WAAW,CAAA;AAKtC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC,kFAAkF;AAClF,MAAM,MAAM,KAAK,GAAG;IAClB,sFAAsF;IACtF,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9C,uFAAuF;IACvF,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI,CAAA;CACxE,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"Proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/Proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,WAAW,CAAA;AAKtC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC,kFAAkF;AAClF,MAAM,MAAM,KAAK,GAAG;IAClB,sFAAsF;IACtF,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9C,uFAAuF;IACvF,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI,CAAA;CACxE,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAsFnD;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,MAAM,GAAG;QACnB,sEAAsE;QACtE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B,0DAA0D;QAC1D,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAChC,qEAAqE;QACrE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,SAAS,CAAA;QAC3C,qEAAqE;QACrE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,CAAA;QAC3B,8DAA8D;QAC9D,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC3B,CAAA;CACF"}
|
package/dist/proxy/Proxy.js
CHANGED
|
@@ -45,7 +45,10 @@ export function create(config) {
|
|
|
45
45
|
if (!pathname)
|
|
46
46
|
return new Response('Not Found', { status: 404 });
|
|
47
47
|
if (request.method === 'GET' && pathname === '/llms.txt')
|
|
48
|
-
return new Response(Service.toLlmsTxt(config.services
|
|
48
|
+
return new Response(Service.toLlmsTxt(config.services, {
|
|
49
|
+
title: config.title,
|
|
50
|
+
description: config.description,
|
|
51
|
+
}), {
|
|
49
52
|
headers: { 'Content-Type': 'text/plain; charset=utf-8' },
|
|
50
53
|
});
|
|
51
54
|
if (request.method === 'GET' && (pathname === '/services' || pathname === '/services/'))
|
package/dist/proxy/Proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Proxy.js","sourceRoot":"","sources":["../../src/proxy/Proxy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAChD,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAC5C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAUvC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,MAAM,CAAC,MAAqB;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAA;IAElD,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,OAAO,EAAE;YACxC,KAAK,EAAE,SAAS;YAChB,mBAAmB,EAAE,KAAK;YAC1B,iBAAiB,EAAE,KAAK;SACzB,CAAC,CAAA;QACF,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAU,CAAA;IAC/C,CAAC,CAAC,CACH,CAAA;IAED,KAAK,UAAU,MAAM,CAAC,OAA2B;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAEhC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAErD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAEhE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ,KAAK,WAAW;YACtD,OAAO,IAAI,QAAQ,
|
|
1
|
+
{"version":3,"file":"Proxy.js","sourceRoot":"","sources":["../../src/proxy/Proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy/Service.d.ts
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
/** A proxied upstream service with route definitions and optional request/response hooks. */
|
|
2
2
|
export type Service = {
|
|
3
|
-
/** Unique identifier used as the URL prefix (e.g. `'openai'` → `/{id}/...`). */
|
|
4
|
-
id: string;
|
|
5
3
|
/** Base URL of the upstream service (e.g. `'https://api.openai.com'`). */
|
|
6
4
|
baseUrl: string;
|
|
7
|
-
/**
|
|
8
|
-
|
|
5
|
+
/** Short description of the service. */
|
|
6
|
+
description?: string | undefined;
|
|
7
|
+
/** Unique identifier used as the URL prefix (e.g. `'openai'` → `/{id}/...`). */
|
|
8
|
+
id: string;
|
|
9
|
+
/** Returns a documentation URL. Called with no argument for the service root, or with a route pattern for per-endpoint docs. */
|
|
10
|
+
docsLlmsUrl?: ((options: {
|
|
11
|
+
route?: string | undefined;
|
|
12
|
+
}) => string | undefined) | undefined;
|
|
9
13
|
/** Hook to modify the upstream request before sending (e.g. inject auth headers). */
|
|
10
14
|
rewriteRequest?: ((req: Request, ctx: Context) => Request | Promise<Request>) | undefined;
|
|
11
15
|
/** Hook to modify the upstream response before returning to the client. */
|
|
12
16
|
rewriteResponse?: ((res: Response, ctx: Context) => Response | Promise<Response>) | undefined;
|
|
17
|
+
/** Map of route patterns to endpoint handlers. */
|
|
18
|
+
routes: EndpointMap;
|
|
19
|
+
/** Human-readable title for the service (e.g. `'OpenAI'`). */
|
|
20
|
+
title?: string | undefined;
|
|
13
21
|
};
|
|
14
22
|
/**
|
|
15
23
|
* An endpoint definition.
|
|
@@ -71,30 +79,45 @@ export declare namespace from {
|
|
|
71
79
|
baseUrl: string;
|
|
72
80
|
/** Shorthand: inject `Authorization: Bearer {token}` header. */
|
|
73
81
|
bearer?: string | undefined;
|
|
82
|
+
/** Short description of the service. */
|
|
83
|
+
description?: string | undefined;
|
|
74
84
|
/** Shorthand: inject custom headers. */
|
|
75
85
|
headers?: Record<string, string> | undefined;
|
|
86
|
+
/** Documentation URL for the service. String for a static base URL, or a function receiving an optional endpoint pattern. */
|
|
87
|
+
docsLlmsUrl?: string | ((options: {
|
|
88
|
+
route?: string | undefined;
|
|
89
|
+
}) => string | undefined) | undefined;
|
|
76
90
|
/** Shorthand: full request mutation function. Takes priority over `bearer`/`headers`. */
|
|
77
91
|
mutate?: ((req: Request) => Request | Promise<Request>) | undefined;
|
|
78
92
|
/** Hook to modify the upstream request. Receives typed per-endpoint options via `ctx`. */
|
|
79
93
|
rewriteRequest?: ((req: Request, ctx: Context & Partial<options & {}>) => Request | Promise<Request>) | undefined;
|
|
80
94
|
/** Map of route patterns to endpoint definitions. */
|
|
81
95
|
routes: EndpointMap;
|
|
96
|
+
/** Human-readable title for the service. */
|
|
97
|
+
title?: string | undefined;
|
|
82
98
|
};
|
|
83
99
|
}
|
|
84
100
|
export { from as custom };
|
|
85
101
|
/** Serializes a service for discovery responses. */
|
|
86
102
|
export declare function serialize(s: Service): {
|
|
87
|
-
id: string;
|
|
88
103
|
baseUrl: string;
|
|
104
|
+
description: string | undefined;
|
|
105
|
+
id: string;
|
|
106
|
+
docsLlmsUrl: string | undefined;
|
|
89
107
|
routes: {
|
|
108
|
+
docsLlmsUrl: string | undefined;
|
|
90
109
|
method: string | undefined;
|
|
91
110
|
path: string;
|
|
92
111
|
pattern: string;
|
|
93
112
|
payment: Record<string, unknown> | null;
|
|
94
113
|
}[];
|
|
114
|
+
title: string | undefined;
|
|
95
115
|
};
|
|
96
116
|
/** Renders an llms.txt markdown string for a list of services. */
|
|
97
|
-
export declare function toLlmsTxt(services: Service[]
|
|
117
|
+
export declare function toLlmsTxt(services: Service[], options?: {
|
|
118
|
+
title?: string | undefined;
|
|
119
|
+
description?: string | undefined;
|
|
120
|
+
}): string;
|
|
98
121
|
/** Extracts per-endpoint options from an endpoint definition. */
|
|
99
122
|
export declare function getOptions(endpoint: Endpoint): EndpointOptions | undefined;
|
|
100
123
|
//# sourceMappingURL=Service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Service.d.ts","sourceRoot":"","sources":["../../src/proxy/Service.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,MAAM,MAAM,OAAO,GAAG;IACpB,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAA;IACV,
|
|
1
|
+
{"version":3,"file":"Service.d.ts","sourceRoot":"","sources":["../../src/proxy/Service.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy/Service.js
CHANGED
|
@@ -17,9 +17,12 @@ import { Value } from 'ox';
|
|
|
17
17
|
export function from(id, config) {
|
|
18
18
|
const rewriteFromConfig = resolveRewriteRequest(config);
|
|
19
19
|
return {
|
|
20
|
-
id,
|
|
21
20
|
baseUrl: config.baseUrl,
|
|
21
|
+
description: config.description,
|
|
22
|
+
id,
|
|
23
|
+
docsLlmsUrl: resolveLlmsUrl(config.docsLlmsUrl),
|
|
22
24
|
routes: config.routes,
|
|
25
|
+
title: config.title,
|
|
23
26
|
rewriteRequest: config.rewriteRequest
|
|
24
27
|
? rewriteFromConfig
|
|
25
28
|
? async (req, ctx) => {
|
|
@@ -63,26 +66,30 @@ function resolveRewriteRequest(config) {
|
|
|
63
66
|
/** Serializes a service for discovery responses. */
|
|
64
67
|
export function serialize(s) {
|
|
65
68
|
return {
|
|
66
|
-
id: s.id,
|
|
67
69
|
baseUrl: s.baseUrl,
|
|
70
|
+
description: s.description,
|
|
71
|
+
id: s.id,
|
|
72
|
+
docsLlmsUrl: s.docsLlmsUrl?.({}),
|
|
68
73
|
routes: Object.entries(s.routes).map(([pattern, endpoint]) => {
|
|
69
74
|
const tokens = pattern.trim().split(/\s+/);
|
|
70
75
|
const hasMethod = tokens.length >= 2;
|
|
71
76
|
return {
|
|
77
|
+
docsLlmsUrl: s.docsLlmsUrl?.({ route: pattern }),
|
|
72
78
|
method: hasMethod ? tokens[0] : undefined,
|
|
73
79
|
path: hasMethod ? tokens.slice(1).join(' ') : tokens[0],
|
|
74
80
|
pattern,
|
|
75
81
|
payment: endpoint ? resolvePayment(endpoint) : null,
|
|
76
82
|
};
|
|
77
83
|
}),
|
|
84
|
+
title: s.title,
|
|
78
85
|
};
|
|
79
86
|
}
|
|
80
87
|
/** Renders an llms.txt markdown string for a list of services. */
|
|
81
|
-
export function toLlmsTxt(services) {
|
|
88
|
+
export function toLlmsTxt(services, options) {
|
|
82
89
|
const lines = [
|
|
83
|
-
'
|
|
90
|
+
`# ${options?.title ?? 'API Proxy'}`,
|
|
84
91
|
'',
|
|
85
|
-
'
|
|
92
|
+
`> ${options?.description ?? 'Paid API proxy powered by [Machine Payments Protocol](https://mpp.tempo.xyz).'}`,
|
|
86
93
|
'',
|
|
87
94
|
'For machine-readable service data, use `GET /services` (JSON).',
|
|
88
95
|
'',
|
|
@@ -95,31 +102,42 @@ export function toLlmsTxt(services) {
|
|
|
95
102
|
const free = serialized.routes.filter((r) => r.payment === null).length;
|
|
96
103
|
const paid = serialized.routes.length - free;
|
|
97
104
|
const parts = [paid && `${paid} paid`, free && `${free} free`].filter(Boolean).join(', ');
|
|
98
|
-
|
|
105
|
+
const label = s.title ?? s.id;
|
|
106
|
+
const desc = s.description ? `: ${s.description} (${parts})` : `: ${parts}`;
|
|
107
|
+
lines.push(`- [${label}](${s.baseUrl})${desc}`);
|
|
99
108
|
}
|
|
100
109
|
for (const s of services) {
|
|
101
110
|
const serialized = serialize(s);
|
|
102
|
-
|
|
111
|
+
const docsLlmsUrl = s.docsLlmsUrl?.({});
|
|
112
|
+
lines.push('', `## ${s.title ?? s.id}`, '');
|
|
113
|
+
if (s.description)
|
|
114
|
+
lines.push(s.description, '');
|
|
115
|
+
if (docsLlmsUrl)
|
|
116
|
+
lines.push(`Documentation: ${docsLlmsUrl}`, '');
|
|
103
117
|
for (const route of serialized.routes) {
|
|
104
|
-
if (!route.payment) {
|
|
105
|
-
lines.push(`- \`${route.pattern}\`: Free`);
|
|
106
|
-
continue;
|
|
107
|
-
}
|
|
108
118
|
const p = route.payment;
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
119
|
+
const desc = p?.description ? ` - ${p.description}` : '';
|
|
120
|
+
lines.push(`- \`${route.pattern}\`${desc}`);
|
|
121
|
+
if (!p) {
|
|
122
|
+
lines.push(` - Type: free`);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
lines.push(` - Type: ${p.intent}`);
|
|
126
|
+
if (p.amount) {
|
|
127
|
+
const perUnit = p.unitType ? `/${p.unitType}` : '';
|
|
128
|
+
if (p.decimals !== undefined) {
|
|
129
|
+
const price = Number(p.amount) / 10 ** Number(p.decimals);
|
|
130
|
+
lines.push(` - Price: ${price}${perUnit} (${p.amount} units, ${p.decimals} decimals)`);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
lines.push(` - Units: ${p.amount}${perUnit}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (p.currency)
|
|
137
|
+
lines.push(` - Currency: ${p.currency}`);
|
|
113
138
|
}
|
|
114
|
-
if (
|
|
115
|
-
|
|
116
|
-
const meta = [
|
|
117
|
-
p.currency && `currency: ${p.currency}`,
|
|
118
|
-
p.decimals !== undefined && `decimals: ${p.decimals}`,
|
|
119
|
-
].filter(Boolean);
|
|
120
|
-
if (meta.length)
|
|
121
|
-
parts.push(`(${meta.join(', ')})`);
|
|
122
|
-
lines.push(`- \`${route.pattern}\`: ${parts.join(' — ')}`);
|
|
139
|
+
if (route.docsLlmsUrl)
|
|
140
|
+
lines.push(` - Docs: ${route.docsLlmsUrl}`);
|
|
123
141
|
}
|
|
124
142
|
}
|
|
125
143
|
return lines.join('\n');
|
|
@@ -144,4 +162,11 @@ function resolvePayment(endpoint) {
|
|
|
144
162
|
})();
|
|
145
163
|
return { intent, method: name, ...rest, ...(amount !== undefined && { amount }) };
|
|
146
164
|
}
|
|
165
|
+
function resolveLlmsUrl(input) {
|
|
166
|
+
if (!input)
|
|
167
|
+
return undefined;
|
|
168
|
+
if (typeof input === 'function')
|
|
169
|
+
return input;
|
|
170
|
+
return ({ route }) => (route ? undefined : input);
|
|
171
|
+
}
|
|
147
172
|
//# sourceMappingURL=Service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/proxy/Service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/proxy/Service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/proxy/services/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/proxy/services/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,mBAYjD;AAED,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,KAAY,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAChC,qDAAqD;QACrD,MAAM,EAAE,MAAM,CAAA;QACd,oEAAoE;QACpE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,MAAM,EACF,mBAAmB,GACnB,2BAA2B,GAC3B,0BAA0B,GAC1B,mCAAmC,GACnC,mBAAmB,CAAA;KACxB,CAAC,CAAA;CACH"}
|
|
@@ -19,12 +19,14 @@ import * as Service from '../Service.js';
|
|
|
19
19
|
export function anthropic(config) {
|
|
20
20
|
return Service.from('anthropic', {
|
|
21
21
|
baseUrl: config.baseUrl ?? 'https://api.anthropic.com',
|
|
22
|
+
description: 'Claude language models for messages and completions.',
|
|
22
23
|
rewriteRequest(request, ctx) {
|
|
23
24
|
const apiKey = ctx.apiKey ?? config.apiKey;
|
|
24
25
|
request.headers.set('x-api-key', apiKey);
|
|
25
26
|
return request;
|
|
26
27
|
},
|
|
27
28
|
routes: config.routes,
|
|
29
|
+
title: 'Anthropic',
|
|
28
30
|
});
|
|
29
31
|
}
|
|
30
32
|
//# sourceMappingURL=anthropic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/proxy/services/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,SAAS,CAAC,MAAwB;IAChD,OAAO,OAAO,CAAC,IAAI,CAAmB,WAAW,EAAE;QACjD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,2BAA2B;QACtD,cAAc,CAAC,OAAO,EAAE,GAAG;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;YAC1C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;YACxC,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/proxy/services/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,SAAS,CAAC,MAAwB;IAChD,OAAO,OAAO,CAAC,IAAI,CAAmB,WAAW,EAAE;QACjD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,2BAA2B;QACtD,WAAW,EAAE,sDAAsD;QACnE,cAAc,CAAC,OAAO,EAAE,GAAG;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;YAC1C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;YACxC,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,WAAW;KACnB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -23,6 +23,7 @@ export declare namespace openai {
|
|
|
23
23
|
apiKey: string;
|
|
24
24
|
/** Base URL override. Defaults to `'https://api.openai.com'`. */
|
|
25
25
|
baseUrl?: string | undefined;
|
|
26
|
+
/** Route definitions for OpenAI endpoints. */
|
|
26
27
|
routes: 'POST /v1/chat/completions' | 'POST /v1/completions' | 'POST /v1/embeddings' | 'POST /v1/images/generations' | 'POST /v1/images/edits' | 'POST /v1/images/variations' | 'POST /v1/audio/transcriptions' | 'POST /v1/audio/translations';
|
|
27
28
|
}>;
|
|
28
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/proxy/services/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/proxy/services/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,mBAgB3C;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAChC,8DAA8D;QAC9D,MAAM,EAAE,MAAM,CAAA;QACd,iEAAiE;QACjE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,8CAA8C;QAC9C,MAAM,EACF,2BAA2B,GAC3B,sBAAsB,GACtB,qBAAqB,GACrB,6BAA6B,GAC7B,uBAAuB,GACvB,4BAA4B,GAC5B,+BAA+B,GAC/B,6BAA6B,CAAA;KAClC,CAAC,CAAA;CACH"}
|
|
@@ -19,12 +19,17 @@ import * as Service from '../Service.js';
|
|
|
19
19
|
export function openai(config) {
|
|
20
20
|
return Service.from('openai', {
|
|
21
21
|
baseUrl: config.baseUrl ?? 'https://api.openai.com',
|
|
22
|
+
description: 'Chat completions, embeddings, image generation, and audio transcription.',
|
|
23
|
+
docsLlmsUrl: ({ route }) => route
|
|
24
|
+
? `https://context7.com/websites/platform_openai/llms.txt?topic=${encodeURIComponent(route)}`
|
|
25
|
+
: undefined,
|
|
22
26
|
rewriteRequest(request, ctx) {
|
|
23
27
|
const apiKey = ctx.apiKey ?? config.apiKey;
|
|
24
28
|
request.headers.set('Authorization', `Bearer ${apiKey}`);
|
|
25
29
|
return request;
|
|
26
30
|
},
|
|
27
31
|
routes: config.routes,
|
|
32
|
+
title: 'OpenAI',
|
|
28
33
|
});
|
|
29
34
|
}
|
|
30
35
|
//# sourceMappingURL=openai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/proxy/services/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,MAAM,CAAC,MAAqB;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAgB,QAAQ,EAAE;QAC3C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,wBAAwB;QACnD,cAAc,CAAC,OAAO,EAAE,GAAG;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;YAC1C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC,CAAA;YACxD,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/proxy/services/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,MAAM,CAAC,MAAqB;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAgB,QAAQ,EAAE;QAC3C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,wBAAwB;QACnD,WAAW,EAAE,0EAA0E;QACvF,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACzB,KAAK;YACH,CAAC,CAAC,gEAAgE,kBAAkB,CAAC,KAAK,CAAC,EAAE;YAC7F,CAAC,CAAC,SAAS;QACf,cAAc,CAAC,OAAO,EAAE,GAAG;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;YAC1C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC,CAAA;YACxD,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../../src/proxy/services/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../../src/proxy/services/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,mBAgB3C;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAChC,mDAAmD;QACnD,MAAM,EAAE,MAAM,CAAA;QACd,iEAAiE;QACjE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,MAAM,EACF,kBAAkB,GAClB,oBAAoB,GACpB,uBAAuB,GACvB,0BAA0B,GAC1B,6BAA6B,GAC7B,wBAAwB,GACxB,2BAA2B,GAC3B,mBAAmB,GACnB,sBAAsB,CAAA;KAC3B,CAAC,CAAA;CACH"}
|
|
@@ -19,12 +19,17 @@ import * as Service from '../Service.js';
|
|
|
19
19
|
export function stripe(config) {
|
|
20
20
|
return Service.from('stripe', {
|
|
21
21
|
baseUrl: config.baseUrl ?? 'https://api.stripe.com',
|
|
22
|
+
description: 'Payment processing, customers, subscriptions, and invoices.',
|
|
23
|
+
docsLlmsUrl: ({ route }) => route
|
|
24
|
+
? `https://context7.com/websites/stripe/llms.txt?topic=${encodeURIComponent(route)}`
|
|
25
|
+
: 'https://docs.stripe.com/llms.txt',
|
|
22
26
|
rewriteRequest(request, ctx) {
|
|
23
27
|
const apiKey = ctx.apiKey ?? config.apiKey;
|
|
24
28
|
request.headers.set('Authorization', `Basic ${btoa(`${apiKey}:`)}`);
|
|
25
29
|
return request;
|
|
26
30
|
},
|
|
27
31
|
routes: config.routes,
|
|
32
|
+
title: 'Stripe',
|
|
28
33
|
});
|
|
29
34
|
}
|
|
30
35
|
//# sourceMappingURL=stripe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../../src/proxy/services/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,MAAM,CAAC,MAAqB;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAgB,QAAQ,EAAE;QAC3C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,wBAAwB;QACnD,cAAc,CAAC,OAAO,EAAE,GAAG;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;YAC1C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;YACnE,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../../src/proxy/services/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,MAAM,CAAC,MAAqB;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAgB,QAAQ,EAAE;QAC3C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,wBAAwB;QACnD,WAAW,EAAE,6DAA6D;QAC1E,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACzB,KAAK;YACH,CAAC,CAAC,uDAAuD,kBAAkB,CAAC,KAAK,CAAC,EAAE;YACpF,CAAC,CAAC,kCAAkC;QACxC,cAAc,CAAC,OAAO,EAAE,GAAG;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;YAC1C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;YACnE,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAA;AACJ,CAAC"}
|
package/package.json
CHANGED
package/src/proxy/Proxy.test.ts
CHANGED
|
@@ -131,6 +131,8 @@ describe('create', () => {
|
|
|
131
131
|
|
|
132
132
|
test('behavior: GET /llms.txt returns markdown', async () => {
|
|
133
133
|
const proxy = ApiProxy.create({
|
|
134
|
+
title: 'My AI Gateway',
|
|
135
|
+
description: 'A paid proxy for LLM and AI services.',
|
|
134
136
|
services: [
|
|
135
137
|
openai({
|
|
136
138
|
apiKey: 'sk-test',
|
|
@@ -167,26 +169,44 @@ describe('create', () => {
|
|
|
167
169
|
expect(res.status).toBe(200)
|
|
168
170
|
expect(res.headers.get('content-type')).toBe('text/plain; charset=utf-8')
|
|
169
171
|
expect(await res.text()).toMatchInlineSnapshot(`
|
|
170
|
-
"#
|
|
172
|
+
"# My AI Gateway
|
|
171
173
|
|
|
172
|
-
>
|
|
174
|
+
> A paid proxy for LLM and AI services.
|
|
173
175
|
|
|
174
176
|
For machine-readable service data, use \`GET /services\` (JSON).
|
|
175
177
|
|
|
176
178
|
## Services
|
|
177
179
|
|
|
178
|
-
- [
|
|
179
|
-
- [
|
|
180
|
+
- [OpenAI](https://api.openai.com): Chat completions, embeddings, image generation, and audio transcription. (2 paid)
|
|
181
|
+
- [Anthropic](https://api.anthropic.com): Claude language models for messages and completions. (2 paid)
|
|
180
182
|
|
|
181
|
-
##
|
|
183
|
+
## OpenAI
|
|
182
184
|
|
|
183
|
-
|
|
184
|
-
- \`POST /v1/embeddings\`: charge — 10000 units — "Generate embeddings" — (currency: 0x20c0000000000000000000000000000000000001, decimals: 6)
|
|
185
|
+
Chat completions, embeddings, image generation, and audio transcription.
|
|
185
186
|
|
|
186
|
-
|
|
187
|
+
- \`POST /v1/chat/completions\` - Chat completion
|
|
188
|
+
- Type: charge
|
|
189
|
+
- Price: 0.05 (50000 units, 6 decimals)
|
|
190
|
+
- Currency: 0x20c0000000000000000000000000000000000001
|
|
191
|
+
- Docs: https://context7.com/websites/platform_openai/llms.txt?topic=POST%20%2Fv1%2Fchat%2Fcompletions
|
|
192
|
+
- \`POST /v1/embeddings\` - Generate embeddings
|
|
193
|
+
- Type: charge
|
|
194
|
+
- Price: 0.01 (10000 units, 6 decimals)
|
|
195
|
+
- Currency: 0x20c0000000000000000000000000000000000001
|
|
196
|
+
- Docs: https://context7.com/websites/platform_openai/llms.txt?topic=POST%20%2Fv1%2Fembeddings
|
|
187
197
|
|
|
188
|
-
|
|
189
|
-
|
|
198
|
+
## Anthropic
|
|
199
|
+
|
|
200
|
+
Claude language models for messages and completions.
|
|
201
|
+
|
|
202
|
+
- \`POST /v1/messages\` - Send message
|
|
203
|
+
- Type: charge
|
|
204
|
+
- Price: 0.03 (30000 units, 6 decimals)
|
|
205
|
+
- Currency: 0x20c0000000000000000000000000000000000001
|
|
206
|
+
- \`POST /v1/messages/stream\` - Stream message
|
|
207
|
+
- Type: session
|
|
208
|
+
- Price: 0.01/token (10000 units, 6 decimals)
|
|
209
|
+
- Currency: 0x20c0000000000000000000000000000000000001"
|
|
190
210
|
`)
|
|
191
211
|
})
|
|
192
212
|
|
package/src/proxy/Proxy.ts
CHANGED
|
@@ -61,9 +61,15 @@ export function create(config: create.Config): Proxy {
|
|
|
61
61
|
if (!pathname) return new Response('Not Found', { status: 404 })
|
|
62
62
|
|
|
63
63
|
if (request.method === 'GET' && pathname === '/llms.txt')
|
|
64
|
-
return new Response(
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
return new Response(
|
|
65
|
+
Service.toLlmsTxt(config.services, {
|
|
66
|
+
title: config.title,
|
|
67
|
+
description: config.description,
|
|
68
|
+
}),
|
|
69
|
+
{
|
|
70
|
+
headers: { 'Content-Type': 'text/plain; charset=utf-8' },
|
|
71
|
+
},
|
|
72
|
+
)
|
|
67
73
|
|
|
68
74
|
if (request.method === 'GET' && (pathname === '/services' || pathname === '/services/'))
|
|
69
75
|
return Response.json(config.services.map(Service.serialize))
|
|
@@ -125,10 +131,14 @@ export declare namespace create {
|
|
|
125
131
|
export type Config = {
|
|
126
132
|
/** Base path prefix to strip before routing (e.g. `'/api/proxy'`). */
|
|
127
133
|
basePath?: string | undefined
|
|
134
|
+
/** Short description of the proxy shown in `llms.txt`. */
|
|
135
|
+
description?: string | undefined
|
|
128
136
|
/** Custom `fetch` implementation. Defaults to `globalThis.fetch`. */
|
|
129
137
|
fetch?: typeof globalThis.fetch | undefined
|
|
130
138
|
/** Services to proxy. Each service is mounted at `/{serviceId}/`. */
|
|
131
139
|
services: Service.Service[]
|
|
140
|
+
/** Human-readable title for the proxy shown in `llms.txt`. */
|
|
141
|
+
title?: string | undefined
|
|
132
142
|
}
|
|
133
143
|
}
|
|
134
144
|
|
package/src/proxy/Service.ts
CHANGED
|
@@ -2,16 +2,22 @@ import { Value } from 'ox'
|
|
|
2
2
|
|
|
3
3
|
/** A proxied upstream service with route definitions and optional request/response hooks. */
|
|
4
4
|
export type Service = {
|
|
5
|
-
/** Unique identifier used as the URL prefix (e.g. `'openai'` → `/{id}/...`). */
|
|
6
|
-
id: string
|
|
7
5
|
/** Base URL of the upstream service (e.g. `'https://api.openai.com'`). */
|
|
8
6
|
baseUrl: string
|
|
9
|
-
/**
|
|
10
|
-
|
|
7
|
+
/** Short description of the service. */
|
|
8
|
+
description?: string | undefined
|
|
9
|
+
/** Unique identifier used as the URL prefix (e.g. `'openai'` → `/{id}/...`). */
|
|
10
|
+
id: string
|
|
11
|
+
/** Returns a documentation URL. Called with no argument for the service root, or with a route pattern for per-endpoint docs. */
|
|
12
|
+
docsLlmsUrl?: ((options: { route?: string | undefined }) => string | undefined) | undefined
|
|
11
13
|
/** Hook to modify the upstream request before sending (e.g. inject auth headers). */
|
|
12
14
|
rewriteRequest?: ((req: Request, ctx: Context) => Request | Promise<Request>) | undefined
|
|
13
15
|
/** Hook to modify the upstream response before returning to the client. */
|
|
14
16
|
rewriteResponse?: ((res: Response, ctx: Context) => Response | Promise<Response>) | undefined
|
|
17
|
+
/** Map of route patterns to endpoint handlers. */
|
|
18
|
+
routes: EndpointMap
|
|
19
|
+
/** Human-readable title for the service (e.g. `'OpenAI'`). */
|
|
20
|
+
title?: string | undefined
|
|
15
21
|
}
|
|
16
22
|
|
|
17
23
|
/**
|
|
@@ -73,9 +79,12 @@ export type From<
|
|
|
73
79
|
export function from<options = unknown>(id: string, config: from.Config<options>): Service {
|
|
74
80
|
const rewriteFromConfig = resolveRewriteRequest(config)
|
|
75
81
|
return {
|
|
76
|
-
id,
|
|
77
82
|
baseUrl: config.baseUrl,
|
|
83
|
+
description: config.description,
|
|
84
|
+
id,
|
|
85
|
+
docsLlmsUrl: resolveLlmsUrl(config.docsLlmsUrl),
|
|
78
86
|
routes: config.routes,
|
|
87
|
+
title: config.title,
|
|
79
88
|
rewriteRequest: config.rewriteRequest
|
|
80
89
|
? rewriteFromConfig
|
|
81
90
|
? async (req, ctx) => {
|
|
@@ -93,8 +102,15 @@ export declare namespace from {
|
|
|
93
102
|
baseUrl: string
|
|
94
103
|
/** Shorthand: inject `Authorization: Bearer {token}` header. */
|
|
95
104
|
bearer?: string | undefined
|
|
105
|
+
/** Short description of the service. */
|
|
106
|
+
description?: string | undefined
|
|
96
107
|
/** Shorthand: inject custom headers. */
|
|
97
108
|
headers?: Record<string, string> | undefined
|
|
109
|
+
/** Documentation URL for the service. String for a static base URL, or a function receiving an optional endpoint pattern. */
|
|
110
|
+
docsLlmsUrl?:
|
|
111
|
+
| string
|
|
112
|
+
| ((options: { route?: string | undefined }) => string | undefined)
|
|
113
|
+
| undefined
|
|
98
114
|
/** Shorthand: full request mutation function. Takes priority over `bearer`/`headers`. */
|
|
99
115
|
mutate?: ((req: Request) => Request | Promise<Request>) | undefined
|
|
100
116
|
/** Hook to modify the upstream request. Receives typed per-endpoint options via `ctx`. */
|
|
@@ -103,6 +119,8 @@ export declare namespace from {
|
|
|
103
119
|
| undefined
|
|
104
120
|
/** Map of route patterns to endpoint definitions. */
|
|
105
121
|
routes: EndpointMap
|
|
122
|
+
/** Human-readable title for the service. */
|
|
123
|
+
title?: string | undefined
|
|
106
124
|
}
|
|
107
125
|
}
|
|
108
126
|
|
|
@@ -142,27 +160,34 @@ function resolveRewriteRequest(
|
|
|
142
160
|
/** Serializes a service for discovery responses. */
|
|
143
161
|
export function serialize(s: Service) {
|
|
144
162
|
return {
|
|
145
|
-
id: s.id,
|
|
146
163
|
baseUrl: s.baseUrl,
|
|
164
|
+
description: s.description,
|
|
165
|
+
id: s.id,
|
|
166
|
+
docsLlmsUrl: s.docsLlmsUrl?.({}),
|
|
147
167
|
routes: Object.entries(s.routes).map(([pattern, endpoint]) => {
|
|
148
168
|
const tokens = pattern.trim().split(/\s+/)
|
|
149
169
|
const hasMethod = tokens.length >= 2
|
|
150
170
|
return {
|
|
171
|
+
docsLlmsUrl: s.docsLlmsUrl?.({ route: pattern }),
|
|
151
172
|
method: hasMethod ? tokens[0] : undefined,
|
|
152
173
|
path: hasMethod ? tokens.slice(1).join(' ') : tokens[0],
|
|
153
174
|
pattern,
|
|
154
175
|
payment: endpoint ? resolvePayment(endpoint) : null,
|
|
155
176
|
}
|
|
156
177
|
}),
|
|
178
|
+
title: s.title,
|
|
157
179
|
}
|
|
158
180
|
}
|
|
159
181
|
|
|
160
182
|
/** Renders an llms.txt markdown string for a list of services. */
|
|
161
|
-
export function toLlmsTxt(
|
|
183
|
+
export function toLlmsTxt(
|
|
184
|
+
services: Service[],
|
|
185
|
+
options?: { title?: string | undefined; description?: string | undefined },
|
|
186
|
+
): string {
|
|
162
187
|
const lines: string[] = [
|
|
163
|
-
'
|
|
188
|
+
`# ${options?.title ?? 'API Proxy'}`,
|
|
164
189
|
'',
|
|
165
|
-
'
|
|
190
|
+
`> ${options?.description ?? 'Paid API proxy powered by [Machine Payments Protocol](https://mpp.tempo.xyz).'}`,
|
|
166
191
|
'',
|
|
167
192
|
'For machine-readable service data, use `GET /services` (JSON).',
|
|
168
193
|
'',
|
|
@@ -176,30 +201,37 @@ export function toLlmsTxt(services: Service[]): string {
|
|
|
176
201
|
const free = serialized.routes.filter((r) => r.payment === null).length
|
|
177
202
|
const paid = serialized.routes.length - free
|
|
178
203
|
const parts = [paid && `${paid} paid`, free && `${free} free`].filter(Boolean).join(', ')
|
|
179
|
-
|
|
204
|
+
const label = s.title ?? s.id
|
|
205
|
+
const desc = s.description ? `: ${s.description} (${parts})` : `: ${parts}`
|
|
206
|
+
lines.push(`- [${label}](${s.baseUrl})${desc}`)
|
|
180
207
|
}
|
|
181
208
|
|
|
182
209
|
for (const s of services) {
|
|
183
210
|
const serialized = serialize(s)
|
|
184
|
-
|
|
211
|
+
const docsLlmsUrl = s.docsLlmsUrl?.({})
|
|
212
|
+
lines.push('', `## ${s.title ?? s.id}`, '')
|
|
213
|
+
if (s.description) lines.push(s.description, '')
|
|
214
|
+
if (docsLlmsUrl) lines.push(`Documentation: ${docsLlmsUrl}`, '')
|
|
185
215
|
for (const route of serialized.routes) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
216
|
+
const p = route.payment as Record<string, unknown> | null
|
|
217
|
+
const desc = p?.description ? ` - ${p.description}` : ''
|
|
218
|
+
lines.push(`- \`${route.pattern}\`${desc}`)
|
|
219
|
+
if (!p) {
|
|
220
|
+
lines.push(` - Type: free`)
|
|
221
|
+
} else {
|
|
222
|
+
lines.push(` - Type: ${p.intent}`)
|
|
223
|
+
if (p.amount) {
|
|
224
|
+
const perUnit = p.unitType ? `/${p.unitType}` : ''
|
|
225
|
+
if (p.decimals !== undefined) {
|
|
226
|
+
const price = Number(p.amount) / 10 ** Number(p.decimals)
|
|
227
|
+
lines.push(` - Price: ${price}${perUnit} (${p.amount} units, ${p.decimals} decimals)`)
|
|
228
|
+
} else {
|
|
229
|
+
lines.push(` - Units: ${p.amount}${perUnit}`)
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (p.currency) lines.push(` - Currency: ${p.currency}`)
|
|
195
233
|
}
|
|
196
|
-
if (
|
|
197
|
-
const meta = [
|
|
198
|
-
p.currency && `currency: ${p.currency}`,
|
|
199
|
-
p.decimals !== undefined && `decimals: ${p.decimals}`,
|
|
200
|
-
].filter(Boolean)
|
|
201
|
-
if (meta.length) parts.push(`(${meta.join(', ')})`)
|
|
202
|
-
lines.push(`- \`${route.pattern}\`: ${parts.join(' — ')}`)
|
|
234
|
+
if (route.docsLlmsUrl) lines.push(` - Docs: ${route.docsLlmsUrl}`)
|
|
203
235
|
}
|
|
204
236
|
}
|
|
205
237
|
|
|
@@ -225,3 +257,11 @@ function resolvePayment(endpoint: Endpoint): Record<string, unknown> | null {
|
|
|
225
257
|
})()
|
|
226
258
|
return { intent, method: name, ...rest, ...(amount !== undefined && { amount }) }
|
|
227
259
|
}
|
|
260
|
+
|
|
261
|
+
function resolveLlmsUrl(
|
|
262
|
+
input: string | ((options: { route?: string | undefined }) => string | undefined) | undefined,
|
|
263
|
+
): Service['docsLlmsUrl'] {
|
|
264
|
+
if (!input) return undefined
|
|
265
|
+
if (typeof input === 'function') return input
|
|
266
|
+
return ({ route }) => (route ? undefined : input)
|
|
267
|
+
}
|
|
@@ -20,12 +20,14 @@ import * as Service from '../Service.js'
|
|
|
20
20
|
export function anthropic(config: anthropic.Config) {
|
|
21
21
|
return Service.from<anthropic.Config>('anthropic', {
|
|
22
22
|
baseUrl: config.baseUrl ?? 'https://api.anthropic.com',
|
|
23
|
+
description: 'Claude language models for messages and completions.',
|
|
23
24
|
rewriteRequest(request, ctx) {
|
|
24
25
|
const apiKey = ctx.apiKey ?? config.apiKey
|
|
25
26
|
request.headers.set('x-api-key', apiKey)
|
|
26
27
|
return request
|
|
27
28
|
},
|
|
28
29
|
routes: config.routes,
|
|
30
|
+
title: 'Anthropic',
|
|
29
31
|
})
|
|
30
32
|
}
|
|
31
33
|
|
|
@@ -20,12 +20,18 @@ import * as Service from '../Service.js'
|
|
|
20
20
|
export function openai(config: openai.Config) {
|
|
21
21
|
return Service.from<openai.Config>('openai', {
|
|
22
22
|
baseUrl: config.baseUrl ?? 'https://api.openai.com',
|
|
23
|
+
description: 'Chat completions, embeddings, image generation, and audio transcription.',
|
|
24
|
+
docsLlmsUrl: ({ route }) =>
|
|
25
|
+
route
|
|
26
|
+
? `https://context7.com/websites/platform_openai/llms.txt?topic=${encodeURIComponent(route)}`
|
|
27
|
+
: undefined,
|
|
23
28
|
rewriteRequest(request, ctx) {
|
|
24
29
|
const apiKey = ctx.apiKey ?? config.apiKey
|
|
25
30
|
request.headers.set('Authorization', `Bearer ${apiKey}`)
|
|
26
31
|
return request
|
|
27
32
|
},
|
|
28
33
|
routes: config.routes,
|
|
34
|
+
title: 'OpenAI',
|
|
29
35
|
})
|
|
30
36
|
}
|
|
31
37
|
|
|
@@ -35,6 +41,7 @@ export declare namespace openai {
|
|
|
35
41
|
apiKey: string
|
|
36
42
|
/** Base URL override. Defaults to `'https://api.openai.com'`. */
|
|
37
43
|
baseUrl?: string | undefined
|
|
44
|
+
/** Route definitions for OpenAI endpoints. */
|
|
38
45
|
routes:
|
|
39
46
|
| 'POST /v1/chat/completions'
|
|
40
47
|
| 'POST /v1/completions'
|
|
@@ -20,12 +20,18 @@ import * as Service from '../Service.js'
|
|
|
20
20
|
export function stripe(config: stripe.Config) {
|
|
21
21
|
return Service.from<stripe.Config>('stripe', {
|
|
22
22
|
baseUrl: config.baseUrl ?? 'https://api.stripe.com',
|
|
23
|
+
description: 'Payment processing, customers, subscriptions, and invoices.',
|
|
24
|
+
docsLlmsUrl: ({ route }) =>
|
|
25
|
+
route
|
|
26
|
+
? `https://context7.com/websites/stripe/llms.txt?topic=${encodeURIComponent(route)}`
|
|
27
|
+
: 'https://docs.stripe.com/llms.txt',
|
|
23
28
|
rewriteRequest(request, ctx) {
|
|
24
29
|
const apiKey = ctx.apiKey ?? config.apiKey
|
|
25
30
|
request.headers.set('Authorization', `Basic ${btoa(`${apiKey}:`)}`)
|
|
26
31
|
return request
|
|
27
32
|
},
|
|
28
33
|
routes: config.routes,
|
|
34
|
+
title: 'Stripe',
|
|
29
35
|
})
|
|
30
36
|
}
|
|
31
37
|
|