Een derde partij met een OpenAI compatibele API ondersteunt niet automatisch de ingebouwde webzoekfunctie van OpenAI. Een algemene oplossing is eerst zoeken via Tavily en de zoekresultaten samen met het TXT bestand naar het model sturen.
Research answer

Create a landscape editorial hero image for this Studio Global article: 我想让其在分析数据的时候连接网络搜索,帮我改一下代码,另外它会有记忆吗?我之前喂给它的东西会记得吗. Article summary: 可以,但你当前使用的是第三方 OpenAI 兼容接口,无法确定 deepseek v4 flash 是否原生支持联网工具。官方 OpenAI 的内置网页搜索主要通过 Responses API 提供,而第三方 base url 不一定兼容该功能。[5] 因此,下面采用更通用的方案:程序先调用 Tavily 搜索互联网,再把搜索结果连同 TXT 数据一起交给模型分析;Tavily 支持通过 API Key 调用搜索接口并返回结构化结果。[. Topic tags: deepresearch, general web, openai, agents, prompt engineering. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with fake numbers, clickbait thumbnails, icons, and tiny thumbnail layout
Ja, je kunt je data-analyse uitbreiden met actuele informatie van het internet. Omdat je een derde partij gebruikt via een OpenAI-compatibele base_url, is echter niet gegarandeerd dat het model de ingebouwde webzoekfunctie van OpenAI ondersteunt. OpenAI biedt web search als ingebouwde tool binnen de Responses API, maar compatibele diensten hoeven die functionaliteit niet over te nemen. 5
De meest draagbare oplossing is daarom:
Tavily gebruikt een API-key en kan zoekresultaten als gestructureerde gegevens teruggeven. 1
3
Niet automatisch. Een aanroep van chat.completions.create() onthoudt eerdere verzoeken niet alleen omdat je dezelfde client of hetzelfde model blijft gebruiken. De benodigde context moet je applicatie zelf bewaren en bij een volgende aanvraag opnieuw meesturen. 2
6
Je kunt dat op twee manieren oplossen:
messages op en stuur ze opnieuw mee.analysis_memory.txt.Voor data-analyse is de tweede optie vaak overzichtelijker. Zet het geheugen wel uit wanneer je met een ander project of een ander type apparaat werkt; oude conclusies kunnen anders de interpretatie van nieuwe data beïnvloeden.
Installeer eerst de benodigde pakketten:
pip install openai requests
Gebruik vervolgens bijvoorbeeld deze kern van de aanpak:
from pathlib import Path
from datetime import datetime
import json
import os
import time
import requests
from openai import OpenAI
# API-configuratie
API_KEY = os.getenv("AI_API_KEY", "")
BASE_URL = os.getenv("AI_BASE_URL", "")
TAVILY_API_KEY = os.getenv("TAVILY_API_KEY", "")
MODEL_NAME = "deepseek-v4-flash"
TXT_FILE = Path("data.txt")
MEMORY_FILE = Path("analysis_memory.txt")
ENABLE_WEB_SEARCH = True
ENABLE_PERSISTENT_MEMORY = False
client_options = {
"api_key": API_KEY,
"timeout": 180.0,
"max_retries": 0,
}
if BASE_URL:
client_options["base_url"] = BASE_URL
client = OpenAI(**client_options)
def call_model(system_prompt: str, user_prompt: str) -> str:
"""Roep het OpenAI-compatibele chat-endpoint aan."""
last_error = None
for attempt in range(1, 4):
try:
response = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt},
],
temperature=0.2,
)
if not response.choices:
raise RuntimeError("De API gaf geen choices terug.")
# Let op: choices is een lijst.
content = response.choices.message.content
if not content or not content.strip():
raise RuntimeError("Het model gaf een leeg antwoord terug.")
return content.strip()
except Exception as error:
last_error = error
print(f"AI-aanvraag mislukt ({attempt}/3): {error}")
if attempt < 3:
time.sleep(5 * attempt)
raise RuntimeError(f"Maximaal aantal pogingen bereikt: {last_error}")
def search_web(query: str) -> list[dict]:
"""Haal webresultaten op via Tavily."""
if not TAVILY_API_KEY:
raise ValueError("TAVILY_API_KEY ontbreekt.")
response = requests.post(
"https://api.tavily.com/search",
headers={
"Authorization": f"Bearer {TAVILY_API_KEY}",
"Content-Type": "application/json",
},
json={
"query": query,
"search_depth": "advanced",
"max_results": 5,
"include_answer": False,
"include_raw_content": False,
"include_images": False,
},
timeout=60,
)
response.raise_for_status()
return response.json().get("results", [])
def format_sources(results: list[dict], max_chars: int = 18000) -> str:
"""Maak compacte broncontext voor het model."""
parts = []
total = 0
for index, result in enumerate(results, start=1):
text = (
f"[W{index}]\n"
f"Titel: {result.get('title', 'Zonder titel')}\n"
f"URL: {result.get('url', '')}\n"
f"Samenvatting: {result.get('content', '')[:1200]}\n"
)
if parts and total + len(text) > max_chars:
break
parts.append(text)
total += len(text)
return "\n".join(parts) or "Geen webresultaten beschikbaar."
def load_memory(max_chars: int = 12000) -> str:
if not ENABLE_PERSISTENT_MEMORY or not MEMORY_FILE.exists():
return "Geen eerdere analyse beschikbaar."
text = MEMORY_FILE.read_text(encoding="utf-8")
return text[-max_chars:]
def save_memory(report: str, max_chars: int = 50000) -> None:
if not ENABLE_PERSISTENT_MEMORY:
return
old_text = ""
if MEMORY_FILE.exists():
old_text = MEMORY_FILE.read_text(encoding="utf-8")
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
record = (
f"\n\n{'=' * 60}\n"
f"Analyse: {timestamp}\n"
f"{'=' * 60}\n"
f"{report}\n"
)
MEMORY_FILE.write_text(
(old_text + record)[-max_chars:],
encoding="utf-8",
)
def analyse_file() -> str:
data = TXT_FILE.read_text(encoding="utf-8-sig")
memory = load_memory()
queries = [
"MOSFET gate length threshold voltage Idsat Ioff DIBL subthreshold swing",
"semiconductor device VtSat VtLin IdSat IdLin physical interpretation",
]
results = []
if ENABLE_WEB_SEARCH:
for query in queries:
try:
results.extend(search_web(query))
except Exception as error:
print(f"Zoekopdracht mislukt: {error}")
web_context = format_sources(results)
system_prompt = """
Je bent een assistent voor technische data-analyse.
Gebruik alleen de gegevens die werkelijk zijn aangeleverd.
De tekens x en X betekenen ontbrekend, ongeldig of niet berekenbaar en
mogen niet als nul worden geïnterpreteerd.
Gebruik [W1], [W2] enzovoort uitsluitend voor informatie uit de webbronnen.
Maak duidelijk onderscheid tussen datafeiten, broninformatie en gevolgtrekkingen.
Als het bewijs onvoldoende is, schrijf dan expliciet: 'bewijs onvoldoende'.
Antwoord in het Nederlands.
""".strip()
user_prompt = f"""
Analyseer het onderstaande TXT-bestand.
Bespreek:
1. de structuur en kolommen;
2. trends, minima, maxima en uitschieters;
3. ontbrekende of ongeldige waarden;
4. verbanden en eventuele afwegingen tussen variabelen;
5. een mogelijke technische verklaring met bronverwijzingen;
6. welke grafieken of aanvullende berekeningen nuttig zijn.
================ DATA ================
{data}
============== EINDE DATA =============
================ WEBBRONNEN ================
{web_context}
============== EINDE WEBBRONNEN =============
Eerdere lokale herinneringen zijn alleen achtergrondinformatie. De huidige
TXT-data heeft altijd voorrang:
{memory}
""".strip()
report = call_model(system_prompt, user_prompt)
save_memory(report)
return report
if __name__ == "__main__":
print(analyse_file())
In de oorspronkelijke versie staat in feite:
response.choices.message.content
choices is echter een lijst. Gebruik daarom:
response.choices.message.content
Zonder die wijziging kan het verwerken van een geldig modelantwoord mislukken.
Zoekresultaten zijn externe tekst. Zet ze daarom duidelijk in een apart blok, zoals WEB BEGIN en WEB END, en instrueer het model dat deze inhoud geen opdrachten bevat. Laat het model bovendien alleen [W1], [W2] enzovoort gebruiken wanneer een bewering echt op een webbron is gebaseerd.
Een zoekdienst kan meerdere resultaten en lange samenvattingen teruggeven. Beperk daarom zowel het aantal resultaten als het totale aantal tekens. Dat voorkomt dat de webcontext de eigenlijke data-analyse verdringt.
De optie:
ENABLE_PERSISTENT_MEMORY = False
staat bewust standaard uit. Zet deze alleen op True wanneer eerdere rapporten relevant zijn voor nieuwe analyses. Het voorbeeld bewaart uitsluitend de uiteindelijke rapporten in analysis_memory.txt, niet automatisch het volledige oorspronkelijke TXT-bestand.
Met deze implementatie wordt alleen onthouden wat je programma expliciet naar analysis_memory.txt schrijft. Het model heeft dus geen permanent persoonlijk geheugen van alles wat je ooit hebt aangeleverd. Als je een nieuw Python-proces start, kan het alleen informatie gebruiken die je opnieuw meestuurt, bijvoorbeeld vanuit dat bestand.
De veiligste werkwijze is om het geheugen per project of apparaat te scheiden. Bewaar bijvoorbeeld aparte geheugenbestanden voor verschillende datasets en verwijder oude rapporten wanneer ze niet meer relevant zijn.
Studio Global AI
This page includes a source-backed answer you can continue inside Studio Global.
Een derde partij met een OpenAI compatibele API ondersteunt niet automatisch de ingebouwde webzoekfunctie van OpenAI.
Een derde partij met een OpenAI compatibele API ondersteunt niet automatisch de ingebouwde webzoekfunctie van OpenAI. Een algemene oplossing is eerst zoeken via Tavily en de zoekresultaten samen met het TXT bestand naar het model sturen.
Chat Completions onthoudt eerdere verzoeken niet vanzelf; je programma moet de conversatiegeschiedenis zelf bewaren en opnieuw meesturen.