Ollama-Programmiersprachenintegration

Dieser Artikel stellt systematisch vier Codepfade zum Aufrufen von Ollama vor: die offizielle Python-Bibliothek, die offizielle JavaScript-Bibliothek, natives HTTP sowie OpenAI-/Anthropic-SDKs, und verbindet sie mit zwei praktischen Projekten.


Offizielles SDK: Python und JavaScript

Das offizielle Team pflegt direkt zwei Bibliotheken mit konsistentem API-Design; wenn Sie eine kennen, kennen Sie beide.

Installation

# Python
pip install ollama

# JavaScript / TypeScript
npm install ollama

Vergleich der Kernmethoden in den beiden Bibliotheken:

MethodeZweckWichtige Parameter
chatDialog mit mehreren Runden (Hauptmethode)model、messages、stream、tools、think、format、options
generateTextgenerierung für eine einzelne Rundemodel、prompt、stream、suffix
embedVektor-Einbettungmodel, input (einzelnes Element oder Array)
ListeLokale Modelle auflistenKeine
pullEin Modell abrufen (Fortschritt kann überwacht werden)model、stream

Ein Chat-Aufruf mit vollständigen Parametern in Python deckt die meisten der in den vorherigen Artikeln gelernten Fähigkeiten ab:

Beispiel

from ollama import chat
from pydantic import BaseModel

# Schema für strukturierte Ausgabe definieren
class Answer(BaseModel):
    site: str
    free: bool

response = chat(
    model='qwen3.5',
    messages=[{'role': 'user', 'content': 'Python vorstellen'}],
    stream=False,                        # Streaming-Umschalter
    think=False,                         # Denkmodus-Umschalter
    format=Answer.model_json_schema(),   # Schema für strukturierte Ausgabe
    options={'temperature': 0.3, 'num_ctx': 8192},  # Generierungsparameter
)

print(Answer.model_validate_json(response.message.content))

Der äquivalente Code in JavaScript:

Beispiel

import ollama from 'ollama'

// Streaming-Chat-Beispiel
const stream = await ollama.chat({
  model: 'qwen3.5',
  messages: [{ role: 'user', content: 'Stelle Python in drei Sätzen vor' }],
  stream: true,
})

// Chunk für Chunk ausgeben
let content = ''
for await (const chunk of stream) {
  process.stdout.write(chunk.message.content)
  content += chunk.message.content
}

Wenn Sie eine Verbindung zu einer Nicht-Standard-Adresse (z. B. einem Remote-Server oder Ollama Cloud) herstellen, geben Sie sie mit host und headers an:

Beispiel

import os
from ollama import Client

# Verbindung zu Remote-Ollama oder Ollama Cloud herstellen (Bearer-Authentifizierung)
Client = Client(
    host='https://ollama.com',
    headers={'Authorization': 'Bearer ' + os.environ.get('OLLAMA_API_KEY')},
)

response = client.chat(model='qwen3.5', messages=[
    {'role': 'user', 'content': 'Stelle Python in einem Satz vor'}
])

Natives HTTP: curl Kurzreferenz

Beim Schreiben von Skripten, Debuggen von APIs oder bei der Fehlersuche ist curl das schnellste Werkzeug.

SzenarioBefehl
Einzel-Turn-Generierung (nicht streamend)curl http://localhost:11434/api/generate -d '{"model":"qwen3.5","prompt":Hello,"stream":false}'
Chatcurl http://localhost:11434/api/chat -d '{"model":"qwen3.5","messages":[...],"stream":false}'
Vektor-Einbettungcurl http://localhost:11434/api/embed -d '{"model":"embeddinggemma","input":"Text"}'
Modelle auflistencurl http://localhost:11434/api/tags
Modelldetailscurl http://localhost:11434/api/show -d '{"model":"qwen3.5"}'
Ein Modell herunterladencurl http://localhost:11434/api/pull -d '{"model":"qwen3.5:4b"}'
Ein Modell löschencurl -X DELETE http://localhost:11434/api/delete -d '{"model":"qwen3.5:4b"}'

