Skip to content

Commit 3aa13a0

Browse files
committed
ollama
1 parent 6ebc051 commit 3aa13a0

File tree

8 files changed

+127
-14
lines changed

8 files changed

+127
-14
lines changed

setup.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@
5656
"plone.restapi",
5757
"plone.volto",
5858
"requests",
59+
"ollama",
60+
"deepl",
61+
"boto3",
62+
"openai",
5963
],
6064
extras_require={
6165
"test": [
@@ -67,15 +71,6 @@
6771
"pytest-cov",
6872
"pytest-plone>=0.5.0",
6973
],
70-
"deepl": [
71-
"deepl",
72-
],
73-
"aws": [
74-
"boto3",
75-
],
76-
"deepseek": [
77-
"openai",
78-
],
7974
"libretranslate": [],
8075
},
8176
entry_points="""

src/collective/translators/configure.zcml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@
3737
package=".deepseek"
3838
zcml:condition="installed openai"
3939
/>
40+
<include package=".ollama" />
4041

4142
</configure>

src/collective/translators/interfaces.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class IBrowserLayer(IDefaultBrowserLayer):
1010
"""Marker interface that defines a browser layer."""
1111

1212

13-
class BaseControlPanel(Interface):
13+
class IBaseControlPanel(Interface):
1414
enabled = schema.Bool(
1515
title=_("Enabled"),
1616
description=_("Translation service enabled"),
@@ -45,23 +45,23 @@ class BaseControlPanel(Interface):
4545
)
4646

4747

48-
class IDeeplControlPanel(BaseControlPanel):
48+
class IDeeplControlPanel(IBaseControlPanel):
4949
api_key = schema.TextLine(
5050
title=_("API Key"),
5151
description=_("The API key for the Deepl translation service."),
5252
required=False,
5353
)
5454

5555

56-
class IDeepSeekControlPanel(BaseControlPanel):
56+
class IDeepSeekControlPanel(IBaseControlPanel):
5757
api_key = schema.TextLine(
5858
title=_("API Key"),
5959
description=_("The API key for the DeepSeek service."),
6060
required=False,
6161
)
6262

6363

64-
class IAWSTranslateControlPanel(BaseControlPanel):
64+
class IAWSTranslateControlPanel(IBaseControlPanel):
6565
access_key = schema.TextLine(
6666
title=_("Access key"),
6767
description=_("The key for the access to AWS Translate service."),
@@ -82,7 +82,7 @@ class IAWSTranslateControlPanel(BaseControlPanel):
8282
)
8383

8484

85-
class ILibreTranslateControlPanel(BaseControlPanel):
85+
class ILibreTranslateControlPanel(IBaseControlPanel):
8686
api_key = schema.TextLine(
8787
title=_("API Key"),
8888
description=_("The API key for the Libre translate translation service."),

src/collective/translators/ollama/__init__.py

Whitespace-only changes.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<configure
2+
xmlns="http://namespaces.zope.org/zope"
3+
xmlns:browser="http://namespaces.zope.org/browser"
4+
xmlns:i18n="http://namespaces.zope.org/i18n"
5+
xmlns:plone="http://namespaces.plone.org/plone"
6+
i18n_domain="collective.translators"
7+
>
8+
9+
<utility
10+
provides="plone.app.multilingual.interfaces.IExternalTranslationService"
11+
name="ollama"
12+
component=".utility.Ollama"
13+
/>
14+
15+
<browser:page
16+
name="ollama-translator-controlpanel"
17+
for="plone.base.interfaces.IPloneSiteRoot"
18+
class=".controlpanel.ControlPanel"
19+
permission="cmf.ManagePortal"
20+
layer="..interfaces.IBrowserLayer"
21+
/>
22+
23+
<adapter
24+
factory=".controlpanel.RegistryConfigletPanel"
25+
name="ollama-controlpanel"
26+
/>
27+
28+
</configure>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# from collective.translators import _
2+
# from zope import schema
3+
from collective.translators import _
4+
from collective.translators.interfaces import IBaseControlPanel
5+
from plone.app.registry.browser import controlpanel
6+
from plone.restapi.controlpanels import RegistryConfigletPanel
7+
from zope.component import adapter
8+
from zope.interface import Interface
9+
10+
11+
class IControlPanel(IBaseControlPanel):
12+
pass
13+
# api_key = schema.TextLine(
14+
# title=_("API Key"),
15+
# description=_("The API key for the DeepSeek service."),
16+
# required=False,
17+
# )
18+
19+
20+
class ControlPanel(controlpanel.RegistryEditForm):
21+
id = "OllamaControlPanel"
22+
label = _("Ollama Translation Service")
23+
schema = IControlPanel
24+
25+
26+
@adapter(Interface, Interface)
27+
class RegistryConfigletPanel(RegistryConfigletPanel):
28+
"""Ollama control panel"""
29+
30+
schema = IControlPanel
31+
schema_prefix = "ollama"
32+
configlet_id = "ollama-controlpanel"
33+
configlet_category_id = "Products"
34+
title = _("Ollama Settings")
35+
group = "Products"
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from .controlpanel import IControlPanel
2+
from plone import api
3+
4+
import ollama
5+
6+
7+
class OllamaFactory:
8+
order = 30
9+
model = "zongwei/gemma3-translator:1b"
10+
prompt = "Translate the following text from {source_language} to {target_language}: {content}"
11+
12+
def is_available(self):
13+
value = api.portal.get_registry_record(name="enabled", interface=IControlPanel)
14+
return value
15+
16+
def available_languages(self):
17+
return []
18+
19+
def translate_content(self, content, source_language, target_language):
20+
try:
21+
response = ollama.chat(
22+
model=self.model,
23+
messages=[
24+
{
25+
"role": "user",
26+
"content": self.prompt.format(
27+
source_language=source_language,
28+
target_language=target_language,
29+
content=content,
30+
),
31+
}
32+
],
33+
)
34+
return response.message.content
35+
# TODO: specific exception
36+
except ollama.ResponseError:
37+
# TODO: show_message here is useless, remove and return the error as
38+
return None
39+
40+
41+
Ollama = OllamaFactory()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<registry xmlns:i18n="http://xml.zope.org/namespaces/i18n"
3+
i18n:domain="collective.translators"
4+
>
5+
6+
<records interface="collective.translators.ollama.controlpanel.IControlPanel">
7+
<value key="enabled">False</value>
8+
<value key="order">30</value>
9+
<value key="source_languages" />
10+
<value key="target_languages" />
11+
</records>
12+
13+
</registry>

0 commit comments

Comments
 (0)