@use-lattice/litmus 0.121.3
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/LICENSE +19 -0
- package/dist/src/accounts-Bt1oJb1Z.cjs +219 -0
- package/dist/src/accounts-DjOU8Rm3.js +178 -0
- package/dist/src/agentic-utils-D03IiXQc.js +153 -0
- package/dist/src/agentic-utils-Dh7xaMQM.cjs +180 -0
- package/dist/src/agents-C6BIMlZa.js +231 -0
- package/dist/src/agents-DvIpNX1L.cjs +666 -0
- package/dist/src/agents-ZP0RP9vV.cjs +231 -0
- package/dist/src/agents-maJXdjbR.js +665 -0
- package/dist/src/aimlapi-BTbQjG2E.cjs +30 -0
- package/dist/src/aimlapi-CwMxqfXP.js +30 -0
- package/dist/src/audio-BBUdvsde.cjs +97 -0
- package/dist/src/audio-D5DPZ7I-.js +97 -0
- package/dist/src/base-BEysXrkq.cjs +222 -0
- package/dist/src/base-C451JQfq.js +193 -0
- package/dist/src/blobs-BY8MDmpo.js +230 -0
- package/dist/src/blobs-BgcNn97m.cjs +256 -0
- package/dist/src/cache-BBE_lsTA.cjs +4 -0
- package/dist/src/cache-BkrqU5Ba.js +237 -0
- package/dist/src/cache-DsCxFlsZ.cjs +297 -0
- package/dist/src/chat-CPJWDP6a.cjs +289 -0
- package/dist/src/chat-CXX3xzkk.cjs +811 -0
- package/dist/src/chat-CcDgZFJ4.js +787 -0
- package/dist/src/chat-Dz5ZeGO2.js +289 -0
- package/dist/src/chatkit-Dw0mKkML.cjs +1158 -0
- package/dist/src/chatkit-swAIVuea.js +1157 -0
- package/dist/src/chunk-DEq-mXcV.js +15 -0
- package/dist/src/claude-agent-sdk-BXZJtOg6.js +379 -0
- package/dist/src/claude-agent-sdk-CkfyjDoG.cjs +383 -0
- package/dist/src/cloudflare-ai-BzpJcqUH.js +161 -0
- package/dist/src/cloudflare-ai-Cmy_R1y2.cjs +161 -0
- package/dist/src/cloudflare-gateway-B9tVQKok.cjs +272 -0
- package/dist/src/cloudflare-gateway-DrD3ew3H.js +272 -0
- package/dist/src/codex-sdk-Dezj9Nwm.js +1056 -0
- package/dist/src/codex-sdk-Dl9D4k5B.cjs +1060 -0
- package/dist/src/cometapi-C-9YvCHC.js +54 -0
- package/dist/src/cometapi-DHgDKoO2.cjs +54 -0
- package/dist/src/completion-B8Ctyxpr.js +120 -0
- package/dist/src/completion-Cxrt08sj.cjs +131 -0
- package/dist/src/createHash-BwgE13yv.cjs +27 -0
- package/dist/src/createHash-DmPQkvBh.js +15 -0
- package/dist/src/docker-BiqcTwLv.js +80 -0
- package/dist/src/docker-C7tEJnP-.cjs +80 -0
- package/dist/src/esm-C62Zofr1.cjs +409 -0
- package/dist/src/esm-DMVc93eh.js +379 -0
- package/dist/src/evalResult-C3NJPQOo.cjs +301 -0
- package/dist/src/evalResult-C7JJAPBb.js +295 -0
- package/dist/src/evalResult-DoVTZZWI.cjs +2 -0
- package/dist/src/extractor-DnMD3fwt.cjs +391 -0
- package/dist/src/extractor-DtlL28vL.js +374 -0
- package/dist/src/fetch-BTxakTSg.cjs +1133 -0
- package/dist/src/fetch-DQckpUFz.js +928 -0
- package/dist/src/fileExtensions-DnqA1y9x.js +85 -0
- package/dist/src/fileExtensions-bYh77CN8.cjs +114 -0
- package/dist/src/genaiTracer-CyZrmaK0.cjs +268 -0
- package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
- package/dist/src/graders-BNscxFrU.js +13644 -0
- package/dist/src/graders-D2oE9Msq.js +2 -0
- package/dist/src/graders-c0Ez_w-9.cjs +2 -0
- package/dist/src/graders-d0F2M3e9.cjs +14056 -0
- package/dist/src/image-0ZhE0VlR.cjs +280 -0
- package/dist/src/image-CWE1pdNv.js +257 -0
- package/dist/src/image-D9ZK6hwL.js +163 -0
- package/dist/src/image-DKZgZITg.cjs +163 -0
- package/dist/src/index.cjs +11366 -0
- package/dist/src/index.d.cts +19640 -0
- package/dist/src/index.d.ts +19641 -0
- package/dist/src/index.js +11306 -0
- package/dist/src/invariant-Ddh24eXh.js +25 -0
- package/dist/src/invariant-kfQ8Bu82.cjs +30 -0
- package/dist/src/knowledgeBase-BgPyGFUd.cjs +122 -0
- package/dist/src/knowledgeBase-DyHilYaP.js +122 -0
- package/dist/src/litellm-CyMeneHS.js +135 -0
- package/dist/src/litellm-DWDF73yF.cjs +135 -0
- package/dist/src/logger-C40ZGil9.js +717 -0
- package/dist/src/logger-DyfK9PBt.cjs +917 -0
- package/dist/src/luma-ray-BAU9X_ep.cjs +315 -0
- package/dist/src/luma-ray-nwVseBbv.js +313 -0
- package/dist/src/messages-B5ADWTTv.js +245 -0
- package/dist/src/messages-BCnZfqrS.cjs +257 -0
- package/dist/src/meteor-DLZZ3osF.cjs +134 -0
- package/dist/src/meteor-DUiCJRC-.js +134 -0
- package/dist/src/modelslab-00cveB8L.cjs +163 -0
- package/dist/src/modelslab-D9sCU_L7.js +163 -0
- package/dist/src/nova-reel-CTapvqYH.js +276 -0
- package/dist/src/nova-reel-DlWuuroF.cjs +278 -0
- package/dist/src/nova-sonic-5UPWfeMv.cjs +363 -0
- package/dist/src/nova-sonic-BhSwQNym.js +363 -0
- package/dist/src/openai-BWrJK9d8.cjs +52 -0
- package/dist/src/openai-DumO8WQn.js +47 -0
- package/dist/src/openclaw-B8brrjC_.cjs +577 -0
- package/dist/src/openclaw-Bkayww9q.js +571 -0
- package/dist/src/opencode-sdk-7xjoDNiM.cjs +562 -0
- package/dist/src/opencode-sdk-SGwAPxht.js +558 -0
- package/dist/src/otlpReceiver-CoAHfAN9.cjs +15 -0
- package/dist/src/otlpReceiver-oO3EQwI9.js +14 -0
- package/dist/src/providerRegistry-4yjhaEM8.js +45 -0
- package/dist/src/providerRegistry-DhV4rJIc.cjs +50 -0
- package/dist/src/providers-B5RJVG-7.cjs +33609 -0
- package/dist/src/providers-BdmZCLzV.js +33262 -0
- package/dist/src/providers-CxtRxn8e.js +2 -0
- package/dist/src/providers-DnQLNbx1.cjs +3 -0
- package/dist/src/pythonUtils-BD0druiM.cjs +275 -0
- package/dist/src/pythonUtils-IBhn5YGR.js +249 -0
- package/dist/src/quiverai-BDOwZBsM.cjs +213 -0
- package/dist/src/quiverai-D3JTF5lD.js +213 -0
- package/dist/src/responses-B2LCDCXZ.js +667 -0
- package/dist/src/responses-BvNm4Xv9.cjs +685 -0
- package/dist/src/rubyUtils-B0NwnfpY.cjs +245 -0
- package/dist/src/rubyUtils-BroxzZ7c.cjs +2 -0
- package/dist/src/rubyUtils-hqVw5UvJ.js +222 -0
- package/dist/src/sagemaker-Cno2V-Sx.js +689 -0
- package/dist/src/sagemaker-fV_KUgs5.cjs +691 -0
- package/dist/src/server-BOuAXb06.cjs +238 -0
- package/dist/src/server-CtI-EWzm.cjs +2 -0
- package/dist/src/server-Cy3DZymt.js +189 -0
- package/dist/src/slack-CP8xBePa.js +135 -0
- package/dist/src/slack-DSQ1yXVb.cjs +135 -0
- package/dist/src/store-BwDDaBjb.cjs +246 -0
- package/dist/src/store-DcbLC593.cjs +2 -0
- package/dist/src/store-IGpqMIkv.js +240 -0
- package/dist/src/tables-3Q2cL7So.cjs +373 -0
- package/dist/src/tables-Bi2fjr4W.js +288 -0
- package/dist/src/telemetry-Bg2WqF79.js +161 -0
- package/dist/src/telemetry-D0x6u5kX.cjs +166 -0
- package/dist/src/telemetry-DXNimrI0.cjs +2 -0
- package/dist/src/text-B_UCRPp2.js +22 -0
- package/dist/src/text-CW1cyrwj.cjs +33 -0
- package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
- package/dist/src/tokenUsageUtils-bVa1ga6f.cjs +173 -0
- package/dist/src/transcription-Cl_W16Pr.js +122 -0
- package/dist/src/transcription-yt1EecY8.cjs +124 -0
- package/dist/src/transform-BCtGrl_W.cjs +228 -0
- package/dist/src/transform-Bv6gG2MJ.cjs +1688 -0
- package/dist/src/transform-CY1wbpRy.js +1507 -0
- package/dist/src/transform-DU8rUL9P.cjs +2 -0
- package/dist/src/transform-yWaShiKr.js +216 -0
- package/dist/src/transformersAvailability-BGkzavwb.js +35 -0
- package/dist/src/transformersAvailability-DKoRtQLy.cjs +35 -0
- package/dist/src/types-5aqHpBwE.cjs +3769 -0
- package/dist/src/types-Bn6D9c4U.js +3300 -0
- package/dist/src/util-BkKlTkI2.js +293 -0
- package/dist/src/util-CTh0bfOm.cjs +1119 -0
- package/dist/src/util-D17oBwo7.cjs +328 -0
- package/dist/src/util-DsS_-v4p.js +613 -0
- package/dist/src/util-DuntT1Ga.js +951 -0
- package/dist/src/util-aWjdCYMI.cjs +667 -0
- package/dist/src/utils-CisQwpjA.js +94 -0
- package/dist/src/utils-yWamDvmz.cjs +123 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/drizzle/0000_lush_hellion.sql +36 -0
- package/drizzle/0001_wide_calypso.sql +3 -0
- package/drizzle/0002_tidy_juggernaut.sql +1 -0
- package/drizzle/0003_lively_naoko.sql +8 -0
- package/drizzle/0004_minor_peter_quill.sql +19 -0
- package/drizzle/0005_silky_millenium_guard.sql +2 -0
- package/drizzle/0006_harsh_caretaker.sql +42 -0
- package/drizzle/0007_cloudy_wong.sql +1 -0
- package/drizzle/0008_broad_boomer.sql +2 -0
- package/drizzle/0009_strong_marten_broadcloak.sql +19 -0
- package/drizzle/0010_needy_bishop.sql +11 -0
- package/drizzle/0011_moaning_millenium_guard.sql +1 -0
- package/drizzle/0012_late_marten_broadcloak.sql +2 -0
- package/drizzle/0013_previous_dormammu.sql +9 -0
- package/drizzle/0014_lazy_captain_universe.sql +2 -0
- package/drizzle/0015_zippy_wallop.sql +29 -0
- package/drizzle/0016_jazzy_zemo.sql +2 -0
- package/drizzle/0017_reflective_praxagora.sql +4 -0
- package/drizzle/0018_fat_vanisher.sql +22 -0
- package/drizzle/0019_new_clint_barton.sql +8 -0
- package/drizzle/0020_skinny_maverick.sql +1 -0
- package/drizzle/0021_mysterious_madelyne_pryor.sql +13 -0
- package/drizzle/0022_sleepy_ultimo.sql +25 -0
- package/drizzle/0023_wooden_mandrill.sql +2 -0
- package/drizzle/AGENTS.md +68 -0
- package/drizzle/CLAUDE.md +1 -0
- package/drizzle/meta/0000_snapshot.json +221 -0
- package/drizzle/meta/0001_snapshot.json +214 -0
- package/drizzle/meta/0002_snapshot.json +221 -0
- package/drizzle/meta/0005_snapshot.json +369 -0
- package/drizzle/meta/0006_snapshot.json +638 -0
- package/drizzle/meta/0007_snapshot.json +640 -0
- package/drizzle/meta/0008_snapshot.json +649 -0
- package/drizzle/meta/0009_snapshot.json +554 -0
- package/drizzle/meta/0010_snapshot.json +619 -0
- package/drizzle/meta/0011_snapshot.json +627 -0
- package/drizzle/meta/0012_snapshot.json +639 -0
- package/drizzle/meta/0013_snapshot.json +717 -0
- package/drizzle/meta/0014_snapshot.json +717 -0
- package/drizzle/meta/0015_snapshot.json +897 -0
- package/drizzle/meta/0016_snapshot.json +1031 -0
- package/drizzle/meta/0018_snapshot.json +1210 -0
- package/drizzle/meta/0019_snapshot.json +1165 -0
- package/drizzle/meta/0020_snapshot.json +1232 -0
- package/drizzle/meta/0021_snapshot.json +1311 -0
- package/drizzle/meta/0022_snapshot.json +1481 -0
- package/drizzle/meta/0023_snapshot.json +1496 -0
- package/drizzle/meta/_journal.json +174 -0
- package/package.json +240 -0
|
@@ -0,0 +1,666 @@
|
|
|
1
|
+
const require_logger = require("./logger-DyfK9PBt.cjs");
|
|
2
|
+
const require_esm = require("./esm-C62Zofr1.cjs");
|
|
3
|
+
const require_fetch = require("./fetch-BTxakTSg.cjs");
|
|
4
|
+
const require_openai = require("./openai-BWrJK9d8.cjs");
|
|
5
|
+
let path = require("path");
|
|
6
|
+
path = require_logger.__toESM(path);
|
|
7
|
+
let _openai_agents = require("@openai/agents");
|
|
8
|
+
//#region src/providers/openai/agents-model-settings.ts
|
|
9
|
+
function resolveModelSettings(modelSettings) {
|
|
10
|
+
if (!modelSettings) return;
|
|
11
|
+
const retry = modelSettings.retry ? {
|
|
12
|
+
...modelSettings.retry,
|
|
13
|
+
policy: resolveRetryPolicy(modelSettings.retry.policy)
|
|
14
|
+
} : void 0;
|
|
15
|
+
return {
|
|
16
|
+
...modelSettings,
|
|
17
|
+
retry
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function resolveRetryPolicy(policy) {
|
|
21
|
+
if (!policy) return;
|
|
22
|
+
if (typeof policy === "function") return policy;
|
|
23
|
+
if (typeof policy === "string") switch (policy) {
|
|
24
|
+
case "never": return _openai_agents.retryPolicies.never();
|
|
25
|
+
case "providerSuggested": return _openai_agents.retryPolicies.providerSuggested();
|
|
26
|
+
case "networkError": return _openai_agents.retryPolicies.networkError();
|
|
27
|
+
case "retryAfter": return _openai_agents.retryPolicies.retryAfter();
|
|
28
|
+
default: return;
|
|
29
|
+
}
|
|
30
|
+
if ("httpStatus" in policy) return _openai_agents.retryPolicies.httpStatus(policy.httpStatus);
|
|
31
|
+
if ("any" in policy) {
|
|
32
|
+
const policies = policy.any.map((nestedPolicy) => resolveRetryPolicy(nestedPolicy)).filter((nestedPolicy) => !!nestedPolicy);
|
|
33
|
+
return policies.length ? _openai_agents.retryPolicies.any(...policies) : void 0;
|
|
34
|
+
}
|
|
35
|
+
if ("all" in policy) {
|
|
36
|
+
const policies = policy.all.map((nestedPolicy) => resolveRetryPolicy(nestedPolicy)).filter((nestedPolicy) => !!nestedPolicy);
|
|
37
|
+
return policies.length ? _openai_agents.retryPolicies.all(...policies) : void 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/providers/openai/agents-loader.ts
|
|
42
|
+
/**
|
|
43
|
+
* Load agent definition from file path or return inline definition
|
|
44
|
+
*/
|
|
45
|
+
async function loadAgentDefinition(agentConfig) {
|
|
46
|
+
if (isAgentInstance(agentConfig)) {
|
|
47
|
+
require_logger.logger.debug("[AgentsLoader] Using provided Agent instance");
|
|
48
|
+
return agentConfig;
|
|
49
|
+
}
|
|
50
|
+
if (typeof agentConfig === "string" && agentConfig.startsWith("file://")) {
|
|
51
|
+
require_logger.logger.debug("[AgentsLoader] Loading agent from file", { path: agentConfig });
|
|
52
|
+
return await loadAgentFromFile(agentConfig);
|
|
53
|
+
}
|
|
54
|
+
if (agentConfig !== null && typeof agentConfig === "object" && !Array.isArray(agentConfig)) {
|
|
55
|
+
require_logger.logger.debug("[AgentsLoader] Creating agent from inline definition");
|
|
56
|
+
return await createAgentFromDefinition(agentConfig);
|
|
57
|
+
}
|
|
58
|
+
require_logger.logger.debug("[AgentsLoader] Invalid agent configuration", {
|
|
59
|
+
type: typeof agentConfig,
|
|
60
|
+
keys: typeof agentConfig === "object" && agentConfig !== null ? Object.keys(agentConfig).slice(0, 5) : void 0
|
|
61
|
+
});
|
|
62
|
+
throw new Error("Invalid agent configuration: expected Agent instance, file:// URL, or inline definition");
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Load tools from file path or return inline definitions
|
|
66
|
+
*/
|
|
67
|
+
async function loadTools(toolsConfig) {
|
|
68
|
+
if (!toolsConfig) return;
|
|
69
|
+
if (typeof toolsConfig === "string" && toolsConfig.startsWith("file://")) {
|
|
70
|
+
require_logger.logger.debug("[AgentsLoader] Loading tools from file", { path: toolsConfig });
|
|
71
|
+
return await loadToolsFromFile(toolsConfig);
|
|
72
|
+
}
|
|
73
|
+
if (Array.isArray(toolsConfig)) {
|
|
74
|
+
require_logger.logger.debug("[AgentsLoader] Using inline tool definitions");
|
|
75
|
+
return normalizeTools(toolsConfig);
|
|
76
|
+
}
|
|
77
|
+
require_logger.logger.debug("[AgentsLoader] Invalid tools configuration", {
|
|
78
|
+
type: typeof toolsConfig,
|
|
79
|
+
isArray: Array.isArray(toolsConfig)
|
|
80
|
+
});
|
|
81
|
+
throw new Error("Invalid tools configuration: expected file:// URL or array");
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Load handoffs from file path or return inline definitions
|
|
85
|
+
*/
|
|
86
|
+
async function loadHandoffs(handoffsConfig) {
|
|
87
|
+
if (!handoffsConfig) return;
|
|
88
|
+
if (typeof handoffsConfig === "string" && handoffsConfig.startsWith("file://")) {
|
|
89
|
+
require_logger.logger.debug("[AgentsLoader] Loading handoffs from file", { path: handoffsConfig });
|
|
90
|
+
return await loadHandoffsFromFile(handoffsConfig);
|
|
91
|
+
}
|
|
92
|
+
if (Array.isArray(handoffsConfig)) {
|
|
93
|
+
require_logger.logger.debug("[AgentsLoader] Using inline handoff definitions");
|
|
94
|
+
return normalizeHandoffs(handoffsConfig);
|
|
95
|
+
}
|
|
96
|
+
require_logger.logger.debug("[AgentsLoader] Invalid handoffs configuration", {
|
|
97
|
+
type: typeof handoffsConfig,
|
|
98
|
+
isArray: Array.isArray(handoffsConfig)
|
|
99
|
+
});
|
|
100
|
+
throw new Error("Invalid handoffs configuration: expected file:// URL or array");
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Load input guardrails from file path or return inline definitions
|
|
104
|
+
*/
|
|
105
|
+
async function loadInputGuardrails(guardrailsConfig) {
|
|
106
|
+
if (!guardrailsConfig) return;
|
|
107
|
+
if (typeof guardrailsConfig === "string" && guardrailsConfig.startsWith("file://")) {
|
|
108
|
+
require_logger.logger.debug("[AgentsLoader] Loading input guardrails from file", { path: guardrailsConfig });
|
|
109
|
+
return await loadArrayFromFile(guardrailsConfig, "input guardrails");
|
|
110
|
+
}
|
|
111
|
+
if (Array.isArray(guardrailsConfig)) {
|
|
112
|
+
require_logger.logger.debug("[AgentsLoader] Using inline input guardrails");
|
|
113
|
+
return guardrailsConfig;
|
|
114
|
+
}
|
|
115
|
+
require_logger.logger.debug("[AgentsLoader] Invalid input guardrails configuration", {
|
|
116
|
+
type: typeof guardrailsConfig,
|
|
117
|
+
isArray: Array.isArray(guardrailsConfig)
|
|
118
|
+
});
|
|
119
|
+
throw new Error("Invalid input guardrails configuration: expected file:// URL or array");
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Load output guardrails from file path or return inline definitions
|
|
123
|
+
*/
|
|
124
|
+
async function loadOutputGuardrails(guardrailsConfig) {
|
|
125
|
+
if (!guardrailsConfig) return;
|
|
126
|
+
if (typeof guardrailsConfig === "string" && guardrailsConfig.startsWith("file://")) {
|
|
127
|
+
require_logger.logger.debug("[AgentsLoader] Loading output guardrails from file", { path: guardrailsConfig });
|
|
128
|
+
return await loadArrayFromFile(guardrailsConfig, "output guardrails");
|
|
129
|
+
}
|
|
130
|
+
if (Array.isArray(guardrailsConfig)) {
|
|
131
|
+
require_logger.logger.debug("[AgentsLoader] Using inline output guardrails");
|
|
132
|
+
return guardrailsConfig;
|
|
133
|
+
}
|
|
134
|
+
require_logger.logger.debug("[AgentsLoader] Invalid output guardrails configuration", {
|
|
135
|
+
type: typeof guardrailsConfig,
|
|
136
|
+
isArray: Array.isArray(guardrailsConfig)
|
|
137
|
+
});
|
|
138
|
+
throw new Error("Invalid output guardrails configuration: expected file:// URL or array");
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Load agent from file
|
|
142
|
+
*/
|
|
143
|
+
async function loadAgentFromFile(filePath) {
|
|
144
|
+
const resolvedPath = resolveFilePath(filePath);
|
|
145
|
+
require_logger.logger.debug("[AgentsLoader] Loading agent from resolved path", { path: resolvedPath });
|
|
146
|
+
try {
|
|
147
|
+
const module = await require_esm.importModule(resolvedPath);
|
|
148
|
+
const agent = module.default || module;
|
|
149
|
+
if (!isAgentInstance(agent)) throw new Error(`File ${resolvedPath} does not export an Agent instance`);
|
|
150
|
+
return agent;
|
|
151
|
+
} catch (error) {
|
|
152
|
+
require_logger.logger.error("[AgentsLoader] Failed to load agent from file", {
|
|
153
|
+
path: resolvedPath,
|
|
154
|
+
error
|
|
155
|
+
});
|
|
156
|
+
throw new Error(`Failed to load agent from ${resolvedPath}: ${error}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Load tools from file
|
|
161
|
+
*/
|
|
162
|
+
async function loadToolsFromFile(filePath) {
|
|
163
|
+
return await normalizeTools(await loadArrayFromFile(filePath, "tools")) ?? [];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Load handoffs from file
|
|
167
|
+
*/
|
|
168
|
+
async function loadHandoffsFromFile(filePath) {
|
|
169
|
+
return await normalizeHandoffs(await loadArrayFromFile(filePath, "handoffs")) ?? [];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Create an Agent instance from an inline definition
|
|
173
|
+
*/
|
|
174
|
+
async function createAgentFromDefinition(definition) {
|
|
175
|
+
try {
|
|
176
|
+
const tools = await normalizeTools(definition.tools);
|
|
177
|
+
const handoffs = await normalizeHandoffs(definition.handoffs);
|
|
178
|
+
return new _openai_agents.Agent({
|
|
179
|
+
name: definition.name,
|
|
180
|
+
instructions: definition.instructions,
|
|
181
|
+
prompt: definition.prompt,
|
|
182
|
+
model: definition.model,
|
|
183
|
+
modelSettings: resolveModelSettings(definition.modelSettings),
|
|
184
|
+
handoffDescription: definition.handoffDescription,
|
|
185
|
+
outputType: definition.outputType,
|
|
186
|
+
tools,
|
|
187
|
+
handoffs,
|
|
188
|
+
inputGuardrails: definition.inputGuardrails,
|
|
189
|
+
outputGuardrails: definition.outputGuardrails,
|
|
190
|
+
mcpServers: definition.mcpServers,
|
|
191
|
+
toolUseBehavior: definition.toolUseBehavior,
|
|
192
|
+
resetToolChoice: definition.resetToolChoice
|
|
193
|
+
});
|
|
194
|
+
} catch (error) {
|
|
195
|
+
require_logger.logger.error("[AgentsLoader] Failed to create agent from definition", {
|
|
196
|
+
name: definition?.name,
|
|
197
|
+
model: definition?.model,
|
|
198
|
+
toolCount: definition?.tools?.length,
|
|
199
|
+
handoffCount: definition?.handoffs?.length,
|
|
200
|
+
error
|
|
201
|
+
});
|
|
202
|
+
throw new Error(`Failed to create agent from definition: ${error}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check if a value is an Agent instance
|
|
207
|
+
*/
|
|
208
|
+
function isAgentInstance(value) {
|
|
209
|
+
return value instanceof _openai_agents.Agent;
|
|
210
|
+
}
|
|
211
|
+
function isToolInstance(value) {
|
|
212
|
+
return !!value && typeof value === "object" && "type" in value && typeof value.type === "string";
|
|
213
|
+
}
|
|
214
|
+
function isHandoffInstance(value) {
|
|
215
|
+
return !!value && typeof value === "object" && "agent" in value && "getHandoffAsFunctionTool" in value && typeof value.getHandoffAsFunctionTool === "function";
|
|
216
|
+
}
|
|
217
|
+
async function normalizeTools(definitions) {
|
|
218
|
+
if (!definitions?.length) return;
|
|
219
|
+
return definitions.map((definition) => {
|
|
220
|
+
if (isToolInstance(definition)) return definition;
|
|
221
|
+
return (0, _openai_agents.tool)({
|
|
222
|
+
name: definition.name,
|
|
223
|
+
description: definition.description,
|
|
224
|
+
parameters: definition.parameters,
|
|
225
|
+
strict: definition.strict ?? true,
|
|
226
|
+
deferLoading: definition.deferLoading,
|
|
227
|
+
execute: typeof definition.execute === "function" ? definition.execute : async () => definition.execute
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
async function normalizeHandoffs(definitions) {
|
|
232
|
+
if (!definitions?.length) return;
|
|
233
|
+
return Promise.all(definitions.map(async (definition) => {
|
|
234
|
+
if (isAgentInstance(definition) || isHandoffInstance(definition)) return definition;
|
|
235
|
+
const agent = await loadAgentDefinition(definition.agent);
|
|
236
|
+
if (!definition.description) return agent;
|
|
237
|
+
return (0, _openai_agents.handoff)(agent, { toolDescriptionOverride: definition.description });
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
async function loadArrayFromFile(filePath, label) {
|
|
241
|
+
const resolvedPath = resolveFilePath(filePath);
|
|
242
|
+
require_logger.logger.debug(`[AgentsLoader] Loading ${label} from resolved path`, { path: resolvedPath });
|
|
243
|
+
try {
|
|
244
|
+
const module = await require_esm.importModule(resolvedPath);
|
|
245
|
+
const exported = module.default || module;
|
|
246
|
+
if (!Array.isArray(exported)) throw new Error(`File ${resolvedPath} does not export an array of ${label}`);
|
|
247
|
+
return exported;
|
|
248
|
+
} catch (error) {
|
|
249
|
+
require_logger.logger.error(`[AgentsLoader] Failed to load ${label} from file`, {
|
|
250
|
+
path: resolvedPath,
|
|
251
|
+
error
|
|
252
|
+
});
|
|
253
|
+
throw new Error(`Failed to load ${label} from ${resolvedPath}: ${error}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Resolve file:// path to absolute file system path
|
|
258
|
+
*/
|
|
259
|
+
function resolveFilePath(filePath) {
|
|
260
|
+
const cleanPath = filePath.replace(/^file:\/\//, "");
|
|
261
|
+
if (path.default.isAbsolute(cleanPath)) return cleanPath;
|
|
262
|
+
const basePath = require_logger.state.basePath || process.cwd();
|
|
263
|
+
const resolvedPath = path.default.resolve(basePath, cleanPath);
|
|
264
|
+
require_logger.logger.debug("[AgentsLoader] Resolved file path", {
|
|
265
|
+
original: filePath,
|
|
266
|
+
basePath,
|
|
267
|
+
resolved: resolvedPath
|
|
268
|
+
});
|
|
269
|
+
return resolvedPath;
|
|
270
|
+
}
|
|
271
|
+
//#endregion
|
|
272
|
+
//#region src/providers/openai/agents-tracing.ts
|
|
273
|
+
/**
|
|
274
|
+
* OTLP Tracing Exporter for OpenAI Agents
|
|
275
|
+
*
|
|
276
|
+
* Exports traces and spans from openai-agents-js to promptfoo's OTLP receiver
|
|
277
|
+
* in OTLP JSON format over HTTP.
|
|
278
|
+
*/
|
|
279
|
+
var OTLPTracingExporter = class {
|
|
280
|
+
otlpEndpoint;
|
|
281
|
+
evaluationId;
|
|
282
|
+
testCaseId;
|
|
283
|
+
constructor(options = {}) {
|
|
284
|
+
this.otlpEndpoint = options.otlpEndpoint || "http://localhost:4318";
|
|
285
|
+
this.evaluationId = options.evaluationId;
|
|
286
|
+
this.testCaseId = options.testCaseId;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Export traces and spans to OTLP endpoint
|
|
290
|
+
*/
|
|
291
|
+
async export(items, signal) {
|
|
292
|
+
if (items.length === 0) {
|
|
293
|
+
require_logger.logger.debug("[AgentsTracing] No items to export");
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
require_logger.logger.debug(`[AgentsTracing] Exporting ${items.length} items to OTLP`);
|
|
297
|
+
try {
|
|
298
|
+
const otlpPayload = this.transformToOTLP(items);
|
|
299
|
+
const url = `${this.otlpEndpoint}/v1/traces`;
|
|
300
|
+
require_logger.logger.debug("[AgentsTracing] Sending OTLP payload", {
|
|
301
|
+
url,
|
|
302
|
+
spanCount: otlpPayload.resourceSpans[0]?.scopeSpans[0]?.spans?.length || 0
|
|
303
|
+
});
|
|
304
|
+
const response = await require_fetch.fetchWithProxy(url, {
|
|
305
|
+
method: "POST",
|
|
306
|
+
headers: { "Content-Type": "application/json" },
|
|
307
|
+
body: JSON.stringify(otlpPayload),
|
|
308
|
+
signal
|
|
309
|
+
});
|
|
310
|
+
if (response.ok) require_logger.logger.debug("[AgentsTracing] Successfully exported traces to OTLP");
|
|
311
|
+
else require_logger.logger.error(`[AgentsTracing] OTLP export failed: ${response.status} ${response.statusText}`);
|
|
312
|
+
} catch (error) {
|
|
313
|
+
require_logger.logger.error("[AgentsTracing] Failed to export traces to OTLP", { error });
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Transform openai-agents-js traces/spans to OTLP JSON format
|
|
318
|
+
*/
|
|
319
|
+
transformToOTLP(items) {
|
|
320
|
+
const spans = items.filter((item) => item.type === "trace.span").map((item) => this.spanToOTLP(item));
|
|
321
|
+
return { resourceSpans: [{
|
|
322
|
+
resource: { attributes: [
|
|
323
|
+
{
|
|
324
|
+
key: "service.name",
|
|
325
|
+
value: { stringValue: "promptfoo-agents" }
|
|
326
|
+
},
|
|
327
|
+
...this.evaluationId ? [{
|
|
328
|
+
key: "evaluation.id",
|
|
329
|
+
value: { stringValue: this.evaluationId }
|
|
330
|
+
}] : [],
|
|
331
|
+
...this.testCaseId ? [{
|
|
332
|
+
key: "test.case.id",
|
|
333
|
+
value: { stringValue: this.testCaseId }
|
|
334
|
+
}] : []
|
|
335
|
+
] },
|
|
336
|
+
scopeSpans: [{
|
|
337
|
+
scope: {
|
|
338
|
+
name: "openai-agents-js",
|
|
339
|
+
version: "0.1.0"
|
|
340
|
+
},
|
|
341
|
+
spans
|
|
342
|
+
}]
|
|
343
|
+
}] };
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Convert a single span to OTLP format
|
|
347
|
+
*/
|
|
348
|
+
spanToOTLP(span) {
|
|
349
|
+
const startTime = span.startedAt ? new Date(span.startedAt).getTime() : Date.now();
|
|
350
|
+
const endTime = span.endedAt ? new Date(span.endedAt).getTime() : void 0;
|
|
351
|
+
const traceId = span.traceId || this.generateTraceId();
|
|
352
|
+
const spanId = span.spanId || this.generateSpanId();
|
|
353
|
+
return {
|
|
354
|
+
traceId: this.hexToBase64(traceId, "trace"),
|
|
355
|
+
spanId: this.hexToBase64(spanId, "span"),
|
|
356
|
+
parentSpanId: span.parentId ? this.hexToBase64(span.parentId, "span") : void 0,
|
|
357
|
+
name: this.getSpanName(span),
|
|
358
|
+
kind: 1,
|
|
359
|
+
startTimeUnixNano: String(startTime * 1e6),
|
|
360
|
+
endTimeUnixNano: endTime ? String(endTime * 1e6) : void 0,
|
|
361
|
+
attributes: this.attributesToOTLP(span.spanData),
|
|
362
|
+
status: this.getSpanStatus(span)
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get span name from span data
|
|
367
|
+
*/
|
|
368
|
+
getSpanName(span) {
|
|
369
|
+
const data = span.spanData;
|
|
370
|
+
if ("name" in data && data.name) return data.name;
|
|
371
|
+
if (data.type) return `agent.${data.type}`;
|
|
372
|
+
return "agent.span";
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get span status from span data
|
|
376
|
+
*/
|
|
377
|
+
getSpanStatus(span) {
|
|
378
|
+
const error = span.error;
|
|
379
|
+
if (error) return {
|
|
380
|
+
code: 2,
|
|
381
|
+
message: error.message || String(error)
|
|
382
|
+
};
|
|
383
|
+
return { code: 0 };
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Convert span data to OTLP attributes
|
|
387
|
+
*/
|
|
388
|
+
attributesToOTLP(data) {
|
|
389
|
+
const attributes = [];
|
|
390
|
+
if (!data) return attributes;
|
|
391
|
+
for (const [key, value] of Object.entries(data)) {
|
|
392
|
+
if (key === "name" || key === "type") continue;
|
|
393
|
+
attributes.push({
|
|
394
|
+
key: `agent.${key}`,
|
|
395
|
+
value: this.valueToOTLP(value)
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
return attributes;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Convert a value to OTLP attribute value format
|
|
402
|
+
*/
|
|
403
|
+
valueToOTLP(value) {
|
|
404
|
+
if (value === null || value === void 0) return { stringValue: "" };
|
|
405
|
+
if (typeof value === "string") return { stringValue: value };
|
|
406
|
+
if (typeof value === "number") return Number.isInteger(value) ? { intValue: String(value) } : { doubleValue: value };
|
|
407
|
+
if (typeof value === "boolean") return { boolValue: value };
|
|
408
|
+
if (Array.isArray(value)) return { arrayValue: { values: value.map((v) => this.valueToOTLP(v)) } };
|
|
409
|
+
if (typeof value === "object") return { stringValue: JSON.stringify(value) };
|
|
410
|
+
return { stringValue: String(value) };
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Convert hex string to base64 for OTLP format
|
|
414
|
+
* Handles openai-agents-js ID format (trace_XXX, span_XXX)
|
|
415
|
+
* @param hex - The hex string to convert
|
|
416
|
+
* @param kind - Whether this is a 'trace' (16 bytes) or 'span' (8 bytes) ID
|
|
417
|
+
*/
|
|
418
|
+
hexToBase64(hex, kind) {
|
|
419
|
+
if (!hex) return "";
|
|
420
|
+
try {
|
|
421
|
+
let cleanHex = hex.replace(/^(trace_|span_|group_)/, "");
|
|
422
|
+
const targetLength = kind === "span" ? 16 : 32;
|
|
423
|
+
if (cleanHex.length > targetLength) cleanHex = cleanHex.substring(0, targetLength);
|
|
424
|
+
else if (cleanHex.length < targetLength) cleanHex = cleanHex.padEnd(targetLength, "0");
|
|
425
|
+
return Buffer.from(cleanHex, "hex").toString("base64");
|
|
426
|
+
} catch (error) {
|
|
427
|
+
require_logger.logger.error(`[AgentsTracing] Failed to convert hex to base64: ${hex}`, { error });
|
|
428
|
+
const fallbackLen = kind === "span" ? 16 : 32;
|
|
429
|
+
return Buffer.from(this.generateRandomHex(fallbackLen), "hex").toString("base64");
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Generate a random trace ID (32 hex chars)
|
|
434
|
+
*/
|
|
435
|
+
generateTraceId() {
|
|
436
|
+
return this.generateRandomHex(32);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Generate a random span ID (16 hex chars)
|
|
440
|
+
*/
|
|
441
|
+
generateSpanId() {
|
|
442
|
+
return this.generateRandomHex(16);
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Generate random hex string of specified length
|
|
446
|
+
*/
|
|
447
|
+
generateRandomHex(length) {
|
|
448
|
+
const bytes = Math.ceil(length / 2);
|
|
449
|
+
const buffer = Buffer.alloc(bytes);
|
|
450
|
+
for (let i = 0; i < bytes; i++) buffer[i] = Math.floor(Math.random() * 256);
|
|
451
|
+
return buffer.toString("hex").substring(0, length);
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
//#endregion
|
|
455
|
+
//#region src/providers/openai/agents.ts
|
|
456
|
+
/**
|
|
457
|
+
* OpenAI Agents Provider
|
|
458
|
+
*
|
|
459
|
+
* Integrates openai-agents-js SDK as a promptfoo provider.
|
|
460
|
+
* Supports multi-turn agent workflows with tools, handoffs, and tracing.
|
|
461
|
+
*/
|
|
462
|
+
var OpenAiAgentsProvider = class extends require_openai.OpenAiGenericProvider {
|
|
463
|
+
agentConfig;
|
|
464
|
+
agent;
|
|
465
|
+
tracingExporter;
|
|
466
|
+
constructor(modelName, options = {}) {
|
|
467
|
+
super(modelName, options);
|
|
468
|
+
this.agentConfig = options.config || {};
|
|
469
|
+
}
|
|
470
|
+
id() {
|
|
471
|
+
return `openai:agents:${this.modelName}`;
|
|
472
|
+
}
|
|
473
|
+
toString() {
|
|
474
|
+
return `[OpenAI Agents Provider ${this.modelName}]`;
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Call the agent with the given prompt
|
|
478
|
+
*/
|
|
479
|
+
async callApi(prompt, context, callApiOptions) {
|
|
480
|
+
require_logger.logger.debug("[AgentsProvider] Starting agent call", {
|
|
481
|
+
prompt: prompt.substring(0, 100),
|
|
482
|
+
hasContext: !!context
|
|
483
|
+
});
|
|
484
|
+
try {
|
|
485
|
+
if (!this.agent) this.agent = await this.initializeAgent();
|
|
486
|
+
await this.setupTracingIfNeeded(context);
|
|
487
|
+
const result = await this.runAgent(prompt, context, callApiOptions);
|
|
488
|
+
require_logger.logger.debug("[AgentsProvider] Agent run completed", {
|
|
489
|
+
outputLength: result.output?.length || 0,
|
|
490
|
+
tokenUsage: result.tokenUsage
|
|
491
|
+
});
|
|
492
|
+
return result;
|
|
493
|
+
} catch (error) {
|
|
494
|
+
require_logger.logger.error("[AgentsProvider] Agent call failed", { error });
|
|
495
|
+
throw error;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Initialize the agent from configuration
|
|
500
|
+
*/
|
|
501
|
+
async initializeAgent() {
|
|
502
|
+
require_logger.logger.debug("[AgentsProvider] Initializing agent");
|
|
503
|
+
if (!this.agentConfig.agent) throw new Error("No agent configuration provided");
|
|
504
|
+
try {
|
|
505
|
+
const agent = await loadAgentDefinition(this.agentConfig.agent);
|
|
506
|
+
const [tools, handoffs, inputGuardrails, outputGuardrails] = await Promise.all([
|
|
507
|
+
loadTools(this.agentConfig.tools),
|
|
508
|
+
loadHandoffs(this.agentConfig.handoffs),
|
|
509
|
+
loadInputGuardrails(this.agentConfig.inputGuardrails),
|
|
510
|
+
loadOutputGuardrails(this.agentConfig.outputGuardrails)
|
|
511
|
+
]);
|
|
512
|
+
const configuredAgent = agent.clone({
|
|
513
|
+
tools: mergeArrays(agent.tools, tools),
|
|
514
|
+
handoffs: mergeArrays(agent.handoffs, handoffs),
|
|
515
|
+
inputGuardrails: mergeArrays(agent.inputGuardrails, inputGuardrails),
|
|
516
|
+
outputGuardrails: mergeArrays(agent.outputGuardrails, outputGuardrails)
|
|
517
|
+
});
|
|
518
|
+
const mockAwareAgent = this.wrapToolsIfNeeded(configuredAgent);
|
|
519
|
+
require_logger.logger.debug("[AgentsProvider] Agent initialized successfully", {
|
|
520
|
+
name: mockAwareAgent.name,
|
|
521
|
+
toolCount: mockAwareAgent.tools.length,
|
|
522
|
+
handoffCount: mockAwareAgent.handoffs.length,
|
|
523
|
+
inputGuardrailCount: mockAwareAgent.inputGuardrails.length,
|
|
524
|
+
outputGuardrailCount: mockAwareAgent.outputGuardrails.length
|
|
525
|
+
});
|
|
526
|
+
return mockAwareAgent;
|
|
527
|
+
} catch (error) {
|
|
528
|
+
require_logger.logger.error("[AgentsProvider] Failed to initialize agent", { error });
|
|
529
|
+
throw new Error(`Failed to initialize agent: ${error}`);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Setup tracing if enabled
|
|
534
|
+
*/
|
|
535
|
+
async setupTracingIfNeeded(context) {
|
|
536
|
+
if (!(this.agentConfig.tracing === true || context?.test?.metadata?.tracingEnabled === true || process.env.PROMPTFOO_TRACING_ENABLED === "true")) {
|
|
537
|
+
require_logger.logger.debug("[AgentsProvider] Tracing not enabled");
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
require_logger.logger.debug("[AgentsProvider] Setting up tracing");
|
|
541
|
+
try {
|
|
542
|
+
this.tracingExporter = new OTLPTracingExporter({
|
|
543
|
+
otlpEndpoint: this.agentConfig.otlpEndpoint,
|
|
544
|
+
evaluationId: context?.evaluationId,
|
|
545
|
+
testCaseId: context?.testCaseId
|
|
546
|
+
});
|
|
547
|
+
await this.registerTracingExporter(this.tracingExporter);
|
|
548
|
+
(0, _openai_agents.startTraceExportLoop)();
|
|
549
|
+
require_logger.logger.debug("[AgentsProvider] Tracing setup complete");
|
|
550
|
+
} catch (error) {
|
|
551
|
+
require_logger.logger.error("[AgentsProvider] Failed to setup tracing", { error });
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Register tracing exporter with openai-agents-js tracing system
|
|
556
|
+
*/
|
|
557
|
+
async registerTracingExporter(exporter) {
|
|
558
|
+
try {
|
|
559
|
+
(0, _openai_agents.addTraceProcessor)(new _openai_agents.BatchTraceProcessor(exporter, {
|
|
560
|
+
maxQueueSize: 100,
|
|
561
|
+
maxBatchSize: 10,
|
|
562
|
+
scheduleDelay: 1e3
|
|
563
|
+
}));
|
|
564
|
+
require_logger.logger.debug("[AgentsProvider] Tracing processor registered");
|
|
565
|
+
} catch (error) {
|
|
566
|
+
require_logger.logger.error("[AgentsProvider] Failed to register tracing processor", { error });
|
|
567
|
+
throw error;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Run the agent with the given prompt
|
|
572
|
+
*/
|
|
573
|
+
async runAgent(prompt, context, callApiOptions) {
|
|
574
|
+
try {
|
|
575
|
+
require_logger.logger.debug("[AgentsProvider] Running agent", {
|
|
576
|
+
agentName: this.agent?.name,
|
|
577
|
+
maxTurns: this.agentConfig.maxTurns ?? 10
|
|
578
|
+
});
|
|
579
|
+
const runOptions = {
|
|
580
|
+
context: context?.vars,
|
|
581
|
+
maxTurns: this.agentConfig.maxTurns ?? 10,
|
|
582
|
+
signal: callApiOptions?.abortSignal
|
|
583
|
+
};
|
|
584
|
+
if (this.agentConfig.model || this.modelName) runOptions.model = this.agentConfig.model || this.modelName;
|
|
585
|
+
if (this.agentConfig.modelSettings) runOptions.modelSettings = resolveModelSettings(this.agentConfig.modelSettings);
|
|
586
|
+
const result = await (0, _openai_agents.getOrCreateTrace)(async () => {
|
|
587
|
+
return await (0, _openai_agents.run)(this.agent, this.parsePromptInput(prompt), runOptions);
|
|
588
|
+
});
|
|
589
|
+
require_logger.logger.debug("[AgentsProvider] Agent run result", {
|
|
590
|
+
hasOutput: !!result.finalOutput,
|
|
591
|
+
turns: result.newItems?.length || 0
|
|
592
|
+
});
|
|
593
|
+
return {
|
|
594
|
+
output: result.finalOutput,
|
|
595
|
+
tokenUsage: this.extractTokenUsage(result),
|
|
596
|
+
cached: false,
|
|
597
|
+
cost: this.calculateCost(result)
|
|
598
|
+
};
|
|
599
|
+
} catch (error) {
|
|
600
|
+
require_logger.logger.error("[AgentsProvider] Failed to run agent", { error });
|
|
601
|
+
throw error;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Extract token usage from agent result
|
|
606
|
+
*/
|
|
607
|
+
extractTokenUsage(result) {
|
|
608
|
+
if (!result.usage) return {};
|
|
609
|
+
const usage = result.usage;
|
|
610
|
+
return {
|
|
611
|
+
total: usage.totalTokens ?? void 0,
|
|
612
|
+
prompt: usage.promptTokens ?? void 0,
|
|
613
|
+
completion: usage.completionTokens ?? void 0
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Calculate cost from agent result
|
|
618
|
+
*/
|
|
619
|
+
calculateCost(_result) {}
|
|
620
|
+
wrapToolsIfNeeded(agent) {
|
|
621
|
+
if (this.agentConfig.executeTools !== false && this.agentConfig.executeTools !== "mock") return agent;
|
|
622
|
+
const toolMocks = this.agentConfig.toolMocks ?? {};
|
|
623
|
+
const tools = agent.tools.map((tool) => {
|
|
624
|
+
if (tool.type !== "function") return tool;
|
|
625
|
+
const mockValue = toolMocks[tool.name];
|
|
626
|
+
return {
|
|
627
|
+
...tool,
|
|
628
|
+
invoke: async () => mockValue ?? {
|
|
629
|
+
mocked: true,
|
|
630
|
+
tool: tool.name
|
|
631
|
+
}
|
|
632
|
+
};
|
|
633
|
+
});
|
|
634
|
+
return agent.clone({ tools });
|
|
635
|
+
}
|
|
636
|
+
parsePromptInput(prompt) {
|
|
637
|
+
try {
|
|
638
|
+
const parsedInput = parseAgentInputItems(JSON.parse(prompt));
|
|
639
|
+
if (parsedInput) return parsedInput;
|
|
640
|
+
} catch {}
|
|
641
|
+
return prompt;
|
|
642
|
+
}
|
|
643
|
+
};
|
|
644
|
+
function mergeArrays(existing, additions) {
|
|
645
|
+
if (!existing?.length && !additions?.length) return;
|
|
646
|
+
return [...existing ?? [], ...additions ?? []];
|
|
647
|
+
}
|
|
648
|
+
function parseAgentInputItems(value) {
|
|
649
|
+
if (Array.isArray(value)) {
|
|
650
|
+
if (value.length === 0) return;
|
|
651
|
+
const parsedItems = [];
|
|
652
|
+
for (const item of value) {
|
|
653
|
+
const parsedItem = _openai_agents.protocol.ModelItem.safeParse(item);
|
|
654
|
+
if (!parsedItem.success) return;
|
|
655
|
+
parsedItems.push(parsedItem.data);
|
|
656
|
+
}
|
|
657
|
+
return parsedItems;
|
|
658
|
+
}
|
|
659
|
+
const parsedItem = _openai_agents.protocol.ModelItem.safeParse(value);
|
|
660
|
+
if (!parsedItem.success) return;
|
|
661
|
+
return [parsedItem.data];
|
|
662
|
+
}
|
|
663
|
+
//#endregion
|
|
664
|
+
exports.OpenAiAgentsProvider = OpenAiAgentsProvider;
|
|
665
|
+
|
|
666
|
+
//# sourceMappingURL=agents-DvIpNX1L.cjs.map
|