@bluefly/openstandardagents 0.4.0 → 0.4.2

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.
Files changed (517) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/DEMO.md +212 -0
  3. package/README.md +77 -17
  4. package/dist/adapters/drupal/generator.d.ts +149 -0
  5. package/dist/adapters/drupal/generator.d.ts.map +1 -0
  6. package/dist/adapters/drupal/generator.js +1760 -0
  7. package/dist/adapters/drupal/generator.js.map +1 -0
  8. package/dist/adapters/drupal/index.d.ts +2 -0
  9. package/dist/adapters/drupal/index.d.ts.map +1 -1
  10. package/dist/adapters/drupal/index.js +3 -0
  11. package/dist/adapters/drupal/index.js.map +1 -1
  12. package/dist/adapters/npm/adapter.js +2 -2
  13. package/dist/adapters/npm/converter.js +3 -3
  14. package/dist/cli/banner.d.ts +21 -0
  15. package/dist/cli/banner.d.ts.map +1 -0
  16. package/dist/cli/banner.js +128 -0
  17. package/dist/cli/banner.js.map +1 -0
  18. package/dist/cli/commands/dev.command.d.ts +20 -0
  19. package/dist/cli/commands/dev.command.d.ts.map +1 -0
  20. package/dist/cli/commands/dev.command.js +78 -0
  21. package/dist/cli/commands/dev.command.js.map +1 -0
  22. package/dist/cli/commands/estimate.command.d.ts +12 -0
  23. package/dist/cli/commands/estimate.command.d.ts.map +1 -0
  24. package/dist/cli/commands/estimate.command.js +226 -0
  25. package/dist/cli/commands/estimate.command.js.map +1 -0
  26. package/dist/cli/commands/export-enhanced.command.d.ts +7 -0
  27. package/dist/cli/commands/export-enhanced.command.d.ts.map +1 -0
  28. package/dist/cli/commands/{export-v2.command.js → export-enhanced.command.js} +3 -3
  29. package/dist/cli/commands/export-enhanced.command.js.map +1 -0
  30. package/dist/cli/commands/export.command.d.ts.map +1 -1
  31. package/dist/cli/commands/export.command.js +82 -4
  32. package/dist/cli/commands/export.command.js.map +1 -1
  33. package/dist/cli/commands/init.command.d.ts.map +1 -1
  34. package/dist/cli/commands/init.command.js +2 -0
  35. package/dist/cli/commands/init.command.js.map +1 -1
  36. package/dist/cli/commands/test.command.d.ts +1 -0
  37. package/dist/cli/commands/test.command.d.ts.map +1 -1
  38. package/dist/cli/commands/test.command.js +172 -105
  39. package/dist/cli/commands/test.command.js.map +1 -1
  40. package/dist/cli/commands/types/wizard-config.types.d.ts +59 -0
  41. package/dist/cli/commands/types/wizard-config.types.d.ts.map +1 -0
  42. package/dist/cli/commands/types/wizard-config.types.js +34 -0
  43. package/dist/cli/commands/types/wizard-config.types.js.map +1 -0
  44. package/dist/cli/commands/upgrade.command.d.ts +9 -0
  45. package/dist/cli/commands/upgrade.command.d.ts.map +1 -0
  46. package/dist/cli/commands/upgrade.command.js +167 -0
  47. package/dist/cli/commands/upgrade.command.js.map +1 -0
  48. package/dist/cli/commands/wizard-api-first.command.d.ts +18 -0
  49. package/dist/cli/commands/wizard-api-first.command.d.ts.map +1 -0
  50. package/dist/cli/commands/wizard-api-first.command.js +854 -0
  51. package/dist/cli/commands/wizard-api-first.command.js.map +1 -0
  52. package/dist/cli/commands/wizard-interactive.command.d.ts +25 -0
  53. package/dist/cli/commands/wizard-interactive.command.d.ts.map +1 -0
  54. package/dist/cli/commands/wizard-interactive.command.js +1875 -0
  55. package/dist/cli/commands/wizard-interactive.command.js.map +1 -0
  56. package/dist/cli/commands/workspace.command.js +1 -1
  57. package/dist/cli/commands/workspace.command.js.map +1 -1
  58. package/dist/cli/index.js +9 -0
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli/schema-driven/index.d.ts +27 -0
  61. package/dist/cli/schema-driven/index.d.ts.map +1 -0
  62. package/dist/cli/schema-driven/index.js +34 -0
  63. package/dist/cli/schema-driven/index.js.map +1 -0
  64. package/dist/cli/schema-driven/schema-loader.d.ts +115 -0
  65. package/dist/cli/schema-driven/schema-loader.d.ts.map +1 -0
  66. package/dist/cli/schema-driven/schema-loader.js +270 -0
  67. package/dist/cli/schema-driven/schema-loader.js.map +1 -0
  68. package/dist/cli/schema-driven/ui-generator.d.ts +88 -0
  69. package/dist/cli/schema-driven/ui-generator.d.ts.map +1 -0
  70. package/dist/cli/schema-driven/ui-generator.js +326 -0
  71. package/dist/cli/schema-driven/ui-generator.js.map +1 -0
  72. package/dist/cli/wizard/interactive-wizard.d.ts +26 -0
  73. package/dist/cli/wizard/interactive-wizard.d.ts.map +1 -0
  74. package/dist/cli/wizard/interactive-wizard.js +296 -0
  75. package/dist/cli/wizard/interactive-wizard.js.map +1 -0
  76. package/dist/cli/wizard/template-catalog.d.ts +32 -0
  77. package/dist/cli/wizard/template-catalog.d.ts.map +1 -0
  78. package/dist/cli/wizard/template-catalog.js +99 -0
  79. package/dist/cli/wizard/template-catalog.js.map +1 -0
  80. package/dist/cli/wizard/use-cases.d.ts +37 -0
  81. package/dist/cli/wizard/use-cases.d.ts.map +1 -0
  82. package/dist/cli/wizard/use-cases.js +157 -0
  83. package/dist/cli/wizard/use-cases.js.map +1 -0
  84. package/dist/di-container.d.ts.map +1 -1
  85. package/dist/di-container.js +2 -0
  86. package/dist/di-container.js.map +1 -1
  87. package/dist/package.json +33 -11
  88. package/dist/runtime/agent-runner.d.ts +46 -0
  89. package/dist/runtime/agent-runner.d.ts.map +1 -0
  90. package/dist/runtime/agent-runner.js +346 -0
  91. package/dist/runtime/agent-runner.js.map +1 -0
  92. package/dist/sdks/kagent/crd-generator.d.ts +4 -0
  93. package/dist/sdks/kagent/crd-generator.d.ts.map +1 -1
  94. package/dist/sdks/kagent/crd-generator.js +83 -2
  95. package/dist/sdks/kagent/crd-generator.js.map +1 -1
  96. package/dist/sdks/kagent/k8s-resources-generator.d.ts +73 -0
  97. package/dist/sdks/kagent/k8s-resources-generator.d.ts.map +1 -0
  98. package/dist/sdks/kagent/k8s-resources-generator.js +286 -0
  99. package/dist/sdks/kagent/k8s-resources-generator.js.map +1 -0
  100. package/dist/sdks/kagent/types.d.ts +79 -0
  101. package/dist/sdks/kagent/types.d.ts.map +1 -1
  102. package/dist/sdks/shared/validation.d.ts +2 -2
  103. package/dist/services/cost-estimation/optimization-patterns.d.ts +23 -0
  104. package/dist/services/cost-estimation/optimization-patterns.d.ts.map +1 -0
  105. package/dist/services/cost-estimation/optimization-patterns.js +147 -0
  106. package/dist/services/cost-estimation/optimization-patterns.js.map +1 -0
  107. package/dist/services/cost-estimation/pricing.d.ts +29 -0
  108. package/dist/services/cost-estimation/pricing.d.ts.map +1 -0
  109. package/dist/services/cost-estimation/pricing.js +225 -0
  110. package/dist/services/cost-estimation/pricing.js.map +1 -0
  111. package/dist/services/cost-estimation/scenario-estimator.d.ts +59 -0
  112. package/dist/services/cost-estimation/scenario-estimator.d.ts.map +1 -0
  113. package/dist/services/cost-estimation/scenario-estimator.js +145 -0
  114. package/dist/services/cost-estimation/scenario-estimator.js.map +1 -0
  115. package/dist/services/cost-estimation/token-counter.service.d.ts +51 -0
  116. package/dist/services/cost-estimation/token-counter.service.d.ts.map +1 -0
  117. package/dist/services/cost-estimation/token-counter.service.js +125 -0
  118. package/dist/services/cost-estimation/token-counter.service.js.map +1 -0
  119. package/dist/services/dev-server/dev-server.service.d.ts +121 -0
  120. package/dist/services/dev-server/dev-server.service.d.ts.map +1 -0
  121. package/dist/services/dev-server/dev-server.service.js +290 -0
  122. package/dist/services/dev-server/dev-server.service.js.map +1 -0
  123. package/dist/services/dev-server/file-watcher.d.ts +101 -0
  124. package/dist/services/dev-server/file-watcher.d.ts.map +1 -0
  125. package/dist/services/dev-server/file-watcher.js +190 -0
  126. package/dist/services/dev-server/file-watcher.js.map +1 -0
  127. package/dist/services/dev-server/live-validator.d.ts +157 -0
  128. package/dist/services/dev-server/live-validator.d.ts.map +1 -0
  129. package/dist/services/dev-server/live-validator.js +301 -0
  130. package/dist/services/dev-server/live-validator.js.map +1 -0
  131. package/dist/services/dev-server/websocket-server.d.ts +137 -0
  132. package/dist/services/dev-server/websocket-server.d.ts.map +1 -0
  133. package/dist/services/dev-server/websocket-server.js +229 -0
  134. package/dist/services/dev-server/websocket-server.js.map +1 -0
  135. package/dist/services/export/anthropic/anthropic-exporter.d.ts +70 -0
  136. package/dist/services/export/anthropic/anthropic-exporter.d.ts.map +1 -0
  137. package/dist/services/export/anthropic/anthropic-exporter.js +576 -0
  138. package/dist/services/export/anthropic/anthropic-exporter.js.map +1 -0
  139. package/dist/services/export/anthropic/api-generator.d.ts +39 -0
  140. package/dist/services/export/anthropic/api-generator.d.ts.map +1 -0
  141. package/dist/services/export/anthropic/api-generator.js +395 -0
  142. package/dist/services/export/anthropic/api-generator.js.map +1 -0
  143. package/dist/services/export/anthropic/index.d.ts +18 -0
  144. package/dist/services/export/anthropic/index.d.ts.map +1 -0
  145. package/dist/services/export/anthropic/index.js +16 -0
  146. package/dist/services/export/anthropic/index.js.map +1 -0
  147. package/dist/services/export/anthropic/tools-generator.d.ts +35 -0
  148. package/dist/services/export/anthropic/tools-generator.d.ts.map +1 -0
  149. package/dist/services/export/anthropic/tools-generator.js +260 -0
  150. package/dist/services/export/anthropic/tools-generator.js.map +1 -0
  151. package/dist/services/export/langchain/api-generator.d.ts +17 -0
  152. package/dist/services/export/langchain/api-generator.d.ts.map +1 -0
  153. package/dist/services/export/langchain/api-generator.js +375 -0
  154. package/dist/services/export/langchain/api-generator.js.map +1 -0
  155. package/dist/services/export/langchain/callbacks-generator.d.ts +63 -0
  156. package/dist/services/export/langchain/callbacks-generator.d.ts.map +1 -0
  157. package/dist/services/export/langchain/callbacks-generator.js +408 -0
  158. package/dist/services/export/langchain/callbacks-generator.js.map +1 -0
  159. package/dist/services/export/langchain/error-handling-generator.d.ts +76 -0
  160. package/dist/services/export/langchain/error-handling-generator.d.ts.map +1 -0
  161. package/dist/services/export/langchain/error-handling-generator.js +522 -0
  162. package/dist/services/export/langchain/error-handling-generator.js.map +1 -0
  163. package/dist/services/export/langchain/index.d.ts +17 -0
  164. package/dist/services/export/langchain/index.d.ts.map +1 -0
  165. package/dist/services/export/langchain/index.js +13 -0
  166. package/dist/services/export/langchain/index.js.map +1 -0
  167. package/dist/services/export/langchain/langchain-exporter.d.ts +174 -0
  168. package/dist/services/export/langchain/langchain-exporter.d.ts.map +1 -0
  169. package/dist/services/export/langchain/langchain-exporter.js +953 -0
  170. package/dist/services/export/langchain/langchain-exporter.js.map +1 -0
  171. package/dist/services/export/langchain/langgraph-generator.d.ts +86 -0
  172. package/dist/services/export/langchain/langgraph-generator.d.ts.map +1 -0
  173. package/dist/services/export/langchain/langgraph-generator.js +473 -0
  174. package/dist/services/export/langchain/langgraph-generator.js.map +1 -0
  175. package/dist/services/export/langchain/langserve-generator.d.ts +95 -0
  176. package/dist/services/export/langchain/langserve-generator.d.ts.map +1 -0
  177. package/dist/services/export/langchain/langserve-generator.js +807 -0
  178. package/dist/services/export/langchain/langserve-generator.js.map +1 -0
  179. package/dist/services/export/langchain/memory-generator.d.ts +71 -0
  180. package/dist/services/export/langchain/memory-generator.d.ts.map +1 -0
  181. package/dist/services/export/langchain/memory-generator.js +1182 -0
  182. package/dist/services/export/langchain/memory-generator.js.map +1 -0
  183. package/dist/services/export/langchain/openapi-generator.d.ts +20 -0
  184. package/dist/services/export/langchain/openapi-generator.d.ts.map +1 -0
  185. package/dist/services/export/langchain/openapi-generator.js +364 -0
  186. package/dist/services/export/langchain/openapi-generator.js.map +1 -0
  187. package/dist/services/export/langchain/plan-execute-generator.d.ts +60 -0
  188. package/dist/services/export/langchain/plan-execute-generator.d.ts.map +1 -0
  189. package/dist/services/export/langchain/plan-execute-generator.js +679 -0
  190. package/dist/services/export/langchain/plan-execute-generator.js.map +1 -0
  191. package/dist/services/export/langchain/streaming-generator.d.ts +66 -0
  192. package/dist/services/export/langchain/streaming-generator.d.ts.map +1 -0
  193. package/dist/services/export/langchain/streaming-generator.js +749 -0
  194. package/dist/services/export/langchain/streaming-generator.js.map +1 -0
  195. package/dist/services/export/langchain/tools-generator.d.ts +67 -0
  196. package/dist/services/export/langchain/tools-generator.d.ts.map +1 -0
  197. package/dist/services/export/langchain/tools-generator.js +543 -0
  198. package/dist/services/export/langchain/tools-generator.js.map +1 -0
  199. package/dist/services/export/npm/express-generator.d.ts +23 -0
  200. package/dist/services/export/npm/express-generator.d.ts.map +1 -0
  201. package/dist/services/export/npm/express-generator.js +296 -0
  202. package/dist/services/export/npm/express-generator.js.map +1 -0
  203. package/dist/services/export/npm/index.d.ts +13 -0
  204. package/dist/services/export/npm/index.d.ts.map +1 -0
  205. package/dist/services/export/npm/index.js +11 -0
  206. package/dist/services/export/npm/index.js.map +1 -0
  207. package/dist/services/export/npm/npm-exporter.d.ts +142 -0
  208. package/dist/services/export/npm/npm-exporter.d.ts.map +1 -0
  209. package/dist/services/export/npm/npm-exporter.js +480 -0
  210. package/dist/services/export/npm/npm-exporter.js.map +1 -0
  211. package/dist/services/export/npm/openapi-generator.d.ts +19 -0
  212. package/dist/services/export/npm/openapi-generator.d.ts.map +1 -0
  213. package/dist/services/export/npm/openapi-generator.js +428 -0
  214. package/dist/services/export/npm/openapi-generator.js.map +1 -0
  215. package/dist/services/export/npm/package-json-generator.d.ts +31 -0
  216. package/dist/services/export/npm/package-json-generator.d.ts.map +1 -0
  217. package/dist/services/export/npm/package-json-generator.js +153 -0
  218. package/dist/services/export/npm/package-json-generator.js.map +1 -0
  219. package/dist/services/export/npm/typescript-generator.d.ts +69 -0
  220. package/dist/services/export/npm/typescript-generator.d.ts.map +1 -0
  221. package/dist/services/export/npm/typescript-generator.js +437 -0
  222. package/dist/services/export/npm/typescript-generator.js.map +1 -0
  223. package/dist/services/export/testing/index.d.ts +8 -0
  224. package/dist/services/export/testing/index.d.ts.map +1 -0
  225. package/dist/services/export/testing/index.js +7 -0
  226. package/dist/services/export/testing/index.js.map +1 -0
  227. package/dist/services/export/testing/test-generator.d.ts +178 -0
  228. package/dist/services/export/testing/test-generator.d.ts.map +1 -0
  229. package/dist/services/export/testing/test-generator.js +2542 -0
  230. package/dist/services/export/testing/test-generator.js.map +1 -0
  231. package/dist/services/test-runner/mock-llm.service.d.ts +77 -0
  232. package/dist/services/test-runner/mock-llm.service.d.ts.map +1 -0
  233. package/dist/services/test-runner/mock-llm.service.js +173 -0
  234. package/dist/services/test-runner/mock-llm.service.js.map +1 -0
  235. package/dist/services/test-runner/scenarios.d.ts +36 -0
  236. package/dist/services/test-runner/scenarios.d.ts.map +1 -0
  237. package/dist/services/test-runner/scenarios.js +196 -0
  238. package/dist/services/test-runner/scenarios.js.map +1 -0
  239. package/dist/services/test-runner/test-runner.service.d.ts +19 -1
  240. package/dist/services/test-runner/test-runner.service.d.ts.map +1 -1
  241. package/dist/services/test-runner/test-runner.service.js +72 -6
  242. package/dist/services/test-runner/test-runner.service.js.map +1 -1
  243. package/dist/services/validation/best-practices-validator.d.ts +84 -0
  244. package/dist/services/validation/best-practices-validator.d.ts.map +1 -0
  245. package/dist/services/validation/best-practices-validator.js +499 -0
  246. package/dist/services/validation/best-practices-validator.js.map +1 -0
  247. package/dist/services/validation/cost-estimator.d.ts +69 -0
  248. package/dist/services/validation/cost-estimator.d.ts.map +1 -0
  249. package/dist/services/validation/cost-estimator.js +221 -0
  250. package/dist/services/validation/cost-estimator.js.map +1 -0
  251. package/dist/services/validation/enhanced-validator.d.ts +78 -0
  252. package/dist/services/validation/enhanced-validator.d.ts.map +1 -0
  253. package/dist/services/validation/enhanced-validator.js +212 -0
  254. package/dist/services/validation/enhanced-validator.js.map +1 -0
  255. package/dist/services/validation/index.d.ts +13 -0
  256. package/dist/services/validation/index.d.ts.map +1 -0
  257. package/dist/services/validation/index.js +9 -0
  258. package/dist/services/validation/index.js.map +1 -0
  259. package/dist/services/validation/security-validator.d.ts +81 -0
  260. package/dist/services/validation/security-validator.d.ts.map +1 -0
  261. package/dist/services/validation/security-validator.js +328 -0
  262. package/dist/services/validation/security-validator.js.map +1 -0
  263. package/dist/services/wizard/prompts.d.ts +71 -0
  264. package/dist/services/wizard/prompts.d.ts.map +1 -0
  265. package/dist/services/wizard/prompts.js +322 -0
  266. package/dist/services/wizard/prompts.js.map +1 -0
  267. package/dist/services/wizard/wizard.service.d.ts +60 -0
  268. package/dist/services/wizard/wizard.service.d.ts.map +1 -0
  269. package/dist/services/wizard/wizard.service.js +261 -0
  270. package/dist/services/wizard/wizard.service.js.map +1 -0
  271. package/dist/types/personality.zod.d.ts +23 -23
  272. package/dist/utils/version.d.ts +1 -1
  273. package/dist/utils/version.js +1 -1
  274. package/dist/version-management/core/version-manager.test.js.map +1 -1
  275. package/dist/version.d.ts +62 -0
  276. package/dist/version.d.ts.map +1 -0
  277. package/dist/version.js +73 -0
  278. package/dist/version.js.map +1 -0
  279. package/examples/a2a/agent-handoff.ossa.yaml +1 -1
  280. package/examples/a2a/service-discovery.ossa.yaml +1 -1
  281. package/examples/adapters/drupal-eca-mapping.yaml +1 -1
  282. package/examples/adapters/drupal-eca-task.yaml +1 -1
  283. package/examples/adapters/drupal-flowdrop-mapping.yaml +1 -1
  284. package/examples/adapters/drupal-maestro-mapping.yaml +1 -1
  285. package/examples/adapters/mistral-agent.yaml +1 -1
  286. package/examples/adapters/symfony-messenger-task.yaml +1 -1
  287. package/examples/adapters/symfony-messenger-workflow.yaml +1 -1
  288. package/examples/adk-integration/code-review-workflow.yml +1 -1
  289. package/examples/adk-integration/customer-support.yml +1 -1
  290. package/examples/adk-integration/data-pipeline.yml +1 -1
  291. package/examples/advanced/reasoning-agent.yaml +1 -1
  292. package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
  293. package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
  294. package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
  295. package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
  296. package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
  297. package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
  298. package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
  299. package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
  300. package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
  301. package/examples/agents/01-customer-support-bot/.env.example +32 -0
  302. package/examples/agents/01-customer-support-bot/Dockerfile +30 -0
  303. package/examples/agents/01-customer-support-bot/README.md +295 -0
  304. package/examples/agents/01-customer-support-bot/agent.ossa.yaml +172 -0
  305. package/examples/agents/01-customer-support-bot/docker-compose.yml +55 -0
  306. package/examples/agents/01-customer-support-bot/openapi.yaml +238 -0
  307. package/examples/agents/01-customer-support-bot/package.json +48 -0
  308. package/examples/agents/02-code-review-agent/README.md +72 -0
  309. package/examples/agents/02-code-review-agent/agent.ossa.yaml +239 -0
  310. package/examples/agents/02-code-review-agent/docker-compose.yml +22 -0
  311. package/examples/agents/02-code-review-agent/openapi.yaml +150 -0
  312. package/examples/agents/03-data-analysis-agent/README.md +51 -0
  313. package/examples/agents/03-data-analysis-agent/agent.ossa.yaml +97 -0
  314. package/examples/agents/03-data-analysis-agent/openapi.yaml +74 -0
  315. package/examples/agents/04-content-moderator/README.md +55 -0
  316. package/examples/agents/04-content-moderator/agent.ossa.yaml +131 -0
  317. package/examples/agents/04-content-moderator/openapi.yaml +50 -0
  318. package/examples/agents/05-sales-assistant/README.md +37 -0
  319. package/examples/agents/05-sales-assistant/agent.ossa.yaml +146 -0
  320. package/examples/agents/05-sales-assistant/openapi.yaml +59 -0
  321. package/examples/agents/06-devops-agent/README.md +39 -0
  322. package/examples/agents/06-devops-agent/agent.ossa.yaml +141 -0
  323. package/examples/agents/06-devops-agent/openapi.yaml +51 -0
  324. package/examples/agents/07-research-assistant/README.md +31 -0
  325. package/examples/agents/07-research-assistant/agent.ossa.yaml +119 -0
  326. package/examples/agents/07-research-assistant/openapi.yaml +56 -0
  327. package/examples/agents/08-email-triage-agent/README.md +33 -0
  328. package/examples/agents/08-email-triage-agent/agent.ossa.yaml +133 -0
  329. package/examples/agents/08-email-triage-agent/openapi.yaml +41 -0
  330. package/examples/agents/09-security-scanner/README.md +49 -0
  331. package/examples/agents/09-security-scanner/agent.ossa.yaml +174 -0
  332. package/examples/agents/09-security-scanner/openapi.yaml +46 -0
  333. package/examples/agents/10-meeting-assistant/README.md +53 -0
  334. package/examples/agents/10-meeting-assistant/agent.ossa.yaml +211 -0
  335. package/examples/agents/10-meeting-assistant/docker-compose.yml +27 -0
  336. package/examples/agents/10-meeting-assistant/openapi.yaml +131 -0
  337. package/examples/agents/COMPLETION_REPORT.txt +272 -0
  338. package/examples/agents/INDEX.md +296 -0
  339. package/examples/agents/README.md +452 -0
  340. package/examples/agents/SUMMARY.md +362 -0
  341. package/examples/agents/TEST_RESULTS.md +458 -0
  342. package/examples/agents/architecture-healer-enterprise.yaml +1 -1
  343. package/examples/agents/dependency-healer-npm.yaml +1 -1
  344. package/examples/agents/spec-healer-openapi.yaml +1 -1
  345. package/examples/agents/wiki-healer-production.yaml +1 -1
  346. package/examples/agents-md/code-agent.ossa.json +1 -1
  347. package/examples/agents-md/monorepo-agent.ossa.yaml +1 -1
  348. package/examples/anthropic/claude-assistant.ossa.json +1 -1
  349. package/examples/autogen/multi-agent.ossa.json +1 -1
  350. package/examples/autonomous-evolution/self-evolving-agent.ossa.yaml +1 -1
  351. package/examples/build-once-use-everywhere/agent.ossa.yaml +1 -1
  352. package/examples/claude-code/code-reviewer.ossa.yaml +1 -1
  353. package/examples/claude-code/ossa-validator.ossa.yaml +1 -1
  354. package/examples/common_npm/agent-router.ossa.yaml +2 -2
  355. package/examples/contracts/data-consumer.ossa.yaml +1 -1
  356. package/examples/contracts/data-producer-v2.ossa.yaml +1 -1
  357. package/examples/contracts/data-producer.ossa.yaml +1 -1
  358. package/examples/crewai/research-team.ossa.json +1 -1
  359. package/examples/cursor/code-review-agent.ossa.json +1 -1
  360. package/examples/drupal/QUICKSTART.md +439 -0
  361. package/examples/drupal/ai_agents_ossa-module/.agents/example-agent/agent.ossa.yaml +1 -1
  362. package/examples/drupal/content-moderator.ossa.yaml +107 -0
  363. package/examples/drupal/gitlab-ml-recommender.ossa.yaml +2 -2
  364. package/examples/economics/marketplace-agent.ossa.json +1 -1
  365. package/examples/export/langchain/production-agent-with-memory/README.md +373 -0
  366. package/examples/export/langchain/production-agent-with-memory/agent.ossa.yaml +97 -0
  367. package/examples/export/langchain/production-agent-with-streaming/README.md +617 -0
  368. package/examples/export/langchain/production-agent-with-streaming/agent.ossa.yaml +100 -0
  369. package/examples/export/langchain/production-agent-with-streaming/client-example.py +263 -0
  370. package/examples/export/langchain/production-agent-with-tools/README.md +296 -0
  371. package/examples/export/langchain/production-agent-with-tools/agent.ossa.yaml +216 -0
  372. package/examples/export/langchain-export-example.ts +246 -0
  373. package/examples/export/langserve-export-example.ts +246 -0
  374. package/examples/export/test-generation-example.ts +457 -0
  375. package/examples/extensions/agents-md-advanced.yml +1 -1
  376. package/examples/extensions/agents-md-basic.yml +1 -1
  377. package/examples/extensions/agents-md-sync.yml +1 -1
  378. package/examples/extensions/agents-md-v1.yml +1 -1
  379. package/examples/extensions/drupal-v1.yml +1 -1
  380. package/examples/extensions/encryption-multi-provider.yaml +4 -4
  381. package/examples/extensions/kagent-v1.yml +1 -1
  382. package/examples/extensions/knowledge-sources.yaml +1 -1
  383. package/examples/extensions/mcp-full-featured.yaml +1 -1
  384. package/examples/genetics/breeding-agent.ossa.json +1 -1
  385. package/examples/getting-started/01-minimal-agent.ossa.yaml +1 -1
  386. package/examples/getting-started/02-agent-with-tools.ossa.yaml +1 -1
  387. package/examples/getting-started/03-agent-with-safety.ossa.yaml +1 -1
  388. package/examples/getting-started/04-agent-with-messaging.ossa.yaml +1 -1
  389. package/examples/getting-started/05-workflow-composition.ossa.yaml +1 -1
  390. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  391. package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +1 -1
  392. package/examples/kagent/compliance-validator.ossa.yaml +1 -1
  393. package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
  394. package/examples/kagent/documentation-agent.ossa.yaml +1 -1
  395. package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +2 -2
  396. package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
  397. package/examples/kagent/security-scanner.ossa.yaml +1 -1
  398. package/examples/langchain/chain-agent.ossa.json +1 -1
  399. package/examples/langflow/workflow-agent.ossa.json +1 -1
  400. package/examples/langgraph/state-machine-agent.ossa.json +1 -1
  401. package/examples/lifecycle/mentoring-agent.ossa.json +1 -1
  402. package/examples/llamaindex/rag-agent.ossa.json +1 -1
  403. package/examples/mcp/database-mcp.ossa.yaml +1 -1
  404. package/examples/mcp/filesystem-mcp.ossa.yaml +1 -1
  405. package/examples/messaging/dependency-healer.ossa.yaml +1 -1
  406. package/examples/messaging/incident-responder.ossa.yaml +1 -1
  407. package/examples/messaging/routing-rules.ossa.yaml +1 -1
  408. package/examples/messaging/security-scanner.ossa.yaml +1 -1
  409. package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
  410. package/examples/migrations/langchain/01-python-react-agent-after.ossa.yaml +1 -1
  411. package/examples/migrations/langchain/02-typescript-conversational-after.ossa.yaml +1 -1
  412. package/examples/migrations/langchain/03-sequential-chain-after.ossa.yaml +1 -1
  413. package/examples/migrations/langchain/04-config-based-after.ossa.yaml +1 -1
  414. package/examples/migrations/swarm-to-ossa/after-handoffs.ossa.yaml +6 -6
  415. package/examples/migrations/swarm-to-ossa/after-triage-agent.ossa.yaml +3 -3
  416. package/examples/multi-agent/conditional-router.ossa.yaml +1 -1
  417. package/examples/multi-agent/parallel-execution.ossa.yaml +1 -1
  418. package/examples/multi-agent/sequential-pipeline.ossa.yaml +1 -1
  419. package/examples/multi-agent-research-workflow.ossa.yaml +133 -0
  420. package/examples/multi-platform/single-manifest/agent.ossa.yaml +1 -1
  421. package/examples/npm-export-example.ts +150 -0
  422. package/examples/observability/activity-stream-full.yaml +1 -1
  423. package/examples/openai/basic-agent.ossa.yaml +1 -1
  424. package/examples/openai/multi-tool-agent.ossa.json +1 -1
  425. package/examples/openai/swarm-agent.ossa.json +1 -1
  426. package/examples/ossa-templates/01-code-assistant.ossa.yaml +1 -1
  427. package/examples/ossa-templates/02-security-scanner.ossa.yaml +1 -1
  428. package/examples/ossa-templates/03-ci-pipeline.ossa.yaml +1 -1
  429. package/examples/ossa-templates/04-code-reviewer.ossa.yaml +1 -1
  430. package/examples/ossa-templates/05-doc-generator.ossa.yaml +1 -1
  431. package/examples/ossa-templates/06-compliance-validator.ossa.yaml +1 -1
  432. package/examples/ossa-templates/07-workflow-orchestrator.ossa.yaml +1 -1
  433. package/examples/ossa-templates/08-content-writer.ossa.yaml +1 -1
  434. package/examples/ossa-templates/09-test-generator.ossa.yaml +1 -1
  435. package/examples/ossa-templates/10-data-transformer.ossa.yaml +1 -1
  436. package/examples/ossa-templates/11-react-performance-expert.ossa.yaml +1 -1
  437. package/examples/ossa-templates/12-typescript-type-safety-expert.ossa.yaml +1 -1
  438. package/examples/ossa-templates/13-accessibility-champion.ossa.yaml +1 -1
  439. package/examples/ossa-templates/14-security-hardening-agent.ossa.yaml +1 -1
  440. package/examples/production/document-analyzer-openai.yml +1 -1
  441. package/examples/production-ready/01-customer-support-bot/.env.example +32 -0
  442. package/examples/production-ready/01-customer-support-bot/Dockerfile +30 -0
  443. package/examples/production-ready/01-customer-support-bot/README.md +295 -0
  444. package/examples/production-ready/01-customer-support-bot/agent.ossa.yaml +172 -0
  445. package/examples/production-ready/01-customer-support-bot/docker-compose.yml +55 -0
  446. package/examples/production-ready/01-customer-support-bot/openapi.yaml +238 -0
  447. package/examples/production-ready/01-customer-support-bot/package.json +48 -0
  448. package/examples/production-ready/02-code-review-agent/README.md +72 -0
  449. package/examples/production-ready/02-code-review-agent/agent.ossa.yaml +239 -0
  450. package/examples/production-ready/02-code-review-agent/docker-compose.yml +22 -0
  451. package/examples/production-ready/02-code-review-agent/openapi.yaml +150 -0
  452. package/examples/production-ready/03-data-analysis-agent/README.md +51 -0
  453. package/examples/production-ready/03-data-analysis-agent/agent.ossa.yaml +97 -0
  454. package/examples/production-ready/03-data-analysis-agent/openapi.yaml +74 -0
  455. package/examples/production-ready/04-content-moderator/README.md +55 -0
  456. package/examples/production-ready/04-content-moderator/agent.ossa.yaml +131 -0
  457. package/examples/production-ready/04-content-moderator/openapi.yaml +50 -0
  458. package/examples/production-ready/05-sales-assistant/README.md +37 -0
  459. package/examples/production-ready/05-sales-assistant/agent.ossa.yaml +146 -0
  460. package/examples/production-ready/05-sales-assistant/openapi.yaml +59 -0
  461. package/examples/production-ready/06-devops-agent/README.md +39 -0
  462. package/examples/production-ready/06-devops-agent/agent.ossa.yaml +141 -0
  463. package/examples/production-ready/06-devops-agent/openapi.yaml +51 -0
  464. package/examples/production-ready/07-research-assistant/README.md +31 -0
  465. package/examples/production-ready/07-research-assistant/agent.ossa.yaml +119 -0
  466. package/examples/production-ready/07-research-assistant/openapi.yaml +56 -0
  467. package/examples/production-ready/08-email-triage-agent/README.md +33 -0
  468. package/examples/production-ready/08-email-triage-agent/agent.ossa.yaml +133 -0
  469. package/examples/production-ready/08-email-triage-agent/openapi.yaml +41 -0
  470. package/examples/production-ready/09-security-scanner/README.md +49 -0
  471. package/examples/production-ready/09-security-scanner/agent.ossa.yaml +174 -0
  472. package/examples/production-ready/09-security-scanner/openapi.yaml +46 -0
  473. package/examples/production-ready/10-meeting-assistant/README.md +53 -0
  474. package/examples/production-ready/10-meeting-assistant/agent.ossa.yaml +211 -0
  475. package/examples/production-ready/10-meeting-assistant/docker-compose.yml +27 -0
  476. package/examples/production-ready/10-meeting-assistant/openapi.yaml +131 -0
  477. package/examples/production-ready/COMPLETION_REPORT.txt +272 -0
  478. package/examples/production-ready/INDEX.md +296 -0
  479. package/examples/production-ready/README.md +452 -0
  480. package/examples/production-ready/SUMMARY.md +362 -0
  481. package/examples/production-ready/TEST_RESULTS.md +458 -0
  482. package/examples/quickstart/support-agent.ossa.yaml +1 -1
  483. package/examples/real-world/gitlab-cicd-optimizer.ossa.yaml +1 -1
  484. package/examples/real-world/rag-documentation-assistant.ossa.yaml +1 -1
  485. package/examples/registry/agents/code-reviewer/agent.yaml +1 -1
  486. package/examples/registry/agents/security-scanner/agent.yaml +1 -1
  487. package/examples/runtime-adapters/bedrock-claude-example.ossa.yaml +1 -1
  488. package/examples/schema/reusable-components.yaml +1 -1
  489. package/examples/showcase/ci-pipeline.ossa.yaml +1 -1
  490. package/examples/showcase/code-assistant.ossa.yaml +1 -1
  491. package/examples/showcase/code-reviewer.ossa.yaml +1 -1
  492. package/examples/showcase/compliance-validator.ossa.yaml +1 -1
  493. package/examples/showcase/content-writer.ossa.yaml +1 -1
  494. package/examples/showcase/data-transformer.ossa.yaml +1 -1
  495. package/examples/showcase/doc-generator.ossa.yaml +1 -1
  496. package/examples/showcase/security-scanner.ossa.yaml +1 -1
  497. package/examples/showcase/test-generator.ossa.yaml +1 -1
  498. package/examples/showcase/workflow-orchestrator.ossa.yaml +1 -1
  499. package/examples/skills-example.ossa.yaml +140 -0
  500. package/examples/swarm/pso-optimizer.ossa.json +1 -1
  501. package/examples/tasks/batch-email-sender.yaml +1 -1
  502. package/examples/tasks/data-transform.yaml +1 -1
  503. package/examples/tasks/publish-content.yaml +1 -1
  504. package/examples/templates/ossa-compliance.yaml +1 -1
  505. package/examples/unified/security-scanner.ossa.yaml +1 -1
  506. package/examples/v0.3.6-features/genetics-breeding-advanced.ossa.yaml +1 -1
  507. package/examples/v0.3.6-features/genetics-breeding-simple.ossa.yaml +1 -1
  508. package/examples/v0.3.6-features/genetics-fitness-scoring.ossa.yaml +1 -1
  509. package/examples/vercel/edge-agent.ossa.json +1 -1
  510. package/examples/workflows/batch-email-campaign.yaml +1 -1
  511. package/examples/workflows/content-review-publish.yaml +1 -1
  512. package/examples/workflows/simple-etl.yaml +1 -1
  513. package/openapi/cli/openapi.yaml +221 -5
  514. package/package.json +31 -9
  515. package/dist/cli/commands/export-v2.command.d.ts +0 -7
  516. package/dist/cli/commands/export-v2.command.d.ts.map +0 -1
  517. package/dist/cli/commands/export-v2.command.js.map +0 -1