OpenAI / Anthropic SDK wiederverwenden

Bei der Migration bestehender Projekte verursacht die Kompatibilitätsschicht deutlich weniger Aufwand als eine Neuimplementierung.

In einem JavaScript-Projekt das OpenAI SDK verwenden, um eine Verbindung zu lokalen Modellen herzustellen:

Beispiel

import OpenAI from "openai"

// Nur base_url ändern; api_key kann beliebig sein
const openai = new OpenAI({
  baseURL: "http://localhost:11434/v1",
  apiKey: "ollama",
})

const res = await openai.chat.completions.create({
  model: "qwen3.5",
  messages: [{ role: "user", content: "Stellen Sie Python in einem Satz vor" }],
})
console.log(res.choices[0].message.content)

Dasselbe gilt in einem Python-Projekt, das das Anthropic SDK verwendet:

Beispiel

import anthropic

# base_url auf lokal zeigen, der Schlüssel kann beliebig sein
client = anthropic.Anthropic(
    base_url='http://localhost:11434',
    api_key='ollama',
)

message = client.messages.create(
    model='qwen3.5',
    max_tokens=1024,
    messages=[{'role': 'user', 'content': 'Stellen Sie Python in einem Satz vor'}],
)
print(message.content[0].text)

Empfehlung: Verwenden Sie für neue Projekte direkt das offizielle SDK (vollständigster Funktionsumfang); gehen Sie bei bestehenden Projekten über die Kompatibilitätsschicht basierend auf dem aktuellen SDK (minimale Änderungen); bei der Integration mit einem Framework, das nur das OpenAI-Protokoll unterstützt, ist die Kompatibilitätsschicht der einzige Weg.


Übung 1: Kommandozeilen-Chatskript

In weniger als 40 Zeilen Python: Kombiniere die Assemblierung, das Streaming und die Verlaufsverwaltung aus den früheren Abschnitten zu einem Terminal-Chat-Tool.

Beispiel

# Dateipfad: cli_chat.py
Ausführen: python cli_chat.py
from ollama import chat

MODEL = 'q3.5:4b'

# Sitzungsverlauf: System legt die Rolle fest, dann Konversationsnachrichten hinzufügen
messages = [{
    'role': 'system',
    'content': 'Du bist EXAMPLEs Programmierassistent. Antworte prägnant und gib Beispielcode an.',
}]

