Skip to main content

Official FinanFut Intelligence Python SDK

Project description

FinanFut Intelligence Python SDK

SDK oficial de FinanFut Intelligence per integrar agents, intents, memòria i fluxos d'orquestració des de Python.

Índex


Instal·lació

pip install finanfut-sdk

Requisit: Python >= 3.12.


Configuració

Pots inicialitzar el client amb paràmetres directes o bé mitjançant fitxer de configuració + variables d'entorn.

Fitxer local (~/.finanfut/config.json)

mkdir -p ~/.finanfut
{
  "api_key": "YOUR_API_KEY",
  "application_id": "YOUR_APPLICATION_ID",
  "api_url": "https://finanfut-intelligence.onrender.com"
}

Variables d'entorn suportades

  • FINANFUT_API_KEY
  • FINANFUT_APPLICATION_ID
  • FINANFUT_API_URL

FINANFUT_API_URL accepta host base o URL amb /api o /api/v1; l'SDK la normalitza per evitar segments duplicats.


Quickstart

from finanfut_sdk import FinanFutClient

client = FinanFutClient(
    api_key="YOUR_API_KEY",
    application_id="YOUR_APPLICATION_ID",
)

response = client.interact.query(
    query="Hola! Programa una reunió demà a les 10.",
    application_agent_id="YOUR_APPLICATION_AGENT_ID",
    intent_id="YOUR_INTENT_ID",
)

print(response.answer)
print(response.model, response.ai_model_id)

Capacitats del client

FinanFutClient exposa aquests mòduls:

  • client.interact
  • client.agents
  • client.intents
  • client.applications
  • client.application_agents
  • client.memory
  • client.documents
  • client.data_import
  • client.ocr
  • client.models
  • client.contexts
  • client.context_sessions
  • client.billing
  • client.analytics
  • client.access_tokens

També pots activar mode sandbox amb FinanFutClient.for_sandbox(...) o dry_run=True.


Interact API (/api/v1/public/requests)

client.interact.query(...) requereix:

  • query
  • intent_id
  • una referència d'agent: application_agent_id o agent_slug o agent_id

Paràmetres opcionals rellevants:

  • intent: etiqueta textual de l'intent (p. ex. knowledge.answer) per mantenir traçabilitat humana al lifecycle del request.
  • parameters: claus addicionals per a routing/execució (incloent compatibilitat amb intent_name).

Exemple amb context i document:

response = client.interact.query(
    query="Respon segons aquest context",
    intent_id="INTENT_UUID",
    intent="knowledge.answer",
    application_agent_id="APP_AGENT_UUID",
    context_id="CONTEXT_UUID",
    document_id="DOCUMENT_UUID",
    parameters={"lang": "ca"},
)

print(response.answer)
print(response.tokens)

Quan el backend retorna una resposta estructurada dins envelope.user_output.structured_json, l'SDK la promou automàticament com a response.answer i també la deixa disponible a:

  • response.structured_answer
  • response.envelope.user_output.structured_json

Exemple per a content.generate:

response = client.interact.query(
    query="Prepara una publicació de 100 paraules sobre la jornada",
    intent_id="INTENT_UUID",
    application_agent_id="APP_AGENT_UUID",
)

if isinstance(response.answer, dict):
    print(response.answer["post_text"])
    print(response.answer.get("image_url"))
    print(response.answer.get("freshness_status"))

Aplicacions i manifest SDK

apps = client.applications.list()
app = client.applications.get("APP_UUID")

manifest = client.applications.get_manifest("APP_UUID")
if manifest:
    print(manifest.manifest_version)

bootstrap = client.applications.bootstrap_manifest("APP_UUID")
if bootstrap:
    print(bootstrap.agents_by_id.keys())

Pots fer peticions condicionals amb ETag via if_none_match; si el backend respon 304, el client retorna None.


Catàleg de models i model-settings

catalog = client.models.list(category="chat", only_active=True)

settings = client.models.list_application_settings(
    application_id=client.application_id,
    category="chat",
)

updated = client.models.update_application_setting(
    application_id=client.application_id,
    agent_ref="default",
    payload={
        "ai_model_id": catalog[0].id,
        "category": "chat",
        "temperature": 0.2,
    },
)

print(updated.ai_model_id)

Documents i document QA

client.documents.upload(...) admet file_path, content o text.

from pathlib import Path

# Fitxer físic
pdf_doc = client.documents.upload(
    file_path=Path("knowledge.pdf"),
    document_type="context_general",
)

# Text lliure
schema_doc = client.documents.upload(
    text='{"name": "Ada", "role": "engineer"}',
    file_name="profile.json",
    mime_type="application/json",
    document_type="schema_contract",
)

print(pdf_doc.document_type, schema_doc.document_type_version)

Altres operacions habituals:

items = client.documents.list(limit=20)
detail = client.documents.get(str(pdf_doc.id))
answer = client.documents.ask(str(pdf_doc.id), "Resumeix els punts clau")

Upload asíncron amb polling:

accepted = client.documents.upload(
    text="# FAQ async",
    file_name="faq.md",
    mime_type="text/markdown",
    async_mode=True,
)

if hasattr(accepted, "job_id"):
    while True:
        job = client.documents.get_upload_job(str(accepted.job_id))
        if job.status == "completed":
            print("Document llest:", job.document.id if job.document else accepted.document_id)
            break
        if job.status == "failed":
            raise RuntimeError(job.error or "job_failed")

Contexts i context sessions

Contexts persistents

ctx = client.contexts.create(
    name="Context operatiu",
    description="Documents base per al flux",
    documents=[str(pdf_doc.id)],
)

ctx = client.contexts.add_documents(ctx.id, [str(schema_doc.id)])
print(ctx.id, len(ctx.documents))

