@proteinjs/conversation 2.7.2 → 3.0.0
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/CHANGELOG.md +24 -0
- package/LICENSE +21 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/src/CodegenConversation.js +1 -1
- package/dist/src/CodegenConversation.js.map +1 -1
- package/dist/src/Conversation.d.ts +173 -99
- package/dist/src/Conversation.d.ts.map +1 -1
- package/dist/src/Conversation.js +903 -502
- package/dist/src/Conversation.js.map +1 -1
- package/dist/src/OpenAi.d.ts +20 -0
- package/dist/src/OpenAi.d.ts.map +1 -1
- package/dist/src/OpenAi.js +16 -0
- package/dist/src/OpenAi.js.map +1 -1
- package/dist/src/OpenAiStreamProcessor.d.ts +9 -3
- package/dist/src/OpenAiStreamProcessor.d.ts.map +1 -1
- package/dist/src/OpenAiStreamProcessor.js +5 -3
- package/dist/src/OpenAiStreamProcessor.js.map +1 -1
- package/dist/src/UsageData.d.ts.map +1 -1
- package/dist/src/UsageData.js +22 -0
- package/dist/src/UsageData.js.map +1 -1
- package/dist/src/code_template/Code.d.ts.map +1 -1
- package/dist/src/code_template/Code.js +8 -2
- package/dist/src/code_template/Code.js.map +1 -1
- package/dist/src/resolveModel.d.ts +17 -0
- package/dist/src/resolveModel.d.ts.map +1 -0
- package/dist/src/resolveModel.js +121 -0
- package/dist/src/resolveModel.js.map +1 -0
- package/dist/test/conversation/conversation.generateObject.test.d.ts +2 -0
- package/dist/test/conversation/conversation.generateObject.test.d.ts.map +1 -0
- package/dist/test/conversation/conversation.generateObject.test.js +153 -0
- package/dist/test/conversation/conversation.generateObject.test.js.map +1 -0
- package/dist/test/conversation/conversation.generateResponse.test.d.ts +2 -0
- package/dist/test/conversation/conversation.generateResponse.test.d.ts.map +1 -0
- package/dist/test/conversation/conversation.generateResponse.test.js +167 -0
- package/dist/test/conversation/conversation.generateResponse.test.js.map +1 -0
- package/dist/test/conversation/conversation.generateStream.test.d.ts +2 -0
- package/dist/test/conversation/conversation.generateStream.test.d.ts.map +1 -0
- package/dist/test/conversation/conversation.generateStream.test.js +255 -0
- package/dist/test/conversation/conversation.generateStream.test.js.map +1 -0
- package/index.ts +5 -0
- package/package.json +7 -2
- package/src/CodegenConversation.ts +1 -1
- package/src/Conversation.ts +938 -496
- package/src/OpenAi.ts +20 -0
- package/src/OpenAiStreamProcessor.ts +9 -3
- package/src/UsageData.ts +25 -0
- package/src/code_template/Code.ts +5 -1
- package/src/resolveModel.ts +130 -0
- package/test/conversation/conversation.generateObject.test.ts +132 -0
- package/test/conversation/conversation.generateResponse.test.ts +132 -0
- package/test/conversation/conversation.generateStream.test.ts +173 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.inferProvider = exports.resolveModel = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Known provider prefixes and their model factory functions.
|
|
6
|
+
*
|
|
7
|
+
* Each factory lazily imports the provider package and creates a model instance.
|
|
8
|
+
* This keeps imports optional: if a provider package is not installed, the
|
|
9
|
+
* factory simply throws a helpful error at call time.
|
|
10
|
+
*/
|
|
11
|
+
var PROVIDER_FACTORIES = {
|
|
12
|
+
openai: function (modelId) {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
14
|
+
var openai = require('@ai-sdk/openai').openai;
|
|
15
|
+
return openai(modelId);
|
|
16
|
+
},
|
|
17
|
+
anthropic: function (modelId) {
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
19
|
+
var anthropic = require('@ai-sdk/anthropic').anthropic;
|
|
20
|
+
return anthropic(modelId);
|
|
21
|
+
},
|
|
22
|
+
google: function (modelId) {
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
24
|
+
var google = require('@ai-sdk/google').google;
|
|
25
|
+
return google(modelId);
|
|
26
|
+
},
|
|
27
|
+
xai: function (modelId) {
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
29
|
+
var xai = require('@ai-sdk/xai').xai;
|
|
30
|
+
return xai(modelId);
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Model name patterns that map to a provider.
|
|
35
|
+
*
|
|
36
|
+
* Order matters: first match wins. Patterns are tested against the raw model
|
|
37
|
+
* string (case-insensitive).
|
|
38
|
+
*/
|
|
39
|
+
var MODEL_PROVIDER_PATTERNS = [
|
|
40
|
+
// OpenAI models
|
|
41
|
+
{ test: /^(gpt-|o[134]-|o[134]$|chatgpt|dall-e|computer-use|codex)/i, provider: 'openai' },
|
|
42
|
+
// Anthropic models
|
|
43
|
+
{ test: /^claude/i, provider: 'anthropic' },
|
|
44
|
+
// Google models
|
|
45
|
+
{ test: /^(gemini|gemma)/i, provider: 'google' },
|
|
46
|
+
// xAI models
|
|
47
|
+
{ test: /^grok/i, provider: 'xai' },
|
|
48
|
+
];
|
|
49
|
+
/**
|
|
50
|
+
* Resolve a model identifier to a concrete `LanguageModel` instance.
|
|
51
|
+
*
|
|
52
|
+
* Accepted inputs:
|
|
53
|
+
* - A `LanguageModel` instance (returned as-is)
|
|
54
|
+
* - A prefixed string like `"openai:gpt-5"` or `"anthropic:claude-sonnet-4-20250514"`
|
|
55
|
+
* - A bare model name like `"gpt-5"`, `"claude-sonnet-4-20250514"`, `"gemini-2.5-pro"`, `"grok-3"`
|
|
56
|
+
* (provider inferred from name patterns)
|
|
57
|
+
*/
|
|
58
|
+
function resolveModel(model) {
|
|
59
|
+
// Already a model instance
|
|
60
|
+
if (typeof model !== 'string') {
|
|
61
|
+
return model;
|
|
62
|
+
}
|
|
63
|
+
var raw = model.trim();
|
|
64
|
+
if (!raw) {
|
|
65
|
+
throw new Error('resolveModel: empty model string');
|
|
66
|
+
}
|
|
67
|
+
// Explicit provider prefix: "provider:model-id"
|
|
68
|
+
var colonIdx = raw.indexOf(':');
|
|
69
|
+
if (colonIdx > 0) {
|
|
70
|
+
var prefix = raw.slice(0, colonIdx).toLowerCase();
|
|
71
|
+
var modelId = raw.slice(colonIdx + 1);
|
|
72
|
+
var factory = PROVIDER_FACTORIES[prefix];
|
|
73
|
+
if (!factory) {
|
|
74
|
+
throw new Error("resolveModel: unknown provider prefix \"".concat(prefix, "\" in \"").concat(raw, "\". ") +
|
|
75
|
+
"Known providers: ".concat(Object.keys(PROVIDER_FACTORIES).join(', ')));
|
|
76
|
+
}
|
|
77
|
+
return factory(modelId);
|
|
78
|
+
}
|
|
79
|
+
// Infer provider from model name patterns
|
|
80
|
+
for (var _i = 0, MODEL_PROVIDER_PATTERNS_1 = MODEL_PROVIDER_PATTERNS; _i < MODEL_PROVIDER_PATTERNS_1.length; _i++) {
|
|
81
|
+
var _a = MODEL_PROVIDER_PATTERNS_1[_i], test_1 = _a.test, provider = _a.provider;
|
|
82
|
+
if (test_1.test(raw)) {
|
|
83
|
+
return PROVIDER_FACTORIES[provider](raw);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Default to OpenAI for unrecognized model names
|
|
87
|
+
// (OpenAI has the most model aliases and is the most common provider)
|
|
88
|
+
return PROVIDER_FACTORIES.openai(raw);
|
|
89
|
+
}
|
|
90
|
+
exports.resolveModel = resolveModel;
|
|
91
|
+
/**
|
|
92
|
+
* Extract the provider name from a model identifier string.
|
|
93
|
+
* Returns 'openai', 'anthropic', 'google', 'xai', or 'unknown'.
|
|
94
|
+
*/
|
|
95
|
+
function inferProvider(model) {
|
|
96
|
+
var _a;
|
|
97
|
+
if (typeof model !== 'string') {
|
|
98
|
+
// Try to extract from the model's provider property if available
|
|
99
|
+
var modelId = (_a = model.modelId) !== null && _a !== void 0 ? _a : '';
|
|
100
|
+
return inferProvider(modelId);
|
|
101
|
+
}
|
|
102
|
+
var raw = model.trim();
|
|
103
|
+
// Explicit prefix
|
|
104
|
+
var colonIdx = raw.indexOf(':');
|
|
105
|
+
if (colonIdx > 0) {
|
|
106
|
+
var prefix = raw.slice(0, colonIdx).toLowerCase();
|
|
107
|
+
if (PROVIDER_FACTORIES[prefix]) {
|
|
108
|
+
return prefix;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Pattern match
|
|
112
|
+
for (var _i = 0, MODEL_PROVIDER_PATTERNS_2 = MODEL_PROVIDER_PATTERNS; _i < MODEL_PROVIDER_PATTERNS_2.length; _i++) {
|
|
113
|
+
var _b = MODEL_PROVIDER_PATTERNS_2[_i], test_2 = _b.test, provider = _b.provider;
|
|
114
|
+
if (test_2.test(raw)) {
|
|
115
|
+
return provider;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return 'unknown';
|
|
119
|
+
}
|
|
120
|
+
exports.inferProvider = inferProvider;
|
|
121
|
+
//# sourceMappingURL=resolveModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveModel.js","sourceRoot":"","sources":["../../src/resolveModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.generateObject.test.d.ts","sourceRoot":"","sources":["../../../test/conversation/conversation.generateObject.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var Conversation_1 = require("../../src/Conversation");
|
|
40
|
+
var zod_1 = require("zod");
|
|
41
|
+
/**
|
|
42
|
+
* Integration tests for Conversation.generateObject.
|
|
43
|
+
*
|
|
44
|
+
* These hit the real OpenAI API (requires OPENAI_API_KEY env var).
|
|
45
|
+
* They verify structured output generation, schema strictification,
|
|
46
|
+
* JSON repair, and usage data extraction.
|
|
47
|
+
*/
|
|
48
|
+
var hasApiKey = !!process.env.OPENAI_API_KEY;
|
|
49
|
+
var describeIfKey = hasApiKey ? describe : describe.skip;
|
|
50
|
+
var TEST_MODEL = 'gpt-4.1-nano';
|
|
51
|
+
var TIMEOUT = 60000;
|
|
52
|
+
describeIfKey('Conversation.generateObject', function () {
|
|
53
|
+
test('returns a typed object matching a Zod schema', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
54
|
+
var schema, conversation, result;
|
|
55
|
+
return __generator(this, function (_a) {
|
|
56
|
+
switch (_a.label) {
|
|
57
|
+
case 0:
|
|
58
|
+
schema = zod_1.z.object({
|
|
59
|
+
name: zod_1.z.string(),
|
|
60
|
+
population: zod_1.z.number(),
|
|
61
|
+
continent: zod_1.z.string(),
|
|
62
|
+
});
|
|
63
|
+
conversation = new Conversation_1.Conversation({ name: 'test-object-zod' });
|
|
64
|
+
return [4 /*yield*/, conversation.generateObject({
|
|
65
|
+
messages: [
|
|
66
|
+
'Give me info about France. Return the country name, population (approximate number), and continent.',
|
|
67
|
+
],
|
|
68
|
+
model: TEST_MODEL,
|
|
69
|
+
schema: schema,
|
|
70
|
+
})];
|
|
71
|
+
case 1:
|
|
72
|
+
result = _a.sent();
|
|
73
|
+
expect(result.object).toBeDefined();
|
|
74
|
+
expect(typeof result.object.name).toBe('string');
|
|
75
|
+
expect(typeof result.object.population).toBe('number');
|
|
76
|
+
expect(typeof result.object.continent).toBe('string');
|
|
77
|
+
expect(result.object.name.toLowerCase()).toContain('france');
|
|
78
|
+
expect(result.object.population).toBeGreaterThan(1000000);
|
|
79
|
+
// Usage should be populated
|
|
80
|
+
expect(result.usage.totalTokenUsage.inputTokens).toBeGreaterThan(0);
|
|
81
|
+
expect(result.usage.totalTokenUsage.outputTokens).toBeGreaterThan(0);
|
|
82
|
+
return [2 /*return*/];
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}); }, TIMEOUT);
|
|
86
|
+
test('returns a typed object matching a JSON Schema', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
87
|
+
var jsonSchema, conversation, result, lower;
|
|
88
|
+
return __generator(this, function (_a) {
|
|
89
|
+
switch (_a.label) {
|
|
90
|
+
case 0:
|
|
91
|
+
jsonSchema = {
|
|
92
|
+
type: 'object',
|
|
93
|
+
properties: {
|
|
94
|
+
colors: {
|
|
95
|
+
type: 'array',
|
|
96
|
+
items: { type: 'string' },
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
required: ['colors'],
|
|
100
|
+
};
|
|
101
|
+
conversation = new Conversation_1.Conversation({ name: 'test-object-json-schema' });
|
|
102
|
+
return [4 /*yield*/, conversation.generateObject({
|
|
103
|
+
messages: ['List the 3 primary colors (red, blue, yellow).'],
|
|
104
|
+
model: TEST_MODEL,
|
|
105
|
+
schema: jsonSchema,
|
|
106
|
+
})];
|
|
107
|
+
case 1:
|
|
108
|
+
result = _a.sent();
|
|
109
|
+
expect(result.object).toBeDefined();
|
|
110
|
+
expect(Array.isArray(result.object.colors)).toBe(true);
|
|
111
|
+
expect(result.object.colors.length).toBe(3);
|
|
112
|
+
lower = result.object.colors.map(function (c) { return c.toLowerCase(); });
|
|
113
|
+
expect(lower).toContain('red');
|
|
114
|
+
expect(lower).toContain('blue');
|
|
115
|
+
expect(lower).toContain('yellow');
|
|
116
|
+
return [2 /*return*/];
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}); }, TIMEOUT);
|
|
120
|
+
test('handles nested object schemas (strictification)', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
121
|
+
var schema, conversation, result;
|
|
122
|
+
return __generator(this, function (_a) {
|
|
123
|
+
switch (_a.label) {
|
|
124
|
+
case 0:
|
|
125
|
+
schema = zod_1.z.object({
|
|
126
|
+
person: zod_1.z.object({
|
|
127
|
+
firstName: zod_1.z.string(),
|
|
128
|
+
lastName: zod_1.z.string(),
|
|
129
|
+
age: zod_1.z.number(),
|
|
130
|
+
}),
|
|
131
|
+
occupation: zod_1.z.string(),
|
|
132
|
+
});
|
|
133
|
+
conversation = new Conversation_1.Conversation({ name: 'test-object-nested' });
|
|
134
|
+
return [4 /*yield*/, conversation.generateObject({
|
|
135
|
+
messages: [
|
|
136
|
+
'Create a fictional person profile. Use firstName "Ada", lastName "Lovelace", age 36, occupation "Mathematician".',
|
|
137
|
+
],
|
|
138
|
+
model: TEST_MODEL,
|
|
139
|
+
schema: schema,
|
|
140
|
+
})];
|
|
141
|
+
case 1:
|
|
142
|
+
result = _a.sent();
|
|
143
|
+
expect(result.object.person).toBeDefined();
|
|
144
|
+
expect(result.object.person.firstName).toBe('Ada');
|
|
145
|
+
expect(result.object.person.lastName).toBe('Lovelace');
|
|
146
|
+
expect(result.object.person.age).toBe(36);
|
|
147
|
+
expect(result.object.occupation).toBe('Mathematician');
|
|
148
|
+
return [2 /*return*/];
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}); }, TIMEOUT);
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=conversation.generateObject.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.generateObject.test.js","sourceRoot":"","sources":["../../../test/conversation/conversation.generateObject.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.generateResponse.test.d.ts","sourceRoot":"","sources":["../../../test/conversation/conversation.generateResponse.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var Conversation_1 = require("../../src/Conversation");
|
|
40
|
+
/**
|
|
41
|
+
* Integration tests for Conversation.generateResponse (non-streaming convenience).
|
|
42
|
+
*
|
|
43
|
+
* These hit the real OpenAI API (requires OPENAI_API_KEY env var).
|
|
44
|
+
*/
|
|
45
|
+
var hasApiKey = !!process.env.OPENAI_API_KEY;
|
|
46
|
+
var describeIfKey = hasApiKey ? describe : describe.skip;
|
|
47
|
+
var TEST_MODEL = 'gpt-4.1-nano';
|
|
48
|
+
var TIMEOUT = 60000;
|
|
49
|
+
function createTestModule(systemMessage, functions) {
|
|
50
|
+
return {
|
|
51
|
+
getName: function () { return 'TestModule'; },
|
|
52
|
+
getSystemMessages: function () { return [systemMessage]; },
|
|
53
|
+
getFunctions: function () { return functions; },
|
|
54
|
+
getMessageModerators: function () { return []; },
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
describeIfKey('Conversation.generateResponse', function () {
|
|
58
|
+
test('returns a complete text response with usage', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
59
|
+
var conversation, result;
|
|
60
|
+
return __generator(this, function (_a) {
|
|
61
|
+
switch (_a.label) {
|
|
62
|
+
case 0:
|
|
63
|
+
conversation = new Conversation_1.Conversation({ name: 'test-response' });
|
|
64
|
+
return [4 /*yield*/, conversation.generateResponse({
|
|
65
|
+
messages: ['Say "hello" and nothing else.'],
|
|
66
|
+
model: TEST_MODEL,
|
|
67
|
+
})];
|
|
68
|
+
case 1:
|
|
69
|
+
result = _a.sent();
|
|
70
|
+
expect(result.text.toLowerCase()).toContain('hello');
|
|
71
|
+
expect(result.usage.totalTokenUsage.inputTokens).toBeGreaterThan(0);
|
|
72
|
+
expect(result.usage.totalTokenUsage.outputTokens).toBeGreaterThan(0);
|
|
73
|
+
expect(result.toolInvocations).toEqual([]);
|
|
74
|
+
return [2 /*return*/];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}); }, TIMEOUT);
|
|
78
|
+
test('accumulates usage across multiple tool call steps', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
79
|
+
var lookupCalls, lookupTool, conversation, result;
|
|
80
|
+
return __generator(this, function (_a) {
|
|
81
|
+
switch (_a.label) {
|
|
82
|
+
case 0:
|
|
83
|
+
lookupCalls = [];
|
|
84
|
+
lookupTool = {
|
|
85
|
+
definition: {
|
|
86
|
+
name: 'lookupCapital',
|
|
87
|
+
description: 'Looks up the capital city of a country.',
|
|
88
|
+
parameters: {
|
|
89
|
+
type: 'object',
|
|
90
|
+
properties: {
|
|
91
|
+
country: { type: 'string', description: 'The country name' },
|
|
92
|
+
},
|
|
93
|
+
required: ['country'],
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
call: function (args) {
|
|
97
|
+
var _a;
|
|
98
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
99
|
+
var capitals;
|
|
100
|
+
return __generator(this, function (_b) {
|
|
101
|
+
lookupCalls.push(args.country);
|
|
102
|
+
capitals = {
|
|
103
|
+
france: 'Paris',
|
|
104
|
+
japan: 'Tokyo',
|
|
105
|
+
brazil: 'Brasília',
|
|
106
|
+
};
|
|
107
|
+
return [2 /*return*/, { capital: (_a = capitals[args.country.toLowerCase()]) !== null && _a !== void 0 ? _a : 'Unknown' }];
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
conversation = new Conversation_1.Conversation({
|
|
113
|
+
name: 'test-multi-tool',
|
|
114
|
+
modules: [
|
|
115
|
+
createTestModule('You are a geography assistant. Use lookupCapital for each country the user asks about. Make a separate call for each country.', [lookupTool]),
|
|
116
|
+
],
|
|
117
|
+
});
|
|
118
|
+
return [4 /*yield*/, conversation.generateResponse({
|
|
119
|
+
messages: ['What are the capitals of France, Japan, and Brazil?'],
|
|
120
|
+
model: TEST_MODEL,
|
|
121
|
+
})];
|
|
122
|
+
case 1:
|
|
123
|
+
result = _a.sent();
|
|
124
|
+
// Should have called the tool at least 2 times (ideally 3, but LLMs can batch)
|
|
125
|
+
expect(lookupCalls.length).toBeGreaterThanOrEqual(2);
|
|
126
|
+
// Response should mention the capitals
|
|
127
|
+
expect(result.text).toContain('Paris');
|
|
128
|
+
expect(result.text).toContain('Tokyo');
|
|
129
|
+
// Usage should reflect multiple steps
|
|
130
|
+
expect(result.usage.totalRequestsToAssistant).toBeGreaterThanOrEqual(2);
|
|
131
|
+
expect(result.usage.totalToolCalls).toBeGreaterThanOrEqual(2);
|
|
132
|
+
expect(result.usage.callsPerTool['lookupCapital']).toBeGreaterThanOrEqual(2);
|
|
133
|
+
// Total tokens should be substantial (multiple round trips)
|
|
134
|
+
expect(result.usage.totalTokenUsage.inputTokens).toBeGreaterThan(50);
|
|
135
|
+
expect(result.usage.totalTokenUsage.outputTokens).toBeGreaterThan(10);
|
|
136
|
+
// Cost should be calculated (gpt-4.1-nano is in our pricing table)
|
|
137
|
+
expect(result.usage.totalCostUsd.totalUsd).toBeGreaterThanOrEqual(0);
|
|
138
|
+
return [2 /*return*/];
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}); }, TIMEOUT);
|
|
142
|
+
test('handles conversation modules with system messages', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
143
|
+
var conversation, result, lower, hasPirateWord;
|
|
144
|
+
return __generator(this, function (_a) {
|
|
145
|
+
switch (_a.label) {
|
|
146
|
+
case 0:
|
|
147
|
+
conversation = new Conversation_1.Conversation({
|
|
148
|
+
name: 'test-system-msg',
|
|
149
|
+
modules: [createTestModule('You are a pirate. Always respond in pirate speak.', [])],
|
|
150
|
+
});
|
|
151
|
+
return [4 /*yield*/, conversation.generateResponse({
|
|
152
|
+
messages: ['Say hello.'],
|
|
153
|
+
model: TEST_MODEL,
|
|
154
|
+
})];
|
|
155
|
+
case 1:
|
|
156
|
+
result = _a.sent();
|
|
157
|
+
lower = result.text.toLowerCase();
|
|
158
|
+
hasPirateWord = ['ahoy', 'matey', 'arr', 'ye', 'aye', 'avast', 'yarr', 'shiver'].some(function (w) {
|
|
159
|
+
return lower.includes(w);
|
|
160
|
+
});
|
|
161
|
+
expect(hasPirateWord).toBe(true);
|
|
162
|
+
return [2 /*return*/];
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}); }, TIMEOUT);
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=conversation.generateResponse.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.generateResponse.test.js","sourceRoot":"","sources":["../../../test/conversation/conversation.generateResponse.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.generateStream.test.d.ts","sourceRoot":"","sources":["../../../test/conversation/conversation.generateStream.test.ts"],"names":[],"mappings":""}
|