Skip to content

Commit bb4e12c

Browse files
authoredSep 3, 2024
feat: options.messages for prompt() (copilot-extensions#49)
1 parent 6cd9abf commit bb4e12c

File tree

5 files changed

+366
-165
lines changed

5 files changed

+366
-165
lines changed
 

‎README.md

+28-1
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,34 @@ const { message } = await prompt("What is the capital of France?", {
321321
console.log(message.content);
322322
```
323323
324-
⚠️ Not all of the arguments below are implemented yet.
324+
In order to pass a history of messages, pass them as `options.messages`:
325+
326+
```js
327+
const { message } = await prompt("What about Spain?", {
328+
model: "gpt-4",
329+
token: process.env.TOKEN,
330+
messages: [
331+
{ role: "user", content: "What is the capital of France?" },
332+
{ role: "assistant", content: "The capital of France is Paris." },
333+
],
334+
});
335+
```
336+
337+
Alternatively, skip the `message` argument and pass all messages as `options.messages`:
338+
339+
```js
340+
const { message } = await prompt({
341+
model: "gpt-4",
342+
token: process.env.TOKEN,
343+
messages: [
344+
{ role: "user", content: "What is the capital of France?" },
345+
{ role: "assistant", content: "The capital of France is Paris." },
346+
{ role: "user", content: "What about Spain?" },
347+
],
348+
});
349+
```
350+
351+
⚠️ Not all of the arguments below are implemented yet. See [#5](https://github.com/copilot-extensions/preview-sdk.js/issues/5) sub issues for progress.
325352
326353
```js
327354
await prompt({

‎index.d.ts

+34-16
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,7 @@ type ResponseEvent<T extends ResponseEventType = "text"> =
7575

7676
type CopilotAckResponseEventData = {
7777
choices: [{
78-
delta: {
79-
content: "", role: "assistant"
80-
}
78+
delta: InteropMessage<"assistant">
8179
}]
8280
}
8381

@@ -92,9 +90,7 @@ type CopilotDoneResponseEventData = {
9290

9391
type CopilotTextResponseEventData = {
9492
choices: [{
95-
delta: {
96-
content: string, role: "assistant"
97-
}
93+
delta: InteropMessage<"assistant">
9894
}]
9995
}
10096
type CopilotConfirmationResponseEventData = {
@@ -134,7 +130,7 @@ interface CopilotReference {
134130

135131
export interface CopilotRequestPayload {
136132
copilot_thread_id: string
137-
messages: Message[]
133+
messages: CopilotMessage[]
138134
stop: any
139135
top_p: number
140136
temperature: number
@@ -146,14 +142,10 @@ export interface CopilotRequestPayload {
146142
}
147143

148144
export interface OpenAICompatibilityPayload {
149-
messages: {
150-
role: string
151-
name?: string
152-
content: string
153-
}[]
145+
messages: InteropMessage[]
154146
}
155147

156-
export interface Message {
148+
export interface CopilotMessage {
157149
role: string
158150
content: string
159151
copilot_references: MessageCopilotReference[]
@@ -167,6 +159,14 @@ export interface Message {
167159
"type": "function"
168160
}[]
169161
name?: string
162+
[key: string]: unknown
163+
}
164+
165+
export interface InteropMessage<TRole extends string = string> {
166+
role: TRole
167+
content: string
168+
name?: string
169+
[key: string]: unknown
170170
}
171171

172172
export interface MessageCopilotReference {
@@ -254,10 +254,23 @@ export interface GetUserConfirmationInterface {
254254

255255
// prompt
256256

257-
/** model names supported by Copilot API */
257+
/**
258+
* model names supported by Copilot API
259+
*
260+
* Based on https://api.githubcopilot.com/models from 2024-09-02
261+
*/
258262
export type ModelName =
259-
| "gpt-4"
260263
| "gpt-3.5-turbo"
264+
| "gpt-3.5-turbo-0613"
265+
| "gpt-4"
266+
| "gpt-4-0613"
267+
| "gpt-4-o-preview"
268+
| "gpt-4o"
269+
| "gpt-4o-2024-05-13"
270+
| "text-embedding-3-small"
271+
| "text-embedding-3-small-inference"
272+
| "text-embedding-ada-002"
273+
| "text-embedding-ada-002-index"
261274

262275
export interface PromptFunction {
263276
type: "function"
@@ -274,18 +287,23 @@ export type PromptOptions = {
274287
model: ModelName
275288
token: string
276289
tools?: PromptFunction[]
290+
messages?: InteropMessage[]
277291
request?: {
278292
fetch?: Function
279293
}
280294
}
281295

282296
export type PromptResult = {
283297
requestId: string
284-
message: Message
298+
message: CopilotMessage
285299
}
286300

301+
// https://stackoverflow.com/a/69328045
302+
type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] }
303+
287304
interface PromptInterface {
288305
(userPrompt: string, options: PromptOptions): Promise<PromptResult>;
306+
(options: WithRequired<PromptOptions, "messages">): Promise<PromptResult>;
289307
}
290308

291309
// exported methods

‎index.test-d.ts

+29-9
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
getUserMessage,
1818
getUserConfirmation,
1919
type VerificationPublicKey,
20+
type InteropMessage,
2021
CopilotRequestPayload,
2122
prompt,
2223
} from "./index.js";
@@ -79,11 +80,10 @@ export function createAckEventTest() {
7980
expectType<() => string>(event.toString);
8081
expectType<string>(event.toString());
8182

83+
8284
expectType<{
8385
choices: [{
84-
delta: {
85-
content: "", role: "assistant"
86-
}
86+
delta: InteropMessage<"assistant">
8787
}]
8888
}>(event.data);
8989

@@ -98,9 +98,7 @@ export function createTextEventTest() {
9898

9999
expectType<{
100100
choices: [{
101-
delta: {
102-
content: string, role: "assistant"
103-
}
101+
delta: InteropMessage<"assistant">
104102
}]
105103
}>(event.data);
106104

@@ -243,6 +241,7 @@ export function transformPayloadForOpenAICompatibilityTest(payload: CopilotReque
243241
content: string;
244242
role: string;
245243
name?: string
244+
[key: string]: unknown
246245
}[]
247246
}
248247
>(result);
@@ -307,12 +306,33 @@ export async function promptWithToolsTest() {
307306
function: {
308307
name: "",
309308
description: "",
310-
parameters: {
311-
312-
},
309+
parameters: {},
313310
strict: true,
314311
}
315312
}
316313
]
317314
})
315+
}
316+
317+
export async function promptWithMessageAndMessages() {
318+
await prompt("What about Spain?", {
319+
model: "gpt-4",
320+
token: 'secret',
321+
messages: [
322+
{ role: "user", content: "What is the capital of France?" },
323+
{ role: "assistant", content: "The capital of France is Paris." },
324+
],
325+
});
326+
}
327+
328+
export async function promptWithoutMessageButMessages() {
329+
await prompt({
330+
model: "gpt-4",
331+
token: 'secret',
332+
messages: [
333+
{ role: "user", content: "What is the capital of France?" },
334+
{ role: "assistant", content: "The capital of France is Paris." },
335+
{ role: "user", content: "What about Spain?" },
336+
],
337+
});
318338
}

‎lib/prompt.js

+27-16
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,32 @@
22

33
/** @type {import('..').PromptInterface} */
44
export async function prompt(userPrompt, promptOptions) {
5-
const promptFetch = promptOptions.request?.fetch || fetch;
5+
const options = typeof userPrompt === "string" ? promptOptions : userPrompt;
66

7-
const systemMessage = promptOptions.tools
7+
const promptFetch = options.request?.fetch || fetch;
8+
9+
const systemMessage = options.tools
810
? "You are a helpful assistant. Use the supplied tools to assist the user."
911
: "You are a helpful assistant.";
1012

13+
const messages = [
14+
{
15+
role: "system",
16+
content: systemMessage,
17+
},
18+
];
19+
20+
if (options.messages) {
21+
messages.push(...options.messages);
22+
}
23+
24+
if (typeof userPrompt === "string") {
25+
messages.push({
26+
role: "user",
27+
content: userPrompt,
28+
});
29+
}
30+
1131
const response = await promptFetch(
1232
"https://api.githubcopilot.com/chat/completions",
1333
{
@@ -16,22 +36,13 @@ export async function prompt(userPrompt, promptOptions) {
1636
accept: "application/json",
1737
"content-type": "application/json; charset=UTF-8",
1838
"user-agent": "copilot-extensions/preview-sdk.js",
19-
authorization: `Bearer ${promptOptions.token}`,
39+
authorization: `Bearer ${options.token}`,
2040
},
2141
body: JSON.stringify({
22-
messages: [
23-
{
24-
role: "system",
25-
content: systemMessage,
26-
},
27-
{
28-
role: "user",
29-
content: userPrompt,
30-
},
31-
],
32-
model: promptOptions.model,
33-
toolChoice: promptOptions.tools ? "auto" : undefined,
34-
tools: promptOptions.tools,
42+
messages: messages,
43+
model: options.model,
44+
toolChoice: options.tools ? "auto" : undefined,
45+
tools: options.tools,
3546
}),
3647
}
3748
);

0 commit comments

Comments
 (0)
Failed to load comments.