Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions .github/workflows/agent-ci-probe.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: Agent CI probe

on:
pull_request:
paths:
- .github/workflows/agent-ci-probe.yml
- wikify/agent_ci_probe.py

permissions:
contents: read

jobs:
probe:
runs-on: ubuntu-latest
timeout-minutes: 30
env:
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
services:
redis-cache:
image: redis:alpine
ports:
- 13000:6379
redis-queue:
image: redis:alpine
ports:
- 11000:6379
mariadb:
image: mariadb:11.8
env:
MYSQL_ROOT_PASSWORD: root
ports:
- 3306:3306
options: --health-cmd="mariadb-admin ping" --health-interval=5s --health-timeout=2s --health-retries=3
steps:
- uses: actions/checkout@v7
- uses: ./.github/actions/e2e-site
- name: Direct turn
shell: bash
working-directory: /home/runner/frappe-bench
run: bench --site wikify.localhost execute wikify.agent_ci_probe.direct
- name: Worker turn
if: always()
shell: bash
working-directory: /home/runner/frappe-bench
run: |
bench --site wikify.localhost execute wikify.agent_ci_probe.worker
echo "----- worker log tail"
tail -n 80 logs/e2e-worker.log
68 changes: 68 additions & 0 deletions wikify/agent_ci_probe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import os
import shutil
import time

import frappe

from wikify.agent import session
from wikify.agent.loop import AgentRunner
from wikify.engine import claude_cli


def environment():
print("which claude:", shutil.which("claude"), "| HOME:", os.environ.get("HOME"))
print("token set:", bool(os.environ.get("CLAUDE_CODE_OAUTH_TOKEN")), "| is_enabled:", claude_cli.is_enabled())
try:
print("plain run:", claude_cli.run([{"role": "user", "content": "Reply with exactly: ok"}])["result"])
except Exception as exception:
print("plain run FAILED:", repr(exception))


def start_turn():
sess = session.get_or_create(None, user="Administrator", scope="global")
session.append_message(sess.name, "user", "List my projects", status="done", attachments=[])
session.set_running(sess.name, True)
frappe.db.commit()
return sess.name


def report(session_id, started):
print("turn took", round(time.time() - started, 1), "s")
for row in frappe.get_all(
"Wikify Agent Message",
filters={"session": session_id},
fields=["role", "status", "content", "tool_name"],
order_by="creation asc",
):
print(f" {row.role:9} {row.status or '':9} {row.tool_name or '':12} {(row.content or '')[:160]!r}")
for error in frappe.get_all(
"Error Log", filters={"method": "Wikify agent run failed"}, fields=["error"], order_by="creation desc"
):
print(error.error[-3000:])


def direct():
frappe.set_user("Administrator")
environment()
session_id = start_turn()
started = time.time()
AgentRunner(session_id, "Administrator", attachments=[]).run()
report(session_id, started)


def worker():
frappe.set_user("Administrator")
frappe.db.delete("Error Log", {"method": "Wikify agent run failed"})
frappe.enqueue("wikify.agent_ci_probe.environment", queue="long")
session_id = start_turn()
started = time.time()
frappe.enqueue(
"wikify.jobs.agent.run_agent_job", queue="long", session_id=session_id, user="Administrator"
)
frappe.db.commit()
while time.time() - started < 300:
time.sleep(5)
frappe.db.rollback()
if not frappe.db.get_value("Wikify Agent Session", session_id, "is_running"):
break
report(session_id, started)
Loading