@@ -0,0 +1,617 @@
1
+ # Production Agent with Streaming Support
2
+
3
+ This example demonstrates a production-quality LangChain agent with comprehensive streaming support.
4
+
5
+ ## Features
6
+
7
+ - **Server-Sent Events (SSE)**: Real-time one-way streaming from server to client
8
+ - **WebSocket**: Bidirectional communication for interactive streaming with cancellation support
9
+ - **Agent-to-Agent (a2a)**: Integration with Agent Mesh for multi-agent streaming
10
+ - **Token-by-Token**: Real LangChain streaming callbacks for progressive responses
11
+ - **Tool Streaming**: Real-time updates during tool execution
12
+ - **Cost Tracking**: Real-time per-token cost tracking integrated with streaming callbacks
13
+ - **Backpressure Handling**: Prevents memory issues with queue size limits and timeouts
14
+ - **Stream Cancellation**: Cancel long-running agent executions via WebSocket
15
+
16
+ ## Quick Start
17
+
18
+ ### 1. Export the Agent
19
+
20
+ ```bash
21
+ # Export to LangChain with streaming enabled
22
+ ossa export agent.ossa.yaml --target langchain --output ./agent
23
+ ```
24
+
25
+ The exporter will automatically generate `streaming.py` with all streaming implementations.
26
+
27
+ ### 2. Install Dependencies
28
+
29
+ ```bash
30
+ cd agent
31
+ pip install -r requirements.txt
32
+ ```
33
+
34
+ Dependencies include:
35
+ - `fastapi` - Web framework
36
+ - `uvicorn` - ASGI server
37
+ - `sse-starlette` - Server-Sent Events support
38
+ - `websockets` - WebSocket support
39
+ - `langchain` - Agent framework
40
+
41
+ ### 3. Configure Environment
42
+
43
+ ```bash
44
+ cp .env.example .env
45
+ # Edit .env with your API keys and configuration
46
+ ```
47
+
48
+ Required environment variables:
49
+ ```env
50
+ OPENAI_API_KEY=sk-...
51
+ REDIS_HOST=localhost
52
+ REDIS_PORT=6379
53
+ AGENT_MESH_URL=http://localhost:8080 # Optional: for a2a streaming
54
+ ```
55
+
56
+ ### 4. Start the Server
57
+
58
+ ```bash
59
+ uvicorn server:app --host 0.0.0.0 --port 8000 --reload
60
+ ```
61
+
62
+ ## Usage Examples
63
+
64
+ ### Server-Sent Events (SSE)
65
+
66
+ SSE is perfect for one-way streaming from server to client (like chat completions).
67
+
68
+ **JavaScript Client:**
69
+
70
+ ```javascript
71
+ const eventSource = new EventSource(
72
+ 'http://localhost:8000/chat/stream?message=Hello&session_id=user123'
73
+ );
74
+
75
+ eventSource.onmessage = (event) => {
76
+ const data = JSON.parse(event.data);
77
+
78
+ switch (data.type) {
79
+ case 'connected':
80
+ console.log(`Connected: ${data.session_id}`);
81
+ break;
82
+
83
+ case 'llm_start':
84
+ console.log(`LLM generation started: ${data.model}`);
85
+ break;
86
+
87
+ case 'token':
88
+ // Append token to UI in real-time with cost tracking
89
+ process.stdout.write(data.token);
90
+ console.log(`\nTokens: ${data.token_count}, Cost: $${data.cost.toFixed(6)}`);
91
+ break;
92
+
93
+ case 'tool_start':
94
+ console.log(`\nTool started: ${data.tool}`);
95
+ break;
96
+
97
+ case 'tool_end':
98
+ console.log(`Tool completed: ${data.output}`);
99
+ break;
100
+
101
+ case 'llm_end':
102
+ console.log(`\n\nLLM Complete: ${data.full_response}`);
103
+ console.log(`Total tokens: ${data.tokens}`);
104
+ if (data.cost_summary) {
105
+ console.log(`Cost: $${data.cost_summary.total_cost.toFixed(6)}`);
106
+ }
107
+ break;
108
+
109
+ case 'done':
110
+ console.log(`\n\nComplete: ${data.result}`);
111
+ if (data.cost_summary) {
112
+ console.log(`Final Cost: $${data.cost_summary.total_cost.toFixed(6)}`);
113
+ console.log(`Tokens: ${data.cost_summary.total_tokens}`);
114
+ }
115
+ eventSource.close();
116
+ break;
117
+
118
+ case 'error':
119
+ console.error('Error:', data.error);
120
+ eventSource.close();
121
+ break;
122
+ }
123
+ };
124
+
125
+ eventSource.onerror = (error) => {
126
+ console.error('SSE Error:', error);
127
+ eventSource.close();
128
+ };
129
+ ```
130
+
131
+ **Python Client:**
132
+
133
+ ```python
134
+ import httpx
135
+ import json
136
+
137
+ async def stream_chat_sse(message: str):
138
+ async with httpx.AsyncClient() as client:
139
+ async with client.stream(
140
+ 'GET',
141
+ 'http://localhost:8000/chat/stream',
142
+ params={'message': message, 'session_id': 'user123'}
143
+ ) as response:
144
+ async for line in response.aiter_lines():
145
+ if line.startswith('data: '):
146
+ data = json.loads(line[6:])
147
+
148
+ if data['type'] == 'token':
149
+ print(data['token'], end='', flush=True)
150
+ elif data['type'] == 'done':
151
+ print(f"\n\nComplete: {data['result']}")
152
+ break
153
+ ```
154
+
155
+ ### WebSocket Streaming
156
+
157
+ WebSocket enables bidirectional communication for interactive conversations.
158
+
159
+ **JavaScript Client:**
160
+
161
+ ```javascript
162
+ const ws = new WebSocket('ws://localhost:8000/ws?session_id=user123');
163
+
164
+ ws.onopen = () => {
165
+ console.log('WebSocket connected');
166
+
167
+ // Send message
168
+ ws.send(JSON.stringify({
169
+ type: 'message',
170
+ message: 'Hello, how can you help me?'
171
+ }));
172
+ };
173
+
174
+ ws.onmessage = (event) => {
175
+ const data = JSON.parse(event.data);
176
+
177
+ switch (data.type) {
178
+ case 'connected':
179
+ console.log(`Session established: ${data.session_id}`);
180
+ break;
181
+
182
+ case 'token':
183
+ // Real-time token with cost tracking
184
+ process.stdout.write(data.token);
185
+ if (data.cost && data.token_count % 10 === 0) {
186
+ console.log(`\n[${data.token_count} tokens, $${data.cost.toFixed(6)}]`);
187
+ }
188
+ break;
189
+
190
+ case 'tool_start':
191
+ console.log(`\nExecuting tool: ${data.tool}`);
192
+ break;
193
+
194
+ case 'done':
195
+ console.log(`\n\nComplete: ${data.result}`);
196
+ if (data.cost_summary) {
197
+ console.log(`\nCost Summary:`);
198
+ console.log(` Total Tokens: ${data.cost_summary.total_tokens}`);
199
+ console.log(` Total Cost: $${data.cost_summary.total_cost.toFixed(6)}`);
200
+ }
201
+ break;
202
+
203
+ case 'cancelled':
204
+ console.log('Stream cancelled by request');
205
+ break;
206
+
207
+ case 'error':
208
+ console.error('Error:', data.error);
209
+ break;
210
+ }
211
+ };
212
+
213
+ // Cancel stream button
214
+ document.getElementById('cancelButton').onclick = () => {
215
+ ws.send(JSON.stringify({ type: 'cancel' }));
216
+ };
217
+
218
+ ws.onerror = (error) => {
219
+ console.error('WebSocket error:', error);
220
+ };
221
+
222
+ ws.onclose = () => {
223
+ console.log('WebSocket disconnected');
224
+ };
225
+ ```
226
+
227
+ **Python Client:**
228
+
229
+ ```python
230
+ import asyncio
231
+ import websockets
232
+ import json
233
+
234
+ async def chat_websocket():
235
+ uri = "ws://localhost:8000/ws?session_id=user123"
236
+
237
+ async with websockets.connect(uri) as websocket:
238
+ # Send message
239
+ await websocket.send(json.dumps({
240
+ "message": "Hello, how can you help me?"
241
+ }))
242
+
243
+ # Receive streaming response
244
+ while True:
245
+ response = await websocket.recv()
246
+ data = json.loads(response)
247
+
248
+ if data['type'] == 'token':
249
+ print(data['token'], end='', flush=True)
250
+ elif data['type'] == 'done':
251
+ print(f"\n\nComplete: {data['result']}")
252
+ break
253
+ elif data['type'] == 'error':
254
+ print(f"Error: {data['error']}")
255
+ break
256
+
257
+ asyncio.run(chat_websocket())
258
+ ```
259
+
260
+ ### Agent-to-Agent (a2a) Streaming
261
+
262
+ The a2a implementation automatically streams responses to the Agent Mesh for multi-agent coordination.
263
+
264
+ **Python Usage:**
265
+
266
+ ```python
267
+ from streaming import stream_a2a
268
+ from agent import create_agent
269
+
270
+ async def main():
271
+ agent = create_agent()
272
+
273
+ result = await stream_a2a(
274
+ agent_id="production-streaming-agent",
275
+ message="Analyze this data",
276
+ agent=agent,
277
+ mesh_url="http://localhost:8080",
278
+ target_agent="data-analyzer" # Optional: route to specific agent
279
+ )
280
+
281
+ print(f"Streamed to mesh: {result['success']}")
282
+ ```
283
+
284
+ The a2a client will:
285
+ 1. Collect all streaming events (tokens, tool calls)
286
+ 2. Accumulate the full response
287
+ 3. Post to Agent Mesh with complete metadata
288
+ 4. Include streaming events for replay/analysis
289
+
290
+ ## Event Types
291
+
292
+ All streaming implementations emit these event types:
293
+
294
+ | Event Type | Description | Fields |
295
+ |------------|-------------|--------|
296
+ | `connected` | Connection established | `session_id`, `message` |
297
+ | `llm_start` | LLM generation started | `prompts`, `model` |
298
+ | `token` | New token generated | `token`, `token_count`, `cost` |
299
+ | `llm_end` | LLM generation completed | `full_response`, `tokens`, `cost_summary` |
300
+ | `tool_start` | Tool execution started | `tool`, `input` |
301
+ | `tool_end` | Tool execution completed | `output` |
302
+ | `tool_error` | Tool execution failed | `error`, `error_type` |
303
+ | `error` | LLM error occurred | `error`, `error_type` |
304
+ | `cancelled` | Stream cancelled by user | - |
305
+ | `done` | Complete response ready | `result`, `cost_summary` |
306
+
307
+ ### Cost Summary Object
308
+
309
+ ```json
310
+ {
311
+ "total_tokens": 150,
312
+ "prompt_tokens": 50,
313
+ "completion_tokens": 100,
314
+ "total_cost": 0.000450,
315
+ "model": "gpt-4"
316
+ }
317
+ ```
318
+
319
+ ## Customization
320
+
321
+ ### Disable Specific Streaming Methods
322
+
323
+ ```yaml
324
+ # In agent.ossa.yaml
325
+ spec:
326
+ streaming:
327
+ sse:
328
+ enabled: false # Disable SSE
329
+ websocket:
330
+ enabled: true # Keep WebSocket
331
+ a2a:
332
+ enabled: false # Disable a2a
333
+ ```
334
+
335
+ ### Custom Endpoints
336
+
337
+ ```yaml
338
+ spec:
339
+ streaming:
340
+ sse:
341
+ enabled: true
342
+ endpoint: /api/stream # Custom SSE endpoint
343
+
344
+ websocket:
345
+ enabled: true
346
+ endpoint: /chat # Custom WebSocket endpoint
347
+ port: 9000 # Custom port
348
+ ```
349
+
350
+ ### Selective Callbacks
351
+
352
+ ```yaml
353
+ spec:
354
+ streaming:
355
+ callbacks:
356
+ on_llm_start: true
357
+ on_llm_new_token: true # Token-by-token streaming
358
+ on_llm_end: true
359
+ on_tool_start: false # Disable tool start events
360
+ on_tool_end: false # Disable tool end events
361
+ ```
362
+
363
+ ## Advanced Features
364
+
365
+ ### Real-Time Cost Tracking
366
+
367
+ Every streaming event includes cost information:
368
+
369
+ ```python
370
+ # In streaming.py
371
+ class StreamingCallbackHandler(BaseCallbackHandler):
372
+ def on_llm_new_token(self, token: str, **kwargs):
373
+ # Track cost per token
374
+ current_cost = self.cost_tracker.total_cost if self.cost_tracker else 0.0
375
+
376
+ await self.queue.put({
377
+ "type": "token",
378
+ "token": token,
379
+ "token_count": self.token_count,
380
+ "cost": current_cost # Real-time cost
381
+ })
382
+ ```
383
+
384
+ **Client-Side Cost Display:**
385
+
386
+ ```javascript
387
+ let totalCost = 0;
388
+
389
+ eventSource.onmessage = (event) => {
390
+ const data = JSON.parse(event.data);
391
+
392
+ if (data.type === 'token') {
393
+ totalCost = data.cost;
394
+ document.getElementById('cost').textContent = `$${totalCost.toFixed(6)}`;
395
+ }
396
+ };
397
+ ```
398
+
399
+ ### Stream Cancellation (WebSocket Only)
400
+
401
+ Cancel long-running agent executions:
402
+
403
+ ```javascript
404
+ // Client sends cancel request
405
+ ws.send(JSON.stringify({ type: 'cancel' }));
406
+
407
+ // Server cancels agent task and responds
408
+ ws.onmessage = (event) => {
409
+ const data = JSON.parse(event.data);
410
+
411
+ if (data.type === 'cancelled') {
412
+ console.log('Stream cancelled successfully');
413
+ }
414
+ };
415
+ ```
416
+
417
+ **Python Implementation:**
418
+
419
+ ```python
420
+ # In streaming.py - ConnectionManager
421
+ async def stream_websocket(websocket, agent, session_id):
422
+ current_task = None
423
+
424
+ while True:
425
+ data = await websocket.receive_json()
426
+
427
+ # Handle cancellation
428
+ if data.get("type") == "cancel":
429
+ if current_task and not current_task.done():
430
+ current_task.cancel()
431
+ await websocket.send_json({
432
+ "type": "cancelled",
433
+ "message": "Stream cancelled by user"
434
+ })
435
+ ```
436
+
437
+ ### Backpressure Handling
438
+
439
+ Prevents memory issues with queue size limits:
440
+
441
+ ```python
442
+ # In streaming.py
443
+ class ConnectionManager:
444
+ def __init__(self):
445
+ self.max_queue_size = 1000 # Prevent memory issues
446
+
447
+ async def connect(self, websocket, session_id):
448
+ self.session_queues[session_id] = asyncio.Queue(
449
+ maxsize=self.max_queue_size
450
+ )
451
+
452
+ async def send_message(self, session_id, message):
453
+ # Add timeout to prevent blocking
454
+ await asyncio.wait_for(
455
+ self.active_connections[session_id].send_json(message),
456
+ timeout=5.0
457
+ )
458
+ ```
459
+
460
+ ### Connection Timeout & Heartbeat
461
+
462
+ SSE streams include heartbeat to keep connections alive:
463
+
464
+ ```python
465
+ # In streaming.py
466
+ async def stream_sse(...):
467
+ while True:
468
+ try:
469
+ # Wait with timeout for heartbeat
470
+ event = await asyncio.wait_for(queue.get(), timeout=30.0)
471
+ yield f"data: {json.dumps(event)}\n\n"
472
+
473
+ except asyncio.TimeoutError:
474
+ # Send heartbeat
475
+ yield ": heartbeat\n\n"
476
+ continue
477
+ ```
478
+
479
+ ## Architecture
480
+
481
+ ### LangChain Streaming Callbacks with Cost Integration
482
+
483
+ The `StreamingCallbackHandler` class hooks into LangChain's callback system with cost tracking:
484
+
485
+ ```python
486
+ class StreamingCallbackHandler(BaseCallbackHandler):
487
+ def __init__(self, queue: asyncio.Queue, cost_tracker: Optional[Any] = None):
488
+ self.queue = queue
489
+ self.cost_tracker = cost_tracker
490
+ self.token_count = 0
491
+
492
+ def on_llm_new_token(self, token: str, **kwargs):
493
+ # Called for EACH token generated
494
+ self.token_count += 1
495
+
496
+ # Get current cost
497
+ current_cost = self.cost_tracker.total_cost if self.cost_tracker else 0.0
498
+
499
+ asyncio.create_task(self.queue.put({
500
+ "type": "token",
501
+ "token": token,
502
+ "token_count": self.token_count,
503
+ "cost": current_cost, # Real-time cost tracking
504
+ }))
505
+
506
+ def on_llm_end(self, response: LLMResult, **kwargs):
507
+ # Calculate final cost from token usage
508
+ if self.cost_tracker and response.llm_output:
509
+ token_usage = response.llm_output.get("token_usage", {})
510
+ # Update tracker with actual usage
511
+ self.cost_tracker.prompt_tokens += token_usage.get("prompt_tokens", 0)
512
+ self.cost_tracker.completion_tokens += token_usage.get("completion_tokens", 0)
513
+ # Calculate cost based on model pricing
514
+ ```
515
+
516
+ This provides **real token-by-token streaming with per-token cost tracking** (not word-splitting simulation).
517
+
518
+ ### Connection Management
519
+
520
+ WebSocket connections are managed by `ConnectionManager`:
521
+
522
+ ```python
523
+ manager = ConnectionManager()
524
+
525
+ # Multiple concurrent sessions
526
+ await manager.connect(websocket, "user123")
527
+ await manager.connect(websocket2, "user456")
528
+
529
+ # Broadcast or send to specific session
530
+ await manager.send_message("user123", event)
531
+ await manager.broadcast(event)
532
+ ```
533
+
534
+ ### Error Handling
535
+
536
+ All streaming implementations include:
537
+ - Try/catch blocks around agent execution
538
+ - Automatic cleanup on errors
539
+ - Error events sent to clients
540
+ - Graceful disconnection handling
541
+
542
+ ## Performance
543
+
544
+ ### SSE
545
+ - **Latency**: ~10-50ms per token
546
+ - **Connections**: 100+ concurrent
547
+ - **Best for**: One-way streaming, mobile clients
548
+
549
+ ### WebSocket
550
+ - **Latency**: ~5-20ms per token
551
+ - **Connections**: 1000+ concurrent
552
+ - **Best for**: Interactive chat, bidirectional
553
+
554
+ ### a2a
555
+ - **Latency**: Depends on mesh
556
+ - **Connections**: Agent-to-agent only
557
+ - **Best for**: Multi-agent orchestration
558
+
559
+ ## Troubleshooting
560
+
561
+ ### SSE Connection Drops
562
+
563
+ If SSE connections drop frequently:
564
+
565
+ ```python
566
+ # Add keep-alive pings
567
+ yield ":\n\n" # Comment-only SSE event (keep-alive)
568
+ ```
569
+
570
+ ### WebSocket Reconnection
571
+
572
+ ```javascript
573
+ let reconnectAttempts = 0;
574
+ const maxReconnect = 5;
575
+
576
+ function connectWebSocket() {
577
+ const ws = new WebSocket('ws://localhost:8000/ws?session_id=user123');
578
+
579
+ ws.onclose = () => {
580
+ if (reconnectAttempts < maxReconnect) {
581
+ reconnectAttempts++;
582
+ setTimeout(connectWebSocket, 1000 * reconnectAttempts);
583
+ }
584
+ };
585
+ }
586
+ ```
587
+
588
+ ### Memory Leaks
589
+
590
+ Ensure proper cleanup:
591
+
592
+ ```python
593
+ # Always close connections
594
+ try:
595
+ await stream_websocket(websocket, agent, session_id)
596
+ finally:
597
+ manager.disconnect(session_id)
598
+ ```
599
+
600
+ ## Production Considerations
601
+
602
+ 1. **Rate Limiting**: Use `api.rate_limit` in manifest
603
+ 2. **CORS**: Configure `api.cors.origins` for web clients
604
+ 3. **Authentication**: Add auth middleware in `server.py`
605
+ 4. **Monitoring**: Log all streaming events for debugging
606
+ 5. **Scaling**: Use Redis for session state across instances
607
+
608
+ ## Next Steps
609
+
610
+ - [LangChain Streaming Docs](https://python.langchain.com/docs/modules/callbacks/)
611
+ - [FastAPI WebSocket Guide](https://fastapi.tiangolo.com/advanced/websockets/)
612
+ - [SSE Specification](https://html.spec.whatwg.org/multipage/server-sent-events.html)
613
+ - [Agent Mesh Documentation](https://github.com/blueflyio/agent-mesh)
614
+
615
+ ## License
616
+
617
+ MIT - See LICENSE file for details
@@ -0,0 +1,100 @@
1
+ ossaVersion: 0.4.1
2
+ kind: Agent
3
+ metadata:
4
+ name: production-streaming-agent
5
+ version: 1.0.0
6
+ description: Production-quality agent with full streaming support (SSE, WebSocket, a2a)
7
+ author: OSSA Team
8
+ license: MIT
9
+ tags:
10
+ - streaming
11
+ - production
12
+ - sse
13
+ - websocket
14
+ - a2a
15
+
16
+ spec:
17
+ role: |
18
+ You are a production streaming agent that demonstrates real-time response streaming.
19
+
20
+ Capabilities:
21
+ - Server-Sent Events (SSE) for one-way streaming
22
+ - WebSocket bidirectional communication
23
+ - Agent-to-agent (a2a) streaming integration
24
+ - Token-by-token streaming responses
25
+ - Real-time tool execution updates
26
+
27
+ llm:
28
+ provider: openai
29
+ model: gpt-4-turbo-preview
30
+ temperature: 0.7
31
+ max_tokens: 2000
32
+
33
+ tools:
34
+ - name: search_web
35
+ type: function
36
+ description: Search the web for information
37
+ input_schema:
38
+ type: object
39
+ properties:
40
+ query:
41
+ type: string
42
+ description: Search query
43
+ required:
44
+ - query
45
+
46
+ - name: analyze_data
47
+ type: function
48
+ description: Analyze data and return insights
49
+ input_schema:
50
+ type: object
51
+ properties:
52
+ data:
53
+ type: string
54
+ description: Data to analyze
55
+ required:
56
+ - data
57
+
58
+ memory:
59
+ type: redis
60
+ config:
61
+ host: ${REDIS_HOST:localhost}
62
+ port: ${REDIS_PORT:6379}
63
+ db: 0
64
+ session_ttl: 3600
65
+
66
+ streaming:
67
+ # Server-Sent Events (SSE) Configuration
68
+ sse:
69
+ enabled: true
70
+ endpoint: /chat/stream
71
+
72
+ # WebSocket Configuration
73
+ websocket:
74
+ enabled: true
75
+ endpoint: /ws
76
+ port: 8000
77
+
78
+ # Agent-to-Agent (a2a) Streaming
79
+ a2a:
80
+ enabled: true
81
+ mesh_url: ${AGENT_MESH_URL:http://localhost:8080}
82
+
83
+ # LangChain Callbacks
84
+ callbacks:
85
+ on_llm_start: true
86
+ on_llm_new_token: true
87
+ on_llm_end: true
88
+ on_tool_start: true
89
+ on_tool_end: true
90
+
91
+ api:
92
+ port: 8000
93
+ cors:
94
+ enabled: true
95
+ origins:
96
+ - http://localhost:3000
97
+ - http://localhost:8080
98
+ rate_limit:
99
+ enabled: true
100
+ requests_per_minute: 60