aidevops 2.52.1
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/.agent/AGENTS.md +614 -0
- package/.agent/accounts.md +65 -0
- package/.agent/aidevops/add-new-mcp-to-aidevops.md +456 -0
- package/.agent/aidevops/api-integrations.md +335 -0
- package/.agent/aidevops/architecture.md +510 -0
- package/.agent/aidevops/configs.md +274 -0
- package/.agent/aidevops/docs.md +244 -0
- package/.agent/aidevops/extension.md +311 -0
- package/.agent/aidevops/mcp-integrations.md +340 -0
- package/.agent/aidevops/mcp-troubleshooting.md +162 -0
- package/.agent/aidevops/memory-patterns.md +172 -0
- package/.agent/aidevops/providers.md +217 -0
- package/.agent/aidevops/recommendations.md +321 -0
- package/.agent/aidevops/requirements.md +301 -0
- package/.agent/aidevops/resources.md +214 -0
- package/.agent/aidevops/security-requirements.md +174 -0
- package/.agent/aidevops/security.md +350 -0
- package/.agent/aidevops/service-links.md +400 -0
- package/.agent/aidevops/services.md +357 -0
- package/.agent/aidevops/setup.md +153 -0
- package/.agent/aidevops/troubleshooting.md +389 -0
- package/.agent/aidevops.md +124 -0
- package/.agent/build-plus.md +244 -0
- package/.agent/content/guidelines.md +109 -0
- package/.agent/content.md +87 -0
- package/.agent/health.md +59 -0
- package/.agent/legal.md +59 -0
- package/.agent/loop-state/full-loop.local.md +16 -0
- package/.agent/loop-state/ralph-loop.local.md +10 -0
- package/.agent/marketing.md +440 -0
- package/.agent/memory/README.md +260 -0
- package/.agent/onboarding.md +796 -0
- package/.agent/plan-plus.md +245 -0
- package/.agent/research.md +100 -0
- package/.agent/sales.md +333 -0
- package/.agent/scripts/101domains-helper.sh +701 -0
- package/.agent/scripts/add-missing-returns.sh +140 -0
- package/.agent/scripts/agent-browser-helper.sh +311 -0
- package/.agent/scripts/agno-setup.sh +712 -0
- package/.agent/scripts/ahrefs-mcp-wrapper.js +168 -0
- package/.agent/scripts/aidevops-update-check.sh +71 -0
- package/.agent/scripts/ampcode-cli.sh +522 -0
- package/.agent/scripts/auto-version-bump.sh +156 -0
- package/.agent/scripts/autogen-helper.sh +512 -0
- package/.agent/scripts/beads-sync-helper.sh +596 -0
- package/.agent/scripts/closte-helper.sh +5 -0
- package/.agent/scripts/cloudron-helper.sh +321 -0
- package/.agent/scripts/codacy-cli-chunked.sh +581 -0
- package/.agent/scripts/codacy-cli.sh +442 -0
- package/.agent/scripts/code-audit-helper.sh +5 -0
- package/.agent/scripts/coderabbit-cli.sh +417 -0
- package/.agent/scripts/coderabbit-pro-analysis.sh +238 -0
- package/.agent/scripts/commands/code-simplifier.md +86 -0
- package/.agent/scripts/commands/full-loop.md +246 -0
- package/.agent/scripts/commands/postflight-loop.md +103 -0
- package/.agent/scripts/commands/recall.md +182 -0
- package/.agent/scripts/commands/remember.md +132 -0
- package/.agent/scripts/commands/save-todo.md +175 -0
- package/.agent/scripts/commands/session-review.md +154 -0
- package/.agent/scripts/comprehensive-quality-fix.sh +106 -0
- package/.agent/scripts/context-builder-helper.sh +522 -0
- package/.agent/scripts/coolify-cli-helper.sh +674 -0
- package/.agent/scripts/coolify-helper.sh +380 -0
- package/.agent/scripts/crawl4ai-examples.sh +401 -0
- package/.agent/scripts/crawl4ai-helper.sh +1078 -0
- package/.agent/scripts/crewai-helper.sh +681 -0
- package/.agent/scripts/dev-browser-helper.sh +513 -0
- package/.agent/scripts/dns-helper.sh +396 -0
- package/.agent/scripts/domain-research-helper.sh +917 -0
- package/.agent/scripts/dspy-helper.sh +285 -0
- package/.agent/scripts/dspyground-helper.sh +291 -0
- package/.agent/scripts/eeat-score-helper.sh +1242 -0
- package/.agent/scripts/efficient-return-fix.sh +92 -0
- package/.agent/scripts/extract-opencode-prompts.sh +128 -0
- package/.agent/scripts/find-missing-returns.sh +113 -0
- package/.agent/scripts/fix-auth-headers.sh +104 -0
- package/.agent/scripts/fix-common-strings.sh +254 -0
- package/.agent/scripts/fix-content-type.sh +100 -0
- package/.agent/scripts/fix-error-messages.sh +130 -0
- package/.agent/scripts/fix-misplaced-returns.sh +74 -0
- package/.agent/scripts/fix-remaining-literals.sh +152 -0
- package/.agent/scripts/fix-return-statements.sh +41 -0
- package/.agent/scripts/fix-s131-default-cases.sh +249 -0
- package/.agent/scripts/fix-sc2155-simple.sh +102 -0
- package/.agent/scripts/fix-shellcheck-critical.sh +187 -0
- package/.agent/scripts/fix-string-literals.sh +273 -0
- package/.agent/scripts/full-loop-helper.sh +773 -0
- package/.agent/scripts/generate-opencode-agents.sh +497 -0
- package/.agent/scripts/generate-opencode-commands.sh +1629 -0
- package/.agent/scripts/generate-skills.sh +366 -0
- package/.agent/scripts/git-platforms-helper.sh +640 -0
- package/.agent/scripts/gitea-cli-helper.sh +743 -0
- package/.agent/scripts/github-cli-helper.sh +702 -0
- package/.agent/scripts/gitlab-cli-helper.sh +682 -0
- package/.agent/scripts/gsc-add-user-helper.sh +325 -0
- package/.agent/scripts/gsc-sitemap-helper.sh +678 -0
- package/.agent/scripts/hetzner-helper.sh +485 -0
- package/.agent/scripts/hostinger-helper.sh +229 -0
- package/.agent/scripts/keyword-research-helper.sh +1815 -0
- package/.agent/scripts/langflow-helper.sh +544 -0
- package/.agent/scripts/linkedin-automation.py +241 -0
- package/.agent/scripts/linter-manager.sh +599 -0
- package/.agent/scripts/linters-local.sh +434 -0
- package/.agent/scripts/list-keys-helper.sh +488 -0
- package/.agent/scripts/local-browser-automation.py +339 -0
- package/.agent/scripts/localhost-helper.sh +744 -0
- package/.agent/scripts/loop-common.sh +806 -0
- package/.agent/scripts/mainwp-helper.sh +728 -0
- package/.agent/scripts/markdown-formatter.sh +338 -0
- package/.agent/scripts/markdown-lint-fix.sh +311 -0
- package/.agent/scripts/mass-fix-returns.sh +58 -0
- package/.agent/scripts/mcp-diagnose.sh +167 -0
- package/.agent/scripts/mcp-inspector-helper.sh +449 -0
- package/.agent/scripts/memory-helper.sh +650 -0
- package/.agent/scripts/monitor-code-review.sh +255 -0
- package/.agent/scripts/onboarding-helper.sh +706 -0
- package/.agent/scripts/opencode-github-setup-helper.sh +797 -0
- package/.agent/scripts/opencode-test-helper.sh +213 -0
- package/.agent/scripts/pagespeed-helper.sh +464 -0
- package/.agent/scripts/pandoc-helper.sh +362 -0
- package/.agent/scripts/postflight-check.sh +555 -0
- package/.agent/scripts/pre-commit-hook.sh +259 -0
- package/.agent/scripts/pre-edit-check.sh +169 -0
- package/.agent/scripts/qlty-cli.sh +356 -0
- package/.agent/scripts/quality-cli-manager.sh +525 -0
- package/.agent/scripts/quality-feedback-helper.sh +462 -0
- package/.agent/scripts/quality-fix.sh +263 -0
- package/.agent/scripts/quality-loop-helper.sh +1108 -0
- package/.agent/scripts/ralph-loop-helper.sh +836 -0
- package/.agent/scripts/ralph-upstream-check.sh +341 -0
- package/.agent/scripts/secretlint-helper.sh +847 -0
- package/.agent/scripts/servers-helper.sh +241 -0
- package/.agent/scripts/ses-helper.sh +619 -0
- package/.agent/scripts/session-review-helper.sh +404 -0
- package/.agent/scripts/setup-linters-wizard.sh +379 -0
- package/.agent/scripts/setup-local-api-keys.sh +330 -0
- package/.agent/scripts/setup-mcp-integrations.sh +472 -0
- package/.agent/scripts/shared-constants.sh +246 -0
- package/.agent/scripts/site-crawler-helper.sh +1487 -0
- package/.agent/scripts/snyk-helper.sh +940 -0
- package/.agent/scripts/sonarcloud-autofix.sh +193 -0
- package/.agent/scripts/sonarcloud-cli.sh +191 -0
- package/.agent/scripts/sonarscanner-cli.sh +455 -0
- package/.agent/scripts/spaceship-helper.sh +747 -0
- package/.agent/scripts/stagehand-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-setup.sh +441 -0
- package/.agent/scripts/stagehand-setup.sh +439 -0
- package/.agent/scripts/system-cleanup.sh +340 -0
- package/.agent/scripts/terminal-title-helper.sh +388 -0
- package/.agent/scripts/terminal-title-setup.sh +549 -0
- package/.agent/scripts/test-stagehand-both-integration.sh +317 -0
- package/.agent/scripts/test-stagehand-integration.sh +309 -0
- package/.agent/scripts/test-stagehand-python-integration.sh +341 -0
- package/.agent/scripts/todo-ready.sh +263 -0
- package/.agent/scripts/tool-version-check.sh +362 -0
- package/.agent/scripts/toon-helper.sh +469 -0
- package/.agent/scripts/twilio-helper.sh +917 -0
- package/.agent/scripts/updown-helper.sh +279 -0
- package/.agent/scripts/validate-mcp-integrations.sh +250 -0
- package/.agent/scripts/validate-version-consistency.sh +131 -0
- package/.agent/scripts/vaultwarden-helper.sh +597 -0
- package/.agent/scripts/vercel-cli-helper.sh +816 -0
- package/.agent/scripts/verify-mirrors.sh +169 -0
- package/.agent/scripts/version-manager.sh +831 -0
- package/.agent/scripts/webhosting-helper.sh +471 -0
- package/.agent/scripts/webhosting-verify.sh +238 -0
- package/.agent/scripts/wordpress-mcp-helper.sh +508 -0
- package/.agent/scripts/worktree-helper.sh +595 -0
- package/.agent/scripts/worktree-sessions.sh +577 -0
- package/.agent/seo/dataforseo.md +215 -0
- package/.agent/seo/domain-research.md +532 -0
- package/.agent/seo/eeat-score.md +659 -0
- package/.agent/seo/google-search-console.md +366 -0
- package/.agent/seo/gsc-sitemaps.md +282 -0
- package/.agent/seo/keyword-research.md +521 -0
- package/.agent/seo/serper.md +278 -0
- package/.agent/seo/site-crawler.md +387 -0
- package/.agent/seo.md +236 -0
- package/.agent/services/accounting/quickfile.md +159 -0
- package/.agent/services/communications/telfon.md +470 -0
- package/.agent/services/communications/twilio.md +569 -0
- package/.agent/services/crm/fluentcrm.md +449 -0
- package/.agent/services/email/ses.md +399 -0
- package/.agent/services/hosting/101domains.md +378 -0
- package/.agent/services/hosting/closte.md +177 -0
- package/.agent/services/hosting/cloudflare.md +251 -0
- package/.agent/services/hosting/cloudron.md +478 -0
- package/.agent/services/hosting/dns-providers.md +335 -0
- package/.agent/services/hosting/domain-purchasing.md +344 -0
- package/.agent/services/hosting/hetzner.md +327 -0
- package/.agent/services/hosting/hostinger.md +287 -0
- package/.agent/services/hosting/localhost.md +419 -0
- package/.agent/services/hosting/spaceship.md +353 -0
- package/.agent/services/hosting/webhosting.md +330 -0
- package/.agent/social-media.md +69 -0
- package/.agent/templates/plans-template.md +114 -0
- package/.agent/templates/prd-template.md +129 -0
- package/.agent/templates/tasks-template.md +108 -0
- package/.agent/templates/todo-template.md +89 -0
- package/.agent/tools/ai-assistants/agno.md +471 -0
- package/.agent/tools/ai-assistants/capsolver.md +326 -0
- package/.agent/tools/ai-assistants/configuration.md +221 -0
- package/.agent/tools/ai-assistants/overview.md +209 -0
- package/.agent/tools/ai-assistants/status.md +171 -0
- package/.agent/tools/ai-assistants/windsurf.md +193 -0
- package/.agent/tools/ai-orchestration/autogen.md +406 -0
- package/.agent/tools/ai-orchestration/crewai.md +445 -0
- package/.agent/tools/ai-orchestration/langflow.md +405 -0
- package/.agent/tools/ai-orchestration/openprose.md +487 -0
- package/.agent/tools/ai-orchestration/overview.md +362 -0
- package/.agent/tools/ai-orchestration/packaging.md +647 -0
- package/.agent/tools/browser/agent-browser.md +464 -0
- package/.agent/tools/browser/browser-automation.md +400 -0
- package/.agent/tools/browser/chrome-devtools.md +282 -0
- package/.agent/tools/browser/crawl4ai-integration.md +422 -0
- package/.agent/tools/browser/crawl4ai-resources.md +277 -0
- package/.agent/tools/browser/crawl4ai-usage.md +416 -0
- package/.agent/tools/browser/crawl4ai.md +585 -0
- package/.agent/tools/browser/dev-browser.md +341 -0
- package/.agent/tools/browser/pagespeed.md +260 -0
- package/.agent/tools/browser/playwright.md +266 -0
- package/.agent/tools/browser/playwriter.md +310 -0
- package/.agent/tools/browser/stagehand-examples.md +456 -0
- package/.agent/tools/browser/stagehand-python.md +483 -0
- package/.agent/tools/browser/stagehand.md +421 -0
- package/.agent/tools/build-agent/agent-review.md +224 -0
- package/.agent/tools/build-agent/build-agent.md +784 -0
- package/.agent/tools/build-mcp/aidevops-plugin.md +476 -0
- package/.agent/tools/build-mcp/api-wrapper.md +445 -0
- package/.agent/tools/build-mcp/build-mcp.md +240 -0
- package/.agent/tools/build-mcp/deployment.md +401 -0
- package/.agent/tools/build-mcp/server-patterns.md +632 -0
- package/.agent/tools/build-mcp/transports.md +366 -0
- package/.agent/tools/code-review/auditing.md +383 -0
- package/.agent/tools/code-review/automation.md +219 -0
- package/.agent/tools/code-review/best-practices.md +203 -0
- package/.agent/tools/code-review/codacy.md +151 -0
- package/.agent/tools/code-review/code-simplifier.md +174 -0
- package/.agent/tools/code-review/code-standards.md +309 -0
- package/.agent/tools/code-review/coderabbit.md +101 -0
- package/.agent/tools/code-review/management.md +155 -0
- package/.agent/tools/code-review/qlty.md +248 -0
- package/.agent/tools/code-review/secretlint.md +565 -0
- package/.agent/tools/code-review/setup.md +250 -0
- package/.agent/tools/code-review/snyk.md +563 -0
- package/.agent/tools/code-review/tools.md +230 -0
- package/.agent/tools/content/summarize.md +353 -0
- package/.agent/tools/context/augment-context-engine.md +468 -0
- package/.agent/tools/context/context-builder-agent.md +76 -0
- package/.agent/tools/context/context-builder.md +375 -0
- package/.agent/tools/context/context7.md +371 -0
- package/.agent/tools/context/dspy.md +302 -0
- package/.agent/tools/context/dspyground.md +374 -0
- package/.agent/tools/context/llm-tldr.md +219 -0
- package/.agent/tools/context/osgrep.md +488 -0
- package/.agent/tools/context/prompt-optimization.md +338 -0
- package/.agent/tools/context/toon.md +292 -0
- package/.agent/tools/conversion/pandoc.md +304 -0
- package/.agent/tools/credentials/api-key-management.md +154 -0
- package/.agent/tools/credentials/api-key-setup.md +224 -0
- package/.agent/tools/credentials/environment-variables.md +180 -0
- package/.agent/tools/credentials/vaultwarden.md +382 -0
- package/.agent/tools/data-extraction/outscraper.md +974 -0
- package/.agent/tools/deployment/coolify-cli.md +388 -0
- package/.agent/tools/deployment/coolify-setup.md +353 -0
- package/.agent/tools/deployment/coolify.md +345 -0
- package/.agent/tools/deployment/vercel.md +390 -0
- package/.agent/tools/git/authentication.md +132 -0
- package/.agent/tools/git/gitea-cli.md +193 -0
- package/.agent/tools/git/github-actions.md +207 -0
- package/.agent/tools/git/github-cli.md +223 -0
- package/.agent/tools/git/gitlab-cli.md +190 -0
- package/.agent/tools/git/opencode-github-security.md +350 -0
- package/.agent/tools/git/opencode-github.md +328 -0
- package/.agent/tools/git/opencode-gitlab.md +252 -0
- package/.agent/tools/git/security.md +196 -0
- package/.agent/tools/git.md +207 -0
- package/.agent/tools/opencode/oh-my-opencode.md +375 -0
- package/.agent/tools/opencode/opencode-anthropic-auth.md +446 -0
- package/.agent/tools/opencode/opencode.md +651 -0
- package/.agent/tools/social-media/bird.md +437 -0
- package/.agent/tools/task-management/beads.md +336 -0
- package/.agent/tools/terminal/terminal-title.md +251 -0
- package/.agent/tools/ui/shadcn.md +196 -0
- package/.agent/tools/ui/ui-skills.md +115 -0
- package/.agent/tools/wordpress/localwp.md +311 -0
- package/.agent/tools/wordpress/mainwp.md +391 -0
- package/.agent/tools/wordpress/scf.md +527 -0
- package/.agent/tools/wordpress/wp-admin.md +729 -0
- package/.agent/tools/wordpress/wp-dev.md +940 -0
- package/.agent/tools/wordpress/wp-preferred.md +398 -0
- package/.agent/tools/wordpress.md +95 -0
- package/.agent/workflows/branch/bugfix.md +63 -0
- package/.agent/workflows/branch/chore.md +95 -0
- package/.agent/workflows/branch/experiment.md +115 -0
- package/.agent/workflows/branch/feature.md +59 -0
- package/.agent/workflows/branch/hotfix.md +98 -0
- package/.agent/workflows/branch/refactor.md +92 -0
- package/.agent/workflows/branch/release.md +96 -0
- package/.agent/workflows/branch.md +347 -0
- package/.agent/workflows/bug-fixing.md +267 -0
- package/.agent/workflows/changelog.md +129 -0
- package/.agent/workflows/code-audit-remote.md +279 -0
- package/.agent/workflows/conversation-starter.md +69 -0
- package/.agent/workflows/error-feedback.md +578 -0
- package/.agent/workflows/feature-development.md +355 -0
- package/.agent/workflows/git-workflow.md +702 -0
- package/.agent/workflows/multi-repo-workspace.md +268 -0
- package/.agent/workflows/plans.md +709 -0
- package/.agent/workflows/postflight.md +604 -0
- package/.agent/workflows/pr.md +571 -0
- package/.agent/workflows/preflight.md +278 -0
- package/.agent/workflows/ralph-loop.md +773 -0
- package/.agent/workflows/release.md +498 -0
- package/.agent/workflows/session-manager.md +254 -0
- package/.agent/workflows/session-review.md +311 -0
- package/.agent/workflows/sql-migrations.md +631 -0
- package/.agent/workflows/version-bump.md +283 -0
- package/.agent/workflows/wiki-update.md +333 -0
- package/.agent/workflows/worktree.md +477 -0
- package/LICENSE +21 -0
- package/README.md +1446 -0
- package/VERSION +1 -0
- package/aidevops.sh +1746 -0
- package/bin/aidevops +21 -0
- package/package.json +75 -0
- package/scripts/npm-postinstall.js +60 -0
- package/setup.sh +2366 -0
|
@@ -0,0 +1,647 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Packaging AI orchestration automations into deployable services
|
|
3
|
+
mode: subagent
|
|
4
|
+
tools:
|
|
5
|
+
read: true
|
|
6
|
+
write: true
|
|
7
|
+
edit: true
|
|
8
|
+
bash: true
|
|
9
|
+
glob: true
|
|
10
|
+
grep: true
|
|
11
|
+
webfetch: true
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Packaging AI Automations for Deployment
|
|
15
|
+
|
|
16
|
+
<!-- AI-CONTEXT-START -->
|
|
17
|
+
|
|
18
|
+
## Quick Reference
|
|
19
|
+
|
|
20
|
+
- **Purpose**: Turn AI orchestration workflows into deployable services
|
|
21
|
+
- **Targets**: Web/SaaS, Desktop apps, Mobile backends, APIs
|
|
22
|
+
- **Principle**: Zero lock-in, standard Python dependencies, exportable
|
|
23
|
+
|
|
24
|
+
**Deployment Options**:
|
|
25
|
+
|
|
26
|
+
| Target | Technology | Best For |
|
|
27
|
+
|--------|------------|----------|
|
|
28
|
+
| Web API | FastAPI + Docker | SaaS, microservices |
|
|
29
|
+
| Desktop | PyInstaller | Offline tools |
|
|
30
|
+
| Mobile Backend | FastAPI + Cloud | App backends |
|
|
31
|
+
| Serverless | Vercel/AWS Lambda | Event-driven |
|
|
32
|
+
|
|
33
|
+
**Quick Commands**:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Build Docker image
|
|
37
|
+
docker build -t my-agent-api .
|
|
38
|
+
|
|
39
|
+
# Create executable
|
|
40
|
+
pyinstaller --onefile main.py
|
|
41
|
+
|
|
42
|
+
# Deploy to Vercel
|
|
43
|
+
vercel deploy
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
<!-- AI-CONTEXT-END -->
|
|
47
|
+
|
|
48
|
+
## Overview
|
|
49
|
+
|
|
50
|
+
This guide covers packaging AI orchestration automations (Langflow, CrewAI, AutoGen, Agno) into production-ready services. The focus is on zero lock-in approaches using standard Python dependencies.
|
|
51
|
+
|
|
52
|
+
## Web/SaaS Deployment
|
|
53
|
+
|
|
54
|
+
### FastAPI Backend
|
|
55
|
+
|
|
56
|
+
Create a REST API for your AI agents:
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
# api/main.py
|
|
60
|
+
from fastapi import FastAPI, HTTPException
|
|
61
|
+
from pydantic import BaseModel
|
|
62
|
+
from typing import Optional
|
|
63
|
+
import asyncio
|
|
64
|
+
|
|
65
|
+
app = FastAPI(
|
|
66
|
+
title="AI Agent API",
|
|
67
|
+
description="AI DevOps Framework - Agent Service",
|
|
68
|
+
version="1.0.0"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
class AgentRequest(BaseModel):
|
|
72
|
+
task: str
|
|
73
|
+
context: Optional[dict] = None
|
|
74
|
+
|
|
75
|
+
class AgentResponse(BaseModel):
|
|
76
|
+
result: str
|
|
77
|
+
status: str
|
|
78
|
+
|
|
79
|
+
# CrewAI endpoint
|
|
80
|
+
@app.post("/crew/run", response_model=AgentResponse)
|
|
81
|
+
async def run_crew(request: AgentRequest):
|
|
82
|
+
from crewai import Crew, Agent, Task
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
agent = Agent(
|
|
86
|
+
role="Assistant",
|
|
87
|
+
goal="Complete the requested task",
|
|
88
|
+
backstory="You are a helpful AI assistant."
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
task = Task(
|
|
92
|
+
description=request.task,
|
|
93
|
+
expected_output="Task completion result",
|
|
94
|
+
agent=agent
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
crew = Crew(agents=[agent], tasks=[task])
|
|
98
|
+
result = crew.kickoff()
|
|
99
|
+
|
|
100
|
+
return AgentResponse(result=str(result), status="success")
|
|
101
|
+
except Exception as e:
|
|
102
|
+
raise HTTPException(status_code=500, detail=str(e))
|
|
103
|
+
|
|
104
|
+
# AutoGen endpoint
|
|
105
|
+
@app.post("/autogen/chat", response_model=AgentResponse)
|
|
106
|
+
async def autogen_chat(request: AgentRequest):
|
|
107
|
+
from autogen_agentchat.agents import AssistantAgent
|
|
108
|
+
from autogen_ext.models.openai import OpenAIChatCompletionClient
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
model_client = OpenAIChatCompletionClient(model="gpt-4o-mini")
|
|
112
|
+
agent = AssistantAgent("assistant", model_client=model_client)
|
|
113
|
+
result = await agent.run(task=request.task)
|
|
114
|
+
await model_client.close()
|
|
115
|
+
|
|
116
|
+
return AgentResponse(result=str(result), status="success")
|
|
117
|
+
except Exception as e:
|
|
118
|
+
raise HTTPException(status_code=500, detail=str(e))
|
|
119
|
+
|
|
120
|
+
# Health check
|
|
121
|
+
@app.get("/health")
|
|
122
|
+
async def health_check():
|
|
123
|
+
return {"status": "healthy"}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Docker Deployment
|
|
127
|
+
|
|
128
|
+
```dockerfile
|
|
129
|
+
# Dockerfile
|
|
130
|
+
FROM python:3.11-slim
|
|
131
|
+
|
|
132
|
+
WORKDIR /app
|
|
133
|
+
|
|
134
|
+
# Install dependencies
|
|
135
|
+
COPY requirements.txt .
|
|
136
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
137
|
+
|
|
138
|
+
# Copy application
|
|
139
|
+
COPY . .
|
|
140
|
+
|
|
141
|
+
# Expose port
|
|
142
|
+
EXPOSE 8000
|
|
143
|
+
|
|
144
|
+
# Run with uvicorn
|
|
145
|
+
CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**requirements.txt**:
|
|
149
|
+
|
|
150
|
+
```text
|
|
151
|
+
fastapi>=0.100.0
|
|
152
|
+
uvicorn>=0.23.0
|
|
153
|
+
crewai>=0.1.0
|
|
154
|
+
autogen-agentchat>=0.4.0
|
|
155
|
+
autogen-ext[openai]>=0.4.0
|
|
156
|
+
python-dotenv>=1.0.0
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Docker Compose
|
|
160
|
+
|
|
161
|
+
```yaml
|
|
162
|
+
# docker-compose.yml
|
|
163
|
+
version: '3.8'
|
|
164
|
+
|
|
165
|
+
services:
|
|
166
|
+
agent-api:
|
|
167
|
+
build: .
|
|
168
|
+
ports:
|
|
169
|
+
- "8000:8000"
|
|
170
|
+
environment:
|
|
171
|
+
- OPENAI_API_KEY=${OPENAI_API_KEY}
|
|
172
|
+
volumes:
|
|
173
|
+
- ./data:/app/data
|
|
174
|
+
restart: unless-stopped
|
|
175
|
+
healthcheck:
|
|
176
|
+
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
|
|
177
|
+
interval: 30s
|
|
178
|
+
timeout: 10s
|
|
179
|
+
retries: 3
|
|
180
|
+
|
|
181
|
+
# Optional: Redis for caching
|
|
182
|
+
redis:
|
|
183
|
+
image: redis:alpine
|
|
184
|
+
ports:
|
|
185
|
+
- "6379:6379"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Kubernetes Deployment
|
|
189
|
+
|
|
190
|
+
```yaml
|
|
191
|
+
# k8s/deployment.yaml
|
|
192
|
+
apiVersion: apps/v1
|
|
193
|
+
kind: Deployment
|
|
194
|
+
metadata:
|
|
195
|
+
name: agent-api
|
|
196
|
+
spec:
|
|
197
|
+
replicas: 3
|
|
198
|
+
selector:
|
|
199
|
+
matchLabels:
|
|
200
|
+
app: agent-api
|
|
201
|
+
template:
|
|
202
|
+
metadata:
|
|
203
|
+
labels:
|
|
204
|
+
app: agent-api
|
|
205
|
+
spec:
|
|
206
|
+
containers:
|
|
207
|
+
- name: agent-api
|
|
208
|
+
image: your-registry/agent-api:latest
|
|
209
|
+
ports:
|
|
210
|
+
- containerPort: 8000
|
|
211
|
+
env:
|
|
212
|
+
- name: OPENAI_API_KEY
|
|
213
|
+
valueFrom:
|
|
214
|
+
secretKeyRef:
|
|
215
|
+
name: api-secrets
|
|
216
|
+
key: openai-key
|
|
217
|
+
resources:
|
|
218
|
+
requests:
|
|
219
|
+
memory: "512Mi"
|
|
220
|
+
cpu: "250m"
|
|
221
|
+
limits:
|
|
222
|
+
memory: "2Gi"
|
|
223
|
+
cpu: "1000m"
|
|
224
|
+
---
|
|
225
|
+
apiVersion: v1
|
|
226
|
+
kind: Service
|
|
227
|
+
metadata:
|
|
228
|
+
name: agent-api-service
|
|
229
|
+
spec:
|
|
230
|
+
selector:
|
|
231
|
+
app: agent-api
|
|
232
|
+
ports:
|
|
233
|
+
- port: 80
|
|
234
|
+
targetPort: 8000
|
|
235
|
+
type: LoadBalancer
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### SaaS Boilerplate
|
|
239
|
+
|
|
240
|
+
Add authentication and billing:
|
|
241
|
+
|
|
242
|
+
```python
|
|
243
|
+
# api/auth.py
|
|
244
|
+
from fastapi import Depends, HTTPException, Security
|
|
245
|
+
from fastapi.security import APIKeyHeader
|
|
246
|
+
import stripe
|
|
247
|
+
|
|
248
|
+
api_key_header = APIKeyHeader(name="X-API-Key")
|
|
249
|
+
|
|
250
|
+
async def verify_api_key(api_key: str = Security(api_key_header)):
|
|
251
|
+
# Verify API key against database
|
|
252
|
+
if not is_valid_key(api_key):
|
|
253
|
+
raise HTTPException(status_code=403, detail="Invalid API key")
|
|
254
|
+
return api_key
|
|
255
|
+
|
|
256
|
+
# api/billing.py
|
|
257
|
+
stripe.api_key = os.getenv("STRIPE_SECRET_KEY")
|
|
258
|
+
|
|
259
|
+
def create_usage_record(customer_id: str, quantity: int):
|
|
260
|
+
"""Record API usage for billing"""
|
|
261
|
+
stripe.SubscriptionItem.create_usage_record(
|
|
262
|
+
subscription_item_id=get_subscription_item(customer_id),
|
|
263
|
+
quantity=quantity,
|
|
264
|
+
timestamp=int(time.time())
|
|
265
|
+
)
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## Desktop Application
|
|
269
|
+
|
|
270
|
+
### PyInstaller Executable
|
|
271
|
+
|
|
272
|
+
```python
|
|
273
|
+
# desktop/main.py
|
|
274
|
+
import sys
|
|
275
|
+
import tkinter as tk
|
|
276
|
+
from tkinter import ttk, scrolledtext
|
|
277
|
+
import threading
|
|
278
|
+
|
|
279
|
+
class AgentApp:
|
|
280
|
+
def __init__(self, root):
|
|
281
|
+
self.root = root
|
|
282
|
+
self.root.title("AI Agent Desktop")
|
|
283
|
+
self.root.geometry("800x600")
|
|
284
|
+
|
|
285
|
+
# Input frame
|
|
286
|
+
input_frame = ttk.Frame(root, padding="10")
|
|
287
|
+
input_frame.pack(fill=tk.X)
|
|
288
|
+
|
|
289
|
+
ttk.Label(input_frame, text="Task:").pack(side=tk.LEFT)
|
|
290
|
+
self.task_entry = ttk.Entry(input_frame, width=60)
|
|
291
|
+
self.task_entry.pack(side=tk.LEFT, padx=5)
|
|
292
|
+
|
|
293
|
+
self.run_btn = ttk.Button(input_frame, text="Run", command=self.run_agent)
|
|
294
|
+
self.run_btn.pack(side=tk.LEFT)
|
|
295
|
+
|
|
296
|
+
# Output area
|
|
297
|
+
self.output = scrolledtext.ScrolledText(root, height=30)
|
|
298
|
+
self.output.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
|
|
299
|
+
|
|
300
|
+
def run_agent(self):
|
|
301
|
+
task = self.task_entry.get()
|
|
302
|
+
if not task:
|
|
303
|
+
return
|
|
304
|
+
|
|
305
|
+
self.run_btn.config(state=tk.DISABLED)
|
|
306
|
+
self.output.insert(tk.END, f"\n> Running: {task}\n")
|
|
307
|
+
|
|
308
|
+
# Run in background thread
|
|
309
|
+
thread = threading.Thread(target=self._execute_agent, args=(task,))
|
|
310
|
+
thread.start()
|
|
311
|
+
|
|
312
|
+
def _execute_agent(self, task):
|
|
313
|
+
try:
|
|
314
|
+
from crewai import Crew, Agent, Task
|
|
315
|
+
|
|
316
|
+
agent = Agent(
|
|
317
|
+
role="Assistant",
|
|
318
|
+
goal="Help with tasks",
|
|
319
|
+
backstory="Helpful AI assistant"
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
crew_task = Task(
|
|
323
|
+
description=task,
|
|
324
|
+
expected_output="Result",
|
|
325
|
+
agent=agent
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
crew = Crew(agents=[agent], tasks=[crew_task])
|
|
329
|
+
result = crew.kickoff()
|
|
330
|
+
|
|
331
|
+
self.root.after(0, lambda: self._show_result(str(result)))
|
|
332
|
+
except Exception as e:
|
|
333
|
+
self.root.after(0, lambda: self._show_result(f"Error: {e}"))
|
|
334
|
+
|
|
335
|
+
def _show_result(self, result):
|
|
336
|
+
self.output.insert(tk.END, f"\nResult:\n{result}\n")
|
|
337
|
+
self.run_btn.config(state=tk.NORMAL)
|
|
338
|
+
|
|
339
|
+
if __name__ == "__main__":
|
|
340
|
+
root = tk.Tk()
|
|
341
|
+
app = AgentApp(root)
|
|
342
|
+
root.mainloop()
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**Build executable**:
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# Install PyInstaller
|
|
349
|
+
pip install pyinstaller
|
|
350
|
+
|
|
351
|
+
# Build single executable
|
|
352
|
+
pyinstaller --onefile --windowed desktop/main.py
|
|
353
|
+
|
|
354
|
+
# Output in dist/main.exe (Windows) or dist/main (macOS/Linux)
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Electron Wrapper
|
|
358
|
+
|
|
359
|
+
For a more polished desktop experience:
|
|
360
|
+
|
|
361
|
+
```javascript
|
|
362
|
+
// electron/main.js
|
|
363
|
+
const { app, BrowserWindow } = require('electron');
|
|
364
|
+
const { spawn } = require('child_process');
|
|
365
|
+
const path = require('path');
|
|
366
|
+
|
|
367
|
+
let mainWindow;
|
|
368
|
+
let pythonProcess;
|
|
369
|
+
|
|
370
|
+
function createWindow() {
|
|
371
|
+
mainWindow = new BrowserWindow({
|
|
372
|
+
width: 1200,
|
|
373
|
+
height: 800,
|
|
374
|
+
webPreferences: {
|
|
375
|
+
nodeIntegration: true,
|
|
376
|
+
contextIsolation: false
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
// Start Python backend
|
|
381
|
+
pythonProcess = spawn('python', [
|
|
382
|
+
path.join(__dirname, 'backend', 'server.py')
|
|
383
|
+
]);
|
|
384
|
+
|
|
385
|
+
// Load frontend
|
|
386
|
+
mainWindow.loadFile('index.html');
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
app.whenReady().then(createWindow);
|
|
390
|
+
|
|
391
|
+
app.on('window-all-closed', () => {
|
|
392
|
+
if (pythonProcess) pythonProcess.kill();
|
|
393
|
+
if (process.platform !== 'darwin') app.quit();
|
|
394
|
+
});
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
## Mobile Backend
|
|
398
|
+
|
|
399
|
+
### API for Mobile Apps
|
|
400
|
+
|
|
401
|
+
```python
|
|
402
|
+
# mobile_api/main.py
|
|
403
|
+
from fastapi import FastAPI, BackgroundTasks
|
|
404
|
+
from pydantic import BaseModel
|
|
405
|
+
import uuid
|
|
406
|
+
|
|
407
|
+
app = FastAPI()
|
|
408
|
+
|
|
409
|
+
# In-memory task storage (use Redis in production)
|
|
410
|
+
tasks = {}
|
|
411
|
+
|
|
412
|
+
class MobileRequest(BaseModel):
|
|
413
|
+
task: str
|
|
414
|
+
user_id: str
|
|
415
|
+
|
|
416
|
+
class TaskStatus(BaseModel):
|
|
417
|
+
task_id: str
|
|
418
|
+
status: str
|
|
419
|
+
result: str = None
|
|
420
|
+
|
|
421
|
+
@app.post("/tasks/create")
|
|
422
|
+
async def create_task(request: MobileRequest, background_tasks: BackgroundTasks):
|
|
423
|
+
task_id = str(uuid.uuid4())
|
|
424
|
+
tasks[task_id] = {"status": "pending", "result": None}
|
|
425
|
+
|
|
426
|
+
# Run in background
|
|
427
|
+
background_tasks.add_task(process_task, task_id, request.task)
|
|
428
|
+
|
|
429
|
+
return {"task_id": task_id}
|
|
430
|
+
|
|
431
|
+
@app.get("/tasks/{task_id}", response_model=TaskStatus)
|
|
432
|
+
async def get_task_status(task_id: str):
|
|
433
|
+
if task_id not in tasks:
|
|
434
|
+
raise HTTPException(status_code=404, detail="Task not found")
|
|
435
|
+
|
|
436
|
+
return TaskStatus(
|
|
437
|
+
task_id=task_id,
|
|
438
|
+
status=tasks[task_id]["status"],
|
|
439
|
+
result=tasks[task_id]["result"]
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
async def process_task(task_id: str, task: str):
|
|
443
|
+
tasks[task_id]["status"] = "processing"
|
|
444
|
+
|
|
445
|
+
try:
|
|
446
|
+
# Run your agent here
|
|
447
|
+
result = await run_agent(task)
|
|
448
|
+
tasks[task_id]["result"] = result
|
|
449
|
+
tasks[task_id]["status"] = "completed"
|
|
450
|
+
except Exception as e:
|
|
451
|
+
tasks[task_id]["result"] = str(e)
|
|
452
|
+
tasks[task_id]["status"] = "failed"
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### React Native Integration
|
|
456
|
+
|
|
457
|
+
```javascript
|
|
458
|
+
// mobile/AgentService.js
|
|
459
|
+
const API_URL = 'https://your-api.com';
|
|
460
|
+
|
|
461
|
+
export async function createTask(task, userId) {
|
|
462
|
+
const response = await fetch(`${API_URL}/tasks/create`, {
|
|
463
|
+
method: 'POST',
|
|
464
|
+
headers: {
|
|
465
|
+
'Content-Type': 'application/json',
|
|
466
|
+
'Authorization': `Bearer ${getToken()}`
|
|
467
|
+
},
|
|
468
|
+
body: JSON.stringify({ task, user_id: userId })
|
|
469
|
+
});
|
|
470
|
+
return response.json();
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
export async function pollTaskStatus(taskId) {
|
|
474
|
+
const response = await fetch(`${API_URL}/tasks/${taskId}`);
|
|
475
|
+
return response.json();
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
## Serverless Deployment
|
|
480
|
+
|
|
481
|
+
### Vercel Functions
|
|
482
|
+
|
|
483
|
+
```python
|
|
484
|
+
# api/agent.py (Vercel serverless function)
|
|
485
|
+
from http.server import BaseHTTPRequestHandler
|
|
486
|
+
import json
|
|
487
|
+
|
|
488
|
+
class handler(BaseHTTPRequestHandler):
|
|
489
|
+
def do_POST(self):
|
|
490
|
+
content_length = int(self.headers['Content-Length'])
|
|
491
|
+
post_data = json.loads(self.rfile.read(content_length))
|
|
492
|
+
|
|
493
|
+
task = post_data.get('task', '')
|
|
494
|
+
|
|
495
|
+
# Run agent (keep it lightweight for serverless)
|
|
496
|
+
result = run_lightweight_agent(task)
|
|
497
|
+
|
|
498
|
+
self.send_response(200)
|
|
499
|
+
self.send_header('Content-type', 'application/json')
|
|
500
|
+
self.end_headers()
|
|
501
|
+
self.wfile.write(json.dumps({'result': result}).encode())
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
### AWS Lambda
|
|
505
|
+
|
|
506
|
+
```python
|
|
507
|
+
# lambda_function.py
|
|
508
|
+
import json
|
|
509
|
+
|
|
510
|
+
def lambda_handler(event, context):
|
|
511
|
+
body = json.loads(event.get('body', '{}'))
|
|
512
|
+
task = body.get('task', '')
|
|
513
|
+
|
|
514
|
+
# Run agent
|
|
515
|
+
result = run_agent(task)
|
|
516
|
+
|
|
517
|
+
return {
|
|
518
|
+
'statusCode': 200,
|
|
519
|
+
'body': json.dumps({'result': result})
|
|
520
|
+
}
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
## Export Patterns
|
|
524
|
+
|
|
525
|
+
### Langflow to Standalone
|
|
526
|
+
|
|
527
|
+
```bash
|
|
528
|
+
# Export flow to Python
|
|
529
|
+
langflow export --flow-id <id> --output my_flow.py
|
|
530
|
+
|
|
531
|
+
# The exported file can run independently
|
|
532
|
+
python my_flow.py
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
### CrewAI Project Export
|
|
536
|
+
|
|
537
|
+
```bash
|
|
538
|
+
# Create standalone project
|
|
539
|
+
crewai create crew my-project
|
|
540
|
+
|
|
541
|
+
# Package for distribution
|
|
542
|
+
cd my-project
|
|
543
|
+
pip freeze > requirements.txt
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
### AutoGen Workflow Export
|
|
547
|
+
|
|
548
|
+
```python
|
|
549
|
+
# Save workflow configuration
|
|
550
|
+
import json
|
|
551
|
+
|
|
552
|
+
workflow_config = {
|
|
553
|
+
"agents": [
|
|
554
|
+
{"name": "researcher", "role": "Research specialist"},
|
|
555
|
+
{"name": "writer", "role": "Content writer"}
|
|
556
|
+
],
|
|
557
|
+
"tasks": [
|
|
558
|
+
{"description": "Research topic", "agent": "researcher"},
|
|
559
|
+
{"description": "Write report", "agent": "writer"}
|
|
560
|
+
]
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
with open("workflow.json", "w") as f:
|
|
564
|
+
json.dump(workflow_config, f, indent=2)
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
## CI/CD Integration
|
|
568
|
+
|
|
569
|
+
### GitHub Actions
|
|
570
|
+
|
|
571
|
+
```yaml
|
|
572
|
+
# .github/workflows/deploy.yml
|
|
573
|
+
name: Deploy Agent API
|
|
574
|
+
|
|
575
|
+
on:
|
|
576
|
+
push:
|
|
577
|
+
branches: [main]
|
|
578
|
+
|
|
579
|
+
jobs:
|
|
580
|
+
deploy:
|
|
581
|
+
runs-on: ubuntu-latest
|
|
582
|
+
steps:
|
|
583
|
+
- uses: actions/checkout@v4
|
|
584
|
+
|
|
585
|
+
- name: Set up Python
|
|
586
|
+
uses: actions/setup-python@v5
|
|
587
|
+
with:
|
|
588
|
+
python-version: '3.11'
|
|
589
|
+
|
|
590
|
+
- name: Install dependencies
|
|
591
|
+
run: pip install -r requirements.txt
|
|
592
|
+
|
|
593
|
+
- name: Run tests
|
|
594
|
+
run: pytest tests/
|
|
595
|
+
|
|
596
|
+
- name: Build Docker image
|
|
597
|
+
run: docker build -t agent-api .
|
|
598
|
+
|
|
599
|
+
- name: Push to registry
|
|
600
|
+
run: |
|
|
601
|
+
docker tag agent-api ${{ secrets.REGISTRY }}/agent-api:${{ github.sha }}
|
|
602
|
+
docker push ${{ secrets.REGISTRY }}/agent-api:${{ github.sha }}
|
|
603
|
+
|
|
604
|
+
- name: Deploy to Kubernetes
|
|
605
|
+
run: |
|
|
606
|
+
kubectl set image deployment/agent-api \
|
|
607
|
+
agent-api=${{ secrets.REGISTRY }}/agent-api:${{ github.sha }}
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
## Best Practices
|
|
611
|
+
|
|
612
|
+
### Zero Lock-in
|
|
613
|
+
|
|
614
|
+
1. Use standard Python dependencies
|
|
615
|
+
2. Export configurations to JSON/YAML
|
|
616
|
+
3. Avoid proprietary formats
|
|
617
|
+
4. Document all external dependencies
|
|
618
|
+
|
|
619
|
+
### Security
|
|
620
|
+
|
|
621
|
+
1. Never hardcode API keys
|
|
622
|
+
2. Use environment variables or secret managers
|
|
623
|
+
3. Implement rate limiting
|
|
624
|
+
4. Add authentication for production APIs
|
|
625
|
+
|
|
626
|
+
### Performance
|
|
627
|
+
|
|
628
|
+
1. Use async/await for I/O operations
|
|
629
|
+
2. Implement caching where appropriate
|
|
630
|
+
3. Consider connection pooling for databases
|
|
631
|
+
4. Monitor memory usage with multiple agents
|
|
632
|
+
|
|
633
|
+
### Monitoring
|
|
634
|
+
|
|
635
|
+
```python
|
|
636
|
+
# Add observability
|
|
637
|
+
from opentelemetry import trace
|
|
638
|
+
from prometheus_client import Counter, Histogram
|
|
639
|
+
|
|
640
|
+
agent_requests = Counter('agent_requests_total', 'Total agent requests')
|
|
641
|
+
agent_latency = Histogram('agent_latency_seconds', 'Agent request latency')
|
|
642
|
+
|
|
643
|
+
@agent_latency.time()
|
|
644
|
+
async def run_agent_with_metrics(task):
|
|
645
|
+
agent_requests.inc()
|
|
646
|
+
return await run_agent(task)
|
|
647
|
+
```
|