Instalación¶
Instalar flower solo requiere Python ≥ 3.10. La única dependencia en tiempo de ejecución es claude-agent-sdk: el binario nativo que envía las peticiones viene dentro de su wheel, así que no hace falta instalar Node ni el CLI de Claude Code. Esta página recorre el camino desde cero: instalación en una línea, instalación desde el código fuente, la primera configuración de credenciales y un comando que demuestra que «de verdad quedó bien instalado». Cuando funcione, sigue con Inicio rápido.
Antes de instalar: comprueba Python¶
Con una salida como True 3.13.7 basta. Si imprime False o directamente no existe python3, instálalo primero (brew install python / apt install python3); en caso contrario el script de instalación sale de inmediato.
| Hace falta | No hace falta |
|---|---|
Python ≥ 3.10 (pyproject.toml:5; install.sh:22-31 también lo comprueba por su cuenta) | Node.js |
| Red hasta el endpoint de la API | El CLI de Claude Code |
| Una API key o un token de gateway (se da después de instalar) | Los ajustes de ~/.claude/ de la máquina anfitriona (las credenciales son la única excepción, ver abajo) |
Nombre del paquete flower, versión 0.1.0, única dependencia en tiempo de ejecución claude-agent-sdk>=0.2.152 (pyproject.toml:2-6). mkdocs-material solo se usa en CI para construir el sitio de documentación; ejecutar flower no lo necesita.
Instalación en una línea¶
Al terminar, la terminal debería mostrar esto (colores aparte):
== 用 uv 安装 flower…
== 装好了 /Users/you/.local/bin/flower
下一步:
cd 到任意项目目录,然后: flower
第一次会问你要 API key / 网关地址,配一次存到 ~/.config/flower/.env,处处生效。
本机已经装了 Claude Code 并配好的话,flower 会直接借它的 token,连问都不问。
文档:https://chenyuheee.github.io/flower/
Lo importante es esa línea == 装好了 <ruta absoluta>: es el resultado de que el propio script haya ejecutado un command -v flower (install.sh:60-61). Si imprime la ruta, flower ya está en el PATH.
Qué hace realmente el instalador¶
install.sh hace solo tres cosas: elegir un instalador de herramientas Python, instalar desde GitHub y decirte el siguiente paso. No toca ni una letra de tus credenciales (install.sh:7-8). La fuente de instalación es fija: git+https://github.com/ChenyuHeee/flower.git (install.sh:11).
El instalador prueba en orden y se detiene en la primera opción que funcione (install.sh:33-57):
| Orden | Condición | Comando real | Dónde queda el ejecutable |
|---|---|---|---|
| 1 | uv está en el PATH | uv tool install --force <REPO> | El directorio bin de herramientas de uv, normalmente ~/.local/bin/flower |
| 2 | No hay uv, pero sí pipx | pipx install --force <REPO> | ~/.local/bin/flower |
| 3 | No hay ninguno de los dos | Primero instala uv con curl -LsSf https://astral.sh/uv/install.sh \| sh; si se instala, vuelve al caso 1 | Igual que el caso 1 |
| 4 | En el caso 3 uv tampoco se instaló | python3 -m pip install --user --upgrade <REPO> | El directorio de scripts de usuario — en macOS no es ~/.local/bin |
Los cuatro casos instalan el mismo console script: flower = "flower.cli:main" (pyproject.toml:12). Una vez instalado también puedes invocarlo con python -m flower.cli, con el mismo efecto (cli.py:1451-1452).
Volver a ejecutar el script de instalación sobrescribe a la fuerza, sin pedir confirmación
Los tres comandos de instalación llevan respectivamente --force, --force y --upgrade (install.sh:37, :40, :54). Volver a ejecutarlo pisa directamente la instalación existente — así es precisamente como se actualiza, pero no esperes que te pregunte antes.
Cómo poner el comando flower en el PATH¶
Cuando command -v flower no encuentra nada, el script sugiere añadir $HOME/.local/bin a ~/.zshrc o ~/.bashrc (install.sh:62-70):
Tanto uv tool install como pipx install colocan ahí el ejecutable, así que para ellos ese aviso es correcto. Pero para el cuarto caso (pip install --user) no necesariamente: el directorio de ese mensaje está escrito a fuego, mientras que el directorio de scripts de usuario de pip depende de la plataforma. En macOS es ~/Library/Python/3.13/bin. Compruébalo tú mismo:
Sale algo como /Users/you/Library/Python/3.13/bin: añade ese directorio al PATH en lugar de ~/.local/bin, y luego reabre la terminal o haz source.
Instalar desde el código fuente¶
Si quieres leer el código, modificar el framework o ejecutar las verificaciones offline de tests/, instala desde el código fuente:
git clone https://github.com/ChenyuHeee/flower.git
cd flower
python3 -m venv .venv
.venv/bin/pip install -e .
Al terminar, .venv/bin/flower --help debería imprimir esas líneas de usage.
El shebang de ese ejecutable dentro del venv es una ruta absoluta, así que no hace falta activar nada: con un enlace simbólico funciona desde cualquier directorio:
Si ~/.local/bin está en el PATH, teclear flower desde cualquier directorio de proyecto usará el intérprete de ese venv y este código fuente.
La instalación desde código fuente añade además otra ubicación para las credenciales: el .env en la raíz del repositorio (quinto lugar en el orden de búsqueda, ver Configuración · Prioridad de búsqueda de credenciales). Durante el desarrollo:
.env ya está ignorado por .gitignore, no entra al control de versiones. Un flower instalado con pip / pipx / uv no dispone de esta ubicación —vive en site-packages, no hay «raíz del repositorio»—, así que en ese caso se usa el fichero global de credenciales que se explica abajo.
Actualización automática¶
flower todavía itera rápido, así que la copia instalada con pip / pipx / uv se actualiza sola por defecto: quien reporta un bug con una versión de hace tres días puede estar reportando algo ya corregido, y ambos lados pierden el tiempo. Aquí no hay una pregunta del tipo «¿lo activas o no?»: está activo por defecto, y para apagarlo se usa una variable de entorno.
Lo que hace (update.py:116-129):
- En cada arranque de
flower, consulta en un hilo en segundo plano el último commit demainen GitHub (update.py:70-80). El flujo principal no espera ni un segundo — esa es la primera invariante. - Si difiere del commit instalado localmente, ejecuta el comando de actualización acorde a la forma original de instalación: si hay
uv,uv tool install --force; si haypipx,pipx install --force; si no hay ninguno,pip install --user --upgrade(update.py:83-93). - Aunque se instale, no reemplaza el proceso en curso: la versión nueva se usa en la siguiente ejecución de
flower(update.py:113). Que te cambien el código a mitad de ejecución es de los fallos más difíciles de rastrear. - Límite de frecuencia: como mucho una consulta cada 24 horas, con la marca de tiempo en
~/.config/flower/.update(update.py:32,:36-37,:124). - Los fallos son siempre silenciosos. Sin red, GitHub caído, instalación fallida — nada de eso interrumpe tu trabajo (
update.py:79,:108-110).
Ejecutar desde el código fuente (git) no se ve afectado. El paso del comando de actualización mira primero si hay un .git en el repositorio; si lo hay, devuelve None directamente y no hace nada (update.py:83-87): tu workspace lo gestiona git, no él. En entornos no interactivos (stdin no es una terminal, p. ej. una tubería o CI) también se salta por completo (update.py:121).
Para apagarlo:
Cualquier valor no vacío sirve (update.py:33, :121). Úsalo en CI, en entornos sin red o cuando quieras reproducir el comportamiento de una versión antigua.
Primera ejecución: configurar credenciales¶
Las tres entradas de ejecución go, run y once llaman al principio a ensure_credentials() (cli.py:1192, :1160, :1225), con dos comprobaciones:
- Si existen: busca según la prioridad y, si no encuentra nada, te pregunta en el acto.
- Si sirven: lanza una llamada real a la API. Una petición mínima con
max_tokens=16(env.py:120-123), casi sin coste. Un token caducado o una URL de gateway mal escrita no se detectan mirando variables de entorno; sin sonda, revientan varios minutos después.
Sin credenciales, la primera ejecución de flower se detiene en esta pantalla (cli.py:1358-1388):
== 配置 flower ========================================
第一次用?给一次凭证就行。
凭证会存到 /Users/you/.config/flower/.env(只你可读)。装一次,处处生效。
1. 你的 API key 或网关 token (Anthropic 官方的 sk-ant-… 或第三方网关签发的)
>
2. 网关地址 (直接回车 = Anthropic 官方;第三方网关填它的 BASE_URL)
>
3. 模型名 (直接回车 = 默认;网关有自己的模型名就填,如 claude-opus-5[1m])
>
+ 存好了:/Users/you/.config/flower/.env
La pregunta 1 es obligatoria; si la dejas vacía imprime en rojo 没给 token,取消。 y sale. Las preguntas 2 y 3 se pueden pasar con Enter. Con el endpoint oficial, deja la 2 vacía; con un gateway de terceros, pon su dirección raíz, sin /v1: la sonda de flower golpea <BASE_URL>/v1/messages (env.py:162).
Claves que se escriben tras responder (cli.py:1378-1386):
| Lo que introduces | Clave escrita en .env |
|---|---|
El token empieza por sk-ant- | ANTHROPIC_API_KEY |
| Cualquier otro token | ANTHROPIC_AUTH_TOKEN |
| URL del gateway no vacía | ANTHROPIC_BASE_URL |
| Nombre de modelo no vacío | ANTHROPIC_MODEL, ANTHROPIC_DEFAULT_OPUS_MODEL, ANTHROPIC_DEFAULT_SONNET_MODEL: las tres a la vez |
La ubicación del fichero es ${XDG_CONFIG_HOME:-~/.config}/flower/.env (env.py:39-42), se sobrescribe entero y al terminar se le aplica chmod 0o600 (cli.py:1336-1347). Ese es el fichero del «configúralo una vez y vale en todas partes»: al cambiar de directorio de proyecto no hay que reconfigurar nada. El significado de cada variable está en Configuración.
Si ya tienes Claude Code instalado, puede que no te pregunte nada¶
La búsqueda de credenciales tiene un último recurso: lee ~/.claude/settings.json y después ~/.claude/settings.local.json, y toma de sus bloques env 9 claves de credenciales (env.py:56-75, :109-111). Quien ya tenga Claude Code configurado en la máquina puede ejecutar flower directamente y ponerse a trabajar: la pantalla de configuración ni siquiera aparece. Es justo lo que anuncia install.sh:77.
La frase del producto «flower no lee ~/.claude/settings.json» es falsa
Cuando no encuentra credenciales por ningún lado, la última línea del error que imprime flower es flower 不读 ~/.claude/settings.json —— 那是可移植性的代价。 (env.py:184-194, la frase está en :192). Manda el código: sí lo lee. env.py:56-75 lee explícitamente el bloque env de esos dos ficheros, solo que toma únicamente 9 claves de credenciales y no adopta ningún otro ajuste. Al leer esa frase, no des por hecho que se ignora la configuración local de Claude Code. La cadena completa está en Configuración · Prioridad de búsqueda de credenciales.
Cuando quieras reconfigurar¶
El subcomando flower setup está registrado (cli.py:1326-1328), pero _CMDS se lo dejó fuera (cli.py:937), de modo que flower setup se reescribe a flower go setup, es decir: toma "setup" como una petición y ejecuta el workflow completo. Hoy no existe ninguna forma en línea de comandos de alcanzar ese subcomando, aunque varios mensajes de error todavía te digan que lo ejecutes. Para cambiar las credenciales:
O borra el token de ese fichero y vuelve a ejecutar flower: la comprobación de credenciales faltantes te preguntará de nuevo (siempre que tampoco estén en otra ubicación, como ~/.claude/settings.json). Si las credenciales son rechazadas (HTTP 401 / 403) también aparece en el acto esa misma pantalla para reconfigurar, con una sola oportunidad (cli.py:1416-1428).
Verificar que está bien instalado¶
Dos niveles, de barato a caro.
Nivel uno — ¿existe el comando? (sin coste):
Ver estas líneas significa que el console script está instalado y en el PATH:
usage: flower [-h] [-w WORKSPACE] [-r RUN_DIR] [-v] [-W] [-T]
{go,run,once,setup} ...
可移植长程 agent 框架
Nivel dos — credenciales, endpoint y binario nativo funcionando (unos céntimos): la ejecución real más barata es once: un solo agente, por defecto con únicamente las tres herramientas de solo lectura Read / Glob / Grep, sin guardián de objetivos y sin banco de trabajo:
-v imprime la configuración efectiva antes de arrancar, dejando solo los 4 primeros caracteres del token (cli.py:1445-1447; env.py:197-211):
ANTHROPIC_AUTH_TOKEN = sk-1***(共 108 位)
ANTHROPIC_BASE_URL = https://cloud.infini-ai.com/maas
ANTHROPIC_MODEL = claude-opus-5[1m]
Estas líneas confirman que no te has conectado al gateway equivocado. Después vienen la sonda de credenciales y la ejecución real:
No hay cabecera de paso. once pasa por _run_once → rt.run(), sin atravesar _drive / Workflow.run, y Event("step", …) solo se emite en workflow/base.py:220; por eso, con once no aparecen líneas separadoras del tipo == 步骤名 ===== 1/1: solo las tienen go y run.
Si aparece la línea + 完成, ha pasado la prueba, y demuestra tres cosas a la vez: las credenciales funcionan, el endpoint es alcanzable y el binario nativo del wheel de claude-agent-sdk arranca en esta máquina. Si debajo de - 验一下凭证… ves ! 凭证被拒 o ! 网关地址或模型名不对, ve a la tabla de diagnóstico de abajo.
once muestra 0 en tiempo y coste acumulado
once crea un renderizador nuevo por cada evento (cli.py:1239, :579-581), así que 用时 es siempre 0:00 y el 累计 $ de la línea de estado nunca se acumula: el coste de ese paso único es real, el tiempo no.
El 1 轮 · $0.1741 de la línea de arriba es una medición real con procedencia: el 2026-09-06, en un contenedor Linux/arm64, una petición real enviada a través de cloud.infini-ai.com/maas (docker/README.md:24-25), es decir, el precio suelo de una sola ronda con Opus 5 + ventana de 1M. Si ejecutas tú el comando de arriba, tendrá que leer el repositorio, habrá más rondas y el coste será algo mayor que ese suelo. La cuenta completa está en runs/manifest.json, ver Configuración · Disposición en disco.
Cuando la instalación falla¶
| Síntoma | Causa | Qué hacer |
|---|---|---|
需要 Python 3.10+。先装一个… | Ni python3 ni python cumplen 3.10+ (install.sh:31) | brew install python / apt install python3 y vuelve a ejecutar el script |
El script dice que se instaló, pero flower: command not found | Se instaló en un directorio que no está en el PATH | Ver arriba «Cómo poner el comando flower en el PATH». Si se tomó la vía pip --user, en macOS es ~/Library/Python/3.X/bin |
安装失败。手动试:uv tool install git+https://… | Fallaron todas las vías, normalmente porque no hay red hacia GitHub o PyPI | Ejecuta manualmente lo que sugiere y mira el error real |
缺少凭证:需要 ANTHROPIC_API_KEY 或 ANTHROPIC_AUTH_TOKEN。 (4 líneas) | Entorno no interactivo (tubería, CI, nohup) sin credenciales: allí no aparece la pantalla de configuración, sale directamente | Ejecuta primero flower en una terminal real y configúralo, o escribe directamente ~/.config/flower/.env |
! 凭证被拒:HTTP 401 … | Token caducado o mal escrito | En una terminal interactiva te deja reconfigurarlo en el acto; en no interactivo, sale |
! 网关地址或模型名不对:HTTP 404 … | ANTHROPIC_BASE_URL o el nombre del modelo son incorrectos | Escribe la BASE_URL hasta la raíz del gateway, sin /v1; usa los nombres de modelo propios del gateway |
(探针没打通:… —— 当作网络问题,照常开跑) | DNS / TCP / timeout / 5xx | No es un problema de credenciales; flower deliberadamente no te hace reconfigurar, arranca igualmente y lo deja en manos de la capa de resiliencia |
! 标准输入不是终端,没人能回答提问 | Se ejecuta en una tubería o en CI | Añade --timeout 0 para que decida por sí mismo y no espere a nadie |
flower setup arranca preguntando «qué quieres hacer» | _CMDS se dejó fuera setup (cli.py:937) | Edita directamente ~/.config/flower/.env, ver arriba «Cuando quieras reconfigurar» |
Siguientes pasos¶
- Inicio rápido — entra en un directorio de proyecto y saca adelante el primer trabajo real.
- Configuración — todas las variables de entorno, la prioridad de credenciales, la sintaxis de
.envy qué queda en disco. - Línea de comandos — todos los subcomandos y flags.
- Despliegue — ejecutar en contenedor, distribuir capacidades de dominio con plugins.
- Glosario — el significado exacto de cada término de la documentación.