Metadata-Version: 2.4
Name: fishr
Version: 0.0.5
Summary: A python library for free LLMs & usable in your python projects. (Grok, Sonnet, GPT)
Author: fuhnut
License: MIT
Project-URL: Homepage, https://github.com/breedservices/fishr
Project-URL: Repository, https://github.com/breedservices/fishr
Project-URL: Issues, https://github.com/breedservices/fishr/issues
Keywords: llm,ai,grok,gpt,gemini,sonnet,chat,completions,free,no-auth,gpt4free,tool-calling,tts,text-to-speech,qwen3
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.11
Description-Content-Type: text/markdown
Requires-Dist: uvloop>=0.22.1; sys_platform != "win32"
Requires-Dist: primp
Requires-Dist: msgspec
Requires-Dist: static-ffmpeg

# fishr

FREE LLM ACCESS FROM PYTHON. NO KEYS! NO AUTH! NO LIMITS!

## Install

```bash
pip install fishr
```

## Quick Start

```python
from fishr import Client

client = Client()

# Chat completion
response = client.chat.completions.create(
    model="noxus/openai",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.text)

# Streaming
response = client.chat.completions.create(
    model="noxus/openai",
    messages=[{"role": "user", "content": "Tell me a story"}],
    stream=True,
)
for chunk in response:
    print(chunk.choices[0].delta.content or "", end="")

# Web search
response = client.chat.completions.create(
    model="noxus/grok-4.3",
    messages=[{"role": "user", "content": "Latest news on SpaceX"}],
    web_search=True,
)
print(response.text)

# Image generation
result = client.images.generate(
    model="deepai/image",
    prompt="A cat riding a skateboard",
)
print(result.data[0].url)

# Text-to-speech (make/* models — 39 voices)
result = client.audio.speech.create(
    model="make/aura",
    input="Hello from fishr.",
)
with open("out.wav", "wb") as f:
    f.write(result.data[0].audio)

# Agent
result = client.agents.run(
    model="noxus/openai",
    prompt="Research quantum computing",
    tools=[{"type": "web_search"}],
)
print(result.content)

# Tool calling (kai/* models support native OpenAI-style tools)
tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get weather for a location",
        "parameters": {
            "type": "object",
            "properties": {"location": {"type": "string"}},
            "required": ["location"],
        },
    },
}]
resp = client.chat.completions.create(
    model="kai/auto",
    messages=[{"role": "user", "content": "What is the weather in Tokyo?"}],
    tools=tools,
)
for tc in resp.choices[0].message.tool_calls:
    print(tc.function.name, tc.function.arguments)

# Multi-turn conversation
conv = client.conversation(model="noxus/openai")
conv.system("You are a helpful assistant.")
conv.ask("Remember: 42")
conv.ask("What number did I say?")
```

## Async

```python
from fishr import AsyncClient

client = AsyncClient()

response = await client.chat.completions.create(
    model="deepai/standard",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.text)

# Async streaming
response = await client.chat.completions.create(
    model="opera/aria",
    messages=[{"role": "user", "content": "Tell me a story"}],
    stream=True,
)
async for chunk in response:
    print(chunk.choices[0].delta.content or "", end="")

# Async conversation
conv = client.conversation(model="noxus/openai")
await conv.ask("Remember: 42")
await conv.ask("What number did I say?")
```

## Direct Provider Access

```python
from fishr import OperaAria, Yqcloud

# Use a provider directly
opera = OperaAria()
result = opera.ask("Hello!", model="opera/aria")
print(result.content)

yqcloud = Yqcloud()
result = yqcloud.chat([{"role": "user", "content": "Hi!"}])
print(result.content)
```

## Models

Models are specified as `provider/name`:

| Provider | Models | Features |
|----------|--------|----------|
| **Noxus** | `noxus/openai`, `noxus/google`, `noxus/sonnet-4.6`, `noxus/sonnet-3.5`, `noxus/grok-4.3`, `noxus/perplexity`, `noxus/metaai`, `noxus/qwen` | Web search, images, history, system messages |
| **DeepAI** | `deepai/standard`, `deepai/online`, `deepai/gemma-4`, `deepai/gemini-2.5-flash-lite`, `deepai/deepseek-v3.2`, `deepai/image` | Web search (online), images, history, system messages |
| **Quillbot** | `quillbot/quillbot`, `quillbot/quillbot-search` | Web search (quillbot-search), history, system messages |
| **NoTrack** | `notrack/fast`, `notrack/standard`, `notrack/reasoning` | History |
| **DphnAI** | `dphnai/24b`, `dphnai/6b` | History, system messages |
| **Yqcloud** | `yqcloud/gpt-4` | History, system messages |
| **Opera Aria** | `opera/aria` | Images, history, system messages |
| **Kai** | `kai/auto`, `kai/m.1`, `kai/xs-2.1`, `kai/xs.2`, `kai/north-mini`, `kai/nemo3-ultra`, `kai/nemo3-super`, `kai/nemo3-nemo`, `kai/3.7-flash`, `kai/openfree` | **Tool calling**, history, system messages (some support images) |
| **Make** | `make/aura`, `make/breeze`, `make/cypress`, `make/drift`, `make/echo`, `make/flare`, `make/gem`, `make/hazel`, `make/ivy`, `make/jazz`, `make/kite`, `make/lumen`, `make/mist`, `make/saffron`, `make/solstice`, `make/pearl`, `make/quartz`, `make/ripple`, `make/cobalt`, `make/tide`, `make/vale`, `make/wren`, `make/ash`, `make/brook`, `make/cedar`, `make/dawn`, `make/fern`, `make/glen`, `make/harbor`, `make/indigo`, `make/juniper`, `make/lotus`, `make/maple`, `make/nettle`, `make/opal`, `make/pine`, `make/river`, `make/slate`, `make/willow` | TTS (39 voices, WAV) |

The provider prefix is optional for Noxus (default).

## Requirements

- Python >= 3.11
