Metadata-Version: 2.4
Name: scope-oaf
Version: 0.1.0
Summary: OpenAgentFramework — minimal, fast, transparent AI agent framework
Project-URL: Homepage, https://github.com/devin/scope-oaf
Project-URL: Repository, https://github.com/devin/scope-oaf
Project-URL: Issues, https://github.com/devin/scope-oaf/issues
Author: devin
License-Expression: MIT
License-File: LICENSE
Keywords: agent,ai,anthropic,llm,openai,tool-calling
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
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: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: anthropic>=0.30
Requires-Dist: openai>=1.0
Provides-Extra: dev
Requires-Dist: pytest-asyncio>=0.21; extra == 'dev'
Requires-Dist: pytest>=7.0; extra == 'dev'
Requires-Dist: python-dotenv>=1.0; extra == 'dev'
Provides-Extra: web
Requires-Dist: aiohttp>=3.9; extra == 'web'
Requires-Dist: python-dotenv>=1.0; extra == 'web'
Description-Content-Type: text/markdown

# OAF — OpenAgentFramework

Minimal, fast, transparent AI agent framework for Python.

JSON-based tool calling, provider-agnostic (OpenAI + Anthropic), full prompt inspectability.

## Install

```bash
pip install scope-oaf
```

Or from source:

```bash
pip install /path/to/oaf
```

## Quick Start

```python
import asyncio
from oaf import Agent, ToolRegistry

registry = ToolRegistry()

@registry.register
async def get_weather(city: str) -> str:
    """Get the current weather for a city."""
    return f"Weather in {city}: 72°F, sunny"

agent = Agent(model="gpt-4.1-nano", tools=registry)
response = asyncio.run(agent.message("What's the weather in Tokyo?", role="user"))
print(response.text)
```

## Top-level API

```python
from oaf import Agent, Hooks, Tool, tool, tool_method, BaseToolGroup, ToolRegistry
```

That's the full autocomplete list. Everything else lives in subpackages.

## Subpackages

```python
# LLM client, types, models, errors
from oaf.llmclient import LLMClient, Message, ChatResponse, Models, LLMError

# Context / memory
from oaf.context import BaseContext, ConversationalInMemory

# Prompt builders
from oaf.prompts import BasePromptBuilder, DefaultPromptBuilder
```

## Tool Groups

```python
from oaf import BaseToolGroup, tool_method, ToolRegistry

class MathTools(BaseToolGroup):
    """Mathematical operations."""
    name = "math"

    @tool_method
    async def add(self, a: int, b: int) -> str:
        """Add two numbers."""
        return str(a + b)

registry = ToolRegistry()
registry.register_group(MathTools())
```

## Providers

Set `OPENAI_API_KEY` and/or `ANTHROPIC_API_KEY` as environment variables,
or pass them directly:

```python
from oaf.llmclient import LLMClient

client = LLMClient(openai_api_key="sk-...", anthropic_api_key="sk-ant-...")
```

## License

MIT
