FERS din terminal și din agenți de cod

Pachetul Python pune solverul pe mașina dumneavoastră și, începând cu 0.1.100, comanda fers odată cu el. Un shell, un script, un job CI sau un agent de cod validează un model, îl rezolvă într-un fișier și citește doar numerele de care are nevoie — în timpul motorului, fără drum la server și fără nimic de conectat.

1. Instalați și verificați ce aveți

Un singur pachet conține obiectele de modelare, motorul compilat și comanda. fers doctor afișează versiunile și locul exemplelor; cu o cheie, întreabă și serverul de licențe dacă cheia este acceptată.

pip install FERS
fers doctor --offline      # versions and where the examples live
fers version

Fără cheie API motorul lucrează pe planul gratuit, pentru uz necomercial până la 100 bare, și nu face niciun apel de rețea. Puneți o cheie în FERS_API_KEY (sau transmiteți --api-key) pentru Pro, care acoperă uzul comercial; motorul o verifică atunci la ferscloud.com o dată per calcul.

2. Bucla: modelați, validați, rezolvați, citiți

Modelarea rămâne în Python, unde sunt obiectele și exemplele numerotate. Comanda preia la fișier: validează JSON-ul față de schema de intrare a motorului, i-l transmite neschimbat și raportează într-o linie.

  1. Modelați în Python — Construiți modelul cu fers_core în unități SI și salvați-l cu model.save_to_json("model.json"). fers examples list și fers examples show 001 sunt cea mai rapidă referință pentru API-ul de obiecte.
  2. Validați fișierul — fers validate model.json îl verifică față de schema de intrare și numește câmpul care nu corespunde. fers schema --list și fers schema Member afișează schema când un nume de câmp este incert.
  3. Rezolvați într-un fișier — fers solve model.json --out results.json scrie rezultatele direct în fișier. Pe stdout apare o linie de rezumat, sau un obiect JSON cu --json.
  4. Citiți o selecție — Încărcați fișierul rezolvat cu FERS.from_json și citiți cazul de încărcare sau combinația de care aveți nevoie, sau cereți motorului mai puțin de la început cu un ResultRequest.
python build_model.py                     # authors with fers_core and saves model.json
fers validate model.json                  # the input schema, naming the field that fails
fers solve model.json --out results.json  # the engine streams the results to the file
# solved: 3 load cases, 8 combinations in 0.4 s -> results.json (2.1 MB)

3. Rezultatele rămân în fișiere

fers solve nu parsează niciodată rezultatele: motorul le scrie, iar comanda citește înapoi doar cât îi trebuie pentru rezumat. Un model care scrie sute de megaocteți nu costă nimic procesul — și nici contextul unui agent. Codul de ieșire spune ce s-a întâmplat, astfel încât un script sau un agent poate ramifica fără să citească proză.

  • 0 rezolvat. 4 rezolvat, dar motorul a înregistrat eșecuri (solve_failures, load_case_failures): citiți-le înainte de a folosi orice număr.
  • 1 motorul a refuzat calculul sau acesta a eșuat, cu mesajul său pe stderr. 2 intrare greșită: fișier lipsă, JSON invalid, un model care nu respectă schema.
  • 3 licență: nicio cheie acolo unde e nevoie de una, o cheie respinsă, sau verificarea licenței a expirat.
  • Linia de rezumat numără cazurile de încărcare, combinațiile, eșecurile înregistrate, seturile de rezultate neconvergente și erorile și avertismentele motorului.
from fers_core import FERS, ResultBlock, ResultRequest

# Before solving: ask the engine for only the blocks you will read.
model.settings.analysis_options.result_requests = [
    ResultRequest(ResultBlock.REACTIONS, limit_state="ULS"),
    ResultRequest(ResultBlock.NODE_DISPLACEMENTS, components=["dy"]),
]
model.save_to_json("model.json")

# After "fers solve model.json --out results.json":
solved = FERS.from_json("results.json")
case = solved.resultsbundle.loadcombinations["ULS 1"]
print(case.reaction_nodes["1"].nodal_forces.fy)

4. Verificări normative și rapoarte