Sessions de context

session = client.context_sessions.create(
    name="Sessió de proves",
    context_id=ctx.id,
)

client.context_sessions.add_message(
    session.id,
    agent_name="sports_operations_agent",
    query="Quina és la següent acció recomanada?",
    answer="Revisar el calendari i validar la disponibilitat.",
)

OCR mapping

client.ocr.map(...) crida POST /api/v1/ocr/mappings i transforma una imatge, un PDF amb text extractable, un fitxer de text o un document ja persistit en un JSON alineat amb el contracte que li passes.

Exemple amb una imatge local:

from finanfut_sdk import FinanFutClient

client = FinanFutClient()

contract = {
    "type": "object",
    "additionalProperties": False,
    "required": ["competition", "home_team", "away_team", "score"],
    "properties": {
        "competition": {"type": ["string", "null"]},
        "home_team": {"type": ["string", "null"]},
        "away_team": {"type": ["string", "null"]},
        "score": {
            "type": "object",
            "additionalProperties": False,
            "required": ["home", "away"],
            "properties": {
                "home": {"type": ["integer", "null"]},
                "away": {"type": ["integer", "null"]},
            },
        },
    },
}

result = client.ocr.map(
    file_path="acta.jpg",
    profile_key="sports.match_report",
    output_contract=contract,
    instructions="Extreu només dades visibles a l'acta. No inventis valors.",
    confidence_threshold=0.78,
)

print(result.answer.mapped_json)
print(result.answer.validation.status)
print(result.answer.extraction.confidence)

Fonts acceptades:

  • file_path: camí local; l'SDK llegeix el fitxer i l'envia en base64.
  • content: bytes ja carregats en memòria.
  • content_base64: contingut base64 o data URL ja preparat.
  • document_id: reutilitza un document existent de la mateixa aplicació.

Opcions útils:

  • profile_key: generic.document_mapping o sports.match_report.
  • include_raw_text_excerpt: demana un extracte textual quan és operativament necessari.
  • persist_source: desa la font com a document intern i retorna document_id.
  • timeout: timeout HTTP per a documents grans o models més lents.

La resposta tipada és OCRMappingResponse. El resultat útil viu a result.answer.mapped_json; valida result.answer.validation.status == "valid" abans d'automatitzar accions. Si rep "needs_review", revisa missing_fields, errors, warnings i field_evidence.

Els PDFs escanejats no s'han d'enviar com a PDF en v1. Cal convertir la pàgina a imatge i enviar-la amb file_path, content o content_base64.


Data import (CSV/PDF → JSON)

preview = client.data_import.upload_transient_csv(file_path="ingesta.csv")

result = client.data_import.transform_data(
    application_id=client.application_id,
    intent_id="UUID_INTENT_TRANSFORM_DATA",
    transient_csv=preview,
    contract_document_id="UUID_DATA_IMPORT_CONTRACT",
)

print(result.items[0] if result.items else result.response)

Per PDF:

preview = client.data_import.upload_transient_pdf(file_path="factura.pdf")
result = client.data_import.transform_document(
    application_id=client.application_id,
    intent_id="UUID_INTENT_TRANSFORM_DOCUMENT",
    transient_document=preview,
    contract_document_id="UUID_DATA_IMPORT_CONTRACT",
)

Billing, analytics i access tokens

usage = client.billing.get_usage(period="month")
print(usage.tokens_used, usage.cost)

logs = client.analytics.logs()
requests_trace = client.analytics.requests()
print(len(logs), len(requests_trace))

tokens = client.access_tokens.list()
print(len(tokens.items))

Gestió d'errors

L'SDK eleva excepcions tipades (ValidationError, AuthenticationError, RateLimitError, etc.) segons l'estat HTTP i el payload del backend.

Per errors de contracte (UNPROCESSABLE_OUTPUT_CONTRACT) retornats com {"error": "<text>"}, el missatge complet es propaga en una ValidationError perquè no es perdi el detall del contracte fallit.


CLI

finanfut init
finanfut interact "Hola" --agent-id "APP_AGENT_UUID" --intent-id "INTENT_UUID"
finanfut usage --period month
finanfut agents list

Flags globals disponibles: --api-key, --application-id, --api-url, --config, --dry-run.


Llicència

Aquest projecte es distribueix sota llicència MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

finanfut_sdk-1.3.4.tar.gz (41.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

finanfut_sdk-1.3.4-py3-none-any.whl (44.2 kB view details)

Uploaded Python 3

File details

Details for the file finanfut_sdk-1.3.4.tar.gz.

File metadata

  • Download URL: finanfut_sdk-1.3.4.tar.gz
  • Upload date:
  • Size: 41.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for finanfut_sdk-1.3.4.tar.gz
Algorithm Hash digest
SHA256 7dad5ba4b8496c473e6d7aa0f2c0d089e12ebde73407990e705ed69615fdf3c0
MD5 0c99bc8e8459453b29d73bec18257836
BLAKE2b-256 a481013146af5a0eec81b7e4b0b943f989741e47032b90e5d7a90640c1051228

See more details on using hashes here.

File details

Details for the file finanfut_sdk-1.3.4-py3-none-any.whl.

File metadata

  • Download URL: finanfut_sdk-1.3.4-py3-none-any.whl
  • Upload date:
  • Size: 44.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for finanfut_sdk-1.3.4-py3-none-any.whl
Algorithm Hash digest
SHA256 b7360894163f04aa2c0c6df353cf7b4d552d1aef5e65ccd51104070ac5d95c4f
MD5 5634f7954064dd42c5d24fc35e446f45
BLAKE2b-256 2421e59c28a67d1ed8d1b1e74e9b98d42da4300b5662a81e5b42c815c8311d44

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page