langchain 0.0.71 → 0.0.73
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/agents/index.cjs +2 -1
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.js +1 -1
- package/dist/chains/base.cjs +1 -1
- package/dist/chains/base.js +1 -1
- package/dist/chains/conversation.cjs +3 -3
- package/dist/chains/conversation.d.ts +1 -0
- package/dist/chains/conversation.js +2 -2
- package/dist/chains/index.cjs +10 -1
- package/dist/chains/index.d.ts +4 -0
- package/dist/chains/index.js +4 -0
- package/dist/chains/retrieval_qa.cjs +3 -1
- package/dist/chains/retrieval_qa.d.ts +2 -1
- package/dist/chains/retrieval_qa.js +4 -2
- package/dist/chains/router/llm_router.cjs +31 -0
- package/dist/chains/router/llm_router.d.ts +24 -0
- package/dist/chains/router/llm_router.js +27 -0
- package/dist/chains/router/multi_prompt.cjs +76 -0
- package/dist/chains/router/multi_prompt.d.ts +8 -0
- package/dist/chains/router/multi_prompt.js +72 -0
- package/dist/chains/router/multi_prompt_prompt.cjs +42 -0
- package/dist/chains/router/multi_prompt_prompt.d.ts +2 -0
- package/dist/chains/router/multi_prompt_prompt.js +38 -0
- package/dist/chains/router/multi_retrieval_prompt.cjs +42 -0
- package/dist/chains/router/multi_retrieval_prompt.d.ts +2 -0
- package/dist/chains/router/multi_retrieval_prompt.js +38 -0
- package/dist/chains/router/multi_retrieval_qa.cjs +89 -0
- package/dist/chains/router/multi_retrieval_qa.d.ts +15 -0
- package/dist/chains/router/multi_retrieval_qa.js +85 -0
- package/dist/chains/router/multi_route.cjs +86 -0
- package/dist/chains/router/multi_route.d.ts +38 -0
- package/dist/chains/router/multi_route.js +81 -0
- package/dist/chains/router/utils.cjs +34 -0
- package/dist/chains/router/utils.d.ts +3 -0
- package/dist/chains/router/utils.js +30 -0
- package/dist/chat_models/openai.cjs +33 -19
- package/dist/chat_models/openai.d.ts +1 -1
- package/dist/chat_models/openai.js +33 -19
- package/dist/embeddings/openai.d.ts +1 -1
- package/dist/llms/openai-chat.cjs +31 -19
- package/dist/llms/openai-chat.d.ts +1 -1
- package/dist/llms/openai-chat.js +31 -19
- package/dist/llms/openai.cjs +29 -9
- package/dist/llms/openai.d.ts +1 -1
- package/dist/llms/openai.js +29 -9
- package/dist/output_parsers/index.cjs +6 -1
- package/dist/output_parsers/index.d.ts +3 -1
- package/dist/output_parsers/index.js +3 -1
- package/dist/output_parsers/list.cjs +46 -1
- package/dist/output_parsers/list.d.ts +14 -0
- package/dist/output_parsers/list.js +44 -0
- package/dist/output_parsers/router.cjs +32 -0
- package/dist/output_parsers/router.d.ts +11 -0
- package/dist/output_parsers/router.js +28 -0
- package/dist/output_parsers/structured.cjs +43 -3
- package/dist/output_parsers/structured.d.ts +11 -1
- package/dist/output_parsers/structured.js +41 -2
- package/dist/schema/index.cjs +10 -1
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.js +8 -0
- package/dist/schema/output_parser.d.ts +7 -1
- package/dist/stores/message/dynamodb.cjs +126 -0
- package/dist/stores/message/dynamodb.d.ts +23 -0
- package/dist/stores/message/dynamodb.js +122 -0
- package/dist/stores/message/in_memory.cjs +3 -6
- package/dist/stores/message/in_memory.d.ts +3 -4
- package/dist/stores/message/in_memory.js +4 -7
- package/dist/stores/message/utils.cjs +31 -0
- package/dist/stores/message/utils.d.ts +8 -0
- package/dist/stores/message/utils.js +26 -0
- package/dist/types/openai-types.cjs +2 -0
- package/dist/types/openai-types.d.ts +101 -0
- package/dist/types/openai-types.js +1 -0
- package/package.json +14 -1
- package/stores/message/dynamodb.cjs +1 -0
- package/stores/message/dynamodb.d.ts +1 -0
- package/stores/message/dynamodb.js +1 -0
|
@@ -27,9 +27,9 @@ For example, the example "JSON Schema" instance {{"properties": {{"foo": {{"desc
|
|
|
27
27
|
would match an object with one required property, "foo". The "type" property specifies "foo" must be an "array", and the "description" property semantically describes it as "a list of test words". The items within "foo" must be strings.
|
|
28
28
|
Thus, the object {{"foo": ["bar", "baz"]}} is a well-formatted instance of this example "JSON Schema". The object {{"properties": {{"foo": ["bar", "baz"]}}}} is not well-formatted.
|
|
29
29
|
|
|
30
|
-
Your output will be parsed and type-checked according to the provided schema instance, so make sure all fields in your output match exactly!
|
|
30
|
+
Your output will be parsed and type-checked according to the provided schema instance, so make sure all fields in your output match the schema exactly and there are no trailing commas!
|
|
31
31
|
|
|
32
|
-
Here is the JSON Schema instance your output must adhere to:
|
|
32
|
+
Here is the JSON Schema instance your output must adhere to. Include the enclosing markdown codeblock:
|
|
33
33
|
\`\`\`json
|
|
34
34
|
${JSON.stringify(zodToJsonSchema(this.schema))}
|
|
35
35
|
\`\`\`
|
|
@@ -47,3 +47,42 @@ ${JSON.stringify(zodToJsonSchema(this.schema))}
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
+
export class JsonMarkdownStructuredOutputParser extends StructuredOutputParser {
|
|
51
|
+
getFormatInstructions(options) {
|
|
52
|
+
const interpolationDepth = options?.interpolationDepth ?? 1;
|
|
53
|
+
if (interpolationDepth < 1) {
|
|
54
|
+
throw new Error("f string interpolation depth must be at least 1");
|
|
55
|
+
}
|
|
56
|
+
return `Return a markdown code snippet with a JSON object formatted to look like:\n\`\`\`json\n${this._schemaToInstruction(zodToJsonSchema(this.schema))
|
|
57
|
+
.replaceAll("{", "{".repeat(interpolationDepth))
|
|
58
|
+
.replaceAll("}", "}".repeat(interpolationDepth))}\n\`\`\``;
|
|
59
|
+
}
|
|
60
|
+
_schemaToInstruction(schemaInput, indent = 2) {
|
|
61
|
+
const schema = schemaInput;
|
|
62
|
+
let nullable = false;
|
|
63
|
+
if (Array.isArray(schema.type)) {
|
|
64
|
+
const [actualType, nullStr] = schema.type;
|
|
65
|
+
nullable = nullStr === "null";
|
|
66
|
+
schema.type = actualType;
|
|
67
|
+
}
|
|
68
|
+
if (schema.type === "object" && schema.properties) {
|
|
69
|
+
const description = schema.description ? ` // ${schema.description}` : "";
|
|
70
|
+
const properties = Object.entries(schema.properties)
|
|
71
|
+
.map(([key, value]) => {
|
|
72
|
+
const isOptional = schema.required?.includes(key)
|
|
73
|
+
? ""
|
|
74
|
+
: " (optional)";
|
|
75
|
+
return `${" ".repeat(indent)}"${key}": ${this._schemaToInstruction(value, indent + 2)}${isOptional}`;
|
|
76
|
+
})
|
|
77
|
+
.join("\n");
|
|
78
|
+
return `{\n${properties}\n${" ".repeat(indent - 2)}}${description}`;
|
|
79
|
+
}
|
|
80
|
+
if (schema.type === "array" && schema.items) {
|
|
81
|
+
const description = schema.description ? ` // ${schema.description}` : "";
|
|
82
|
+
return `array[\n${" ".repeat(indent)}${this._schemaToInstruction(schema.items)}\n${" ".repeat(indent - 2)}] ${description}`;
|
|
83
|
+
}
|
|
84
|
+
const isNullable = nullable ? " (nullable)" : "";
|
|
85
|
+
const description = schema.description ? ` // ${schema.description}` : "";
|
|
86
|
+
return `${schema.type}${description}${isNullable}`;
|
|
87
|
+
}
|
|
88
|
+
}
|
package/dist/schema/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BaseFileStore = exports.BaseCache = exports.BaseChatMessageHistory = exports.BaseRetriever = exports.BasePromptValue = exports.ChatMessage = exports.SystemChatMessage = exports.AIChatMessage = exports.HumanChatMessage = exports.BaseChatMessage = exports.RUN_KEY = void 0;
|
|
3
|
+
exports.BaseFileStore = exports.BaseCache = exports.BaseListChatMessageHistory = exports.BaseChatMessageHistory = exports.BaseRetriever = exports.BasePromptValue = exports.ChatMessage = exports.SystemChatMessage = exports.AIChatMessage = exports.HumanChatMessage = exports.BaseChatMessage = exports.RUN_KEY = void 0;
|
|
4
4
|
exports.RUN_KEY = "__run";
|
|
5
5
|
class BaseChatMessage {
|
|
6
6
|
constructor(text) {
|
|
@@ -71,6 +71,15 @@ exports.BaseRetriever = BaseRetriever;
|
|
|
71
71
|
class BaseChatMessageHistory {
|
|
72
72
|
}
|
|
73
73
|
exports.BaseChatMessageHistory = BaseChatMessageHistory;
|
|
74
|
+
class BaseListChatMessageHistory {
|
|
75
|
+
addUserMessage(message) {
|
|
76
|
+
return this.addMessage(new HumanChatMessage(message));
|
|
77
|
+
}
|
|
78
|
+
addAIChatMessage(message) {
|
|
79
|
+
return this.addMessage(new AIChatMessage(message));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.BaseListChatMessageHistory = BaseListChatMessageHistory;
|
|
74
83
|
class BaseCache {
|
|
75
84
|
}
|
|
76
85
|
exports.BaseCache = BaseCache;
|
package/dist/schema/index.d.ts
CHANGED
|
@@ -98,6 +98,11 @@ export declare abstract class BaseChatMessageHistory {
|
|
|
98
98
|
abstract addAIChatMessage(message: string): Promise<void>;
|
|
99
99
|
abstract clear(): Promise<void>;
|
|
100
100
|
}
|
|
101
|
+
export declare abstract class BaseListChatMessageHistory {
|
|
102
|
+
protected abstract addMessage(message: BaseChatMessage): Promise<void>;
|
|
103
|
+
addUserMessage(message: string): Promise<void>;
|
|
104
|
+
addAIChatMessage(message: string): Promise<void>;
|
|
105
|
+
}
|
|
101
106
|
export declare abstract class BaseCache<T = Generation[]> {
|
|
102
107
|
abstract lookup(prompt: string, llmKey: string): Promise<T | null>;
|
|
103
108
|
abstract update(prompt: string, llmKey: string, value: T): Promise<void>;
|
package/dist/schema/index.js
CHANGED
|
@@ -60,6 +60,14 @@ export class BaseRetriever {
|
|
|
60
60
|
}
|
|
61
61
|
export class BaseChatMessageHistory {
|
|
62
62
|
}
|
|
63
|
+
export class BaseListChatMessageHistory {
|
|
64
|
+
addUserMessage(message) {
|
|
65
|
+
return this.addMessage(new HumanChatMessage(message));
|
|
66
|
+
}
|
|
67
|
+
addAIChatMessage(message) {
|
|
68
|
+
return this.addMessage(new AIChatMessage(message));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
63
71
|
export class BaseCache {
|
|
64
72
|
}
|
|
65
73
|
export class BaseFileStore {
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { Callbacks } from "../callbacks/manager.js";
|
|
2
2
|
import { BasePromptValue } from "./index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Options for formatting instructions.
|
|
5
|
+
*/
|
|
6
|
+
export interface FormatInstructionsOptions {
|
|
7
|
+
}
|
|
3
8
|
/** Class to parse the output of an LLM call.
|
|
4
9
|
*/
|
|
5
10
|
export declare abstract class BaseOutputParser<T = unknown> {
|
|
@@ -14,6 +19,7 @@ export declare abstract class BaseOutputParser<T = unknown> {
|
|
|
14
19
|
/**
|
|
15
20
|
* Return a string describing the format of the output.
|
|
16
21
|
* @returns Format instructions.
|
|
22
|
+
* @param options - Options for formatting instructions.
|
|
17
23
|
* @example
|
|
18
24
|
* ```json
|
|
19
25
|
* {
|
|
@@ -21,7 +27,7 @@ export declare abstract class BaseOutputParser<T = unknown> {
|
|
|
21
27
|
* }
|
|
22
28
|
* ```
|
|
23
29
|
*/
|
|
24
|
-
abstract getFormatInstructions(): string;
|
|
30
|
+
abstract getFormatInstructions(options?: FormatInstructionsOptions): string;
|
|
25
31
|
/**
|
|
26
32
|
* Return the string type key uniquely identifying this class of parser
|
|
27
33
|
*/
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DynamoDBChatMessageHistory = void 0;
|
|
4
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
|
+
const index_js_1 = require("../../schema/index.cjs");
|
|
6
|
+
const utils_js_1 = require("./utils.cjs");
|
|
7
|
+
class DynamoDBChatMessageHistory extends index_js_1.BaseListChatMessageHistory {
|
|
8
|
+
constructor({ tableName, sessionId, partitionKey, sortKey, messageAttributeName, config, }) {
|
|
9
|
+
super();
|
|
10
|
+
Object.defineProperty(this, "tableName", {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
writable: true,
|
|
14
|
+
value: void 0
|
|
15
|
+
});
|
|
16
|
+
Object.defineProperty(this, "sessionId", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
configurable: true,
|
|
19
|
+
writable: true,
|
|
20
|
+
value: void 0
|
|
21
|
+
});
|
|
22
|
+
Object.defineProperty(this, "client", {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
writable: true,
|
|
26
|
+
value: void 0
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(this, "partitionKey", {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
configurable: true,
|
|
31
|
+
writable: true,
|
|
32
|
+
value: "id"
|
|
33
|
+
});
|
|
34
|
+
Object.defineProperty(this, "sortKey", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
configurable: true,
|
|
37
|
+
writable: true,
|
|
38
|
+
value: void 0
|
|
39
|
+
});
|
|
40
|
+
Object.defineProperty(this, "messageAttributeName", {
|
|
41
|
+
enumerable: true,
|
|
42
|
+
configurable: true,
|
|
43
|
+
writable: true,
|
|
44
|
+
value: "messages"
|
|
45
|
+
});
|
|
46
|
+
Object.defineProperty(this, "dynamoKey", {
|
|
47
|
+
enumerable: true,
|
|
48
|
+
configurable: true,
|
|
49
|
+
writable: true,
|
|
50
|
+
value: void 0
|
|
51
|
+
});
|
|
52
|
+
this.tableName = tableName;
|
|
53
|
+
this.sessionId = sessionId;
|
|
54
|
+
this.client = new client_dynamodb_1.DynamoDBClient(config ?? {});
|
|
55
|
+
this.partitionKey = partitionKey ?? this.partitionKey;
|
|
56
|
+
this.sortKey = sortKey;
|
|
57
|
+
this.messageAttributeName =
|
|
58
|
+
messageAttributeName ?? this.messageAttributeName;
|
|
59
|
+
this.dynamoKey = {};
|
|
60
|
+
this.dynamoKey[this.partitionKey] = { S: this.sessionId };
|
|
61
|
+
if (this.sortKey) {
|
|
62
|
+
this.dynamoKey[this.sortKey] = { S: this.sortKey };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async getMessages() {
|
|
66
|
+
const params = {
|
|
67
|
+
TableName: this.tableName,
|
|
68
|
+
Key: this.dynamoKey,
|
|
69
|
+
};
|
|
70
|
+
const response = await this.client.send(new client_dynamodb_1.GetItemCommand(params));
|
|
71
|
+
const items = response.Item
|
|
72
|
+
? response.Item[this.messageAttributeName]?.L ?? []
|
|
73
|
+
: [];
|
|
74
|
+
const messages = items
|
|
75
|
+
.map((item) => ({
|
|
76
|
+
type: item.M?.type.S,
|
|
77
|
+
role: item.M?.role?.S,
|
|
78
|
+
text: item.M?.text.S,
|
|
79
|
+
}))
|
|
80
|
+
.filter((x) => x.type !== undefined && x.text !== undefined);
|
|
81
|
+
return (0, utils_js_1.mapStoredMessagesToChatMessages)(messages);
|
|
82
|
+
}
|
|
83
|
+
async clear() {
|
|
84
|
+
const params = {
|
|
85
|
+
TableName: this.tableName,
|
|
86
|
+
Key: this.dynamoKey,
|
|
87
|
+
};
|
|
88
|
+
await this.client.send(new client_dynamodb_1.DeleteItemCommand(params));
|
|
89
|
+
}
|
|
90
|
+
async addMessage(message) {
|
|
91
|
+
const messages = (0, utils_js_1.mapChatMessagesToStoredMessages)([message]);
|
|
92
|
+
const params = {
|
|
93
|
+
TableName: this.tableName,
|
|
94
|
+
Key: this.dynamoKey,
|
|
95
|
+
ExpressionAttributeNames: {
|
|
96
|
+
"#m": this.messageAttributeName,
|
|
97
|
+
},
|
|
98
|
+
ExpressionAttributeValues: {
|
|
99
|
+
":empty_list": {
|
|
100
|
+
L: [],
|
|
101
|
+
},
|
|
102
|
+
":m": {
|
|
103
|
+
L: messages.map((message) => {
|
|
104
|
+
const dynamoSerializedMessage = {
|
|
105
|
+
M: {
|
|
106
|
+
type: {
|
|
107
|
+
S: message.type,
|
|
108
|
+
},
|
|
109
|
+
text: {
|
|
110
|
+
S: message.text,
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
if (message.role) {
|
|
115
|
+
dynamoSerializedMessage.M.role = { S: message.role };
|
|
116
|
+
}
|
|
117
|
+
return dynamoSerializedMessage;
|
|
118
|
+
}),
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
UpdateExpression: "SET #m = list_append(if_not_exists(#m, :empty_list), :m)",
|
|
122
|
+
};
|
|
123
|
+
await this.client.send(new client_dynamodb_1.UpdateItemCommand(params));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.DynamoDBChatMessageHistory = DynamoDBChatMessageHistory;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { DynamoDBClientConfig } from "@aws-sdk/client-dynamodb";
|
|
2
|
+
import { BaseChatMessage, BaseListChatMessageHistory } from "../../schema/index.js";
|
|
3
|
+
export interface DynamoDBChatMessageHistoryFields {
|
|
4
|
+
tableName: string;
|
|
5
|
+
sessionId: string;
|
|
6
|
+
partitionKey?: string;
|
|
7
|
+
sortKey?: string;
|
|
8
|
+
messageAttributeName?: string;
|
|
9
|
+
config?: DynamoDBClientConfig;
|
|
10
|
+
}
|
|
11
|
+
export declare class DynamoDBChatMessageHistory extends BaseListChatMessageHistory {
|
|
12
|
+
private tableName;
|
|
13
|
+
private sessionId;
|
|
14
|
+
private client;
|
|
15
|
+
private partitionKey;
|
|
16
|
+
private sortKey?;
|
|
17
|
+
private messageAttributeName;
|
|
18
|
+
private dynamoKey;
|
|
19
|
+
constructor({ tableName, sessionId, partitionKey, sortKey, messageAttributeName, config, }: DynamoDBChatMessageHistoryFields);
|
|
20
|
+
getMessages(): Promise<BaseChatMessage[]>;
|
|
21
|
+
clear(): Promise<void>;
|
|
22
|
+
protected addMessage(message: BaseChatMessage): Promise<void>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { DynamoDBClient, GetItemCommand, UpdateItemCommand, DeleteItemCommand, } from "@aws-sdk/client-dynamodb";
|
|
2
|
+
import { BaseListChatMessageHistory, } from "../../schema/index.js";
|
|
3
|
+
import { mapChatMessagesToStoredMessages, mapStoredMessagesToChatMessages, } from "./utils.js";
|
|
4
|
+
export class DynamoDBChatMessageHistory extends BaseListChatMessageHistory {
|
|
5
|
+
constructor({ tableName, sessionId, partitionKey, sortKey, messageAttributeName, config, }) {
|
|
6
|
+
super();
|
|
7
|
+
Object.defineProperty(this, "tableName", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
configurable: true,
|
|
10
|
+
writable: true,
|
|
11
|
+
value: void 0
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(this, "sessionId", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true,
|
|
17
|
+
value: void 0
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(this, "client", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: void 0
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(this, "partitionKey", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: "id"
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(this, "sortKey", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: void 0
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(this, "messageAttributeName", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
configurable: true,
|
|
40
|
+
writable: true,
|
|
41
|
+
value: "messages"
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(this, "dynamoKey", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
configurable: true,
|
|
46
|
+
writable: true,
|
|
47
|
+
value: void 0
|
|
48
|
+
});
|
|
49
|
+
this.tableName = tableName;
|
|
50
|
+
this.sessionId = sessionId;
|
|
51
|
+
this.client = new DynamoDBClient(config ?? {});
|
|
52
|
+
this.partitionKey = partitionKey ?? this.partitionKey;
|
|
53
|
+
this.sortKey = sortKey;
|
|
54
|
+
this.messageAttributeName =
|
|
55
|
+
messageAttributeName ?? this.messageAttributeName;
|
|
56
|
+
this.dynamoKey = {};
|
|
57
|
+
this.dynamoKey[this.partitionKey] = { S: this.sessionId };
|
|
58
|
+
if (this.sortKey) {
|
|
59
|
+
this.dynamoKey[this.sortKey] = { S: this.sortKey };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async getMessages() {
|
|
63
|
+
const params = {
|
|
64
|
+
TableName: this.tableName,
|
|
65
|
+
Key: this.dynamoKey,
|
|
66
|
+
};
|
|
67
|
+
const response = await this.client.send(new GetItemCommand(params));
|
|
68
|
+
const items = response.Item
|
|
69
|
+
? response.Item[this.messageAttributeName]?.L ?? []
|
|
70
|
+
: [];
|
|
71
|
+
const messages = items
|
|
72
|
+
.map((item) => ({
|
|
73
|
+
type: item.M?.type.S,
|
|
74
|
+
role: item.M?.role?.S,
|
|
75
|
+
text: item.M?.text.S,
|
|
76
|
+
}))
|
|
77
|
+
.filter((x) => x.type !== undefined && x.text !== undefined);
|
|
78
|
+
return mapStoredMessagesToChatMessages(messages);
|
|
79
|
+
}
|
|
80
|
+
async clear() {
|
|
81
|
+
const params = {
|
|
82
|
+
TableName: this.tableName,
|
|
83
|
+
Key: this.dynamoKey,
|
|
84
|
+
};
|
|
85
|
+
await this.client.send(new DeleteItemCommand(params));
|
|
86
|
+
}
|
|
87
|
+
async addMessage(message) {
|
|
88
|
+
const messages = mapChatMessagesToStoredMessages([message]);
|
|
89
|
+
const params = {
|
|
90
|
+
TableName: this.tableName,
|
|
91
|
+
Key: this.dynamoKey,
|
|
92
|
+
ExpressionAttributeNames: {
|
|
93
|
+
"#m": this.messageAttributeName,
|
|
94
|
+
},
|
|
95
|
+
ExpressionAttributeValues: {
|
|
96
|
+
":empty_list": {
|
|
97
|
+
L: [],
|
|
98
|
+
},
|
|
99
|
+
":m": {
|
|
100
|
+
L: messages.map((message) => {
|
|
101
|
+
const dynamoSerializedMessage = {
|
|
102
|
+
M: {
|
|
103
|
+
type: {
|
|
104
|
+
S: message.type,
|
|
105
|
+
},
|
|
106
|
+
text: {
|
|
107
|
+
S: message.text,
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
if (message.role) {
|
|
112
|
+
dynamoSerializedMessage.M.role = { S: message.role };
|
|
113
|
+
}
|
|
114
|
+
return dynamoSerializedMessage;
|
|
115
|
+
}),
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
UpdateExpression: "SET #m = list_append(if_not_exists(#m, :empty_list), :m)",
|
|
119
|
+
};
|
|
120
|
+
await this.client.send(new UpdateItemCommand(params));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ChatMessageHistory = void 0;
|
|
4
4
|
const index_js_1 = require("../../schema/index.cjs");
|
|
5
|
-
class ChatMessageHistory extends index_js_1.
|
|
5
|
+
class ChatMessageHistory extends index_js_1.BaseListChatMessageHistory {
|
|
6
6
|
constructor(messages) {
|
|
7
7
|
super();
|
|
8
8
|
Object.defineProperty(this, "messages", {
|
|
@@ -16,11 +16,8 @@ class ChatMessageHistory extends index_js_1.BaseChatMessageHistory {
|
|
|
16
16
|
async getMessages() {
|
|
17
17
|
return this.messages;
|
|
18
18
|
}
|
|
19
|
-
async
|
|
20
|
-
this.messages.push(
|
|
21
|
-
}
|
|
22
|
-
async addAIChatMessage(message) {
|
|
23
|
-
this.messages.push(new index_js_1.AIChatMessage(message));
|
|
19
|
+
async addMessage(message) {
|
|
20
|
+
this.messages.push(message);
|
|
24
21
|
}
|
|
25
22
|
async clear() {
|
|
26
23
|
this.messages = [];
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { BaseChatMessage,
|
|
2
|
-
export declare class ChatMessageHistory extends
|
|
1
|
+
import { BaseChatMessage, BaseListChatMessageHistory } from "../../schema/index.js";
|
|
2
|
+
export declare class ChatMessageHistory extends BaseListChatMessageHistory {
|
|
3
3
|
private messages;
|
|
4
4
|
constructor(messages?: BaseChatMessage[]);
|
|
5
5
|
getMessages(): Promise<BaseChatMessage[]>;
|
|
6
|
-
|
|
7
|
-
addAIChatMessage(message: string): Promise<void>;
|
|
6
|
+
addMessage(message: BaseChatMessage): Promise<void>;
|
|
8
7
|
clear(): Promise<void>;
|
|
9
8
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export class ChatMessageHistory extends
|
|
1
|
+
import { BaseListChatMessageHistory, } from "../../schema/index.js";
|
|
2
|
+
export class ChatMessageHistory extends BaseListChatMessageHistory {
|
|
3
3
|
constructor(messages) {
|
|
4
4
|
super();
|
|
5
5
|
Object.defineProperty(this, "messages", {
|
|
@@ -13,11 +13,8 @@ export class ChatMessageHistory extends BaseChatMessageHistory {
|
|
|
13
13
|
async getMessages() {
|
|
14
14
|
return this.messages;
|
|
15
15
|
}
|
|
16
|
-
async
|
|
17
|
-
this.messages.push(
|
|
18
|
-
}
|
|
19
|
-
async addAIChatMessage(message) {
|
|
20
|
-
this.messages.push(new AIChatMessage(message));
|
|
16
|
+
async addMessage(message) {
|
|
17
|
+
this.messages.push(message);
|
|
21
18
|
}
|
|
22
19
|
async clear() {
|
|
23
20
|
this.messages = [];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapChatMessagesToStoredMessages = exports.mapStoredMessagesToChatMessages = void 0;
|
|
4
|
+
const index_js_1 = require("../../schema/index.cjs");
|
|
5
|
+
function mapStoredMessagesToChatMessages(messages) {
|
|
6
|
+
return messages.map((message) => {
|
|
7
|
+
switch (message.type) {
|
|
8
|
+
case "human":
|
|
9
|
+
return new index_js_1.HumanChatMessage(message.text);
|
|
10
|
+
case "ai":
|
|
11
|
+
return new index_js_1.AIChatMessage(message.text);
|
|
12
|
+
case "system":
|
|
13
|
+
return new index_js_1.SystemChatMessage(message.text);
|
|
14
|
+
default: {
|
|
15
|
+
if (message.role === undefined) {
|
|
16
|
+
throw new Error("Role must be defined for generic messages");
|
|
17
|
+
}
|
|
18
|
+
return new index_js_1.ChatMessage(message.text, message.role);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
exports.mapStoredMessagesToChatMessages = mapStoredMessagesToChatMessages;
|
|
24
|
+
function mapChatMessagesToStoredMessages(messages) {
|
|
25
|
+
return messages.map((message) => ({
|
|
26
|
+
type: message._getType(),
|
|
27
|
+
role: "role" in message ? message.role : undefined,
|
|
28
|
+
text: message.text,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
exports.mapChatMessagesToStoredMessages = mapChatMessagesToStoredMessages;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseChatMessage } from "../../schema/index.js";
|
|
2
|
+
export interface StoredMessage {
|
|
3
|
+
type: string;
|
|
4
|
+
role: string | undefined;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function mapStoredMessagesToChatMessages(messages: StoredMessage[]): BaseChatMessage[];
|
|
8
|
+
export declare function mapChatMessagesToStoredMessages(messages: BaseChatMessage[]): StoredMessage[];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AIChatMessage, ChatMessage, HumanChatMessage, SystemChatMessage, } from "../../schema/index.js";
|
|
2
|
+
export function mapStoredMessagesToChatMessages(messages) {
|
|
3
|
+
return messages.map((message) => {
|
|
4
|
+
switch (message.type) {
|
|
5
|
+
case "human":
|
|
6
|
+
return new HumanChatMessage(message.text);
|
|
7
|
+
case "ai":
|
|
8
|
+
return new AIChatMessage(message.text);
|
|
9
|
+
case "system":
|
|
10
|
+
return new SystemChatMessage(message.text);
|
|
11
|
+
default: {
|
|
12
|
+
if (message.role === undefined) {
|
|
13
|
+
throw new Error("Role must be defined for generic messages");
|
|
14
|
+
}
|
|
15
|
+
return new ChatMessage(message.text, message.role);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function mapChatMessagesToStoredMessages(messages) {
|
|
21
|
+
return messages.map((message) => ({
|
|
22
|
+
type: message._getType(),
|
|
23
|
+
role: "role" in message ? message.role : undefined,
|
|
24
|
+
text: message.text,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { AxiosRequestConfig } from "axios";
|
|
2
|
+
import { ChatCompletionRequestMessage } from "openai";
|
|
3
|
+
import { BaseLanguageModelCallOptions } from "../base_language/index.js";
|
|
4
|
+
export declare interface OpenAIBaseInput {
|
|
5
|
+
/** Sampling temperature to use */
|
|
6
|
+
temperature: number;
|
|
7
|
+
/**
|
|
8
|
+
* Maximum number of tokens to generate in the completion. -1 returns as many
|
|
9
|
+
* tokens as possible given the prompt and the model's maximum context size.
|
|
10
|
+
*/
|
|
11
|
+
maxTokens?: number;
|
|
12
|
+
/** Total probability mass of tokens to consider at each step */
|
|
13
|
+
topP: number;
|
|
14
|
+
/** Penalizes repeated tokens according to frequency */
|
|
15
|
+
frequencyPenalty: number;
|
|
16
|
+
/** Penalizes repeated tokens */
|
|
17
|
+
presencePenalty: number;
|
|
18
|
+
/** Number of completions to generate for each prompt */
|
|
19
|
+
n: number;
|
|
20
|
+
/** Dictionary used to adjust the probability of specific tokens being generated */
|
|
21
|
+
logitBias?: Record<string, number>;
|
|
22
|
+
/** Whether to stream the results or not. Enabling disables tokenUsage reporting */
|
|
23
|
+
streaming: boolean;
|
|
24
|
+
/** Model name to use */
|
|
25
|
+
modelName: string;
|
|
26
|
+
/** Holds any additional parameters that are valid to pass to {@link
|
|
27
|
+
* https://platform.openai.com/docs/api-reference/completions/create |
|
|
28
|
+
* `openai.createCompletion`} that are not explicitly specified on this class.
|
|
29
|
+
*/
|
|
30
|
+
modelKwargs?: Record<string, any>;
|
|
31
|
+
/** List of stop words to use when generating */
|
|
32
|
+
stop?: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Timeout to use when making requests to OpenAI.
|
|
35
|
+
*/
|
|
36
|
+
timeout?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface OpenAICallOptions extends BaseLanguageModelCallOptions {
|
|
39
|
+
/**
|
|
40
|
+
* List of stop words to use when generating
|
|
41
|
+
*/
|
|
42
|
+
stop?: string[];
|
|
43
|
+
/**
|
|
44
|
+
* Additional options to pass to the underlying axios request.
|
|
45
|
+
*/
|
|
46
|
+
options?: AxiosRequestConfig;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Input to OpenAI class.
|
|
50
|
+
*/
|
|
51
|
+
export declare interface OpenAIInput extends OpenAIBaseInput {
|
|
52
|
+
/** Generates `bestOf` completions server side and returns the "best" */
|
|
53
|
+
bestOf: number;
|
|
54
|
+
/** Batch size to use when passing multiple documents to generate */
|
|
55
|
+
batchSize: number;
|
|
56
|
+
}
|
|
57
|
+
export interface OpenAIChatInput extends OpenAIBaseInput {
|
|
58
|
+
/** ChatGPT messages to pass as a prefix to the prompt */
|
|
59
|
+
prefixMessages?: ChatCompletionRequestMessage[];
|
|
60
|
+
}
|
|
61
|
+
export declare interface AzureOpenAIInput {
|
|
62
|
+
/**
|
|
63
|
+
* API version to use when making requests to Azure OpenAI.
|
|
64
|
+
*/
|
|
65
|
+
azureOpenAIApiVersion?: string;
|
|
66
|
+
/**
|
|
67
|
+
* API key to use when making requests to Azure OpenAI.
|
|
68
|
+
*/
|
|
69
|
+
azureOpenAIApiKey?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Azure OpenAI API instance name to use when making requests to Azure OpenAI.
|
|
72
|
+
* this is the name of the instance you created in the Azure portal.
|
|
73
|
+
* e.g. "my-openai-instance"
|
|
74
|
+
* this will be used in the endpoint URL: https://my-openai-instance.openai.azure.com/openai/deployments/{DeploymentName}/
|
|
75
|
+
*/
|
|
76
|
+
azureOpenAIApiInstanceName?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Azure OpenAI API deployment name to use for completions when making requests to Azure OpenAI.
|
|
79
|
+
* This is the name of the deployment you created in the Azure portal.
|
|
80
|
+
* e.g. "my-openai-deployment"
|
|
81
|
+
* this will be used in the endpoint URL: https://{InstanceName}.openai.azure.com/openai/deployments/my-openai-deployment/
|
|
82
|
+
*/
|
|
83
|
+
azureOpenAIApiDeploymentName?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Azure OpenAI API deployment name to use for embedding when making requests to Azure OpenAI.
|
|
86
|
+
* This is the name of the deployment you created in the Azure portal.
|
|
87
|
+
* This will fallback to azureOpenAIApiDeploymentName if not provided.
|
|
88
|
+
* e.g. "my-openai-deployment"
|
|
89
|
+
* this will be used in the endpoint URL: https://{InstanceName}.openai.azure.com/openai/deployments/my-openai-deployment/
|
|
90
|
+
*/
|
|
91
|
+
azureOpenAIApiEmbeddingsDeploymentName?: string;
|
|
92
|
+
/**
|
|
93
|
+
* Azure OpenAI API deployment name to use for completions when making requests to Azure OpenAI.
|
|
94
|
+
* Completions are only available for gpt-3.5-turbo and text-davinci-003 deployments.
|
|
95
|
+
* This is the name of the deployment you created in the Azure portal.
|
|
96
|
+
* This will fallback to azureOpenAIApiDeploymentName if not provided.
|
|
97
|
+
* e.g. "my-openai-deployment"
|
|
98
|
+
* this will be used in the endpoint URL: https://{InstanceName}.openai.azure.com/openai/deployments/my-openai-deployment/
|
|
99
|
+
*/
|
|
100
|
+
azureOpenAIApiCompletionsDeploymentName?: string;
|
|
101
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|