print(f'Chat starten (Modell {MODEL}), zum Beenden exit eingeben.')
while True:
    user_input = input('\n'Du: ').strip()
    if user_input.lower() == 'exit':
        break
    if not user_input:
        continue

    # Benutzernachricht anhängen und eine Streaming-Anfrage starten
    messages.append({'role': 'user', 'content': user_input})
    stream = chat(model=MODEL, messages=messages, stream=True)

    # Stück für Stück ausgeben, während die vollständige Antwort akkumuliert wird
    print('Assistent: ', end='', flush=True)
    reply = ''
    for chunk in stream:
        reply += chunk.message.content
        print(chunk.message.content, end='', flush=True)

    # Wichtig: Die Antwort dieser Runde wieder an die Historie anhängen, damit sich das Modell den Kontext "merken" kann
    messages.append({'role': 'assistant', 'content': reply})
$ python cli_chat.py
开始对话(模型 qwen3.5:4b),输入 exit 退出。

你:什么是 Python 的切片?
助手:切片是用 [start:stop:step] 从序列中取子序列的语法,
例如 s[1:3] 取索引 1 到 2 的元素。

你:给个 EXAMPLE 风格的例子
助手:s = "EXAMPLE"
print(s[1:4])   # 输出 UNO

你:exit

Es gibt nur einen Kernpunkt: In jeder Runde sowohl die Nutzernachricht als auch die vollständige Assistentenantwort an messages anhängen. Das Modell selbst ist zustandslos; das "Gedächtnis" kommt vollständig aus dieser Liste.


Übung 2: Multi-Turn-Dialog-Web-App mit Gedächtnis

Dieselbe Idee in den Browser zu bringen erfordert ein Backend, das dazwischen koordiniert: den Gesprächsverlauf verwalten, Ollama aufrufen und die Streaming-Ergebnisse an das Frontend weiterleiten.

带记忆的聊天应用架构

Backend: Flask-Wrapper für Ollama-Streaming-API

Beispiel

# Dateipfad: server.py
# Abhängigkeiten installieren: pip install flask ollama
from flask import Flask, request, Response, stream_with_context
from ollama import chat

app = Flask(__name__)

# Sitzungsverlauf wird vorübergehend im Speicher gespeichert: Ein echtes Projekt sollte stattdessen eine Datenbank verwenden
sessions = {}

@app.route('/chat')
def do_chat():
    session_id = request.args.get('session', 'default')
    user_input = request.args.get('q', '')
    if not user_input:
        return {'error': 'Fehlender q-Parameter'}

    # Verlauf für diese Sitzung abrufen (oder initialisieren)
    history = sessions.setdefault(session_id, [
        {'role': 'system', 'content': 'Du bist der Programmierassistent von EXAMPLE.'}
    ])
    history.append({'role': 'user', 'content': user_input})

    # Streaming-Generierung, zeilenweise im NDJSON-Format an das Frontend weitergeleitet
    def generate():
        reply = ''
        stream = chat(model='qwen3.5:4b', messages=history, stream=True)
        for chunk in stream:
            reply += chunk.message.content
            yield chunk.message.content + '\n'
        # Wichtig: Schreibe die vollständige Antwort zurück in den Verlauf, um ein Gedächtnis zu bilden
        history.append({'role': 'assistant', 'content': reply})

    return Response(
        stream_with_context(generate()),
        mimetype='application/x-ndjson',
    )

if __name__ == '__main__':
    app.run(port=5000)

Frontend: Streaming-Lesevorgänge abrufen

Beispiel

// Browserseite: NDJSON Zeile für Zeile lesen und in Echtzeit rendern
async function ask(question) {
  const resp = await fetch(
    `/chat?session=demo&q=${encodeURIComponent(question)}`
  )
  const reader = resp.body.getReader()
  const decoder = new TextDecoder()

  while (true) {
    const { done, value } = await reader.read()
    if (done) break
    // Füge jeden Chunk zur Seite hinzu, sobald er eintrifft, für einen Schreibmaschineneffekt
    document.getElementById('answer').textContent +=
      decoder.decode(value)
  }
}

Ausführen und Überprüfung

Beispiel

# Starte das Backend
python server.py

# Simuliere zwei aufeinanderfolgende Anfragen, um den Speicher zu überprüfen
curl http://localhost:5000/chat?session=demo&q=什么YesPythonSlice
curl "http://localhost:5000/chat?session=demo&q=再GiveitemsEXAMPLEWind格ofExamples"

In der zweiten Anfrage setzt das Modell die Antwort entlang des Themas "Slicing" fort, was zeigt, dass die serverseitige Sitzungshistorie funktioniert; die Verwendung eines anderen Sitzungsparameters startet eine brandneue Sitzung ohne Beeinträchtigung.

Dieses Skelett von ein paar Dutzend Zeilen deckt bereits die drei Schlüsselelemente einer ChatGPT-ähnlichen App ab: Sitzungsisolierung (Sitzungsparameter), Streaming-Erfahrung (NDJSON-Weiterleitung) und persistenter Speicher (History-Rückschreibung). Füge Datenbankspeicherung und eine Multi-Session-Liste hinzu, und es wird zum Prototyp eines vollständigen Praxisprojekts; das Kapitel „Web App Practice“ wird es weiter ausbauen.

Andere Erweiterungen