Un model care poartă definiții de verificare — check_beam din fers_core.builders construiește unul într-o linie — își primește verdictul EN 1993-1-1 de la fers check: stare, grad de utilizare și bara determinantă pentru fiecare verificare. fers report generează raportul HTML cu calcul de mână dintr-un document deja rezolvat, fără a recalcula.

fers check beam.json --out beam_solved.json
# ec3: Green, utilization 0.778, governing 1 in combination 1
fers report beam_solved.json --out report.html

5. Cataloage și schema

Tabelele de profile (EN, British Steel, AISC) și materialele predefinite sunt aceleași pe care le rezolvă obiectele Python, afișate în SI, astfel încât o valoare să poată fi confruntată cu un îndrumar înainte de a intra într-un model.

fers sections list --series HEB
fers sections get IPE200          # h, b, i_y, i_z, j, area, wel, wpl ... in m, m2, m4
fers materials list
fers materials get S355 --json
fers schema --list                # the schema's definitions, one line each
fers schema Member                # one definition in full

6. Agenți de cod și fișierul skill

Un agent cu shell — Claude Code, Codex, agentul din Cursor, un runner CI — nu are nevoie de server sau de conector: pachetul este solverul. Ce îi trebuie este bucla de mai sus într-o formă pe care o citește înainte de a începe, și exact asta este fișierul skill: o pagină în formatul skill cu pasul de instalare, bucla, cum se citesc rezultatele și când se potrivește în schimb serverul MCP.

Fișierul este inclus în pachet, iar fers skill --install . îl scrie în .claude/skills/fers/SKILL.md, unde îl caută Claude Code; fers skill --path îi dă calea pentru orice alt agent. Trăiește și în depozitul FERS_core. Agenții care citesc în loc să apeleze au în continuare llms.txt și versiunea Markdown a acestei pagini la /docs/command-line.md.

fers skill --install .     # writes .claude/skills/fers/SKILL.md, where Claude Code looks
fers skill --path          # the file's path, for any other agent
fers skill                 # or read it

7. CLI sau MCP?

Decide locul în care rulează agentul, nu care protocol e mai bun în abstract. Ambele căi rulează același motor și întorc aceleași numere.

  • Un agent de terminal (Claude Code, Codex, un job CI) instalează pachetul: calculul rulează pe propria mașină în timpul motorului, nu există limite de cereri sau timeout-uri, rezultatele rămân în fișiere, iar el modelează în Python pornind de la exemple.
  • Un client desktop sau de editor (Claude Desktop, Cursor, VS Code, ChatGPT desktop) folosește serverul MCP local: calculează pe aceeași mașină, iar un singur apel de instrument întoarce numerele verificate. Îl poate folosi și un agent de terminal; pentru o verificare la cheie are nevoie de mai puține runde decât cu comanda.
  • O aplicație de chat în browser sau pe telefon folosește serverul MCP găzduit: construiește și validează modelul și întoarce un link care îl rezolvă în browserul dumneavoastră.
  • Ambele pot împărți un cont: cheia API care ridică limitele comenzii este cheia pe care o acceptă serverul MCP.

Pagini conexe

Vezi și

Întrebări frecvente

`fers solve` calculează pe mașina mea sau în cloud?

Pe mașina dumneavoastră. Motorul este compilat în pachet; singurul apel de rețea este verificarea licenței când este setată o cheie API, o dată per calcul. Fără cheie nu există niciun acces la rețea.

Am nevoie de o cheie API?

Pentru uz comercial, la orice dimensiune a modelului, și pentru modele peste limita gratuită de 100 bare (Pro merge până la 10,000). Puneți cheia în FERS_API_KEY sau transmiteți --api-key; fers doctor vă spune dacă este acceptată.

De ce `fers solve` nu afișează rezultatele?

Pentru că locul lor e într-un fișier. Un document rezolvat poate ajunge la sute de megaocteți, iar un agent care îl lipește în context a pierdut firul. Comanda afișează o linie de rezumat, iar FERS.from_json sau un ResultRequest citește partea de care aveți nevoie.

Pot folosi comanda în CI?

Da. Este un script de consolă obișnuit, cu coduri de ieșire semnificative și ieșire --json, iar motorul nu are nevoie de ecran sau GPU. Fixați versiunea pachetului, setați FERS_API_KEY ca secret dacă modelele depășesc limita gratuită și puneți wheel-ul în cache.