Skip to content

Commit 2bd17c7

Browse files
authoredMay 17, 2023
[c3] add ts chatgpt plugin template (#3236)
* [c3] add ts chatgpt plugin template * remove unintended import * rename chatgpt to chatgptPlugin * update return types for args * remove open as arg * remove open as arg * prettier fixes

File tree

9 files changed

+2294
-10
lines changed

9 files changed

+2294
-10
lines changed
 

‎packages/create-cloudflare/src/cli.ts

+12-10
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import type { PagesGeneratorArgs } from "types";
1616
export const main = async (argv: string[]) => {
1717
printBanner();
1818

19-
const args = await parseArgs(argv);
19+
const args = (await parseArgs(argv)) as PagesGeneratorArgs;
2020
await validateName(args);
2121
await validateType(args);
2222

@@ -38,25 +38,18 @@ const parseArgs = async (argv: string[]) => {
3838
.option("framework", { type: "string" })
3939
.option("deploy", { type: "boolean" })
4040
.option("ts", { type: "boolean" })
41-
.option("open", {
42-
type: "boolean",
43-
default: true,
44-
description:
45-
"opens your browser after your deployment, set --no-open to disable",
46-
})
4741
.help().argv;
4842

4943
const [name] = args._;
50-
const { deploy, framework, type, ts, open } = args;
44+
const { deploy, framework, type, ts } = args;
5145

5246
return {
5347
projectName: name,
5448
type,
5549
framework,
5650
deploy,
5751
ts,
58-
open,
59-
} as PagesGeneratorArgs;
52+
};
6053
};
6154

6255
const validateName = async (args: Partial<PagesGeneratorArgs>) => {
@@ -116,6 +109,15 @@ const templateMap: Record<string, TemplateConfig> = {
116109
label: "Common Worker functions",
117110
handler: runWorkersGenerator,
118111
},
112+
chatgptPlugin: {
113+
label: `ChatGPT plugin (Typescript)`,
114+
handler: (args) =>
115+
runWorkersGenerator({
116+
projectName: args.projectName,
117+
type: "chatgptPlugin",
118+
ts: true,
119+
}),
120+
},
119121
"pre-existing": {
120122
label: "Pre-existing Worker (from Dashboard)",
121123
handler: runWorkersGenerator,
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
# Logs
2+
3+
logs
4+
_.log
5+
npm-debug.log_
6+
yarn-debug.log*
7+
yarn-error.log*
8+
lerna-debug.log*
9+
.pnpm-debug.log*
10+
11+
# Diagnostic reports (https://nodejs.org/api/report.html)
12+
13+
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
14+
15+
# Runtime data
16+
17+
pids
18+
_.pid
19+
_.seed
20+
\*.pid.lock
21+
22+
# Directory for instrumented libs generated by jscoverage/JSCover
23+
24+
lib-cov
25+
26+
# Coverage directory used by tools like istanbul
27+
28+
coverage
29+
\*.lcov
30+
31+
# nyc test coverage
32+
33+
.nyc_output
34+
35+
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
36+
37+
.grunt
38+
39+
# Bower dependency directory (https://bower.io/)
40+
41+
bower_components
42+
43+
# node-waf configuration
44+
45+
.lock-wscript
46+
47+
# Compiled binary addons (https://nodejs.org/api/addons.html)
48+
49+
build/Release
50+
51+
# Dependency directories
52+
53+
node_modules/
54+
jspm_packages/
55+
56+
# Snowpack dependency directory (https://snowpack.dev/)
57+
58+
web_modules/
59+
60+
# TypeScript cache
61+
62+
\*.tsbuildinfo
63+
64+
# Optional npm cache directory
65+
66+
.npm
67+
68+
# Optional eslint cache
69+
70+
.eslintcache
71+
72+
# Optional stylelint cache
73+
74+
.stylelintcache
75+
76+
# Microbundle cache
77+
78+
.rpt2_cache/
79+
.rts2_cache_cjs/
80+
.rts2_cache_es/
81+
.rts2_cache_umd/
82+
83+
# Optional REPL history
84+
85+
.node_repl_history
86+
87+
# Output of 'npm pack'
88+
89+
\*.tgz
90+
91+
# Yarn Integrity file
92+
93+
.yarn-integrity
94+
95+
# dotenv environment variable files
96+
97+
.env
98+
.env.development.local
99+
.env.test.local
100+
.env.production.local
101+
.env.local
102+
103+
# parcel-bundler cache (https://parceljs.org/)
104+
105+
.cache
106+
.parcel-cache
107+
108+
# Next.js build output
109+
110+
.next
111+
out
112+
113+
# Nuxt.js build / generate output
114+
115+
.nuxt
116+
dist
117+
118+
# Gatsby files
119+
120+
.cache/
121+
122+
# Comment in the public line in if your project uses Gatsby and not Next.js
123+
124+
# https://nextjs.org/blog/next-9-1#public-directory-support
125+
126+
# public
127+
128+
# vuepress build output
129+
130+
.vuepress/dist
131+
132+
# vuepress v2.x temp and cache directory
133+
134+
.temp
135+
.cache
136+
137+
# Docusaurus cache and generated files
138+
139+
.docusaurus
140+
141+
# Serverless directories
142+
143+
.serverless/
144+
145+
# FuseBox cache
146+
147+
.fusebox/
148+
149+
# DynamoDB Local files
150+
151+
.dynamodb/
152+
153+
# TernJS port file
154+
155+
.tern-port
156+
157+
# Stores VSCode versions used for testing VSCode extensions
158+
159+
.vscode-test
160+
161+
# yarn v2
162+
163+
.yarn/cache
164+
.yarn/unplugged
165+
.yarn/build-state.yml
166+
.yarn/install-state.gz
167+
.pnp.\*
168+
169+
# wrangler project
170+
171+
.dev.vars
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Example ChatGPT Plugin for Cloudflare Workers
2+
3+
This is an example plugin showing how to build [ChatGPT plugins](https://platform.openai.com/docs/plugins/introduction) using [Cloudflare Workers](https://workers.dev). Using this example, you can deploy a plugin to Cloudflare Workers in just a few minutes.
4+
5+
The sample plugin allows ChatGPT users to search for repositories using GitHub's search API. The plugin is implemented in TypeScript and uses the [OpenAPI](https://www.openapis.org/) specification to define the plugin's API.
6+
7+
![Example conversation in ChatGPT showing the plugin in use](./.assets/example.png)
8+
9+
## Get started
10+
11+
0. Sign up for [Cloudflare Workers](https://workers.dev). The free tier is more than enough for most use cases.
12+
1. Install [wrangler](https://developers.cloudflare.com/workers/cli-wrangler/install-update), the Cloudflare Workers CLI
13+
2. Clone this project and install dependencies with `npm install`
14+
3. Run `wrangler login` to login to your Cloudflare account in wrangler
15+
4. Run `wrangler publish` to publish the plugin to Cloudflare Workers
16+
17+
## Usage
18+
19+
1. You can configure the `.well-known/ai-plugin.json` route in `index.ts`.
20+
2. Update the OpenAPI schema in `openapi.ts`.
21+
3. You can set up any new routes and the associated OpenAPI schema by defining new routes. See `search.ts` for an example.
22+
23+
## Deploying to OpenAI's API
24+
25+
Follow the instructions [in the ChatGPT documentation](https://platform.openai.com/docs/plugins/introduction/plugin-flow) to deploy your plugin and begin using it in ChatGPT.

‎packages/create-cloudflare/templates/chatgptPlugin/ts/package-lock.json

+1,971
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "cloudflare-workers-chatgpt-plugin-example",
3+
"version": "0.0.1",
4+
"private": true,
5+
"scripts": {
6+
"deploy": "wrangler publish",
7+
"start": "wrangler dev"
8+
},
9+
"dependencies": {
10+
"@cloudflare/itty-router-openapi": "^0.1.2"
11+
},
12+
"devDependencies": {
13+
"@cloudflare/workers-types": "^4.20230404.0",
14+
"wrangler": "^2.15.1"
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { OpenAPIRouter } from "@cloudflare/itty-router-openapi";
2+
import { GetSearch } from "./search";
3+
4+
export const router = OpenAPIRouter({
5+
schema: {
6+
info: {
7+
title: "GitHub Repositories Search API",
8+
description:
9+
"A plugin that allows the user to search for GitHub repositories using ChatGPT",
10+
version: "v0.0.1",
11+
},
12+
},
13+
docs_url: "/",
14+
aiPlugin: {
15+
name_for_human: "GitHub Repositories Search",
16+
name_for_model: "github_repositories_search",
17+
description_for_human: "GitHub Repositories Search plugin for ChatGPT.",
18+
description_for_model:
19+
"GitHub Repositories Search plugin for ChatGPT. You can search for GitHub repositories using this plugin.",
20+
contact_email: "support@example.com",
21+
legal_info_url: "http://www.example.com/legal",
22+
logo_url: "https://workers.cloudflare.com/resources/logo/logo.svg",
23+
},
24+
});
25+
26+
router.get("/search", GetSearch);
27+
28+
// 404 for everything else
29+
router.all("*", () => new Response("Not Found.", { status: 404 }));
30+
31+
export default {
32+
fetch: router.handle,
33+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import {
2+
ApiException,
3+
OpenAPIRoute,
4+
Query,
5+
ValidationError,
6+
} from "@cloudflare/itty-router-openapi";
7+
8+
export class GetSearch extends OpenAPIRoute {
9+
static schema = {
10+
tags: ["Search"],
11+
summary: "Search repositories by a query parameter",
12+
parameters: {
13+
q: Query(String, {
14+
description: "The query to search for",
15+
default: "cloudflare workers",
16+
}),
17+
},
18+
responses: {
19+
"200": {
20+
schema: {
21+
repos: [
22+
{
23+
name: "itty-router-openapi",
24+
description:
25+
"OpenAPI 3 schema generator and validator for Cloudflare Workers",
26+
stars: "80",
27+
url: "https://github.com/cloudflare/itty-router-openapi",
28+
},
29+
],
30+
},
31+
},
32+
},
33+
};
34+
35+
async handle(request: Request, env, ctx, data: Record<string, any>) {
36+
const url = `https://api.github.com/search/repositories?q=${data.q}`;
37+
38+
const resp = await fetch(url, {
39+
headers: {
40+
Accept: "application/vnd.github.v3+json",
41+
"User-Agent": "RepoAI - Cloudflare Workers ChatGPT Plugin Example",
42+
},
43+
});
44+
45+
if (!resp.ok) {
46+
return new Response(await resp.text(), { status: 400 });
47+
}
48+
49+
const json = await resp.json();
50+
51+
// @ts-ignore
52+
const repos = json.items.map((item: any) => ({
53+
name: item.name,
54+
description: item.description,
55+
stars: item.stargazers_count,
56+
url: item.html_url,
57+
}));
58+
59+
return {
60+
repos: repos,
61+
};
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
name = "cloudflare-workers-chatgpt-plugin-example"
2+
main = "src/index.ts"
3+
compatibility_date = "2023-04-07"

0 commit comments

Comments
 (0)
Please sign in to comment.