Ctrl K
ComunidadGuías…

tests/integration/isolated_cv_file_search.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""
Isolated canonical CV file_search proof.

Purpose:
1. Query the existing canonical candidate vector store directly.
2. Ask the existing Gideon supervisor a basic CV question.
3. Observe whether native file_search executes successfully.

NO Gideon runtime.
NO Jobs faction.
NO application campaign.
NO vector-store mutation.
NO assistant mutation.
"""

import json
import os
import time

from dotenv import load_dotenv
from projectdavid import (
    ContentEvent,
    Entity,
    ToolCallRequestEvent,
)


# ------------------------------------------------------------------
# CONFIG
# ------------------------------------------------------------------

load_dotenv(".tests.env")

BASE_URL = os.getenv("BASE_URL", "http://localhost:80")

ENTITIES_API_KEY = os.getenv("DEV_PROJECT_DAVID_CORE_TEST_USER_KEY")

PROVIDER_API_KEY = os.getenv("TOGETHER_API_KEY") or os.getenv("HYPERBOLIC_API_KEY")

MODEL_ID = (
    os.getenv("MCP_TEST_MODEL_ID")
    or "together-ai/mistralai/Ministral-3-14B-Instruct-2512"
)

PROVIDER = os.getenv("MCP_TEST_PROVIDER") or "Together"

ASSISTANT_ID = "asst_lYd7SCmoFvf0aq5LRSfGhW"
VECTOR_STORE_ID = "vect_x9pQWTKSS6H6JiJSu5mT4I"

QUERY = (
    "What is the candidate's most recent job title? "
    "Use file_search to answer from the candidate CV. "
    "Do not answer from general knowledge or assumptions."
)


if not PROVIDER_API_KEY:
    raise RuntimeError("Missing inference provider API key.")


print("ISOLATED_CV_FILE_SEARCH=START")
print(f"BASE_URL={BASE_URL}")
print(f"ASSISTANT_ID={ASSISTANT_ID}")
print(f"VECTOR_STORE_ID={VECTOR_STORE_ID}")
print(f"MODEL_ID={MODEL_ID}")
print(f"PROVIDER={PROVIDER}")


# ------------------------------------------------------------------
# CLIENT
# ------------------------------------------------------------------

client = Entity(
    base_url=BASE_URL,
    api_key=ENTITIES_API_KEY,
)

if hasattr(client, "synchronous_inference_stream"):
    client.synchronous_inference_stream.bind_clients(
        client.runs,
        client.actions,
        client.messages,
        client.assistants,
    )


# ==================================================================
#  SAME ASSISTANT + NATIVE FILE_SEARCH
# ==================================================================
print("\n" + "=" * 80)
print("TEST 2 — SUPERVISOR NATIVE FILE_SEARCH")
print("=" * 80)

print(f"PROMPT={QUERY}")

thread = client.threads.create_thread()

message = client.messages.create_message(
    thread_id=thread.id,
    role="user",
    content=QUERY,
    assistant_id=ASSISTANT_ID,
)

run = client.runs.create_run(
    assistant_id=ASSISTANT_ID,
    thread_id=thread.id,
)

print(f"THREAD_ID={thread.id}")
print(f"MESSAGE_ID={message.id}")
print(f"RUN_ID={run.id}")


stream = client.synchronous_inference_stream

stream.setup(
    thread_id=thread.id,
    assistant_id=ASSISTANT_ID,
    message_id=message.id,
    run_id=run.id,
    api_key=PROVIDER_API_KEY,
)


tool_calls = []
content_parts = []

start = time.perf_counter()

try:
    for event in stream.stream_events(model=MODEL_ID):
        elapsed = time.perf_counter() - start
        class_name = event.__class__.__name__

        try:
            payload = event.to_dict()
        except Exception:
            payload = {"repr": repr(event)}

        print(
            f"[{elapsed:8.3f}s] "
            f"{class_name:<28} "
            f"{json.dumps(payload, default=str)}"
        )

        if isinstance(event, ToolCallRequestEvent):
            tool_name = getattr(event, "tool_name", None)
            tool_calls.append(tool_name)

        if isinstance(event, ContentEvent):
            content = getattr(event, "content", None)

            if content:
                content_parts.append(str(content))

except Exception as exc:
    print("\nSUPERVISOR_STREAM=FAIL")
    print(f"{type(exc).__name__}: {exc}")

else:
    print("\nSUPERVISOR_STREAM=COMPLETE")


# ==================================================================
# RESULTS
# ==================================================================

print("\n" + "=" * 80)
print("RESULT")
print("=" * 80)

print(f"OBSERVED_CONSUMER_TOOL_CALLS={tool_calls}")

final_text = "".join(content_parts)

print("\nFINAL_TEXT:")
print(final_text or "<no content>")

print("\nISOLATED_CV_FILE_SEARCH=COMPLETE")