@od-oneapp/ai-platform 0.1.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/README.md +235 -0
- package/dist/agents-base.d.mts +12 -0
- package/dist/agents-base.d.mts.map +1 -0
- package/dist/agents-base.mjs +20 -0
- package/dist/agents-base.mjs.map +1 -0
- package/dist/agents-control-flow.d.mts +115 -0
- package/dist/agents-control-flow.d.mts.map +1 -0
- package/dist/agents-control-flow.mjs +514 -0
- package/dist/agents-control-flow.mjs.map +1 -0
- package/dist/agents-coordinator.d.mts +11 -0
- package/dist/agents-coordinator.d.mts.map +1 -0
- package/dist/agents-coordinator.mjs +12 -0
- package/dist/agents-coordinator.mjs.map +1 -0
- package/dist/agents-experimental.d.mts +153 -0
- package/dist/agents-experimental.d.mts.map +1 -0
- package/dist/agents-experimental.mjs +580 -0
- package/dist/agents-experimental.mjs.map +1 -0
- package/dist/agents-fallback.d.mts +10 -0
- package/dist/agents-fallback.d.mts.map +1 -0
- package/dist/agents-fallback.mjs +15 -0
- package/dist/agents-fallback.mjs.map +1 -0
- package/dist/agents-multi-swarm.d.mts +9 -0
- package/dist/agents-multi-swarm.d.mts.map +1 -0
- package/dist/agents-multi-swarm.mjs +44 -0
- package/dist/agents-multi-swarm.mjs.map +1 -0
- package/dist/agents-multi.d.mts +10 -0
- package/dist/agents-multi.d.mts.map +1 -0
- package/dist/agents-multi.mjs +44 -0
- package/dist/agents-multi.mjs.map +1 -0
- package/dist/agents-observability.d.mts +161 -0
- package/dist/agents-observability.d.mts.map +1 -0
- package/dist/agents-observability.mjs +550 -0
- package/dist/agents-observability.mjs.map +1 -0
- package/dist/agents-patterns.d.mts +9 -0
- package/dist/agents-patterns.d.mts.map +1 -0
- package/dist/agents-patterns.mjs +18 -0
- package/dist/agents-patterns.mjs.map +1 -0
- package/dist/agents-persistence.d.mts +234 -0
- package/dist/agents-persistence.d.mts.map +1 -0
- package/dist/agents-persistence.mjs +447 -0
- package/dist/agents-persistence.mjs.map +1 -0
- package/dist/agents-triage.d.mts +11 -0
- package/dist/agents-triage.d.mts.map +1 -0
- package/dist/agents-triage.mjs +13 -0
- package/dist/agents-triage.mjs.map +1 -0
- package/dist/agents-workflows.d.mts +9 -0
- package/dist/agents-workflows.d.mts.map +1 -0
- package/dist/agents-workflows.mjs +9 -0
- package/dist/agents-workflows.mjs.map +1 -0
- package/dist/agents.d.mts +30 -0
- package/dist/agents.d.mts.map +1 -0
- package/dist/agents.mjs +50 -0
- package/dist/agents.mjs.map +1 -0
- package/dist/aggregation-8KJF1uzp.d.mts +276 -0
- package/dist/aggregation-8KJF1uzp.d.mts.map +1 -0
- package/dist/aggregation-BDop87kL.mjs +1180 -0
- package/dist/aggregation-BDop87kL.mjs.map +1 -0
- package/dist/ai-runtime-CDzQztTt.mjs +85 -0
- package/dist/ai-runtime-CDzQztTt.mjs.map +1 -0
- package/dist/ai-runtime-DIwOEc6g.d.mts +56 -0
- package/dist/ai-runtime-DIwOEc6g.d.mts.map +1 -0
- package/dist/ai-sdk-error-integration-D0GDqrM0.d.mts +553 -0
- package/dist/ai-sdk-error-integration-D0GDqrM0.d.mts.map +1 -0
- package/dist/approval-queue-BcDDQ4oQ.mjs +104 -0
- package/dist/approval-queue-BcDDQ4oQ.mjs.map +1 -0
- package/dist/approval-queue-CiKiFT9z.d.mts +21 -0
- package/dist/approval-queue-CiKiFT9z.d.mts.map +1 -0
- package/dist/audio-BzvN7r10.d.mts +79 -0
- package/dist/audio-BzvN7r10.d.mts.map +1 -0
- package/dist/audio-vBG_62ME.mjs +226 -0
- package/dist/audio-vBG_62ME.mjs.map +1 -0
- package/dist/audit-logger-Bb2JIcIk.d.mts +12 -0
- package/dist/audit-logger-Bb2JIcIk.d.mts.map +1 -0
- package/dist/audit-logger-CHIP8bRO.mjs +596 -0
- package/dist/audit-logger-CHIP8bRO.mjs.map +1 -0
- package/dist/auto-resume-BpUNbPtp.d.mts +160 -0
- package/dist/auto-resume-BpUNbPtp.d.mts.map +1 -0
- package/dist/auto-resume-BuFRNvAX.mjs +638 -0
- package/dist/auto-resume-BuFRNvAX.mjs.map +1 -0
- package/dist/budget-guard-C83KCH9V.d.mts +52 -0
- package/dist/budget-guard-C83KCH9V.d.mts.map +1 -0
- package/dist/budget-guard-d_b5rq4u.mjs +158 -0
- package/dist/budget-guard-d_b5rq4u.mjs.map +1 -0
- package/dist/budget-guard-gyhJS00s.mjs +234 -0
- package/dist/budget-guard-gyhJS00s.mjs.map +1 -0
- package/dist/buffer-BC8mvXHE.d.mts +98 -0
- package/dist/buffer-BC8mvXHE.d.mts.map +1 -0
- package/dist/buffer-CefJGbRy.mjs +289 -0
- package/dist/buffer-CefJGbRy.mjs.map +1 -0
- package/dist/caching-adapters.d.mts +5 -0
- package/dist/caching-adapters.mjs +3 -0
- package/dist/caching-strategies.d.mts +52 -0
- package/dist/caching-strategies.d.mts.map +1 -0
- package/dist/caching-strategies.mjs +703 -0
- package/dist/caching-strategies.mjs.map +1 -0
- package/dist/caching.d.mts +14 -0
- package/dist/caching.d.mts.map +1 -0
- package/dist/caching.mjs +15 -0
- package/dist/caching.mjs.map +1 -0
- package/dist/catalog.d.mts +19 -0
- package/dist/catalog.d.mts.map +1 -0
- package/dist/catalog.mjs +1114 -0
- package/dist/catalog.mjs.map +1 -0
- package/dist/chunk-CkzbjWQW.mjs +20 -0
- package/dist/circuit-breaker-DoKWPORd.mjs +262 -0
- package/dist/circuit-breaker-DoKWPORd.mjs.map +1 -0
- package/dist/circuit-breaker-Mey3E7tW.d.mts +64 -0
- package/dist/circuit-breaker-Mey3E7tW.d.mts.map +1 -0
- package/dist/citation-generator-C-9RpbHq.mjs +103 -0
- package/dist/citation-generator-C-9RpbHq.mjs.map +1 -0
- package/dist/citation-generator-CDSymDs_.d.mts +18 -0
- package/dist/citation-generator-CDSymDs_.d.mts.map +1 -0
- package/dist/client-CpacYDIE.mjs +882 -0
- package/dist/client-CpacYDIE.mjs.map +1 -0
- package/dist/client.d.mts +103 -0
- package/dist/client.d.mts.map +1 -0
- package/dist/client.mjs +470 -0
- package/dist/client.mjs.map +1 -0
- package/dist/compliance-approval-queue-DQGLojAm.mjs +172 -0
- package/dist/compliance-approval-queue-DQGLojAm.mjs.map +1 -0
- package/dist/compliance-approval-queue-IrMxFfSJ.d.mts +99 -0
- package/dist/compliance-approval-queue-IrMxFfSJ.d.mts.map +1 -0
- package/dist/compliance-wrapper-CrOMHhHN.mjs +528 -0
- package/dist/compliance-wrapper-CrOMHhHN.mjs.map +1 -0
- package/dist/conditions-DmQ6Y1Wt.mjs +179 -0
- package/dist/conditions-DmQ6Y1Wt.mjs.map +1 -0
- package/dist/conditions-zDrKfrc3.d.mts +42 -0
- package/dist/conditions-zDrKfrc3.d.mts.map +1 -0
- package/dist/console-BGMxxPZN.mjs +181 -0
- package/dist/console-BGMxxPZN.mjs.map +1 -0
- package/dist/console-DqEqZd4A.d.mts +76 -0
- package/dist/console-DqEqZd4A.d.mts.map +1 -0
- package/dist/controller-BOy3-xbC.mjs +501 -0
- package/dist/controller-BOy3-xbC.mjs.map +1 -0
- package/dist/controller-Y0NGosbJ.d.mts +104 -0
- package/dist/controller-Y0NGosbJ.d.mts.map +1 -0
- package/dist/coordinator-agent-BglqZLwo.d.mts +54 -0
- package/dist/coordinator-agent-BglqZLwo.d.mts.map +1 -0
- package/dist/coordinator-agent-WFWBRL-G.mjs +236 -0
- package/dist/coordinator-agent-WFWBRL-G.mjs.map +1 -0
- package/dist/crypto-8ABhc3TD.mjs +40 -0
- package/dist/crypto-8ABhc3TD.mjs.map +1 -0
- package/dist/environment-CSoJb0SW.mjs +255 -0
- package/dist/environment-CSoJb0SW.mjs.map +1 -0
- package/dist/error-handling-DNVkm6RY.mjs +1334 -0
- package/dist/error-handling-DNVkm6RY.mjs.map +1 -0
- package/dist/errors-CQ8tF4dP.mjs +985 -0
- package/dist/errors-CQ8tF4dP.mjs.map +1 -0
- package/dist/errors-CfYdVeum.d.mts +212 -0
- package/dist/errors-CfYdVeum.d.mts.map +1 -0
- package/dist/errors-Dtn-UeRi.mjs +61 -0
- package/dist/errors-Dtn-UeRi.mjs.map +1 -0
- package/dist/evaluator-Cs84qkr8.mjs +91 -0
- package/dist/evaluator-Cs84qkr8.mjs.map +1 -0
- package/dist/evaluator-optimizer-De67_mJC.mjs +1086 -0
- package/dist/evaluator-optimizer-De67_mJC.mjs.map +1 -0
- package/dist/evaluator-optimizer-pattern-B5939s2Z.mjs +367 -0
- package/dist/evaluator-optimizer-pattern-B5939s2Z.mjs.map +1 -0
- package/dist/evaluator-optimizer-pattern-D1AJrzBD.d.mts +72 -0
- package/dist/evaluator-optimizer-pattern-D1AJrzBD.d.mts.map +1 -0
- package/dist/factory-DP6VSl8C.mjs +307 -0
- package/dist/factory-DP6VSl8C.mjs.map +1 -0
- package/dist/generative-ui-catalog.d.mts +8 -0
- package/dist/generative-ui-catalog.d.mts.map +1 -0
- package/dist/generative-ui-catalog.mjs +679 -0
- package/dist/generative-ui-catalog.mjs.map +1 -0
- package/dist/generative-ui-registry.d.mts +195 -0
- package/dist/generative-ui-registry.d.mts.map +1 -0
- package/dist/generative-ui-registry.mjs +250 -0
- package/dist/generative-ui-registry.mjs.map +1 -0
- package/dist/generative-ui-stream.d.mts +23 -0
- package/dist/generative-ui-stream.d.mts.map +1 -0
- package/dist/generative-ui-stream.mjs +219 -0
- package/dist/generative-ui-stream.mjs.map +1 -0
- package/dist/generative-ui-types.d.mts +123 -0
- package/dist/generative-ui-types.d.mts.map +1 -0
- package/dist/generative-ui-types.mjs +1 -0
- package/dist/generative-ui.d.mts +13 -0
- package/dist/generative-ui.d.mts.map +1 -0
- package/dist/generative-ui.mjs +21 -0
- package/dist/generative-ui.mjs.map +1 -0
- package/dist/governance-audit.d.mts +3 -0
- package/dist/governance-audit.mjs +3 -0
- package/dist/governance-compliance.d.mts +5 -0
- package/dist/governance-compliance.mjs +4 -0
- package/dist/governance-policies.d.mts +4 -0
- package/dist/governance-policies.mjs +4 -0
- package/dist/governance-tenancy.d.mts +3 -0
- package/dist/governance-tenancy.mjs +3 -0
- package/dist/governance.d.mts +88 -0
- package/dist/governance.d.mts.map +1 -0
- package/dist/governance.mjs +432 -0
- package/dist/governance.mjs.map +1 -0
- package/dist/grounding-attribution.d.mts +63 -0
- package/dist/grounding-attribution.d.mts.map +1 -0
- package/dist/grounding-attribution.mjs +259 -0
- package/dist/grounding-attribution.mjs.map +1 -0
- package/dist/grounding-citation.d.mts +2 -0
- package/dist/grounding-citation.mjs +3 -0
- package/dist/grounding-context.d.mts +9 -0
- package/dist/grounding-context.d.mts.map +1 -0
- package/dist/grounding-context.mjs +19 -0
- package/dist/grounding-context.mjs.map +1 -0
- package/dist/grounding-embed.d.mts +102 -0
- package/dist/grounding-embed.d.mts.map +1 -0
- package/dist/grounding-embed.mjs +417 -0
- package/dist/grounding-embed.mjs.map +1 -0
- package/dist/grounding-hallucination.d.mts +44 -0
- package/dist/grounding-hallucination.d.mts.map +1 -0
- package/dist/grounding-hallucination.mjs +115 -0
- package/dist/grounding-hallucination.mjs.map +1 -0
- package/dist/grounding-proof-map.d.mts +9 -0
- package/dist/grounding-proof-map.d.mts.map +1 -0
- package/dist/grounding-proof-map.mjs +26 -0
- package/dist/grounding-proof-map.mjs.map +1 -0
- package/dist/grounding-rag.d.mts +10 -0
- package/dist/grounding-rag.d.mts.map +1 -0
- package/dist/grounding-rag.mjs +27 -0
- package/dist/grounding-rag.mjs.map +1 -0
- package/dist/grounding-verification.d.mts +48 -0
- package/dist/grounding-verification.d.mts.map +1 -0
- package/dist/grounding-verification.mjs +224 -0
- package/dist/grounding-verification.mjs.map +1 -0
- package/dist/grounding.d.mts +24 -0
- package/dist/grounding.d.mts.map +1 -0
- package/dist/grounding.mjs +77 -0
- package/dist/grounding.mjs.map +1 -0
- package/dist/hitl-active-learning.d.mts +41 -0
- package/dist/hitl-active-learning.d.mts.map +1 -0
- package/dist/hitl-active-learning.mjs +178 -0
- package/dist/hitl-active-learning.mjs.map +1 -0
- package/dist/hitl-annotation.d.mts +74 -0
- package/dist/hitl-annotation.d.mts.map +1 -0
- package/dist/hitl-annotation.mjs +170 -0
- package/dist/hitl-annotation.mjs.map +1 -0
- package/dist/hitl-approval.d.mts +2 -0
- package/dist/hitl-approval.mjs +3 -0
- package/dist/hitl-feedback.d.mts +59 -0
- package/dist/hitl-feedback.d.mts.map +1 -0
- package/dist/hitl-feedback.mjs +137 -0
- package/dist/hitl-feedback.mjs.map +1 -0
- package/dist/hitl-review.d.mts +2 -0
- package/dist/hitl-review.mjs +3 -0
- package/dist/hitl.d.mts +14 -0
- package/dist/hitl.d.mts.map +1 -0
- package/dist/hitl.mjs +22 -0
- package/dist/hitl.mjs.map +1 -0
- package/dist/index-B17HT-VL.d.mts +285 -0
- package/dist/index-B17HT-VL.d.mts.map +1 -0
- package/dist/index-BDwgsK9B.d.mts +101 -0
- package/dist/index-BDwgsK9B.d.mts.map +1 -0
- package/dist/index-BGgMn_Ev.d.mts +2615 -0
- package/dist/index-BGgMn_Ev.d.mts.map +1 -0
- package/dist/index-DOqe5r9G.d.mts +318 -0
- package/dist/index-DOqe5r9G.d.mts.map +1 -0
- package/dist/index-DotINT7o.d.mts +1004 -0
- package/dist/index-DotINT7o.d.mts.map +1 -0
- package/dist/index-URlW7aD1.d.mts +67 -0
- package/dist/index-URlW7aD1.d.mts.map +1 -0
- package/dist/index.d.mts +64 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +46 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integrations-blob-storage.d.mts +25 -0
- package/dist/integrations-blob-storage.d.mts.map +1 -0
- package/dist/integrations-blob-storage.mjs +3 -0
- package/dist/integrations-notifications.d.mts +2 -0
- package/dist/integrations-notifications.mjs +3 -0
- package/dist/integrations-rate-limit.d.mts +27 -0
- package/dist/integrations-rate-limit.d.mts.map +1 -0
- package/dist/integrations-rate-limit.mjs +30 -0
- package/dist/integrations-rate-limit.mjs.map +1 -0
- package/dist/integrations-redis.d.mts +3 -0
- package/dist/integrations-redis.mjs +3 -0
- package/dist/integrations-stream.d.mts +14 -0
- package/dist/integrations-stream.d.mts.map +1 -0
- package/dist/integrations-stream.mjs +3 -0
- package/dist/integrations.d.mts +7 -0
- package/dist/integrations.mjs +7 -0
- package/dist/log-adapter-BLegSZtz.d.mts +16 -0
- package/dist/log-adapter-BLegSZtz.d.mts.map +1 -0
- package/dist/log-adapter-PPe_2Pwv.mjs +28 -0
- package/dist/log-adapter-PPe_2Pwv.mjs.map +1 -0
- package/dist/loop-BOYEtr2g.mjs +520 -0
- package/dist/loop-BOYEtr2g.mjs.map +1 -0
- package/dist/loop-C-tBBOqi.d.mts +219 -0
- package/dist/loop-C-tBBOqi.d.mts.map +1 -0
- package/dist/middleware-5wQ9bANW.mjs +306 -0
- package/dist/middleware-5wQ9bANW.mjs.map +1 -0
- package/dist/middleware-C1apSrj0.mjs +613 -0
- package/dist/middleware-C1apSrj0.mjs.map +1 -0
- package/dist/middleware-C7k0uItW.d.mts +9 -0
- package/dist/middleware-C7k0uItW.d.mts.map +1 -0
- package/dist/middleware-CZQCTHfl.mjs +366 -0
- package/dist/middleware-CZQCTHfl.mjs.map +1 -0
- package/dist/models.d.mts +11 -0
- package/dist/models.d.mts.map +1 -0
- package/dist/models.mjs +32 -0
- package/dist/models.mjs.map +1 -0
- package/dist/observability-analytics.d.mts +107 -0
- package/dist/observability-analytics.d.mts.map +1 -0
- package/dist/observability-analytics.mjs +409 -0
- package/dist/observability-analytics.mjs.map +1 -0
- package/dist/observability-cost.d.mts +10 -0
- package/dist/observability-cost.d.mts.map +1 -0
- package/dist/observability-cost.mjs +15 -0
- package/dist/observability-cost.mjs.map +1 -0
- package/dist/observability-telemetry.d.mts +111 -0
- package/dist/observability-telemetry.d.mts.map +1 -0
- package/dist/observability-telemetry.mjs +343 -0
- package/dist/observability-telemetry.mjs.map +1 -0
- package/dist/observability-tracing.d.mts +10 -0
- package/dist/observability-tracing.d.mts.map +1 -0
- package/dist/observability-tracing.mjs +17 -0
- package/dist/observability-tracing.mjs.map +1 -0
- package/dist/observability.d.mts +15 -0
- package/dist/observability.d.mts.map +1 -0
- package/dist/observability.mjs +17 -0
- package/dist/observability.mjs.map +1 -0
- package/dist/optimizer-DhXXpci6.mjs +97 -0
- package/dist/optimizer-DhXXpci6.mjs.map +1 -0
- package/dist/output-multimodal.d.mts +9 -0
- package/dist/output-multimodal.d.mts.map +1 -0
- package/dist/output-multimodal.mjs +18 -0
- package/dist/output-multimodal.mjs.map +1 -0
- package/dist/output.d.mts +11 -0
- package/dist/output.d.mts.map +1 -0
- package/dist/output.mjs +40 -0
- package/dist/output.mjs.map +1 -0
- package/dist/pii-filter-3AxmYSiu.d.mts +23 -0
- package/dist/pii-filter-3AxmYSiu.d.mts.map +1 -0
- package/dist/pipelines.d.mts +448 -0
- package/dist/pipelines.d.mts.map +1 -0
- package/dist/pipelines.mjs +1534 -0
- package/dist/pipelines.mjs.map +1 -0
- package/dist/prompt-injection-DQXchzsV.d.mts +8 -0
- package/dist/prompt-injection-DQXchzsV.d.mts.map +1 -0
- package/dist/prompt-injection-RpoLPwSa.mjs +52 -0
- package/dist/prompt-injection-RpoLPwSa.mjs.map +1 -0
- package/dist/prompts.d.mts +192 -0
- package/dist/prompts.d.mts.map +1 -0
- package/dist/prompts.mjs +732 -0
- package/dist/prompts.mjs.map +1 -0
- package/dist/protocol-DfBiEsnl.d.mts +112 -0
- package/dist/protocol-DfBiEsnl.d.mts.map +1 -0
- package/dist/quota-manager-0iPMkQWN.d.mts +62 -0
- package/dist/quota-manager-0iPMkQWN.d.mts.map +1 -0
- package/dist/quota-manager-D_N7FuQ2.mjs +180 -0
- package/dist/quota-manager-D_N7FuQ2.mjs.map +1 -0
- package/dist/redaction-utils-DcQwsiNh.mjs +438 -0
- package/dist/redaction-utils-DcQwsiNh.mjs.map +1 -0
- package/dist/redis-CpsSrF8K.mjs +102 -0
- package/dist/redis-CpsSrF8K.mjs.map +1 -0
- package/dist/redis-CwguYFGh.d.mts +33 -0
- package/dist/redis-CwguYFGh.d.mts.map +1 -0
- package/dist/registry-CsD3iTIx.mjs +190 -0
- package/dist/registry-CsD3iTIx.mjs.map +1 -0
- package/dist/registry-DVPWzkXR.d.mts +36 -0
- package/dist/registry-DVPWzkXR.d.mts.map +1 -0
- package/dist/reranking-BpWYhYzl.d.mts +72 -0
- package/dist/reranking-BpWYhYzl.d.mts.map +1 -0
- package/dist/reranking-Ck8aKZW7.mjs +331 -0
- package/dist/reranking-Ck8aKZW7.mjs.map +1 -0
- package/dist/resumable-adapter-CO1HtsgJ.mjs +21 -0
- package/dist/resumable-adapter-CO1HtsgJ.mjs.map +1 -0
- package/dist/review-trigger-DmAsiQlM.d.mts +24 -0
- package/dist/review-trigger-DmAsiQlM.d.mts.map +1 -0
- package/dist/review-trigger-DwXfpww9.mjs +112 -0
- package/dist/review-trigger-DwXfpww9.mjs.map +1 -0
- package/dist/safe-context-BynhkTKR.d.mts +54 -0
- package/dist/safe-context-BynhkTKR.d.mts.map +1 -0
- package/dist/safe-context-C5A3Wv3b.mjs +143 -0
- package/dist/safe-context-C5A3Wv3b.mjs.map +1 -0
- package/dist/schema-Bu2noOZ4.mjs +27 -0
- package/dist/schema-Bu2noOZ4.mjs.map +1 -0
- package/dist/schema-CwFvuCnA.mjs +97 -0
- package/dist/schema-CwFvuCnA.mjs.map +1 -0
- package/dist/schema-Wz-1-ro9.d.mts +37 -0
- package/dist/schema-Wz-1-ro9.d.mts.map +1 -0
- package/dist/schemas-CxQtxIga.mjs +62 -0
- package/dist/schemas-CxQtxIga.mjs.map +1 -0
- package/dist/schemas-DBOhxgW7.d.mts +32 -0
- package/dist/schemas-DBOhxgW7.d.mts.map +1 -0
- package/dist/schemas-Dp_OCqBt.d.mts +63 -0
- package/dist/schemas-Dp_OCqBt.d.mts.map +1 -0
- package/dist/schemas-SwCsnT0z.mjs +83 -0
- package/dist/schemas-SwCsnT0z.mjs.map +1 -0
- package/dist/sdk-errors.d.mts +2 -0
- package/dist/sdk-errors.mjs +3 -0
- package/dist/sdk-experimental.d.mts +59 -0
- package/dist/sdk-experimental.d.mts.map +1 -0
- package/dist/sdk-experimental.mjs +193 -0
- package/dist/sdk-experimental.mjs.map +1 -0
- package/dist/sdk-stop-conditions.d.mts +3 -0
- package/dist/sdk-stop-conditions.mjs +3 -0
- package/dist/sdk.d.mts +15 -0
- package/dist/sdk.d.mts.map +1 -0
- package/dist/sdk.mjs +50 -0
- package/dist/sdk.mjs.map +1 -0
- package/dist/security-guardrails.d.mts +3 -0
- package/dist/security-guardrails.mjs +3 -0
- package/dist/security-injection.d.mts +2 -0
- package/dist/security-injection.mjs +3 -0
- package/dist/security.d.mts +12 -0
- package/dist/security.d.mts.map +1 -0
- package/dist/security.mjs +18 -0
- package/dist/security.mjs.map +1 -0
- package/dist/server.d.mts +420 -0
- package/dist/server.d.mts.map +1 -0
- package/dist/server.mjs +2225 -0
- package/dist/server.mjs.map +1 -0
- package/dist/shared.d.mts +2 -0
- package/dist/shared.mjs +3 -0
- package/dist/streaming-control.d.mts +2 -0
- package/dist/streaming-control.mjs +4 -0
- package/dist/streaming-core.d.mts +4 -0
- package/dist/streaming-core.mjs +3 -0
- package/dist/streaming-infra-resilience.d.mts +120 -0
- package/dist/streaming-infra-resilience.d.mts.map +1 -0
- package/dist/streaming-infra-resilience.mjs +358 -0
- package/dist/streaming-infra-resilience.mjs.map +1 -0
- package/dist/streaming-infra-transport.d.mts +57 -0
- package/dist/streaming-infra-transport.d.mts.map +1 -0
- package/dist/streaming-infra-transport.mjs +488 -0
- package/dist/streaming-infra-transport.mjs.map +1 -0
- package/dist/streaming-infra.d.mts +5 -0
- package/dist/streaming-infra.mjs +5 -0
- package/dist/streaming.d.mts +17 -0
- package/dist/streaming.d.mts.map +1 -0
- package/dist/streaming.mjs +71 -0
- package/dist/streaming.mjs.map +1 -0
- package/dist/telemetry-2eKMojIb.mjs +1046 -0
- package/dist/telemetry-2eKMojIb.mjs.map +1 -0
- package/dist/telemetry-C2t03dwD.d.mts +59 -0
- package/dist/telemetry-C2t03dwD.d.mts.map +1 -0
- package/dist/tool-Btbththq.d.mts +253 -0
- package/dist/tool-Btbththq.d.mts.map +1 -0
- package/dist/tool-JSf8JXZ8.mjs +1150 -0
- package/dist/tool-JSf8JXZ8.mjs.map +1 -0
- package/dist/tool-safety-CZO8a4D4.d.mts +60 -0
- package/dist/tool-safety-CZO8a4D4.d.mts.map +1 -0
- package/dist/tool-safety-DXtYDXod.mjs +319 -0
- package/dist/tool-safety-DXtYDXod.mjs.map +1 -0
- package/dist/tools-BuS2Uv0q.mjs +1708 -0
- package/dist/tools-BuS2Uv0q.mjs.map +1 -0
- package/dist/tools-approval.d.mts +99 -0
- package/dist/tools-approval.d.mts.map +1 -0
- package/dist/tools-approval.mjs +395 -0
- package/dist/tools-approval.mjs.map +1 -0
- package/dist/tools-compliance.d.mts +67 -0
- package/dist/tools-compliance.d.mts.map +1 -0
- package/dist/tools-compliance.mjs +330 -0
- package/dist/tools-compliance.mjs.map +1 -0
- package/dist/tools-computer.d.mts +25 -0
- package/dist/tools-computer.d.mts.map +1 -0
- package/dist/tools-computer.mjs +64 -0
- package/dist/tools-computer.mjs.map +1 -0
- package/dist/tools-core.d.mts +3 -0
- package/dist/tools-core.mjs +3 -0
- package/dist/tools-mcp.d.mts +3 -0
- package/dist/tools-mcp.mjs +5 -0
- package/dist/tools-superpowers.d.mts +2 -0
- package/dist/tools-superpowers.mjs +3 -0
- package/dist/tools.d.mts +401 -0
- package/dist/tools.d.mts.map +1 -0
- package/dist/tools.mjs +1921 -0
- package/dist/tools.mjs.map +1 -0
- package/dist/transport-selector-D-Ib05X1.mjs +1936 -0
- package/dist/transport-selector-D-Ib05X1.mjs.map +1 -0
- package/dist/triage-agent-BEsXg5sw.d.mts +63 -0
- package/dist/triage-agent-BEsXg5sw.d.mts.map +1 -0
- package/dist/triage-agent-CBsfX-HW.mjs +167 -0
- package/dist/triage-agent-CBsfX-HW.mjs.map +1 -0
- package/dist/types-BPnq3GQo.d.mts +23 -0
- package/dist/types-BPnq3GQo.d.mts.map +1 -0
- package/dist/types-BjWgimpY.d.mts +16 -0
- package/dist/types-BjWgimpY.d.mts.map +1 -0
- package/dist/types-BxD-5btB.d.mts +41 -0
- package/dist/types-BxD-5btB.d.mts.map +1 -0
- package/dist/types-By-r93bE.d.mts +36 -0
- package/dist/types-By-r93bE.d.mts.map +1 -0
- package/dist/types-CLBWFRZN.d.mts +69 -0
- package/dist/types-CLBWFRZN.d.mts.map +1 -0
- package/dist/types-CQ0HFd0u.d.mts +62 -0
- package/dist/types-CQ0HFd0u.d.mts.map +1 -0
- package/dist/types-D3zJb59_.d.mts +47 -0
- package/dist/types-D3zJb59_.d.mts.map +1 -0
- package/dist/types-DJnugQX0.d.mts +80 -0
- package/dist/types-DJnugQX0.d.mts.map +1 -0
- package/dist/types-DbUfMCnT.d.mts +70 -0
- package/dist/types-DbUfMCnT.d.mts.map +1 -0
- package/dist/upstash-adapter-D96Caq2O.mjs +22 -0
- package/dist/upstash-adapter-D96Caq2O.mjs.map +1 -0
- package/dist/upstash-adapter-DD4433dx.d.mts +8 -0
- package/dist/upstash-adapter-DD4433dx.d.mts.map +1 -0
- package/dist/utils-BlYhcD6M.mjs +319 -0
- package/dist/utils-BlYhcD6M.mjs.map +1 -0
- package/dist/utils-DpJGOb3y.d.mts +120 -0
- package/dist/utils-DpJGOb3y.d.mts.map +1 -0
- package/dist/vercel-blob-adapter-CkOXLT2D.mjs +25 -0
- package/dist/vercel-blob-adapter-CkOXLT2D.mjs.map +1 -0
- package/dist/xai-CbV_dCnP.mjs +1600 -0
- package/dist/xai-CbV_dCnP.mjs.map +1 -0
- package/package.json +479 -0
- package/src/agents/base/factory.ts +382 -0
- package/src/agents/base/index.ts +8 -0
- package/src/agents/base/schemas.ts +117 -0
- package/src/agents/base/types.ts +192 -0
- package/src/agents/control-flow/index.ts +683 -0
- package/src/agents/coordinator/coordinator-agent.ts +381 -0
- package/src/agents/coordinator/index.ts +6 -0
- package/src/agents/default-agent.ts +211 -0
- package/src/agents/evaluator-optimizer/README.md +612 -0
- package/src/agents/evaluator-optimizer/evaluator-optimizer.example.ts +437 -0
- package/src/agents/evaluator-optimizer/evaluator.ts +282 -0
- package/src/agents/evaluator-optimizer/index.test.ts +416 -0
- package/src/agents/evaluator-optimizer/index.ts +519 -0
- package/src/agents/evaluator-optimizer/optimizer.ts +322 -0
- package/src/agents/evaluator-optimizer/schema.ts +302 -0
- package/src/agents/evaluator-optimizer/utils.ts +42 -0
- package/src/agents/experimental/index.ts +1095 -0
- package/src/agents/experimental/types.ts +212 -0
- package/src/agents/fallback/index.ts +18 -0
- package/src/agents/fallback/recovery/circuit-breaker.ts +166 -0
- package/src/agents/fallback/strategies/model-fallback.ts +192 -0
- package/src/agents/fallback/types.ts +87 -0
- package/src/agents/governance-agent.ts +446 -0
- package/src/agents/index.ts +79 -0
- package/src/agents/multi/coordination/index.ts +6 -0
- package/src/agents/multi/coordination/message-bus.ts +144 -0
- package/src/agents/multi/index.ts +6 -0
- package/src/agents/multi/state/index.ts +162 -0
- package/src/agents/multi/supervisor/index.ts +7 -0
- package/src/agents/multi/supervisor/supervisor.ts +254 -0
- package/src/agents/multi/swarm/aggregation.ts +466 -0
- package/src/agents/multi/swarm/communication.ts +388 -0
- package/src/agents/multi/swarm/coordination.ts +380 -0
- package/src/agents/multi/swarm/index.ts +73 -0
- package/src/agents/multi/swarm/swarm-executor.ts +479 -0
- package/src/agents/multi/types.ts +181 -0
- package/src/agents/observability/index.ts +914 -0
- package/src/agents/orchestrator.ts +218 -0
- package/src/agents/patterns/README.md +512 -0
- package/src/agents/patterns/evaluator-optimizer-pattern.example.ts +455 -0
- package/src/agents/patterns/evaluator-optimizer-pattern.ts +653 -0
- package/src/agents/patterns/index.ts +26 -0
- package/src/agents/persistence/index.ts +726 -0
- package/src/agents/tools/index.ts +291 -0
- package/src/agents/tools/mcp.ts +188 -0
- package/src/agents/triage/index.ts +6 -0
- package/src/agents/triage/triage-agent.ts +280 -0
- package/src/agents/workflows/index.ts +6 -0
- package/src/agents/workflows/interfaces.ts +36 -0
- package/src/agents/workflows/schema.ts +20 -0
- package/src/caching/adapters/index.ts +7 -0
- package/src/caching/adapters/memory.ts +77 -0
- package/src/caching/adapters/redis.ts +60 -0
- package/src/caching/index.ts +17 -0
- package/src/caching/middleware.ts +452 -0
- package/src/caching/strategies/index.ts +1008 -0
- package/src/caching/types.ts +47 -0
- package/src/catalog.ts +921 -0
- package/src/client/chat-usage.ts +53 -0
- package/src/client/hooks.ts +343 -0
- package/src/client/index.ts +36 -0
- package/src/client/message-utils.ts +29 -0
- package/src/client/use-generative-ui.ts +174 -0
- package/src/client/utils.ts +66 -0
- package/src/generative-ui/catalog.ts +653 -0
- package/src/generative-ui/index.ts +82 -0
- package/src/generative-ui/registry.ts +273 -0
- package/src/generative-ui/stream.ts +324 -0
- package/src/generative-ui/types.ts +376 -0
- package/src/governance/audit/audit-logger.ts +239 -0
- package/src/governance/audit/audit-schema.ts +82 -0
- package/src/governance/audit/index.ts +6 -0
- package/src/governance/compliance/abac/policy-engine.ts +175 -0
- package/src/governance/compliance/abac/types.ts +40 -0
- package/src/governance/compliance/approval/compliance-approval-queue.ts +217 -0
- package/src/governance/compliance/index.ts +16 -0
- package/src/governance/compliance/schemas.ts +68 -0
- package/src/governance/compliance/types.ts +143 -0
- package/src/governance/compliance/validators/phi-detector.ts +145 -0
- package/src/governance/compliance/validators/redaction-utils.ts +176 -0
- package/src/governance/compliance/validators/safe-harbor.ts +135 -0
- package/src/governance/entitlements/index.ts +585 -0
- package/src/governance/entitlements/middleware.ts +651 -0
- package/src/governance/entitlements/rate-limiter.ts +711 -0
- package/src/governance/index.ts +32 -0
- package/src/governance/policies/guardrails.ts +1121 -0
- package/src/governance/policies/index.ts +42 -0
- package/src/governance/policies/loop-controls.ts +136 -0
- package/src/governance/policies/telemetry.ts +63 -0
- package/src/governance/tenancy/index.ts +30 -0
- package/src/governance/tenancy/isolation/context.ts +92 -0
- package/src/governance/tenancy/isolation/index.ts +13 -0
- package/src/governance/tenancy/quotas/index.ts +11 -0
- package/src/governance/tenancy/quotas/quota-manager.ts +180 -0
- package/src/governance/tenancy/types.ts +66 -0
- package/src/governance/types.ts +16 -0
- package/src/governance/versioning/index.ts +573 -0
- package/src/grounding/attribution/index.ts +424 -0
- package/src/grounding/citation/citation-generator.ts +174 -0
- package/src/grounding/citation/index.ts +12 -0
- package/src/grounding/context/index.ts +32 -0
- package/src/grounding/context/safe-context.ts +116 -0
- package/src/grounding/context/types.ts +62 -0
- package/src/grounding/context-engineering/error-handling.ts +359 -0
- package/src/grounding/context-engineering/index.ts +23 -0
- package/src/grounding/context-engineering/memory.ts +559 -0
- package/src/grounding/context-engineering/tool-masking.ts +338 -0
- package/src/grounding/embed/index.ts +704 -0
- package/src/grounding/embed/reranking.ts +604 -0
- package/src/grounding/hallucination/index.ts +223 -0
- package/src/grounding/index.ts +82 -0
- package/src/grounding/proof-map/applyPatch.ts +172 -0
- package/src/grounding/proof-map/index.ts +41 -0
- package/src/grounding/proof-map/loop.ts +275 -0
- package/src/grounding/proof-map/schema.ts +217 -0
- package/src/grounding/rag/__tests__/pipeline.test.ts +274 -0
- package/src/grounding/rag/__tests__/tool.test.ts +202 -0
- package/src/grounding/rag/__tests__/trace.test.ts +229 -0
- package/src/grounding/rag/circuit-breaker.ts +152 -0
- package/src/grounding/rag/index.ts +64 -0
- package/src/grounding/rag/pipeline.ts +602 -0
- package/src/grounding/rag/tool.ts +281 -0
- package/src/grounding/rag/trace.ts +503 -0
- package/src/grounding/rag/types.ts +284 -0
- package/src/grounding/retrieval/in-memory-store.ts +107 -0
- package/src/grounding/sources/index.ts +943 -0
- package/src/grounding/tests/applyPatch.test.ts +194 -0
- package/src/grounding/tests/loop.test.ts +141 -0
- package/src/grounding/tests/schema.test.ts +160 -0
- package/src/grounding/types.ts +100 -0
- package/src/grounding/verification/index.ts +419 -0
- package/src/hitl/active-learning/index.ts +332 -0
- package/src/hitl/annotation/index.ts +362 -0
- package/src/hitl/approval/approval-queue.ts +132 -0
- package/src/hitl/approval/index.ts +5 -0
- package/src/hitl/feedback/index.ts +284 -0
- package/src/hitl/index.ts +69 -0
- package/src/hitl/review/index.ts +6 -0
- package/src/hitl/review/review-trigger.ts +162 -0
- package/src/hitl/types.ts +126 -0
- package/src/index.ts +125 -0
- package/src/integrations/blob-storage/index.ts +7 -0
- package/src/integrations/blob-storage/types.ts +28 -0
- package/src/integrations/blob-storage/vercel-blob-adapter.ts +35 -0
- package/src/integrations/index.ts +15 -0
- package/src/integrations/notifications/index.ts +7 -0
- package/src/integrations/notifications/log-adapter.ts +30 -0
- package/src/integrations/notifications/types.ts +27 -0
- package/src/integrations/rate-limit/index.ts +7 -0
- package/src/integrations/rate-limit/types.ts +26 -0
- package/src/integrations/rate-limit/upstash-adapter.ts +45 -0
- package/src/integrations/redis/index.ts +7 -0
- package/src/integrations/redis/types.ts +67 -0
- package/src/integrations/redis/upstash-adapter.ts +18 -0
- package/src/integrations/stream/index.ts +7 -0
- package/src/integrations/stream/resumable-adapter.ts +20 -0
- package/src/integrations/stream/types.ts +21 -0
- package/src/internal/__tests__/hallucination.test.ts +162 -0
- package/src/internal/__tests__/models.test.ts +104 -0
- package/src/internal/__tests__/sdk-errors.test.ts +201 -0
- package/src/internal/__tests__/stop-conditions.test.ts +210 -0
- package/src/internal/shared/ai-types.ts +942 -0
- package/src/internal/testing/evaluators.ts +575 -0
- package/src/internal/testing/index.ts +960 -0
- package/src/internal/ui/data-parts.ts +511 -0
- package/src/internal/ui/type-guards.ts +344 -0
- package/src/internal/ui-factories/__tests__/ui-factories.test.ts +548 -0
- package/src/internal/ui-factories/artifact-factory.ts +667 -0
- package/src/internal/ui-factories/index.ts +82 -0
- package/src/internal/ui-factories/shimmer-manager.ts +220 -0
- package/src/internal/ui-factories/status-helpers.ts +149 -0
- package/src/internal/ui-factories/tool-renderer.ts +167 -0
- package/src/internal/ui-factories/types.ts +235 -0
- package/src/models/capabilities.ts +88 -0
- package/src/models/index.ts +16 -0
- package/src/models/provider-factory.ts +229 -0
- package/src/models/providers/anthropic.ts +539 -0
- package/src/models/providers/google.ts +354 -0
- package/src/models/providers/index.ts +21 -0
- package/src/models/providers/openai.ts +346 -0
- package/src/models/providers/perplexity.ts +276 -0
- package/src/models/providers/shared.ts +90 -0
- package/src/models/providers/xai.ts +269 -0
- package/src/models/registry.ts +208 -0
- package/src/models/routing/index.ts +45 -0
- package/src/models/routing/intent-router.ts +143 -0
- package/src/models/routing/model-router.ts +300 -0
- package/src/models/routing/types.ts +106 -0
- package/src/models/types.ts +23 -0
- package/src/observability/analytics/index.ts +593 -0
- package/src/observability/cost/index.ts +16 -0
- package/src/observability/cost/tracking/budget-guard.ts +110 -0
- package/src/observability/cost/tracking/usage-tracker.ts +120 -0
- package/src/observability/cost/types.ts +85 -0
- package/src/observability/index.ts +17 -0
- package/src/observability/telemetry/index.ts +508 -0
- package/src/observability/tracing/index.ts +30 -0
- package/src/observability/tracing/otel/ai-instrumentation.ts +193 -0
- package/src/observability/tracing/otel/exporters/console.ts +58 -0
- package/src/observability/tracing/otel/exporters/index.ts +6 -0
- package/src/observability/tracing/provenance.ts +769 -0
- package/src/observability/tracing/types.ts +92 -0
- package/src/output/__tests__/output.test.ts +737 -0
- package/src/output/element-stream.ts +678 -0
- package/src/output/errors.ts +108 -0
- package/src/output/factories.ts +392 -0
- package/src/output/index.ts +98 -0
- package/src/output/multimodal/EXPORTS.md +306 -0
- package/src/output/multimodal/IMPLEMENTATION_SUMMARY.md +421 -0
- package/src/output/multimodal/README.md +349 -0
- package/src/output/multimodal/SETUP_GUIDE.md +472 -0
- package/src/output/multimodal/audio.ts +650 -0
- package/src/output/multimodal/image.ts +22 -0
- package/src/output/multimodal/index.ts +32 -0
- package/src/output/multimodal/providers.example.ts +375 -0
- package/src/output/validator.ts +495 -0
- package/src/pipelines/adapters/trace-storage-blob.ts +458 -0
- package/src/pipelines/adapters/trace-storage-memory.ts +319 -0
- package/src/pipelines/defaults.ts +109 -0
- package/src/pipelines/index.ts +24 -0
- package/src/pipelines/message-transforms.ts +107 -0
- package/src/pipelines/multi-step-wrapper.ts +433 -0
- package/src/pipelines/pipeline-presets.ts +339 -0
- package/src/pipelines/step-executor.ts +257 -0
- package/src/pipelines/storage-factory.ts +85 -0
- package/src/pipelines/trace-storage-interface.ts +216 -0
- package/src/pipelines/types.ts +255 -0
- package/src/pipelines/validation.ts +323 -0
- package/src/prompts/index.ts +271 -0
- package/src/prompts/model-variants.ts +410 -0
- package/src/prompts/templates.ts +327 -0
- package/src/sdk/errors/base.ts +296 -0
- package/src/sdk/errors/index.ts +31 -0
- package/src/sdk/errors/utils.ts +148 -0
- package/src/sdk/experimental/index.ts +286 -0
- package/src/sdk/index.ts +25 -0
- package/src/sdk/middleware/ai-middleware.ts +95 -0
- package/src/sdk/middleware/cache.ts +154 -0
- package/src/sdk/middleware/circuit-breaker.ts +388 -0
- package/src/sdk/middleware/compose.ts +81 -0
- package/src/sdk/middleware/deduplication.ts +307 -0
- package/src/sdk/middleware/index.ts +660 -0
- package/src/sdk/middleware/model-middleware.ts +200 -0
- package/src/sdk/stop-conditions/conditions.ts +209 -0
- package/src/sdk/stop-conditions/index.ts +35 -0
- package/src/sdk/stop-conditions/types.ts +59 -0
- package/src/security/guardrails/index.ts +6 -0
- package/src/security/guardrails/middleware.ts +465 -0
- package/src/security/guardrails/pii-filter.ts +396 -0
- package/src/security/index.ts +33 -0
- package/src/security/injection/index.ts +5 -0
- package/src/security/injection/prompt-injection.ts +64 -0
- package/src/security/types.ts +85 -0
- package/src/server/cache/crypto.ts +47 -0
- package/src/server/cache/performance.ts +79 -0
- package/src/server/error-handler.ts +93 -0
- package/src/server/errors.ts +73 -0
- package/src/server/helpers.ts +944 -0
- package/src/server/http.ts +156 -0
- package/src/server/index.ts +12 -0
- package/src/server/messages/__tests__/messages.test.ts +720 -0
- package/src/server/messages/converter.ts +245 -0
- package/src/server/messages/data-parts.ts +338 -0
- package/src/server/messages/extraction.ts +328 -0
- package/src/server/messages/index.ts +126 -0
- package/src/server/messages/types.ts +355 -0
- package/src/server/messages/window.ts +450 -0
- package/src/server/rate-limit/env.ts +8 -0
- package/src/server/rate-limit/rate-limit.ts +165 -0
- package/src/server/routes/HEALTH_CHECK.md +502 -0
- package/src/server/routes/IMPLEMENTATION_SUMMARY.md +432 -0
- package/src/server/routes/QUICK_START.md +327 -0
- package/src/server/routes/README.md +357 -0
- package/src/server/routes/__tests__/routes.test.ts +628 -0
- package/src/server/routes/agent-route.ts +224 -0
- package/src/server/routes/agent-routes.ts +191 -0
- package/src/server/routes/embed-config.ts +181 -0
- package/src/server/routes/health-check.example.ts +507 -0
- package/src/server/routes/health-check.test.ts +533 -0
- package/src/server/routes/health-check.ts +639 -0
- package/src/server/routes/health-check.types.ts +217 -0
- package/src/server/routes/index.ts +32 -0
- package/src/server/routes/types.ts +274 -0
- package/src/shared/__tests__/schemas.test.ts +317 -0
- package/src/shared/ai-runtime.ts +139 -0
- package/src/shared/ai-types.ts +133 -0
- package/src/shared/index.ts +30 -0
- package/src/shared/sdk-runtime.ts +198 -0
- package/src/shared/sdk-types.ts +301 -0
- package/src/streaming/control/__tests__/streaming-control.test.ts +708 -0
- package/src/streaming/control/budget-guard.ts +264 -0
- package/src/streaming/control/controller.ts +255 -0
- package/src/streaming/control/index.ts +105 -0
- package/src/streaming/control/smoothing.ts +201 -0
- package/src/streaming/control/step-limit.ts +215 -0
- package/src/streaming/control/types.ts +234 -0
- package/src/streaming/core/auto-resume.ts +276 -0
- package/src/streaming/core/index.ts +85 -0
- package/src/streaming/core/multi-step.ts +471 -0
- package/src/streaming/core/protocol.ts +194 -0
- package/src/streaming/core/types.ts +182 -0
- package/src/streaming/index.ts +97 -0
- package/src/streaming/infra/backpressure/buffer.ts +210 -0
- package/src/streaming/infra/backpressure/index.ts +6 -0
- package/src/streaming/infra/index.ts +75 -0
- package/src/streaming/infra/multiplexing/index.ts +311 -0
- package/src/streaming/infra/resilience/index.ts +684 -0
- package/src/streaming/infra/transform/index.ts +15 -0
- package/src/streaming/infra/transform/stream-transforms.ts +166 -0
- package/src/streaming/infra/transport/index.ts +774 -0
- package/src/streaming/infra/types.ts +118 -0
- package/src/streaming/infra-extra/types.ts +118 -0
- package/src/tools/advanced/caching.ts +299 -0
- package/src/tools/advanced/generator.ts +267 -0
- package/src/tools/advanced/hitl.ts +251 -0
- package/src/tools/advanced/index.ts +9 -0
- package/src/tools/advanced/llm-tool.ts +208 -0
- package/src/tools/approval/FILES.md +449 -0
- package/src/tools/approval/IMPLEMENTATION_SUMMARY.md +567 -0
- package/src/tools/approval/QUICK_START.md +362 -0
- package/src/tools/approval/README.md +514 -0
- package/src/tools/approval/advanced-approval-queue.ts +7 -0
- package/src/tools/approval/approval.example.ts +571 -0
- package/src/tools/approval/in-memory-queue.ts +405 -0
- package/src/tools/approval/index.ts +737 -0
- package/src/tools/approval/middleware.ts +590 -0
- package/src/tools/approval/queue-factory.ts +162 -0
- package/src/tools/approval/redis-queue.ts +327 -0
- package/src/tools/approval/testing.ts +493 -0
- package/src/tools/approval/types.ts +221 -0
- package/src/tools/approval/with-approval.ts +366 -0
- package/src/tools/artifacts/artifact-tools.ts +273 -0
- package/src/tools/artifacts/index.ts +6 -0
- package/src/tools/compliance/compliance-wrapper.ts +789 -0
- package/src/tools/compliance/create-compliant-stream.ts +226 -0
- package/src/tools/compliance/index.ts +8 -0
- package/src/tools/compliance/phi-redaction.ts +406 -0
- package/src/tools/compliance/tool-wrapper.ts +306 -0
- package/src/tools/computer/index.ts +99 -0
- package/src/tools/computer/types.ts +41 -0
- package/src/tools/core/abort.ts +202 -0
- package/src/tools/core/factory.ts +197 -0
- package/src/tools/core/index.ts +8 -0
- package/src/tools/core/tool-safety.ts +112 -0
- package/src/tools/generic/index.ts +9 -0
- package/src/tools/generic/json-schema-tool.ts +301 -0
- package/src/tools/generic/tiptap-context.ts +619 -0
- package/src/tools/generic/web-search-tool.ts +82 -0
- package/src/tools/generic/web-search.ts +142 -0
- package/src/tools/index.ts +36 -0
- package/src/tools/mcp/ai-sdk-error-integration.ts +401 -0
- package/src/tools/mcp/client.ts +988 -0
- package/src/tools/mcp/connection-manager.ts +380 -0
- package/src/tools/mcp/connection-pool.ts +408 -0
- package/src/tools/mcp/edge-runtime.ts +318 -0
- package/src/tools/mcp/environment.ts +310 -0
- package/src/tools/mcp/index.ts +20 -0
- package/src/tools/mcp/next-pattern.ts +401 -0
- package/src/tools/mcp/stream-lifecycle-integration.ts +617 -0
- package/src/tools/mcp/tool-cache.ts +359 -0
- package/src/tools/mcp/transport-selector.ts +492 -0
- package/src/tools/mcp/transports.ts +99 -0
- package/src/tools/simple-factory.ts +55 -0
- package/src/tools/superpowers/index.ts +122 -0
- package/src/tools/superpowers/prompts/index.ts +533 -0
- package/src/tools/superpowers/schemas/index.ts +701 -0
- package/src/tools/superpowers/tools/index.ts +721 -0
- package/src/tools/validation-wrapper.ts +97 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator-optimizer-De67_mJC.mjs","names":[],"sources":["../src/agents/tools/mcp.ts","../src/agents/tools/index.ts","../src/agents/default-agent.ts","../src/agents/governance-agent.ts","../src/agents/orchestrator.ts","../src/agents/evaluator-optimizer/index.ts"],"sourcesContent":["/**\n * @fileoverview Model Context Protocol (MCP) tool integration\n *\n * Provides utilities for connecting to MCP servers and integrating their tools\n * into AI agents. Supports SSE, HTTP, and stdio transport types.\n *\n * @module @od-oneapp/ai-platform/agents/tools/mcp\n */\n\nimport {\n createMCPClient,\n Experimental_StdioMCPTransport,\n type SDKOAuthClientProvider,\n type SDKToolSet,\n} from '../../shared';\n\nimport type { IOType } from 'node:child_process';\nimport type { Stream } from 'node:stream';\n\n/**\n * SSE (Server-Sent Events) transport configuration for MCP.\n */\nexport type McpSseTransport = {\n /** Transport type. Must be 'sse'. */\n type: 'sse';\n /** SSE endpoint URL. */\n url: string;\n /** Optional HTTP headers for the SSE connection. */\n headers?: Record<string, string>;\n /** Optional OAuth provider for protected MCP servers. */\n authProvider?: SDKOAuthClientProvider;\n};\n\n/**\n * HTTP transport configuration for MCP.\n */\nexport type McpHttpTransport = {\n /** Transport type. Must be 'http'. */\n type: 'http';\n /** HTTP endpoint URL. */\n url: string;\n /** Optional HTTP headers for the connection. */\n headers?: Record<string, string>;\n /** Optional session identifier for server-side routing. */\n sessionId?: string;\n /** Optional OAuth provider for protected MCP servers. */\n authProvider?: SDKOAuthClientProvider;\n};\n\n/**\n * Stdio transport configuration for MCP.\n */\nexport type McpStdioTransport = {\n /** Transport type. Must be 'stdio'. */\n type: 'stdio';\n /** Command to execute for stdio transport. */\n command?: string;\n /** Command arguments. */\n args?: string[];\n /** Environment variables for the process. */\n env?: Record<string, string>;\n /** Working directory for the MCP server process. */\n cwd?: string;\n /** stderr destination for the MCP server. */\n stderr?: IOType | Stream | number;\n};\n\n/** MCP transport type (SSE, HTTP, or stdio). */\nexport type McpTransport = McpSseTransport | McpHttpTransport | McpStdioTransport;\n\n/**\n * Options for connecting to an MCP toolset.\n */\nexport interface McpToolsetOptions {\n /** Transport configuration (SSE, HTTP, or stdio). */\n transport: McpTransport;\n /** Whether tools require approval before execution. */\n approval?: boolean;\n}\n\n/**\n * Connected MCP toolset with tools and cleanup function.\n */\nexport interface ConnectedMcpToolset {\n /** Tools available from the MCP server. */\n tools: SDKToolSet;\n /** Function to close the MCP connection and cleanup resources. */\n close: () => Promise<void>;\n}\n\n/**\n * Connects to an MCP server and returns its tools.\n * Uses createMCPClient from the AI SDK MCP package.\n *\n * @param options - MCP connection options.\n * @returns Connected toolset with tools and close function.\n * @example\n * ```ts\n * const toolset = await connectMcpToolset({\n * transport: { type: 'sse', url: 'https://mcp.example.com/sse' },\n * approval: true\n * });\n *\n * // Use tools\n * const result = await toolset.tools.myTool.execute({ input: 'data' });\n *\n * // Cleanup\n * await toolset.close();\n * ```\n * @example\n * ```ts\n * const stdioToolset = await connectMcpToolset({\n * transport: { type: 'stdio', command: 'mcp-server', args: ['--profile', 'prod'] },\n * });\n * ```\n */\nexport const connectMcpToolset = async (\n options: McpToolsetOptions,\n): Promise<ConnectedMcpToolset> => {\n const baseEnv = Object.entries(process.env).reduce<Record<string, string>>(\n (acc, [key, value]) => {\n if (typeof value === 'string') {\n acc[key] = value;\n }\n return acc;\n },\n {},\n );\n\n const transport =\n options.transport.type === 'stdio'\n ? new Experimental_StdioMCPTransport({\n command: options.transport.command ?? 'node',\n args: options.transport.args ?? [],\n env: options.transport.env ? { ...baseEnv, ...options.transport.env } : baseEnv,\n cwd: options.transport.cwd,\n stderr: options.transport.stderr,\n })\n : {\n type: options.transport.type,\n url: options.transport.url,\n headers:\n options.transport.type === 'http' && options.transport.sessionId\n ? {\n ...options.transport.headers,\n 'x-mcp-session-id': options.transport.sessionId,\n }\n : options.transport.headers,\n authProvider: options.transport.authProvider,\n };\n\n const client = await createMCPClient({ transport });\n\n let tools: SDKToolSet;\n try {\n tools = await client.tools();\n } catch (error) {\n await client.close();\n throw new Error(\n `Failed to retrieve tools from MCP server: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n // Apply approval flag to tools if needed\n const processedTools: SDKToolSet = {};\n try {\n for (const name of Object.keys(tools)) {\n const toolDefinition = tools[name];\n if (!toolDefinition) {\n continue;\n }\n processedTools[name] = {\n ...toolDefinition,\n needsApproval: options.approval ?? toolDefinition.needsApproval,\n };\n }\n } catch (error) {\n await client.close();\n throw error;\n }\n\n return {\n tools: processedTools,\n close: async () => {\n await client.close();\n },\n };\n};\n","/**\n * @fileoverview Default agent tools\n *\n * Provides default tools for AI agents including knowledge base search,\n * escalation, and audit logging. Also includes utilities for creating\n * execution signals.\n *\n * @module @od-oneapp/ai-platform/agents/tools\n */\n\nimport { randomUUID } from 'node:crypto';\n\nimport { z } from 'zod/v4';\n\nimport { complianceSignalSchema } from '../../governance/compliance/schemas';\nimport { rerank, tool } from '../../shared';\n\nimport type { ComplianceSignal } from '../../governance/compliance/schemas';\nimport type { SDKTool as Tool } from '../../shared';\n\n\n\n/**\n * Tool call information for execution signals.\n */\ninterface ToolCall {\n /** Tool call ID */\n id: string;\n /** Name of the tool being called */\n toolName: string;\n /** Input arguments for the tool */\n input: unknown;\n}\n\n/**\n * Knowledge base entry structure.\n */\ninterface KnowledgeBaseEntry {\n readonly id: string;\n readonly title: string;\n readonly snippet: string;\n}\n\n/**\n * Knowledge base search result.\n */\ninterface KnowledgeBaseResult {\n readonly query: string;\n readonly results: Array<{\n id: string;\n score: number;\n text: string;\n }>;\n readonly warning?: string;\n}\n\n/**\n * Internal knowledge base for compliance and best practices.\n * Used by the knowledgeBaseTool for searching compliance guidelines.\n * @internal\n */\nconst KNOWLEDGE_BASE = [\n {\n id: 'kb-guardrails',\n title: 'Guardrail Playbook',\n snippet: 'All high risk guardrail violations must be escalated to compliance within 1 hour.',\n },\n {\n id: 'kb-telemetry',\n title: 'Telemetry Standards',\n snippet: 'Every AI call must include telemetry metadata including risk levels and tool names.',\n },\n {\n id: 'kb-rag',\n title: 'RAG Quality Checks',\n snippet: 'Use rerank() with topN <= 5 to keep prompts small and latency predictable.',\n },\n];\n\n/**\n * Schema for knowledge base search input.\n */\nconst knowledgeBaseInputSchema = z.object({\n /** Search query (minimum 2 characters). */\n query: z.string().min(2),\n /** Number of results to return (1-5, default 3). */\n topN: z.number().min(1).max(5).default(3),\n});\n\n/** Knowledge base search input type. */\nexport type KnowledgeBaseInput = z.infer<typeof knowledgeBaseInputSchema>;\n\n/**\n * Knowledge base search tool.\n * Searches the internal compliance knowledge base using reranking.\n * Falls back to simple text matching if reranking fails.\n * @example\n * ```ts\n * const result = await knowledgeBaseTool.execute({ query: 'guardrail', topN: 2 });\n * console.log(result.results[0].text);\n * ```\n */\nexport const knowledgeBaseTool = tool({\n description: 'Searches the internal compliance knowledge base and returns ranked snippets.',\n inputSchema: knowledgeBaseInputSchema,\n execute: async ({ query, topN }: KnowledgeBaseInput): Promise<KnowledgeBaseResult> => {\n try {\n // Type assertion needed for experimental rerank API model parameter\n type RerankModel = Parameters<typeof rerank>[0]['model'];\n const rerankModel = 'openai:rerank-v1' as unknown as RerankModel;\n\n const result = await rerank({\n model: rerankModel,\n documents: KNOWLEDGE_BASE.map((document: KnowledgeBaseEntry) => ({\n id: document.id,\n text: `${document.title}: ${document.snippet}`,\n })),\n query,\n topN,\n experimental_telemetry: {\n isEnabled: true,\n functionId: 'knowledge-base-rerank',\n metadata: { queryLength: query.length },\n },\n });\n\n return {\n query,\n results: result.rerankedDocuments.slice(0, topN).map((entry: any, index) => ({\n id: entry.id ?? `kb-${index}`,\n score: typeof entry.score === 'number' ? entry.score : 0,\n text: entry.text,\n })),\n };\n } catch (error) {\n const fallback = KNOWLEDGE_BASE.filter((document: KnowledgeBaseEntry) =>\n document.snippet.toLowerCase().includes(query.toLowerCase()),\n ).slice(0, topN);\n\n return {\n query,\n results: fallback.map((document: KnowledgeBaseEntry, index: number) => ({\n id: document.id ?? `fallback-${index}`,\n score: 0,\n text: `${document.title}: ${document.snippet}`,\n })),\n warning: error instanceof Error ? error.message : String(error),\n };\n }\n },\n});\n\n/**\n * Schema for escalation ticket input.\n */\nconst escalateInputSchema = z.object({\n /** Ticket summary (minimum 10 characters). */\n summary: z.string().min(10),\n /** Ticket system to use. */\n ticketSystem: z.enum(['jira', 'pagerduty', 'service-now']).default('jira'),\n /** Severity level. */\n severity: z.enum(['low', 'medium', 'high']).default('medium'),\n});\n\n/** Escalation input type. */\nexport type EscalateInput = z.infer<typeof escalateInputSchema>;\n\n/**\n * Escalation tool for creating compliance tickets.\n * Requires human approval for medium and high severity tickets.\n * @example\n * ```ts\n * const ticket = await escalateTool.execute({\n * summary: 'User requested PII export',\n * ticketSystem: 'jira',\n * severity: 'high',\n * });\n * ```\n */\nexport const escalateTool = tool({\n description: 'Creates a compliance escalation ticket that requires human approval.',\n inputSchema: escalateInputSchema,\n needsApproval: (input: EscalateInput) => input.severity !== 'low',\n execute: async (input: EscalateInput) => ({\n // Node.js 22+: Use randomUUID() for secure ticket IDs\n ticketId: `${input.ticketSystem}-${randomUUID().slice(0, 8)}`,\n ...input,\n createdAt: new Date().toISOString(),\n }),\n});\n\n/**\n * Schema for audit log input.\n */\nconst auditLogInputSchema = z.object({\n runId: z.string(),\n toolCalls: z.array(\n z.object({\n id: z.string(),\n toolName: z.string(),\n approved: z.boolean().optional(),\n payload: z.record(z.string(), z.unknown()).optional(),\n }),\n ),\n});\n\n/**\n * Audit logging tool for compliance tracking.\n * Writes structured audit log entries and returns compliance receipts.\n * @example\n * ```ts\n * const receipt = await auditLogTool.execute({\n * runId: 'run-1',\n * toolCalls: [{ id: 'call-1', toolName: 'knowledgeBase' }],\n * });\n * ```\n */\nexport const auditLogTool = tool({\n description: 'Writes a structured audit log entry and returns a compliance receipt.',\n inputSchema: auditLogInputSchema,\n execute: async ({\n runId,\n toolCalls,\n }: {\n runId: string;\n toolCalls: Array<{\n id: string;\n toolName: string;\n approved?: boolean;\n payload?: Record<string, unknown>;\n }>;\n }) => ({\n receiptId: randomUUID(),\n runId,\n totalTools: toolCalls.length,\n createdAt: new Date().toISOString(),\n }),\n});\n\n/**\n * Default tools available to all agents.\n * Includes knowledge base search, escalation, and audit logging.\n * @example\n * ```ts\n * const tools = Object.keys(defaultTools);\n * // ['knowledgeBase', 'escalate', 'auditLog']\n * ```\n */\nexport const defaultTools: Record<string, Tool> = {\n knowledgeBase: knowledgeBaseTool,\n escalate: escalateTool,\n auditLog: auditLogTool,\n};\n\n/** Type for default toolset. */\nexport type DefaultToolset = typeof defaultTools;\n\nexport * from './mcp';\n\n/**\n * Creates a compliance signal for tool execution events.\n * Used to track tool calls throughout agent execution for audit purposes.\n *\n * @param toolCall - Tool call information.\n * @param type - Signal type (tool.executed, tool.awaiting-approval, or tool.denied).\n * @param runId - Agent run identifier.\n * @returns Compliance signal object.\n * @example\n * ```ts\n * const signal = createExecutionSignal(\n * { id: 'call-123', toolName: 'escalate', input: { summary: 'Issue' } },\n * 'tool.executed',\n * 'run-456'\n * );\n * ```\n */\nexport const createExecutionSignal = (\n toolCall: ToolCall,\n type: ComplianceSignal['type'],\n runId: string,\n): ComplianceSignal =>\n complianceSignalSchema.parse({\n id: randomUUID(),\n type,\n message: `${toolCall.toolName} (${toolCall.id}) ${type.replace('tool.', '')}`,\n runId,\n timestamp: new Date().toISOString(),\n });\n\n/** Tool execution signal type. */\nexport type ToolExecutionSignal = ReturnType<typeof createExecutionSignal>;\n","/**\n * @fileoverview Agent creation utilities\n *\n * Provides functions for creating AI agents with default configurations including\n * guardrails, loop policies, telemetry, and structured output support.\n *\n * THIS FILE IMPLEMENTS THE STANDARD AGENT TRACK (Experimental_Agent).\n *\n * @module @od-oneapp/ai-platform/agents/default-agent\n */\n\nimport { randomUUID } from 'node:crypto';\n\nimport {\n applyDefaultGuardrails,\n defaultTelemetry,\n mergeActiveTools,\n resolveLoopPolicy,\n} from \"../governance/policies\";\nimport { ToolLoopAgent } from '../shared';\n\nimport { createExecutionSignal, defaultTools } from \"./tools\";\n\nimport type { SDKLanguageModelV3, SDKTelemetrySettings, SDKToolSet } from '../shared';\nimport type { AgentStructuredOutput, RiskLevel } from './base/schemas';\n\n/** Registry of available tools keyed by tool name. */\ntype ToolRegistry = SDKToolSet;\n\n/**\n * Options for creating an AI agent with compliance-first configuration.\n */\nexport interface CreateAgentOptions {\n /** Language model used for generation; guardrails are applied automatically. */\n model: SDKLanguageModelV3;\n /** Risk classification guiding loop controls (`low`, `medium`, `high`). */\n riskLevel: RiskLevel;\n /** Optional telemetry settings for observability. Defaults to {@link defaultTelemetry}. */\n telemetry?: SDKTelemetrySettings;\n /** Optional custom tools to add or override defaults. */\n tools?: ToolRegistry;\n /** Tool names to keep active; merged with risk-based policy choices. */\n activeTools?: string[];\n /** Unique identifier for this run. Defaults to a generated UUID. */\n runId?: string;\n /**\n * Callback fired for every execution signal (tool events, loop stops).\n * Not called when omitted.\n */\n onSignal?: (signal: ReturnType<typeof createExecutionSignal>) => void;\n /**\n * Callback invoked with validated structured output before finish cleanup.\n * Errors inside are caught and logged to avoid failing the agent.\n */\n onStructuredOutput?: (output: AgentStructuredOutput) => Promise<void> | void;\n /**\n * Optional cleanup invoked after finish (even when no structured output).\n * Use to close spans or release resources.\n */\n onCleanup?: () => Promise<void> | void;\n}\n\n/** Default agent output type (structured output schema). */\nexport type DefaultAgentOutput = AgentStructuredOutput;\n\n/**\n * Standard Agent type (Experimental_Agent instance).\n * Wrapper class to maintain compatibility with legacy DefaultAgent interface\n * while using Experimental_Agent internally.\n */\nexport class StandardAgent {\n private agent: ToolLoopAgent<ToolRegistry>;\n private options: CreateAgentOptions;\n private runId: string;\n\n public readonly tools: ToolRegistry;\n\n constructor(options: CreateAgentOptions) {\n this.options = options;\n this.runId = options.runId ?? randomUUID();\n\n // 1. apply guardrails\n const wrappedModel = applyDefaultGuardrails(options.model);\n\n // 2. resolve loop policy\n const loopPolicy = resolveLoopPolicy({\n riskLevel: options.riskLevel,\n activeTools: options.activeTools,\n });\n\n // 3. merge tools\n this.tools = {\n ...defaultTools,\n ...options.tools,\n };\n\n // 4. filter active tools if policy dictates\n // Note: Experimental_Agent doesn't have native \"activeTools\" filtering in config\n // so we pre-filter the tools object passed to it, or pass all.\n // Ideally, we pass all tools but use system prompt to steer.\n // However, loopPolicy.activeTools is strict.\n const activeToolNames = mergeActiveTools(loopPolicy, options.activeTools);\n\n // If activeTools is defined, STRICTLY filter the tools object\n const finalTools: ToolRegistry = activeToolNames\n ? Object.keys(this.tools)\n .filter(key => activeToolNames.includes(key))\n .reduce((obj, key) => {\n const tool = this.tools[key];\n if (tool) {\n obj[key] = tool;\n }\n return obj;\n }, {} as ToolRegistry)\n : this.tools;\n\n // 5. create agent\n this.agent = new ToolLoopAgent({\n model: wrappedModel,\n tools: finalTools,\n instructions:\n 'You are a compliance co-pilot. Obey guardrails, honour human approvals, and document every decision in the structured output.',\n experimental_telemetry: options.telemetry ?? defaultTelemetry,\n stopWhen: loopPolicy.stopCondition, // Maps cleanly: stepCountIs(n)\n });\n }\n\n /**\n * Generates a response using the agent.\n * Wraps the internal generate call to provide signal emission and structured output handling.\n */\n async generate(options: Parameters<ToolLoopAgent<ToolRegistry>['generate']>[0]) {\n // Execute generation\n const result = await this.agent.generate(options);\n\n // Post-processing: Emit signals from steps\n if (this.options.onSignal && result.steps) {\n for (const step of result.steps) {\n if (step.toolCalls) {\n for (const toolCall of step.toolCalls) {\n const type = 'tool.executed'; // Agent v6 executes tools automatically by default\n this.options.onSignal(\n createExecutionSignal(\n {\n id: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n },\n type,\n this.runId,\n ),\n );\n }\n }\n }\n }\n\n // Post-processing: Check for structured output\n // Assuming the model outputs json that matches the schema if requested,\n // or if we forced it via toolChoice.\n // For StandardAgent, we usually expect text or tool calls.\n // If we need strict JSON output, we would use agent.generate({ ... }) with strict mode.\n // ExperimentalAgent doesn't strictly enforce output schema on the top-level `generate`\n // without `element` or structural forcing.\n\n // Compatibility: If the last message or content looks like JSON and matches schema, parse it.\n // OR if we are just returning the text.\n\n // For this migration, we focus on the AGENT behavior.\n // Structured Output persistence is best handled by the caller or by a specific \"finish\" tool.\n\n // Cleanup\n await this.options.onCleanup?.();\n\n return result;\n }\n\n async stream(options: Parameters<ToolLoopAgent<ToolRegistry>['stream']>[0]) {\n return this.agent.stream(options);\n }\n\n /**\n * Access the underlying ToolLoopAgent instance.\n * Intended for SDK helpers that require the raw agent type.\n */\n getToolLoopAgent(): ToolLoopAgent<ToolRegistry> {\n return this.agent;\n }\n}\n\n/**\n * Type alias for the returned agent instance.\n * Maintains compatibility with code expecting a class instance with generate/stream methods.\n */\nexport type DefaultAgent = StandardAgent;\n\n/**\n * Creates a default agent (Standard Track).\n * Uses Experimental_Agent under the hood.\n */\nexport const createDefaultAgent = (options: CreateAgentOptions): StandardAgent => {\n return new StandardAgent(options);\n};\n\n// Legacy exports for backward compatibility if needed,\n// though we encourage moving to StandardAgent / GovernanceAgent distinction.\nexport const createDefaultAgentConfig = (options: CreateAgentOptions) => {\n void options;\n // No-op or throw, as config object structure has changed\n throw new Error('createDefaultAgentConfig is deprecated. Use createDefaultAgent directly.');\n};\n","/**\n * @fileoverview Governance Agent\n *\n * Implements the \"Governance Track\" agent strategy using the Ralph Wiggum autonomous retry loop.\n * This agent prioritizes RELIABILITY and COMPLIANCE over raw speed.\n *\n * Features:\n * - Autonomous Retry Loop (keeps trying until completion signal)\n * - \"Principal Skinner\" Governance (fine-grained token budgets per iteration)\n * - Audit Signals (loop.approval_required, loop.budget_exceeded)\n * - Feedback Loops (feeds errors back into context)\n *\n * @module @od-oneapp/ai-platform/agents/governance-agent\n */\n\nimport { randomUUID } from 'node:crypto';\n\nimport { complianceSignalSchema } from '../governance/compliance/schemas';\nimport { generateText } from '../shared';\n\nimport type { ComplianceSignal, RiskLevel } from '../governance/compliance/schemas';\nimport type { SDKLanguageModelV3, SDKTool } from '../shared';\n\n\n\n/**\n * Configuration for Governance Agent (Principal Skinner) rules.\n */\nexport interface GovernanceRules {\n /** Maximum tokens per iteration to limit output length. */\n maxTokensPerIteration: number;\n /** Tool names that are blocked from execution. */\n blockedTools: string[];\n /**\n * Tool names that emit an approval signal when executed.\n * NOTE: This is currently a notification/audit mechanism, NOT a blocking gate.\n * Tools will execute and a 'loop.approval_required' signal is emitted for audit purposes.\n */\n requireApproval: string[];\n /** Maximum total tokens across all iterations. */\n maxTotalTokens?: number;\n /** Timeout in milliseconds for each iteration. */\n iterationTimeoutMs?: number;\n}\n\n/**\n * Single iteration result.\n */\nexport interface GovernanceIteration {\n /** Iteration index (1-based). */\n index: number;\n /** Status of the iteration. */\n status: 'running' | 'success' | 'error' | 'timeout';\n /** Output text from the iteration. */\n output?: string;\n /** Error message if iteration failed. */\n error?: string;\n /** Token usage for this iteration. */\n tokenUsage: { input: number; output: number };\n /** Duration in milliseconds. */\n durationMs: number;\n /** Tool calls made during this iteration. */\n toolCalls?: Array<{ name: string; args: unknown }>;\n}\n\n/**\n * Final result of the Governance Agent execution.\n */\nexport interface GovernanceResult {\n /** Whether the loop completed successfully. */\n success: boolean;\n /** Total number of iterations executed. */\n iterations: number;\n /** All iteration results. */\n iterationHistory: GovernanceIteration[];\n /** Final output if successful. */\n finalOutput?: string;\n /** Error message if failed. */\n error?: string;\n /** Total token usage. */\n totalTokens: { input: number; output: number };\n /** Total duration in milliseconds. */\n totalDurationMs: number;\n /** Compliance signals generated. */\n signals: ComplianceSignal[];\n}\n\n/**\n * Options for configuring the Governance Agent.\n */\nexport interface GovernanceAgentOptions {\n /** Task prompt to retry until completion. */\n task: string;\n /** Completion signal to detect success (e.g., \"DONE\", \"COMPLETE\", \"FINISHED\"). */\n completionSignal: string;\n /** Maximum iterations before force exit. Default: 10. */\n maxIterations?: number;\n /** Whether to feed errors back into context. Default: true. */\n feedbackErrors?: boolean;\n /** Delay between iterations in milliseconds. Default: 0. */\n iterationDelay?: number;\n /** Principal Skinner governance rules. */\n governance: GovernanceRules;\n /** Language model to use. */\n model: SDKLanguageModelV3;\n /** Tools available to the agent. */\n tools?: Record<string, SDKTool>;\n /** Callback for each iteration. */\n onIteration?: (iteration: GovernanceIteration) => void;\n /** Callback for compliance signals. */\n onSignal?: (signal: ComplianceSignal) => void;\n /** Optional system prompt to prepend. */\n systemPrompt?: string;\n /** Run ID for audit logging. */\n runId?: string;\n}\n\n/**\n * Creates a delay promise.\n * @internal\n */\nconst sleep = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms));\n\n/**\n * Filters tools based on blocked list.\n * @internal\n */\nconst filterTools = (\n tools: Record<string, SDKTool> | undefined,\n blockedTools: string[],\n): Record<string, SDKTool> | undefined => {\n if (!tools) return undefined;\n\n const filtered: Record<string, SDKTool> = {};\n for (const [name, tool] of Object.entries(tools)) {\n if (!blockedTools.includes(name)) {\n filtered[name] = tool;\n }\n }\n return Object.keys(filtered).length > 0 ? filtered : undefined;\n};\n\n/**\n * Checks if output contains completion signal.\n * Uses word boundary matching to avoid false positives.\n * @internal\n */\nconst detectCompletion = (output: string, signal: string): boolean => {\n const escapedSignal = signal.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escapedSignal}\\\\b`, 'i');\n return regex.test(output);\n};\n\n/**\n * Creates a compliance signal.\n * @internal\n */\nconst createSignal = (\n type: ComplianceSignal['type'],\n message: string,\n runId: string,\n riskLevel?: RiskLevel,\n metadata?: Record<string, unknown>,\n): ComplianceSignal => {\n return complianceSignalSchema.parse({\n id: randomUUID(),\n type,\n message,\n runId,\n riskLevel,\n timestamp: new Date().toISOString(),\n metadata,\n });\n};\n\n/**\n * Executes the Governance Loop.\n * @internal\n */\nasync function executeGovernanceLoop(options: GovernanceAgentOptions): Promise<GovernanceResult> {\n const {\n task,\n completionSignal,\n maxIterations = 10,\n feedbackErrors = true,\n iterationDelay = 0,\n governance,\n model,\n tools,\n onIteration,\n onSignal,\n systemPrompt,\n runId = randomUUID(),\n } = options;\n\n const signals: ComplianceSignal[] = [];\n const iterationHistory: GovernanceIteration[] = [];\n let iteration = 0;\n const context = task;\n let lastError: string | undefined;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n const startTime = Date.now();\n\n const allowedTools = filterTools(tools, governance.blockedTools);\n\n const startSignal = createSignal(\n 'loop.started',\n `Governance Agent started: ${task.slice(0, 50)}...`,\n runId,\n 'low',\n { maxIterations, completionSignal },\n );\n signals.push(startSignal);\n onSignal?.(startSignal);\n\n while (iteration < maxIterations) {\n iteration++;\n const iterationStart = Date.now();\n\n if (\n governance.maxTotalTokens &&\n totalInputTokens + totalOutputTokens >= governance.maxTotalTokens\n ) {\n const budgetSignal = createSignal(\n 'loop.budget_exceeded',\n `Total token budget exhausted after ${iteration - 1} iterations`,\n runId,\n 'medium',\n { totalInputTokens, totalOutputTokens },\n );\n signals.push(budgetSignal);\n onSignal?.(budgetSignal);\n\n return {\n success: false,\n iterations: iteration - 1,\n iterationHistory,\n error: `Token budget exceeded (${totalInputTokens + totalOutputTokens} / ${governance.maxTotalTokens})`,\n totalTokens: { input: totalInputTokens, output: totalOutputTokens },\n totalDurationMs: Date.now() - startTime,\n signals,\n };\n }\n\n const prompt =\n feedbackErrors && lastError\n ? `${context}\\n\\n[Previous attempt failed with error: ${lastError}]\\n\\nPlease try again and address the error.`\n : context;\n\n try {\n const result = await generateText({\n model,\n prompt,\n system: systemPrompt,\n tools: allowedTools,\n maxOutputTokens: governance.maxTokensPerIteration,\n abortSignal: governance.iterationTimeoutMs\n ? AbortSignal.timeout(governance.iterationTimeoutMs)\n : undefined,\n });\n\n const iterationDuration = Date.now() - iterationStart;\n const inputTokens = result.usage?.inputTokens ?? 0;\n const outputTokens = result.usage?.outputTokens ?? 0;\n totalInputTokens += inputTokens;\n totalOutputTokens += outputTokens;\n\n const toolCalls = result.toolCalls?.map(tc => ({\n name: tc.toolName,\n args: (tc as { input?: unknown; args?: unknown }).input ?? (tc as { args?: unknown }).args,\n }));\n\n if (toolCalls) {\n const approvalRequired = toolCalls.filter(tc =>\n governance.requireApproval.includes(tc.name),\n );\n if (approvalRequired.length > 0) {\n const approvalSignal = createSignal(\n 'loop.approval_required',\n `Audit: Tools executed that require approval: ${approvalRequired.map(t => t.name).join(', ')}`,\n runId,\n 'medium',\n { tools: approvalRequired, note: 'Post-execution audit signal' },\n );\n signals.push(approvalSignal);\n onSignal?.(approvalSignal);\n }\n }\n\n const iterationResult: GovernanceIteration = {\n index: iteration,\n status: 'running',\n output: result.text,\n tokenUsage: { input: inputTokens, output: outputTokens },\n durationMs: iterationDuration,\n toolCalls,\n };\n\n if (detectCompletion(result.text, completionSignal)) {\n iterationResult.status = 'success';\n iterationHistory.push(iterationResult);\n onIteration?.(iterationResult);\n\n const successSignal = createSignal(\n 'loop.completed',\n `Governance Agent completed successfully after ${iteration} iterations`,\n runId,\n 'low',\n { iterations: iteration, totalTokens: totalInputTokens + totalOutputTokens },\n );\n signals.push(successSignal);\n onSignal?.(successSignal);\n\n return {\n success: true,\n iterations: iteration,\n iterationHistory,\n finalOutput: result.text,\n totalTokens: { input: totalInputTokens, output: totalOutputTokens },\n totalDurationMs: Date.now() - startTime,\n signals,\n };\n }\n\n iterationHistory.push(iterationResult);\n onIteration?.(iterationResult);\n lastError = undefined;\n\n if (iterationDelay > 0 && iteration < maxIterations) {\n await sleep(iterationDelay);\n }\n } catch (error) {\n // Error handling consistent with previous implementation\n const iterationDuration = Date.now() - iterationStart;\n lastError = error instanceof Error ? error.message : String(error);\n const isTimeout = error instanceof Error && error.name === 'TimeoutError';\n\n const iterationResult: GovernanceIteration = {\n index: iteration,\n status: isTimeout ? 'timeout' : 'error',\n error: lastError,\n tokenUsage: { input: 0, output: 0 },\n durationMs: iterationDuration,\n };\n\n iterationHistory.push(iterationResult);\n onIteration?.(iterationResult);\n\n const errorSignal = createSignal(\n isTimeout ? 'loop.timeout' : 'loop.error',\n `Iteration ${iteration} ${isTimeout ? 'timed out' : 'failed'}: ${lastError}`,\n runId,\n 'medium',\n { iteration, error: lastError },\n );\n signals.push(errorSignal);\n onSignal?.(errorSignal);\n\n if (!feedbackErrors) {\n return {\n success: false,\n iterations: iteration,\n iterationHistory,\n error: `Iteration ${iteration} failed: ${lastError}`,\n totalTokens: { input: totalInputTokens, output: totalOutputTokens },\n totalDurationMs: Date.now() - startTime,\n signals,\n };\n }\n }\n }\n\n const exhaustedSignal = createSignal(\n 'loop.exhausted',\n `Max iterations (${maxIterations}) reached without completion signal`,\n runId,\n 'high',\n { iterations: maxIterations, completionSignal },\n );\n signals.push(exhaustedSignal);\n onSignal?.(exhaustedSignal);\n\n return {\n success: false,\n iterations: iteration,\n iterationHistory,\n error: `Max iterations (${maxIterations}) reached without completion signal \"${completionSignal}\"`,\n totalTokens: { input: totalInputTokens, output: totalOutputTokens },\n totalDurationMs: Date.now() - startTime,\n signals,\n };\n}\n\n/**\n * Governance Agent class.\n * Wraps the autonomous retry loop in an interface compatible with StandardAgent.\n */\nexport class GovernanceAgent {\n private options: GovernanceAgentOptions;\n\n constructor(options: GovernanceAgentOptions) {\n this.options = options;\n }\n\n /**\n * Generates a response using the governance retry loop.\n * Maps the result to a format compatible with StandardAgent results where possible,\n * or returns the specific GovernanceResult.\n */\n async generate(): Promise<GovernanceResult> {\n return executeGovernanceLoop(this.options);\n }\n\n /**\n * Creates a new instance with merged options.\n */\n static create(options: GovernanceAgentOptions): GovernanceAgent {\n return new GovernanceAgent(options);\n }\n}\n\n/**\n * Factory for creating a Governance Agent with defaults.\n */\nexport function createGovernanceAgent(options: GovernanceAgentOptions): GovernanceAgent {\n return new GovernanceAgent(options);\n}\n\n/**\n * Default governance rules.\n */\nexport const DEFAULT_GOVERNANCE_RULES: GovernanceRules = {\n maxTokensPerIteration: 4096,\n blockedTools: ['deleteFile', 'formatDisk', 'dropTable', 'truncateTable', 'deleteDatabase'],\n requireApproval: ['executeShell', 'runCommand', 'modifyPermissions', 'deployProduction'],\n maxTotalTokens: 100_000,\n iterationTimeoutMs: 60_000,\n};\n\n// Re-export types and legacy function for backward compatibility\nexport const ralphLoop = executeGovernanceLoop;\nexport type RalphLoopResult = GovernanceResult;\nexport type RalphLoopOptions = GovernanceAgentOptions;\nexport type RalphGovernance = GovernanceRules;\nexport const DEFAULT_RALPH_GOVERNANCE = DEFAULT_GOVERNANCE_RULES;\n","/**\n * @fileoverview Platform Orchestrator\n *\n * Provides risk-aware agent orchestration with intelligent caching and dynamic\n * agent selection based on message risk analysis. Supports MCP toolset integration\n * and compliance signal emission.\n *\n * @module @od-oneapp/ai-platform/agents/orchestrator\n */\n\nimport { randomUUID } from 'node:crypto';\n\nimport { detectRiskFromMessages } from \"../governance/policies\";\nimport { createAgentUIStreamResponse } from '../shared';\n\nimport { createDefaultAgent } from './default-agent';\nimport { connectMcpToolset } from \"./tools\";\n\nimport type { ComplianceSignal, RiskLevel } from '../governance/compliance/schemas';\nimport type { SDKUIMessage as UIMessage, SDKToolSet as ToolSet , SDKLanguageModelV3 , SDKModelMessage } from '../shared';\nimport type { AgentStructuredOutput } from './base/schemas';\nimport type { DefaultAgent } from './default-agent';\nimport type { McpToolsetOptions } from \"./tools\";\n\n\n/**\n * Options for configuring the Platform Orchestrator.\n */\nexport interface OrchestratorOptions {\n /**\n * Factory function that creates a language model instance for each agent.\n * Invoked per risk bucket to allow per-request provisioning.\n */\n modelFactory: () => SDKLanguageModelV3;\n /** Optional callback for compliance signal emission; omitted when not needed. */\n onSignal?: (signal: ComplianceSignal) => void;\n /**\n * Optional callback for structured output persistence.\n * Parsed output is validated before invoking this callback.\n */\n onStructuredOutput?: (output: AgentStructuredOutput) => Promise<void> | void;\n /**\n * Optional MCP (Model Context Protocol) toolset configuration.\n * When provided, tools are dynamically connected per risk level.\n */\n mcp?: McpToolsetOptions;\n}\n\n/**\n * Risk-aware agent orchestrator with intelligent caching and dynamic agent selection.\n * Automatically selects the appropriate agent based on message risk analysis and\n * caches agents per risk level for performance optimization.\n */\nexport class PlatformOrchestrator {\n /** Orchestrator version identifier. */\n readonly version = 'agent-v1' as const;\n /** Orchestrator ID. */\n readonly id = 'platform-orchestrator';\n /** Orchestrator configuration options. */\n private readonly options: OrchestratorOptions;\n /** Cached agents per risk level. */\n private readonly agents: Partial<Record<RiskLevel, DefaultAgent>> = {};\n\n /**\n * Constructs a new PlatformOrchestrator instance.\n * @param options - Orchestrator configuration options.\n */\n constructor(options: OrchestratorOptions) {\n this.options = options;\n }\n\n /**\n * Gets the tools available to the orchestrator.\n * Returns empty object as tools are managed per agent instance.\n */\n get tools() {\n return {};\n }\n\n /**\n * Gets tools from a medium-risk agent (default).\n */\n async getTools() {\n const agent = await this.ensureAgent('medium');\n return agent.tools;\n }\n\n /**\n * Generates a response using the appropriate agent based on message risk.\n */\n async generate(options: Parameters<DefaultAgent['generate']>[0]) {\n const agent = await this.agentForMessages(options.messages ?? []);\n return agent.generate(options);\n }\n\n /**\n * Streams a response using the appropriate agent based on message risk.\n */\n async stream(options: Parameters<DefaultAgent['stream']>[0]) {\n const agent = await this.agentForMessages(options.messages ?? []);\n return agent.stream(options);\n }\n\n /**\n * Creates a UI stream response for the given messages.\n * Uses the StandardAgent (Experimental_Agent) interface.\n */\n async respond({ messages }: { messages: UIMessage[] }) {\n const agent = await this.agentForMessages(messages);\n\n // NOTE: createAgentUIStreamResponse expects an Experimental_Agent instance.\n // Our StandardAgent wraps this instance but exposes compatible generate/stream methods.\n // However, createAgentUIStreamResponse might act on the instance directly or checks prototype.\n // If StandardAgent doesn't extend Experimental_Agent, this might fail type checks in some TS setups.\n // But since we are passing { agent: ... }, as long as 'agent' satisfies the interface expected by the helper\n // (which is likely { generate: ..., stream: ... } or just the Agent class), it should work.\n\n // In V6, createAgentUIStreamResponse signature is: ({ agent: Agent<...>, ... })\n // where Agent is the Experimental_Agent class.\n // Since StandardAgent WRAPS it, we need to access the underlying agent OR\n // we just use the agent's stream method directly and return the response.\n\n // Actually, createAgentUIStreamResponse is a helper to Format the stream for Vercel AI SDK UI validation.\n // We can just use the stream result directly for most cases, or re-implement the response wrapper.\n // But for compatibility, let's cast it if it walks like a duck.\n // StandardAgent mimics the public API of Agent.\n return createAgentUIStreamResponse({\n agent: agent.getToolLoopAgent(),\n uiMessages: messages,\n });\n }\n\n private extractTextContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .filter(\n (part): part is { type: 'text'; text: string } =>\n typeof part === 'object' &&\n part !== null &&\n 'type' in part &&\n part.type === 'text' &&\n 'text' in part,\n )\n .map(part => part.text)\n .join(' ');\n }\n\n return '';\n }\n\n private async agentForMessages(\n messages: Array<UIMessage | SDKModelMessage>,\n ): Promise<DefaultAgent> {\n const normalized = messages\n .map(message => {\n if (!message || typeof message !== 'object') return null;\n const record = message as { role?: unknown; content?: unknown; parts?: unknown };\n if (typeof record.role !== 'string') return null;\n const source = typeof record.content !== 'undefined' ? record.content : record.parts;\n return {\n role: record.role,\n content: this.extractTextContent(source),\n };\n })\n .filter((value): value is { role: string; content: string } => value !== null);\n\n const risk = detectRiskFromMessages(normalized);\n\n return this.ensureAgent(risk);\n }\n\n private async ensureAgent(riskLevel: RiskLevel): Promise<DefaultAgent> {\n const cachedAgent = this.agents[riskLevel];\n if (cachedAgent) {\n return cachedAgent;\n }\n\n if (!this.agents[riskLevel]) {\n const model = this.options.modelFactory();\n let cleanup: (() => Promise<void>) | undefined;\n let dynamicTools: ToolSet | undefined;\n\n if (this.options.mcp) {\n const connection = await connectMcpToolset(this.options.mcp);\n dynamicTools = connection.tools;\n cleanup = async () => {\n await connection.close();\n delete this.agents[riskLevel];\n };\n }\n\n // Superpowers initialization is handled at app root level.\n // Tools that require superpowers will fail at runtime if not initialized,\n // which is the expected behavior.\n\n const agent = createDefaultAgent({\n model,\n riskLevel,\n runId: randomUUID(),\n onSignal: this.options.onSignal,\n onStructuredOutput: this.options.onStructuredOutput,\n tools: dynamicTools,\n onCleanup: cleanup,\n });\n\n this.agents[riskLevel] = agent;\n }\n\n return this.agents[riskLevel];\n }\n}\n\n/** Type alias for PlatformOrchestrator (for convenience). */\nexport type PlatformAgent = PlatformOrchestrator;\n","/**\n * @fileoverview Evaluator-Optimizer Feedback Loop.\n * @module @od-oneapp/ai-platform/agents/evaluator-optimizer\n *\n * Main orchestration module implementing the 5-step workflow.\n * Based on VERCEL_AI_SDK_V6_PATTERNS.md section 4.2\n *\n * WORKFLOW:\n * 1. Generate initial content based on user request\n * 2. Evaluate quality against criteria\n * 3. If quality < threshold, optimize the content\n * 4. Re-evaluate optimized content\n * 5. Repeat steps 3-4 until threshold met or max iterations reached\n */\n\nimport { logInfo } from '@repo/shared/logs';\n\nimport {\n type EvaluationResult,\n type EvaluatorInput,\n type Evaluator,\n type Optimizer,\n type OptimizedResult,\n type FeedbackLoopConfig,\n} from './schema';\n\n/** Default maximum iterations for feedback loop. */\nconst DEFAULT_MAX_ITERATIONS = 5;\n\n/** Default target quality score. */\nconst DEFAULT_TARGET_SCORE = 8;\n\n/** Default diminishing return threshold. */\nconst DEFAULT_DIMINISHING_RETURN_THRESHOLD = 2;\n\n/** Minimum allowed iterations. */\nconst MIN_ITERATIONS = 1;\n\n/** Maximum allowed iterations. */\nconst MAX_ITERATIONS = 10;\n\n/** Minimum target score. */\nconst MIN_TARGET_SCORE = 1;\n\n/** Maximum target score. */\nconst MAX_TARGET_SCORE = 10;\n\n/**\n * Configuration for evaluator-optimizer setup\n */\nexport interface OptimizerConfig {\n /**\n * Maximum iterations for feedback loop (1-10)\n */\n maxIterations: number;\n\n /**\n * Target quality score (1-10)\n */\n targetScore: number;\n\n /**\n * Evaluator instance\n */\n evaluator: Evaluator;\n\n /**\n * Optimizer instance\n */\n optimizer: Optimizer;\n\n /**\n * Enable detailed logging\n */\n enableLogging?: boolean;\n\n /**\n * Stop on first threshold achievement\n */\n stopOnThreshold?: boolean;\n\n /**\n * Detect diminishing returns\n */\n diminishingReturnThreshold?: number;\n}\n\n/**\n * Validates OptimizerConfig bounds at runtime\n * @throws Error if config values are out of valid ranges\n */\nfunction validateOptimizerConfig(config: OptimizerConfig): void {\n if (config.maxIterations < MIN_ITERATIONS || config.maxIterations > MAX_ITERATIONS) {\n throw new Error(\n `maxIterations must be between ${MIN_ITERATIONS} and ${MAX_ITERATIONS}, got ${config.maxIterations}`,\n );\n }\n if (config.targetScore < MIN_TARGET_SCORE || config.targetScore > MAX_TARGET_SCORE) {\n throw new Error(\n `targetScore must be between ${MIN_TARGET_SCORE} and ${MAX_TARGET_SCORE}, got ${config.targetScore}`,\n );\n }\n}\n\n/**\n * Main EvaluatorOptimizer class\n * Orchestrates the iterative evaluation-optimization feedback loop\n */\nexport class EvaluatorOptimizer {\n private config: OptimizerConfig;\n private logger: (msg: string) => void;\n\n constructor(config: OptimizerConfig) {\n validateOptimizerConfig(config);\n this.config = config;\n this.logger = config.enableLogging ? logInfo : () => {};\n }\n\n /**\n * Get the evaluator instance.\n * @returns The configured evaluator.\n */\n public getEvaluator(): Evaluator {\n return this.config.evaluator;\n }\n\n /**\n * Get the optimizer instance.\n * @returns The configured optimizer.\n */\n public getOptimizer(): Optimizer {\n return this.config.optimizer;\n }\n\n /**\n * Execute 5-step feedback loop workflow\n *\n * STEP 1: Generate initial content (provided as input)\n * STEP 2: Evaluate initial content\n * STEP 3: If score < threshold, optimize\n * STEP 4: Re-evaluate optimized content\n * STEP 5: Repeat until threshold or max iterations\n *\n * @param initialContent - Initial content to optimize\n * @param originalRequest - Original user request context\n * @param config - Optional loop configuration overrides\n * @returns Optimized result with full history and metadata\n *\n * @example\n * ```typescript\n * const optimizer = new EvaluatorOptimizer({\n * maxIterations: 5,\n * targetScore: 8,\n * evaluator: createLLMEvaluator(),\n * optimizer: createPromptOptimizer(),\n * enableLogging: true\n * });\n *\n * const result = await optimizer.runFeedbackLoop(\n * \"Generated content\",\n * \"Original user request\"\n * );\n *\n * console.log(`Final score: ${result.finalEvaluation.qualityScore}/10`);\n * console.log(`Cycles: ${result.cyclesCompleted}`);\n * ```\n */\n async runFeedbackLoop(\n initialContent: string,\n originalRequest: string,\n loopConfig?: Partial<FeedbackLoopConfig>,\n ): Promise<OptimizedResult> {\n const startTime = new Date().toISOString();\n const config = {\n maxIterations: this.config.maxIterations,\n targetScore: this.config.targetScore,\n enableLogging: this.config.enableLogging ?? false,\n stopOnThreshold: this.config.stopOnThreshold ?? true,\n diminishingReturnThreshold: this.config.diminishingReturnThreshold ?? 2,\n ...loopConfig,\n };\n\n const scoreHistory: number[] = [];\n const contentHistory: string[] = [initialContent];\n let currentContent = initialContent;\n let currentEvaluation: EvaluationResult | null = null;\n let cyclesCompleted = 0;\n let consecutiveNonImprovingCycles = 0;\n\n this.logger(`\\n${'='.repeat(60)}`);\n this.logger('Evaluator-Optimizer Feedback Loop Started');\n this.logger(`Target Score: ${config.targetScore}/10`);\n this.logger(`Max Iterations: ${config.maxIterations}`);\n this.logger(`${'='.repeat(60)}\\n`);\n\n try {\n // STEP 2: Initial evaluation\n this.logger(`STEP 2: Initial Evaluation`);\n currentEvaluation = await this.evaluateContent(currentContent, originalRequest, 1);\n scoreHistory.push(currentEvaluation.qualityScore);\n\n this.logger(`Quality Score: ${currentEvaluation.qualityScore}/10`);\n this.logger(`Meets Threshold: ${currentEvaluation.meetsThreshold}\\n`);\n\n // STEP 3-5: Iterative optimization loop\n while (cyclesCompleted < config.maxIterations && !currentEvaluation.meetsThreshold) {\n cyclesCompleted += 1;\n\n this.logger(`${'─'.repeat(60)}`);\n this.logger(`STEP 3: Optimization (Cycle ${cyclesCompleted})`);\n\n // Check for diminishing returns\n // Compare to score from 2 iterations ago (since current was already pushed)\n if (cyclesCompleted > 1 && scoreHistory.length >= 2) {\n const previousScore = scoreHistory[scoreHistory.length - 2];\n if (currentEvaluation.qualityScore === previousScore) {\n consecutiveNonImprovingCycles += 1;\n this.logger(`⚠ No improvement (${consecutiveNonImprovingCycles} consecutive)`);\n\n if (consecutiveNonImprovingCycles >= config.diminishingReturnThreshold) {\n this.logger(`Diminishing returns detected. Stopping optimization.`);\n return this.buildResult(\n currentContent,\n currentEvaluation,\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'diminishing_returns',\n startTime,\n undefined,\n );\n }\n } else {\n consecutiveNonImprovingCycles = 0;\n }\n }\n\n // Optimize content\n const optimizedContent = await this.optimizeContent(\n currentContent,\n currentEvaluation,\n originalRequest,\n cyclesCompleted,\n );\n currentContent = optimizedContent;\n contentHistory.push(optimizedContent);\n\n this.logger(`Content optimized`);\n\n // STEP 4: Re-evaluate\n this.logger(`STEP 4: Re-evaluation`);\n currentEvaluation = await this.evaluateContent(\n currentContent,\n originalRequest,\n cyclesCompleted + 1,\n );\n scoreHistory.push(currentEvaluation.qualityScore);\n\n this.logger(`Quality Score: ${currentEvaluation.qualityScore}/10`);\n this.logger(`Meets Threshold: ${currentEvaluation.meetsThreshold}`);\n this.logger(`Issues: ${currentEvaluation.specificIssues.length}\\n`);\n\n // Check if threshold met\n if (currentEvaluation.meetsThreshold && config.stopOnThreshold) {\n this.logger(`✓ Threshold reached! Quality: ${currentEvaluation.qualityScore}/10`);\n return this.buildResult(\n currentContent,\n currentEvaluation,\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'threshold_met',\n startTime,\n undefined,\n );\n }\n }\n\n // Loop ended - either threshold met or max iterations reached\n if (currentEvaluation.meetsThreshold) {\n this.logger(`✓ Threshold reached after ${cyclesCompleted} cycles`);\n return this.buildResult(\n currentContent,\n currentEvaluation,\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'threshold_met',\n startTime,\n undefined,\n );\n } else {\n this.logger(`⚠ Max iterations (${config.maxIterations}) reached without meeting threshold`);\n return this.buildResult(\n currentContent,\n currentEvaluation,\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'max_iterations',\n startTime,\n undefined,\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.logger(`✗ Error in feedback loop: ${errorMessage}`);\n\n // Provide valid error evaluation result to avoid downstream runtime errors\n const errorEvaluation: EvaluationResult = currentEvaluation || {\n qualityScore: 0,\n preservesTone: false,\n preservesNuance: false,\n culturallyAccurate: false,\n technicallyCorrect: false,\n specificIssues: [`Error during evaluation: ${errorMessage}`],\n improvementSuggestions: [],\n strengths: [],\n overallAssessment: `Evaluation failed: ${errorMessage}`,\n meetsThreshold: false,\n };\n\n return this.buildResult(\n currentContent,\n errorEvaluation,\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'error',\n startTime,\n errorMessage,\n );\n }\n }\n\n /**\n * Evaluate content\n */\n private async evaluateContent(\n content: string,\n originalRequest: string,\n iterationNumber: number,\n ): Promise<EvaluationResult> {\n const evaluatorInput: EvaluatorInput = {\n content,\n originalRequest,\n criteria: {\n threshold: this.config.targetScore,\n },\n iterationNumber,\n };\n\n return this.config.evaluator.evaluate(evaluatorInput);\n }\n\n /**\n * Optimize content\n */\n private async optimizeContent(\n content: string,\n evaluationFeedback: EvaluationResult,\n originalRequest: string,\n iterationNumber: number,\n ): Promise<string> {\n return this.config.optimizer.optimize({\n content,\n evaluationFeedback,\n originalRequest,\n iterationNumber,\n });\n }\n\n /**\n * Build final result object\n */\n private buildResult(\n finalContent: string,\n finalEvaluation: EvaluationResult,\n cyclesCompleted: number,\n scoreHistory: number[],\n contentHistory: string[],\n terminationReason: 'threshold_met' | 'max_iterations' | 'diminishing_returns' | 'error',\n startTime: string,\n error?: string,\n ): OptimizedResult {\n const endTime = new Date().toISOString();\n const startMs = new Date(startTime).getTime();\n const endMs = new Date(endTime).getTime();\n\n const firstScore = scoreHistory[0] ?? 0;\n const lastScore = scoreHistory[scoreHistory.length - 1] ?? firstScore;\n const averageScoreImprovement =\n scoreHistory.length > 1 ? (lastScore - firstScore) / (scoreHistory.length - 1) : 0;\n\n this.logger(`\\n${'='.repeat(60)}`);\n this.logger('Feedback Loop Complete');\n this.logger(`Cycles: ${cyclesCompleted}`);\n this.logger(`Final Score: ${finalEvaluation.qualityScore}/10`);\n this.logger(`Average Improvement: ${averageScoreImprovement.toFixed(2)}/cycle`);\n this.logger(`Time: ${endMs - startMs}ms`);\n this.logger(`Reason: ${terminationReason}`);\n this.logger(`${'='.repeat(60)}\\n`);\n\n return {\n finalContent,\n finalEvaluation,\n cyclesCompleted,\n meetsThreshold: finalEvaluation.meetsThreshold,\n scoreHistory,\n contentHistory,\n terminationReason,\n error,\n metadata: {\n startTime,\n endTime,\n processingTimeMs: endMs - startMs,\n averageScoreImprovement,\n },\n };\n }\n}\n\n/**\n * Factory function to create evaluator-optimizer\n *\n * @param config - Configuration object\n * @returns EvaluatorOptimizer instance\n *\n * @example\n * ```typescript\n * const loop = createEvaluatorOptimizer({\n * maxIterations: 5,\n * targetScore: 8,\n * evaluator: createLLMEvaluator(),\n * optimizer: createPromptOptimizer(),\n * enableLogging: true\n * });\n * ```\n */\nexport function createEvaluatorOptimizer(config: OptimizerConfig): EvaluatorOptimizer {\n return new EvaluatorOptimizer(config);\n}\n\n/**\n * Helper function to run feedback loop with sensible defaults\n *\n * @param initialContent - Content to optimize\n * @param originalRequest - Original request context\n * @param config - Optional configuration\n * @returns Optimized result\n *\n * @example\n * ```typescript\n * const result = await runFeedbackLoop(\n * \"Generated content\",\n * \"User request\",\n * {\n * maxIterations: 5,\n * targetScore: 8,\n * enableLogging: true\n * }\n * );\n * ```\n */\nexport async function runFeedbackLoop(\n initialContent: string,\n originalRequest: string,\n config?: Partial<OptimizerConfig>,\n): Promise<OptimizedResult> {\n // Import defaults (to avoid circular dependencies, use inline)\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports -- Dynamic import type inference\n let createLLMEvaluator: typeof import('./evaluator').createLLMEvaluator;\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports -- Dynamic import type inference\n let createPromptOptimizer: typeof import('./optimizer').createPromptOptimizer;\n\n try {\n const { createLLMEvaluator: importedEvaluator } = await import('./evaluator');\n createLLMEvaluator = importedEvaluator;\n } catch (error) {\n throw new Error(\n `Failed to import evaluator module: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n try {\n const { createPromptOptimizer: importedOptimizer } = await import('./optimizer');\n createPromptOptimizer = importedOptimizer;\n } catch (error) {\n throw new Error(\n `Failed to import optimizer module: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const optimizerConfig: OptimizerConfig = {\n maxIterations: config?.maxIterations ?? DEFAULT_MAX_ITERATIONS,\n targetScore: config?.targetScore ?? DEFAULT_TARGET_SCORE,\n evaluator: config?.evaluator ?? createLLMEvaluator(),\n optimizer: config?.optimizer ?? createPromptOptimizer(),\n enableLogging: config?.enableLogging ?? false,\n stopOnThreshold: config?.stopOnThreshold ?? true,\n diminishingReturnThreshold:\n config?.diminishingReturnThreshold ?? DEFAULT_DIMINISHING_RETURN_THRESHOLD,\n };\n\n const loop = createEvaluatorOptimizer(optimizerConfig);\n return loop.runFeedbackLoop(initialContent, originalRequest);\n}\n\n// Re-export types and utilities\nexport type {\n EvaluationResult,\n EvaluatorInput,\n Evaluator,\n Optimizer,\n OptimizedResult,\n FeedbackLoopConfig,\n};\n\nexport { EvaluationResultSchema, FeedbackLoopConfigSchema } from './schema';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { logInfo } from "@od-oneapp/shared/logs";
|
|
2
|
+
|
|
3
|
+
//#region src/agents/patterns/evaluator-optimizer-pattern.ts
|
|
4
|
+
/**
|
|
5
|
+
* Evaluator-Optimizer Feedback Loop Pattern
|
|
6
|
+
* Based on VERCEL_AI_SDK_V6_PATTERNS.md section 4.2
|
|
7
|
+
*
|
|
8
|
+
* A powerful feedback loop architecture for iterative quality improvement.
|
|
9
|
+
* Agents can evaluate output against criteria and optimize based on feedback
|
|
10
|
+
* until quality thresholds are met.
|
|
11
|
+
*
|
|
12
|
+
* WORKFLOW:
|
|
13
|
+
* 1. Generate initial content based on user request
|
|
14
|
+
* 2. Evaluate quality against criteria
|
|
15
|
+
* 3. If quality < threshold, optimize the content
|
|
16
|
+
* 4. Re-evaluate optimized content
|
|
17
|
+
* 5. Repeat steps 3-4 until threshold met or max iterations reached
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Main EvaluatorOptimizer class
|
|
21
|
+
* Orchestrates the iterative evaluation-optimization feedback loop
|
|
22
|
+
*/
|
|
23
|
+
var PatternEvaluatorOptimizer = class {
|
|
24
|
+
options;
|
|
25
|
+
logger;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.options = {
|
|
28
|
+
evaluator: options.evaluator,
|
|
29
|
+
optimizer: options.optimizer,
|
|
30
|
+
maxIterations: options.maxIterations ?? 5,
|
|
31
|
+
targetScore: options.targetScore ?? .8,
|
|
32
|
+
enableLogging: options.enableLogging ?? false,
|
|
33
|
+
stopOnThreshold: options.stopOnThreshold ?? true,
|
|
34
|
+
diminishingReturnThreshold: options.diminishingReturnThreshold ?? 2
|
|
35
|
+
};
|
|
36
|
+
this.logger = this.options.enableLogging ? logInfo : () => {};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Run the feedback loop
|
|
40
|
+
*
|
|
41
|
+
* @param initialContent - Initial content to optimize
|
|
42
|
+
* @param context - Evaluation context with request and criteria
|
|
43
|
+
* @returns Optimization result with full history
|
|
44
|
+
*/
|
|
45
|
+
async run(initialContent, context) {
|
|
46
|
+
const startTime = (/* @__PURE__ */ new Date()).toISOString();
|
|
47
|
+
const scoreHistory = [];
|
|
48
|
+
const contentHistory = [initialContent];
|
|
49
|
+
let currentContent = initialContent;
|
|
50
|
+
let currentEvaluation = null;
|
|
51
|
+
let cyclesCompleted = 0;
|
|
52
|
+
let consecutiveNonImprovingCycles = 0;
|
|
53
|
+
this.logger(`\n${"=".repeat(70)}`);
|
|
54
|
+
this.logger("Evaluator-Optimizer Feedback Loop Started");
|
|
55
|
+
this.logger(`Target Score: ${this.options.targetScore}`);
|
|
56
|
+
this.logger(`Max Iterations: ${this.options.maxIterations}`);
|
|
57
|
+
this.logger(`${"=".repeat(70)}\n`);
|
|
58
|
+
try {
|
|
59
|
+
this.logger("STEP 2: Initial Evaluation");
|
|
60
|
+
currentEvaluation = await this.evaluateContent(currentContent, context, 1);
|
|
61
|
+
scoreHistory.push(currentEvaluation.score);
|
|
62
|
+
this.logger(`Score: ${currentEvaluation.score}`);
|
|
63
|
+
this.logger(`Meets Threshold: ${!currentEvaluation.shouldRetry}\n`);
|
|
64
|
+
while (cyclesCompleted < this.options.maxIterations && currentEvaluation.shouldRetry) {
|
|
65
|
+
cyclesCompleted += 1;
|
|
66
|
+
this.logger(`${"─".repeat(70)}`);
|
|
67
|
+
this.logger(`STEP 3: Optimization (Cycle ${cyclesCompleted})`);
|
|
68
|
+
if (cyclesCompleted > 1) {
|
|
69
|
+
const previousScore = scoreHistory[scoreHistory.length - 1];
|
|
70
|
+
if (currentEvaluation.score === previousScore) {
|
|
71
|
+
consecutiveNonImprovingCycles += 1;
|
|
72
|
+
this.logger(`⚠ No improvement detected (${consecutiveNonImprovingCycles} consecutive)`);
|
|
73
|
+
if (consecutiveNonImprovingCycles >= this.options.diminishingReturnThreshold) {
|
|
74
|
+
this.logger("Diminishing returns detected. Stopping optimization.");
|
|
75
|
+
return this.buildResult(currentContent, currentEvaluation, cyclesCompleted, scoreHistory, contentHistory, "diminishing_returns", startTime);
|
|
76
|
+
}
|
|
77
|
+
} else consecutiveNonImprovingCycles = 0;
|
|
78
|
+
}
|
|
79
|
+
const optimizedContent = await this.optimizeContent(currentContent, currentEvaluation);
|
|
80
|
+
currentContent = optimizedContent;
|
|
81
|
+
contentHistory.push(optimizedContent);
|
|
82
|
+
this.logger("Content optimized");
|
|
83
|
+
this.logger("STEP 4: Re-evaluation");
|
|
84
|
+
currentEvaluation = await this.evaluateContent(currentContent, context, cyclesCompleted + 1);
|
|
85
|
+
scoreHistory.push(currentEvaluation.score);
|
|
86
|
+
this.logger(`Score: ${currentEvaluation.score}`);
|
|
87
|
+
this.logger(`Meets Threshold: ${!currentEvaluation.shouldRetry}`);
|
|
88
|
+
this.logger(`Issues: ${currentEvaluation.issues?.length ?? 0}\n`);
|
|
89
|
+
if (!currentEvaluation.shouldRetry && this.options.stopOnThreshold) {
|
|
90
|
+
this.logger(`✓ Threshold reached! Score: ${currentEvaluation.score}`);
|
|
91
|
+
return this.buildResult(currentContent, currentEvaluation, cyclesCompleted, scoreHistory, contentHistory, "threshold_met", startTime);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!currentEvaluation.shouldRetry) {
|
|
95
|
+
this.logger(`✓ Threshold reached after ${cyclesCompleted} cycles`);
|
|
96
|
+
return this.buildResult(currentContent, currentEvaluation, cyclesCompleted, scoreHistory, contentHistory, "threshold_met", startTime);
|
|
97
|
+
} else {
|
|
98
|
+
this.logger(`⚠ Max iterations (${this.options.maxIterations}) reached without meeting threshold`);
|
|
99
|
+
return this.buildResult(currentContent, currentEvaluation, cyclesCompleted, scoreHistory, contentHistory, "max_iterations", startTime);
|
|
100
|
+
}
|
|
101
|
+
} catch (error) {
|
|
102
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
103
|
+
this.logger(`✗ Error in feedback loop: ${errorMessage}`);
|
|
104
|
+
return this.buildResult(currentContent, currentEvaluation || {
|
|
105
|
+
score: 0,
|
|
106
|
+
dimensions: [],
|
|
107
|
+
suggestions: [],
|
|
108
|
+
shouldRetry: true
|
|
109
|
+
}, cyclesCompleted, scoreHistory, contentHistory, "error", startTime, errorMessage);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Evaluate content quality
|
|
114
|
+
*/
|
|
115
|
+
async evaluateContent(content, context, iterationNumber) {
|
|
116
|
+
const evalContext = {
|
|
117
|
+
...context,
|
|
118
|
+
threshold: context.threshold ?? this.options.targetScore,
|
|
119
|
+
iterationNumber
|
|
120
|
+
};
|
|
121
|
+
const evaluation = await this.options.evaluator(content, evalContext);
|
|
122
|
+
const shouldRetry = evaluation.score < (context.threshold ?? this.options.targetScore);
|
|
123
|
+
return {
|
|
124
|
+
...evaluation,
|
|
125
|
+
shouldRetry
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Optimize content based on evaluation feedback
|
|
130
|
+
*/
|
|
131
|
+
async optimizeContent(content, evaluation) {
|
|
132
|
+
return this.options.optimizer(content, evaluation);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Build final result object
|
|
136
|
+
*/
|
|
137
|
+
buildResult(finalContent, finalEvaluation, cyclesCompleted, scoreHistory, contentHistory, terminationReason, startTime, error) {
|
|
138
|
+
const endTime = (/* @__PURE__ */ new Date()).toISOString();
|
|
139
|
+
const startMs = new Date(startTime).getTime();
|
|
140
|
+
const endMs = new Date(endTime).getTime();
|
|
141
|
+
const firstScore = scoreHistory[0] ?? 0;
|
|
142
|
+
const lastScore = scoreHistory[scoreHistory.length - 1] ?? firstScore;
|
|
143
|
+
const averageScoreImprovement = scoreHistory.length > 1 ? (lastScore - firstScore) / (scoreHistory.length - 1) : 0;
|
|
144
|
+
this.logger(`\n${"=".repeat(70)}`);
|
|
145
|
+
this.logger("Feedback Loop Complete");
|
|
146
|
+
this.logger(`Cycles: ${cyclesCompleted}`);
|
|
147
|
+
this.logger(`Final Score: ${finalEvaluation.score}`);
|
|
148
|
+
this.logger(`Average Improvement: ${averageScoreImprovement.toFixed(3)}/cycle`);
|
|
149
|
+
this.logger(`Time: ${endMs - startMs}ms`);
|
|
150
|
+
this.logger(`Reason: ${terminationReason}`);
|
|
151
|
+
this.logger(`${"=".repeat(70)}\n`);
|
|
152
|
+
return {
|
|
153
|
+
finalContent,
|
|
154
|
+
finalEvaluation,
|
|
155
|
+
cyclesCompleted,
|
|
156
|
+
meetsThreshold: !finalEvaluation.shouldRetry,
|
|
157
|
+
scoreHistory,
|
|
158
|
+
contentHistory,
|
|
159
|
+
terminationReason,
|
|
160
|
+
error,
|
|
161
|
+
metadata: {
|
|
162
|
+
startTime,
|
|
163
|
+
endTime,
|
|
164
|
+
processingTimeMs: endMs - startMs,
|
|
165
|
+
averageScoreImprovement
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Factory function to create evaluator-optimizer
|
|
172
|
+
*
|
|
173
|
+
* @param options - Configuration object
|
|
174
|
+
* @returns EvaluatorOptimizer instance
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```typescript
|
|
178
|
+
* const loop = createEvaluatorOptimizer({
|
|
179
|
+
* evaluator: async (output, context) => ({
|
|
180
|
+
* score: 0.85,
|
|
181
|
+
* dimensions: [
|
|
182
|
+
* { name: 'clarity', score: 0.9, feedback: 'Clear and concise' },
|
|
183
|
+
* { name: 'completeness', score: 0.8, feedback: 'Missing examples' }
|
|
184
|
+
* ],
|
|
185
|
+
* suggestions: ['Add practical examples'],
|
|
186
|
+
* shouldRetry: false
|
|
187
|
+
* }),
|
|
188
|
+
* optimizer: async (output, evaluation) => {
|
|
189
|
+
* // Improve based on feedback
|
|
190
|
+
* return improvedOutput;
|
|
191
|
+
* },
|
|
192
|
+
* targetScore: 0.85,
|
|
193
|
+
* maxIterations: 5
|
|
194
|
+
* });
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
function createPatternEvaluatorOptimizer(options) {
|
|
198
|
+
return new PatternEvaluatorOptimizer(options);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* @deprecated Use createPatternEvaluatorOptimizer instead
|
|
202
|
+
*/
|
|
203
|
+
const createEvaluatorOptimizer = createPatternEvaluatorOptimizer;
|
|
204
|
+
/**
|
|
205
|
+
* Pre-built evaluators for common quality dimensions
|
|
206
|
+
*
|
|
207
|
+
* ⚠️ WARNING: These are MOCK implementations returning hardcoded values.
|
|
208
|
+
* They are intended for testing and demonstration purposes only.
|
|
209
|
+
* Replace with actual LLM-based or rule-based evaluators for production use.
|
|
210
|
+
*/
|
|
211
|
+
const evaluators = {
|
|
212
|
+
factuality: (threshold = .8) => {
|
|
213
|
+
return async (output, context) => {
|
|
214
|
+
return {
|
|
215
|
+
score: .85,
|
|
216
|
+
dimensions: [{
|
|
217
|
+
name: "factuality",
|
|
218
|
+
score: .85,
|
|
219
|
+
feedback: "Most facts are accurate with minor uncertainties"
|
|
220
|
+
}],
|
|
221
|
+
suggestions: ["Verify statistics and dates", "Add citations for claims"],
|
|
222
|
+
shouldRetry: .85 < threshold,
|
|
223
|
+
assessment: "Content is largely factually accurate",
|
|
224
|
+
strengths: ["Well-sourced citations"],
|
|
225
|
+
issues: ["One unverified statistic"]
|
|
226
|
+
};
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
relevance: (threshold = .8) => {
|
|
230
|
+
return async (output, context) => {
|
|
231
|
+
return {
|
|
232
|
+
score: .9,
|
|
233
|
+
dimensions: [{
|
|
234
|
+
name: "relevance",
|
|
235
|
+
score: .9,
|
|
236
|
+
feedback: "Content directly addresses the request"
|
|
237
|
+
}, {
|
|
238
|
+
name: "completeness",
|
|
239
|
+
score: .85,
|
|
240
|
+
feedback: "Covers main points but misses some details"
|
|
241
|
+
}],
|
|
242
|
+
suggestions: ["Add more context about edge cases", "Include real-world examples"],
|
|
243
|
+
shouldRetry: .9 < threshold,
|
|
244
|
+
assessment: "Content is highly relevant to the request",
|
|
245
|
+
strengths: ["Directly addresses user intent", "Well-structured"],
|
|
246
|
+
issues: []
|
|
247
|
+
};
|
|
248
|
+
};
|
|
249
|
+
},
|
|
250
|
+
safety: (threshold = .95) => {
|
|
251
|
+
return async (output, context) => {
|
|
252
|
+
return {
|
|
253
|
+
score: .98,
|
|
254
|
+
dimensions: [{
|
|
255
|
+
name: "safety",
|
|
256
|
+
score: .98,
|
|
257
|
+
feedback: "Content contains no harmful or dangerous information"
|
|
258
|
+
}, {
|
|
259
|
+
name: "bias",
|
|
260
|
+
score: .95,
|
|
261
|
+
feedback: "Minimal bias detected; generally balanced perspective"
|
|
262
|
+
}],
|
|
263
|
+
suggestions: ["Review pronouns for inclusive language"],
|
|
264
|
+
shouldRetry: .98 < threshold,
|
|
265
|
+
assessment: "Content is safe and appropriate",
|
|
266
|
+
strengths: ["No harmful content", "Balanced perspective"],
|
|
267
|
+
issues: []
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
},
|
|
271
|
+
quality: (threshold = .8) => {
|
|
272
|
+
return async (output, context) => {
|
|
273
|
+
return {
|
|
274
|
+
score: .82,
|
|
275
|
+
dimensions: [
|
|
276
|
+
{
|
|
277
|
+
name: "clarity",
|
|
278
|
+
score: .85,
|
|
279
|
+
feedback: "Clear writing with good structure"
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: "completeness",
|
|
283
|
+
score: .8,
|
|
284
|
+
feedback: "Covers main topics but lacks depth in places"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
name: "accuracy",
|
|
288
|
+
score: .82,
|
|
289
|
+
feedback: "Factually sound with minor uncertainties"
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
name: "engagement",
|
|
293
|
+
score: .8,
|
|
294
|
+
feedback: "Moderately engaging, could be more compelling"
|
|
295
|
+
}
|
|
296
|
+
],
|
|
297
|
+
suggestions: [
|
|
298
|
+
"Add more specific examples",
|
|
299
|
+
"Improve opening sentence for engagement",
|
|
300
|
+
"Expand technical sections"
|
|
301
|
+
],
|
|
302
|
+
shouldRetry: .82 < threshold,
|
|
303
|
+
assessment: "Content is good quality with room for improvement",
|
|
304
|
+
strengths: ["Well-organized", "Clear explanations"],
|
|
305
|
+
issues: ["Lacks specific examples", "Some sections too brief"]
|
|
306
|
+
};
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
/**
|
|
311
|
+
* Helper function to run feedback loop with sensible defaults
|
|
312
|
+
*
|
|
313
|
+
* @param initialContent - Content to optimize
|
|
314
|
+
* @param context - Evaluation context
|
|
315
|
+
* @param options - Optional configuration overrides
|
|
316
|
+
* @returns Optimized result
|
|
317
|
+
*
|
|
318
|
+
* @example
|
|
319
|
+
* ```typescript
|
|
320
|
+
* const result = await runFeedbackLoop(
|
|
321
|
+
* "Generated content",
|
|
322
|
+
* { request: "Write an article about AI" },
|
|
323
|
+
* {
|
|
324
|
+
* evaluator: evaluators.quality(0.85),
|
|
325
|
+
* optimizer: async (content, evaluation) => {
|
|
326
|
+
* // Improve content based on feedback
|
|
327
|
+
* return improvedContent;
|
|
328
|
+
* },
|
|
329
|
+
* targetScore: 0.85,
|
|
330
|
+
* maxIterations: 5
|
|
331
|
+
* }
|
|
332
|
+
* );
|
|
333
|
+
* ```
|
|
334
|
+
*/
|
|
335
|
+
async function runPatternFeedbackLoop(initialContent, context, options) {
|
|
336
|
+
return createPatternEvaluatorOptimizer(options).run(initialContent, context);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Utility function to normalize evaluation scores
|
|
340
|
+
* Converts between different scoring scales (0-1, 1-10, etc.)
|
|
341
|
+
*/
|
|
342
|
+
function normalizeScore(score, fromMax = 10, toMax = 1) {
|
|
343
|
+
return score / fromMax * toMax;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Utility function to calculate aggregate score from dimensions
|
|
347
|
+
* Normalizes weights so they sum to 1, handling mixed explicit/default weights.
|
|
348
|
+
*/
|
|
349
|
+
function calculateAggregateScore(dimensions, weights) {
|
|
350
|
+
if (dimensions.length === 0) return 0;
|
|
351
|
+
const defaultWeight = 1 / dimensions.length;
|
|
352
|
+
const effectiveWeights = dimensions.map((dim) => weights?.[dim.name] ?? defaultWeight);
|
|
353
|
+
const totalWeight = effectiveWeights.reduce((a, b) => a + b, 0);
|
|
354
|
+
const sum = dimensions.reduce((acc, dim, idx) => {
|
|
355
|
+
const normalizedWeight = (effectiveWeights[idx] ?? defaultWeight) / totalWeight;
|
|
356
|
+
return acc + dim.score * normalizedWeight;
|
|
357
|
+
}, 0);
|
|
358
|
+
return Math.min(sum, 1);
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* @deprecated Use runPatternFeedbackLoop instead to avoid collision with runFeedbackLoop from evaluator-optimizer/index.ts
|
|
362
|
+
*/
|
|
363
|
+
const runFeedbackLoop = runPatternFeedbackLoop;
|
|
364
|
+
|
|
365
|
+
//#endregion
|
|
366
|
+
export { evaluators as a, runPatternFeedbackLoop as c, createPatternEvaluatorOptimizer as i, calculateAggregateScore as n, normalizeScore as o, createEvaluatorOptimizer as r, runFeedbackLoop as s, PatternEvaluatorOptimizer as t };
|
|
367
|
+
//# sourceMappingURL=evaluator-optimizer-pattern-B5939s2Z.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator-optimizer-pattern-B5939s2Z.mjs","names":[],"sources":["../src/agents/patterns/evaluator-optimizer-pattern.ts"],"sourcesContent":["/**\n * Evaluator-Optimizer Feedback Loop Pattern\n * Based on VERCEL_AI_SDK_V6_PATTERNS.md section 4.2\n *\n * A powerful feedback loop architecture for iterative quality improvement.\n * Agents can evaluate output against criteria and optimize based on feedback\n * until quality thresholds are met.\n *\n * WORKFLOW:\n * 1. Generate initial content based on user request\n * 2. Evaluate quality against criteria\n * 3. If quality < threshold, optimize the content\n * 4. Re-evaluate optimized content\n * 5. Repeat steps 3-4 until threshold met or max iterations reached\n */\n\nimport { logInfo } from '@repo/shared/logs';\n\n/**\n * Evaluation result with multi-dimensional assessment\n * Provides detailed feedback on content quality\n *\n * Note: Named PatternEvaluationResult to avoid collision with\n * EvaluationResult from evaluator-optimizer/schema.ts which uses\n * a different schema structure (9-dimensional vs multi-dimensional).\n */\nexport interface PatternEvaluationResult {\n /**\n * Overall quality score (0-1 or 1-10)\n */\n score: number;\n\n /**\n * Multi-dimensional quality assessment\n */\n dimensions: {\n name: string;\n score: number;\n feedback: string;\n }[];\n\n /**\n * Actionable improvement suggestions\n */\n suggestions: string[];\n\n /**\n * Whether content should be retried/optimized\n */\n shouldRetry: boolean;\n\n /**\n * Detailed assessment text\n */\n assessment?: string;\n\n /**\n * Strengths identified in the content\n */\n strengths?: string[];\n\n /**\n * Issues found that prevent threshold achievement\n */\n issues?: string[];\n}\n\n/**\n * Context for evaluations\n */\nexport interface EvalContext {\n request: string;\n threshold?: number;\n maxScore?: number;\n focusAreas?: string[];\n iterationNumber?: number;\n}\n\n/**\n * Configuration for evaluator-optimizer\n */\nexport interface EvaluatorOptimizerOptions {\n /**\n * Evaluator function that assesses output quality\n * Returns detailed feedback on multiple dimensions\n */\n evaluator: (output: string, context: EvalContext) => Promise<PatternEvaluationResult>;\n\n /**\n * Optimizer function that improves content based on evaluation\n */\n optimizer: (output: string, evaluation: PatternEvaluationResult) => Promise<string>;\n\n /**\n * Maximum optimization iterations (default: 5)\n */\n maxIterations?: number;\n\n /**\n * Target quality score to achieve (default: 0.8 or 8/10)\n */\n targetScore?: number;\n\n /**\n * Enable detailed logging of each cycle\n */\n enableLogging?: boolean;\n\n /**\n * Stop immediately when threshold is met\n */\n stopOnThreshold?: boolean;\n\n /**\n * Detect diminishing returns after N non-improving cycles\n */\n diminishingReturnThreshold?: number;\n}\n\n/**\n * Complete optimization result\n */\nexport interface PatternOptimizedResult {\n finalContent: string;\n finalEvaluation: PatternEvaluationResult;\n cyclesCompleted: number;\n meetsThreshold: boolean;\n scoreHistory: number[];\n contentHistory: string[];\n terminationReason: 'threshold_met' | 'max_iterations' | 'diminishing_returns' | 'error';\n error?: string;\n metadata?: {\n startTime: string;\n endTime: string;\n processingTimeMs: number;\n averageScoreImprovement: number;\n };\n}\n\n/**\n * Main EvaluatorOptimizer class\n * Orchestrates the iterative evaluation-optimization feedback loop\n */\nexport class PatternEvaluatorOptimizer {\n private options: Required<EvaluatorOptimizerOptions>;\n private logger: (msg: string) => void;\n\n constructor(options: EvaluatorOptimizerOptions) {\n this.options = {\n evaluator: options.evaluator,\n optimizer: options.optimizer,\n maxIterations: options.maxIterations ?? 5,\n targetScore: options.targetScore ?? 0.8,\n enableLogging: options.enableLogging ?? false,\n stopOnThreshold: options.stopOnThreshold ?? true,\n diminishingReturnThreshold: options.diminishingReturnThreshold ?? 2,\n };\n\n this.logger = this.options.enableLogging ? logInfo : () => {};\n }\n\n /**\n * Run the feedback loop\n *\n * @param initialContent - Initial content to optimize\n * @param context - Evaluation context with request and criteria\n * @returns Optimization result with full history\n */\n async run(initialContent: string, context: EvalContext): Promise<PatternOptimizedResult> {\n const startTime = new Date().toISOString();\n const scoreHistory: number[] = [];\n const contentHistory: string[] = [initialContent];\n let currentContent = initialContent;\n let currentEvaluation: PatternEvaluationResult | null = null;\n let cyclesCompleted = 0;\n let consecutiveNonImprovingCycles = 0;\n\n this.logger(`\\n${'='.repeat(70)}`);\n this.logger('Evaluator-Optimizer Feedback Loop Started');\n this.logger(`Target Score: ${this.options.targetScore}`);\n this.logger(`Max Iterations: ${this.options.maxIterations}`);\n this.logger(`${'='.repeat(70)}\\n`);\n\n try {\n // STEP 2: Initial evaluation\n this.logger('STEP 2: Initial Evaluation');\n currentEvaluation = await this.evaluateContent(currentContent, context, 1);\n scoreHistory.push(currentEvaluation.score);\n\n this.logger(`Score: ${currentEvaluation.score}`);\n this.logger(`Meets Threshold: ${!currentEvaluation.shouldRetry}\\n`);\n\n // STEP 3-5: Iterative optimization loop\n while (cyclesCompleted < this.options.maxIterations && currentEvaluation.shouldRetry) {\n cyclesCompleted += 1;\n\n this.logger(`${'─'.repeat(70)}`);\n this.logger(`STEP 3: Optimization (Cycle ${cyclesCompleted})`);\n\n // Check for diminishing returns\n if (cyclesCompleted > 1) {\n const previousScore = scoreHistory[scoreHistory.length - 1];\n if (currentEvaluation.score === previousScore) {\n consecutiveNonImprovingCycles += 1;\n this.logger(`⚠ No improvement detected (${consecutiveNonImprovingCycles} consecutive)`);\n\n if (consecutiveNonImprovingCycles >= this.options.diminishingReturnThreshold) {\n this.logger('Diminishing returns detected. Stopping optimization.');\n return this.buildResult(\n currentContent,\n currentEvaluation,\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'diminishing_returns',\n startTime,\n );\n }\n } else {\n consecutiveNonImprovingCycles = 0;\n }\n }\n\n // Optimize content\n const optimizedContent = await this.optimizeContent(currentContent, currentEvaluation);\n currentContent = optimizedContent;\n contentHistory.push(optimizedContent);\n\n this.logger('Content optimized');\n\n // STEP 4: Re-evaluate\n this.logger('STEP 4: Re-evaluation');\n currentEvaluation = await this.evaluateContent(\n currentContent,\n context,\n cyclesCompleted + 1,\n );\n scoreHistory.push(currentEvaluation.score);\n\n this.logger(`Score: ${currentEvaluation.score}`);\n this.logger(`Meets Threshold: ${!currentEvaluation.shouldRetry}`);\n this.logger(`Issues: ${currentEvaluation.issues?.length ?? 0}\\n`);\n\n // Check if threshold met\n if (!currentEvaluation.shouldRetry && this.options.stopOnThreshold) {\n this.logger(`✓ Threshold reached! Score: ${currentEvaluation.score}`);\n return this.buildResult(\n currentContent,\n currentEvaluation,\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'threshold_met',\n startTime,\n );\n }\n }\n\n // Loop ended - either threshold met or max iterations reached\n if (!currentEvaluation.shouldRetry) {\n this.logger(`✓ Threshold reached after ${cyclesCompleted} cycles`);\n return this.buildResult(\n currentContent,\n currentEvaluation,\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'threshold_met',\n startTime,\n );\n } else {\n this.logger(\n `⚠ Max iterations (${this.options.maxIterations}) reached without meeting threshold`,\n );\n return this.buildResult(\n currentContent,\n currentEvaluation,\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'max_iterations',\n startTime,\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.logger(`✗ Error in feedback loop: ${errorMessage}`);\n\n return this.buildResult(\n currentContent,\n currentEvaluation || {\n score: 0,\n dimensions: [],\n suggestions: [],\n shouldRetry: true,\n },\n cyclesCompleted,\n scoreHistory,\n contentHistory,\n 'error',\n startTime,\n errorMessage,\n );\n }\n }\n\n /**\n * Evaluate content quality\n */\n private async evaluateContent(\n content: string,\n context: EvalContext,\n iterationNumber: number,\n ): Promise<PatternEvaluationResult> {\n const evalContext: EvalContext = {\n ...context,\n threshold: context.threshold ?? this.options.targetScore,\n iterationNumber,\n };\n\n const evaluation = await this.options.evaluator(content, evalContext);\n\n // Determine if should retry based on score vs threshold\n const shouldRetry = evaluation.score < (context.threshold ?? this.options.targetScore);\n\n return {\n ...evaluation,\n shouldRetry,\n };\n }\n\n /**\n * Optimize content based on evaluation feedback\n */\n private async optimizeContent(\n content: string,\n evaluation: PatternEvaluationResult,\n ): Promise<string> {\n return this.options.optimizer(content, evaluation);\n }\n\n /**\n * Build final result object\n */\n private buildResult(\n finalContent: string,\n finalEvaluation: PatternEvaluationResult,\n cyclesCompleted: number,\n scoreHistory: number[],\n contentHistory: string[],\n terminationReason: 'threshold_met' | 'max_iterations' | 'diminishing_returns' | 'error',\n startTime: string,\n error?: string,\n ): PatternOptimizedResult {\n const endTime = new Date().toISOString();\n const startMs = new Date(startTime).getTime();\n const endMs = new Date(endTime).getTime();\n\n const firstScore = scoreHistory[0] ?? 0;\n const lastScore = scoreHistory[scoreHistory.length - 1] ?? firstScore;\n const averageScoreImprovement =\n scoreHistory.length > 1 ? (lastScore - firstScore) / (scoreHistory.length - 1) : 0;\n\n this.logger(`\\n${'='.repeat(70)}`);\n this.logger('Feedback Loop Complete');\n this.logger(`Cycles: ${cyclesCompleted}`);\n this.logger(`Final Score: ${finalEvaluation.score}`);\n this.logger(`Average Improvement: ${averageScoreImprovement.toFixed(3)}/cycle`);\n this.logger(`Time: ${endMs - startMs}ms`);\n this.logger(`Reason: ${terminationReason}`);\n this.logger(`${'='.repeat(70)}\\n`);\n\n return {\n finalContent,\n finalEvaluation,\n cyclesCompleted,\n meetsThreshold: !finalEvaluation.shouldRetry,\n scoreHistory,\n contentHistory,\n terminationReason,\n error,\n metadata: {\n startTime,\n endTime,\n processingTimeMs: endMs - startMs,\n averageScoreImprovement,\n },\n };\n }\n}\n\n/**\n * Factory function to create evaluator-optimizer\n *\n * @param options - Configuration object\n * @returns EvaluatorOptimizer instance\n *\n * @example\n * ```typescript\n * const loop = createEvaluatorOptimizer({\n * evaluator: async (output, context) => ({\n * score: 0.85,\n * dimensions: [\n * { name: 'clarity', score: 0.9, feedback: 'Clear and concise' },\n * { name: 'completeness', score: 0.8, feedback: 'Missing examples' }\n * ],\n * suggestions: ['Add practical examples'],\n * shouldRetry: false\n * }),\n * optimizer: async (output, evaluation) => {\n * // Improve based on feedback\n * return improvedOutput;\n * },\n * targetScore: 0.85,\n * maxIterations: 5\n * });\n * ```\n */\nexport function createPatternEvaluatorOptimizer(\n options: EvaluatorOptimizerOptions,\n): PatternEvaluatorOptimizer {\n return new PatternEvaluatorOptimizer(options);\n}\n\n/**\n * @deprecated Use createPatternEvaluatorOptimizer instead\n */\nexport const createEvaluatorOptimizer = createPatternEvaluatorOptimizer;\n\n/**\n * Pre-built evaluators for common quality dimensions\n *\n * ⚠️ WARNING: These are MOCK implementations returning hardcoded values.\n * They are intended for testing and demonstration purposes only.\n * Replace with actual LLM-based or rule-based evaluators for production use.\n */\nexport const evaluators = {\n /**\n * Factuality evaluator checks for factual accuracy\n * @remarks Mock implementation - always returns score 0.85\n */\n factuality: (threshold: number = 0.8) => {\n return async (output: string, context: EvalContext): Promise<PatternEvaluationResult> => {\n void output;\n void context;\n // In real implementation, this would call an LLM or fact-checking service\n return {\n score: 0.85,\n dimensions: [\n {\n name: 'factuality',\n score: 0.85,\n feedback: 'Most facts are accurate with minor uncertainties',\n },\n ],\n suggestions: ['Verify statistics and dates', 'Add citations for claims'],\n shouldRetry: 0.85 < threshold,\n assessment: 'Content is largely factually accurate',\n strengths: ['Well-sourced citations'],\n issues: ['One unverified statistic'],\n };\n };\n },\n\n /**\n * Relevance evaluator checks if content addresses the request\n * @remarks Mock implementation - always returns score 0.9\n */\n relevance: (threshold: number = 0.8) => {\n return async (output: string, context: EvalContext): Promise<PatternEvaluationResult> => {\n void output;\n void context;\n return {\n score: 0.9,\n dimensions: [\n {\n name: 'relevance',\n score: 0.9,\n feedback: 'Content directly addresses the request',\n },\n {\n name: 'completeness',\n score: 0.85,\n feedback: 'Covers main points but misses some details',\n },\n ],\n suggestions: ['Add more context about edge cases', 'Include real-world examples'],\n shouldRetry: 0.9 < threshold,\n assessment: 'Content is highly relevant to the request',\n strengths: ['Directly addresses user intent', 'Well-structured'],\n issues: [],\n };\n };\n },\n\n /**\n * Safety evaluator checks for harmful content\n * @remarks Mock implementation - always returns score 0.98\n */\n safety: (threshold: number = 0.95) => {\n return async (output: string, context: EvalContext): Promise<PatternEvaluationResult> => {\n void output;\n void context;\n return {\n score: 0.98,\n dimensions: [\n {\n name: 'safety',\n score: 0.98,\n feedback: 'Content contains no harmful or dangerous information',\n },\n {\n name: 'bias',\n score: 0.95,\n feedback: 'Minimal bias detected; generally balanced perspective',\n },\n ],\n suggestions: ['Review pronouns for inclusive language'],\n shouldRetry: 0.98 < threshold,\n assessment: 'Content is safe and appropriate',\n strengths: ['No harmful content', 'Balanced perspective'],\n issues: [],\n };\n };\n },\n\n /**\n * Quality evaluator provides comprehensive assessment\n * @remarks Mock implementation - always returns score 0.82\n */\n quality: (threshold: number = 0.8) => {\n return async (output: string, context: EvalContext): Promise<PatternEvaluationResult> => {\n void output;\n void context;\n return {\n score: 0.82,\n dimensions: [\n {\n name: 'clarity',\n score: 0.85,\n feedback: 'Clear writing with good structure',\n },\n {\n name: 'completeness',\n score: 0.8,\n feedback: 'Covers main topics but lacks depth in places',\n },\n {\n name: 'accuracy',\n score: 0.82,\n feedback: 'Factually sound with minor uncertainties',\n },\n {\n name: 'engagement',\n score: 0.8,\n feedback: 'Moderately engaging, could be more compelling',\n },\n ],\n suggestions: [\n 'Add more specific examples',\n 'Improve opening sentence for engagement',\n 'Expand technical sections',\n ],\n shouldRetry: 0.82 < threshold,\n assessment: 'Content is good quality with room for improvement',\n strengths: ['Well-organized', 'Clear explanations'],\n issues: ['Lacks specific examples', 'Some sections too brief'],\n };\n };\n },\n};\n\n/**\n * Helper function to run feedback loop with sensible defaults\n *\n * @param initialContent - Content to optimize\n * @param context - Evaluation context\n * @param options - Optional configuration overrides\n * @returns Optimized result\n *\n * @example\n * ```typescript\n * const result = await runFeedbackLoop(\n * \"Generated content\",\n * { request: \"Write an article about AI\" },\n * {\n * evaluator: evaluators.quality(0.85),\n * optimizer: async (content, evaluation) => {\n * // Improve content based on feedback\n * return improvedContent;\n * },\n * targetScore: 0.85,\n * maxIterations: 5\n * }\n * );\n * ```\n */\nexport async function runPatternFeedbackLoop(\n initialContent: string,\n context: EvalContext,\n options: EvaluatorOptimizerOptions,\n): Promise<PatternOptimizedResult> {\n const optimizer = createPatternEvaluatorOptimizer(options);\n return optimizer.run(initialContent, context);\n}\n\n/**\n * Utility function to normalize evaluation scores\n * Converts between different scoring scales (0-1, 1-10, etc.)\n */\nexport function normalizeScore(score: number, fromMax: number = 10, toMax: number = 1): number {\n return (score / fromMax) * toMax;\n}\n\n/**\n * Utility function to calculate aggregate score from dimensions\n * Normalizes weights so they sum to 1, handling mixed explicit/default weights.\n */\nexport function calculateAggregateScore(\n dimensions: PatternEvaluationResult['dimensions'],\n weights?: Record<string, number>,\n): number {\n if (dimensions.length === 0) return 0;\n\n // Calculate effective weights for each dimension\n const defaultWeight = 1 / dimensions.length;\n const effectiveWeights = dimensions.map(dim => weights?.[dim.name] ?? defaultWeight);\n const totalWeight = effectiveWeights.reduce((a, b) => a + b, 0);\n\n // Normalize and calculate weighted sum\n const sum = dimensions.reduce((acc, dim, idx) => {\n const weight = effectiveWeights[idx] ?? defaultWeight;\n const normalizedWeight = weight / totalWeight;\n return acc + dim.score * normalizedWeight;\n }, 0);\n\n return Math.min(sum, 1);\n}\n\n/**\n * @deprecated Use PatternEvaluationResult instead to avoid collision with EvaluationResult from evaluator-optimizer/schema.ts\n */\nexport type EvaluationResult = PatternEvaluationResult;\n\n/**\n * @deprecated Use PatternOptimizedResult instead to avoid collision with OptimizedResult from evaluator-optimizer/schema.ts\n */\nexport type OptimizedResult = PatternOptimizedResult;\n\n/**\n * @deprecated Use runPatternFeedbackLoop instead to avoid collision with runFeedbackLoop from evaluator-optimizer/index.ts\n */\nexport const runFeedbackLoop = runPatternFeedbackLoop;\n"],"mappings":"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"}
|