@bluefly/openstandardagents 0.2.4
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/.env.example +41 -0
- package/.eslintrc.cjs +43 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +39 -0
- package/.github/dependabot.yml +58 -0
- package/.github/workflows/ci.yml +154 -0
- package/.github/workflows/codeql.yml +41 -0
- package/.github/workflows/dependabot-auto-merge.yml +28 -0
- package/.github/workflows/release.yml +103 -0
- package/.prettierignore +7 -0
- package/.prettierrc.json +10 -0
- package/.redocly.yaml +9 -0
- package/.releaserc.json +84 -0
- package/.releaserc.json.disabled +81 -0
- package/CHANGELOG.md +152 -0
- package/CONTRIBUTING.md +249 -0
- package/LICENSE +190 -0
- package/README.md +280 -0
- package/bin/ossa +8 -0
- package/bin/validate-ossa-0.2.2.ts +244 -0
- package/dist/di-container.d.ts +18 -0
- package/dist/di-container.d.ts.map +1 -0
- package/dist/di-container.js +43 -0
- package/dist/di-container.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/repositories/manifest.repository.d.ts +26 -0
- package/dist/repositories/manifest.repository.d.ts.map +1 -0
- package/dist/repositories/manifest.repository.js +90 -0
- package/dist/repositories/manifest.repository.js.map +1 -0
- package/dist/repositories/schema.repository.d.ts +30 -0
- package/dist/repositories/schema.repository.d.ts.map +1 -0
- package/dist/repositories/schema.repository.js +143 -0
- package/dist/repositories/schema.repository.js.map +1 -0
- package/dist/services/generation.service.d.ts +54 -0
- package/dist/services/generation.service.d.ts.map +1 -0
- package/dist/services/generation.service.js +298 -0
- package/dist/services/generation.service.js.map +1 -0
- package/dist/services/migration.service.d.ts +30 -0
- package/dist/services/migration.service.d.ts.map +1 -0
- package/dist/services/migration.service.js +231 -0
- package/dist/services/migration.service.js.map +1 -0
- package/dist/services/runtime/openai.adapter.d.ts +94 -0
- package/dist/services/runtime/openai.adapter.d.ts.map +1 -0
- package/dist/services/runtime/openai.adapter.js +209 -0
- package/dist/services/runtime/openai.adapter.js.map +1 -0
- package/dist/services/validation.service.d.ts +45 -0
- package/dist/services/validation.service.d.ts.map +1 -0
- package/dist/services/validation.service.js +362 -0
- package/dist/services/validation.service.js.map +1 -0
- package/dist/services/validators/anthropic.validator.d.ts +9 -0
- package/dist/services/validators/anthropic.validator.d.ts.map +1 -0
- package/dist/services/validators/anthropic.validator.js +105 -0
- package/dist/services/validators/anthropic.validator.js.map +1 -0
- package/dist/services/validators/autogen.validator.d.ts +9 -0
- package/dist/services/validators/autogen.validator.d.ts.map +1 -0
- package/dist/services/validators/autogen.validator.js +111 -0
- package/dist/services/validators/autogen.validator.js.map +1 -0
- package/dist/services/validators/crewai.validator.d.ts +9 -0
- package/dist/services/validators/crewai.validator.d.ts.map +1 -0
- package/dist/services/validators/crewai.validator.js +117 -0
- package/dist/services/validators/crewai.validator.js.map +1 -0
- package/dist/services/validators/cursor.validator.d.ts +9 -0
- package/dist/services/validators/cursor.validator.d.ts.map +1 -0
- package/dist/services/validators/cursor.validator.js +88 -0
- package/dist/services/validators/cursor.validator.js.map +1 -0
- package/dist/services/validators/index.d.ts +15 -0
- package/dist/services/validators/index.d.ts.map +1 -0
- package/dist/services/validators/index.js +15 -0
- package/dist/services/validators/index.js.map +1 -0
- package/dist/services/validators/langchain.validator.d.ts +9 -0
- package/dist/services/validators/langchain.validator.d.ts.map +1 -0
- package/dist/services/validators/langchain.validator.js +103 -0
- package/dist/services/validators/langchain.validator.js.map +1 -0
- package/dist/services/validators/langflow.validator.d.ts +9 -0
- package/dist/services/validators/langflow.validator.d.ts.map +1 -0
- package/dist/services/validators/langflow.validator.js +92 -0
- package/dist/services/validators/langflow.validator.js.map +1 -0
- package/dist/services/validators/langgraph.validator.d.ts +9 -0
- package/dist/services/validators/langgraph.validator.d.ts.map +1 -0
- package/dist/services/validators/langgraph.validator.js +123 -0
- package/dist/services/validators/langgraph.validator.js.map +1 -0
- package/dist/services/validators/llamaindex.validator.d.ts +9 -0
- package/dist/services/validators/llamaindex.validator.d.ts.map +1 -0
- package/dist/services/validators/llamaindex.validator.js +121 -0
- package/dist/services/validators/llamaindex.validator.js.map +1 -0
- package/dist/services/validators/openai.validator.d.ts +9 -0
- package/dist/services/validators/openai.validator.d.ts.map +1 -0
- package/dist/services/validators/openai.validator.js +126 -0
- package/dist/services/validators/openai.validator.js.map +1 -0
- package/dist/services/validators/vercel-ai.validator.d.ts +9 -0
- package/dist/services/validators/vercel-ai.validator.d.ts.map +1 -0
- package/dist/services/validators/vercel-ai.validator.js +99 -0
- package/dist/services/validators/vercel-ai.validator.js.map +1 -0
- package/dist/spec/v0.1.9/agent-autonomous-extensions.json +234 -0
- package/dist/spec/v0.1.9/ecosystem-compliance.json +235 -0
- package/dist/spec/v0.1.9/ossa-v0.1.9.schema.json +695 -0
- package/dist/spec/v0.1.9/ossa-v0.1.9.schema.json.backup +695 -0
- package/dist/spec/v0.1.9/reasoning-compliance.json +654 -0
- package/dist/spec/v0.2.2/kagent-enhancements.json +395 -0
- package/dist/spec/v0.2.2/ossa-0.2.2.schema.json +906 -0
- package/dist/spec/v0.2.2/ossa-0.2.2.yaml +448 -0
- package/dist/spec/v0.2.2/ossa-reasoning-compliance-1.0.schema.json +424 -0
- package/dist/spec/v0.2.3/CHANGELOG.md +176 -0
- package/dist/spec/v0.2.3/README.md +154 -0
- package/dist/spec/v0.2.3/migrations/v0.2.2-to-v0.2.3.md +343 -0
- package/dist/spec/v0.2.3/ossa-0.2.3.schema.json +1397 -0
- package/dist/spec/v0.2.3/ossa-0.2.3.yaml +448 -0
- package/dist/spec/v0.2.4-dev/CHANGELOG.md +403 -0
- package/dist/spec/v0.2.4-dev/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/dist/spec/v0.2.4-dev/ossa-0.2.4-dev.schema.json +1696 -0
- package/dist/spec/v0.2.4-dev/ossa-0.2.4-dev.yaml +581 -0
- package/dist/spec/v0.2.5-dev/CHANGELOG.md +171 -0
- package/dist/spec/v0.2.5-dev/examples/customer-support-graph.ossa.yaml +362 -0
- package/dist/spec/v0.2.5-dev/examples/parallel-processors.ossa.yaml +464 -0
- package/dist/spec/v0.2.5-dev/examples/research-team.ossa.yaml +440 -0
- package/dist/spec/v0.2.5-dev/migrations/v0.2.4-to-v0.2.5.md +317 -0
- package/dist/spec/v0.2.5-dev/ossa-0.2.5-dev.schema.json +1732 -0
- package/dist/spec/v0.2.5-dev/ossa-0.2.5-dev.yaml +409 -0
- package/dist/types/index.d.ts +178 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/openapi-extensions.d.ts +164 -0
- package/dist/types/openapi-extensions.d.ts.map +1 -0
- package/dist/types/openapi-extensions.js +6 -0
- package/dist/types/openapi-extensions.js.map +1 -0
- package/docs/OSSA-COMPLIANT-BADGE.md +248 -0
- package/docs/README.md +31 -0
- package/docs/VERSIONING.md +284 -0
- package/docs/agent-openapi-spec.yml +942 -0
- package/docs/getting-started.md +87 -0
- package/docs/migration/general-agent-schema.yml +255 -0
- package/docs/migration/migration-manifest.json +64 -0
- package/docs/openapi-extensions.md +930 -0
- package/docs/schemas/openapi-extensions.schema.json +486 -0
- package/examples/adk-integration/code-review-workflow.yml +136 -0
- package/examples/adk-integration/customer-support.yml +263 -0
- package/examples/adk-integration/data-pipeline.yml +173 -0
- package/examples/advanced/patterns/compliance-context-production.json +53 -0
- package/examples/advanced/patterns/model-router.ts +274 -0
- package/examples/advanced/patterns/smart-model-routing.ts +248 -0
- package/examples/advanced/workflows/hybrid-model-strategy.yaml +232 -0
- package/examples/agent-manifests/critics/critic-agent.yaml +149 -0
- package/examples/agent-manifests/governors/governor-agent.yaml +128 -0
- package/examples/agent-manifests/integrators/integrator-agent.yaml +103 -0
- package/examples/agent-manifests/judges/judge-agent.yaml +153 -0
- package/examples/agent-manifests/monitors/monitor-agent.yaml +122 -0
- package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +247 -0
- package/examples/agent-manifests/sample-compliant-agent.yaml +147 -0
- package/examples/agent-manifests/workers/worker-agent.yaml +82 -0
- package/examples/anthropic/claude-assistant.ossa.json +45 -0
- package/examples/architecture/model-configuration/ollama-integration.ts +110 -0
- package/examples/autogen/multi-agent.ossa.json +37 -0
- package/examples/bridge-configurations.yaml +346 -0
- package/examples/bridges/Dockerfile.production +87 -0
- package/examples/bridges/__pycache__/aiflow-bridge-enhanced.cpython-313.pyc +0 -0
- package/examples/bridges/__pycache__/aiflow-phoenix-tracing.cpython-313.pyc +0 -0
- package/examples/bridges/__pycache__/test_aiflow_integration.cpython-313.pyc +0 -0
- package/examples/bridges/aiflow-bridge-enhanced.py +462 -0
- package/examples/bridges/aiflow-bridge-example.yml +310 -0
- package/examples/bridges/aiflow-phoenix-tracing.py +310 -0
- package/examples/bridges/aiflow-registration-api.openapi.yml +439 -0
- package/examples/bridges/k8s/configmap.yaml +121 -0
- package/examples/bridges/k8s/deployment-simple.yaml +34 -0
- package/examples/bridges/k8s/deployment.yaml +275 -0
- package/examples/bridges/k8s/hpa.yaml +126 -0
- package/examples/bridges/k8s/ingress.yaml +155 -0
- package/examples/bridges/kagent-bridge-example.yml +94 -0
- package/examples/bridges/load-tests/Dockerfile +28 -0
- package/examples/bridges/load-tests/k6-load-test.js +302 -0
- package/examples/bridges/load-tests/requirements.txt +20 -0
- package/examples/bridges/loadtest/k6-scenarios.js +270 -0
- package/examples/bridges/phase4/SLO-SLA.yaml +249 -0
- package/examples/bridges/phase4/chaos-tests.yaml +226 -0
- package/examples/bridges/requirements.txt +24 -0
- package/examples/bridges/test_aiflow_integration.py +341 -0
- package/examples/common_npm/agent-router.ossa.yaml +182 -0
- package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +60 -0
- package/examples/compliance-agent.yml +155 -0
- package/examples/crewai/research-team.ossa.json +36 -0
- package/examples/cursor/code-review-agent.ossa.json +47 -0
- package/examples/drupal/gitlab-ml-recommender.ossa.yaml +609 -0
- package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +68 -0
- package/examples/enterprise/agent.yml +452 -0
- package/examples/extensions/drupal-v1.yml +266 -0
- package/examples/extensions/kagent-v1.yml +167 -0
- package/examples/getting-started/hello-world-complete.ossa.yaml +266 -0
- package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +376 -0
- package/examples/kagent/README.md +31 -0
- package/examples/kagent/compliance-validator.ossa.yaml +111 -0
- package/examples/kagent/cost-optimizer.ossa.yaml +93 -0
- package/examples/kagent/documentation-agent.ossa.yaml +91 -0
- package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +269 -0
- package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +106 -0
- package/examples/kagent/k8s-troubleshooter.ossa.yaml +257 -0
- package/examples/kagent/security-scanner.ossa.yaml +140 -0
- package/examples/langchain/chain-agent.ossa.json +42 -0
- package/examples/langflow/workflow-agent.ossa.json +39 -0
- package/examples/langgraph/state-machine-agent.ossa.json +59 -0
- package/examples/llamaindex/rag-agent.ossa.json +41 -0
- package/examples/migration-guides/from-langchain-to-ossa.yaml +309 -0
- package/examples/minimal/agent.yml +152 -0
- package/examples/minimal/openapi.yaml +95 -0
- package/examples/openai/swarm-agent.ossa.json +59 -0
- package/examples/openapi-extensions/README.md +87 -0
- package/examples/openapi-extensions/minimal-agent-api.openapi.yml +288 -0
- package/examples/openapi-extensions/orchestrator-agent-api.openapi.yml +633 -0
- package/examples/openapi-extensions/worker-agent-api.openapi.yml +533 -0
- package/examples/production/agent.yml +713 -0
- package/examples/production/document-analyzer-openai.yml +134 -0
- package/examples/quickstart/support-agent.ossa.yaml +59 -0
- package/examples/service-registry-usage.ts +423 -0
- package/examples/spec-examples/audit-agent.yml +147 -0
- package/examples/spec-examples/chat-agent.yml +189 -0
- package/examples/spec-examples/compliance-agent.yml +204 -0
- package/examples/spec-examples/data-processing-agent.yml +132 -0
- package/examples/spec-examples/development-agent.yml +138 -0
- package/examples/spec-examples/edge-agent.yml +101 -0
- package/examples/spec-examples/integration-agent.yml +129 -0
- package/examples/spec-examples/monitoring-agent.yml +130 -0
- package/examples/spec-examples/serverless-agent.yml +82 -0
- package/examples/spec-examples/workflow-agent.yml +223 -0
- package/examples/templates/ossa-compliance.yaml +56 -0
- package/examples/typescript/advanced/demo-registry.ts +168 -0
- package/examples/typescript/mcpb-agent-example.ts +358 -0
- package/examples/vercel/edge-agent.ossa.json +43 -0
- package/infrastructure/docker-compose.yml +33 -0
- package/junit.xml +1 -0
- package/openapi/drupal-agent-api.openapi.yaml +348 -0
- package/openapi/gitlab-orchestrator.openapi.yaml +330 -0
- package/openapi/helm-generator.openapi.yaml +389 -0
- package/openapi/ossa-core-api.openapi.yaml +1448 -0
- package/openapi/ossa-registry-api.openapi.yaml +980 -0
- package/openapi/ossa-registry.openapi.yaml +782 -0
- package/openapi/self-evolving-ecosystem.openapi.yaml +1530 -0
- package/openapi/unified-agent-gateway.openapi.yaml +833 -0
- package/ossa-website-swarm-tasks.json +105 -0
- package/package.json +132 -0
- package/release.config.js +64 -0
- package/spec/v0.1.9/agent-autonomous-extensions.json +234 -0
- package/spec/v0.1.9/ecosystem-compliance.json +235 -0
- package/spec/v0.1.9/ossa-v0.1.9.schema.json +695 -0
- package/spec/v0.1.9/ossa-v0.1.9.schema.json.backup +695 -0
- package/spec/v0.1.9/reasoning-compliance.json +654 -0
- package/spec/v0.2.2/kagent-enhancements.json +395 -0
- package/spec/v0.2.2/ossa-0.2.2.schema.json +906 -0
- package/spec/v0.2.2/ossa-0.2.2.yaml +448 -0
- package/spec/v0.2.2/ossa-reasoning-compliance-1.0.schema.json +424 -0
- package/spec/v0.2.3/CHANGELOG.md +176 -0
- package/spec/v0.2.3/README.md +154 -0
- package/spec/v0.2.3/migrations/v0.2.2-to-v0.2.3.md +343 -0
- package/spec/v0.2.3/ossa-0.2.3.schema.json +1397 -0
- package/spec/v0.2.3/ossa-0.2.3.yaml +448 -0
- package/spec/v0.2.4-dev/CHANGELOG.md +403 -0
- package/spec/v0.2.4-dev/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/spec/v0.2.4-dev/ossa-0.2.4-dev.schema.json +1696 -0
- package/spec/v0.2.4-dev/ossa-0.2.4-dev.yaml +581 -0
- package/spec/v0.2.5-dev/CHANGELOG.md +171 -0
- package/spec/v0.2.5-dev/examples/customer-support-graph.ossa.yaml +362 -0
- package/spec/v0.2.5-dev/examples/parallel-processors.ossa.yaml +464 -0
- package/spec/v0.2.5-dev/examples/research-team.ossa.yaml +440 -0
- package/spec/v0.2.5-dev/migrations/v0.2.4-to-v0.2.5.md +317 -0
- package/spec/v0.2.5-dev/ossa-0.2.5-dev.schema.json +1732 -0
- package/spec/v0.2.5-dev/ossa-0.2.5-dev.yaml +409 -0
- package/test-results.xml +1 -0
- package/website/.lighthouserc.js +20 -0
- package/website/.prettierrc +10 -0
- package/website/Dockerfile +17 -0
- package/website/app/about/page.tsx +295 -0
- package/website/app/api/validate/route.ts +88 -0
- package/website/app/blog/[slug]/page.tsx +167 -0
- package/website/app/blog/page.tsx +162 -0
- package/website/app/docs/[[...slug]]/page.tsx +349 -0
- package/website/app/docs/core-concepts/project-structure/page.tsx +349 -0
- package/website/app/ecosystem/page.tsx +375 -0
- package/website/app/examples/page.tsx +123 -0
- package/website/app/globals.css +108 -0
- package/website/app/layout.tsx +106 -0
- package/website/app/page.tsx +409 -0
- package/website/app/playground/page.tsx +507 -0
- package/website/app/robots.ts +19 -0
- package/website/app/rss.xml/route.ts +74 -0
- package/website/app/schema/page.tsx +970 -0
- package/website/app/sitemap.ts +56 -0
- package/website/app/specification/page.tsx +211 -0
- package/website/components/InstallCommand.tsx +96 -0
- package/website/components/Logo.tsx +24 -0
- package/website/components/StructuredData.tsx +65 -0
- package/website/components/docs/DocsSearch.tsx +104 -0
- package/website/components/docs/DocsSidebar.tsx +118 -0
- package/website/components/docs/MarkdownContent.tsx +183 -0
- package/website/components/docs/VersionSelector.tsx +49 -0
- package/website/components/examples/ExamplesViewer.tsx +293 -0
- package/website/components/layout/Footer.tsx +111 -0
- package/website/components/layout/Header.tsx +170 -0
- package/website/components/schema/SchemaExplorer.tsx +213 -0
- package/website/content/blog/OpenAPI-AI-Agents-Standard.md +285 -0
- package/website/content/blog/Why-Formal-Standards-Matter-Now.md +209 -0
- package/website/content/blog/introducing-ossa-framework.md +328 -0
- package/website/content/blog/ossa-production-results.md +279 -0
- package/website/content/blog/welcome-to-ossa.md +43 -0
- package/website/content/blog/why-ai-agents-need-open-standard.md +98 -0
- package/website/content/docs/00-HOME.md +160 -0
- package/website/content/docs/AIFlow-Framework-Integration-with-OSSA.md +107 -0
- package/website/content/docs/OpenAPI-Extensions.md +498 -0
- package/website/content/docs/architecture/execution-flow.md +335 -0
- package/website/content/docs/architecture/multi-agent-systems.md +737 -0
- package/website/content/docs/architecture/overview.md +121 -0
- package/website/content/docs/architecture/stack-integration.md +461 -0
- package/website/content/docs/changelog.md +246 -0
- package/website/content/docs/contributing.md +599 -0
- package/website/content/docs/core-concepts/project-structure.md +348 -0
- package/website/content/docs/ecosystem/framework-support.md +821 -0
- package/website/content/docs/ecosystem/overview.md +366 -0
- package/website/content/docs/examples/Migration-Guides.md +214 -0
- package/website/content/docs/examples.md +71 -0
- package/website/content/docs/for-audiences/Enterprises.md +256 -0
- package/website/content/docs/for-audiences/Students-Researchers.md +122 -0
- package/website/content/docs/for-audiences/architects.md +224 -0
- package/website/content/docs/for-audiences/developers.md +220 -0
- package/website/content/docs/getting-started/5-minute-overview.md +85 -0
- package/website/content/docs/getting-started/Hello-World.md +184 -0
- package/website/content/docs/getting-started/first-agent.md +196 -0
- package/website/content/docs/getting-started/installation.md +155 -0
- package/website/content/docs/getting-started/running-agents.md +107 -0
- package/website/content/docs/integrations/aiflow.md +104 -0
- package/website/content/docs/integrations/drupal.md +105 -0
- package/website/content/docs/migration-guides/00-index.md +76 -0
- package/website/content/docs/migration-guides/README.md +133 -0
- package/website/content/docs/migration-guides/anthropic-mcp-to-ossa.md +1750 -0
- package/website/content/docs/migration-guides/crewai-to-ossa.md +274 -0
- package/website/content/docs/migration-guides/drupal-eca-to-ossa.md +2017 -0
- package/website/content/docs/migration-guides/index.md +133 -0
- package/website/content/docs/migration-guides/langchain-to-ossa.md +1714 -0
- package/website/content/docs/migration-guides/langflow-to-ossa.md +2075 -0
- package/website/content/docs/migration-guides/openai-to-ossa.md +1202 -0
- package/website/content/docs/openapi-extensions/examples.md +550 -0
- package/website/content/docs/openapi-extensions/index.md +495 -0
- package/website/content/docs/openapi-extensions/operation-extensions.md +398 -0
- package/website/content/docs/openapi-extensions/root-extensions.md +364 -0
- package/website/content/docs/pre-release/index.md +175 -0
- package/website/content/docs/quick-reference.md +17 -0
- package/website/content/docs/schema-reference/agent-spec.md +406 -0
- package/website/content/docs/schema-reference/autonomy.md +568 -0
- package/website/content/docs/schema-reference/constraints.md +543 -0
- package/website/content/docs/schema-reference/index.md +176 -0
- package/website/content/docs/schema-reference/llm-config.md +445 -0
- package/website/content/docs/schema-reference/observability.md +654 -0
- package/website/content/docs/schema-reference/ossa-manifest.md +309 -0
- package/website/content/docs/schema-reference/taxonomy.md +509 -0
- package/website/content/docs/schema-reference/tools.md +628 -0
- package/website/content/docs/templates/blog-post.md +43 -0
- package/website/content/docs/use-cases/00-index.md +395 -0
- package/website/content/docs/use-cases/cicd-code-review.md +1236 -0
- package/website/content/docs/use-cases/customer-support.md +1234 -0
- package/website/content/docs/use-cases/enterprise-compliance.md +1208 -0
- package/website/content/docs/use-cases/research-multi-agent.md +1161 -0
- package/website/lib/version.ts +18 -0
- package/website/next.config.js +17 -0
- package/website/next.config.ts +16 -0
- package/website/nginx.conf +32 -0
- package/website/package-lock.json +9145 -0
- package/website/package.json +53 -0
- package/website/postcss.config.js +7 -0
- package/website/postcss.config.mjs +9 -0
- package/website/scripts/sync-version.js +44 -0
- package/website/scripts/sync-wiki.ts +261 -0
- package/website/tailwind.config.js +58 -0
- package/website/tailwind.config.ts +65 -0
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AIFlow OpenAPI Bridge - Enhanced with Phoenix Tracing & BuildKit Registration
|
|
3
|
+
|
|
4
|
+
This is an enhanced version with:
|
|
5
|
+
1. Phoenix tracing for all endpoints
|
|
6
|
+
2. Automatic BuildKit registration
|
|
7
|
+
3. Heartbeat mechanism
|
|
8
|
+
4. Production-ready error handling
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
python aiflow-bridge-enhanced.py
|
|
12
|
+
|
|
13
|
+
Environment Variables:
|
|
14
|
+
AIFLOW_API_KEY - API key for authentication
|
|
15
|
+
PHOENIX_ENDPOINT - Phoenix OTLP endpoint
|
|
16
|
+
PHOENIX_PROJECT - Phoenix project name
|
|
17
|
+
BUILDKIT_REGISTRY_URL - BuildKit registry URL
|
|
18
|
+
AGENT_ID - Unique agent identifier
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
import sys
|
|
23
|
+
import asyncio
|
|
24
|
+
import random
|
|
25
|
+
from typing import Optional, List
|
|
26
|
+
from contextlib import asynccontextmanager
|
|
27
|
+
|
|
28
|
+
from fastapi import FastAPI, HTTPException, Header
|
|
29
|
+
from pydantic import BaseModel
|
|
30
|
+
from prometheus_client import Counter, Histogram, generate_latest, CONTENT_TYPE_LATEST
|
|
31
|
+
from fastapi.responses import Response
|
|
32
|
+
import httpx
|
|
33
|
+
|
|
34
|
+
# Import Phoenix tracing
|
|
35
|
+
from aiflow_phoenix_tracing import (
|
|
36
|
+
init_phoenix_tracing,
|
|
37
|
+
trace_agent_task,
|
|
38
|
+
trace_llm_call,
|
|
39
|
+
trace_character_interaction,
|
|
40
|
+
create_span
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Configuration
|
|
45
|
+
AGENT_ID = os.getenv('AGENT_ID', 'social-agent-aiflow')
|
|
46
|
+
AGENT_NAME = os.getenv('AGENT_NAME', 'AIFlow Social Agent')
|
|
47
|
+
AGENT_VERSION = os.getenv('AGENT_VERSION', '1.0.0')
|
|
48
|
+
BASE_URL = os.getenv('BASE_URL', 'http://aiflow-agent:8000')
|
|
49
|
+
BUILDKIT_REGISTRY_URL = os.getenv('BUILDKIT_REGISTRY_URL', 'http://buildkit.agent-buildkit.orb.local/api/v1')
|
|
50
|
+
HEARTBEAT_INTERVAL = int(os.getenv('HEARTBEAT_INTERVAL', '30')) # seconds
|
|
51
|
+
|
|
52
|
+
# Global httpx client
|
|
53
|
+
http_client: Optional[httpx.AsyncClient] = None
|
|
54
|
+
heartbeat_task: Optional[asyncio.Task] = None
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@asynccontextmanager
|
|
58
|
+
async def lifespan(app: FastAPI):
|
|
59
|
+
"""FastAPI lifespan manager for startup and shutdown."""
|
|
60
|
+
global http_client, heartbeat_task
|
|
61
|
+
|
|
62
|
+
# Startup
|
|
63
|
+
print("🚀 Starting AIFlow bridge...")
|
|
64
|
+
|
|
65
|
+
# Initialize Phoenix tracing
|
|
66
|
+
init_phoenix_tracing(
|
|
67
|
+
service_name=AGENT_ID,
|
|
68
|
+
phoenix_endpoint=os.getenv('PHOENIX_ENDPOINT'),
|
|
69
|
+
phoenix_project=os.getenv('PHOENIX_PROJECT', 'aiflow-social-agents')
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# Create HTTP client
|
|
73
|
+
http_client = httpx.AsyncClient(timeout=30.0)
|
|
74
|
+
|
|
75
|
+
# Register with BuildKit
|
|
76
|
+
try:
|
|
77
|
+
await register_with_buildkit()
|
|
78
|
+
print(f"✅ Registered with BuildKit: {AGENT_ID}")
|
|
79
|
+
except Exception as e:
|
|
80
|
+
print(f"⚠️ Failed to register with BuildKit: {e}")
|
|
81
|
+
print(" Continuing without registration...")
|
|
82
|
+
|
|
83
|
+
# Start heartbeat task
|
|
84
|
+
heartbeat_task = asyncio.create_task(heartbeat_loop())
|
|
85
|
+
|
|
86
|
+
yield
|
|
87
|
+
|
|
88
|
+
# Shutdown
|
|
89
|
+
print("🛑 Shutting down AIFlow bridge...")
|
|
90
|
+
|
|
91
|
+
# Cancel heartbeat
|
|
92
|
+
if heartbeat_task:
|
|
93
|
+
heartbeat_task.cancel()
|
|
94
|
+
try:
|
|
95
|
+
await heartbeat_task
|
|
96
|
+
except asyncio.CancelledError:
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
# Deregister from BuildKit
|
|
100
|
+
try:
|
|
101
|
+
await deregister_from_buildkit()
|
|
102
|
+
print(f"✅ Deregistered from BuildKit: {AGENT_ID}")
|
|
103
|
+
except Exception as e:
|
|
104
|
+
print(f"⚠️ Failed to deregister: {e}")
|
|
105
|
+
|
|
106
|
+
# Close HTTP client
|
|
107
|
+
if http_client:
|
|
108
|
+
await http_client.aclose()
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# Create FastAPI app with lifespan
|
|
112
|
+
app = FastAPI(
|
|
113
|
+
title="AIFlow OpenAPI Bridge",
|
|
114
|
+
description="REST API for AIFlow personality-driven social agent with Phoenix tracing",
|
|
115
|
+
version="1.0.0",
|
|
116
|
+
docs_url="/docs",
|
|
117
|
+
openapi_url="/openapi.json",
|
|
118
|
+
lifespan=lifespan
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# Prometheus Metrics
|
|
122
|
+
posts_generated = Counter(
|
|
123
|
+
'aiflow_posts_generated_total',
|
|
124
|
+
'Total posts generated by AIFlow agent',
|
|
125
|
+
['platform', 'time_of_day']
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
responses_generated = Counter(
|
|
129
|
+
'aiflow_responses_generated_total',
|
|
130
|
+
'Total responses generated by AIFlow agent',
|
|
131
|
+
['platform']
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
api_requests = Counter(
|
|
135
|
+
'aiflow_api_requests_total',
|
|
136
|
+
'Total API requests',
|
|
137
|
+
['endpoint', 'method', 'status']
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
api_latency = Histogram(
|
|
141
|
+
'aiflow_api_latency_seconds',
|
|
142
|
+
'API request latency',
|
|
143
|
+
['endpoint', 'method']
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
health_checks = Counter(
|
|
147
|
+
'aiflow_health_checks_total',
|
|
148
|
+
'Total health check requests'
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
buildkit_heartbeats = Counter(
|
|
152
|
+
'aiflow_buildkit_heartbeats_total',
|
|
153
|
+
'Total BuildKit heartbeats sent',
|
|
154
|
+
['status']
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# Mock character data
|
|
158
|
+
MOCK_CHARACTER = {
|
|
159
|
+
"name": "AIFlow",
|
|
160
|
+
"traits": ["Visionary", "Innovative", "Technical"],
|
|
161
|
+
"moods": {
|
|
162
|
+
"morning": "Energetic and Focused",
|
|
163
|
+
"afternoon": "Collaborative and Engaged",
|
|
164
|
+
"evening": "Reflective and Strategic",
|
|
165
|
+
"night": "Visionary and Philosophical"
|
|
166
|
+
},
|
|
167
|
+
"current_mood": "Energetic and Focused"
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
# Request/Response Models
|
|
171
|
+
class GeneratePostRequest(BaseModel):
|
|
172
|
+
platform: str
|
|
173
|
+
time_of_day: Optional[str] = None
|
|
174
|
+
conversation_id: Optional[str] = None
|
|
175
|
+
|
|
176
|
+
class GeneratePostResponse(BaseModel):
|
|
177
|
+
content: str
|
|
178
|
+
platform: str
|
|
179
|
+
media_urls: List[str]
|
|
180
|
+
|
|
181
|
+
class MessageInput(BaseModel):
|
|
182
|
+
id: str
|
|
183
|
+
author: str
|
|
184
|
+
content: str
|
|
185
|
+
platform: str
|
|
186
|
+
conversation_id: Optional[str] = None
|
|
187
|
+
|
|
188
|
+
class GenerateResponseRequest(BaseModel):
|
|
189
|
+
message: MessageInput
|
|
190
|
+
conversation: Optional[List[dict]] = None
|
|
191
|
+
|
|
192
|
+
class GenerateResponseResponse(BaseModel):
|
|
193
|
+
content: Optional[str]
|
|
194
|
+
should_respond: bool
|
|
195
|
+
|
|
196
|
+
# Mock post templates
|
|
197
|
+
MOCK_POSTS = {
|
|
198
|
+
"morning": [
|
|
199
|
+
"Good morning! 🌅 Exploring AI + blockchain convergence today.",
|
|
200
|
+
"Starting the day with fresh ideas about agent orchestration.",
|
|
201
|
+
"Morning thoughts: OSSA manifests are the OpenAPI for AI agents."
|
|
202
|
+
],
|
|
203
|
+
"afternoon": [
|
|
204
|
+
"Building in public: Just deployed another K-Agent to production.",
|
|
205
|
+
"Fascinating how OSSA + K8s creates perfect agent infrastructure.",
|
|
206
|
+
"Pro tip: Always validate your x-k-agent metadata before deployment."
|
|
207
|
+
],
|
|
208
|
+
"evening": [
|
|
209
|
+
"Wrapping up: All agents green, Phoenix traces looking clean.",
|
|
210
|
+
"Evening reflection: Standards enable scalability.",
|
|
211
|
+
"Today's win: Zero downtime rolling update of social agents."
|
|
212
|
+
],
|
|
213
|
+
"night": [
|
|
214
|
+
"Late night thought: AI agents will outnumber APIs soon.",
|
|
215
|
+
"Philosophical: Agents should be as easy to deploy as containers.",
|
|
216
|
+
"Final commit: Multi-agent coordination working flawlessly."
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
# Endpoints
|
|
221
|
+
@app.post("/generate_post", response_model=GeneratePostResponse)
|
|
222
|
+
@trace_agent_task("generate_post")
|
|
223
|
+
async def generate_post(
|
|
224
|
+
request: GeneratePostRequest,
|
|
225
|
+
x_api_key: str = Header(..., alias="X-API-Key")
|
|
226
|
+
):
|
|
227
|
+
"""Generate autonomous social media post"""
|
|
228
|
+
try:
|
|
229
|
+
# Validate API key
|
|
230
|
+
if x_api_key != os.getenv("AIFLOW_API_KEY", "test-api-key-for-development"):
|
|
231
|
+
api_requests.labels(endpoint='/generate_post', method='POST', status='401').inc()
|
|
232
|
+
raise HTTPException(status_code=401, detail="Invalid API key")
|
|
233
|
+
|
|
234
|
+
# Get time of day
|
|
235
|
+
time_of_day = request.time_of_day or "morning"
|
|
236
|
+
|
|
237
|
+
# Add character interaction tracing
|
|
238
|
+
trace_character_interaction(
|
|
239
|
+
character_name=MOCK_CHARACTER["name"],
|
|
240
|
+
interaction_type="post",
|
|
241
|
+
platform=request.platform,
|
|
242
|
+
mood=MOCK_CHARACTER["moods"].get(time_of_day, "neutral")
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
# Generate mock post
|
|
246
|
+
posts = MOCK_POSTS.get(time_of_day, MOCK_POSTS["morning"])
|
|
247
|
+
content = random.choice(posts)
|
|
248
|
+
|
|
249
|
+
# Trace LLM call (mock)
|
|
250
|
+
trace_llm_call(
|
|
251
|
+
provider="anthropic",
|
|
252
|
+
model="claude-3-sonnet",
|
|
253
|
+
prompt=f"Generate {request.platform} post for {time_of_day}",
|
|
254
|
+
response=content,
|
|
255
|
+
input_tokens=150,
|
|
256
|
+
output_tokens=50,
|
|
257
|
+
cost=0.001
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
# Update metrics
|
|
261
|
+
posts_generated.labels(platform=request.platform, time_of_day=time_of_day).inc()
|
|
262
|
+
api_requests.labels(endpoint='/generate_post', method='POST', status='200').inc()
|
|
263
|
+
|
|
264
|
+
return GeneratePostResponse(
|
|
265
|
+
content=content,
|
|
266
|
+
platform=request.platform,
|
|
267
|
+
media_urls=[]
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
except HTTPException:
|
|
271
|
+
raise
|
|
272
|
+
except Exception as e:
|
|
273
|
+
api_requests.labels(endpoint='/generate_post', method='POST', status='500').inc()
|
|
274
|
+
raise HTTPException(status_code=500, detail=str(e))
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
@app.post("/generate_response", response_model=GenerateResponseResponse)
|
|
278
|
+
@trace_agent_task("generate_response")
|
|
279
|
+
async def generate_response(
|
|
280
|
+
request: GenerateResponseRequest,
|
|
281
|
+
x_api_key: str = Header(..., alias="X-API-Key")
|
|
282
|
+
):
|
|
283
|
+
"""Generate contextual response to message"""
|
|
284
|
+
try:
|
|
285
|
+
if x_api_key != os.getenv("AIFLOW_API_KEY", "test-api-key-for-development"):
|
|
286
|
+
api_requests.labels(endpoint='/generate_response', method='POST', status='401').inc()
|
|
287
|
+
raise HTTPException(status_code=401, detail="Invalid API key")
|
|
288
|
+
|
|
289
|
+
# Add character interaction tracing
|
|
290
|
+
trace_character_interaction(
|
|
291
|
+
character_name=MOCK_CHARACTER["name"],
|
|
292
|
+
interaction_type="response",
|
|
293
|
+
platform=request.message.platform
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
# Mock response
|
|
297
|
+
responses = [
|
|
298
|
+
f"Thanks for sharing, {request.message.author}! Interesting perspective.",
|
|
299
|
+
"Agreed! This aligns with our vision for decentralized AI.",
|
|
300
|
+
"Great point. We're actively working on this integration."
|
|
301
|
+
]
|
|
302
|
+
|
|
303
|
+
response_content = random.choice(responses)
|
|
304
|
+
|
|
305
|
+
# Trace LLM call (mock)
|
|
306
|
+
trace_llm_call(
|
|
307
|
+
provider="anthropic",
|
|
308
|
+
model="claude-3-sonnet",
|
|
309
|
+
prompt=f"Respond to: {request.message.content}",
|
|
310
|
+
response=response_content,
|
|
311
|
+
input_tokens=200,
|
|
312
|
+
output_tokens=60,
|
|
313
|
+
cost=0.0012
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
# Update metrics
|
|
317
|
+
responses_generated.labels(platform=request.message.platform).inc()
|
|
318
|
+
api_requests.labels(endpoint='/generate_response', method='POST', status='200').inc()
|
|
319
|
+
|
|
320
|
+
return GenerateResponseResponse(
|
|
321
|
+
content=response_content,
|
|
322
|
+
should_respond=True
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
except HTTPException:
|
|
326
|
+
raise
|
|
327
|
+
except Exception as e:
|
|
328
|
+
api_requests.labels(endpoint='/generate_response', method='POST', status='500').inc()
|
|
329
|
+
raise HTTPException(status_code=500, detail=str(e))
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
@app.get("/health")
|
|
333
|
+
async def health():
|
|
334
|
+
"""Health check endpoint for K8s probes"""
|
|
335
|
+
health_checks.inc()
|
|
336
|
+
api_requests.labels(endpoint='/health', method='GET', status='200').inc()
|
|
337
|
+
|
|
338
|
+
return {
|
|
339
|
+
"status": "healthy",
|
|
340
|
+
"character": MOCK_CHARACTER["name"],
|
|
341
|
+
"platforms": {
|
|
342
|
+
"twitter": True,
|
|
343
|
+
"telegram": True
|
|
344
|
+
},
|
|
345
|
+
"buildkit_registered": True,
|
|
346
|
+
"phoenix_tracing": True,
|
|
347
|
+
"version": AGENT_VERSION
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
@app.get("/metrics")
|
|
352
|
+
async def metrics():
|
|
353
|
+
"""Prometheus metrics endpoint"""
|
|
354
|
+
return Response(content=generate_latest(), media_type=CONTENT_TYPE_LATEST)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
@app.get("/character")
|
|
358
|
+
async def get_character(x_api_key: str = Header(..., alias="X-API-Key")):
|
|
359
|
+
"""Get character configuration"""
|
|
360
|
+
if x_api_key != os.getenv("AIFLOW_API_KEY", "test-api-key-for-development"):
|
|
361
|
+
raise HTTPException(status_code=401, detail="Invalid API key")
|
|
362
|
+
|
|
363
|
+
return MOCK_CHARACTER
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
# BuildKit Registration Functions
|
|
367
|
+
async def register_with_buildkit():
|
|
368
|
+
"""Register agent with BuildKit registry"""
|
|
369
|
+
if not http_client:
|
|
370
|
+
raise RuntimeError("HTTP client not initialized")
|
|
371
|
+
|
|
372
|
+
registration_data = {
|
|
373
|
+
"agent_id": AGENT_ID,
|
|
374
|
+
"name": AGENT_NAME,
|
|
375
|
+
"version": AGENT_VERSION,
|
|
376
|
+
"base_url": BASE_URL,
|
|
377
|
+
"health_endpoint": "/health",
|
|
378
|
+
"metrics_endpoint": "/metrics",
|
|
379
|
+
"capabilities": ["generate_post", "generate_response"],
|
|
380
|
+
"tags": ["social", "aiflow", "personality", "twitter", "telegram"],
|
|
381
|
+
"phoenix_project": os.getenv('PHOENIX_PROJECT', 'aiflow-social-agents'),
|
|
382
|
+
"ossa_manifest": {
|
|
383
|
+
"ossaVersion": "1.0",
|
|
384
|
+
"agent": {
|
|
385
|
+
"id": AGENT_ID,
|
|
386
|
+
"name": AGENT_NAME,
|
|
387
|
+
"version": AGENT_VERSION,
|
|
388
|
+
"role": "chat"
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
response = await http_client.post(
|
|
394
|
+
f"{BUILDKIT_REGISTRY_URL}/agents/register",
|
|
395
|
+
json=registration_data,
|
|
396
|
+
timeout=10.0
|
|
397
|
+
)
|
|
398
|
+
response.raise_for_status()
|
|
399
|
+
|
|
400
|
+
result = response.json()
|
|
401
|
+
print(f" Instance ID: {result.get('instance_id')}")
|
|
402
|
+
print(f" Phoenix URL: {result.get('phoenix_trace_url')}")
|
|
403
|
+
|
|
404
|
+
return result
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
async def send_heartbeat():
|
|
408
|
+
"""Send heartbeat to BuildKit registry"""
|
|
409
|
+
if not http_client:
|
|
410
|
+
return
|
|
411
|
+
|
|
412
|
+
try:
|
|
413
|
+
heartbeat_data = {
|
|
414
|
+
"status": "healthy",
|
|
415
|
+
"metrics": {
|
|
416
|
+
"requests_total": int(api_requests._value.sum()),
|
|
417
|
+
"active_tasks": 0
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
response = await http_client.post(
|
|
422
|
+
f"{BUILDKIT_REGISTRY_URL}/agents/{AGENT_ID}/heartbeat",
|
|
423
|
+
json=heartbeat_data,
|
|
424
|
+
timeout=5.0
|
|
425
|
+
)
|
|
426
|
+
response.raise_for_status()
|
|
427
|
+
|
|
428
|
+
buildkit_heartbeats.labels(status='success').inc()
|
|
429
|
+
|
|
430
|
+
except Exception as e:
|
|
431
|
+
buildkit_heartbeats.labels(status='failed').inc()
|
|
432
|
+
print(f"⚠️ Heartbeat failed: {e}")
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
async def deregister_from_buildkit():
|
|
436
|
+
"""Deregister agent from BuildKit registry"""
|
|
437
|
+
if not http_client:
|
|
438
|
+
return
|
|
439
|
+
|
|
440
|
+
response = await http_client.delete(
|
|
441
|
+
f"{BUILDKIT_REGISTRY_URL}/agents/{AGENT_ID}",
|
|
442
|
+
timeout=5.0
|
|
443
|
+
)
|
|
444
|
+
response.raise_for_status()
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
async def heartbeat_loop():
|
|
448
|
+
"""Background task to send periodic heartbeats"""
|
|
449
|
+
while True:
|
|
450
|
+
try:
|
|
451
|
+
await asyncio.sleep(HEARTBEAT_INTERVAL)
|
|
452
|
+
await send_heartbeat()
|
|
453
|
+
except asyncio.CancelledError:
|
|
454
|
+
break
|
|
455
|
+
except Exception as e:
|
|
456
|
+
print(f"⚠️ Heartbeat loop error: {e}")
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
if __name__ == "__main__":
|
|
460
|
+
import uvicorn
|
|
461
|
+
uvicorn.run(app, host="0.0.0.0", port=8000)
|
|
462
|
+
|